aheinecke@59: aheinecke@59: #include aheinecke@59: #include aheinecke@59: #include aheinecke@59: #include aheinecke@59: aheinecke@59: static void aheinecke@59: out_of_core(void) aheinecke@59: { aheinecke@59: fputs("\nfatal: out of memory\n", stderr); aheinecke@59: exit(2); aheinecke@59: } aheinecke@59: void * aheinecke@59: xmalloc( size_t n ) aheinecke@59: { aheinecke@59: void *p = malloc( n ); aheinecke@59: if( !p ) aheinecke@59: out_of_core(); aheinecke@59: return p; aheinecke@59: } aheinecke@59: aheinecke@59: void * aheinecke@59: xrealloc( void *a, size_t n ) aheinecke@59: { aheinecke@59: void *p = realloc( a, n ); aheinecke@59: if( !p ) aheinecke@59: out_of_core(); aheinecke@59: return p; aheinecke@59: } aheinecke@59: aheinecke@59: char * aheinecke@59: xstrdup( const char *string ) aheinecke@59: { aheinecke@59: void *p = xmalloc( strlen(string)+1 ); aheinecke@59: strcpy( p, string ); aheinecke@59: return p; aheinecke@59: } aheinecke@59: aheinecke@59: aheinecke@59: /** aheinecke@59: * strv_length: aheinecke@59: * @str_array: a %NULL-terminated array of strings aheinecke@59: * aheinecke@59: * Returns the length of the given %NULL-terminated aheinecke@59: * string array @str_array. aheinecke@59: * aheinecke@59: * Return value: length of @str_array. aheinecke@59: * aheinecke@59: */ aheinecke@59: unsigned int aheinecke@59: strv_length (char **str_array) aheinecke@59: { aheinecke@59: unsigned int i = 0; aheinecke@59: aheinecke@59: if (!str_array) aheinecke@59: return 0; aheinecke@59: aheinecke@59: while (str_array[i]) aheinecke@59: ++i; aheinecke@59: aheinecke@59: return i; aheinecke@59: } aheinecke@59: aheinecke@59: /* @brief append a string to a NULL terminated array of strings. aheinecke@59: * aheinecke@59: * @param[inout] array pointer to the NULL terminated list of string pointers. aheinecke@59: * @param[in] string pointer to the string to append to the list. aheinecke@59: * */ aheinecke@59: void array_append_str(char ***pArray, const char *string) aheinecke@59: { aheinecke@59: unsigned int old_len = strv_length(*pArray); aheinecke@59: *pArray = xrealloc(*pArray, sizeof(char**) * (old_len + 2)); aheinecke@59: aheinecke@59: *pArray[old_len] = xstrdup(string); aheinecke@59: *pArray[old_len + 1] = NULL; aheinecke@59: } aheinecke@59: aheinecke@59: /* @brief append a string to another string. aheinecke@59: * aheinecke@59: * @param[inout] pDst pointer to the string to be extended. aheinecke@59: * @param[in] appendage pointer to the string to append. aheinecke@59: * */ aheinecke@59: void str_append_str(char **pDst, const char *appendage) aheinecke@59: { aheinecke@59: size_t old_len = strlen(*pDst), aheinecke@59: added_len = strlen(appendage); aheinecke@59: size_t new_len = old_len + added_len + 1; aheinecke@59: aheinecke@59: if (!appendage) aheinecke@59: return; aheinecke@59: aheinecke@59: *pDst = (char *)xrealloc(*pDst, sizeof(char) * (new_len)); aheinecke@59: aheinecke@59: strcpy(*pDst + old_len, appendage); aheinecke@59: aheinecke@59: *pDst[new_len - 1] = '\0'; aheinecke@59: } aheinecke@59: aheinecke@59: void aheinecke@59: strfreev (char **str_array) aheinecke@59: { aheinecke@59: if (str_array) aheinecke@59: { aheinecke@59: int i; aheinecke@59: aheinecke@59: for (i = 0; str_array[i] != NULL; i++) aheinecke@59: free (str_array[i]); aheinecke@59: aheinecke@59: free (str_array); aheinecke@59: } aheinecke@59: }