#include <stdio.h>
#include <string.h>
#include <time.h>
#define N 9
typedef struct a{
char *p[N];
int num;
}A;
A *split_csv(char *str)
{
char buffer[128];
int bwq = 0; //begin with quote
int len = 0,i = 0,j = 0;
char ch;
char *result;
A *a;
len = strlen(str);
if(str == NULL || 0 == len )
return NULL;
memset(buffer,'/0',sizeof(buffer));
a = (A *)calloc(1,sizeof(A));
for(i=0;i<len;i++)
{
if(j>=N)
break;
ch = str[i];
if(ch == '/"')
{
if(bwq)
{
i++;
if(i>= len)
{
result = calloc(1,128);
sprintf(result,"%s",buffer);
a->p[j++] = result;
result = NULL;
bzero(buffer,128);
bwq=0;
}
else
{
ch=str[i];
if (ch == '/"')
{
sprintf(buffer,"%s%c",buffer,ch);
}
else if (ch == ',')
{
result = calloc(1,128);
sprintf(result,"%s",buffer);
a->p[j++] = result;
result = NULL;
bzero(buffer,128);
bwq=0;
}
else
{
return NULL;
}
}
}
else if(result == NULL ||0 == strlen(result))
{
bwq = 1;
}
else
{
return NULL;
}
}
else if(ch == ',')
{
if(bwq)
{
sprintf(buffer,"%s%c",buffer,ch);
}
else
{
result = calloc(1,128);
sprintf(result,"%s",buffer);
a->p[j++] = result;
result = NULL;
bzero(buffer,128);
bwq=0;
}
}
else
{
sprintf(buffer,"%s%c",buffer,ch);
}
}
if(j<N)
{
result = calloc(1,128);
sprintf(result,"%s",buffer);
a->p[j++] = result;
result = NULL;
}
a->num = j;
return a;
}
void free_a(A *a)
{
int i = 0;
if(NULL == a)
return;
for(i = 0 ;i< a->num; i++)
free(a->p[i]);
free(a);
return ;
}
int main(void)
{
char str[1024];
A *a;
int i=0;
time_t begin;
memset(str,'/0',1024);
sprintf(str,"%s","/"e,/"/"eee/",ddd,aaaa,bbb,ccc,111,222,333,4444");
a = split_csv(str);
if(a == NULL)
{
printf("NULL/n");
exit(0);
}
for(i = 0;i< a->num;i++)
printf("%s/n",a->p[i]);
free_a(a);
}