aboutsummaryrefslogtreecommitdiffhomepage
path: root/builtin_set.cpp
diff options
context:
space:
mode:
authorGravatar Łukasz Niemier <lukasz@niemier.pl>2012-11-18 11:23:22 +0100
committerGravatar Łukasz Niemier <lukasz@niemier.pl>2012-11-18 11:23:22 +0100
commit47df1ae40adecd0a02fc7dd06ab0745cb18c3fe0 (patch)
tree13bf3e8fdcae60fdfb5fa5e26c95818dc7a49790 /builtin_set.cpp
parentb79854ad1aa814d9d35d76a1929b4726fa4bffa5 (diff)
Remove trailing whitespaces and change tabs to spaces
Diffstat (limited to 'builtin_set.cpp')
-rw-r--r--builtin_set.cpp1250
1 files changed, 625 insertions, 625 deletions
diff --git a/builtin_set.cpp b/builtin_set.cpp
index a4a2d53e..5b34227e 100644
--- a/builtin_set.cpp
+++ b/builtin_set.cpp
@@ -1,6 +1,6 @@
/** \file builtin_set.c Functions defining the set builtin
-Functions used for implementing the set builtin.
+Functions used for implementing the set builtin.
*/
#include "config.h"
@@ -49,7 +49,7 @@ extern wcstring stdout_buffer, stderr_buffer;
*/
static int is_path_variable( const wchar_t *env )
{
- return contains(env, L"PATH", L"CDPATH" );
+ return contains(env, L"PATH", L"CDPATH" );
}
/**
@@ -61,32 +61,32 @@ static int my_env_set( const wchar_t *key, const wcstring_list_t &val, int scope
size_t i;
int retcode = 0;
const wchar_t *val_str=NULL;
-
+
if( is_path_variable( key ) )
{
/* Fix for https://github.com/fish-shell/fish-shell/issues/199 . Return success if any path setting succeeds. */
bool any_success = false, any_error = false;
-
+
for( i=0; i< val.size() ; i++ )
{
bool show_perror = false;
int show_hint = 0;
bool error = false;
-
+
struct stat buff;
const wchar_t *dir = val[i].c_str();
-
+
if( wstat( dir, &buff ) )
{
error = true;
show_perror = true;
}
-
+
if( !( S_ISDIR(buff.st_mode) ) )
{
error = true;
}
-
+
if( !error )
{
any_success = true;
@@ -97,34 +97,34 @@ static int my_env_set( const wchar_t *key, const wcstring_list_t &val, int scope
const wchar_t *colon;
append_format(stderr_buffer, _(BUILTIN_SET_PATH_ERROR), L"set", dir, key);
colon = wcschr( dir, L':' );
-
- if( colon && *(colon+1) )
+
+ if( colon && *(colon+1) )
{
show_hint = 1;
}
-
+
}
-
+
if( show_perror )
{
builtin_wperror( L"set" );
}
-
+
if( show_hint )
{
append_format(stderr_buffer, _(BUILTIN_SET_PATH_HINT), L"set", key, key, wcschr( dir, L':' )+1);
}
-
+
}
-
+
/* Fail at setting the path if we tried to set it to something non-empty, but it wound up empty. */
if( ! val.empty() && ! any_success )
{
return 1;
}
-
+
}
-
+
wcstring sb;
if( val.size() )
{
@@ -138,7 +138,7 @@ static int my_env_set( const wchar_t *key, const wcstring_list_t &val, int scope
}
val_str = sb.c_str();
}
-
+
switch( env_set( key, val_str, scope | ENV_USER ) )
{
case ENV_PERM:
@@ -147,7 +147,7 @@ static int my_env_set( const wchar_t *key, const wcstring_list_t &val, int scope
retcode=1;
break;
}
-
+
case ENV_INVALID:
{
append_format(stderr_buffer, _(L"%ls: Unknown error"), L"set" );
@@ -155,160 +155,160 @@ static int my_env_set( const wchar_t *key, const wcstring_list_t &val, int scope
break;
}
}
-
+
return retcode;
}
-/**
- Extract indexes from a destination argument of the form name[index1 index2...]
+/**
+ Extract indexes from a destination argument of the form name[index1 index2...]
- \param indexes the list to insert the new indexes into
- \param src the source string to parse
- \param name the name of the element. Return null if the name in \c src does not match this name
- \param var_count the number of elements in the array to parse.
+ \param indexes the list to insert the new indexes into
+ \param src the source string to parse
+ \param name the name of the element. Return null if the name in \c src does not match this name
+ \param var_count the number of elements in the array to parse.
- \return the total number of indexes parsed, or -1 on error
+ \return the total number of indexes parsed, or -1 on error
*/
static int parse_index( std::vector<long> &indexes,
- const wchar_t *src,
- const wchar_t *name,
- size_t var_count )
+ const wchar_t *src,
+ const wchar_t *name,
+ size_t var_count )
{
- size_t len;
-
- int count = 0;
- const wchar_t *src_orig = src;
-
- if (src == 0)
- {
- return 0;
- }
-
- while (*src != L'\0' && (iswalnum(*src) || *src == L'_'))
- {
- src++;
- }
-
- if (*src != L'[')
- {
- append_format(stderr_buffer, _(BUILTIN_SET_ARG_COUNT), L"set" );
- return 0;
- }
-
- len = src-src_orig;
-
- if( (wcsncmp( src_orig, name, len )!=0) || (wcslen(name) != (len)) )
- {
- append_format(stderr_buffer,
- _(L"%ls: Multiple variable names specified in single call (%ls and %.*ls)\n"),
- L"set",
- name,
- len,
- src_orig);
- return 0;
- }
-
- src++;
-
- while (iswspace(*src))
- {
- src++;
- }
-
- while (*src != L']')
- {
- wchar_t *end;
-
- long l_ind;
-
- errno = 0;
-
- l_ind = wcstol(src, &end, 10);
-
- if( end==src || errno )
- {
- append_format(stderr_buffer, _(L"%ls: Invalid index starting at '%ls'\n"), L"set", src);
- return 0;
- }
-
- if( l_ind < 0 )
- {
- l_ind = var_count+l_ind+1;
- }
-
- src = end;
- if ( *src==L'.' && *(src+1)==L'.' ){
- src+=2;
- long l_ind2 = wcstol( src, &end, 10 );
- if( end==src || errno )
- {
- return 1;
- }
- src = end;
-
- if( l_ind2 < 0 )
- {
- l_ind2 = var_count+l_ind2+1;
- }
- int direction = l_ind2<l_ind ? -1 : 1 ;
- for (long jjj = l_ind; jjj*direction <= l_ind2*direction; jjj+=direction) {
- // debug(0, L"Expand range [set]: %i\n", jjj);
- indexes.push_back( jjj );
- count++;
- }
- }
- else {
- indexes.push_back( l_ind );
- count++;
- }
- while (iswspace(*src)) src++;
- }
-
- return count;
+ size_t len;
+
+ int count = 0;
+ const wchar_t *src_orig = src;
+
+ if (src == 0)
+ {
+ return 0;
+ }
+
+ while (*src != L'\0' && (iswalnum(*src) || *src == L'_'))
+ {
+ src++;
+ }
+
+ if (*src != L'[')
+ {
+ append_format(stderr_buffer, _(BUILTIN_SET_ARG_COUNT), L"set" );
+ return 0;
+ }
+
+ len = src-src_orig;
+
+ if( (wcsncmp( src_orig, name, len )!=0) || (wcslen(name) != (len)) )
+ {
+ append_format(stderr_buffer,
+ _(L"%ls: Multiple variable names specified in single call (%ls and %.*ls)\n"),
+ L"set",
+ name,
+ len,
+ src_orig);
+ return 0;
+ }
+
+ src++;
+
+ while (iswspace(*src))
+ {
+ src++;
+ }
+
+ while (*src != L']')
+ {
+ wchar_t *end;
+
+ long l_ind;
+
+ errno = 0;
+
+ l_ind = wcstol(src, &end, 10);
+
+ if( end==src || errno )
+ {
+ append_format(stderr_buffer, _(L"%ls: Invalid index starting at '%ls'\n"), L"set", src);
+ return 0;
+ }
+
+ if( l_ind < 0 )
+ {
+ l_ind = var_count+l_ind+1;
+ }
+
+ src = end;
+ if ( *src==L'.' && *(src+1)==L'.' ){
+ src+=2;
+ long l_ind2 = wcstol( src, &end, 10 );
+ if( end==src || errno )
+ {
+ return 1;
+ }
+ src = end;
+
+ if( l_ind2 < 0 )
+ {
+ l_ind2 = var_count+l_ind2+1;
+ }
+ int direction = l_ind2<l_ind ? -1 : 1 ;
+ for (long jjj = l_ind; jjj*direction <= l_ind2*direction; jjj+=direction) {
+ // debug(0, L"Expand range [set]: %i\n", jjj);
+ indexes.push_back( jjj );
+ count++;
+ }
+ }
+ else {
+ indexes.push_back( l_ind );
+ count++;
+ }
+ while (iswspace(*src)) src++;
+ }
+
+ return count;
}
-static int update_values( wcstring_list_t &list,
- std::vector<long> &indexes,
- wcstring_list_t &values )
+static int update_values( wcstring_list_t &list,
+ std::vector<long> &indexes,
+ wcstring_list_t &values )
{
- size_t i;
-
- /* Replace values where needed */
- for( i = 0; i < indexes.size(); i++ )
- {
- /*
- The '- 1' below is because the indices in fish are
- one-based, but the vector uses zero-based indices
- */
- long ind = indexes[i] - 1;
- const wcstring newv = values[ i ];
- if( ind < 0 )
- {
- return 1;
- }
+ size_t i;
+
+ /* Replace values where needed */
+ for( i = 0; i < indexes.size(); i++ )
+ {
+ /*
+ The '- 1' below is because the indices in fish are
+ one-based, but the vector uses zero-based indices
+ */
+ long ind = indexes[i] - 1;
+ const wcstring newv = values[ i ];
+ if( ind < 0 )
+ {
+ return 1;
+ }
if ( (size_t)ind >= list.size() )
{
list.resize( ind+1 );
}
-
-// free((void *) al_get(list, ind));
- list[ ind ] = newv;
- }
-
- return 0;
+
+// free((void *) al_get(list, ind));
+ list[ ind ] = newv;
+ }
+
+ return 0;
}
/**
- Erase from a list of wcstring values at specified indexes
+ Erase from a list of wcstring values at specified indexes
*/
-static void erase_values(wcstring_list_t &list, const std::vector<long> &indexes)
+static void erase_values(wcstring_list_t &list, const std::vector<long> &indexes)
{
// Make a set of indexes.
// This both sorts them into ascending order and removes duplicates.
const std::set<long> indexes_set(indexes.begin(), indexes.end());
-
+
// Now walk the set backwards, so we encounter larger indexes first, and remove elements at the given (1-based) indexes.
std::set<long>::const_reverse_iterator iter;
for (iter = indexes_set.rbegin(); iter != indexes_set.rend(); iter++) {
@@ -325,46 +325,46 @@ static void erase_values(wcstring_list_t &list, const std::vector<long> &indexes
Print the names of all environment variables in the scope, with or without shortening,
with or without values, with or without escaping
*/
-static void print_variables(int include_values, int esc, bool shorten_ok, int scope)
+static void print_variables(int include_values, int esc, bool shorten_ok, int scope)
{
wcstring_list_t names = env_get_names(scope);
sort(names.begin(), names.end());
-
- for( size_t i = 0; i < names.size(); i++ )
- {
- const wcstring key = names.at(i);
+
+ for( size_t i = 0; i < names.size(); i++ )
+ {
+ const wcstring key = names.at(i);
const wcstring e_key = escape_string(key, 0);
- stdout_buffer.append(e_key);
-
- if( include_values )
- {
- env_var_t value = env_get_string(key);
- if( !value.missing() )
- {
- int shorten = 0;
-
- if( shorten_ok && value.length() > 64 )
- {
- shorten = 1;
- value.resize(60);
- }
-
- wcstring e_value = esc ? expand_escape_variable(value) : value;
-
+ stdout_buffer.append(e_key);
+
+ if( include_values )
+ {
+ env_var_t value = env_get_string(key);
+ if( !value.missing() )
+ {
+ int shorten = 0;
+
+ if( shorten_ok && value.length() > 64 )
+ {
+ shorten = 1;
+ value.resize(60);
+ }
+
+ wcstring e_value = esc ? expand_escape_variable(value) : value;
+
stdout_buffer.append(L" ");
stdout_buffer.append(e_value);
-
- if( shorten )
- {
- stdout_buffer.append(L"\u2026");
- }
-
- }
- }
-
- stdout_buffer.append(L"\n");
- }
+
+ if( shorten )
+ {
+ stdout_buffer.append(L"\u2026");
+ }
+
+ }
+ }
+
+ stdout_buffer.append(L"\n");
+ }
}
@@ -373,464 +373,464 @@ static void print_variables(int include_values, int esc, bool shorten_ok, int sc
The set builtin. Creates, updates and erases environment variables
and environemnt variable arrays.
*/
-static int builtin_set( parser_t &parser, wchar_t **argv )
+static int builtin_set( parser_t &parser, wchar_t **argv )
{
-
- /**
- Variables used for parsing the argument list
- */
- static const struct woption
- long_options[] =
- {
- {
- L"export", no_argument, 0, 'x'
- }
- ,
- {
- L"global", no_argument, 0, 'g'
- }
- ,
- {
- L"local", no_argument, 0, 'l'
- }
- ,
- {
- L"erase", no_argument, 0, 'e'
- }
- ,
- {
- L"names", no_argument, 0, 'n'
- }
- ,
- {
- L"unexport", no_argument, 0, 'u'
- }
- ,
- {
- L"universal", no_argument, 0, 'U'
- }
+
+ /**
+ Variables used for parsing the argument list
+ */
+ static const struct woption
+ long_options[] =
+ {
+ {
+ L"export", no_argument, 0, 'x'
+ }
+ ,
+ {
+ L"global", no_argument, 0, 'g'
+ }
+ ,
+ {
+ L"local", no_argument, 0, 'l'
+ }
+ ,
+ {
+ L"erase", no_argument, 0, 'e'
+ }
+ ,
+ {
+ L"names", no_argument, 0, 'n'
+ }
+ ,
+ {
+ L"unexport", no_argument, 0, 'u'
+ }
+ ,
+ {
+ L"universal", no_argument, 0, 'U'
+ }
,
- {
- L"long", no_argument, 0, 'L'
- }
- ,
- {
- L"query", no_argument, 0, 'q'
- }
- ,
- {
- L"help", no_argument, 0, 'h'
- }
- ,
- {
- 0, 0, 0, 0
- }
- }
- ;
-
- const wchar_t *short_options = L"+xglenuULqh";
-
- int argc = builtin_count_args(argv);
-
- /*
- Flags to set the work mode
- */
- int local = 0, global = 0, exportv = 0;
- int erase = 0, list = 0, unexport=0;
- int universal = 0, query=0;
- bool shorten_ok = true;
-
- /*
- Variables used for performing the actual work
- */
- wchar_t *dest = 0;
- int retcode=0;
- int scope;
- int slice=0;
- int i;
-
- wchar_t *bad_char;
-
-
- /* Parse options to obtain the requested operation and the modifiers */
- woptind = 0;
- while (1)
- {
- int c = wgetopt_long(argc, argv, short_options, long_options, 0);
-
- if (c == -1)
- {
- break;
- }
-
- switch(c)
- {
- case 0:
- break;
-
- case 'e':
- erase = 1;
- break;
-
- case 'n':
- list = 1;
- break;
-
- case 'x':
- exportv = 1;
- break;
-
- case 'l':
- local = 1;
- break;
-
- case 'g':
- global = 1;
- break;
-
- case 'u':
- unexport = 1;
- break;
-
- case 'U':
- universal = 1;
- break;
-
+ {
+ L"long", no_argument, 0, 'L'
+ }
+ ,
+ {
+ L"query", no_argument, 0, 'q'
+ }
+ ,
+ {
+ L"help", no_argument, 0, 'h'
+ }
+ ,
+ {
+ 0, 0, 0, 0
+ }
+ }
+ ;
+
+ const wchar_t *short_options = L"+xglenuULqh";
+
+ int argc = builtin_count_args(argv);
+
+ /*
+ Flags to set the work mode
+ */
+ int local = 0, global = 0, exportv = 0;
+ int erase = 0, list = 0, unexport=0;
+ int universal = 0, query=0;
+ bool shorten_ok = true;
+
+ /*
+ Variables used for performing the actual work
+ */
+ wchar_t *dest = 0;
+ int retcode=0;
+ int scope;
+ int slice=0;
+ int i;
+
+ wchar_t *bad_char;
+
+
+ /* Parse options to obtain the requested operation and the modifiers */
+ woptind = 0;
+ while (1)
+ {
+ int c = wgetopt_long(argc, argv, short_options, long_options, 0);
+
+ if (c == -1)
+ {
+ break;
+ }
+
+ switch(c)
+ {
+ case 0:
+ break;
+
+ case 'e':
+ erase = 1;
+ break;
+
+ case 'n':
+ list = 1;
+ break;
+
+ case 'x':
+ exportv = 1;
+ break;
+
+ case 'l':
+ local = 1;
+ break;
+
+ case 'g':
+ global = 1;
+ break;
+
+ case 'u':
+ unexport = 1;
+ break;
+
+ case 'U':
+ universal = 1;
+ break;
+
case 'L':
shorten_ok = false;
break;
- case 'q':
- query = 1;
- break;
-
- case 'h':
- builtin_print_help( parser, argv[0], stdout_buffer );
- return 0;
-
- case '?':
- builtin_unknown_option( parser, argv[0], argv[woptind-1] );
- return 1;
-
- default:
- break;
- }
- }
-
- /*
- Ok, all arguments have been parsed, let's validate them
- */
-
- /*
- If we are checking the existance of a variable (-q) we can not
- also specify scope
- */
-
- if( query && (erase || list) )
- {
- append_format(stderr_buffer,
- BUILTIN_ERR_COMBO,
- argv[0] );
-
- builtin_print_help( parser, argv[0], stderr_buffer );
- return 1;
- }
-
-
- /* We can't both list and erase varaibles */
- if( erase && list )
- {
- append_format(stderr_buffer,
- BUILTIN_ERR_COMBO,
- argv[0] );
-
- builtin_print_help( parser, argv[0], stderr_buffer );
- return 1;
- }
-
- /*
- Variables can only have one scope
- */
- if( local + global + universal > 1 )
- {
- append_format(stderr_buffer,
- BUILTIN_ERR_GLOCAL,
- argv[0] );
- builtin_print_help( parser, argv[0], stderr_buffer );
- return 1;
- }
-
- /*
- Variables can only have one export status
- */
- if( exportv && unexport )
- {
- append_format(stderr_buffer,
- BUILTIN_ERR_EXPUNEXP,
- argv[0] );
- builtin_print_help( parser, argv[0], stderr_buffer );
- return 1;
- }
-
- /*
- Calculate the scope value for variable assignement
- */
- scope = (local ? ENV_LOCAL : 0) | (global ? ENV_GLOBAL : 0) | (exportv ? 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<argc; i++ )
- {
- wchar_t *arg = argv[i];
- int slice=0;
-
- if( !(dest = wcsdup(arg)))
- {
- DIE_MEM();
- }
-
- if( wcschr( dest, L'[' ) )
- {
- slice = 1;
- *wcschr( dest, L'[' )=0;
- }
-
- if( slice )
- {
- std::vector<long> indexes;
- wcstring_list_t result;
- size_t j;
-
+ case 'q':
+ query = 1;
+ break;
+
+ case 'h':
+ builtin_print_help( parser, argv[0], stdout_buffer );
+ return 0;
+
+ case '?':
+ builtin_unknown_option( parser, argv[0], argv[woptind-1] );
+ return 1;
+
+ default:
+ break;
+ }
+ }
+
+ /*
+ Ok, all arguments have been parsed, let's validate them
+ */
+
+ /*
+ If we are checking the existance of a variable (-q) we can not
+ also specify scope
+ */
+
+ if( query && (erase || list) )
+ {
+ append_format(stderr_buffer,
+ BUILTIN_ERR_COMBO,
+ argv[0] );
+
+ builtin_print_help( parser, argv[0], stderr_buffer );
+ return 1;
+ }
+
+
+ /* We can't both list and erase varaibles */
+ if( erase && list )
+ {
+ append_format(stderr_buffer,
+ BUILTIN_ERR_COMBO,
+ argv[0] );
+
+ builtin_print_help( parser, argv[0], stderr_buffer );
+ return 1;
+ }
+
+ /*
+ Variables can only have one scope
+ */
+ if( local + global + universal > 1 )
+ {
+ append_format(stderr_buffer,
+ BUILTIN_ERR_GLOCAL,
+ argv[0] );
+ builtin_print_help( parser, argv[0], stderr_buffer );
+ return 1;
+ }
+
+ /*
+ Variables can only have one export status
+ */
+ if( exportv && unexport )
+ {
+ append_format(stderr_buffer,
+ BUILTIN_ERR_EXPUNEXP,
+ argv[0] );
+ builtin_print_help( parser, argv[0], stderr_buffer );
+ return 1;
+ }
+
+ /*
+ Calculate the scope value for variable assignement
+ */
+ scope = (local ? ENV_LOCAL : 0) | (global ? ENV_GLOBAL : 0) | (exportv ? 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<argc; i++ )
+ {
+ wchar_t *arg = argv[i];
+ int slice=0;
+
+ if( !(dest = wcsdup(arg)))
+ {
+ DIE_MEM();
+ }
+
+ if( wcschr( dest, L'[' ) )
+ {
+ slice = 1;
+ *wcschr( dest, L'[' )=0;
+ }
+
+ if( slice )
+ {
+ std::vector<long> indexes;
+ wcstring_list_t result;
+ size_t j;
+
env_var_t dest_str = env_get_string(dest);
if (! dest_str.missing())
tokenize_variable_array( dest_str, result );
-
- if( !parse_index( indexes, arg, dest, result.size() ) )
- {
- builtin_print_help( parser, argv[0], stderr_buffer );
- retcode = 1;
- break;
- }
- for( j=0; j < indexes.size() ; j++ )
- {
- long idx = indexes[j];
- if( idx < 1 || (size_t)idx > result.size() )
- {
- retcode++;
- }
- }
- }
- else
- {
- if( !env_exist( arg, scope ) )
- {
- retcode++;
- }
- }
-
- free( dest );
-
- }
- return retcode;
- }
-
- if( list )
- {
- /* Maybe we should issue an error if there are any other arguments? */
- print_variables(0, 0, shorten_ok, scope);
- return 0;
- }
-
- if( woptind == argc )
- {
- /*
- Print values of variables
- */
-
- if( erase )
- {
- append_format(stderr_buffer,
- _(L"%ls: Erase needs a variable name\n"),
- argv[0] );
-
- builtin_print_help( parser, argv[0], stderr_buffer );
- retcode = 1;
- }
- else
- {
- print_variables( 1, 1, shorten_ok, scope );
- }
-
- return retcode;
- }
-
- if( !(dest = wcsdup(argv[woptind])))
- {
- DIE_MEM();
- }
-
- if( wcschr( dest, L'[' ) )
- {
- slice = 1;
- *wcschr( dest, L'[' )=0;
- }
-
- if( !wcslen( dest ) )
- {
- free( dest );
- append_format(stderr_buffer, BUILTIN_ERR_VARNAME_ZERO, argv[0] );
- builtin_print_help( parser, argv[0], stderr_buffer );
- return 1;
- }
-
- if( (bad_char = wcsvarname( dest ) ) )
- {
- append_format(stderr_buffer, BUILTIN_ERR_VARCHAR, argv[0], *bad_char );
- builtin_print_help( parser, argv[0], stderr_buffer );
- free( dest );
- return 1;
- }
-
- if( slice && erase && (scope != ENV_USER) )
- {
- free( dest );
- append_format(stderr_buffer, _(L"%ls: Can not specify scope when erasing array slice\n"), argv[0] );
- builtin_print_help( parser, argv[0], stderr_buffer );
- return 1;
- }
-
- /*
- set assignment can work in two modes, either using slices or
- using the whole array. We detect which mode is used here.
- */
-
- if( slice )
- {
-
- /*
- Slice mode
- */
- size_t idx_count, val_count;
- wcstring_list_t values;
- std::vector<long> indexes;
- wcstring_list_t result;
-
+
+ if( !parse_index( indexes, arg, dest, result.size() ) )
+ {
+ builtin_print_help( parser, argv[0], stderr_buffer );
+ retcode = 1;
+ break;
+ }
+ for( j=0; j < indexes.size() ; j++ )
+ {
+ long idx = indexes[j];
+ if( idx < 1 || (size_t)idx > result.size() )
+ {
+ retcode++;
+ }
+ }
+ }
+ else
+ {
+ if( !env_exist( arg, scope ) )
+ {
+ retcode++;
+ }
+ }
+
+ free( dest );
+
+ }
+ return retcode;
+ }
+
+ if( list )
+ {
+ /* Maybe we should issue an error if there are any other arguments? */
+ print_variables(0, 0, shorten_ok, scope);
+ return 0;
+ }
+
+ if( woptind == argc )
+ {
+ /*
+ Print values of variables
+ */
+
+ if( erase )
+ {
+ append_format(stderr_buffer,
+ _(L"%ls: Erase needs a variable name\n"),
+ argv[0] );
+
+ builtin_print_help( parser, argv[0], stderr_buffer );
+ retcode = 1;
+ }
+ else
+ {
+ print_variables( 1, 1, shorten_ok, scope );
+ }
+
+ return retcode;
+ }
+
+ if( !(dest = wcsdup(argv[woptind])))
+ {
+ DIE_MEM();
+ }
+
+ if( wcschr( dest, L'[' ) )
+ {
+ slice = 1;
+ *wcschr( dest, L'[' )=0;
+ }
+
+ if( !wcslen( dest ) )
+ {
+ free( dest );
+ append_format(stderr_buffer, BUILTIN_ERR_VARNAME_ZERO, argv[0] );
+ builtin_print_help( parser, argv[0], stderr_buffer );
+ return 1;
+ }
+
+ if( (bad_char = wcsvarname( dest ) ) )
+ {
+ append_format(stderr_buffer, BUILTIN_ERR_VARCHAR, argv[0], *bad_char );
+ builtin_print_help( parser, argv[0], stderr_buffer );
+ free( dest );
+ return 1;
+ }
+
+ if( slice && erase && (scope != ENV_USER) )
+ {
+ free( dest );
+ append_format(stderr_buffer, _(L"%ls: Can not specify scope when erasing array slice\n"), argv[0] );
+ builtin_print_help( parser, argv[0], stderr_buffer );
+ return 1;
+ }
+
+ /*
+ set assignment can work in two modes, either using slices or
+ using the whole array. We detect which mode is used here.
+ */
+
+ if( slice )
+ {
+
+ /*
+ Slice mode
+ */
+ size_t idx_count, val_count;
+ wcstring_list_t values;
+ std::vector<long> indexes;
+ wcstring_list_t result;
+
const env_var_t dest_str = env_get_string(dest);
if (! dest_str.missing())
tokenize_variable_array( dest_str, result );
-
- for( ; woptind<argc; woptind++ )
- {
- if( !parse_index( indexes, argv[woptind], dest, result.size() ) )
- {
- builtin_print_help( parser, argv[0], stderr_buffer );
- retcode = 1;
- break;
- }
-
- val_count = argc-woptind-1;
- idx_count = indexes.size();
-
- if( !erase )
- {
- if( val_count < idx_count )
- {
- append_format(stderr_buffer, _(BUILTIN_SET_ARG_COUNT), argv[0] );
- builtin_print_help( parser, argv[0], stderr_buffer );
- retcode=1;
- break;
- }
- if( val_count == idx_count )
- {
- woptind++;
- break;
- }
- }
- }
-
- if( !retcode )
- {
- /*
- Slice indexes have been calculated, do the actual work
- */
-
- if( erase )
- {
- erase_values(result, indexes);
- my_env_set( dest, result, scope);
- }
- else
- {
- wcstring_list_t value;
-// al_init(&value);
-
- while( woptind < argc )
- {
- value.push_back( argv[woptind++] );
- }
-
- if( update_values( result,
- indexes,
- value ) )
- {
- append_format(stderr_buffer, L"%ls: ", argv[0] );
- append_format(stderr_buffer, ARRAY_BOUNDS_ERR );
- stderr_buffer.push_back(L'\n');
- }
-
- my_env_set(dest, result, scope);
-
-// al_destroy( &value );
-
- }
- }
-
-// al_foreach( &result, &free );
-// al_destroy( &result );
-
-// al_destroy(&indexes);
-// al_destroy(&values);
-
- }
- else
- {
- woptind++;
-
- /*
- No slicing
- */
- if( erase )
- {
- if( woptind != argc )
- {
- append_format(stderr_buffer,
- _(L"%ls: Values cannot be specfied with erase\n"),
- argv[0] );
- builtin_print_help( parser, argv[0], stderr_buffer );
- retcode=1;
- }
- else
- {
- retcode = env_remove( dest, scope );
- }
- }
- else
- {
+
+ for( ; woptind<argc; woptind++ )
+ {
+ if( !parse_index( indexes, argv[woptind], dest, result.size() ) )
+ {
+ builtin_print_help( parser, argv[0], stderr_buffer );
+ retcode = 1;
+ break;
+ }
+
+ val_count = argc-woptind-1;
+ idx_count = indexes.size();
+
+ if( !erase )
+ {
+ if( val_count < idx_count )
+ {
+ append_format(stderr_buffer, _(BUILTIN_SET_ARG_COUNT), argv[0] );
+ builtin_print_help( parser, argv[0], stderr_buffer );
+ retcode=1;
+ break;
+ }
+ if( val_count == idx_count )
+ {
+ woptind++;
+ break;
+ }
+ }
+ }
+
+ if( !retcode )
+ {
+ /*
+ Slice indexes have been calculated, do the actual work
+ */
+
+ if( erase )
+ {
+ erase_values(result, indexes);
+ my_env_set( dest, result, scope);
+ }
+ else
+ {
+ wcstring_list_t value;
+// al_init(&value);
+
+ while( woptind < argc )
+ {
+ value.push_back( argv[woptind++] );
+ }
+
+ if( update_values( result,
+ indexes,
+ value ) )
+ {
+ append_format(stderr_buffer, L"%ls: ", argv[0] );
+ append_format(stderr_buffer, ARRAY_BOUNDS_ERR );
+ stderr_buffer.push_back(L'\n');
+ }
+
+ my_env_set(dest, result, scope);
+
+// al_destroy( &value );
+
+ }
+ }
+
+// al_foreach( &result, &free );
+// al_destroy( &result );
+
+// al_destroy(&indexes);
+// al_destroy(&values);
+
+ }
+ else
+ {
+ woptind++;
+
+ /*
+ No slicing
+ */
+ if( erase )
+ {
+ if( woptind != argc )
+ {
+ append_format(stderr_buffer,
+ _(L"%ls: Values cannot be specfied with erase\n"),
+ argv[0] );
+ builtin_print_help( parser, argv[0], stderr_buffer );
+ retcode=1;
+ }
+ else
+ {
+ retcode = env_remove( dest, scope );
+ }
+ }
+ else
+ {
wcstring_list_t val;
- for( i=woptind; i<argc; i++ )
+ for( i=woptind; i<argc; i++ )
val.push_back(argv[i]);
- retcode = my_env_set( dest, val, scope );
- }
- }
-
- free( dest );
-
- return retcode;
+ retcode = my_env_set( dest, val, scope );
+ }
+ }
+
+ free( dest );
+
+ return retcode;
}