#include "lib/lib.h" #include "lib/vec.h" #include #include #include #include DECL_VEC(CharVec, char); CharVec readStdinToNewline() { CharVec cvec = CharVec_new(2); int ch; while (EOF != (ch = fgetc(stdin)) && ch != '\n') { CharVec_push(&cvec, ch); } return cvec; } bool pairedBraces(char open_brace, char close_brace) { if (open_brace == '\0') return true; int asciiDiff = 2; if (open_brace == '(' || open_brace == ')') { asciiDiff = 1; } return ((int)open_brace - ((int)close_brace - asciiDiff)) == 0; } bool checkCharVecBalance(CharVec *cvec) { int balance = 0; CharVec braceStack = CharVec_new(cvec->elem_count); char lastOpenBrace = '\0'; while (cvec->elem_count != 0) { char val = CharVec_first(cvec); switch (val) { case '(': case '[': case '{': CharVec_push(&braceStack, val); balance++; break; case ')': case ']': case '}': if (!pairedBraces(CharVec_pop(&braceStack), val)) return 0; balance--; break; } } if (balance == 0) { return -1; } else { return cvec->elem_count; } } int main() { print_header(); printf("Enter Expression: "); CharVec cvec = readStdinToNewline(); char *input = malloc(cvec.elem_count + 1); strcpy(input, cvec.data); if (checkCharVecBalance(&cvec)) { printf("It's balanced (^_^)\n"); return EXIT_SUCCESS; } else { printf("It's Not Balanced (0_0)\n"); return EXIT_FAILURE; } }