--- src/user.c.orig Fri Nov 29 09:03:53 2002 +++ src/user.c Tue Jun 15 03:15:09 2004 @@ -138,19 +138,14 @@ } /* Copy the variable name */ - var_name = g_malloc (dots - p); - strncpy (var_name, p+4, dots-2 - (p+3)); - var_name [dots-2 - (p+3)] = 0; - + var_name = g_strndup (p + 4, dots - p - 5); value = getenv (var_name); g_free (var_name); if (value){ *v = g_strdup (value); return q-p; } - var_name = g_malloc (q - dots + 1); - strncpy (var_name, dots, q - dots + 1); - var_name [q-dots] = 0; + var_name = g_strndup (dots, q - dots); *v = var_name; return q-p; } @@ -300,13 +295,15 @@ /* Copies a whitespace separated argument from p to arg. Returns the point after argument. */ -static char *extract_arg (char *p, char *arg) +static char *extract_arg (char *p, char *arg, size_t size) { while (*p && (*p == ' ' || *p == '\t' || *p == '\n')) p++; /* support quote space .mnu */ - while (*p && (*p != ' ' || *(p-1) == '\\') && *p != '\t' && *p != '\n') + while (size > 1 && *p && (*p != ' ' || *(p-1) == '\\') && *p != '\t' && *p != '\n') { *arg++ = *p++; + size--; + } *arg = 0; if (!*p || *p == '\n') p --; @@ -389,29 +386,29 @@ p--; break; case 'f': /* file name pattern */ - p = extract_arg (p, arg); + p = extract_arg (p, arg, sizeof (arg)); *condition = panel && regexp_match (arg, panel->dir.list [panel->selected].fname, match_file); break; case 'y': /* syntax pattern */ if (edit_widget && edit_widget->syntax_type) { - p = extract_arg (p, arg); + p = extract_arg (p, arg, sizeof (arg)); *condition = panel && regexp_match (arg, edit_widget->syntax_type, match_normal); } break; case 'd': - p = extract_arg (p, arg); + p = extract_arg (p, arg, sizeof (arg)); *condition = panel && regexp_match (arg, panel->cwd, match_file); break; case 't': - p = extract_arg (p, arg); + p = extract_arg (p, arg, sizeof (arg)); *condition = panel && test_type (panel, arg); break; case 'x': /* executable */ { struct stat status; - p = extract_arg (p, arg); + p = extract_arg (p, arg, sizeof (arg)); if (stat (arg, &status) == 0) *condition = is_exe (status.st_mode); else @@ -431,50 +428,43 @@ static void debug_out (char *start, char *end, int cond) { - static char msg [256]; + static char *msg; int len; if (start == NULL && end == NULL){ - if (cond == 0){ - /* Init */ - msg [0] = 0; - } else { - /* Show output */ - if (!debug_flag) - return; + /* Show output */ + if (debug_flag && msg) { len = strlen (msg); if (len) msg [len - 1] = 0; message (0, _(" Debug "), "%s", msg); - debug_flag = 0; } + debug_flag = 0; + g_free (msg); + msg = NULL; } else { + char *type, *p; + /* Save debug info for later output */ if (!debug_flag) return; /* Save the result of the condition */ if (debug_error){ - strcat (msg, _(" ERROR: ")); + type = _(" ERROR: "); debug_error = 0; } else if (cond) - strcat (msg, _(" True: ")); + type = _(" True: "); else - strcat (msg, _(" False: ")); - /* Copy condition statement */ - len = strlen (msg); - if (end == NULL){ - /* Copy one character */ - msg [len] = *start; - msg [len + 1] = 0; - } else { - /* Copy many characters */ - while (start < end){ - msg [len++] = *start++; - } - msg [len] = 0; - } - strcat (msg, " \n"); + type = _(" False: "); + /* This is for debugging, don't need to be super efficient. */ + if (end == NULL) + p = g_strdup_printf ("%s%s%c \n", msg ? msg : "", type, *start); + else + p = g_strdup_printf ("%s%s%.*s \n", msg ? msg : "", type, + (int) (end - start), start); + g_free (msg); + msg = p; } } @@ -486,8 +476,6 @@ char operator; char *debug_start, *debug_end; - /* Init debugger */ - debug_out (NULL, NULL, 0); /* Repeat till end of line */ while (*p && *p != '\n') { /* support quote space .mnu */ @@ -578,6 +566,8 @@ break; while (*commands == ' ' || *commands == '\t') commands++; + if (*commands == '0') + break; } col++; if (*commands == '\n') @@ -734,7 +724,7 @@ } else if (*p == '+'){ if (*(p+1) == '='){ /* Combined adding and default */ - p = test_line (edit_widget, p, &accept_entry); + p = test_line (edit_widget, p + 1, &accept_entry); if (selected == 0 && accept_entry) selected = menu_lines; } else { @@ -744,7 +734,7 @@ } else if (*p == '='){ if (*(p+1) == '+'){ /* Combined adding and default */ - p = test_line (edit_widget, p, &accept_entry); + p = test_line (edit_widget, p + 1, &accept_entry); if (selected == 0 && accept_entry) selected = menu_lines; } else {