aboutsummaryrefslogblamecommitdiff
path: root/1.24.c
blob: 5e2494220de5adddcf387bc26a27133cbaf3dfce (plain) (tree)
































































































































































                                                                                                                           
#include <stdio.h>

#define OUT 0
#define FALSE -1
#define TRUE 1
#define STAR 1
#define SLASH 2

void count(char input, int* parentheses, int* brackets, int* braces);

/* this is a c programm to detect syntax errors in c programms */

int 
main(void)
{
  char input;
  int temp, state, line, parentheses, brackets, braces, single_quotes, double_quotes, double_quotes_line;

  state = OUT;
  parentheses = brackets = braces = single_quotes = double_quotes = double_quotes_line = 0;
  line = 1;

  while ((input = getchar()) != EOF) {

    if (input == '\n') {
      line++;
      continue;
    }

    /* filiter out comments */

    else if (input == '/') {
       temp = input;

      if ((input = getchar()) == '*') {
        state = STAR;
        temp = FALSE;
      } 

      else if (input == '/') {
        state = SLASH;
        temp = FALSE;
      }

    }

    else if (input == '*' && state == STAR) {

      if ((input = getchar()) == '/') {
        state = OUT;
        continue;
      }  

    }

    else if (input == '\n' && state == SLASH) {
      state = OUT;
      continue;
    }

    if (temp != FALSE)
      count(temp, &parentheses, &brackets, &braces);

    if (state == OUT) {

      if (input == '"' && double_quotes == TRUE) {
        double_quotes = FALSE;
        continue;
      } 

      /* process escape sequences  */

      else if (input == '\\') {
        input = getchar();

        if (input == '\n') {
          line++;
          continue;
        }

        if (input != 'a' && input != 'b' && input != 'f' && input != 'n' && input != 'r' &&
            input != 't' && input != 'v' && input != '\\' && input != '\'' && input != '"' && input != '?' && input != '0')
          printf("unproper escape sequence detected at line %d\n", line);
        
        else if (input == 'o') {
          if((input = getchar()) != 'o' || (input = getchar()) != 'o')
            printf("unproper escape sequence detected at line %d\n", line);
        }

        else if (input == 'x') {
          if((input = getchar()) != 'h' || (input = getchar()) != 'h')
            printf("unproper escape sequence detected at line %d\n", line);
        }

        else 
          continue;
      }

      /* process double quotes */

      else if (input == '"') {
        double_quotes = TRUE;
        double_quotes_line = line;
      }

      /* process single quotes */ 

      else if (input == '\'' && double_quotes != TRUE) {
        ;
        if ((input = getchar()) == '\\') {
          input = getchar();
        }

        if ((input = getchar()) != '\'')
          printf("unproper single quotes detected at line %d\n", line);

        continue;
      }

      /* process all others */

      count(input, &parentheses, &brackets, &braces);
    }
  }
  
  if (parentheses%=2)
    printf("unproper parentheses detected\n");
  if (brackets%=2)
    printf("unproper brackets detected\n");
  if (braces%=2)
    printf("unproper braces detected\n");
  if (double_quotes == TRUE)
    printf("unproper double quotes detected at line %d\n", double_quotes_line);

  return 0;
}

void 
count(char input, int* parentheses, int* brackets, int* braces)
{
  switch (input) {
        case '(' :
          (*parentheses)++;
          break;
        case ')' :
          (*parentheses)--;
          break;
        case '[' :
          (*brackets)++;
          break;
        case ']' :
          (*brackets)--;
          break;
        case '{' :
          (*braces)++;
          break;
        case '}' :
          (*braces)--;
          break;
  }
}