|
@@ -14,50 +14,42 @@ splitWordsBySeparator(char** words, int wordsSize, char separator,
|
|
|
unsigned long cap;
|
|
unsigned long cap;
|
|
|
unsigned long size;
|
|
unsigned long size;
|
|
|
} ret = {0};
|
|
} ret = {0};
|
|
|
|
|
+ char buf[21] = {0};
|
|
|
|
|
|
|
|
ret.cap = wordsSize;
|
|
ret.cap = wordsSize;
|
|
|
- ret.data = calloc(ret.cap, sizeof(*ret.data));
|
|
|
|
|
-
|
|
|
|
|
for ( int i = 0; i < wordsSize; ++i ) {
|
|
for ( int i = 0; i < wordsSize; ++i ) {
|
|
|
char *cstr = words[i];
|
|
char *cstr = words[i];
|
|
|
|
|
+ while ( *cstr != '\0' ) {
|
|
|
|
|
+ ret.cap += ( *cstr == separator );
|
|
|
|
|
+ ++cstr;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ ret.data = malloc((ret.cap+1) * sizeof(*ret.data));
|
|
|
|
|
+ memset(ret.data, 0, (ret.cap+1) * sizeof(*ret.data));
|
|
|
|
|
+
|
|
|
|
|
+ ret.size = 0;
|
|
|
|
|
+ for ( int i = 0; i < wordsSize; ++i ) {
|
|
|
unsigned long wsize = 0;
|
|
unsigned long wsize = 0;
|
|
|
- unsigned long wcap = 32;
|
|
|
|
|
|
|
+
|
|
|
|
|
+ char *cstr = words[i];
|
|
|
while ( *cstr != '\0' ) {
|
|
while ( *cstr != '\0' ) {
|
|
|
if ( *cstr == separator ) {
|
|
if ( *cstr == separator ) {
|
|
|
- if ( wsize > 0 ) {
|
|
|
|
|
- ret.data[ret.size][wsize++] = 0;
|
|
|
|
|
- ++ret.size;
|
|
|
|
|
- }
|
|
|
|
|
- wsize = 0;
|
|
|
|
|
- wcap = 32;
|
|
|
|
|
- if ( ret.size >= ret.cap ) {
|
|
|
|
|
- ret.cap *= 2;
|
|
|
|
|
- ret.data = realloc(ret.data, sizeof(*ret.data) * ret.cap);
|
|
|
|
|
- for ( unsigned long j = ret.size; j < ret.cap; ++j ) {
|
|
|
|
|
- ret.data[j] = NULL;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
++cstr;
|
|
++cstr;
|
|
|
|
|
+ if ( wsize == 0 ) { continue; }
|
|
|
|
|
+ ret.data[ret.size] = calloc(wsize + 1, sizeof(char));
|
|
|
|
|
+ memcpy(ret.data[ret.size], buf, wsize);
|
|
|
|
|
+ ++ret.size;
|
|
|
|
|
+ wsize = 0;
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
- if ( ret.data[ret.size] == NULL ) { ret.data[ret.size] = malloc(wcap); }
|
|
|
|
|
- ret.data[ret.size][wsize++] = *cstr;
|
|
|
|
|
- if ( wsize >= wcap ) {
|
|
|
|
|
- wcap *= 2;
|
|
|
|
|
- ret.data[ret.size] = realloc(ret.data[ret.size], wcap);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ buf[wsize++] = *cstr;
|
|
|
++cstr;
|
|
++cstr;
|
|
|
}
|
|
}
|
|
|
- if ( wsize != 0 ) {
|
|
|
|
|
- ret.data[ret.size++][wsize++] = 0;
|
|
|
|
|
- if ( ret.size >= ret.cap ) {
|
|
|
|
|
- ret.cap *= 2;
|
|
|
|
|
- ret.data = realloc(ret.data, sizeof(*ret.data) * ret.cap);
|
|
|
|
|
- for ( unsigned long j = ret.size; j < ret.cap; ++j ) {
|
|
|
|
|
- ret.data[j] = NULL;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+
|
|
|
|
|
+ if ( wsize == 0 ) { continue; }
|
|
|
|
|
+ ret.data[ret.size] = calloc(wsize + 1, sizeof(char));
|
|
|
|
|
+ memcpy(ret.data[ret.size], buf, wsize);
|
|
|
|
|
+ ++ret.size;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
*returnSize = ret.size;
|
|
*returnSize = ret.size;
|
|
@@ -68,15 +60,18 @@ void
|
|
|
r(char **ws, int s, char sep)
|
|
r(char **ws, int s, char sep)
|
|
|
{
|
|
{
|
|
|
int ret_size = 0;
|
|
int ret_size = 0;
|
|
|
- char **ret = splitWordsBySeparator(ws, s, sep, &ret_size);
|
|
|
|
|
|
|
+ char **retorig = splitWordsBySeparator(ws, s, sep, &ret_size);
|
|
|
printf("RetSize = %d\n", ret_size);
|
|
printf("RetSize = %d\n", ret_size);
|
|
|
- if ( ret == NULL ) return;
|
|
|
|
|
|
|
+ if ( retorig == NULL ) return;
|
|
|
|
|
+ char **ret = retorig;
|
|
|
|
|
|
|
|
printf("Ret = [");
|
|
printf("Ret = [");
|
|
|
while ( *ret != NULL ) {
|
|
while ( *ret != NULL ) {
|
|
|
- printf("\"%s\", ", *ret++);
|
|
|
|
|
|
|
+ printf("\"%s\", ", *ret);
|
|
|
|
|
+ free(*ret++);
|
|
|
}
|
|
}
|
|
|
printf("]\n");
|
|
printf("]\n");
|
|
|
|
|
+ free(retorig);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int
|
|
int
|