home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 186_01 / nlcheck.c < prev    next >
Text File  |  1985-08-21  |  5KB  |  152 lines

  1. /*  LCHECK by Richard Conn
  2.  
  3.         LCHECK displays to the user the nesting level number of each
  4. BEGIN/END ({/}) group, thereby helping him to identify problem areas
  5. in his C programs.  It recognizes quoted material and comments and
  6. ignores { and } within these.
  7.  
  8. 08/01/84 - Fixed bug that caused program to treat an \' or \" as a "live"
  9.            quote.  (Therefore, a statement such as "#define QUOTE '\''"
  10.            would screw up the level counter in the program.  Changed version
  11.            number to 1.2A.  (Don McCrady)
  12. */
  13.  
  14. #define VERS    "1.2A"  /* Version Number */
  15.  
  16. #include        "a:bdscio.h"
  17.  
  18. #define SSCROLL FALSE   /* Set TRUE for Smooth Scrolling on TVI 950 */
  19.  
  20. #define TWIDTH  80      /* Terminal width = 80 chars */
  21. #define ESC     0x1B    /* Escape control sequence */
  22. #define quote   0x27    /* Single Quote */
  23. #define dquote  0x22    /* Double Quote */
  24. #define bslash  0x5c    /* Backslash escape character */
  25. #define BS      0x08    /* Back Space Char */
  26. #define TAB     0x09    /* Tab Char */
  27. #define LF      0x0a    /* Line Feed Char */
  28. #define CR      0x0d    /* Carriage Return Char */
  29. #define YES     'Y'
  30. #define NO      'N'
  31. #define ovfl    YES     /* Line Overflow */
  32. #define noovfl  NO      /* No Line Overflow */
  33.  
  34. char    iobuf[BUFSIZ];
  35. int     level, chval, pos, nroutines;
  36.  
  37. main(argc,argv)
  38. int argc;
  39. char **argv;
  40. {
  41.         int done;
  42.  
  43.         if (argc == 1) {
  44.                 printf("LCHECK, Version %s\n",VERS);
  45.                 printf("Format of Command Line is --\n");
  46.                 printf("  LCHECK filename.typ");
  47.                 exit(FALSE);
  48.                 }
  49.         if (fopen(argv[1],iobuf) == ERROR) {
  50.                 printf("Cannot Find File %s\n",argv[1]);
  51.                 exit(FALSE);
  52.                 }
  53.         if (SSCROLL) printf("%c%c",ESC,'8');  /* Smooth Scroll */
  54.         printf("LCHECK, Version %s -- File:  %s\n",VERS,argv[1]);
  55.         level = 0; nroutines = 0;  /* Init nesting level, routine count */
  56.         prlevel();  /* Print level number */
  57.         do {
  58.                 getit();  /* Get next char */
  59.                 if (chval == quote) do {  /* If quote, flush to end quote */
  60.                                 getit();
  61.                                 if (chval == bslash⌡ @├╒        for \'  */
  62.                                         getit();
  63.                                         if (chval == quote) /* Ignore it and */
  64.                                                 getit();    /* get next char */
  65.                                 }
  66.                         } while (chval != quote);
  67.                 if (chval == dquote) do {  /* If dquote, flush to dquote */
  68.                                 getit();
  69.                                 if (chval == bslash)  {  /* check for \"  */
  70.                                         getit();
  71.                                         if (chval == dquote) /* Ignore it and */
  72.                                                 getit();     /* get next char */
  73.                                 }
  74.                         } while (chval != dquote);
  75.                 if (chval == '/') {  /* Possible comment */
  76.                         getit();
  77.                         if (chval == '*') {  /* Yes, it is a comment */
  78.                                 getit();
  79.                                 done = FALSE;
  80.                                 do {
  81.                                         if (chval == '*') {  /* End comment? */
  82.                                                 getit();
  83.                                                 if (chval == '/')  /* Yes */
  84.                                                         done = TRUE;
  85.                                                 }
  86.                                         else getit();
  87.                                 } while (!done);
  88.                                 }
  89.                         }
  90.                 if (chval == '{') level++;  /* BEGIN */
  91.                 if (chval == '}') {  /* END */
  92.                         level--;
  93.             if (level == 0) {
  94.                 nroutines++;
  95.                 printf("\n** Routine %d **", nroutines);
  96.                 }
  97.             }
  98.     } while ((chval != CPMEOF) && (chval != ERROR));
  99.  
  100.     printf("\nProgram Level Check is ");
  101.     if (level == 0) printf("OK");
  102.         else printf("NOT OK");
  103.     printf("\nNumber of Routines Encountered: %d",--nroutines);
  104.     if (SSCROLL) printf("%c%c",ESC,'9');  /* Hard Scroll */
  105. }
  106.  
  107. getit()  /* Get and Echo Character */
  108. {
  109.     chval = getc(iobuf);
  110.     if ((pos >= TWIDTH) & (chval != CR)) prlevel(ovfl);
  111.     if (chval != CPMEOF) echo(chval);
  112. }
  113.  
  114. echo(chval)  /* Echo Char with tabulation */
  115. char chval;
  116. {
  117.     switch (chval) {
  118.         case TAB : putchar(' '); pos++;
  119.                while (pos%9 != 0) {
  120.                 putchar(' ');
  121.                 pos++;
  122.                 }
  123.                break;
  124.         case BS  : putchar(BS);
  125.                pos--;
  126.                break;
  127.         case LF  : prlevel(noovfl);
  128.                break;
  129.         case CR  : putchar(CR);
  130.                pos = 0;
  131.                break;
  132.         default  : if (chval >= ' ') {
  133.                 putchar(chval);
  134.                 pos++;
  135.                 }
  136.                break;
  137.         }
  138. }
  139.  
  140. prlevel(ovfl_flag)  /* Print Level Number and Set Col Count */
  141. char ovfl_flag;
  142. {
  143.     putchar(LF);
  144.     if (level < 10) printf(" %d",level);
  145.         else printf("%d",level);
  146.     if (ovfl_flag == YES) putchar('-');
  147.         else putchar(':');
  148.     putchar(' ');
  149.     pos = 5;
  150. }
  151. nes Encountered: %d",--nroutines);
  152.     if (SSCROLL) printf("%c%c",ESC,'9');  /* Hard