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; }