示例#1
0
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;
}
示例#2
0
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);
}
示例#3
0
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);
}