/[csv2latex]/csv2latex.c
ViewVC logotype

Diff of /csv2latex.c

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

revision 5 by ben, Thu Oct 8 09:54:13 2009 UTC revision 6 by ben, Sat Feb 6 18:56:24 2010 UTC
# Line 52  typedef struct { Line 52  typedef struct {
52          unsigned int red;       /* table reduction level (from 1 to 4)*/          unsigned int red;       /* table reduction level (from 1 to 4)*/
53          unsigned int longtable; /* use package longtable */          unsigned int longtable; /* use package longtable */
54          unsigned int escape;    /* escape TeX control chars or not */          unsigned int escape;    /* escape TeX control chars or not */
55            unsigned int repeat;    /* repeat table headers for each LaTeX table section or not */
56            unsigned int vlines;    /* insert vertical lines between columns or not */
57            unsigned int hlines;    /* insert horizontal lines between rows or not */
58          char* clrrow;   /* row graylevel (from 0 to 1) */          char* clrrow;   /* row graylevel (from 0 to 1) */
59          texcape* tex;   /* TeX escapes */          texcape* tex;   /* TeX escapes */
60  } config;  } config;
# Line 71  void rtfm(char* prog) { Line 74  void rtfm(char* prog) {
74     printf("     [--position <l|c|r>] (LaTeX) text align in cells\n");     printf("     [--position <l|c|r>] (LaTeX) text align in cells\n");
75     printf("     [--colorrows graylevel] (LaTeX) alternate gray rows (e.g: 0.75)\n");     printf("     [--colorrows graylevel] (LaTeX) alternate gray rows (e.g: 0.75)\n");
76     printf("     [--reduce level] (LaTeX) reduce table size (e.g: 1)\n");     printf("     [--reduce level] (LaTeX) reduce table size (e.g: 1)\n");
77       printf("     [--repeatheader] (LaTeX) repeat table header (for long tables)\n");
78       printf("     [--nohlines] (LaTeX) don't put hline between table rows\n");
79       printf("     [--novlines] (LaTeX) don't put vline between columns\n");
80     printf("             csv_file.csv\n");     printf("             csv_file.csv\n");
81     printf("The \"longtable\" option needs the {longtable} LaTeX package\n");     printf("The \"longtable\" option needs the {longtable} LaTeX package\n");
82     printf("The \"colorrows\" option needs the {colortbl} LaTeX package\n");     printf("The \"colorrows\" option needs the {colortbl} LaTeX package\n");
# Line 87  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'},
109                    {"novlines",            0, NULL, 'y'},
110                    {"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
115          while ((opt = getopt (argc, argv, "hvgnxt?b:l:p:s:c:r:")) != EOF) {          while ((opt = getopt (argc, argv, "hvgnxteyz?b:l:p:s:c:r:")) != EOF) {
116  #else  #else
117          while ((opt = getopt_long (argc, argv, "hvgnxt?b:l:p:s:c:r:", long_options, &longopt_index)) > 0) {          while ((opt = getopt_long (argc, argv, "hvgnxteyz?b:l:p:s:c:r:", long_options, &longopt_index)) > 0) {
118  #endif  #endif
119                  switch (opt) {                  switch (opt) {
120                          case '?':                          case '?':
# Line 183  config* parseOptions (config* conf, int Line 192  config* parseOptions (config* conf, int
192                                                  exit(EXIT_FAILURE);                                                  exit(EXIT_FAILURE);
193                                          }                                          }
194                                          break;                                          break;
195                            case 'e': /*repeat table header for each table section*/
196                                            conf->repeat=1;
197                                            break;
198                            case 'y': /*don't draw vlines between columns*/
199                                            conf->vlines=0;
200                                            break;
201                            case 'z': /*don't draw hlines between rows*/
202                                            conf->hlines=0;
203                                            break;
204                  }                  }
205          }          }
206          return conf;          return conf;
# Line 292  void doTeXsub(config* conf, char newsep, Line 310  void doTeXsub(config* conf, char newsep,
310          int token=0;          int token=0;
311          int max;          int max;
312          int numcols;          int numcols;
313          int lines;          unsigned int lines;
314          int inblock=0;          int inblock=0;
315          int csvrows;          int csvrows;
316            int firstrow=1;
317            char headerrow[1000];
318            headerrow[0]='\0';
319    
320          max=numcols=conf->cols;          max=numcols=conf->cols;
321          csvrows=conf->rows;          csvrows=conf->rows;
# Line 317  void doTeXsub(config* conf, char newsep, Line 338  void doTeXsub(config* conf, char newsep,
338                                  putc(newsep,out);                                  putc(newsep,out);
339                                  numcols--;                                  numcols--;
340                          }                          }
341                          fprintf(out,"\\\\\n"); /* TeX new line */                          if (!(firstrow && (conf->longtable && conf->repeat))) {
342                          fprintf(out,"\\hline\n"); /* TeX draw hline */                                  fprintf(out,"\\\\\n"); /* TeX new line */
343                            } else { /* first row and repeat and longtable */
344                                    fprintf(out, "%s\\\\\n", headerrow);
345                            }
346                            if(conf->hlines) {
347                                    fprintf(out,"\\hline\n"); /* TeX draw hline */
348                            }
349                            if (firstrow && (conf->longtable && conf->repeat)) {
350                                    fprintf(out, "%s", "\\endhead\n");
351                            }
352                            if(firstrow && conf->repeat) {
353                                    char tmp[12];
354                                    sprintf(tmp,(conf->hlines?"\\\\\n\\hline":"\\\\\n"));
355                                    strcat(headerrow,tmp);
356                            }
357                            firstrow=0;
358                          numcols=max; /* reset numcols */                          numcols=max; /* reset numcols */
359                          lines--;                          lines--;
360                          csvrows--;                          csvrows--;
361                          /* put a colored row or not (alternate) */                          /* put a colored row or not (alternate) */
362                          if (conf->clrrow && (lines % 2)){                          if (conf->clrrow && (lines % 2)) {
363                                  fprintf(out,"\\colorrow ");                                  fprintf(out,"\\colorrow ");
364                          }                          }
365                          /* if the LaTeX tabular is full create a new one, except if no more row */                          /* if the LaTeX tabular is full create a new one, except if no more row or this is a long table */
366                          if (!lines && csvrows){                          if (!lines && csvrows && !conf->longtable) {
367                                  if (conf->longtable) {                                  fprintf(out,"\\end{tabular}\n");
368                                    fprintf(out,"\\end{longtable}\n");                                  fprintf(out, "\\newline\n");
369                                    fprintf(out, "\\newline\n");                                  fprintf(out,"\\begin{tabular}{");
370                                    fprintf(out,"\\begin{longtable}{|\n"); }                                  if(conf->vlines) {
371                                  else {                                          putc('|',out);
372                                    fprintf(out,"\\end{tabular}\n");                                  }
373                                    fprintf(out, "\\newline\n");                                  while(numcols--) {
374                                    fprintf(out,"\\begin{tabular}{|"); }                                          putc(conf->pos, out);
375                                  while(numcols--)                                          if(conf->vlines) {
376                                          fprintf(out, "%c|", conf->pos);                                                  putc('|',out);
377                                            }
378                                    }
379                                  fprintf(out, "}\n");                                  fprintf(out, "}\n");
380                                  fprintf(out, "\\hline\n");                                  if(conf->hlines) {
381                                            fprintf(out, "\\hline\n");
382                                    }
383                                    if(conf->repeat && !conf->longtable) {
384                                            fprintf(out,"%s",headerrow);
385                                            putc('\n',out);
386                                    }
387                                  numcols=max;                                  numcols=max;
388                                  lines=(conf->lines)?conf->lines:MAXUINT;                                  lines=(conf->lines)?conf->lines:MAXUINT;
389                          } /* else end of CSV data */                          }
390                                    /* else end of CSV data */
391                          continue;                          continue;
392                  }                  }
393    
394                  /* new column ? */                  /* new column ? */
395                  if (token == conf->sep && ((conf->block && !inblock) || !conf->block)) {                  if (token == conf->sep && ((conf->block && !inblock) || !conf->block)) {
396                          putc(newsep,out);                          if (!(firstrow && (conf->longtable && conf->repeat)))
397                                    putc(newsep,out);
398                          numcols--;                          numcols--;
399                            if(firstrow && conf->repeat)
400                            {
401                                    char tmp[2];
402                                    tmp[0]=newsep;
403                                    tmp[1]='\0';
404                                    strcat(headerrow,tmp);
405                            }
406                          continue;                          continue;
407                  }                  }
408    
# Line 370  void doTeXsub(config* conf, char newsep, Line 423  void doTeXsub(config* conf, char newsep,
423                                                  switch (token) {                                                  switch (token) {
424                                                          case '\\':                                                          case '\\':
425                                                                  fprintf(out, "\\textbackslash{}");                                                                  fprintf(out, "\\textbackslash{}");
426                                                                    if(firstrow && conf->repeat)
427                                                                    {
428                                                                            char tmp[17];
429                                                                            sprintf(tmp,"\\textbackslash{}");
430                                                                            strcat(headerrow,tmp);
431                                                                    }
432                                                                  break;                                                                  break;
433                                                          default:                                                          default:
434                                                                  fprintf(out, "\\%c", token);                                                                  fprintf(out, "\\%c", token);
435                                                                    if(firstrow && conf->repeat)
436                                                                    {
437                                                                            char tmp[3];
438                                                                            tmp[0]='\\';
439                                                                            tmp[1]=token;
440                                                                            tmp[2]='\0';
441                                                                            strcat(headerrow,tmp);
442                                                                    }
443                                                                  break;                                                                  break;
444                                                  }                                                  }
445                                                  break; /* there was some escaping */                                                  break; /* there was some escaping */
# Line 380  void doTeXsub(config* conf, char newsep, Line 447  void doTeXsub(config* conf, char newsep,
447                                  }                                  }
448                          /* or print raw char */                          /* or print raw char */
449                          if ( (i >= conf->tex->size) || (!conf->escape) ) {                          if ( (i >= conf->tex->size) || (!conf->escape) ) {
450                                  putc(token, out);                                  if (!(firstrow && (conf->longtable && conf->repeat)))
451                                            putc(token, out); /* do not print the header twice */
452                                    if(firstrow && conf->repeat)
453                                    {
454                                            char tmp[2];
455                                            tmp[0]=token;
456                                            tmp[1]='\0';
457                                            strcat(headerrow,tmp);
458                                    }
459                          }                          }
460                          continue;                          continue;
461                  }                  }
# Line 421  void doTeXdoc(config* conf, FILE* in, FI Line 496  void doTeXdoc(config* conf, FILE* in, FI
496                  fprintf(out,"\\addtolength\\tabcolsep{-%sem}\n", tabcolsep[conf->red]);                  fprintf(out,"\\addtolength\\tabcolsep{-%sem}\n", tabcolsep[conf->red]);
497          }          }
498          if (conf->longtable)          if (conf->longtable)
499            fprintf(out, "\\begin{longtable}{|");          {
500              fprintf(out, "\\begin{longtable}{");
501              if(conf->vlines)
502                    putc('|',out);
503            }
504          else          else
505            fprintf(out, "\\begin{tabular}{|");          {
506              fprintf(out, "\\begin{tabular}{");
507              if(conf->vlines)
508                    putc('|',out);
509            }
510          while(numcols--)          while(numcols--)
511                  fprintf(out, "%c|",conf->pos); /* position in cell */          {
512                    fprintf(out, "%c",conf->pos); /* position in cell */
513                    if(conf->vlines)
514                            putc('|',out);
515            }
516          fprintf(out, "}\n");          fprintf(out, "}\n");
517          fprintf(out, "\\hline\n");          if(conf->hlines)
518                    fprintf(out, "\\hline\n");
519          doTeXsub(conf, '&', in, out); /* & is LaTeX separator */          doTeXsub(conf, '&', in, out); /* & is LaTeX separator */
520          if (conf->longtable) {          if (conf->longtable) {
521            fprintf(out, "\\end{longtable}\n");            fprintf(out, "\\end{longtable}\n");
# Line 469  int main (int argc, char **argv) { Line 557  int main (int argc, char **argv) {
557          conf->clrrow=NULL;   /* default; LaTeX */          conf->clrrow=NULL;   /* default; LaTeX */
558          conf->red=0;         /* default; LaTeX */          conf->red=0;         /* default; LaTeX */
559          conf->longtable=0;   /* default; without package longtable */          conf->longtable=0;   /* default; without package longtable */
560            conf->repeat=0;         /* default; do not repeat the header row */
561            conf->vlines=1;         /* default; draw lines between columns */
562            conf->hlines=1;         /* default; draw lines between rows */
563                    
564          /* TeX charaters to escape */          /* TeX charaters to escape */
565          conf->tex=(texcape*)malloc(sizeof(texcape));          conf->tex=(texcape*)malloc(sizeof(texcape));

Legend:
Removed from v.5  
changed lines
  Added in v.6

  ViewVC Help
Powered by ViewVC 1.1.26