Annotation of embedaddon/strongswan/src/libstrongswan/collections/enumerator.h, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2013-2017 Tobias Brunner
3: * Copyright (C) 2007 Martin Willi
4: * HSR Hochschule fuer Technik Rapperswil
5: *
6: * This program is free software; you can redistribute it and/or modify it
7: * under the terms of the GNU General Public License as published by the
8: * Free Software Foundation; either version 2 of the License, or (at your
9: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10: *
11: * This program is distributed in the hope that it will be useful, but
12: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14: * for more details.
15: */
16:
17: /**
18: * @defgroup enumerator enumerator
19: * @{ @ingroup collections
20: */
21:
22: #ifndef ENUMERATOR_H_
23: #define ENUMERATOR_H_
24:
25: typedef struct enumerator_t enumerator_t;
26:
27: #include <utils/utils.h>
28:
29: /**
30: * Enumerator interface, allows enumeration over collections.
31: */
32: struct enumerator_t {
33:
34: /**
35: * Enumerate collection.
36: *
37: * The enumerate() method takes a variable number of pointer arguments
38: * where the enumerated values get written to.
39: *
40: * @note Just assigning the generic enumerator_enumerate_default() function
41: * that calls the enumerator's venumerate() method is usually enough.
42: *
43: * @param ... variable list of enumerated items, implementation dependent
44: * @return TRUE if pointers returned
45: */
46: bool (*enumerate)(enumerator_t *this, ...);
47:
48: /**
49: * Enumerate collection.
50: *
51: * The venumerate() method takes a variable argument list containing
52: * pointers where the enumerated values get written to.
53: *
54: * To simplify the implementation the VA_ARGS_VGET() macro may be used.
55: *
56: * @param args variable list of enumerated items, implementation dependent
57: * @return TRUE if pointers returned
58: */
59: bool (*venumerate)(enumerator_t *this, va_list args);
60:
61: /**
62: * Destroy an enumerator_t instance.
63: */
64: void (*destroy)(enumerator_t *this);
65: };
66:
67: /**
68: * Generic implementation of enumerator_t::enumerate() that simply calls
69: * the enumerator's venumerate() method.
70: *
71: * @param enumerator the enumerator
72: * @param ... arguments passed to enumerate()
73: */
74: bool enumerator_enumerate_default(enumerator_t *enumerator, ...);
75:
76: /**
77: * Create an enumerator which enumerates over nothing
78: *
79: * @return an enumerator over no values
80: */
81: enumerator_t* enumerator_create_empty();
82:
83: /**
84: * Create an enumerator which enumerates over a single item
85: *
86: * @param item item to enumerate
87: * @param cleanup cleanup function called on destroy with the item
88: * @return an enumerator over a single value
89: */
90: enumerator_t *enumerator_create_single(void *item, void (*cleanup)(void *item));
91:
92: /**
93: * Create an enumerator over files/subdirectories in a directory.
94: *
95: * This enumerator_t.enumerate() function returns a (to the directory) relative
96: * filename (as a char*), an absolute filename (as a char*) and a file status
97: * (to a struct stat), which all may be NULL. "." and ".." entries are
98: * skipped.
99: *
100: * Example:
101: *
102: * @code
103: char *rel, *abs;
104: struct stat st;
105: enumerator_t *e;
106:
107: e = enumerator_create_directory("/tmp");
108: if (e)
109: {
110: while (e->enumerate(e, &rel, &abs, &st))
111: {
112: if (S_ISDIR(st.st_mode) && *rel != '.')
113: {
114: printf("%s\n", abs);
115: }
116: }
117: e->destroy(e);
118: }
119: @endcode
120: *
121: * @param path path of the directory
122: * @return the directory enumerator, NULL on failure
123: */
124: enumerator_t* enumerator_create_directory(const char *path);
125:
126: /**
127: * Create an enumerator over files/directories matching a file pattern.
128: *
129: * This enumerator_t.enumerate() function returns the filename (as a char*),
130: * and a file status (to a struct stat), which both may be NULL.
131: *
132: * Example:
133: *
134: * @code
135: char *file;
136: struct stat st;
137: enumerator_t *e;
138:
139: e = enumerator_create_glob("/etc/ipsec.*.conf");
140: if (e)
141: {
142: while (e->enumerate(e, &file, &st))
143: {
144: if (S_ISREG(st.st_mode))
145: {
146: printf("%s\n", file);
147: }
148: }
149: e->destroy(e);
150: }
151: @endcode
152: *
153: * @param pattern file pattern to match
154: * @return the enumerator, NULL if not supported
155: */
156: enumerator_t* enumerator_create_glob(const char *pattern);
157:
158: /**
159: * Create an enumerator over tokens of a string.
160: *
161: * Tokens are separated by one of the characters in sep and trimmed by the
162: * characters in trim.
163: *
164: * @param string string to parse
165: * @param sep separator characters
166: * @param trim characters to trim from tokens
167: * @return enumerator over char* tokens
168: */
169: enumerator_t* enumerator_create_token(const char *string, const char *sep,
170: const char *trim);
171:
172: /**
173: * Creates an enumerator which enumerates over enumerated enumerators :-).
174: *
175: * The outer enumerator is expected to return objects that, when passed to
176: * inner_constructor, will create a new enumerator that will be enumerated until
177: * completion (to this enumerator will the pointer arguments that are passed to
178: * this enumerator be forwarded) at which point a new element from the outer
179: * enumerator is requested to create a new inner enumerator.
180: *
181: * @param outer outer enumerator
182: * @param inner_constructor constructor to create inner enumerator
183: * @param data data to pass to each inner_constructor call
184: * @param destructor destructor function to clean up data after use
185: * @return the nested enumerator
186: */
187: enumerator_t *enumerator_create_nested(enumerator_t *outer,
188: enumerator_t *(*inner_constructor)(void *outer, void *data),
189: void *data, void (*destructor)(void *data));
190:
191: /**
192: * Creates an enumerator which filters/maps output of another enumerator.
193: *
194: * The filter function receives the user supplied "data" followed by the
195: * original enumerator, followed by the arguments passed to the outer
196: * enumerator. It returns TRUE to deliver the values assigned to these
197: * arguments to the caller of enumerate() and FALSE to end the enumeration.
198: * Filtering items is simple as the filter function may just skip enumerated
199: * items from the original enumerator.
200: *
201: * @param orig original enumerator to wrap, gets destroyed
202: * @param filter filter function
203: * @param data user data to supply to filter
204: * @param destructor destructor function to clean up data after use
205: * @return the filtered enumerator
206: */
207: enumerator_t *enumerator_create_filter(enumerator_t *orig,
208: bool (*filter)(void *data, enumerator_t *orig, va_list args),
209: void *data, void (*destructor)(void *data));
210:
211: /**
212: * Create an enumerator wrapper which does a cleanup on destroy.
213: *
214: * @param wrapped wrapped enumerator
215: * @param cleanup cleanup function called on destroy
216: * @param data user data to supply to cleanup
217: * @return the enumerator with cleanup
218: */
219: enumerator_t *enumerator_create_cleaner(enumerator_t *wrapped,
220: void (*cleanup)(void *data), void *data);
221:
222: #endif /** ENUMERATOR_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>