void vex_Free(struct vex **pvex) { if ((*pvex)->lhs != NULL) { if ((*pvex)->lhs->tags != NULL) vbit_destroy((*pvex)->lhs->tags); if ((*pvex)->lhs->prefix != NULL) free((*pvex)->lhs->prefix); FREE_OBJ((*pvex)->lhs); } if ((*pvex)->rhs != NULL) { if ((*pvex)->rhs->val_string) free((*pvex)->rhs->val_string); if ((*pvex)->rhs->val_regex) VRE_free(&(*pvex)->rhs->val_regex); FREE_OBJ((*pvex)->rhs); } if ((*pvex)->a != NULL) { vex_Free(&(*pvex)->a); AZ((*pvex)->a); } if ((*pvex)->b != NULL) { vex_Free(&(*pvex)->b); AZ((*pvex)->b); } FREE_OBJ(*pvex); *pvex = NULL; }
struct vex * vxp_Parse(struct vxp *vxp) { struct vex *vex = NULL; vxp->t = VTAILQ_FIRST(&vxp->tokens); if (vxp->t == NULL) return (NULL); vxp_expr(vxp, &vex); if (vxp->err) { if (vex) vex_Free(&vex); AZ(vex); return (NULL); } return (vex); }
int main(int argc, char **argv) { struct vsb *vsb; struct vex *vex; char *q_arg = NULL; char opt; while ((opt = getopt(argc, argv, "q:")) != -1) { switch (opt) { case 'q': REPLACE(q_arg, optarg); break; default: usage(); } } if (q_arg == NULL || optind != argc) usage(); vsb = VSB_new_auto(); AN(vsb); vex = vex_New(q_arg, vsb); if (vex == NULL) { VSB_finish(vsb); fprintf(stderr, "Error:\n%s", VSB_data(vsb)); VSB_delete(vsb); free(q_arg); exit(1); } VSB_delete(vsb); vex_Free(&vex); AZ(vex); free(q_arg); return (0); }