TPCCLIB
Loading...
Searching...
No Matches
csv2ift.c
Go to the documentation of this file.
1
7/*****************************************************************************/
8#include "tpcclibConfig.h"
9/*****************************************************************************/
10#include <stdio.h>
11#include <stdlib.h>
12#include <string.h>
13/*****************************************************************************/
14#include "tpcextensions.h"
15#include "tpccsv.h"
16#include "tpcift.h"
17/*****************************************************************************/
18
19/*****************************************************************************/
20static char *info[] = {
21 "Converts CSV file into IFT format, each CSV field as its own line.",
22 " ",
23 "Usage: @P [Options] csvfile iftfile",
24 " ",
25 "Options:",
26 " -stdoptions", // List standard options like --help, -v, etc
27 " ",
28 "See also: iftlist, iftisval, iftmatch",
29 " ",
30 "Keywords: CSV, IFT, software testing",
31 0};
32/*****************************************************************************/
33
34/*****************************************************************************/
35/* Turn on the globbing of the command line, since it is disabled by default in
36 mingw-w64 (_dowildcard=0); in MinGW32 define _CRT_glob instead, if necessary;
37 In Unix&Linux wildcard command line processing is enabled by default. */
38/*
39#undef _CRT_glob
40#define _CRT_glob -1
41*/
42int _dowildcard = -1;
43/*****************************************************************************/
44
45/*****************************************************************************/
49int main(int argc, char **argv)
50{
51 int ai, help=0, version=0, verbose=1;
52 int ret;
53 char csvfile[FILENAME_MAX], iftfile[FILENAME_MAX];
54 IFT ift;
55 CSV csv;
56 FILE *fp;
57
58
59 /*
60 * Get arguments
61 */
62 if(argc==1) {tpcPrintUsage(argv[0], info, stderr); return(1);}
63 csvInit(&csv); iftInit(&ift);
64 csvfile[0]=iftfile[0]=(char)0;
65 /* Options */
66 for(ai=1; ai<argc; ai++) if(*argv[ai]=='-') {
67 if(tpcProcessStdOptions(argv[ai], &help, &version, &verbose)==0) continue;
68 fprintf(stderr, "Error: invalid option '%s'.\n", argv[ai]);
69 return(1);
70 } else break; // later arguments may start with '-'
71
72 /* Print help or version? */
73 if(help==2) {tpcHtmlUsage(argv[0], info, ""); return(0);}
74 if(help) {tpcPrintUsage(argv[0], info, stdout); return(0);}
75 if(version) {tpcPrintBuild(argv[0], stdout); return(0);}
76
77 TPCSTATUS status; statusInit(&status);
78 statusSet(&status, __func__, __FILE__, __LINE__, TPCERROR_OK);
79 status.verbose=verbose-1;
80
81 /* Process other arguments, starting from the first non-option */
82 for(; ai<argc; ai++) {
83 if(!csvfile[0]) {strcpy(csvfile, argv[ai]); continue;}
84 if(!iftfile[0]) {strcpy(iftfile, argv[ai]); continue;}
85 fprintf(stderr, "Error: invalid argument '%s'.\n", argv[ai]);
86 return(1);
87 }
88
89 /* Check that we got the filenames */
90 if(!iftfile[0]) {tpcPrintUsage(argv[0], info, stderr); return(1);}
91
92 /* In verbose mode print arguments and options */
93 if(verbose>1) {
94 for(ai=0; ai<argc; ai++)
95 printf("%s ", argv[ai]);
96 printf("\n");
97 printf("csvfile := %s\n", csvfile);
98 printf("iftfile := %s\n", iftfile);
99 }
100
101 /*
102 * Read the CSV file
103 */
104 if(verbose>1) printf("reading %s\n", csvfile);
105 fp=fopen(csvfile, "r"); if(fp==NULL) {
106 fprintf(stderr, "Error: cannot open file %s\n", csvfile);
107 return(2);
108 }
109 ret=csvRead(&csv, fp, &status); fclose(fp);
110 if(ret) {
111 fprintf(stderr, "Error (%d): %s\n", ret, errorMsg(status.error));
112 csvFree(&csv); return(2);
113 }
114 if(verbose>2) {
115 printf("field_nr := %d\n", csv.nr);
116 }
117
118 /*
119 * Fill IFT struct
120 */
121 char key[64];
122 ret=TPCERROR_OK;
123 for(int i=0; i<csv.nr; i++) {
124 sprintf(key, "[%d][%d]", 1+csv.c[i].row, 1+csv.c[i].col);
125 ret=iftPut(&ift, key, csv.c[i].content, 0, &status);
126 if(ret!=TPCERROR_OK) break;
127 }
128 csvFree(&csv);
129 if(ret!=TPCERROR_OK) {
130 fprintf(stderr, "Error: %s\n", errorMsg(status.error));
131 iftFree(&ift); return(3);
132 }
133
134 /*
135 * Write the IFT contents.
136 */
137 if(verbose>1) printf("writing modified IFT in %s\n", iftfile);
138 fp=fopen(iftfile, "w"); if(fp==NULL) {
139 fprintf(stderr, "Error: cannot open file %s\n", iftfile);
140 iftFree(&ift); return(11);
141 }
142 ret=iftWrite(&ift, fp, &status); fclose(fp);
143 if(ret!=TPCERROR_OK) {
144 fprintf(stderr, "Error: %s\n", errorMsg(status.error));
145 iftFree(&ift); return(12);
146 }
147 iftFree(&ift);
148
149 return(0);
150}
151/*****************************************************************************/
152
153/*****************************************************************************/
void csvInit(CSV *csv)
Definition csv.c:22
void csvFree(CSV *csv)
Definition csv.c:38
int csvRead(CSV *csv, FILE *fp, TPCSTATUS *status)
Definition csvio.c:124
void iftFree(IFT *ift)
Definition ift.c:37
int iftPut(IFT *ift, const char *key, const char *value, char comment, TPCSTATUS *status)
Definition ift.c:63
void iftInit(IFT *ift)
Definition ift.c:21
int iftWrite(IFT *ift, FILE *fp, TPCSTATUS *status)
Definition iftio.c:98
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
Definition proginfo.c:47
int tpcHtmlUsage(const char *program, char *text[], const char *path)
Definition proginfo.c:169
void tpcPrintBuild(const char *program, FILE *fp)
Definition proginfo.c:339
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
Definition proginfo.c:114
void statusInit(TPCSTATUS *s)
Definition statusmsg.c:104
char * errorMsg(tpcerror e)
Definition statusmsg.c:68
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
Definition statusmsg.c:142
int col
Definition tpccsv.h:28
int row
Definition tpccsv.h:26
char * content
Definition tpccsv.h:30
Definition tpccsv.h:36
CSV_item * c
Definition tpccsv.h:38
int nr
Definition tpccsv.h:42
Definition tpcift.h:43
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
Header file for library libtpccsv.
Header file for library libtpcextensions.
@ TPCERROR_OK
No error.
Header file for library libtpcift.