Skip to content

Commit

Permalink
mx_util: Add mx_strvec_join()
Browse files Browse the repository at this point in the history
  • Loading branch information
donald authored and mariux committed Oct 16, 2015
1 parent 03703e1 commit 11dacb9
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 0 deletions.
34 changes: 34 additions & 0 deletions mx_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -1170,3 +1170,37 @@ char **mx_strvec_from_str(char *str)

return strvec;
}

char *mx_strvec_join(char *sep,char **strvec)
{
int elements=0;
int len=0;
char *out;
char *in;
char *p;
int i;

for (i=0;(in=strvec[i]);i++) {
elements++;
len+=strlen(in);
}
if (elements==0) return mx_strdup_forever("");
len+=strlen(sep)*(elements-1);
out=mx_malloc_forever(len+1);
p=out;

for (i=0;i<elements-1;i++) {
in=strvec[i];
while (*in)
*p++ = *in++;
in=sep;
while (*in)
*p++ = *in++;
}
in=strvec[i];
while (*in)
*p++ = *in++;
in=sep;
*p='\0';
return(out);
}
1 change: 1 addition & 0 deletions mx_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -190,5 +190,6 @@ int mx_strvec_push_strvec(char*** strvecp, char **strvec);
char* mx_strvec_to_str(char **strvec);
char** mx_strvec_from_str(char *str);
void mx_strvec_free(char **strvec);
char* mx_strvec_join(char *sep,char **strvec);

#endif
26 changes: 26 additions & 0 deletions test_mx_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -358,11 +358,37 @@ static void test_mx_strscan(void)

static void test_mx_strvec() {
char **strvec;
char *str;

strvec=mx_strvec_new();
mx_strvec_push_str(&strvec,strdup("Hallo"));
mx_strvec_push_str(&strvec,strdup("Bla"));
mx_strvec_push_str(&strvec,strdup("lall"));

assert(str=mx_strvec_join("XXX",strvec));
assert(strcmp(str,"HalloXXXBlaXXXlall")==0);
free(str);
assert(str=mx_strvec_join("",strvec));
assert(strcmp(str,"HalloBlalall")==0);
free(str);
mx_strvec_free(strvec);

strvec=mx_strvec_new();
assert(str=mx_strvec_join("XXX",strvec));
assert(strcmp(str,"")==0);
free(str);
mx_strvec_push_str(&strvec,strdup("A"));
assert(str=mx_strvec_join("x",strvec));
assert(strcmp(str,"A")==0);
free(str);
mx_strvec_push_str(&strvec,strdup(""));
assert(str=mx_strvec_join("x",strvec));
assert(strcmp(str,"Ax")==0);
free(str);
mx_strvec_push_str(&strvec,strdup("B"));
assert(str=mx_strvec_join("x",strvec));
assert(strcmp(str,"AxxB")==0);
free(str);
mx_strvec_free(strvec);
}

Expand Down

0 comments on commit 11dacb9

Please sign in to comment.