File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / strongswan / src / libstrongswan / collections / enumerator.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 3 09:46:43 2020 UTC (4 years, 3 months ago) by misho
Branches: strongswan, MAIN
CVS tags: v5_9_2p0, v5_8_4p7, HEAD
Strongswan

    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>