static void test_spaces_and_fail_position_correct(void) { ASSERT_FAIL(" 'b' c", PE_INVALID_EXPRESSION) assert_string_equal("'b' c", get_last_position()); ASSERT_FAIL(" a b", PE_INVALID_EXPRESSION) assert_string_equal("a b", get_last_position()); }
static void report_parsing_error(ParsingErrors error) { if(error == PE_INVALID_EXPRESSION) { text_buffer_addf("%s: %s", "Invalid expression", get_last_position()); } else if(error == PE_MISSING_QUOTE) { text_buffer_addf("%s: %s", "Invalid :let expression (missing quote)", get_last_position()); } else { assert(0 && "Unexpected parsing error code."); } }
char * eval_arglist(const char args[], const char **stop_ptr) { size_t len = 0; char *eval_result = NULL; assert(args[0] != '\0'); while(args[0] != '\0') { char *free_this = NULL; const char *tmp_result = NULL; var_t result = var_false(); const ParsingErrors parsing_error = parse(args, &result); if(parsing_error == PE_INVALID_EXPRESSION && is_prev_token_whitespace()) { result = get_parsing_result(); tmp_result = free_this = var_to_string(result); args = get_last_parsed_char(); } else if(parsing_error == PE_NO_ERROR) { tmp_result = free_this = var_to_string(result); args = get_last_position(); } if(tmp_result == NULL) { var_free(result); break; } if(!is_null_or_empty(eval_result)) { eval_result = extend_string(eval_result, " ", &len); } eval_result = extend_string(eval_result, tmp_result, &len); var_free(result); free(free_this); args = skip_whitespace(args); } if(args[0] == '\0') { return eval_result; } else { free(eval_result); *stop_ptr = args; return NULL; } }
int let_variable(const char *cmd) { char name[VAR_NAME_MAX + 1]; char *p; int append = 0; var_t res_var; char *str_var; ParsingErrors parsing_error; assert(initialized); /* currently we support only environment variables */ if(*cmd != '$') { text_buffer_add("Incorrect variable type"); return -1; } cmd++; /* copy variable name */ p = name; while(*cmd != '\0' && char_is_one_of(ENV_VAR_NAME_CHARS, *cmd) && *cmd != '.' && *cmd != '=' && p - name < sizeof(name) - 1) { if(*cmd != '_' && !isalnum(*cmd)) { text_buffer_add("Incorrect variable name"); return -1; } *p++ = *cmd++; } /* test for empty variable name */ if(p == name) { text_buffer_addf("%s: %s", "Unsupported variable name", "empty name"); return -1; } *p = '\0'; cmd = skip_whitespace(cmd); /* check for dot and skip it */ if(*cmd == '.') { append = 1; cmd++; } /* check for equal sign and skip it */ if(*cmd != '=') { text_buffer_addf("%s: %s", "Incorrect :let statement", "'=' expected"); return -1; } parsing_error = parse(cmd + 1, &res_var); if(parsing_error != PE_NO_ERROR) { report_parsing_error(parsing_error); return -1; } if(get_last_position() != NULL && *get_last_position() != '\0') { text_buffer_addf("%s: %s", "Incorrect :let statement", "trailing characters"); return -1; } /* update environment variable */ str_var = var_to_string(res_var); if(append) append_envvar(name, str_var); else set_envvar(name, str_var); free(str_var); var_free(res_var); return 0; }