mirror of
https://github.com/johnkerl/miller.git
synced 2026-01-23 10:15:36 +00:00
63 lines
1.6 KiB
C
63 lines
1.6 KiB
C
#include <stdlib.h>
|
|
#include "lib/mlrutil.h"
|
|
#include "string_array.h"
|
|
|
|
string_array_t* string_array_alloc(int length) {
|
|
string_array_t* parray = mlr_malloc_or_die(sizeof(string_array_t));
|
|
parray->length = length;
|
|
parray->strings_need_freeing = FALSE;
|
|
parray->strings = mlr_malloc_or_die(length * sizeof(char*));
|
|
for (int i = 0; i < length; i++)
|
|
parray->strings[i] = NULL;
|
|
return parray;
|
|
}
|
|
|
|
void string_array_free(string_array_t* parray) {
|
|
if (parray == NULL)
|
|
return;
|
|
if (parray->strings_need_freeing) {
|
|
for (int i = 0; i < parray->length; i++)
|
|
free(parray->strings[i]);
|
|
}
|
|
free(parray->strings);
|
|
free(parray);
|
|
}
|
|
|
|
void string_array_realloc(string_array_t* parray, int new_length) {
|
|
if (parray->strings_need_freeing)
|
|
for (int i = 0; i < parray->length; i++)
|
|
free(parray->strings[i]);
|
|
if (new_length > parray->length) // else re-use
|
|
parray->strings = mlr_realloc_or_die(parray->strings, new_length * sizeof(char*));
|
|
parray->length = new_length;
|
|
for (int i = 0; i < parray->length; i++)
|
|
parray->strings[i] = NULL;
|
|
parray->strings_need_freeing = FALSE;
|
|
}
|
|
|
|
string_array_t* string_array_from_line(char* line, char ifs) {
|
|
if (*line == 0) // empty string splits to empty array
|
|
return string_array_alloc(0);
|
|
|
|
int num_commas = 0;
|
|
|
|
for (char* p = line; *p; p++)
|
|
if (*p == ifs)
|
|
num_commas++;
|
|
|
|
string_array_t* parray = string_array_alloc(num_commas + 1);
|
|
|
|
char* start = line;
|
|
int i = 0;
|
|
for (char* p = line; *p; p++) {
|
|
if (*p == ifs) {
|
|
*p = 0;
|
|
p++;
|
|
parray->strings[i++] = start;
|
|
start = p;
|
|
}
|
|
}
|
|
parray->strings[i++] = start;
|
|
|
|
return parray;
|
|
}
|