void workflow_free__( void * arg ) { workflow_type * workflow = workflow_safe_cast( arg ); workflow_free( workflow ); }
int main(int argc, char ** argv) { char * test; int i; struct WorkFlow * wf; rb_tree * symtab, * functab; struct Symbol * s, * q; test = malloc(1024); memstat_init(); // jmm_init(); symtab = symtable_init(); functab = functable_init(); stdlib_arythm_register(functab); strcpy(test, "rcmp(rcmp(33, 34), rcmp(34, 35)) + 8"); if (inf_check_brackets(test)) printf("Correct!\n"); wf = inf_transform_to_reverse_postfix(functab, test); puts(test); for(i = 0; i < wf->count; ++i) { printf("%d ", wf->ops[i].id); } puts(""); for(i = 0; i < wf->count; ++i) { switch (wf->ops[i].id) { case SYM_NUM: printf("%s", (char *)wf->ops[i].data); break; case SYM_SYMBOL: printf("%s", (char *)wf->ops[i].data); break; case SYM_OPS_ADD: printf("+"); break; case SYM_OPS_SUB: printf("-"); break; case SYM_OPS_MUL: printf("*"); break; case SYM_OPS_DIV: printf("/"); break; case SYM_OPS_EXP: printf("^"); break; case SYM_FUNC: printf("%s", (char *)wf->ops[i].data); break; default: break; } printf(" "); } puts(""); s = process_postfix_workflow(wf, symtab, functab); printf("%s = %ld/%ld\n", test, ((struct Rational *)s->data)->num, ((struct Rational *)s->data)->denom); sym_rational_normalize(s); printf("%s = %ld/%ld\n", test, ((struct Rational *)s->data)->num, ((struct Rational *)s->data)->denom); workflow_free(wf); // sym_free(s); strcpy(test, "(7*2)/12"); wf = inf_transform_to_reverse_postfix(functab, test); q = process_postfix_workflow(wf, symtab, functab); printf("%s = %ld/%ld\n", test, ((struct Rational *)q->data)->num, ((struct Rational *)q->data)->denom); if (sym_rational_is_eq(s, q)) printf("They are equal\n"); sym_free(q); sym_free(s); workflow_free(wf); free(test); functable_shutdown(functab); symtable_shutdown(symtab); memstat_shutdown(); return 0; }