Page MenuHomeFreeBSD

D39839.diff
No OneTemporary

D39839.diff

diff --git a/bin/sh/histedit.c b/bin/sh/histedit.c
--- a/bin/sh/histedit.c
+++ b/bin/sh/histedit.c
@@ -594,6 +594,20 @@
*(char *const *)b + curpos));
}
+static char
+**add_match(char **matches, size_t i, size_t *size, char *match_copy)
+{
+ if (match_copy == NULL)
+ return (NULL);
+ matches[i] = match_copy;
+ if (i >= *size - 1) {
+ *size *= 2;
+ matches = reallocarray(matches, *size, sizeof(matches[0]));
+ }
+
+ return (matches);
+}
+
/*
* This function is passed to libedit's fn_complete2(). The library will use
* it instead of its standard function that finds matching files in current
@@ -605,7 +619,7 @@
{
char *free_path = NULL, *path;
const char *dirname;
- char **matches = NULL;
+ char **matches = NULL, **rmatches;
size_t i = 0, size = 16, uniq;
size_t curpos = end - start, lcstring = -1;
@@ -631,7 +645,6 @@
}
while ((entry = readdir(dir)) != NULL) {
struct stat statb;
- char **rmatches;
if (strncmp(entry->d_name, text, curpos) != 0)
continue;
@@ -642,11 +655,8 @@
continue;
} else if (entry->d_type != DT_REG)
continue;
- matches[++i] = strdup(entry->d_name);
- if (i < size - 1)
- continue;
- size *= 2;
- rmatches = reallocarray(matches, size, sizeof(matches[0]));
+ rmatches = add_match(matches, ++i, &size,
+ strdup(entry->d_name));
if (rmatches == NULL) {
closedir(dir);
goto out;
@@ -655,6 +665,14 @@
}
closedir(dir);
}
+ for (const unsigned char *bp = builtincmd; *bp != 0; bp += 2 + bp[0]) {
+ if (curpos > bp[0] || memcmp(bp + 2, text, curpos) != 0)
+ continue;
+ rmatches = add_match(matches, ++i, &size, strndup(bp + 2, bp[0]));
+ if (rmatches == NULL)
+ goto out;
+ matches = rmatches;
+ }
out:
free(free_path);
if (i == 0) {

File Metadata

Mime Type
text/plain
Expires
Wed, Nov 20, 7:12 AM (21 h, 50 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14732774
Default Alt Text
D39839.diff (1 KB)

Event Timeline