void set_env_value(const char *key, const char *value, t_shell *shell) { int size; t_env *cur; char *var; size = my_strlen(key) + my_strlen(value) + 2; cur = get_env_ptr(key, shell->env); if (cur == NULL) { var = xmalloc(size); concat_env_var(var, key, value); shell->env = add_env_var(var, shell->env); } else { if (size > my_strlen(cur->var)) { var = xmalloc(size); concat_env_var(var, key, value); if (cur->var != NULL) free(cur->var); cur->var = var; } else concat_env_var(cur->var, key, value); } }
void MicEnvVar::analyze_env_var(char *env_var_string) { char *env_var_name; char *env_var_def; int card_number; int env_var_name_length; MicEnvVarKind env_var_kind; env_var_kind = get_env_var_kind(env_var_string, &card_number, &env_var_name, &env_var_name_length, &env_var_def); switch (env_var_kind) { case c_mic_var: case c_mic_card_var: add_env_var(card_number, env_var_name, env_var_name_length, env_var_def); break; case c_mic_card_env: mic_parse_env_var_list(card_number, env_var_def); break; case c_no_mic: default: break; } }
void MicEnvVar::mic_parse_env_var_list( int card_number, char *env_vars_def_list) { char *c = env_vars_def_list; char *env_var_name; int env_var_name_length; char *env_var_def; bool var_is_quoted; if (*c == '"') { c++; } while (*c != 0) { var_is_quoted = false; env_var_name = c; env_var_name_length = 0; if (isalpha(*c)) { while (isalnum(*c) || *c == '_') { c++; env_var_name_length++; } } else { LIBOFFLOAD_ERROR(c_mic_parse_env_var_list1); return; } if (*c != '=') { LIBOFFLOAD_ERROR(c_mic_parse_env_var_list2); return; } c++; if (*c == '"') { var_is_quoted = true; c++; } // Environment variable values that contain | will need to be escaped. while (*c != 0 && *c != '|' && (!var_is_quoted || *c != '"')) { // skip escaped symbol if (*c == '\\') { c++; } c++; } if (var_is_quoted) { c++; // for " while (*c != 0 && *c != '|') { c++; } } int sz = c - env_var_name; env_var_def = (char*)malloc(sz); if (env_var_def == NULL) LIBOFFLOAD_ERROR(c_malloc); memcpy(env_var_def, env_var_name, sz); env_var_def[sz] = 0; if (*c == '|') { c++; while (*c != 0 && *c == ' ') { c++; } } add_env_var(card_number, env_var_name, env_var_name_length, env_var_def); } }