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@60: xstrndup( const char *string, const size_t len ) aheinecke@59: { aheinecke@60: char *p = xmalloc( len + 1 ); aheinecke@60: memcpy( p, string, len ); aheinecke@60: p[len] = '\0'; aheinecke@59: return p; 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@60: void array_append_str(char ***pArray, const char *string, const size_t len) aheinecke@59: { aheinecke@60: unsigned int old_len = 0; aheinecke@60: aheinecke@60: if (!*pArray) { aheinecke@60: *pArray = xmalloc(2 * sizeof(char*)); aheinecke@60: (*pArray)[0] = xstrndup(string, len); aheinecke@60: (*pArray)[1] = NULL; aheinecke@60: return; aheinecke@60: } aheinecke@60: old_len = strv_length(*pArray); aheinecke@59: *pArray = xrealloc(*pArray, sizeof(char**) * (old_len + 2)); aheinecke@59: aheinecke@60: (*pArray)[old_len] = xstrndup(string, len); aheinecke@60: (*pArray)[old_len + 1] = NULL; aheinecke@59: } aheinecke@59: aheinecke@60: void str_append_str(char **pDst, const char *appendage, const size_t len) aheinecke@59: { aheinecke@59: if (!appendage) aheinecke@59: return; aheinecke@59: aheinecke@60: if (!*pDst) { aheinecke@60: *pDst = xstrndup(appendage, len); aheinecke@60: } else { aheinecke@60: size_t old_len = strlen(*pDst); aheinecke@60: size_t new_len = old_len + len + 1; aheinecke@60: *pDst = (char *)xrealloc(*pDst, sizeof(char) * (new_len)); aheinecke@60: strncpy(*pDst + old_len, appendage, new_len); aheinecke@60: *pDst[new_len] = '\0'; aheinecke@60: } 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: }