home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / BDSC / BDSC-3 / LCHECK.CQ / LCHECK.C
Text File  |  2000-06-30  |  3KB  |  135 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. */
  9.  
  10. #define    vers    12    /* Version Number */
  11.  
  12. #include    "a:bdscio.h"
  13.  
  14. #define    SSCROLL    TRUE    /* Set TRUE for Smooth Scrolling on TVI 950 */
  15.  
  16. #define    quote    0x27    /* Single Quote */
  17. #define    dquote    0x22    /* Double Quote */
  18. #define    BS    0x08    /* Back Space Char */
  19. #define    TAB    0x09    /* Tab Char */
  20. #define    LF    0x0a    /* Line Feed Char */
  21. #define    CR    0x0d    /* Carriage Return Char */
  22. #define    YES    'Y'
  23. #define    NO    'N'
  24. #define    ovfl    YES    /* Line Overflow */
  25. #define    noovfl    NO    /* No Line Overflow */
  26.  
  27. char    iobuf[BUFSIZ];
  28. int    level, chval, pos, nroutines;
  29.  
  30. main(argc,argv)
  31. int argc;
  32. char **argv;
  33. {
  34.     int done;
  35.  
  36.     if (argc == 1) {
  37.         printf("LCHECK, Version %d.%d\n",vers/10,vers%10);
  38.         printf("Format of Command Line is --\n");
  39.         printf("  LCHECK filename.typ");
  40.         exit(FALSE);
  41.         }
  42.     if (fopen(argv[1],iobuf) == ERROR) {
  43.         printf("Cannot Find File %s\n",argv[1]);
  44.         exit(FALSE);
  45.         }
  46.     if (SSCROLL) printf("%c%c",ESC,'8');  /* Smooth Scroll */
  47.     printf("LCHECK, Version %d.%d -- File:  %s\n",vers/10,
  48.        vers%10,argv[1]);
  49.     level = 0; nroutines = 0;  /* Init nesting level, routine count */
  50.     prlevel();  /* Print level number */
  51.     do {
  52.         getit();  /* Get next char */
  53.         if (chval == quote) do {  /* If quote, flush to end quote */
  54.                 getit();
  55.             } while (chval != quote);
  56.         if (chval == dquote) do {  /* If dquote, flush to dquote */
  57.                 getit();
  58.             } while (chval != dquote);
  59.         if (chval == '/') {  /* Possible comment */
  60.             getit();
  61.             if (chval == '*') {  /* Yes, it is a comment */
  62.                 getit();
  63.                 done = FALSE;
  64.                 do {
  65.                     if (chval == '*') {  /* End comment? */
  66.                         getit();
  67.                         if (chval == '/')  /* Yes */
  68.                             done = TRUE;
  69.                         }
  70.                     else getit();
  71.                 } while (!done);
  72.                 }
  73.             }
  74.         if (chval == '{') level++;  /* BEGIN */
  75.         if (chval == '}') {  /* END */
  76.             level--;
  77.             if (level == 0) {
  78.                 nroutines++;
  79.                 printf("\n** Routine %d **", nroutines);
  80.                 }
  81.             }
  82.     } while ((chval != CPMEOF) && (chval != ERROR));
  83.  
  84.     printf("\nProgram Level Check is ");
  85.     if (level == 0) printf("OK");
  86.         else printf("NOT OK");
  87.     printf("\nNumber of Routines Encountered: %d",--nroutines);
  88.     if (SSCROLL) printf("%c%c",ESC,'9');  /* Hard Scroll */
  89. }
  90.  
  91. getit()  /* Get and Echo Character */
  92. {
  93.     chval = getc(iobuf);
  94.     if ((pos >= TWIDTH) & (chval != CR)) prlevel(ovfl);
  95.     if (chval != CPMEOF) echo(chval);
  96. }
  97.  
  98. echo(chval)  /* Echo Char with tabulation */
  99. char chval;
  100. {
  101.     switch (chval) {
  102.         case TAB : putchar(' '); pos++;
  103.                while (pos%9 != 0) {
  104.                 putchar(' ');
  105.                 pos++;
  106.                 }
  107.                break;
  108.         case BS  : putchar(BS);
  109.                pos--;
  110.                break;
  111.         case LF  : prlevel(noovfl);
  112.                break;
  113.         case CR  : putchar(CR);
  114.                pos = 0;
  115.                break;
  116.         default  : if (chval >= ' ') {
  117.                 putchar(chval);
  118.                 pos++;
  119.                 }
  120.                break;
  121.         }
  122. }
  123.  
  124. prlevel(ovfl_flag)  /* Print Level Number and Set Col Count */
  125. char ovfl_flag;
  126. {
  127.     putchar(LF);
  128.     if (level < 10) printf(" %d",level);
  129.         else printf("%d",level);
  130.     if (ovfl_flag == YES) putchar('-');
  131.         else putchar(':');
  132.     putchar(' ');
  133.     pos = 5;
  134. }
  135.