示例#1
0
文件: env2.c 项目: Laxa/minishell
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);
  }
}
示例#2
0
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;
    }
}
示例#3
0
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);
    }
}