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>