/[csv2latex]/csv2latex.c
ViewVC logotype

Diff of /csv2latex.c

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

revision 38, Wed Oct 19 22:38:26 2016 UTC revision 39, Wed Oct 19 22:41:39 2016 UTC
# Line 129  config* parseOptions (config* conf, int Line 129  config* parseOptions (config* conf, int
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')
133                                                  conf->block = '\'';                                                  conf->block = '\'';
134                                          else if(optarg[0] == 'd')                                          else if (optarg[0] == 'd')
135                                                  conf->block = '"';                                                  conf->block = '"';
136                                          else if(optarg[0] == 'n')                                          else if (optarg[0] == 'n')
137                                                  conf->block = 0; /* no block delimiter */                                                  conf->block = 0; /* no block delimiter */
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,
# Line 160  config* parseOptions (config* conf, int Line 160  config* parseOptions (config* conf, int
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')
164                                                  conf->sep = ',';                                                  conf->sep = ',';
165                                          else if(optarg[0] == 's')                                          else if (optarg[0] == 's')
166                                                  conf->sep = ';';                                                  conf->sep = ';';
167                                          else if(optarg[0] == 't')                                          else if (optarg[0] == 't')
168                                                  conf->sep = '\t';                                                  conf->sep = '\t';
169                                          else if(optarg[0] == 'p')                                          else if (optarg[0] == 'p')
170                                                  conf->sep = ' ';                                                  conf->sep = ' ';
171                                          else if(optarg[0] == 'l')                                          else if (optarg[0] == 'l')
172                                                  conf->sep = ':';                                                  conf->sep = ':';
173                                          break;                                          break;
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 {
# Line 183  config* parseOptions (config* conf, int Line 183  config* parseOptions (config* conf, int
183                                          break;                                          break;
184                          case 'r': /* reduce table size (original idea thx to <boaz.gezer@gmail.com>) */                          case 'r': /* reduce table size (original idea thx to <boaz.gezer@gmail.com>) */
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 {
# Line 210  int guessCSV(config* conf, FILE* in) { Line 210  int guessCSV(config* conf, FILE* in) {
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 == ' ') {
# Line 219  int guessCSV(config* conf, FILE* in) { Line 219  int guessCSV(config* conf, FILE* in) {
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",
# Line 236  int guessCSV(config* conf, FILE* in) { Line 236  int guessCSV(config* conf, FILE* in) {
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);
# Line 348  void doTeXsub(config* conf, char newsep, Line 348  void doTeXsub(config* conf, char newsep,
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);
# Line 372  void doTeXsub(config* conf, char newsep, Line 372  void doTeXsub(config* conf, char newsep,
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");
385                                  if(conf->hlines) {                                  if (conf->hlines) {
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                                  }                                  }
# Line 410  void doTeXsub(config* conf, char newsep, Line 410  void doTeXsub(config* conf, char newsep,
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;
# Line 438  void doTeXsub(config* conf, char newsep, Line 438  void doTeXsub(config* conf, char newsep,
438                                                  switch (token) {                                                  switch (token) {
439                                                          case '\\':                                                          case '\\':
440                                                                  fprintf(out, "\\textbackslash{}");                                                                  fprintf(out, "\\textbackslash{}");
441                                                                  if(firstrow && conf->repeat)                                                                  if (firstrow && conf->repeat)
442                                                                  {                                                                  {
443                                                                          char tmp[17];                                                                          char tmp[17];
444                                                                          sprintf(tmp, "\\textbackslash{}");                                                                          sprintf(tmp, "\\textbackslash{}");
# Line 447  void doTeXsub(config* conf, char newsep, Line 447  void doTeXsub(config* conf, char newsep,
447                                                                  break;                                                                  break;
448                                                          default:                                                          default:
449                                                                  fprintf(out, "\\%c", token);                                                                  fprintf(out, "\\%c", token);
450                                                                  if(firstrow && conf->repeat)                                                                  if (firstrow && conf->repeat)
451                                                                  {                                                                  {
452                                                                          char tmp[3];                                                                          char tmp[3];
453                                                                          tmp[0] = '\\';                                                                          tmp[0] = '\\';
# Line 464  void doTeXsub(config* conf, char newsep, Line 464  void doTeXsub(config* conf, char newsep,
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;
# Line 487  void doTeXdoc(config* conf, FILE* in, FI Line 487  void doTeXdoc(config* conf, FILE* in, FI
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");
# Line 513  void doTeXdoc(config* conf, FILE* in, FI Line 513  void doTeXdoc(config* conf, FILE* in, FI
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)
533                  fprintf(out, "\\hline\n");                  fprintf(out, "\\hline\n");
534          doTeXsub(conf, '&', in, out); /* & is LaTeX separator */          doTeXsub(conf, '&', in, out); /* & is LaTeX separator */
535          if (conf->longtable) {          if (conf->longtable) {
# Line 541  void doTeXdoc(config* conf, FILE* in, FI Line 541  void doTeXdoc(config* conf, FILE* in, FI
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;
# Line 597  int main (int argc, char **argv) { Line 597  int main (int argc, char **argv) {
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                          fclose(fp);                          fclose(fp);
604                          exit(EXIT_FAILURE);                          exit(EXIT_FAILURE);

Legend:
Removed from v.38  
changed lines
  Added in v.39

  ViewVC Help
Powered by ViewVC 1.1.26