hush: speed up set_local_var

function                                             old     new   delta
set_local_var                                        265     290     +25
This commit is contained in:
Denis Vlasenko 2009-04-21 11:23:56 +00:00
parent 5e34ff29bc
commit 950bd72966

View File

@ -1266,16 +1266,16 @@ static const char *get_local_var_value(const char *src)
static int set_local_var(char *str, int flg_export, int flg_read_only)
{
struct variable *cur;
char *value;
char *eq_sign;
int name_len;
value = strchr(str, '=');
if (!value) { /* not expected to ever happen? */
eq_sign = strchr(str, '=');
if (!eq_sign) { /* not expected to ever happen? */
free(str);
return -1;
}
name_len = value - str + 1; /* including '=' */
name_len = eq_sign - str + 1; /* including '=' */
cur = G.top_var; /* cannot be NULL (we have HUSH_VERSION and it's RO) */
while (1) {
if (strncmp(cur->varstr, str, name_len) != 0) {
@ -1288,7 +1288,6 @@ static int set_local_var(char *str, int flg_export, int flg_read_only)
continue;
}
/* We found an existing var with this name */
*value = '\0';
if (cur->flg_read_only) {
#if !BB_MMU
if (!flg_read_only)
@ -1297,11 +1296,13 @@ static int set_local_var(char *str, int flg_export, int flg_read_only)
free(str);
return -1;
}
//TODO: optimize out redundant unsetenv/putenv's?
debug_printf_env("%s: unsetenv '%s'\n", __func__, str);
unsetenv(str); /* just in case */
*value = '=';
if (strcmp(cur->varstr, str) == 0) {
if (flg_export == -1) {
debug_printf_env("%s: unsetenv '%s'\n", __func__, str);
*eq_sign = '\0';
unsetenv(str);
*eq_sign = '=';
}
if (strcmp(cur->varstr + name_len, eq_sign + 1) == 0) {
free_and_exp:
free(str);
goto exp;