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 }