home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / CPROG / CB1.ZIP / CB.C
Text File  |  1989-03-19  |  8KB  |  423 lines

  1. /*
  2.         Modified for Lattice C Ver 1.01
  3.         by: John W. Kindschi Jr. (10-30-83)
  4.  
  5.         Swiped from CPIG'S UNIX system and modified to
  6.         run under BDS C by William C. Colley, III
  7.  
  8.  
  9. To use the program type the following command line:
  10.  
  11.         A>cb input.fil [output.fil]
  12.  
  13.         Where input.fil is the file to be pretty printed and [output.fil]
  14.         is the destination file. If no output file is specified, then
  15.         the output goes to the console:
  16. */
  17. #include <stdio.h>
  18. int slevel[10];
  19. int clevel;
  20. int spflg[20][10];
  21. int sind[20][10];
  22. int siflev[10];
  23. int sifflg[10];
  24. int iflev;
  25. int ifflg;
  26. int level;
  27. int eflg;
  28. int paren;
  29. int aflg;
  30. int ct;
  31. int stabs[20][10];
  32. int qflg;
  33. int j;
  34. int sflg;
  35. int bflg;
  36. int peek;
  37. int tabs;
  38. FILE *f1, *f2;
  39.  
  40. static int ind[10] = { 
  41.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  42. static int pflg[10] = { 
  43.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  44.  
  45. char lchar;
  46. char pchar;
  47. char *wif[2];
  48. char *welse[2];
  49. char *wfor[2];
  50. char *wds[3];
  51. char cc;
  52. char string[200];
  53. int lastchar;
  54. int c;
  55. char *outvect;
  56.  
  57.  
  58. main(argc,argv)
  59. int argc;
  60. char *argv[];
  61. {        
  62.     int k;        /* Initialize everything here */
  63.     outvect = 1;
  64.     if (argc < 2 || argc > 3){
  65.         print("Usage: A>Cpretty input.fil [output.fil]\n");
  66.         exit();
  67.     }
  68.     if ((f1 = fopen(*++argv,"r")) == NULL){
  69.         print("File not found\n\n");
  70.         exit();
  71.     }
  72.     if (argc == 3){
  73.         if ((f2 = fopen(*++argv,"w")) == NULL){
  74.             print("Couldn't create output file\n");
  75.             exit();
  76.         }
  77.         outvect = 0;
  78.     }
  79.     clevel = iflev = level = eflg = paren = 0;
  80.     aflg = qflg = j = bflg = tabs = 0;
  81.     ifflg = peek = -1;
  82.     sflg = 1;
  83.     wif[0] = "if";
  84.     welse[0] = "else";
  85.     wfor[0] = "for";
  86.     wds[0] = "case";
  87.     wds[1] = "default";
  88.     wif[1] = welse[1] = wfor[1] = wds[2] = 0;
  89.  
  90.     /* End of Initialization */
  91.  
  92.     while ((c = getchr()) != EOF){
  93.         switch(c){
  94.         default:
  95.             string[j++] = c;
  96.             if (c != ',') lchar = c;
  97.             break;
  98.         case ' ':
  99.         case '\t':
  100.             if (lookup (welse) == 1){
  101.                 gotelse();
  102.                 if(sflg == 0 || j > 0)string[j++] = c;
  103.                 puts();
  104.                 sflg = 0;
  105.                 break;
  106.             }
  107.             if(sflg == 0 || j > 0) string[j++] = c;
  108.             break;
  109.         case '\n':
  110.             if (eflg = lookup(welse) == 1) gotelse();
  111.             puts();
  112.             print ("\n");
  113.             sflg = 1;
  114.             if (eflg == 1){
  115.                 pflg[level]++;
  116.                 tabs++;
  117.             }
  118.             else
  119.                 if(pchar == lchar)
  120.                     aflg = 1;
  121.             break;
  122.         case '{':
  123.             if (lookup(welse) == 1) gotelse();
  124.             siflev[clevel] = iflev;
  125.             sifflg[clevel] = ifflg;
  126.             iflev = ifflg = 0;
  127.             clevel++;
  128.             if (sflg == 1 && pflg[level] != 0){
  129.                 pflg[level]--;
  130.                 tabs--;
  131.             }
  132.             string[j++] = c;
  133.             puts();
  134.             getnl();
  135.             puts();
  136.             print("\n");
  137.             tabs++;
  138.             sflg = 1;
  139.             if (pflg[level] > 0){
  140.                 ind[level] = 1;
  141.                 level++;
  142.                 slevel[level] = clevel;
  143.             }
  144.             break;
  145.         case '}':
  146.             clevel--;
  147.             if ((iflev = siflev[clevel]-1) < 0) iflev = 0;
  148.             ifflg = sifflg[clevel];
  149.             puts();
  150.             tabs--;
  151.             ptabs();
  152.             if ((peek = getchr()) == ';'){
  153.                 print("%c;",c);
  154.                 peek = -1;
  155.             }
  156.             else print("%c",c);
  157.             getnl();
  158.             puts();
  159.             print("\n");
  160.             sflg = 1;
  161.             if (clevel < slevel[level]) if (level > 0) level--;
  162.             if (ind[level] != 0){
  163.                 tabs -= pflg[level];
  164.                 pflg[level] = 0;
  165.                 ind[level] = 0;
  166.             }
  167.             break;
  168.         case '"':
  169.         case '\'':
  170.             string[j++] = c;
  171.             while((cc = getchr()) != c){
  172.                 string[j++] = cc;
  173.                 if(cc == '\\'){
  174.                     string[j++] = getchr();
  175.                 }
  176.                 if(cc == '\n'){
  177.                     puts();
  178.                     sflg = 1;
  179.                 }
  180.             }
  181.             string[j++] = cc;
  182.             if(getnl() == 1){
  183.                 lchar = cc;
  184.                 peek = '\n';
  185.             }
  186.             break;
  187.         case ';':
  188.             string[j++] = c;
  189.             puts();
  190.             if(pflg[level] > 0 && ind[level] == 0){
  191.                 tabs -= pflg[level];
  192.                 pflg[level] = 0;
  193.             }
  194.             getnl();
  195.             puts();
  196.             print("\n");
  197.             sflg = 1;
  198.             if(iflev > 0)
  199.                 if(ifflg == 1){
  200.                     iflev--;
  201.                     ifflg = 0;
  202.                 }
  203.                 else iflev = 0;
  204.             break;
  205.         case '\\':
  206.             string[j++] = c;
  207.             string[j++] = getchr();
  208.             break;
  209.         case '?':
  210.             qflg = 1;
  211.             string[j++] = c;
  212.             break;
  213.         case ':':
  214.             string[j++] = c;
  215.             if(qflg == 1){
  216.                 qflg = 0;
  217.                 break;
  218.             }
  219.             if(lookup(wds) == 0){
  220.                 sflg = 0;
  221.                 puts();
  222.             }
  223.             else{
  224.                 tabs--;
  225.                 puts();
  226.                 tabs++;
  227.             }
  228.             if((peek = getchr()) == ';'){
  229.                 print(";");
  230.                 peek = -1;
  231.             }
  232.             getnl();
  233.             puts();
  234.             print("\n");
  235.             sflg = 1;
  236.             break;
  237.         case '/':
  238.             string[j++] = c;
  239.             if((peek = getchr()) != '*') break;
  240.             string[j++] = peek;
  241.             peek = -1;
  242.             comment();
  243.             break;
  244.         case ')':
  245.             paren--;
  246.             string[j++] = c;
  247.             puts();
  248.             if(getnl() == 1){
  249.                 peek = '\n';
  250.                 if(paren != 0) aflg = 1;
  251.                 else if(tabs > 0){
  252.                     pflg[level]++;
  253.                     tabs++;
  254.                     ind[level] = 0;
  255.                 }
  256.             }
  257.             break;
  258.         case '#':
  259.             string[j++] = c;
  260.             while((cc = getchr()) != '\n') string[j++] = cc;
  261.             string[j++] = cc;
  262.             sflg = 0;
  263.             puts();
  264.             sflg = 1;
  265.             break;
  266.         case '(':
  267.             string[j++] = c;
  268.             paren++;
  269.             if(lookup(wfor) == 1){
  270.                 while((c = gets()) != ';');
  271.                 ct = 0;
  272. cont:
  273.                 while((c = gets()) != ')'){
  274.                     if(c == '(') ct++;
  275.                 }
  276.                 if(ct != 0){
  277.                     ct--;
  278.                     goto cont;
  279.                 }
  280.                 paren--;
  281.                 puts();
  282.                 if(getnl() == 1){
  283.                     peek = '\n';
  284.                     pflg[level]++;
  285.                     tabs++;
  286.                     ind[level] = 0;
  287.                 }
  288.                 break;
  289.             }
  290.             if(lookup(wif) == 1){
  291.                 puts();
  292.                 stabs[clevel][iflev] = tabs;
  293.                 spflg[clevel][iflev] = pflg[level];
  294.                 sind[clevel][iflev] = ind[level];
  295.                 iflev++;
  296.                 ifflg = 1;
  297.             }
  298.         }
  299.     }
  300. }
  301.  
  302.  
  303. ptabs(){
  304.     int i;
  305.     for (i=0; i < tabs; i++) print("\t");
  306. }
  307. getchr(){
  308.     if(peek<0 && lastchar != ' ' && lastchar != '\t')pchar = lastchar;
  309.     lastchar = (peek < 0) ? getc(f1) : peek;
  310.     peek = -1;
  311.     return(lastchar == '\r' ? getchr() : lastchar);
  312. }
  313. puts(){
  314.     if (j > 0)
  315.     {
  316.         if (sflg != 0)
  317.         {
  318.             ptabs();
  319.             sflg = 0;
  320.             if (aflg == 1)
  321.             {
  322.                 aflg = 0;
  323.                 if (tabs > 0) print ("    ");
  324.             }
  325.         }
  326.         string[j] = '\0';
  327.         print("%s",string);
  328.         j = 0;
  329.     }
  330.     else
  331.     {
  332.         if (sflg != 0)
  333.         {
  334.             sflg = 0;
  335.             aflg = 0;
  336.         }
  337.     }
  338. }
  339. lookup(tab)
  340. char *tab[];
  341. {
  342.     char r;
  343.     int i,kk,k,l;
  344.     if(j < 1) return(0);
  345.     kk = 0;
  346.     while (string[kk] == ' ') kk++;
  347.     for (i = 0; tab[i] != 0; i++)
  348.     {
  349.         l = 0;
  350.         for(k=kk;(r = tab[i][l++]) == string[k] && r != '\0';k++);
  351.         if(r == '\0' && (string[k] < 'a' || string[k] > 'z'))return(1);
  352.     }
  353.     return(0);
  354. }
  355. gets(){
  356.     char ch;
  357. beg:
  358.     if((ch = string[j++] = getchr()) == '\\')
  359.     {
  360.         string[j++] = getchr();
  361.         goto beg;
  362.     }
  363.     if(ch == '\'' || ch == '"')
  364.     {
  365.         while((cc = string[j++] = getchr()) != ch) if(cc == '\\') string[j++] = getchr();
  366.         goto beg;
  367.     }
  368.     if(ch == '\n'){
  369.         puts();
  370.         aflg = 1;
  371.         goto beg;
  372.     }
  373.     else return(ch);
  374. }
  375. gotelse(){
  376.     tabs = stabs[clevel][iflev];
  377.     pflg[level] = spflg[clevel][iflev];
  378.     ind[level] = sind[clevel][iflev];
  379.     ifflg = 1;
  380. }
  381. getnl(){
  382.     while ((peek = getchr()) == '\t' || peek == ' '){
  383.         string[j++] = peek;
  384.         peek = -1;
  385.     }
  386.     if((peek = getchr()) == '/'){
  387.         peek = -1;
  388.         if ((peek = getchr()) == '*'){
  389.             string[j++] = '/';
  390.             string[j++] = '*';
  391.             peek = -1;
  392.             comment();
  393.         }
  394.         else string[j++] = '/';
  395.     }
  396.     if((peek = getchr()) == '\n'){
  397.         peek = -1;
  398.         return(1);
  399.     }
  400.     return(0);
  401. }
  402. comment(){
  403. rep:
  404.     while ((c = string[j++] = getchr()) != '*')
  405.         if (c == '\n'){
  406.             puts();
  407.             sflg = 1;
  408.         }
  409. gotstar:
  410.     if ((c = string[j++] = getchr()) != '/'){
  411.         if (c == '*') goto gotstar;
  412.         goto rep;
  413.     }
  414. }
  415. print(fmt,args)
  416. char *fmt;
  417. unsigned args;
  418. {
  419.     if (outvect == 1) printf(fmt,args);
  420.     else if (outvect == 0) fprintf(f2,fmt,args);
  421. }
  422.