static int dag_parse_variable(struct lexer *bk, struct dag_node *n) { struct token *t = lexer_next_token(bk); char mode = t->lexeme[0]; //=, or + (assign or append) lexer_free_token(t); t = lexer_next_token(bk); if(t->type != TOKEN_LITERAL) { lexer_report_error(bk, "Literal variable name expected."); } char *name = xxstrdup(t->lexeme); lexer_free_token(t); t = lexer_next_token(bk); if(t->type != TOKEN_LITERAL) { lexer_report_error(bk, "Expected LITERAL token, got: %s\n", lexer_print_token(t)); } char *value = xxstrdup(t->lexeme); lexer_free_token(t); struct hash_table *current_table; int nodeid; if(n) { current_table = n->variables; nodeid = n->nodeid; } else { current_table = bk->d->variables; nodeid = bk->d->nodeid_counter; } int result = 1; switch(mode) { case '=': dag_variable_add_value(name, current_table, nodeid, value); debug(D_MAKEFLOW_PARSER, "%s appending to variable name=%s, value=%s", (n ? "node" : "dag"), name, value); break; case '+': dag_parse_append_variable(bk, nodeid, n, name, value); debug(D_MAKEFLOW_PARSER, "%s variable name=%s, value=%s", (n ? "node" : "dag"), name, value); break; default: lexer_report_error(bk, "Unknown variable operator."); result = 0; } dag_parse_process_special_variable(bk, n, nodeid, name, value); free(name); free(value); return result; }
int dag_parse_variable(struct lexer_book *bk, struct dag_node *n, char *line) { struct dag *d = bk->d; char *name = line + (n ? 1 : 0); /* Node variables require offset of 1 */ char *value = NULL; char *equal = NULL; int append = 0; equal = strchr(line, '='); if((value = strstr(line, "+=")) && value < equal) { *value = 0; value = value + 2; append = 1; } else { value = equal; *value = 0; value = value + 1; } name = string_trim_spaces(name); value = string_trim_spaces(value); value = string_trim_quotes(value); if(strlen(name) == 0) { dag_parse_error(bk, "variable name"); return 0; } struct hash_table *current_table; int nodeid; if(n) { current_table = n->variables; nodeid = n->nodeid; } else { current_table = d->variables; nodeid = bk->d->nodeid_counter; } if(append) { dag_parse_append_variable(bk, nodeid, n, name, value); } else { dag_variable_add_value(name, current_table, nodeid, value); } dag_parse_process_special_variable(bk, n, nodeid, name, value); if(append) debug(D_DEBUG, "%s appending to variable name=%s, value=%s", (n ? "node" : "dag"), name, value); else debug(D_DEBUG, "%s variable name=%s, value=%s", (n ? "node" : "dag"), name, value); return 1; }
void dag_parse_append_variable(struct lexer_book *bk, int nodeid, struct dag_node *n, const char *name, const char *value) { struct dag_lookup_set sd = { bk->d, NULL, NULL, NULL }; struct dag_variable_value *vd = dag_lookup(name, &sd); struct dag_variable_value *v; if(n) { v = dag_get_variable_value(name, n->variables, nodeid); if(v) { dag_variable_value_append_or_create(v, value); } else { char *new_value; if(vd) { new_value = string_format("%s %s", vd->value, value); } else { new_value = xxstrdup(value); } dag_variable_add_value(name, n->variables, nodeid, new_value); free(new_value); } } else { if(vd) { dag_variable_value_append_or_create(vd, value); } else { dag_variable_add_value(name, bk->d->variables, nodeid, value); } } }
void dag_close_over_environment(struct dag *d) { //for each exported and special variable, if the variable does not have a //value assigned yet, we look for its value in the running environment char *name; struct dag_variable_value *v; set_first_element(d->special_vars); while((name = set_next_element(d->special_vars))) { v = dag_get_variable_value(name, d->variables, d->nodeid_counter); if(!v) { char *value_env = getenv(name); if(value_env) { dag_variable_add_value(name, d->variables, 0, value_env); } } } set_first_element(d->export_vars); while((name = set_next_element(d->export_vars))) { v = dag_get_variable_value(name, d->variables, d->nodeid_counter); if(!v) { char *value_env = getenv(name); if(value_env) { dag_variable_add_value(name, d->variables, 0, value_env); } } } }