30static unsigned short int _csv_firstfield = 1;
33 fprintf(reportfile,
"\r\n");
39 if (_csv_firstfield) {
40 fprintf(reportfile,
"%s",csv);
43 fprintf(reportfile,
",%s",csv);
49static char* _csvtok_csv=
NULL;
53 char* csvtok_txt =
NULL;
54 unsigned short int quoted = 0;
59 if (_csvtok_csv[0]==0)
62 if (
NULL==(csvtok_txt = malloc(strlen(_csvtok_csv)+1))) {
63 perror(
"csvtok csvtok_txt malloc");
68 while (_csvtok_csv[csv_idx]) {
70 if (_csvtok_csv[csv_idx]==
',') {
71 if ((_csvtok_csv[csv_idx+1]==0)||
72 (_csvtok_csv[csv_idx+1]==
'\n')||
73 ((_csvtok_csv[csv_idx+1]==
'\r')&&(_csvtok_csv[csv_idx+2]==
'\n'))) {
74 fprintf(stderr,
"RFC4180 forbids comma at the end of record %s at %zu.\n",
81 }
else if ((_csvtok_csv[csv_idx]==
'\n')||
82 ((_csvtok_csv[csv_idx]==
'\r')&&(_csvtok_csv[csv_idx+1]==
'\n')))
84 else if (_csvtok_csv[csv_idx]==
'"') {
90 fprintf(stderr,
"doublequote in a non quoted value %s at %zu.\n",
98 if (_csvtok_csv[csv_idx]==
'"') {
99 if (_csvtok_csv[csv_idx+1]==
'"') {
102 }
else if ((_csvtok_csv[csv_idx+1]==
'0')||
103 (_csvtok_csv[csv_idx+1]==
',')||
104 (_csvtok_csv[csv_idx+1]==
'\n')||
105 ((_csvtok_csv[csv_idx+1]==
'\r')&&(_csvtok_csv[csv_idx+2]==
'\n'))) {
110 fprintf(stderr,
"doublequote should be at the end of field or escaping another doublequote in %s at %zu.\n",
111 _csvtok_csv,csv_idx);
118 csvtok_txt[txt_idx++]=_csvtok_csv[csv_idx++];
122 csvtok_txt[txt_idx]=0;
124 fprintf(stderr,
"Missing end-of-field doublequote %s\n",csvtok_txt);
128 }
else if (_csvtok_csv[csv_idx]==
',')
130 else if (_csvtok_csv[csv_idx]==
'\n')
132 else if ((_csvtok_csv[csv_idx]==
'\r')&&(_csvtok_csv[csv_idx+1]==
'\n'))
134 else if (_csvtok_csv[csv_idx]!=0) {
135 fprintf(stderr,
"Parsing error after %s\n",csvtok_txt);
140 _csvtok_csv += csv_idx;
142 if (
NULL==(csvtok_txt=realloc(csvtok_txt,strlen(csvtok_txt)+1))) {
143 fprintf(stderr,
"ERROR: csvtok Trimming CSV token\n");
156 unsigned short int need_quotes=0;
164 size_t extra_chars = 0;
165 for (text_idx=0; text[text_idx]; text_idx++) {
166 if ( (text[text_idx]==
',')|| (text[text_idx]==
'\r')|| (text[text_idx]==
'\n'))
168 if (text[text_idx]==
'"') {
174 if (
NULL==(csv=malloc(strlen(text)+(need_quotes?2:0)+extra_chars+1))) {
175 perror(
"txt2csv malloc");
185 csv[csv_idx++] =
'"';
188 while (text[text_idx]) {
190 if (text[text_idx]==
'"')
191 csv[csv_idx++] =
'"';
192 csv[csv_idx++] = text[text_idx++];
197 csv[csv_idx++] =
'"';
void csv_addfield(FILE *reportfile, const char *value)
void csv_addline(FILE *reportfile)
char * txt2csv(const char *text)
char * csvtok(char *source)