C:/Users/Dennis/src/lang/russell.orig/src/utilities/parencount.c

Go to the documentation of this file.
00001 # include <stdio.h>
00002 # include "parm.h"
00003 
00004 /* This routine generates a listing with nesting levels for '{}', '()',     */
00005 /* and '[]'.                                                                */
00006 
00007 char levels[1000]; /* string to be printed underneath source line */
00008 int cur_col;       /* First character is considered to be in cur_col 0 */
00009 int bracecount 0,
00010     bracketcount 0,
00011     parencount 0;
00012 
00013 
00014 char tochar(i) /* generate character to be printed for nesting level i */
00015 int i;
00016 {
00017     i = i < 0 ? -i : i;
00018     if (i <= 9)
00019         return('0' + i);
00020     else if (i <= 9 + 26)
00021         return('a' + i - 10);
00022     else 
00023         return('A' + i - (10 + 26));
00024 }
00025 
00026 /*
00027  *      Get and echo a character from the input stream, updating current col count
00028  *  and initializing the level indicator.
00029  */
00030 newchar()
00031 {
00032     register int c;
00033 
00034         c = getchar();
00035         cur_col++;
00036         levels[cur_col] = c == '\t' ? '\t' : ' ';
00037         if ( c != EOF)
00038         putchar(c);
00039     return(c);
00040 }
00041 
00042 main()
00043 {
00044     int c;
00045 
00046     cur_col = -1;
00047     c = newchar();
00048     while (c != EOF) {
00049         switch(c) {
00050             case '{' :
00051                 levels[cur_col] = tochar(bracecount++); break;
00052             case '[' :
00053                 levels[cur_col] = tochar(bracketcount++); break;
00054             case '(' :
00055                 levels[cur_col] = tochar(parencount++); break;
00056             case '}' :
00057                 levels[cur_col] = tochar(--bracecount); break;
00058             case ']' :
00059                 levels[cur_col] = tochar(--bracketcount); break;
00060             case ')' :
00061                 levels[cur_col] = tochar(--parencount); break;
00062             case '\'' :
00063                 for(;;) {
00064                     c = newchar();
00065                     if ( c == EOF || c == '\'' )
00066                         break;
00067                     if ( c == '\\' ) {
00068                         c = newchar();
00069                         if ( c == EOF )
00070                             break;
00071                     }
00072                 }
00073                 break;
00074             case '"' :
00075                 for(;;) {
00076                     c = newchar();
00077                     if ( c == EOF || c == '"' )
00078                         break;
00079                     if ( c == '\\' ) {
00080                         c = newchar();
00081                         if ( c == EOF )
00082                             break;
00083                     }
00084                 }
00085                 break;
00086             case '\n' :
00087                 levels[cur_col] = '\0';
00088                 printf("%s\n",levels);
00089                 cur_col = -1;
00090                 break;
00091         }
00092         if ( c != EOF ) c = newchar();
00093     }
00094 }

Generated on Fri Jan 25 10:39:48 2008 for russell by  doxygen 1.5.4