Advertisement
boriswinner

C_checker

Feb 25th, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.65 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4.  
  5. bool checkbrackets(char* astr, char first, char second){
  6.     int cntopened = 0;
  7.     for (int i = 0; astr[i] != '\0'; ++i){
  8.         if (astr[i] == first) cntopened++;
  9.         else if (astr[i] == second) cntopened--;
  10.         if (cntopened < 0) break;
  11.     }
  12.     return (cntopened == 0);
  13. }
  14.  
  15. int checkcomments(char* astr){
  16. /* 0 - no comments or closed comment
  17.  * 1 - only opened comment
  18.  * 2 - only closed comment*/
  19.     int res = 0;
  20.     for (int i = 0; astr[i] != '\0'; ++i){
  21.         if ((astr[i] == '/') && (astr[i+1] == '*')){
  22.             res = 1;
  23.             astr[i] = '(';
  24.             astr[i+1] = '(';
  25.         }
  26.         if ((astr[i] == '*') && (astr[i+1] == '/')){
  27.             if (res == 1) res = 0; else res = 2;
  28.             astr[i] = ')';
  29.             astr[i+1] = ')';
  30.         }
  31.     }
  32.     return res;
  33. };
  34.  
  35. bool checkescapesequence(char* astr){
  36.     bool res = true;
  37.     for (int i = 0; astr[i] != '\0'; ++i){
  38.         if (astr[i] == '\\') {
  39.             switch (astr[i + 1]) {
  40.                 case 'a': break;
  41.                 case 'b': break;
  42.                 case 'f': break;
  43.                 case 'n': break;
  44.                 case 'r': break;
  45.                 case 't': break;
  46.                 case 'v': break;
  47.                 case '\'': break;
  48.                 case '"': break;
  49.                 case '?': break;
  50.                 default:
  51.                     return false;
  52.             }
  53.         }
  54.     }
  55.     return res;
  56. }
  57.  
  58. int main(){
  59.     char* s = malloc(80*sizeof(char));
  60.     FILE *f = fopen("input.txt","r");
  61.     int commentscnt = 0;
  62.     for (int i  = 1; !feof(f); i++) {
  63.         fscanf(f, "%s", s);
  64.         bool res;
  65.         res = checkbrackets(s,'(',')');
  66.         printf(res ? "" : "Error: line %d brackets type () disbalance \n",i);
  67.         res = checkbrackets(s,'{','}');
  68.         printf(res ? "" : "Error: line %d brackets type {} disbalance \n",i);
  69.         res = checkbrackets(s,'[',']');
  70.         printf(res ? "" : "Error: line %d brackets type [] disbalance \n",i);
  71.         res = checkbrackets(s,'"','"');
  72.         printf(res ? "" : "Error: line %d brackets type \"\" disbalance \n",i);
  73.         res = checkbrackets(s,'\'','\'');
  74.         printf(res ? "" : "Error: line %d brackets type \'\' disbalance \n",i);
  75.         res = checkescapesequence(s);
  76.         printf(res ? "" : "Error: line %d incorrect escape sequence \n",i);
  77.         switch (checkcomments(s)){
  78.             case 1: commentscnt += 1; break;
  79.             case 2: commentscnt -= 1; break;
  80.             default: break;
  81.         }
  82.     }
  83.     printf(commentscnt ? "Error: comments disbalance \n" : "");
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement