home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / pd7.lzh / SRC / psc.c < prev    next >
C/C++ Source or Header  |  1990-04-19  |  8KB  |  321 lines

  1. /* Sc parse routine
  2.  *
  3.  * usage psc options
  4.  * options:
  5.  *   -L         Left justify strings.  Default is right justify.
  6.  *   -r         Assemble data into rows first, not columns.
  7.  *   -R n       Increment by n between rows
  8.  *   -C n       Increment by n between columns
  9.  *   -n n       Length of the row (column) should be n.
  10.  *   -s v       Top left location in the spreadsheet should be v; eg, k5
  11.  *   -d c       Use c as the delimiter between the fields.
  12.  *   -k         Keep all delimiters - Default is strip multiple delimiters to 1.
  13.  *
  14.  *  Author: Robert Bond
  15.  *              $Revision: 6.1 $
  16.  */
  17.  
  18. #include <ctype.h>
  19. #include <stdio.h>
  20. #include "sc.h"
  21.  
  22. #define END 0
  23. #define NUM 1
  24. #define ALPHA 2
  25. #define SPACE 3
  26. #define EOL 4
  27.  
  28. extern char *optarg;
  29. extern int   optind;
  30. char *coltoa();
  31. char *progname;
  32.  
  33. #ifdef SYSV3
  34. extern void exit();
  35. #else
  36. extern int exit();
  37. #endif
  38.  
  39. int colfirst = 0;
  40. int r0 = 0;
  41. int c0 = 0;
  42. int rinc = 1;
  43. int cinc = 1;
  44. int leftadj = 0;
  45. int len = 20000;
  46. char delim1 = ' ';
  47. char delim2 = '\t';
  48. int strip_delim = 1;
  49. int fwidth[MAXCOLS];
  50. int precision[MAXCOLS];
  51.  
  52. char token[1000];
  53.  
  54. main(argc, argv)
  55. int argc;
  56. char **argv;
  57. {
  58.     int curlen;
  59.     int curcol, coff;
  60.     int currow, roff;
  61.     int first;
  62.     int c;
  63.     register effr, effc;
  64.     int i,j;
  65.     register char *p;
  66.  
  67.     progname = argv[0];
  68.     while ((c = getopt(argc, argv, "rLks:R:C:n:d:")) != EOF) {
  69.         switch(c) {
  70.         case 'r':
  71.             colfirst = 1;
  72.             break;
  73.         case 'L':
  74.             leftadj = 1;
  75.             break;
  76.         case 's':
  77.             c0 = getcol(optarg);
  78.             r0 = getrow(optarg);
  79.             break;
  80.         case 'R':
  81.             rinc = atoi(optarg);
  82.             break;
  83.         case 'C':
  84.             cinc = atoi(optarg);
  85.             break;
  86.         case 'n':
  87.             len = atoi(optarg);
  88.             break;
  89.         case 'd':
  90.             delim1 = optarg[0];
  91.             delim2 = 0;
  92.             break;
  93.         case 'k':
  94.             strip_delim = 0;
  95.             break;
  96. #ifdef OSK
  97.         case '?':
  98.             fprintf(stderr,"Syntax : psc [-rkL] [-s v] [-R i] [-C i] [-n i] [-d c]\n");
  99.             fprintf(stderr,"Function : prepare sc files\n");
  100.             fprintf(stderr,"Options :\n");
  101.             fprintf(stderr,"   -L         Left justify strings.  Default is right justify\n");
  102.             fprintf(stderr,"   -r         Assemble data into rows first, not columns\n");
  103.             fprintf(stderr,"   -R n       Increment by n between rows\n");
  104.             fprintf(stderr,"   -C n       Increment by n between columns\n");
  105.             fprintf(stderr,"   -n n       Length of the row (column) should be n\n");
  106.             fprintf(stderr,"   -s v       Top left location in the spreadsheet should be v; eg, k5\n");
  107.             fprintf(stderr,"   -d c       Use c as the delimiter between the fields\n");
  108.             fprintf(stderr,"   -k         Keep all delimiters - Default is strip multiple delimiters to 1\n");
  109.             fprintf(stderr,"\n Adaption to OS-9/68k by Stephan Paschedag\n");
  110.             exit(0);
  111. #endif
  112.         default:
  113.             (void) fprintf(stderr,"Usage: %s [-rkL] [-s v] [-R i] [-C i] [-n i] [-d c]\n", progname);
  114.             exit(1);
  115.         }
  116.     }
  117.  
  118.     if (optind < argc) {
  119.             (void) fprintf(stderr,"Usage: %s [-rL] [-s v] [-R i] [-C i] [-n i] [-d c]\n", progname);
  120.             exit(1);
  121.     }
  122.  
  123.     curlen = 0;
  124.     curcol = c0; coff = 0;
  125.     currow = r0; roff = 0;
  126.     first = 1;
  127.  
  128.     while(1) {
  129.  
  130.         effr = currow+roff;
  131.         effc = curcol+coff;
  132.  
  133.         switch(scan()) {
  134.         case END:
  135.             for (i = 0; i<MAXCOLS; i++) {
  136.                 if (precision[i])
  137.                     (void) printf("format %s %d %d\n", coltoa(i), precision[i]+1,
  138.                         fwidth[i]);
  139.             }
  140.             exit(0);
  141.         case NUM:
  142.             first = 0;
  143.             (void) printf("let %s%d = %s\n", coltoa(effc), effr, token);
  144.             if (effc > MAXCOLS-1)
  145.                 (void) fprintf(stderr, "Invalid column used: %s\n", coltoa(effc));
  146.             else {
  147.                 i = 0;
  148.                 j = 0;
  149.                 p = token;
  150.                 while (*p && *p != '.') {
  151.                     p++; i++;
  152.                 }
  153.                 if (*p) {
  154.                     p++; i++;
  155.                 }
  156.                 while (*p) {
  157.                     p++; i++; j++;
  158.                 }
  159.                 if (precision[effc] < i)
  160.                     precision[effc] = i;
  161.                 if (fwidth[effc] < j)
  162.                     fwidth[effc] = j;
  163.             }
  164.             break;
  165.         case ALPHA:
  166.             first = 0;
  167.             if (leftadj)
  168.                 (void) printf("leftstring %s%d = \"%s\"\n", coltoa(effc),effr,token);
  169.             else
  170.                 (void) printf("rightstring %s%d = \"%s\"\n",coltoa(effc),effr,token);
  171.             if (effc > MAXCOLS-1)
  172.                 (void) fprintf(stderr, "Invalid column used: %s\n", coltoa(effc));
  173.             else {
  174.                 i = strlen(token);
  175.                 if (i > precision[effc])
  176.                     precision[effc] = i;
  177.             }
  178.             break;
  179.         case SPACE:
  180.             if (first && strip_delim)
  181.                 break;
  182.             if (colfirst)
  183.                 roff++;
  184.             else
  185.                 coff++;
  186.             break;
  187.         case EOL:
  188.             curlen++;
  189.             roff = 0;
  190.             coff = 0;
  191.             first = 1;
  192.             if (colfirst) {
  193.                 if (curlen >= len) {
  194.                     curcol = c0;
  195.                     currow += rinc;
  196.                     curlen = 0;
  197.                 } else {
  198.                     curcol += cinc;
  199.                 }
  200.             } else {
  201.                 if (curlen >= len) {
  202.                     currow = r0;
  203.                     curcol += cinc;
  204.                     curlen = 0;
  205.                 } else {
  206.                     currow += rinc;
  207.                 }
  208.             }
  209.             break;
  210.         }
  211.     }
  212. }
  213.  
  214. scan()
  215. {
  216.     register int c;
  217.     register char *p;
  218.  
  219.     p = token;
  220.     c = getchar();
  221.  
  222.     if (c == EOF)
  223.         return(END);
  224.  
  225.     if (c == '\n')
  226.         return(EOL);
  227.  
  228.     if (c == delim1 || c == delim2) {
  229.         if (strip_delim) {
  230.             while ((c = getchar()) && (c == delim1 || c == delim2))
  231.                 ;
  232.             (void)ungetc(c, stdin);
  233.         }
  234.         return(SPACE);
  235.     }
  236.  
  237.     if (c == '\"') {
  238.         while ((c = getchar()) && c != '\"' && c != '\n' && c != EOF)
  239.             *p++ = c;
  240.         if (c != '\"')
  241.             (void)ungetc(c, stdin);
  242.         *p = 0;
  243.         return(ALPHA);
  244.     }
  245.  
  246.     while (c != delim1 && c != delim2 && c!= '\n' && c != EOF) {
  247.         *p++ = c;
  248.         c = getchar();
  249.     }
  250.     *p = 0;
  251.     (void)ungetc(c, stdin);
  252.  
  253.     p = token;
  254.     c = *p;
  255.     if (isdigit(c) || c == '.' || c == '-' || c == '+') {
  256.         while(isdigit(c) || c == '.' || c == '-' || c == '+' || c == 'e'
  257.             || c == 'E') {
  258.                 c = *p++;
  259.         }
  260.         if (c == 0)
  261.             return(NUM);
  262.         else
  263.             return(ALPHA);
  264.     }
  265.  
  266.     return(ALPHA);
  267. }
  268.  
  269. getcol(p)
  270. char *p;
  271. {
  272.     register  col;
  273.  
  274.     if (!p)
  275.         return(0);
  276.     while(*p && !isalpha(*p))
  277.         p++;
  278.     if (!*p)
  279.         return(0);
  280.     col = ((*p & 0137) - 'A');
  281.     if (isalpha(*++p))
  282.         col = (col + 1)*26 + ((*p & 0137) - 'A');
  283.     return(col);
  284. }
  285.  
  286. getrow(p)
  287. char *p;
  288. {
  289.     int row;
  290.  
  291.     if (!p)
  292.         return(0);
  293.     while(*p && !isdigit(*p))
  294.         p++;
  295.     if (!*p)
  296.         return(0);
  297.     if (sscanf(p, "%d", &row) != 1)
  298.         return(0);
  299.     return(row);
  300. }
  301.  
  302. char *
  303. coltoa(col)
  304. int col;
  305. {
  306.     static char rname[3];
  307.     register char *p = rname;
  308.  
  309.     if (col < 0 || col > 25*26)
  310.         (void) fprintf(stderr,"coltoa: invalid col: %d", col);
  311.  
  312.     if (col > 25) {
  313.         *p++ = col/26 + 'A' - 1;
  314.         col %= 26;
  315.     }
  316.     *p++ = col+'A';
  317.     *p = 0;
  318.     return(rname);
  319. }
  320.  
  321.