Fri, 16 Aug 2013 13:40:10 +0200
fixed documentation for netbeans parser + added sstrprefix() and sstrsuffix()
test/main.c | file | annotate | diff | comparison | revisions | |
test/string_tests.c | file | annotate | diff | comparison | revisions | |
test/string_tests.h | file | annotate | diff | comparison | revisions | |
ucx/allocator.h | file | annotate | diff | comparison | revisions | |
ucx/buffer.h | file | annotate | diff | comparison | revisions | |
ucx/list.h | file | annotate | diff | comparison | revisions | |
ucx/logging.h | file | annotate | diff | comparison | revisions | |
ucx/map.h | file | annotate | diff | comparison | revisions | |
ucx/mempool.h | file | annotate | diff | comparison | revisions | |
ucx/properties.h | file | annotate | diff | comparison | revisions | |
ucx/string.c | file | annotate | diff | comparison | revisions | |
ucx/string.h | file | annotate | diff | comparison | revisions | |
ucx/test.h | file | annotate | diff | comparison | revisions | |
ucx/utils.h | file | annotate | diff | comparison | revisions |
--- a/test/main.c Wed Aug 14 16:07:49 2013 +0200 +++ b/test/main.c Fri Aug 16 13:40:10 2013 +0200 @@ -117,6 +117,7 @@ ucx_test_register(suite, test_sstr_len_cat); ucx_test_register(suite, test_sstrsplit); ucx_test_register(suite, test_sstrtrim); + ucx_test_register(suite, test_sstrprefixsuffix); /* UcxLogger Tests */ ucx_test_register(suite, test_ucx_logger_log);
--- a/test/string_tests.c Wed Aug 14 16:07:49 2013 +0200 +++ b/test/string_tests.c Fri Aug 16 13:40:10 2013 +0200 @@ -209,3 +209,28 @@ UCX_TEST_ASSERT(empty.length == 0, "empty string failed"); UCX_TEST_END } + +UCX_TEST(test_sstrprefixsuffix) { + sstr_t str = ST("test my prefix and my suffix"); + sstr_t empty = ST(""); + + UCX_TEST_BEGIN + + UCX_TEST_ASSERT(!sstrprefix(empty, S("pref")), "prefix empty string fails"); + UCX_TEST_ASSERT(!sstrsuffix(empty, S("suf")), "suffix empty string fails"); + + UCX_TEST_ASSERT(sstrprefix(str, empty), "empty prefix fails"); + UCX_TEST_ASSERT(sstrsuffix(str, empty), "empty suffix fails"); + + UCX_TEST_ASSERT(sstrprefix(empty, empty), "string and prefix empty fails"); + UCX_TEST_ASSERT(sstrsuffix(empty, empty), "string and suffix empty fails"); + + UCX_TEST_ASSERT(sstrprefix(str, S("test ")), "prefix false negative"); + UCX_TEST_ASSERT(!sstrprefix(str, S("8-) fsck ")), "prefix false positive"); + + UCX_TEST_ASSERT(sstrsuffix(str, S("fix")), "suffix false negative"); + UCX_TEST_ASSERT(!sstrsuffix(str, S("fox")), "suffix false positive"); + + + UCX_TEST_END +}
--- a/test/string_tests.h Wed Aug 14 16:07:49 2013 +0200 +++ b/test/string_tests.h Fri Aug 16 13:40:10 2013 +0200 @@ -40,6 +40,7 @@ UCX_TEST(test_sstr_len_cat); UCX_TEST(test_sstrsplit); UCX_TEST(test_sstrtrim); +UCX_TEST(test_sstrprefixsuffix); #ifdef __cplusplus }
--- a/ucx/allocator.h Wed Aug 14 16:07:49 2013 +0200 +++ b/ucx/allocator.h Fri Aug 16 13:40:10 2013 +0200 @@ -63,16 +63,19 @@ * @see UcxAllocator */ typedef void*(*ucx_allocator_malloc)(void *pool, size_t n); + /** * A function pointer to the allocators <code>calloc()</code> function. * @see UcxAllocator */ typedef void*(*ucx_allocator_calloc)(void *pool, size_t n, size_t size); + /** * A function pointer to the allocators <code>realloc()</code> function. * @see UcxAllocator */ typedef void*(*ucx_allocator_realloc)(void *pool, void *data, size_t n); + /** * A function pointer to the allocators <code>free()</code> function. * @see UcxAllocator
--- a/ucx/buffer.h Wed Aug 14 16:07:49 2013 +0200 +++ b/ucx/buffer.h Fri Aug 16 13:40:10 2013 +0200 @@ -58,10 +58,12 @@ * No buffer features enabled (all flags cleared). */ #define UCX_BUFFER_DEFAULT 0x00 + /** * If this flag is enabled, the buffer will automatically free its contents. */ #define UCX_BUFFER_AUTOFREE 0x01 + /** * If this flag is enabled, the buffer will automatically extends its capacity. */
--- a/ucx/list.h Wed Aug 14 16:07:49 2013 +0200 +++ b/ucx/list.h Fri Aug 16 13:40:10 2013 +0200 @@ -64,6 +64,7 @@ * @see UcxList */ typedef struct UcxList UcxList; + /** * UCX list structure. */ @@ -99,6 +100,7 @@ * @return a pointer to the copy */ UcxList *ucx_list_clone(UcxList *list, copy_func cpyfnc, void* data); + /** * Creates an element-wise copy of a list using an UcxAllocator. * @@ -152,6 +154,7 @@ * @param list the list to free */ void ucx_list_free(UcxList *list); + /** * Destroys the entire list using an UcxAllocator. * @@ -162,6 +165,7 @@ * @see ucx_list_free() */ void ucx_list_free_a(UcxAllocator *allocator, UcxList *list); + /** * Inserts an element at the end of the list. * @@ -175,6 +179,7 @@ * the newly created list otherwise */ UcxList *ucx_list_append(UcxList *list, void *data); + /** * Inserts an element at the end of the list using an UcxAllocator. * @@ -189,6 +194,7 @@ * @see ucx_list_append() */ UcxList *ucx_list_append_a(UcxAllocator *allocator, UcxList *list, void *data); + /** * Inserts an element at the beginning of the list. * @@ -204,6 +210,7 @@ * @return a pointer to the new list head */ UcxList *ucx_list_prepend(UcxList *list, void *data); + /** * Inserts an element at the beginning of the list using an UcxAllocator. * @@ -217,6 +224,7 @@ * @see ucx_list_prepend() */ UcxList *ucx_list_prepend_a(UcxAllocator *allocator, UcxList *list, void *data); + /** * Concatenates two lists. * @@ -232,6 +240,7 @@ * returned, otherwise <code>list1</code> is returned */ UcxList *ucx_list_concat(UcxList *list1, UcxList *list2); + /** * Returns the first element of a list. * @@ -243,6 +252,7 @@ * @return the first element of the list, the specified element is a member of */ UcxList *ucx_list_first(const UcxList *elem); + /** * Returns the last element of a list. * @@ -254,6 +264,7 @@ * @return the last element of the list, the specified element is a member of */ UcxList *ucx_list_last(const UcxList *elem); + /** * Returns the list element at the specified index. * @@ -263,6 +274,7 @@ * index is greater than the list size */ UcxList *ucx_list_get(const UcxList *list, int index); + /** * Returns the index of an element. * @@ -272,6 +284,7 @@ * element */ ssize_t ucx_list_indexof(const UcxList *list, const UcxList *elem); + /** * Returns the element count of the list. * @@ -279,6 +292,7 @@ * @return the element count */ size_t ucx_list_size(const UcxList *list); + /** * Returns the index of an element containing the specified data. * @@ -297,6 +311,7 @@ * data is not found in this list */ ssize_t ucx_list_find(UcxList *list, void *elem, cmp_func cmpfnc, void *data); + /** * Checks, if a list contains a specific element. * @@ -340,6 +355,7 @@ * is now empty */ UcxList *ucx_list_remove(UcxList *list, UcxList *element); + /** * Removes an element from the list using an UcxAllocator. *
--- a/ucx/logging.h Wed Aug 14 16:07:49 2013 +0200 +++ b/ucx/logging.h Fri Aug 16 13:40:10 2013 +0200 @@ -44,14 +44,19 @@ #endif /* leave enough space for custom log levels */ + /** Log level for error messages. */ #define UCX_LOGGER_ERROR 0x00 + /** Log level for warning messages. */ #define UCX_LOGGER_WARN 0x10 + /** Log level for information messages. */ #define UCX_LOGGER_INFO 0x20 + /** Log level for debug messages. */ #define UCX_LOGGER_DEBUG 0x30 + /** Log level for trace messages. */ #define UCX_LOGGER_TRACE 0x40 @@ -61,12 +66,14 @@ * @see UcxLogger.mask */ #define UCX_LOGGER_LEVEL 0x01 + /** * Output flag for the timestmap. * If this flag is set, the log message will contain the timestmap. * @see UcxLogger.mask */ #define UCX_LOGGER_TIMESTAMP 0x02 + /** * Output flag for the source. * If this flag is set, the log message will contain the source file and line @@ -81,24 +88,28 @@ typedef struct { /** The stream this logger writes its messages to.*/ void *stream; + /** * The write function that shall be used. * For standard file or stdout loggers this might be standard fwrite * (default). */ write_func writer; + /** * The date format for timestamp outputs * (default: <code>"%F %T %z "</code>). * @see UCX_LOGGER_TIMESTAMP */ char *dateformat; + /** * The level, this logger operates on. * If a log command is issued, the message will only be logged, if the log * level of the message is less or equal than the log level of the logger. */ unsigned int level; + /** * A configuration mask for automatic output. * For each flag that is set, the logger automatically outputs some extra @@ -106,6 +117,7 @@ * See the documentation for the flags for details. */ unsigned int mask; + /** * A map of valid log levels for this logger. * @@ -128,6 +140,7 @@ * @return a new logger object */ UcxLogger *ucx_logger_new(void *stream, unsigned int level, unsigned int mask); + /** * Destroys the logger. * @@ -180,6 +193,7 @@ */ #define ucx_logger_error(logger, ...) \ ucx_logger_log(logger, UCX_LOGGER_ERROR, __VA_ARGS__) + /** * Shortcut for logging an information message. * @param logger the logger to use @@ -188,6 +202,7 @@ */ #define ucx_logger_info(logger, ...) \ ucx_logger_log(logger, UCX_LOGGER_INFO, __VA_ARGS__) + /** * Shortcut for logging a warning message. * @param logger the logger to use @@ -196,6 +211,7 @@ */ #define ucx_logger_warn(logger, ...) \ ucx_logger_log(logger, UCX_LOGGER_WARN, __VA_ARGS__) + /** * Shortcut for logging a debug message. * @param logger the logger to use @@ -204,6 +220,7 @@ */ #define ucx_logger_debug(logger, ...) \ ucx_logger_log(logger, UCX_LOGGER_DEBUG, __VA_ARGS__) + /** * Shortcut for logging a trace message. * @param logger the logger to use
--- a/ucx/map.h Wed Aug 14 16:07:49 2013 +0200 +++ b/ucx/map.h Fri Aug 16 13:40:10 2013 +0200 @@ -67,10 +67,13 @@ /** Type for the UCX map. @see UcxMap */ typedef struct UcxMap UcxMap; + /** Type for a key of an UcxMap. @see UcxKey */ typedef struct UcxKey UcxKey; + /** Type for an element of an UcxMap. @see UcxMapElement */ typedef struct UcxMapElement UcxMapElement; + /** Type for an iterator over an UcxMap. @see UcxMapIterator */ typedef struct UcxMapIterator UcxMapIterator; @@ -100,8 +103,10 @@ struct UcxMapElement { /** The value data. */ void *data; + /** A pointer to the next element in the current list. */ UcxMapElement *next; + /** The corresponding key. */ UcxKey key; }; @@ -110,8 +115,10 @@ struct UcxMapIterator { /** The map to iterate over. */ UcxMap *map; + /** The current map element. */ UcxMapElement *cur; + /** * The current index of the element list array. * <b>Attention: </b> this is <b>NOT</b> the element index! Do <b>NOT</b> @@ -235,6 +242,7 @@ */ #define ucx_map_sstr_put(map, key, value) \ ucx_map_put(map, ucx_key(key.ptr, key.length), (void*)value) + /** * Shorthand for putting data with a C string key into the map. * @param map the map @@ -245,6 +253,7 @@ */ #define ucx_map_cstr_put(map, key, value) \ ucx_map_put(map, ucx_key((void*)key, strlen(key)), (void*)value) + /** * Shorthand for putting data with an integer key into the map. * @param map the map @@ -256,7 +265,6 @@ #define ucx_map_int_put(map, key, value) \ ucx_map_put(map, ucx_key((void*)&key, sizeof(key)), (void*)value) - /** * Shorthand for getting data from the map with a sstr_t key. * @param map the map @@ -266,6 +274,7 @@ */ #define ucx_map_sstr_get(map, key) \ ucx_map_get(map, ucx_key(key.ptr, key.length)) + /** * Shorthand for getting data from the map with a C string key. * @param map the map @@ -275,6 +284,7 @@ */ #define ucx_map_cstr_get(map, key) \ ucx_map_get(map, ucx_key((void*)key, strlen(key))) + /** * Shorthand for getting data from the map with an integer key. * @param map the map @@ -284,6 +294,7 @@ */ #define ucx_map_int_get(map, key) \ ucx_map_get(map, ucx_key((void*)&key, sizeof(int))) + /** * Shorthand for removing data from the map with a sstr_t key. * @param map the map @@ -293,6 +304,7 @@ */ #define ucx_map_sstr_remove(map, key) \ ucx_map_remove(map, ucx_key(key.ptr, key.length)) + /** * Shorthand for removing data from the map with a C string key. * @param map the map @@ -302,6 +314,7 @@ */ #define ucx_map_cstr_remove(map, key) \ ucx_map_remove(map, ucx_key((void*)key, strlen(key))) + /** * Shorthand for removing data from the map with an integer key. * @param map the map
--- a/ucx/mempool.h Wed Aug 14 16:07:49 2013 +0200 +++ b/ucx/mempool.h Fri Aug 16 13:40:10 2013 +0200 @@ -59,8 +59,10 @@ typedef struct { /** List of pointers to pooled memory. */ void **data; + /** Count of pooled memory items. */ size_t ndata; + /** Memory pool size. */ size_t size; } UcxMempool; @@ -125,6 +127,7 @@ * @see ucx_allocator_calloc() */ void *ucx_mempool_calloc(UcxMempool *pool, size_t nelem, size_t elsize); + /** * Reallocates pooled memory. * @@ -140,6 +143,7 @@ * @see ucx_allocator_realloc() */ void *ucx_mempool_realloc(UcxMempool *pool, void *ptr, size_t n); + /** * Frees pooled memory. *
--- a/ucx/properties.h Wed Aug 14 16:07:49 2013 +0200 +++ b/ucx/properties.h Fri Aug 16 13:40:10 2013 +0200 @@ -56,52 +56,62 @@ * Automatically set by calls to ucx_properties_fill(). */ char *buffer; + /** * Length of the input buffer (don't set manually). * Automatically set by calls to ucx_properties_fill(). */ size_t buflen; + /** * Current buffer position (don't set manually). * Used by ucx_properties_next(). */ size_t pos; + /** * Internal temporary buffer (don't set manually). * Used by ucx_properties_next(). */ char *tmp; + /** * Internal temporary buffer length (don't set manually). * Used by ucx_properties_next(). */ size_t tmplen; + /** * Internal temporary buffer capacity (don't set manually). * Used by ucx_properties_next(). */ size_t tmpcap; + /** * Parser error code. * This is always 0 on success and a nonzero value on syntax errors. * The value is set by ucx_properties_next(). */ int error; + /** * The delimiter that shall be used. * This is '=' by default. */ char delimiter; + /** * The first comment character. * This is '#' by default. */ char comment1; + /** * The second comment character. * This is not set by default. */ char comment2; + /** * The third comment character. * This is not set by default. @@ -115,11 +125,13 @@ * @return a pointer to the new UcxProperties object */ UcxProperties *ucx_properties_new(); + /** * Destroys an UcxProperties object. * @param prop the UcxProperties object to destroy */ void ucx_properties_free(UcxProperties *prop); + /** * Sets the input buffer for the properties parser. * @@ -136,6 +148,7 @@ * @see ucx_properties2map() */ void ucx_properties_fill(UcxProperties *prop, char *buf, size_t len); + /** * Retrieves the next key/value-pair. * @@ -155,6 +168,7 @@ * @see ucx_properties_fill() */ int ucx_properties_next(UcxProperties *prop, sstr_t *name, sstr_t *value); + /** * Retrieves all available key/value-pairs and puts them into an UcxMap. * @@ -184,6 +198,7 @@ * @see ucx_properties2map() */ int ucx_properties_load(UcxMap *map, FILE *file); + /** * Stores an UcxMap to a file. *
--- a/ucx/string.c Wed Aug 14 16:07:49 2013 +0200 +++ b/ucx/string.c Fri Aug 16 13:40:10 2013 +0200 @@ -252,3 +252,34 @@ return newstr; } + +int sstrprefix(sstr_t string, sstr_t prefix) { + if (string.length == 0) { + return prefix.length == 0; + } + if (prefix.length == 0) { + return 1; + } + + if (prefix.length > string.length) { + return 0; + } else { + return memcmp(string.ptr, prefix.ptr, prefix.length) == 0; + } +} + +int sstrsuffix(sstr_t string, sstr_t suffix) { + if (string.length == 0) { + return suffix.length == 0; + } + if (suffix.length == 0) { + return 1; + } + + if (suffix.length > string.length) { + return 0; + } else { + return memcmp(string.ptr+string.length-suffix.length, + suffix.ptr, suffix.length) == 0; + } +}
--- a/ucx/string.h Wed Aug 14 16:07:49 2013 +0200 +++ b/ucx/string.h Fri Aug 16 13:40:10 2013 +0200 @@ -54,6 +54,7 @@ /** Shortcut for a <code>sstr_t struct</code> literal. */ #define ST(s) { (char*)s, sizeof(s)-1 } + /** Shortcut for the conversion of a C string to a <code>sstr_t</code>. */ #define S(s) sstrn((char*)s, sizeof(s)-1) @@ -338,6 +339,22 @@ */ sstr_t sstrtrim(sstr_t string); +/** + * Checks, if a string has a specific prefix. + * @param string the string to check + * @param prefix the prefix the string should have + * @return 1, if and only if the string has the specified prefix, 0 otherwise + */ +int sstrprefix(sstr_t string, sstr_t prefix); + +/** + * Checks, if a string has a specific suffix. + * @param string the string to check + * @param suffix the suffix the string should have + * @return 1, if and only if the string has the specified suffix, 0 otherwise + */ +int sstrsuffix(sstr_t string, sstr_t suffix); + #ifdef __cplusplus } #endif
--- a/ucx/test.h Wed Aug 14 16:07:49 2013 +0200 +++ b/ucx/test.h Fri Aug 16 13:40:10 2013 +0200 @@ -81,6 +81,7 @@ #endif #ifndef __FUNCTION__ + /** * Alias for the <code>__func__</code> preprocessor macro. * Some compilers use <code>__func__</code> and others use __FUNC__. @@ -92,15 +93,19 @@ /** Type for the UcxTestSuite. */ typedef struct UcxTestSuite UcxTestSuite; + /** Pointer to a test function. */ typedef void(*UcxTest)(UcxTestSuite*,FILE*); + /** Type for the internal list of test cases. */ typedef struct UcxTestList UcxTestList; /** Structure for the internal list of test cases. */ struct UcxTestList { + /** Test case. */ UcxTest test; + /** Pointer to the next list element. */ UcxTestList *next; }; @@ -109,10 +114,13 @@ * A test suite containing multiple test cases. */ struct UcxTestSuite { + /** The number of successful tests after the suite has been run. */ unsigned int success; + /** The number of failed tests after the suite has been run. */ unsigned int failure; + /** * Internal list of test cases. * Use ucx_test_register() to add tests to this list. @@ -125,6 +133,7 @@ * @return a new test suite */ UcxTestSuite* ucx_test_suite_new(); + /** * Destroys a test suite. * @param suite the test suite to destroy @@ -140,6 +149,7 @@ * <code>EXIT_FAILURE</code> on failure */ int ucx_test_register(UcxTestSuite* suite, UcxTest test); + /** * Runs a test suite and writes the test log to the specified stream. * @param suite the test suite to run
--- a/ucx/utils.h Wed Aug 14 16:07:49 2013 +0200 +++ b/ucx/utils.h Fri Aug 16 13:40:10 2013 +0200 @@ -179,10 +179,10 @@ int ucx_memcmp(void *ptr1, void *ptr2, void *n); /** - * A printf like function which writes the output to a stream using a write - * function. - * @param stream the stream where to write the data - * @param wfc the write function for the stream + * A <code>printf()</code> like function which writes the output to a stream by + * using a write_func(). + * @param stream the stream the data is written to + * @param wfc the write function * @param fmt format string * @param ... additional arguments * @return the total number of bytes written @@ -190,10 +190,9 @@ int ucx_fprintf(void *stream, write_func wfc, const char *fmt, ...); /** - * Same as ucx_fprintf() but with an argument list instead of variadic - * arguments. - * @param stream the stream where to write the data - * @param wfc the write function for the stream + * <code>va_list</code> version of ucx_fprintf(). + * @param stream the stream the data is written to + * @param wfc the write function * @param fmt format string * @param ap argument list * @return the total number of bytes written @@ -202,30 +201,32 @@ int ucx_vfprintf(void *stream, write_func wfc, const char *fmt, va_list ap); /** - * A printf like function which stores the result in a newly created string. + * A <code>printf()</code> like function which allocates space for a sstr_t + * the result is written to. * - * The sstr_t data is allocated with the allocators ucx_allocator_malloc - * function. So it is implementation depended, whether the returned - * sstr_t.ptr pointer must be passed to the allocators ucx_allocator_free - * function manually. + * <b>Attention</b>: The sstr_t data is allocated with the allocators + * ucx_allocator_malloc() function. So it is implementation dependent, if + * the returned sstr_t.ptr pointer must be passed to the allocators + * ucx_allocator_free() function manually. * - * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>- - * terminated. + * <b>Note</b>: The sstr_t.ptr of the return value will <i>always</i> be + * <code>NULL</code>-terminated. * - * @param allocator a valid instance of an UcxAllocator + * @param allocator the UcxAllocator used for allocating the result sstr_t * @param fmt format string * @param ... additional arguments - * @return a new string + * @return a sstr_t containing the formatted string */ sstr_t ucx_asprintf(UcxAllocator *allocator, const char *fmt, ...); /** - * Same as ucx_asprintf() but with an argument list instead of variadic - * arguments. - * @param allocator a valid instance of an UcxAllocator + * <code>va_list</code> version of ucx_asprintf(). + * + * @param allocator the UcxAllocator used for allocating the result sstr_t * @param fmt format string * @param ap argument list - * @return a new string + * @return a sstr_t containing the formatted string + * @see ucx_asprintf() */ sstr_t ucx_vasprintf(UcxAllocator *allocator, const char *fmt, va_list ap);