Index: source/alias.c =================================================================== RCS file: /home/cvs/ircii/source/alias.c,v retrieving revision 1.173 diff -p -u -r1.173 alias.c --- source/alias.c 12 Dec 2016 19:54:29 -0000 1.173 +++ source/alias.c 29 Jan 2017 00:34:52 -0000 @@ -591,6 +591,28 @@ lastop(u_char *ptr) return ptr; } +/* Convert foo[bar][baz] into foo.bar.baz. */ +static u_char * +bracket_to_dot(u_char *ptr) +{ + u_char *left, *right, *s; + + while ((left = my_index(ptr, '[')) != NULL) + { + *left++ = '.'; + if ((right = matching_bracket(left, '[', ']')) != NULL) + { + *right++ = '\0'; + /* can't use strcat here, overlapping strings */ + for (s = ptr; *right; s++, right++) + *s++ = *right; + } + else + break; + } + return ptr; +} + #define NU_EXPR 0 #define NU_CONJ NU_EXPR #define NU_ASSN 1 @@ -645,7 +667,7 @@ next_unit(u_char *str, u_char *args, int got_sloshed = 0; continue; } - switch(*ptr) + switch (*ptr) { case '\\': got_sloshed = 1; @@ -1010,9 +1032,6 @@ next_unit(u_char *str, u_char *args, int case '=': if (ptr[1] != '=') { - u_char *left_bracket, - *right_bracket; - if (stage != NU_ASSN) { ptr = lastop(ptr); @@ -1026,20 +1045,9 @@ next_unit(u_char *str, u_char *args, int lastc = result1 + my_strlen(result1) - 1; while (lastc > result1 && *lastc == ' ') *lastc-- = '\0'; - for (ptr = result1; *ptr == ' '; ptr++); - while ((left_bracket = my_index(ptr, '[')) - != NULL) - { - *left_bracket++='.'; - if ((right_bracket = matching_bracket( - left_bracket, '[', ']')) != NULL) - { - *right_bracket++ = '\0'; - my_strcat(ptr, right_bracket); - } - else - break; - } + for (ptr = result1; *ptr == ' '; ptr++) + /* nothing */; + bracket_to_dot(ptr); if (*ptr) add_alias(VAR_ALIAS, ptr, result2); else