Ejemplo n.º 1
0
// xxx comment me ...
static mapper_t* mapper_put_alloc(sllv_t* pasts) {
	mapper_put_state_t* pstate = mlr_malloc_or_die(sizeof(mapper_put_state_t));
	pstate->num_evaluators = pasts->length;
	pstate->output_field_names = mlr_malloc_or_die(pasts->length * sizeof(char*));
	pstate->pevaluators = mlr_malloc_or_die(pasts->length * sizeof(lrec_evaluator_t*));

	int i = 0;
	for (sllve_t* pe = pasts->phead; pe != NULL; pe = pe->pnext, i++) {
		mlr_dsl_ast_node_t* past = pe->pvdata;

		if ((past->type != MLR_DSL_AST_NODE_TYPE_OPERATOR) || !streq(past->text, "=")) {
			fprintf(stderr,
				"Expected assignment-rooted AST; got operator \"%s\" with node type %s.\n",
					past->text, mlr_dsl_ast_node_describe_type(past->type));
			return NULL;
		} else if ((past->pchildren == NULL) || (past->pchildren->length != 2)) {
			fprintf(stderr, "xxx write this error message please.\n");
			return NULL;
		}

		mlr_dsl_ast_node_t* pleft  = past->pchildren->phead->pvdata;
		mlr_dsl_ast_node_t* pright = past->pchildren->phead->pnext->pvdata;

		if (pleft->type != MLR_DSL_AST_NODE_TYPE_FIELD_NAME) {
			fprintf(stderr, "xxx write this error message please.\n");
			return NULL;
		} else if (pleft->pchildren != NULL) {
			fprintf(stderr, "xxx write this error message please.\n");
			return NULL;
		}

		char* output_field_name = pleft->text;
		lrec_evaluator_t* pevaluator = lrec_evaluator_alloc_from_ast(pright);

		pstate->pevaluators[i] = pevaluator;
		pstate->output_field_names[i] = output_field_name;
	}

	mapper_t* pmapper = mlr_malloc_or_die(sizeof(mapper_t));

	pmapper->pvstate       = (void*)pstate;
	pmapper->pprocess_func = mapper_put_process;
	pmapper->pfree_func    = mapper_put_free;

	return pmapper;
}
Ejemplo n.º 2
0
// ----------------------------------------------------------------
static mlr_dsl_cst_statement_t* cst_statement_alloc(mlr_dsl_ast_node_t* past, int type_inferencing) {
	mlr_dsl_cst_statement_t* pstatement = mlr_malloc_or_die(sizeof(mlr_dsl_cst_statement_t));

	pstatement->ast_node_type = past->type;
	pstatement->pitems = sllv_alloc();

	if (past->type == MD_AST_NODE_TYPE_SREC_ASSIGNMENT) {
		if ((past->pchildren == NULL) || (past->pchildren->length != 2)) {
			fprintf(stderr, "%s: internal coding error detected in file %s at line %d.\n",
				MLR_GLOBALS.argv0, __FILE__, __LINE__);
			exit(1);
		}

		mlr_dsl_ast_node_t* pleft  = past->pchildren->phead->pvvalue;
		mlr_dsl_ast_node_t* pright = past->pchildren->phead->pnext->pvvalue;

		if (pleft->type != MD_AST_NODE_TYPE_FIELD_NAME) {
			fprintf(stderr, "%s: internal coding error detected in file %s at line %d.\n",
				MLR_GLOBALS.argv0, __FILE__, __LINE__);
			exit(1);
		} else if (pleft->pchildren != NULL) {
			fprintf(stderr, "%s: coding error detected in file %s at line %d.\n",
				MLR_GLOBALS.argv0, __FILE__, __LINE__);
			exit(1);
		}

		sllv_add(pstatement->pitems, mlr_dsl_cst_statement_item_alloc(
			pleft->text,
			MLR_DSL_CST_LHS_TYPE_SREC,
			lrec_evaluator_alloc_from_ast(pright, type_inferencing)));

	} else if (past->type == MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT) {
		if ((past->pchildren == NULL) || (past->pchildren->length != 2)) {
			fprintf(stderr, "%s: internal coding error detected in file %s at line %d.\n",
				MLR_GLOBALS.argv0, __FILE__, __LINE__);
			exit(1);
		}

		mlr_dsl_ast_node_t* pleft  = past->pchildren->phead->pvvalue;
		mlr_dsl_ast_node_t* pright = past->pchildren->phead->pnext->pvvalue;

		if (pleft->type != MD_AST_NODE_TYPE_OOSVAR_NAME) {
			fprintf(stderr, "%s: internal coding error detected in file %s at line %d.\n",
				MLR_GLOBALS.argv0, __FILE__, __LINE__);
			exit(1);
		} else if (pleft->pchildren != NULL) {
			fprintf(stderr, "%s: coding error detected in file %s at line %d.\n",
				MLR_GLOBALS.argv0, __FILE__, __LINE__);
			exit(1);
		}

		sllv_add(pstatement->pitems, mlr_dsl_cst_statement_item_alloc(
			pleft->text,
			MLR_DSL_CST_LHS_TYPE_OOSVAR,
			lrec_evaluator_alloc_from_ast(pright, type_inferencing)));

	} else if (past->type == MD_AST_NODE_TYPE_MOOSVAR_ASSIGNMENT) {
		// xxx stub: make an sllv of lrec_evaluators.
	} else if (past->type == MD_AST_NODE_TYPE_FILTER) {
		mlr_dsl_ast_node_t* pnode = past->pchildren->phead->pvvalue;
		sllv_add(pstatement->pitems, mlr_dsl_cst_statement_item_alloc(
			NULL,
			MLR_DSL_CST_LHS_TYPE_OOSVAR,
			lrec_evaluator_alloc_from_ast(pnode, type_inferencing)));

	} else if (past->type == MD_AST_NODE_TYPE_GATE) {
		mlr_dsl_ast_node_t* pnode = past->pchildren->phead->pvvalue;
		sllv_add(pstatement->pitems, mlr_dsl_cst_statement_item_alloc(
			NULL,
			MLR_DSL_CST_LHS_TYPE_OOSVAR,
			lrec_evaluator_alloc_from_ast(pnode, type_inferencing)));

	} else if (past->type == MD_AST_NODE_TYPE_EMIT) {
		// Loop over oosvar names to emit in e.g. 'emit @a, @b, @c'.
		for (sllve_t* pe = past->pchildren->phead; pe != NULL; pe = pe->pnext) {
			mlr_dsl_ast_node_t* pnode = pe->pvvalue;
			sllv_add(pstatement->pitems, mlr_dsl_cst_statement_item_alloc(
				pnode->text,
				MLR_DSL_CST_LHS_TYPE_OOSVAR,
				lrec_evaluator_alloc_from_ast(pnode, type_inferencing)));
		}

	} else if (past->type == MD_AST_NODE_TYPE_DUMP) {
		// xxx stub

	} else { // Bare-boolean statement
		sllv_add(pstatement->pitems, mlr_dsl_cst_statement_item_alloc(
			NULL,
			MLR_DSL_CST_LHS_TYPE_OOSVAR, // xxx wtf
			lrec_evaluator_alloc_from_ast(past, type_inferencing)));
	}

	return pstatement;
}