home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / beehive / program / curly.arc / CURLY.C next >
Encoding:
C/C++ Source or Header  |  1990-11-03  |  6.1 KB  |  216 lines

  1. /*                                                             */
  2. /*  CURLY   A debugging program written in BDS C Version 1.5   */
  3. /*              Written by Michael Girle                       */
  4. /*                                                             */
  5.  
  6. #include <bdscio.h>
  7. #define MAX_NUM_LINES 250
  8. #define CHARS_PER_LINE 80
  9. #define MAX_NESTING 12
  10.  
  11. main(argc,argv)
  12. char **argv;
  13. {
  14. int i, j, k, l, m, count, maxbr, nol, pos, errchk1, errchk2;
  15. char str1[15], str2[15];
  16. char     array1[MAX_NUM_LINES][2+CHARS_PER_LINE],
  17.     array3[MAX_NUM_LINES][MAX_NESTING],
  18.     array2[MAX_NUM_LINES][MAX_NESTING],
  19.     ibuf[BUFSIZ], obuf[BUFSIZ],
  20.     linbuf[MAXLINE];
  21.  
  22.         /*  Initialisation   */
  23.  
  24. printf("Initialising variables . . . please wait\n");
  25. i=0;j=0;k=0;l=0;m=0;count=0;maxbr=0;nol=0;pos=0;errchk1=0;errchk2=0;
  26. for (i=&array1[0][0];i<=&array1[MAX_NUM_LINES-1][CHARS_PER_LINE+1];i++) 
  27.     poke (i,0);
  28. for (i=&array2[0][0];i<=&array2[MAX_NUM_LINES-1][MAX_NESTING-1];i++) 
  29.     poke (i,0);
  30. for (i=&array3[0][0];i<=&array3[MAX_NUM_LINES-1][MAX_NESTING-1];i++) 
  31.     poke (i,32);
  32.  
  33. printf("Warning *** Maximum capacity - %d lines of %d chars each\n\n"
  34.         ,MAX_NUM_LINES,CHARS_PER_LINE);
  35.  
  36.         /* Getting the first filename */
  37.  
  38. if ((argc != 2) && (argc != 3)) {
  39.     printf("Error - wrong no. of file names\n");
  40.     printf("Use the form - A>curly X:XXXXX.XXX Y:YYYYY.YYY\n");
  41.     exit();}
  42. strcpy(str1,argv[1]);
  43. for(i=0;i<strlen(str1);i++)
  44.     if (str1[i] == '.')    /* Adjust for '.C' where necessary */
  45.         break;
  46. if (i>=strlen(str1)) {
  47.     str1[i] = '.';str1[i+1] = 'C';str1[i+2] = 0;}
  48.  
  49.         /* Getting second filename */
  50.  
  51. if (argc == 3)
  52.     strcpy(str2,argv[2]);
  53. else    strcpy(str2,str1);    /* Copy first filename if   */
  54.                 /* no second name is given  */
  55.  
  56. for (i=0;i<strlen(str2);i++)
  57.     if (str2[i] == '.')    /* Adjust for .CUR where necessary */
  58.         break;
  59. if ((i >= strlen(str2)) || (strcmp(str1,str2) == 0)) {
  60.     str2[i] = '.';str2[i+1]='C';
  61.     str2[i+2]='U';str2[i+3]='R';}
  62.  
  63. if (strcmp(str1,str2) == 0) {
  64.     printf("Initial file name has the form .CUR - Fatal error\n");
  65.     exit();}
  66.  
  67. if (fopen(str1,ibuf) == -1) {
  68.     printf("Cannot open filename %s\n",str1);
  69.     exit();
  70. }
  71.         /* Load the program in */
  72.  
  73. nol = 0;
  74. for (i=0;i<MAX_NUM_LINES;i++) {
  75.     if (fgets(linbuf,ibuf) == 0) {
  76.         nol = i;break;}
  77.     strcpy(&array1[i][0],linbuf);
  78. }
  79. fclose(ibuf);
  80. if (i == MAX_NUM_LINES) {
  81.     printf("Program too long error\n");
  82.     exit();
  83. }
  84.  
  85.         /* Lets get down to business    */
  86.         /* First the calculating of how */
  87.         /* many nests of curly braces.  */
  88.  
  89. printf("%d lines found\n",nol);
  90.  
  91. errchk1 = 0;errchk2 = 0;
  92. for (i=0;i<=nol;i++)
  93.     for(j=0;j<1+CHARS_PER_LINE;j++) {
  94.  
  95.         /* Check to see if a comment starts or ends */
  96.  
  97.         if ((check(&array1[i][j],'/') == 1) &&
  98.             check(&array1[i][j+1],'*') == 1) errchk2 = 1;
  99.         if ((check(&array1[i][j],'*') == 1) &&
  100.             check(&array1[i][j+1],'/') == 1) errchk2 = 0;
  101.  
  102.         /* Check to see if a double quote starts or ends */
  103.  
  104.         if (check(&array1[i][j],'"') == 1) errchk1 = 1-errchk1;
  105.  
  106.         /* Now check for curly brace.              */
  107.         /* 'Check' function determines if the      */
  108.         /* given character is within single quotes */
  109.  
  110.         if ((check(&array1[i][j],'{') == 1) && 
  111.             (errchk1 == 0) && (errchk2 == 0)) count++;
  112.         if ((check(&array1[i][j],'}') == 1) && 
  113.             (errchk1 == 0) && (errchk2 == 0)) count--;
  114.         if (count > maxbr) maxbr=count;
  115.     }
  116. if (count != 0)
  117.     printf("Counting error - comes to %d\n",count);
  118.  
  119. printf("Maximum nesting goes %d levels deep\n",maxbr);
  120. printf("\n\nPlease note that in the following structuring\n");
  121. printf("some of your own program structure may be lost.\n");
  122. printf("This happens with the first tab setting. As things are\n");
  123. printf("added to the left of each line, the first tab setting\n");
  124. printf("is pushed along until it reaches the second. It will then\n");
  125. printf("push all the others on the same line along one tab setting.\n");
  126. printf("All this results in is a possibility of the first tab\n");
  127. printf("being shorter than usual. It should not hamper debugging\n");
  128. printf("because even if it is cut down to only one character,\n");
  129. printf("the program structuring will still be there.\n");
  130.  
  131. errchk1 = 0;    /* Now we mark the given nests of */
  132. errchk2 = 0;    /* curly braces as they come.     */
  133. count = 0;
  134. for (i=0;i<=nol;i++) {
  135.     array3[i][maxbr+2] = 0;
  136.     pos = 0;
  137.     for (j=0;j<=CHARS_PER_LINE;j++) {
  138.         if (array1[i][j] == 0) break;
  139.  
  140.         /* Once again, check for comments or quotes */
  141.  
  142.         if ((check(&array1[i][j],'/') == 1) &&
  143.             check(&array1[i][j+1],'*') == 1) errchk2 = 1;
  144.         if ((check(&array1[i][j],'*') == 1) &&
  145.             check(&array1[i][j+1],'/') == 1) errchk2 = 0;
  146.         if (check(&array1[i][j],'"') == 1) errchk1 = 1-errchk1;
  147.  
  148.         /* Now we actually mark them */
  149.  
  150.         if ((check(&array1[i][j],'}') == 1) && 
  151.             (errchk1 == 0) && (errchk2 == 0)) {
  152.             pos++;array2[i][pos] = count;
  153.             count--;}
  154.         if ((check(&array1[i][j],'{') == 1) && 
  155.             (errchk1 == 0) && (errchk2 == 0)) {
  156.             count++;pos++;
  157.             array2[i][pos] = count;}
  158.     }
  159. }
  160.  
  161. for (i=1;i<=maxbr;i++) {
  162.     l = 0;
  163.     while (l <= nol) {
  164.  
  165.         /* This finds the first curly brace */
  166.  
  167.         for (j=0;j<=nol;j++) {
  168.             for (k=0;k<=maxbr+2;k++)
  169.                 if (array2[j][k] == i) {
  170.                     array2[j][k] = 0;break;}
  171.             if (k <= maxbr+2) break;
  172.         }
  173.         array3[j][i] = '+';
  174.  
  175.         /* This finds the matching curly brace */
  176.  
  177.         for (l=j;l<=nol;l++) {
  178.             for (m=0;m<=maxbr+2;m++)
  179.                 if (array2[l][m] != i) {
  180.                     if (array3[l][i] != '+')
  181.                         array3[l][i] = '!';
  182.                 } else    {
  183.                     array3[l][i] = '+';
  184.                     array2[l][m] = 0;
  185.                     break;}
  186.             if (m <= maxbr+2) break;
  187.         }
  188.     }
  189. }
  190.  
  191.         /* And then, all we have to do */
  192.         /* is save the whole lot again */
  193.  
  194. fcreat(str2,obuf);
  195. for (i=0;i<=nol;i++) {
  196.     strcpy(linbuf,&array3[i][0]);
  197.     strcpy(&linbuf[maxbr+2],&array1[i][0]);
  198.     fputs(linbuf,obuf);
  199. }
  200. putc(CPMEOF,obuf);
  201. fclose(obuf);
  202.  
  203. exit();
  204. }
  205. check(c,d)
  206. char *c;        /* This routine checks for the character */
  207. int d;            /* in 'd' and makes sure it is not       */
  208. {            /* surrounded by single quotes           */
  209. int i;
  210.  
  211. i=0;
  212. if ((*(c-1) != 39) && (*(c+1) != 39) && (*c == d)) i = 1;
  213.  
  214. return(i);
  215. }
  216.