home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 213_01 / cbr.c < prev    next >
Text File  |  1979-12-31  |  9KB  |  553 lines

  1. /* CBR.C    VERS:- 01.00  DATE:- 09/26/86  TIME:- 09:36:10 PM */
  2. /*
  3. %CC1 $1.C -O -X -E5000
  4. %CLINK $1 DIO -S -E5000
  5. %DELETE $1.CRL 
  6. */
  7. /* 
  8. Description:
  9.  
  10. Filter to format C code, from CUG distribution disk.
  11. Indents according to control level.
  12.  
  13. Minor modifications:
  14.     adapted for BDS C v1.50a;
  15.     adapted for use as filter under DIO;
  16.     Corrected: 
  17.         exit test; 
  18.         read of strings of *'s.
  19.  
  20. Best to filter input file first through CBPREP, to produce 
  21. consistent spacing of text and one statment per line.
  22.     
  23. By J.A. Rupley, Tucson, Arizona
  24. Coded for BDS C compiler, version 1.50a
  25. */
  26. /* HEADER: CUG120.03;
  27.    TITLE: C beautifier;
  28.    DATE: 09/28/1981;
  29.    DESCRIPTION: "A pretty-printer for C source code.";
  30.    KEYWORDS: C programming,printing;
  31.    SYSTEM: CP/M;
  32.    FILENAME: CB.C;
  33.    CRC: 595B;
  34.    AUTHORS: William C. Colley, Rick Hollinbeck;
  35.    COMPILERS: BDS C v1.44;
  36. */
  37. /*
  38.     Pretty-printer for C Programs
  39.  
  40.     Swiped from the CIPG's UNIX system and modified to run
  41.         under BDS C by William C. Colley, III
  42.  
  43.     Mods made July 1980
  44.  
  45.     Updated to BDS C, v1.44 by Rick Hollinbeck, 9/28/81
  46.  
  47. To use the program, type the following command line:
  48.  
  49.     A>cb <input.fil [>output.fil or |DIO_pipe or default = crt]
  50.  
  51. where input.fil is the file to be pretty-printed and [output.fil] is an
  52. optional output file.  If no output file is specified, the output is sent
  53. to the console.
  54. */
  55.  
  56. #include "bdscio.h"
  57. #include "dio.h"
  58.  
  59. int slevel[10];
  60. int clevel;
  61. int spflg[20][10];
  62. int sind[20][10];
  63. int siflev[10];
  64. int sifflg[10];
  65. int iflev;
  66. int ifflg;
  67. int level;
  68. int ind[10];
  69. int eflg;
  70. int paren;
  71. int pflg[10];
  72. char lchar;
  73. char pchar;
  74. int aflg;
  75. int ct;
  76. int stabs[20][10];
  77. int qflg;
  78. char *wif[2];
  79. char *welse[2];
  80. char *wfor[2];
  81. char *wds[3];
  82. int j;
  83. char string[200];
  84. char cc;
  85. int sflg;
  86. int bflg;
  87. int peek;
  88. int tabs;
  89. char lastchar;
  90. char c;
  91.  
  92. main(argc, argv)
  93. int argc;
  94. char *argv[];
  95. {
  96.     int k;
  97.  
  98.     /*  Initialize everything here.  */
  99.  
  100.     dioinit(&argc, argv);
  101.  
  102.     if (!_dioinflg)
  103.     {
  104.         printf(
  105.         "\nUSAGE:\n");
  106.         printf(
  107.         "     cb  <input_fid  [>out_fid or |DIO_pipe or default = crt]\n\n");
  108.         printf(
  109.         "one of three formatting filters:\n\n");
  110.         printf(
  111.         "unvanuys - converts keywords of Van Nuys Toolkit to standard K & R 'c'\n");
  112.         printf(
  113.         "cbprep - produces consistent spacing of 'c' text and one statement per line\n");
  114.         printf(
  115.         "         output must be filtered by cb\n");
  116.         printf(
  117.         "cb - indents according to control level\n\n");
  118.         dioexit();
  119.     }
  120.  
  121.     clevel = iflev = level = eflg = paren = 0;
  122.     aflg = qflg = j = bflg = tabs = 0;
  123.     ifflg = peek = -1;
  124.     sflg = 1;
  125.     initw(ind, "0,0,0,0,0,0,0,0,0,0");
  126.     initw(pflg, "0,0,0,0,0,0,0,0,0,0");
  127.     wif[0] = "if";
  128.     welse[0] = "else";
  129.     wfor[0] = "for";
  130.     wds[0] = "case";
  131.     wds[1] = "default";
  132.     wif[1] = welse[1] = wfor[1] = wds[2] = 0;
  133.  
  134.     /*  End of initialization.  */
  135.  
  136.     while ((c = getchr()) != 0xff)
  137.     {
  138.         switch (c)
  139.         {
  140.         default :
  141.             string[j++] = c;
  142.             if (c != ',')
  143.                 lchar = c;
  144.             break;
  145.         case ' ' :
  146.         case '\t' :
  147.             if (lookup(welse) == 1)
  148.             {
  149.                 gotelse();
  150.                 if (sflg == 0 || j > 0)
  151.                     string[j++] = c;
  152.                 puts();
  153.                 sflg = 0;
  154.                 break;
  155.             }
  156.             if (sflg == 0 || j > 0)
  157.                 string[j++] = c;
  158.             break;
  159.         case '\n' :
  160.             if (eflg = lookup(welse) == 1)
  161.                 gotelse();
  162.             puts();
  163.             printf("\n");
  164.             sflg = 1;
  165.             if (eflg == 1)
  166.             {
  167.                 pflg[level]++;
  168.                 tabs++;
  169.             }
  170.             else
  171.                 if (pchar == lchar)
  172.                     aflg = 1;
  173.             break;
  174.         case '{' :
  175.             if (lookup(welse) == 1)
  176.                 gotelse();
  177.             siflev[clevel] = iflev;
  178.             sifflg[clevel] = ifflg;
  179.             iflev = ifflg = 0;
  180.             clevel++;
  181.             if (sflg == 1 && pflg[level] != 0)
  182.             {
  183.                 pflg[level]--;
  184.                 tabs--;
  185.             }
  186.             string[j++] = c;
  187.             puts();
  188.             getnl();
  189.             puts();
  190.             printf("\n");
  191.             tabs++;
  192.             sflg = 1;
  193.             if (pflg[level] > 0)
  194.             {
  195.                 ind[level] = 1;
  196.                 level++;
  197.                 slevel[level] = clevel;
  198.             }
  199.             break;
  200.         case '}' :
  201.             clevel--;
  202.             if ((iflev = siflev[clevel] - 1) < 0)
  203.                 iflev = 0;
  204.             ifflg = sifflg[clevel];
  205.             puts();
  206.             tabs--;
  207.             ptabs();
  208.             if ((peek = getchr()) == ';')
  209.             {
  210.                 printf("%c;", c);
  211.                 peek = -1;
  212.             }
  213.             else
  214.                 printf("%c", c);
  215.             getnl();
  216.             puts();
  217.             printf("\n");
  218.             sflg = 1;
  219.             if (clevel < slevel[level])
  220.                 if (level > 0)
  221.                     level--;
  222.             if (ind[level] != 0)
  223.             {
  224.                 tabs -= pflg[level];
  225.                 pflg[level] = 0;
  226.                 ind[level] = 0;
  227.             }
  228.             break;
  229.         case '"' :
  230.         case '\'' :
  231.             string[j++] = c;
  232.             while ((cc = getchr()) != c)
  233.             {
  234.                 string[j++] = cc;
  235.                 if (cc == '\\')
  236.                 {
  237.                     string[j++] = getchr();
  238.                 }
  239.                 if (cc == '\n')
  240.                 {
  241.                     puts();
  242.                     sflg = 1;
  243.                 }
  244.             }
  245.             string[j++] = cc;
  246.             if (getnl() == 1)
  247.             {
  248.                 lchar = cc;
  249.                 peek = '\n';
  250.             }
  251.             break;
  252.         case ';' :
  253.             string[j++] = c;
  254.             puts();
  255.             if (pflg[level] > 0 && ind[level] == 0)
  256.             {
  257.                 tabs -= pflg[level];
  258.                 pflg[level] = 0;
  259.             }
  260.             getnl();
  261.             puts();
  262.             printf("\n");
  263.             sflg = 1;
  264.             if (iflev > 0)
  265.                 if (ifflg == 1)
  266.                 {
  267.                     iflev--;
  268.                     ifflg = 0;
  269.                 }
  270.             else
  271.                 iflev = 0;
  272.             break;
  273.         case '\\' :
  274.             string[j++] = c;
  275.             string[j++] = getchr();
  276.             break;
  277.         case '?' :
  278.             qflg = 1;
  279.             string[j++] = c;
  280.             break;
  281.         case ':' :
  282.             string[j++] = c;
  283.             if (qflg == 1)
  284.             {
  285.                 qflg = 0;
  286.                 break;
  287.             }
  288.             if (lookup(wds) == 0)
  289.             {
  290.                 sflg = 0;
  291.                 puts();
  292.             }
  293.             else
  294.             {
  295.                 tabs--;
  296.                 puts();
  297.                 tabs++;
  298.             }
  299.             if ((peek = getchr()) == ';')
  300.             {
  301.                 printf(";");
  302.                 peek = -1;
  303.             }
  304.             getnl();
  305.             puts();
  306.             printf("\n");
  307.             sflg = 1;
  308.             break;
  309.         case '/' :
  310.             string[j++] = c;
  311.             if ((peek = getchr()) != '*')
  312.                 break;
  313.             string[j++] = peek;
  314.             peek = -1;
  315.             comment();
  316.             break;
  317.         case ')' :
  318.             paren--;
  319.             string[j++] = c;
  320.             puts();
  321.             if (getnl() == 1)
  322.             {
  323.                 peek = '\n';
  324.                 if (paren != 0)
  325.                     aflg = 1;
  326.                 else
  327.                     if (tabs > 0)
  328.                     {
  329.                         pflg[level]++;
  330.                         tabs++;
  331.                         ind[level] = 0;
  332.                     }
  333.             }
  334.             break;
  335.         case '#' :
  336.             string[j++] = c;
  337.             while ((cc = getchr()) != '\n')
  338.                 string[j++] = cc;
  339.             string[j++] = cc;
  340.             sflg = 0;
  341.             puts();
  342.             sflg = 1;
  343.             break;
  344.         case '(' :
  345.             string[j++] = c;
  346.             paren++;
  347.             if (lookup(wfor) == 1)
  348.             {
  349.                 while ((c = gets()) != ';')
  350.                     ;
  351.                 ct = 0;
  352. cont :
  353.                 while ((c = gets()) != ')')
  354.                 {
  355.                     if (c == '(')
  356.                         ct++;
  357.                 }
  358.                 if (ct != 0)
  359.                 {
  360.                     ct--;
  361.                     goto cont;
  362.                 }
  363.                 paren--;
  364.                 puts();
  365.                 if (getnl() == 1)
  366.                 {
  367.                     peek = '\n';
  368.                     pflg[level]++;
  369.                     tabs++;
  370.                     ind[level] = 0;
  371.                 }
  372.                 break;
  373.             }
  374.             if (lookup(wif) == 1)
  375.             {
  376.                 puts();
  377.                 stabs[clevel][iflev] = tabs;
  378.                 spflg[clevel][iflev] = pflg[level];
  379.                 sind[clevel][iflev] = ind[level];
  380.                 iflev++;
  381.                 ifflg = 1;
  382.             }
  383.         }
  384.     }
  385.     dioflush();
  386.     exit();
  387. }
  388. ptabs()
  389. {
  390.     int i;
  391.     for (i = 0; i < tabs; i++)
  392.         printf("\t");
  393. }
  394. getchr()
  395. {
  396.     int temp, tempchar;
  397.     if (peek < 0 && lastchar != ' ' && lastchar != '\t')
  398.         pchar = lastchar;
  399.     lastchar = (peek < 0) ? getchar() : peek;
  400.     if (lastchar == 0xff)
  401.     {
  402.         if (pchar != '\n')
  403.         {
  404.             puts();
  405.             printf("\n");
  406.         }
  407.         dioflush();
  408.         exit();
  409.     }
  410.     else
  411.         lastchar = (lastchar & 0x7f);
  412.     peek = -1;
  413.     return (lastchar == '\r' ? getchr() : lastchar);
  414. }
  415. puts()
  416. {
  417.     if (j > 0)
  418.     {
  419.         if (sflg != 0)
  420.         {
  421.             ptabs();
  422.             sflg = 0;
  423.             if (aflg == 1)
  424.             {
  425.                 aflg = 0;
  426.                 if (tabs > 0)
  427.                     printf("    ");
  428.             }
  429.         }
  430.         string[j] = '\0';
  431.         printf("%s", string);
  432.         j = 0;
  433.     }
  434.     else
  435.     {
  436.         if (sflg != 0)
  437.         {
  438.             sflg = 0;
  439.             aflg = 0;
  440.         }
  441.     }
  442. }
  443. lookup(tab)
  444. char *tab[];
  445. {
  446.     char r;
  447.     int l, kk, k, i;
  448.     if (j < 1)
  449.         return (0);
  450.     kk = 0;
  451.     while (string[kk] == ' ')
  452.         kk++;
  453.     for (i = 0; tab[i] != 0; i++)
  454.     {
  455.         l = 0;
  456.         for (k = kk; (r = tab[i][l++]) == string[k] && r != '\0'; k++)
  457.             ;
  458.         if (r == '\0' && (string[k] < 'a' || string[k] > 'z'))
  459.             return (1);
  460.     }
  461.     return (0);
  462. }
  463. gets()
  464. {
  465.     char ch;
  466. beg :
  467.     if ((ch = string[j++] = getchr()) == '\\')
  468.     {
  469.         string[j++] = getchr();
  470.         goto beg;
  471.     }
  472.     if (ch == '\'' || ch == '"')
  473.     {
  474.         while ((cc = string[j++] = getchr()) != ch)
  475.             if (cc == '\\')
  476.                 string[j++] = getchr();
  477.         goto beg;
  478.     }
  479.     if (ch == '\n')
  480.     {
  481.         puts();
  482.         aflg = 1;
  483.         goto beg;
  484.     }
  485.     else
  486.         return (ch);
  487. }
  488. gotelse()
  489. {
  490.     tabs = stabs[clevel][iflev];
  491.     pflg[level] = spflg[clevel][iflev];
  492.     ind[level] = sind[clevel][iflev];
  493.     ifflg = 1;
  494. }
  495. getnl()
  496. {
  497.     while ((peek = getchr()) == '\t' || peek == ' ')
  498.     {
  499.         string[j++] = peek;
  500.         peek = -1;
  501.     }
  502.     if ((peek = getchr()) == '/')
  503.     {
  504.         peek = -1;
  505.         if ((peek = getchr()) == '*')
  506.         {
  507.             string[j++] = '/';
  508.             string[j++] = '*';
  509.             peek = -1;
  510.             comment();
  511.         }
  512.         else
  513.             string[j++] = '/';
  514.     }
  515.     if ((peek = getchr()) == '\n')
  516.     {
  517.         peek = -1;
  518.         return (1);
  519.     }
  520.     return (0);
  521. }
  522. comment()
  523. {
  524.     int cflg;
  525.  
  526.     cflg = 1;
  527. rep :
  528.     while ((c = string[j++] = getchr()) != '*')
  529.         if (c == '\n')
  530.         {
  531.             puts();
  532.             sflg = 1;
  533.         }
  534.     if ((j > 1) && (string[j - 2] == '/'))
  535.     {
  536.         cflg++;
  537.         goto rep;
  538.     }
  539.     while ((c = string[j++] = getchr()) == '*')
  540.         ;
  541.     if ((c == '/') && !(--cflg))
  542.         return;
  543.     else
  544.         {
  545.         if (c == '\n')
  546.         {
  547.             puts();
  548.             sflg = 1;
  549.         }
  550.         goto rep;
  551.     }
  552. }
  553.