/** \file builtin_set.c Functions defining the set builtin Functions used for implementing the set builtin. */ #include #include #include #include #include #include #include #include "config.h" #include "fallback.h" #include "util.h" #include "wutil.h" #include "builtin.h" #include "env.h" #include "expand.h" #include "common.h" #include "wgetopt.h" #include "proc.h" #include "parser.h" /** Error message for invalid path operations */ #define BUILTIN_SET_PATH_ERROR L"%ls: Could not add component %ls to %ls.\n" /** Hint for invalid path operation with a colon */ #define BUILTIN_SET_PATH_HINT L"%ls: Did you mean 'set %ls $%ls %ls'?\n" /** Error for mismatch between index count and elements */ #define BUILTIN_SET_ARG_COUNT L"%ls: The number of variable indexes does not match the number of values\n" /** Test if the specified variable should be subject to path validation */ static int is_path_variable( const wchar_t *env ) { return contains_str( env, L"PATH", L"CDPATH", (void *)0 ); } /** Call env_set. If this is a path variable, e.g. PATH, validate the elements. On error, print a description of the problem to stderr. */ static int my_env_set( const wchar_t *key, array_list_t *val, int scope ) { string_buffer_t sb; int i; int retcode = 0; wchar_t *val_str=0; if( is_path_variable( key ) ) { int error = 0; for( i=0; i 1 ) { sb_printf( sb_err, BUILTIN_ERR_GLOCAL, argv[0], parser_current_line() ); builtin_print_help( argv[0], sb_err ); return 1; } /* Variables can only have one export status */ if( export && unexport ) { sb_printf( sb_err, BUILTIN_ERR_EXPUNEXP, argv[0], parser_current_line() ); builtin_print_help( argv[0], sb_err ); return 1; } /* Calculate the scope value for variable assignement */ scope = (local ? ENV_LOCAL : 0) | (global ? ENV_GLOBAL : 0) | (export ? ENV_EXPORT : 0) | (unexport ? ENV_UNEXPORT : 0) | (universal ? ENV_UNIVERSAL:0) | ENV_USER; if( query ) { /* Query mode. Return the number of variables that do not exist out of the specified variables. */ int i; for( i=woptind; i