home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_09_10 / 9n10045a < prev    next >
Text File  |  1991-07-09  |  4KB  |  125 lines

  1. #include <stdio.h>
  2.  
  3. #define MAX_LINE 256
  4. #define ID_WID 10
  5.  
  6. #define WAIT_NEW 1
  7. #define WAIT_FREE 2
  8.  
  9. #define NEW_NEW 1
  10. #define NEW_FREE 2
  11. #define SAME_FREE 3
  12. #define SAME_NEW 4
  13. #define END_FILE 5
  14. #define PARSE_ERR 6
  15.  
  16. char cur_obj[MAX_LINE];
  17. char old_obj[MAX_LINE];
  18. char cur_line[MAX_LINE];
  19.  
  20. void main()
  21. {
  22.     int state;
  23.     int tok;
  24.  
  25.     state = WAIT_NEW;
  26.  
  27.     do {
  28.           tok = nexttok();      
  29.         switch(state){
  30.             case WAIT_NEW:
  31.                switch(tok) {
  32.                    case NEW_NEW:
  33.                       state = WAIT_FREE;
  34.                       continue;
  35.                    case NEW_FREE:
  36.                       printf("%s free without alloc\n", cur_obj);
  37.                       continue;
  38.                    case SAME_FREE:
  39.                       printf("%s multiple frees\n", cur_obj);
  40.                            continue;
  41.                         case SAME_NEW:
  42.                            printf("%s alloc after free\n", cur_obj);
  43.                            continue;
  44.                         case END_FILE:
  45.                            exit();
  46.                         case PARSE_ERR:
  47.                            printf("%s doesn't parse\n", cur_line);
  48.                            continue;
  49.                         default:
  50.                            printf("%s\n%s\nillegal token %d in state %d\n",
  51.                                    cur_obj, cur_line, tok, state);
  52.                            exit();
  53.                         }
  54.                      break;
  55.  
  56.             case WAIT_FREE:
  57.                switch(tok){
  58.                    case SAME_FREE:
  59.                       state = WAIT_NEW;
  60.                       continue;
  61.                    case NEW_FREE:
  62.                       state = WAIT_NEW;
  63.                       printf("%s alloc without free\n", old_obj);
  64.                       printf("%s free before alloc\n", cur_obj);
  65.                       continue;
  66.                    case NEW_NEW:
  67.                       printf("%s missing free\n", old_obj);
  68.                       continue;
  69.                    case SAME_NEW:
  70.                       printf("%s multiple allocs\n",cur_obj);
  71.                       continue;
  72.                    case END_FILE:
  73.                       printf("%s missing free\n", cur_obj);
  74.                       exit();
  75.                    case PARSE_ERR:
  76.                       printf("%s doesn't parse\n", cur_line);
  77.                       continue;
  78.                    default:
  79.                       printf("%s\n%s\nillegal token %d in state %d\n", 
  80.                                cur_obj, cur_line, tok, state);
  81.                       exit();
  82.                 }
  83.              default:
  84.                 printf("illegal state %d\n",state);                             
  85.                         
  86.                        
  87.             }                      
  88.     } while (1);
  89. }                                
  90.  
  91. int nexttok()
  92. {
  93.     char loc_obj[ID_WID+1];
  94.  
  95.     /* short unparsable lines won't be detected
  96.        unless we clear the buffer */
  97.        
  98.     memset(cur_line,'\0',20);
  99.     if (gets(cur_line) == NULL) return END_FILE;
  100.     if (strncmp(cur_line,cur_obj,ID_WID)==0) { 
  101.         /* same object */
  102.         if (strncmp(&cur_line[ID_WID+1], "free",4) == 0) {
  103.            return SAME_FREE;
  104.            }
  105.         if (strncmp(&cur_line[ID_WID+1], "anew",4) == 0) {        
  106.        return SAME_NEW;
  107.            }
  108.     return PARSE_ERR;
  109.         }
  110.     /* new object */
  111.     strcpy(old_obj,cur_obj);
  112.     strncpy(cur_obj,cur_line,10);
  113.     cur_obj[10] = '\0';
  114.     if (strncmp(&cur_line[ID_WID+1], "free",4) == 0) {
  115.        return NEW_FREE;
  116.        }
  117.     if (strncmp(&cur_line[ID_WID+1], "anew",4) == 0) {        
  118.        return NEW_NEW;
  119.        }
  120.     return PARSE_ERR;
  121. }
  122.                                     
  123.     
  124.     
  125.