obcl/obcl.c (raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
#include "obcl.h" void cl_tree_free(GList *tree) { CLNode *tmp; if (!tree) return; for (; tree; tree = tree->next) { tmp = (CLNode*)tree->data; switch(tmp->type) { case CL_ID: case CL_STR: g_free(tmp->u.str); break; case CL_LIST: case CL_BLOCK: case CL_LISTBLOCK: g_free(tmp->u.lb.id); cl_tree_free(tmp->u.lb.list); cl_tree_free(tmp->u.lb.block); break; default: break; } g_free(tmp); } g_list_free(tree); } GList *cl_parse(gchar *file) { FILE *fh = fopen(file, "r"); GList *ret = NULL; if (fh) { ret = cl_parse_fh(fh); fclose(fh); } else { perror(file); } return ret; } void cl_tree_print(GList *tree, int depth) { CLNode *tmp; int tmpd = depth; for (; tree; tree = tree->next) { tmp = (CLNode*)tree->data; while (tmpd-- > 0) printf(" "); tmpd = depth; switch(tmp->type) { case CL_ID: printf("[ID] '%s'\n", tmp->u.str); break; case CL_STR: printf("[STR] '%s'\n", tmp->u.str); break; case CL_NUM: printf("[NUM] %.2f\n", tmp->u.num); break; case CL_LIST: printf("[LIST] '%s'\n", tmp->u.lb.id); cl_tree_print(tmp->u.lb.list, depth+2); break; case CL_BLOCK: printf("[BLOCK] '%s'\n", tmp->u.lb.id); cl_tree_print(tmp->u.lb.block, depth+2); break; case CL_LISTBLOCK: printf("[LISTBLOCK] %s\n", tmp->u.lb.id); cl_tree_print(tmp->u.lb.list, depth+2); printf("\n"); cl_tree_print(tmp->u.lb.block, depth+2); break; } } } |