/[csv2latex]/csv2latex.c
ViewVC logotype

Diff of /csv2latex.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 32 by ben, Sat Apr 17 17:27:58 2010 UTC revision 33, Wed Oct 19 17:53:07 2016 UTC
# Line 93  config* parseOptions (config* conf, int Line 93  config* parseOptions (config* conf, int
93  #else  #else
94     int longopt_index = 0;     int longopt_index = 0;
95     static struct option long_options[] = {     static struct option long_options[] = {
96                  {"help",        0, NULL, 'h'},                  {"help",         0, NULL, 'h'},
97                  {"guess",       0, NULL, 'g'},                  {"guess",        0, NULL, 'g'},
98                  {"block",       1, NULL, 'b'},                  {"block",        1, NULL, 'b'},
99                  {"lines",       1, NULL, 'l'},                  {"lines",        1, NULL, 'l'},
100                  {"noescape",    0, NULL, 'x'},                  {"noescape",     0, NULL, 'x'},
101                  {"nohead",      0, NULL, 'n'},                  {"nohead",       0, NULL, 'n'},
102                  {"version",     0, NULL, 'v'},                  {"version",      0, NULL, 'v'},
103                  {"position",    1, NULL, 'p'},                  {"position",     1, NULL, 'p'},
104                  {"separator",   1, NULL, 's'},                  {"separator",    1, NULL, 's'},
105                  {"colorrows",   1, NULL, 'c'},                  {"colorrows",    1, NULL, 'c'},
106                  {"reduce",      1, NULL, 'r'},                  {"reduce",       1, NULL, 'r'},
107                  {"longtable",   0, NULL, 't'},                  {"longtable",    0, NULL, 't'},
108                  {"repeatheader",0, NULL, 'e'},                  {"repeatheader", 0, NULL, 'e'},
109                  {"novlines",            0, NULL, 'y'},                  {"novlines",     0, NULL, 'y'},
110                  {"nohlines",            0, NULL, 'z'},                  {"nohlines",     0, NULL, 'z'},
111                  {NULL, 0, NULL, 0} /* marks end-of-list */                  {NULL, 0, NULL,  0} /* marks end-of-list */
112          };          };
113  #endif  #endif
114  #if defined USE_GETOPT  #if defined USE_GETOPT
# Line 123  config* parseOptions (config* conf, int Line 123  config* parseOptions (config* conf, int
123                                          exit (EXIT_SUCCESS);                                          exit (EXIT_SUCCESS);
124                                          break;                                          break;
125                          case 'g': /* guess the CSV */                          case 'g': /* guess the CSV */
126                                          conf->guess=1;                                          conf->guess = 1;
127                                          break;                                          break;
128                          case 't': /* use package longtable */ /* thx to <Christof.Bodner@infineon.com> */                          case 't': /* use package longtable */ /* thx to <Christof.Bodner@infineon.com> */
129                                          conf->longtable=1;                                          conf->longtable = 1;
130                                          break;                                          break;
131                          case 'b': /* csv block delimiter */                          case 'b': /* csv block delimiter */
132                                          if(optarg[0] == 'q')                                          if(optarg[0] == 'q')
# Line 138  config* parseOptions (config* conf, int Line 138  config* parseOptions (config* conf, int
138                                          break;                                          break;
139                          case 'l': /* number of lines per TeX tabulars */                          case 'l': /* number of lines per TeX tabulars */
140                                          if(isdigit(optarg[0])) {                                          if(isdigit(optarg[0])) {
141                                                  conf->lines=atoi(optarg);                                                  conf->lines = atoi(optarg);
142                                          } else {                                          } else {
143                                                  fprintf(stderr,                                                  fprintf(stderr,
144                                                  "option \"lines\" need a positive integer value\n");                                                  "option \"lines\" need a positive integer value\n");
# Line 146  config* parseOptions (config* conf, int Line 146  config* parseOptions (config* conf, int
146                                          }                                          }
147                                          break;                                          break;
148                          case 'n':                          case 'n':
149                                          conf->header=0;                                          conf->header = 0;
150                                          break;                                          break;
151                          case 'x':                          case 'x':
152                                          conf->escape=0;                                          conf->escape = 0;
153                                          break;                                          break;
154                          case 'v': /* version */                          case 'v': /* version */
155                                          printf ("%s © 2002- Benoît Rouits <brouits@free.fr>\n"                                          printf ("%s © 2002- Benoît Rouits <brouits@free.fr>\n"
# Line 157  config* parseOptions (config* conf, int Line 157  config* parseOptions (config* conf, int
157                                          exit (EXIT_SUCCESS);                                          exit (EXIT_SUCCESS);
158                                          break;                                          break;
159                          case 'p': /* LaTeX position in cell */                          case 'p': /* LaTeX position in cell */
160                                          conf->pos=optarg[0]; /* position char in cell */                                          conf->pos = optarg[0]; /* position char in cell */
161                                          break;                                          break;
162                          case 's': /* csv block separator */                          case 's': /* csv block separator */
163                                          if(optarg[0] == 'c')                                          if(optarg[0] == 'c')
# Line 174  config* parseOptions (config* conf, int Line 174  config* parseOptions (config* conf, int
174                          case 'c': /* color rows (thx to <jcorso@cse.Buffalo.EDU>) */                          case 'c': /* color rows (thx to <jcorso@cse.Buffalo.EDU>) */
175                                          if(isdigit(optarg[0])) {                                          if(isdigit(optarg[0])) {
176                                                  conf->clrrow = (char*)malloc(strlen(optarg)+1);                                                  conf->clrrow = (char*)malloc(strlen(optarg)+1);
177                                                  strcpy(conf->clrrow,optarg);                                                  strcpy(conf->clrrow, optarg);
178                                          } else {                                          } else {
179                                                  fprintf(stderr,                                                  fprintf(stderr,
180                                                  "option \"colorrows\" needs a real value between 0 and 1\n");                                                  "option \"colorrows\" needs a real value between 0 and 1\n");
# Line 185  config* parseOptions (config* conf, int Line 185  config* parseOptions (config* conf, int
185                                    
186                                          if(isdigit(optarg[0])) {                                          if(isdigit(optarg[0])) {
187                                                  tmp = atoi(optarg);                                                  tmp = atoi(optarg);
188                                                  conf->red=(tmp>4)?4:(tmp<0)?0:tmp; /* [1-4] */                                                  conf->red = (tmp>4) ? 4 : (tmp<0) ? 0 : tmp; /* [1-4] */
189                                          } else {                                          } else {
190                                                  fprintf(stderr,                                                  fprintf(stderr,
191                                                  "option \"reduce\" needs an integer value between 1 and 4\n");                                                  "option \"reduce\" needs an integer value between 1 and 4\n");
# Line 193  config* parseOptions (config* conf, int Line 193  config* parseOptions (config* conf, int
193                                          }                                          }
194                                          break;                                          break;
195                          case 'e': /*repeat table header for each table section*/                          case 'e': /*repeat table header for each table section*/
196                                          conf->repeat=1;                                          conf->repeat = 1;
197                                          break;                                          break;
198                          case 'y': /*don't draw vlines between columns*/                          case 'y': /*don't draw vlines between columns*/
199                                          conf->vlines=0;                                          conf->vlines = 0;
200                                          break;                                          break;
201                          case 'z': /*don't draw hlines between rows*/                          case 'z': /*don't draw hlines between rows*/
202                                          conf->hlines=0;                                          conf->hlines = 0;
203                                          break;                                          break;
204                  }                  }
205          }          }
# Line 209  int guessCSV(config* conf, FILE* in) { Line 209  int guessCSV(config* conf, FILE* in) {
209  /* guess the block delimiter and the csv separator */  /* guess the block delimiter and the csv separator */
210          int token;          int token;
211                    
212          token=getc(in); /* first char is block delimiter */          token = getc(in); /* first char is block delimiter */
213          if(token == EOF) {          if(token == EOF) {
214                  fprintf(stderr,"ERROR: emtpy file ?\n");                  fprintf(stderr, "ERROR: emtpy file ?\n");
215                  return(-1);                  return(-1);
216          } else if (ispunct(token) || token == ' ') {          } else if (ispunct(token) || token == ' ') {
217                  /* found first block delimiter, act this way */                  /* found first block delimiter, act this way */
218                  conf->block=token;                  conf->block = token;
219                  fprintf(stderr,"Guessed '%c' as Block Delimiter\n",                  fprintf(stderr, "Guessed '%c' as Block Delimiter\n",
220                                  conf->block);                                  conf->block);
221                  /* stream file while token is printable data */                  /* stream file while token is printable data */
222                  while((token=getc(in)) != conf->block &&                  while((token = getc(in)) != conf->block &&
223                                  token != '\n' &&                                  token != '\n' &&
224                                  token != EOF)                                  token != EOF)
225                  {/* getc has been done */}                  {/* getc has been done */}
226                  if(token == conf->block){                  if(token == conf->block){
227                          /* second delimiter : next is separator */                          /* second delimiter : next is separator */
228                          conf->sep=getc(in);                          conf->sep = getc(in);
229                          fprintf(stderr,"Guessed '%c' as Separator\n",                          fprintf(stderr, "Guessed '%c' as Separator\n",
230                                          conf->sep);                                          conf->sep);
231                          return(0);                          return(0);
232                  }else{                  }else{
233                          return (-1); /* what else ? */                          return (-1); /* what else ? */
234                  }                  }
235          }else{ /* no block delimiter, act this way */          }else{ /* no block delimiter, act this way */
236                  conf->block=0;                  conf->block = 0;
237                  fprintf(stderr,"Guessed No Block Delimiter\n");                  fprintf(stderr, "Guessed No Block Delimiter\n");
238                  /* stream file while input is not a control char */                  /* stream file while input is not a control char */
239                  while(isalnum((token=getc(in))) &&                  while(isalnum((token = getc(in))) &&
240                                  token != '\n' &&                                  token != '\n' &&
241                                  token != EOF)                                  token != EOF)
242                  {/* getc has been done */}                  {/* getc has been done */}
243                  /* guess CSV separator */                  /* guess CSV separator */
244                  if(ispunct(token) || token == '\t' || token == ' '){                  if(ispunct(token) || token == '\t' || token == ' '){
245                          conf->sep=token;                          conf->sep = token;
246                          fprintf(stderr,"Guessed %c as Separator\n", conf->sep);                          fprintf(stderr, "Guessed %c as Separator\n", conf->sep);
247                          return(0);                          return(0);
248                  } else { /* did not found any separator */                  } else { /* did not found any separator */
249                          fprintf(stderr,"ERROR: Did not guess any Separator!\n");                          fprintf(stderr, "ERROR: Did not guess any Separator!\n");
250                          return(-1);                          return(-1);
251                  }                  }
252          }          }
# Line 255  int guessCSV(config* conf, FILE* in) { Line 255  int guessCSV(config* conf, FILE* in) {
255    
256  void getMaximums(config* conf, FILE* in)  {  void getMaximums(config* conf, FILE* in)  {
257  /* gets the number of cols and chars of a csv file assuming a separator */  /* gets the number of cols and chars of a csv file assuming a separator */
258          int token=0;          int token = 0;
259          unsigned int curcol=0;          unsigned int curcol = 0;
260          unsigned int curchar=0;          unsigned int curchar = 0;
261          unsigned int inblock=0;          unsigned int inblock = 0;
262          /* init */          /* init */
263          conf->chars=0;          conf->chars = 0;
264          conf->cols=0;          conf->cols = 0;
265          conf->rows=0;          conf->rows = 0;
266    
267          while (token != EOF) {          while (token != EOF) {
268                  token=getc(in);                  token = getc(in);
269                                    
270                  /* EOF ? */                  /* EOF ? */
271                  if (token == EOF) {                  if (token == EOF) {
# Line 275  void getMaximums(config* conf, FILE* in) Line 275  void getMaximums(config* conf, FILE* in)
275                  /* decide the maximums */                  /* decide the maximums */
276                  if (token == '\n') {                  if (token == '\n') {
277                          curcol++;                          curcol++;
278                          conf->cols=(conf->cols<curcol)?curcol:conf->cols;                          conf->cols = (conf->cols<curcol) ? curcol : conf->cols;
279                          conf->chars=(conf->chars<curchar)?curchar:conf->chars;                          conf->chars = (conf->chars<curchar) ? curchar : conf->chars;
280                          conf->rows++;                          conf->rows++;
281                          curcol=0;                          curcol = 0;
282                          curchar=0;                          curchar = 0;
283                          inblock=0; /* reset block state */                          inblock = 0; /* reset block state */
284                          continue;                          continue;
285                  }                  }
286    
287                  /* enter/quit a block */                  /* enter/quit a block */
288                  if (conf->block && token == conf->block) {                  if (conf->block && token == conf->block) {
289                          inblock=!inblock;                          inblock = !inblock;
290                          continue;                          continue;
291                  }                  }
292    
# Line 307  void getMaximums(config* conf, FILE* in) Line 307  void getMaximums(config* conf, FILE* in)
307    
308  void doTeXsub(config* conf, char newsep, FILE* in, FILE* out) {  void doTeXsub(config* conf, char newsep, FILE* in, FILE* out) {
309  /* substitutes CSV sep by LaTeX newsep and some TeX code */  /* substitutes CSV sep by LaTeX newsep and some TeX code */
310          int token=0;          int token = 0;
311          int max;          int max;
312          int numcols;          int numcols;
313          unsigned int lines;          unsigned int lines;
314          int inblock=0;          int inblock = 0;
315          int csvrows;          int csvrows;
316          int firstrow=1;          int firstrow = 1;
317          int nosep=0;          int nosep = 0;
318          int token1=0;          int token1 = 0;
319          int token2=0;          int token2 = 0;
320          char headerrow[1000];          char headerrow[1000];
321          headerrow[0]='\0';          headerrow[0] = '\0';
322    
323          max=numcols=conf->cols;          max = numcols = conf->cols;
324          csvrows=conf->rows;          csvrows = conf->rows;
325          /* choose infinity when conf->lines is 0 */          /* choose infinity when conf->lines is 0 */
326          lines=(conf->lines)?conf->lines:MAXUINT;          lines = (conf->lines) ? conf->lines : MAXUINT;
327    
328          while (token!=EOF) {          while (token != EOF) {
329                  token2=token1;  /* second last character, used for detection of quotation marks */                  token2 = token1;        /* second last character, used for detection of quotation marks */
330                  token1=token;   /* last character, used for detection of quotation marks */                  token1 = token; /* last character, used for detection of quotation marks */
331                  token=getc(in);                  token = getc(in);
332                                    
333                  /* EOF ? */                  /* EOF ? */
334                  if (token == EOF) {                  if (token == EOF) {
# Line 340  void doTeXsub(config* conf, char newsep, Line 340  void doTeXsub(config* conf, char newsep,
340                          inblock = 0; /* close block if any */                          inblock = 0; /* close block if any */
341                          /* fill empty cols if any */                          /* fill empty cols if any */
342                          while (numcols > 1) {                          while (numcols > 1) {
343                                  putc(newsep,out);                                  putc(newsep, out);
344                                  numcols--;                                  numcols--;
345                          }                          }
346                          if (!(firstrow && (conf->longtable && conf->repeat))) {                          if (!(firstrow && (conf->longtable && conf->repeat))) {
347                                  fprintf(out,"\\\\\n"); /* TeX new line */                                  fprintf(out, "\\\\\n"); /* TeX new line */
348                          } else { /* first row and repeat and longtable */                          } else { /* first row and repeat and longtable */
349                                  fprintf(out, "%s\\\\\n", headerrow);                                  fprintf(out, "%s\\\\\n", headerrow);
350                          }                          }
351                          if(conf->hlines) {                          if(conf->hlines) {
352                                  fprintf(out,"\\hline\n"); /* TeX draw hline */                                  fprintf(out, "\\hline\n"); /* TeX draw hline */
353                          }                          }
354                          if (firstrow && (conf->longtable && conf->repeat)) {                          if (firstrow && (conf->longtable && conf->repeat)) {
355                                  fprintf(out, "%s", "\\endhead\n");                                  fprintf(out, "%s", "\\endhead\n");
356                          }                          }
357                          if(firstrow && conf->repeat) {                          if(firstrow && conf->repeat) {
358                                  char tmp[12];                                  char tmp[12];
359                                  sprintf(tmp,(conf->hlines?"\\\\\n\\hline":"\\\\\n"));                                  sprintf(tmp, (conf->hlines ? "\\\\\n\\hline" : "\\\\\n"));
360                                  strcat(headerrow,tmp);                                  strcat(headerrow, tmp);
361                          }                          }
362                          firstrow=0;                          firstrow = 0;
363                          numcols=max; /* reset numcols */                          numcols = max; /* reset numcols */
364                          lines--;                          lines--;
365                          csvrows--;                          csvrows--;
366                          /* put a colored row or not (alternate) */                          /* put a colored row or not (alternate) */
367                          if (conf->clrrow && (lines % 2)) {                          if (conf->clrrow && (lines % 2)) {
368                                  fprintf(out,"\\colorrow ");                                  fprintf(out, "\\colorrow ");
369                          }                          }
370                          /* if the LaTeX tabular is full create a new one, except if no more row or this is a long table */                          /* if the LaTeX tabular is full create a new one, except if no more row or this is a long table */
371                          if (!lines && csvrows && !conf->longtable) {                          if (!lines && csvrows && !conf->longtable) {
372                                  fprintf(out,"\\end{tabular}\n");                                  fprintf(out, "\\end{tabular}\n");
373                                  fprintf(out, "\\newline\n");                                  fprintf(out, "\\newline\n");
374                                  fprintf(out,"\\begin{tabular}{");                                  fprintf(out, "\\begin{tabular}{");
375                                  if(conf->vlines) {                                  if(conf->vlines) {
376                                          putc('|',out);                                          putc('|', out);
377                                  }                                  }
378                                  while(numcols--) {                                  while(numcols--) {
379                                          putc(conf->pos, out);                                          putc(conf->pos, out);
380                                          if(conf->vlines) {                                          if(conf->vlines) {
381                                                  putc('|',out);                                                  putc('|', out);
382                                          }                                          }
383                                  }                                  }
384                                  fprintf(out, "}\n");                                  fprintf(out, "}\n");
# Line 386  void doTeXsub(config* conf, char newsep, Line 386  void doTeXsub(config* conf, char newsep,
386                                          fprintf(out, "\\hline\n");                                          fprintf(out, "\\hline\n");
387                                  }                                  }
388                                  if(conf->repeat && !conf->longtable) {                                  if(conf->repeat && !conf->longtable) {
389                                          fprintf(out,"%s",headerrow);                                          fprintf(out, "%s", headerrow);
390                                          putc('\n',out);                                          putc('\n', out);
391                                  }                                  }
392                                  numcols=max;                                  numcols = max;
393                                  lines=(conf->lines)?conf->lines:MAXUINT;                                  lines = (conf->lines) ? conf->lines : MAXUINT;
394                          }                          }
395                                  /* else end of CSV data */                                  /* else end of CSV data */
396                          continue;                          continue;
# Line 399  void doTeXsub(config* conf, char newsep, Line 399  void doTeXsub(config* conf, char newsep,
399                  /* if commas in cells */                  /* if commas in cells */
400                  /* thx to <florian@heinze.at> */                  /* thx to <florian@heinze.at> */
401                  if (token == '\"'){                  if (token == '\"'){
402                          if (nosep==0)                          if (nosep == 0)
403                                  nosep=1;                                  nosep = 1;
404                          else                          else
405                                  nosep=0;                                  nosep = 0;
406                  }                  }
407                                    
408                  /* new column ? */                  /* new column ? */
409                  if ((token == conf->sep && ((conf->block && !inblock) || !conf->block)) && nosep == 0) {                                          if ((token == conf->sep && ((conf->block && !inblock) || !conf->block)) && nosep == 0) {                        
410                          if (!(firstrow && (conf->longtable && conf->repeat)))                          if (!(firstrow && (conf->longtable && conf->repeat)))
411                                  putc(newsep,out);                                  putc(newsep, out);
412                          numcols--;                          numcols--;
413                          if(firstrow && conf->repeat)                          if(firstrow && conf->repeat)
414                          {                          {
415                                  char tmp[2];                                  char tmp[2];
416                                  tmp[0]=newsep;                                  tmp[0] = newsep;
417                                  tmp[1]='\0';                                  tmp[1] = '\0';
418                                  strcat(headerrow,tmp);                                  strcat(headerrow, tmp);
419                          }                          }
420                          continue;                          continue;
421                  }                  }
422    
423                  /* enter/quit a block ? */                  /* enter/quit a block ? */
424                  if (conf->block && token == conf->block) {                  if (conf->block && token == conf->block) {
425                          inblock=!inblock;                          inblock = !inblock;
426                          continue;                          continue;
427                  }                  }
428    
429                  /* data ? */                  /* data ? */
430                  if ((token != conf->block && ((conf->block && inblock) || !conf->block)) && ((token=='\"' && token1=='\"' && token2=='\"') || token!='\"')) {                  if ((token != conf->block && ((conf->block && inblock) || !conf->block))
431                                    && ((token == '\"' && token1 == '\"' && token2 == '\"') || token != '\"')) {
432                          /* look for special TeX char to escape */                          /* look for special TeX char to escape */
433                          /* FIXME: put all that into a subroutine */                          /* FIXME: put all that into a subroutine */
434                          int i=0;                          int i = 0;
435                          if (conf->escape)                          if (conf->escape)
436                                  for (i=0;i < conf->tex->size; i++) {                                  for (i = 0; i < conf->tex->size; i++) {
437                                          if (token == conf->tex->tab[i]) {                                          if (token == conf->tex->tab[i]) {
438                                                  switch (token) {                                                  switch (token) {
439                                                          case '\\':                                                          case '\\':
# Line 440  void doTeXsub(config* conf, char newsep, Line 441  void doTeXsub(config* conf, char newsep,
441                                                                  if(firstrow && conf->repeat)                                                                  if(firstrow && conf->repeat)
442                                                                  {                                                                  {
443                                                                          char tmp[17];                                                                          char tmp[17];
444                                                                          sprintf(tmp,"\\textbackslash{}");                                                                          sprintf(tmp, "\\textbackslash{}");
445                                                                          strcat(headerrow,tmp);                                                                          strcat(headerrow, tmp);
446                                                                  }                                                                  }
447                                                                  break;                                                                  break;
448                                                          default:                                                          default:
# Line 449  void doTeXsub(config* conf, char newsep, Line 450  void doTeXsub(config* conf, char newsep,
450                                                                  if(firstrow && conf->repeat)                                                                  if(firstrow && conf->repeat)
451                                                                  {                                                                  {
452                                                                          char tmp[3];                                                                          char tmp[3];
453                                                                          tmp[0]='\\';                                                                          tmp[0] = '\\';
454                                                                          tmp[1]=token;                                                                          tmp[1] = token;
455                                                                          tmp[2]='\0';                                                                          tmp[2] = '\0';
456                                                                          strcat(headerrow,tmp);                                                                          strcat(headerrow, tmp);
457                                                                  }                                                                  }
458                                                                  break;                                                                  break;
459                                                  }                                                  }
# Line 460  void doTeXsub(config* conf, char newsep, Line 461  void doTeXsub(config* conf, char newsep,
461                                          }                                          }
462                                  }                                  }
463                          /* or print raw char */                          /* or print raw char */
464                          if ( (i >= conf->tex->size) || (!conf->escape) ) {                          if ((i >= conf->tex->size) || (!conf->escape)) {
465                                  if (!(firstrow && (conf->longtable && conf->repeat)))                                  if (!(firstrow && (conf->longtable && conf->repeat)))
466                                          putc(token, out); /* do not print the header twice */                                          putc(token, out); /* do not print the header twice */
467                                  if(firstrow && conf->repeat)                                  if(firstrow && conf->repeat)
468                                  {                                  {
469                                          char tmp[2];                                          char tmp[2];
470                                          tmp[0]=token;                                          tmp[0] = token;
471                                          tmp[1]='\0';                                          tmp[1] = '\0';
472                                          strcat(headerrow,tmp);                                          strcat(headerrow, tmp);
473                                  }                                  }
474                          }                          }
475                          continue;                          continue;
# Line 485  void doTeXdoc(config* conf, FILE* in, FI Line 486  void doTeXdoc(config* conf, FILE* in, FI
486          char* relsize[5] = {"0", "0.5", "1", "2", "4"}; /* LaTeX relsize good values */          char* relsize[5] = {"0", "0.5", "1", "2", "4"}; /* LaTeX relsize good values */
487          char* tabcolsep[5] = {"0", "0.05", "0.1", "0.2", "0.4"}; /* LaTeX tabcolsep good values */          char* tabcolsep[5] = {"0", "0.05", "0.1", "0.2", "0.4"}; /* LaTeX tabcolsep good values */
488    
489          numcols=maxcols=conf->cols;          numcols = maxcols = conf->cols;
490          if(conf->header){          if(conf->header){
491                  fprintf(out, "\\documentclass[a4paper]{article}\n");                  fprintf(out, "\\documentclass[a4paper]{article}\n");
492                  fprintf(out, "\\usepackage[T1]{fontenc}\n");                  fprintf(out, "\\usepackage[T1]{fontenc}\n");
493                  fprintf(out, "\\usepackage[latin1]{inputenc}\n");                  fprintf(out, "\\usepackage[latin1]{inputenc}\n");
494                  if (conf->red){                  if (conf->red){
495                          fprintf(out,"\\usepackage{relsize}\n");                          fprintf(out, "\\usepackage{relsize}\n");
496                  }                  }
497                  if (conf->clrrow){                  if (conf->clrrow){
498                          fprintf(out,"\\usepackage{colortbl}\n");                          fprintf(out, "\\usepackage{colortbl}\n");
499                  }                  }
500                  if (conf->longtable){                  if (conf->longtable){
501                          fprintf(out,"\\usepackage{longtable}\n");                          fprintf(out, "\\usepackage{longtable}\n");
502                  }                  }
503                  fprintf(out, "\\begin{document}\n");                  fprintf(out, "\\begin{document}\n");
504          }          }
505          if (conf->clrrow){          if (conf->clrrow){
506                  fprintf(out,"\\def\\colorrow{\\rowcolor[gray]{%s}}\n",                  fprintf(out, "\\def\\colorrow{\\rowcolor[gray]{%s}}\n",
507                                  conf->clrrow);                                  conf->clrrow);
508          }          }
509          if (conf->red){          if (conf->red){
510                  fprintf(out,"\\relsize{-%s}\n", relsize[conf->red]);                  fprintf(out, "\\relsize{-%s}\n", relsize[conf->red]);
511                  fprintf(out,"\\addtolength\\tabcolsep{-%sem}\n", tabcolsep[conf->red]);                  fprintf(out, "\\addtolength\\tabcolsep{-%sem}\n", tabcolsep[conf->red]);
512          }          }
513          if (conf->longtable)          if (conf->longtable)
514          {          {
515            fprintf(out, "\\begin{longtable}{");            fprintf(out, "\\begin{longtable}{");
516            if(conf->vlines)            if(conf->vlines)
517                  putc('|',out);                  putc('|', out);
518          }          }
519          else          else
520          {          {
521            fprintf(out, "\\begin{tabular}{");            fprintf(out, "\\begin{tabular}{");
522            if(conf->vlines)            if(conf->vlines)
523                  putc('|',out);                  putc('|', out);
524          }          }
525          while(numcols--)          while(numcols--)
526          {          {
527                  fprintf(out, "%c",conf->pos); /* position in cell */                  fprintf(out, "%c", conf->pos); /* position in cell */
528                  if(conf->vlines)                  if(conf->vlines)
529                          putc('|',out);                          putc('|', out);
530          }          }
531          fprintf(out, "}\n");          fprintf(out, "}\n");
532          if(conf->hlines)          if(conf->hlines)
# Line 537  void doTeXdoc(config* conf, FILE* in, FI Line 538  void doTeXdoc(config* conf, FILE* in, FI
538            fprintf(out, "\\end{tabular}\n");            fprintf(out, "\\end{tabular}\n");
539          }          }
540          if (conf->red){          if (conf->red){
541                  fprintf(out,"\\addtolength\\tabcolsep{+%sem}\n", tabcolsep[conf->red]);                  fprintf(out, "\\addtolength\\tabcolsep{+%sem}\n", tabcolsep[conf->red]);
542                  fprintf(out,"\\relsize{+%s}\n", relsize[conf->red]);                  fprintf(out, "\\relsize{+%s}\n", relsize[conf->red]);
543          }          }
544          if(conf->header){          if(conf->header){
545                  fprintf(out, "\\end{document}\n");                  fprintf(out, "\\end{document}\n");
546          }          }
547          return;          return;
548  }  }
549                    
550  int main (int argc, char **argv) {  int main (int argc, char **argv) {
551          FILE* fp;          FILE* fp;
552          config* conf;          config* conf;
553    
554          extern int optind, opterr, optopt;          extern int optind, opterr, optopt;
555    
556          if(argc == 1){          conf = (config*)malloc(sizeof(config));
                 rtfm(argv[0]);  
                 exit(EXIT_SUCCESS);  
         }  
         conf=(config*)malloc(sizeof(config));  
557          /* defaults (ensure init): */          /* defaults (ensure init): */
558          conf->cols=1;        /* CSV: if getMaximums fails */          conf->cols = 1;        /* CSV: if getMaximums fails */
559          conf->rows=0;         /* CSV: must be 0 */          conf->rows = 0;        /* CSV: must be 0 */
560          conf->chars=0;       /* CSV: must be 0 */          conf->chars = 0;       /* CSV: must be 0 */
561          conf->pos='l';       /* usual; LaTeX */          conf->pos = 'l';       /* usual; LaTeX */
562          conf->lines=40;      /* usual; LaTeX */          conf->lines = 40;      /* usual; LaTeX */
563          conf->guess=0;       /* usual */          conf->guess = 0;       /* usual */
564          conf->sep=',';       /* default; csv */          conf->sep = ',';       /* default; csv */
565          conf->block=0;       /* default; csv */          conf->block = 0;       /* default; csv */
566          conf->header=1;      /* usual; LaTeX */          conf->header = 1;      /* usual; LaTeX */
567          conf->escape=1;      /* usual; LaTeX */          conf->escape = 1;      /* usual; LaTeX */
568          conf->clrrow=NULL;   /* default; LaTeX */          conf->clrrow = NULL;   /* default; LaTeX */
569          conf->red=0;         /* default; LaTeX */          conf->red = 0;         /* default; LaTeX */
570          conf->longtable=0;   /* default; without package longtable */          conf->longtable = 0;   /* default; without package longtable */
571          conf->repeat=0;         /* default; do not repeat the header row */          conf->repeat = 0;      /* default; do not repeat the header row */
572          conf->vlines=1;         /* default; draw lines between columns */          conf->vlines = 1;      /* default; draw lines between columns */
573          conf->hlines=1;         /* default; draw lines between rows */          conf->hlines = 1;      /* default; draw lines between rows */
574                    
575          /* TeX charaters to escape */          /* TeX charaters to escape */
576          conf->tex=(texcape*)malloc(sizeof(texcape));          conf->tex = (texcape*)malloc(sizeof(texcape));
577          conf->tex->tab = "\\_#$%^&{}~";          conf->tex->tab = "\\_#$%^&{}~";
578          conf->tex->size = 10;          conf->tex->size = strlen(conf->tex->tab);
579                    
580          conf=parseOptions(conf, argc, argv);  
581          fp=fopen(argv[optind],"r");          conf = parseOptions(conf, argc, argv);
582    
583            if (optind == argc) {
584                    /* copy stdin into tmp file */
585                    char c;
586                    fp = tmpfile();
587                    while (EOF != (c = getc(stdin))) {
588                            putc(c, fp);
589                    }
590                    rewind(fp);
591            } else {
592                    fp = fopen(argv[optind], "r");
593            }
594    
595          if (!fp){          if (!fp){
596                  fprintf(stderr,"Can't open file %s\n", argv[optind]);                  fprintf(stderr, "Can't open file %s\n", argv[optind]);
597                  exit(EXIT_FAILURE);                  exit(EXIT_FAILURE);
598          }          }
599    
600          if(conf->guess){          if(conf->guess){
601                  if(guessCSV(conf, fp)){                  if(guessCSV(conf, fp)){
602                          fprintf(stderr,"Please run again by using -- delimiter (if any) and --separator\n");                          fprintf(stderr, "Please run again by using -- delimiter (if any) and --separator\n");
603                          exit(EXIT_FAILURE);                          exit(EXIT_FAILURE);
604                  }                  }
605                  rewind(fp);                  rewind(fp);
606          }          }
607    
608          getMaximums(conf, fp);          getMaximums(conf, fp);
609          rewind(fp);          rewind(fp);
610          doTeXdoc(conf, fp, stdout);          doTeXdoc(conf, fp, stdout);
# Line 600  int main (int argc, char **argv) { Line 612  int main (int argc, char **argv) {
612          if (conf->clrrow) free(conf->clrrow); conf->clrrow=NULL;          if (conf->clrrow) free(conf->clrrow); conf->clrrow=NULL;
613          free(conf);          free(conf);
614          fclose(fp);          fclose(fp);
615          return 0;  
616            exit(EXIT_SUCCESS);
617  }  }

Legend:
Removed from v.32  
changed lines
  Added in v.33

  ViewVC Help
Powered by ViewVC 1.1.26