xref: /aosp_15_r20/external/f2fs-tools/fsck/dict.h (revision 59bfda1f02d633cd6b8b69f31eee485d40f6eef6)
1*59bfda1fSAndroid Build Coastguard Worker /*
2*59bfda1fSAndroid Build Coastguard Worker  * Dictionary Abstract Data Type
3*59bfda1fSAndroid Build Coastguard Worker  * Copyright (C) 1997 Kaz Kylheku <[email protected]>
4*59bfda1fSAndroid Build Coastguard Worker  *
5*59bfda1fSAndroid Build Coastguard Worker  * Free Software License:
6*59bfda1fSAndroid Build Coastguard Worker  *
7*59bfda1fSAndroid Build Coastguard Worker  * All rights are reserved by the author, with the following exceptions:
8*59bfda1fSAndroid Build Coastguard Worker  * Permission is granted to freely reproduce and distribute this software,
9*59bfda1fSAndroid Build Coastguard Worker  * possibly in exchange for a fee, provided that this copyright notice appears
10*59bfda1fSAndroid Build Coastguard Worker  * intact. Permission is also granted to adapt this software to produce
11*59bfda1fSAndroid Build Coastguard Worker  * derivative works, as long as the modified versions carry this copyright
12*59bfda1fSAndroid Build Coastguard Worker  * notice and additional notices stating that the work has been modified.
13*59bfda1fSAndroid Build Coastguard Worker  * This source code may be translated into executable form and incorporated
14*59bfda1fSAndroid Build Coastguard Worker  * into proprietary software; there is no requirement for such software to
15*59bfda1fSAndroid Build Coastguard Worker  * contain a copyright notice related to this source.
16*59bfda1fSAndroid Build Coastguard Worker  *
17*59bfda1fSAndroid Build Coastguard Worker  * $Id: dict.h,v 1.22.2.6 2000/11/13 01:36:44 kaz Exp $
18*59bfda1fSAndroid Build Coastguard Worker  * $Name: kazlib_1_20 $
19*59bfda1fSAndroid Build Coastguard Worker  */
20*59bfda1fSAndroid Build Coastguard Worker 
21*59bfda1fSAndroid Build Coastguard Worker #ifndef DICT_H
22*59bfda1fSAndroid Build Coastguard Worker #define DICT_H
23*59bfda1fSAndroid Build Coastguard Worker 
24*59bfda1fSAndroid Build Coastguard Worker #include <limits.h>
25*59bfda1fSAndroid Build Coastguard Worker #ifdef KAZLIB_SIDEEFFECT_DEBUG
26*59bfda1fSAndroid Build Coastguard Worker #include "sfx.h"
27*59bfda1fSAndroid Build Coastguard Worker #endif
28*59bfda1fSAndroid Build Coastguard Worker 
29*59bfda1fSAndroid Build Coastguard Worker /*
30*59bfda1fSAndroid Build Coastguard Worker  * Blurb for inclusion into C++ translation units
31*59bfda1fSAndroid Build Coastguard Worker  */
32*59bfda1fSAndroid Build Coastguard Worker 
33*59bfda1fSAndroid Build Coastguard Worker #ifdef __cplusplus
34*59bfda1fSAndroid Build Coastguard Worker extern "C" {
35*59bfda1fSAndroid Build Coastguard Worker #endif
36*59bfda1fSAndroid Build Coastguard Worker 
37*59bfda1fSAndroid Build Coastguard Worker typedef unsigned long dictcount_t;
38*59bfda1fSAndroid Build Coastguard Worker #define DICTCOUNT_T_MAX ULONG_MAX
39*59bfda1fSAndroid Build Coastguard Worker 
40*59bfda1fSAndroid Build Coastguard Worker /*
41*59bfda1fSAndroid Build Coastguard Worker  * The dictionary is implemented as a red-black tree
42*59bfda1fSAndroid Build Coastguard Worker  */
43*59bfda1fSAndroid Build Coastguard Worker 
44*59bfda1fSAndroid Build Coastguard Worker typedef enum { dnode_red, dnode_black } dnode_color_t;
45*59bfda1fSAndroid Build Coastguard Worker 
46*59bfda1fSAndroid Build Coastguard Worker typedef struct dnode_t {
47*59bfda1fSAndroid Build Coastguard Worker #if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG)
48*59bfda1fSAndroid Build Coastguard Worker 	struct dnode_t *dict_left;
49*59bfda1fSAndroid Build Coastguard Worker 	struct dnode_t *dict_right;
50*59bfda1fSAndroid Build Coastguard Worker 	struct dnode_t *dict_parent;
51*59bfda1fSAndroid Build Coastguard Worker 	dnode_color_t dict_color;
52*59bfda1fSAndroid Build Coastguard Worker 	const void *dict_key;
53*59bfda1fSAndroid Build Coastguard Worker 	void *dict_data;
54*59bfda1fSAndroid Build Coastguard Worker #else
55*59bfda1fSAndroid Build Coastguard Worker 	int dict_dummy;
56*59bfda1fSAndroid Build Coastguard Worker #endif
57*59bfda1fSAndroid Build Coastguard Worker } dnode_t;
58*59bfda1fSAndroid Build Coastguard Worker 
59*59bfda1fSAndroid Build Coastguard Worker typedef int (*dict_comp_t)(const void *, const void *);
60*59bfda1fSAndroid Build Coastguard Worker typedef dnode_t *(*dnode_alloc_t)(void *);
61*59bfda1fSAndroid Build Coastguard Worker typedef void (*dnode_free_t)(dnode_t *, void *);
62*59bfda1fSAndroid Build Coastguard Worker 
63*59bfda1fSAndroid Build Coastguard Worker typedef struct dict_t {
64*59bfda1fSAndroid Build Coastguard Worker #if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG)
65*59bfda1fSAndroid Build Coastguard Worker 	dnode_t dict_nilnode;
66*59bfda1fSAndroid Build Coastguard Worker 	dictcount_t dict_nodecount;
67*59bfda1fSAndroid Build Coastguard Worker 	dictcount_t dict_maxcount;
68*59bfda1fSAndroid Build Coastguard Worker 	dict_comp_t dict_compare;
69*59bfda1fSAndroid Build Coastguard Worker 	dnode_alloc_t dict_allocnode;
70*59bfda1fSAndroid Build Coastguard Worker 	dnode_free_t dict_freenode;
71*59bfda1fSAndroid Build Coastguard Worker 	void *dict_context;
72*59bfda1fSAndroid Build Coastguard Worker 	int dict_dupes;
73*59bfda1fSAndroid Build Coastguard Worker #else
74*59bfda1fSAndroid Build Coastguard Worker 	int dict_dummmy;
75*59bfda1fSAndroid Build Coastguard Worker #endif
76*59bfda1fSAndroid Build Coastguard Worker } dict_t;
77*59bfda1fSAndroid Build Coastguard Worker 
78*59bfda1fSAndroid Build Coastguard Worker typedef void (*dnode_process_t)(dict_t *, dnode_t *, void *);
79*59bfda1fSAndroid Build Coastguard Worker 
80*59bfda1fSAndroid Build Coastguard Worker typedef struct dict_load_t {
81*59bfda1fSAndroid Build Coastguard Worker #if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG)
82*59bfda1fSAndroid Build Coastguard Worker 	dict_t *dict_dictptr;
83*59bfda1fSAndroid Build Coastguard Worker 	dnode_t dict_nilnode;
84*59bfda1fSAndroid Build Coastguard Worker #else
85*59bfda1fSAndroid Build Coastguard Worker 	int dict_dummmy;
86*59bfda1fSAndroid Build Coastguard Worker #endif
87*59bfda1fSAndroid Build Coastguard Worker } dict_load_t;
88*59bfda1fSAndroid Build Coastguard Worker 
89*59bfda1fSAndroid Build Coastguard Worker extern dict_t *dict_create(dictcount_t, dict_comp_t);
90*59bfda1fSAndroid Build Coastguard Worker extern void dict_set_allocator(dict_t *, dnode_alloc_t, dnode_free_t, void *);
91*59bfda1fSAndroid Build Coastguard Worker extern void dict_destroy(dict_t *);
92*59bfda1fSAndroid Build Coastguard Worker extern void dict_free_nodes(dict_t *);
93*59bfda1fSAndroid Build Coastguard Worker extern void dict_free(dict_t *);
94*59bfda1fSAndroid Build Coastguard Worker extern dict_t *dict_init(dict_t *, dictcount_t, dict_comp_t);
95*59bfda1fSAndroid Build Coastguard Worker extern void dict_init_like(dict_t *, const dict_t *);
96*59bfda1fSAndroid Build Coastguard Worker extern int dict_verify(dict_t *);
97*59bfda1fSAndroid Build Coastguard Worker extern int dict_similar(const dict_t *, const dict_t *);
98*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dict_lookup(dict_t *, const void *);
99*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dict_lower_bound(dict_t *, const void *);
100*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dict_upper_bound(dict_t *, const void *);
101*59bfda1fSAndroid Build Coastguard Worker extern void dict_insert(dict_t *, dnode_t *, const void *);
102*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dict_delete(dict_t *, dnode_t *);
103*59bfda1fSAndroid Build Coastguard Worker extern int dict_alloc_insert(dict_t *, const void *, void *);
104*59bfda1fSAndroid Build Coastguard Worker extern void dict_delete_free(dict_t *, dnode_t *);
105*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dict_first(dict_t *);
106*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dict_last(dict_t *);
107*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dict_next(dict_t *, dnode_t *);
108*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dict_prev(dict_t *, dnode_t *);
109*59bfda1fSAndroid Build Coastguard Worker extern dictcount_t dict_count(dict_t *);
110*59bfda1fSAndroid Build Coastguard Worker extern int dict_isempty(dict_t *);
111*59bfda1fSAndroid Build Coastguard Worker extern int dict_isfull(dict_t *);
112*59bfda1fSAndroid Build Coastguard Worker extern int dict_contains(dict_t *, dnode_t *);
113*59bfda1fSAndroid Build Coastguard Worker extern void dict_allow_dupes(dict_t *);
114*59bfda1fSAndroid Build Coastguard Worker extern int dnode_is_in_a_dict(dnode_t *);
115*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dnode_create(void *);
116*59bfda1fSAndroid Build Coastguard Worker extern dnode_t *dnode_init(dnode_t *, void *);
117*59bfda1fSAndroid Build Coastguard Worker extern void dnode_destroy(dnode_t *);
118*59bfda1fSAndroid Build Coastguard Worker extern void *dnode_get(dnode_t *);
119*59bfda1fSAndroid Build Coastguard Worker extern const void *dnode_getkey(dnode_t *);
120*59bfda1fSAndroid Build Coastguard Worker extern void dnode_put(dnode_t *, void *);
121*59bfda1fSAndroid Build Coastguard Worker extern void dict_process(dict_t *, void *, dnode_process_t);
122*59bfda1fSAndroid Build Coastguard Worker extern void dict_load_begin(dict_load_t *, dict_t *);
123*59bfda1fSAndroid Build Coastguard Worker extern void dict_load_next(dict_load_t *, dnode_t *, const void *);
124*59bfda1fSAndroid Build Coastguard Worker extern void dict_load_end(dict_load_t *);
125*59bfda1fSAndroid Build Coastguard Worker extern void dict_merge(dict_t *, dict_t *);
126*59bfda1fSAndroid Build Coastguard Worker 
127*59bfda1fSAndroid Build Coastguard Worker #if defined(DICT_IMPLEMENTATION) || !defined(KAZLIB_OPAQUE_DEBUG)
128*59bfda1fSAndroid Build Coastguard Worker #ifdef KAZLIB_SIDEEFFECT_DEBUG
129*59bfda1fSAndroid Build Coastguard Worker #define dict_isfull(D) (SFX_CHECK(D)->dict_nodecount == (D)->dict_maxcount)
130*59bfda1fSAndroid Build Coastguard Worker #else
131*59bfda1fSAndroid Build Coastguard Worker #define dict_isfull(D) ((D)->dict_nodecount == (D)->dict_maxcount)
132*59bfda1fSAndroid Build Coastguard Worker #endif
133*59bfda1fSAndroid Build Coastguard Worker #define dict_count(D) ((D)->dict_nodecount)
134*59bfda1fSAndroid Build Coastguard Worker #define dict_isempty(D) ((D)->dict_nodecount == 0)
135*59bfda1fSAndroid Build Coastguard Worker #define dnode_get(N) ((N)->dict_data)
136*59bfda1fSAndroid Build Coastguard Worker #define dnode_getkey(N) ((N)->dict_key)
137*59bfda1fSAndroid Build Coastguard Worker #define dnode_put(N, X) ((N)->dict_data = (X))
138*59bfda1fSAndroid Build Coastguard Worker #endif
139*59bfda1fSAndroid Build Coastguard Worker 
140*59bfda1fSAndroid Build Coastguard Worker #ifdef __cplusplus
141*59bfda1fSAndroid Build Coastguard Worker }
142*59bfda1fSAndroid Build Coastguard Worker #endif
143*59bfda1fSAndroid Build Coastguard Worker 
144*59bfda1fSAndroid Build Coastguard Worker #endif
145