home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / CB.ZIP / CB.C next >
C/C++ Source or Header  |  1988-05-31  |  12KB  |  534 lines

  1. /*
  2.         CB.C
  3.  
  4.         Modified for Lattice C Ver 1.01
  5.         by: John W. Kindschi Jr. (10-30-83)
  6.  
  7.         Swiped from CPIG'S UNIX system and modified to
  8.         run under BDS C by William C. Colley, III
  9.  
  10.         Further modified by Bert Kleinman 9/30/86:
  11.  
  12.           File extension defaults to .c
  13.           Indent defaults to 3
  14.           Uses temp file cb.$$$, then renames input to .BAK
  15.           Converstion to MSC 4.0
  16.  
  17.         Usage: cb filname [indent]
  18.  
  19. */
  20.  
  21. #include <stdio.h>
  22. #include <string.h>
  23.  
  24. #define INDENT_SPACES 4      /* default number of spaces to indent */
  25.  
  26. int slevel[10];
  27. int clevel;
  28. int spflg[20][10];
  29. int sind[20][10];
  30. int siflev[10];
  31. int sifflg[10];
  32. int iflev;
  33. int ifflg;
  34. int level;
  35. int eflg;
  36. int paren;
  37. int aflg;
  38. int ct;
  39. int stabs[20][10];
  40. int qflg;
  41. int j;
  42. int sflg;
  43. int bflg;
  44. int peek;
  45. int tabs;
  46. FILE *f1, *f2;
  47.  
  48. static int ind[10] = {
  49.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  50. static int pflg[10] = {
  51.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  52.  
  53. char lchar;
  54. char pchar;
  55. char *wif[2];
  56. char *welse[2];
  57. char *wfor[2];
  58. char *wds[3];
  59. char cc;
  60. char string[200];
  61. int lastchar;
  62. int c;
  63. int outvect;
  64. char infile[75];
  65. char bakfile[75];
  66. int indent;
  67.  
  68. main(argc,argv)
  69. int argc;
  70. char *argv[];
  71. {
  72.  
  73.     char tempfile[15];
  74.     int result;
  75.     char *p;
  76.  
  77.     int k;        /* Initialize everything here */
  78.  
  79.     outvect = 1;
  80.  
  81.     if (argc < 2 || argc > 3)
  82.     {
  83.         print("\nUsage: cb infile [indent]\n");
  84.         exit(1);
  85.     }
  86.  
  87.  
  88.     /* set indent - either from cmd line or default */
  89.  
  90.     if( argc != 3 )
  91.     {
  92.         indent = INDENT_SPACES;
  93.     }
  94.     else
  95.     {
  96.         indent = atoi( argv[2] );
  97.         if( indent > 10 || indent < 0)      /* if invalid indent */
  98.         {
  99.             print("Error: Valid indents are 0 - 10\n");
  100.             exit(1);
  101.         }
  102.     }
  103.  
  104.     /* add default extension of .c if necessary */
  105.  
  106.     strcpy( infile, argv[1] );
  107.     if( strchr( infile, '.' ) == NULL )
  108.         strcat(infile, ".c");
  109.  
  110.     /* open input file */
  111.  
  112.     if( (f1 = fopen(infile,"r")) == NULL )
  113.     {
  114.         print("Error: input file can't be opened\n");
  115.         exit(1);
  116.     }
  117.  
  118.     /* open temp file */
  119.  
  120.     strcpy(tempfile,"cb.$$$");
  121.  
  122.     if( (f2 = fopen(tempfile,"w")) == NULL )
  123.     {
  124.         print("Error: temporary file can't be opened\n");
  125.         exit(1);
  126.     }
  127.  
  128.     outvect = 0;
  129.  
  130.     clevel = iflev = level = eflg = paren = 0;
  131.     aflg = qflg = j = bflg = tabs = 0;
  132.     ifflg = peek = -1;
  133.     sflg = 1;
  134.     wif[0] = "if";
  135.     welse[0] = "else";
  136.     wfor[0] = "for";
  137.     wds[0] = "case";
  138.     wds[1] = "default";
  139.     wif[1] = welse[1] = wfor[1] = wds[2] = 0;
  140.  
  141.     /* End of Initialization */
  142.  
  143.     while ((c = getchr()) != EOF){
  144.         switch(c){
  145.         default:
  146.             string[j++] = c;
  147.             if (c != ',') lchar = c;
  148.             break;
  149.         case ' ':
  150.         case '\t':
  151.             if (lookup (welse) == 1){
  152.                 gotelse();
  153.                 if(sflg == 0 || j > 0)string[j++] = c;
  154.                 puts();
  155.                 sflg = 0;
  156.                 break;
  157.             }
  158.             if(sflg == 0 || j > 0) string[j++] = c;
  159.             break;
  160.         case '\n':
  161.             if (eflg = lookup(welse) == 1) gotelse();
  162.             puts();
  163.             print ("\n");
  164.             sflg = 1;
  165.             if (eflg == 1){
  166.                 pflg[level]++;
  167.                 tabs++;
  168.             }
  169.             else
  170.                 if(pchar == lchar)
  171.                     aflg = 1;
  172.             break;
  173.         case '{':
  174.             if (lookup(welse) == 1) gotelse();
  175.             siflev[clevel] = iflev;
  176.             sifflg[clevel] = ifflg;
  177.             iflev = ifflg = 0;
  178.             clevel++;
  179.             if (sflg == 1 && pflg[level] != 0){
  180.                 pflg[level]--;
  181.                 tabs--;
  182.             }
  183.             string[j++] = c;
  184.             puts();
  185.             getnl();
  186.             puts();
  187.             print("\n");
  188.             tabs++;
  189.             sflg = 1;
  190.             if (pflg[level] > 0){
  191.                 ind[level] = 1;
  192.                 level++;
  193.                 slevel[level] = clevel;
  194.             }
  195.             break;
  196.         case '}':
  197.             clevel--;
  198.             if ((iflev = siflev[clevel]-1) < 0) iflev = 0;
  199.             ifflg = sifflg[clevel];
  200.             puts();
  201.             tabs--;
  202.             ptabs();
  203.             if ((peek = getchr()) == ';'){
  204.                 print("%c;",c);
  205.                 peek = -1;
  206.             }
  207.             else print("%c",c);
  208.             getnl();
  209.             puts();
  210.             print("\n");
  211.             sflg = 1;
  212.             if (clevel < slevel[level]) if (level > 0) level--;
  213.             if (ind[level] != 0){
  214.                 tabs -= pflg[level];
  215.                 pflg[level] = 0;
  216.                 ind[level] = 0;
  217.             }
  218.             break;
  219.         case '"':
  220.         case '\'':
  221.             string[j++] = c;
  222.             while((cc = getchr()) != c){
  223.                 string[j++] = cc;
  224.                 if(cc == '\\'){
  225.                     string[j++] = getchr();
  226.                 }
  227.                 if(cc == '\n'){
  228.                     puts();
  229.                     sflg = 1;
  230.                 }
  231.             }
  232.             string[j++] = cc;
  233.             if(getnl() == 1){
  234.                 lchar = cc;
  235.                 peek = '\n';
  236.             }
  237.             break;
  238.         case ';':
  239.             string[j++] = c;
  240.             puts();
  241.             if(pflg[level] > 0 && ind[level] == 0){
  242.                 tabs -= pflg[level];
  243.                 pflg[level] = 0;
  244.             }
  245.             getnl();
  246.             puts();
  247.             print("\n");
  248.             sflg = 1;
  249.             if(iflev > 0)
  250.                 if(ifflg == 1){
  251.                     iflev--;
  252.                     ifflg = 0;
  253.                 }
  254.                 else iflev = 0;
  255.             break;
  256.         case '\\':
  257.             string[j++] = c;
  258.             string[j++] = getchr();
  259.             break;
  260.         case '?':
  261.             qflg = 1;
  262.             string[j++] = c;
  263.             break;
  264.         case ':':
  265.             string[j++] = c;
  266.             if(qflg == 1){
  267.                 qflg = 0;
  268.                 break;
  269.             }
  270.             if(lookup(wds) == 0){
  271.                 sflg = 0;
  272.                 puts();
  273.             }
  274.             else{
  275.                 tabs--;
  276.                 puts();
  277.                 tabs++;
  278.             }
  279.             if((peek = getchr()) == ';'){
  280.                 print(";");
  281.                 peek = -1;
  282.             }
  283.             getnl();
  284.             puts();
  285.             print("\n");
  286.             sflg = 1;
  287.             break;
  288.         case '/':
  289.             string[j++] = c;
  290.             if((peek = getchr()) != '*') break;
  291.             string[j++] = peek;
  292.             peek = -1;
  293.             comment();
  294.             break;
  295.         case ')':
  296.             paren--;
  297.             string[j++] = c;
  298.             puts();
  299.             if(getnl() == 1){
  300.                 peek = '\n';
  301.                 if(paren != 0) aflg = 1;
  302.                 else if(tabs > 0){
  303.                     pflg[level]++;
  304.                     tabs++;
  305.                     ind[level] = 0;
  306.                 }
  307.             }
  308.             break;
  309.         case '#':
  310.             string[j++] = c;
  311.             while((cc = getchr()) != '\n') string[j++] = cc;
  312.             string[j++] = cc;
  313.             sflg = 0;
  314.             puts();
  315.             sflg = 1;
  316.             break;
  317.         case '(':
  318.             string[j++] = c;
  319.             paren++;
  320.             if(lookup(wfor) == 1){
  321.                 while((c = getsc()) != ';');
  322.                 ct = 0;
  323. cont:
  324.                 while((c = getsc()) != ')'){
  325.                     if(c == '(') ct++;
  326.                 }
  327.                 if(ct != 0){
  328.                     ct--;
  329.                     goto cont;
  330.                 }
  331.                 paren--;
  332.                 puts();
  333.                 if(getnl() == 1){
  334.                     peek = '\n';
  335.                     pflg[level]++;
  336.                     tabs++;
  337.                     ind[level] = 0;
  338.                 }
  339.                 break;
  340.             }
  341.             if(lookup(wif) == 1){
  342.                 puts();
  343.                 stabs[clevel][iflev] = tabs;
  344.                 spflg[clevel][iflev] = pflg[level];
  345.                 sind[clevel][iflev] = ind[level];
  346.                 iflev++;
  347.                 ifflg = 1;
  348.             }
  349.         }
  350.     }
  351.  
  352.     result = fcloseall();
  353.  
  354.     /* construct bakfile name */
  355.  
  356.     strcpy(bakfile, infile);
  357.     p = strchr(bakfile, '.');
  358.     *p = '\0';
  359.     strcat(bakfile, ".BAK");
  360.  
  361.     /* erase bakfile if it exists */
  362.  
  363.     if( access(bakfile, 0) == 0)
  364.     {
  365.         result = unlink( bakfile );
  366.         if(result != 0 )
  367.         {
  368.             print("Error: can erase old .BAK file\n");
  369.             printf("Results in %s\n",tempfile);
  370.             exit(1);
  371.         }
  372.     }
  373.  
  374.     /* rename input file to .BAK */
  375.  
  376.     result = rename(infile, bakfile);
  377.  
  378.     if( result != 0 )
  379.     {
  380.         printf("Error: can't rename infile to .BAK\n");
  381.         printf("Results in %s\n",tempfile);
  382.         exit(1);
  383.     }
  384.  
  385.     result = rename(tempfile, infile);
  386.  
  387.     if( result != 0 )
  388.     {
  389.         printf("Error: can't rename tempefile to infile\n");
  390.         printf("Results in %s\n",tempfile);
  391.         exit(1);
  392.     }
  393.  
  394.  
  395. }
  396.  
  397.  
  398. ptabs(){
  399.     register int i;
  400.     register int j;
  401.  
  402.     for (i=0; i < tabs; i++)
  403.         for( j = 0; j < indent; j++ )
  404.             putc(' ', f2 );
  405.  
  406. }
  407. getchr(){
  408.     if(peek<0 && lastchar != ' ' && lastchar != '\t')pchar = lastchar;
  409.     lastchar = (peek < 0) ? getc(f1) : peek;
  410.     peek = -1;
  411.     return(lastchar == '\r' ? getchr() : lastchar);
  412. }
  413. puts(){
  414.     register int i;
  415.  
  416.     if (j > 0)
  417.     {
  418.         if (sflg != 0)
  419.         {
  420.             ptabs();
  421.             sflg = 0;
  422.             if (aflg == 1)
  423.             {
  424.                 aflg = 0;
  425.                 /* commented out to */
  426.                 /* prevent indentation of brace after else */
  427.                 /* if (tabs > 0) print ("    "); */
  428.             }
  429.         }
  430.         string[j] = '\0';
  431.         print("%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.     register int i,k;
  448.     int kk,l;
  449.  
  450.     if(j < 1) return(0);
  451.     kk = 0;
  452.     while (string[kk] == ' ') 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.         if(r == '\0' && (string[k] < 'a' || string[k] > 'z'))return(1);
  458.     }
  459.     return(0);
  460. }
  461. getsc(){
  462.     register char ch;
  463. beg:
  464.     if((ch = string[j++] = getchr()) == '\\')
  465.     {
  466.         string[j++] = getchr();
  467.         goto beg;
  468.     }
  469.     if(ch == '\'' || ch == '"')
  470.     {
  471.         while((cc = string[j++] = getchr()) != ch) if(cc == '\\') string[j++] = getchr();
  472.         goto beg;
  473.     }
  474.     if(ch == '\n'){
  475.         puts();
  476.         aflg = 1;
  477.         goto beg;
  478.     }
  479.     else return(ch);
  480. }
  481. gotelse(){
  482.     tabs = stabs[clevel][iflev];
  483.     pflg[level] = spflg[clevel][iflev];
  484.     ind[level] = sind[clevel][iflev];
  485.     ifflg = 1;
  486. }
  487. getnl(){
  488.     while ((peek = getchr()) == '\t' || peek == ' '){
  489.         string[j++] = peek;
  490.         peek = -1;
  491.     }
  492.     if((peek = getchr()) == '/'){
  493.         peek = -1;
  494.         if ((peek = getchr()) == '*'){
  495.             string[j++] = '/';
  496.             string[j++] = '*';
  497.             peek = -1;
  498.             comment();
  499.         }
  500.         else string[j++] = '/';
  501.     }
  502.     if((peek = getchr()) == '\n'){
  503.         peek = -1;
  504.         return(1);
  505.     }
  506.     return(0);
  507. }
  508. comment(){
  509. rep:
  510.     while ((c = string[j++] = getchr()) != '*')
  511.         if (c == '\n'){
  512.             puts();
  513.             sflg = 1;
  514.         }
  515. gotstar:
  516.     if ((c = string[j++] = getchr()) != '/'){
  517.         if (c == '*') goto gotstar;
  518.         goto rep;
  519.     }
  520. }
  521. print(fmt,args)
  522. char *fmt;
  523. unsigned args;
  524. {
  525.     if (outvect == 1) printf(fmt,args);
  526.     else if (outvect == 0) fprintf(f2,fmt,args);
  527. }
  528.  
  529. _setenvp()
  530.  
  531. {
  532. }
  533.  
  534.