diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-07-08 05:14:36 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-07-08 05:14:36 +0000 |
commit | deeed59de0a9bcc068ebd14d7496a6b26e45b890 (patch) | |
tree | 7dafd469e9f6bca107adbf930fe77fff9958a0b6 /libbb | |
parent | 493829207c1c2a36d55aaa13abf806533d0cb87f (diff) | |
download | busybox-w32-deeed59de0a9bcc068ebd14d7496a6b26e45b890.tar.gz busybox-w32-deeed59de0a9bcc068ebd14d7496a6b26e45b890.tar.bz2 busybox-w32-deeed59de0a9bcc068ebd14d7496a6b26e45b890.zip |
libbb: introduce and use xrealloc_vector
function old new delta
xrealloc_vector_helper - 51 +51
create_list 84 99 +15
getopt_main 690 695 +5
passwd_main 1049 1053 +4
get_cached 85 89 +4
msh_main 1377 1380 +3
add_match 42 41 -1
read_lines 720 718 -2
grave 1068 1066 -2
fill_match_lines 143 141 -2
add_to_dirlist 67 65 -2
add_input_file 49 47 -2
act 252 250 -2
fsck_main 2252 2246 -6
man_main 765 757 -8
bb_internal_initgroups 228 220 -8
cut_main 1052 1041 -11
add_edge_to_node 55 43 -12
dpkg_main 3851 3835 -16
ifupdown_main 2202 2178 -24
sort_main 838 812 -26
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 5/15 up/down: 82/-124) Total: -42 bytes
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/Kbuild | 1 | ||||
-rw-r--r-- | libbb/dump.c | 2 | ||||
-rw-r--r-- | libbb/get_line_from_file.c | 2 | ||||
-rw-r--r-- | libbb/lineedit.c | 7 | ||||
-rw-r--r-- | libbb/mtab.c | 14 | ||||
-rw-r--r-- | libbb/procps.c | 8 | ||||
-rw-r--r-- | libbb/read.c | 49 |
7 files changed, 65 insertions, 18 deletions
diff --git a/libbb/Kbuild b/libbb/Kbuild index 5cbecd537..c49297b12 100644 --- a/libbb/Kbuild +++ b/libbb/Kbuild | |||
@@ -109,6 +109,7 @@ lib-y += xfunc_die.o | |||
109 | lib-y += xgetcwd.o | 109 | lib-y += xgetcwd.o |
110 | lib-y += xgethostbyname.o | 110 | lib-y += xgethostbyname.o |
111 | lib-y += xreadlink.o | 111 | lib-y += xreadlink.o |
112 | lib-y += xrealloc_vector.o | ||
112 | 113 | ||
113 | # conditionally compiled objects: | 114 | # conditionally compiled objects: |
114 | lib-$(CONFIG_FEATURE_MOUNT_LOOP) += loop.o | 115 | lib-$(CONFIG_FEATURE_MOUNT_LOOP) += loop.o |
diff --git a/libbb/dump.c b/libbb/dump.c index c45595285..8a90aac5a 100644 --- a/libbb/dump.c +++ b/libbb/dump.c | |||
@@ -245,7 +245,7 @@ static void rewrite(FS * fs) | |||
245 | { | 245 | { |
246 | savech = *p3; | 246 | savech = *p3; |
247 | *p3 = '\0'; | 247 | *p3 = '\0'; |
248 | pr->fmt = xrealloc(pr->fmt, strlen(pr->fmt)+(p3-p2)+1); | 248 | pr->fmt = xrealloc(pr->fmt, strlen(pr->fmt) + (p3-p2) + 1); |
249 | strcat(pr->fmt, p2); | 249 | strcat(pr->fmt, p2); |
250 | *p3 = savech; | 250 | *p3 = savech; |
251 | p2 = p3; | 251 | p2 = p3; |
diff --git a/libbb/get_line_from_file.c b/libbb/get_line_from_file.c index 66ea5a1a5..3a76f49a0 100644 --- a/libbb/get_line_from_file.c +++ b/libbb/get_line_from_file.c | |||
@@ -42,7 +42,7 @@ char* FAST_FUNC bb_get_chunk_from_file(FILE *file, int *end) | |||
42 | // free(linebuf); | 42 | // free(linebuf); |
43 | // return NULL; | 43 | // return NULL; |
44 | //} | 44 | //} |
45 | linebuf = xrealloc(linebuf, idx+1); | 45 | linebuf = xrealloc(linebuf, idx + 1); |
46 | linebuf[idx] = '\0'; | 46 | linebuf[idx] = '\0'; |
47 | } | 47 | } |
48 | return linebuf; | 48 | return linebuf; |
diff --git a/libbb/lineedit.c b/libbb/lineedit.c index 3ef47ba71..a46b5d2c4 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c | |||
@@ -400,11 +400,8 @@ static void free_tab_completion_data(void) | |||
400 | 400 | ||
401 | static void add_match(char *matched) | 401 | static void add_match(char *matched) |
402 | { | 402 | { |
403 | int nm = num_matches; | 403 | matches = xrealloc_vector(matches, 4, num_matches); |
404 | int nm1 = nm + 1; | 404 | matches[num_matches] = matched; |
405 | |||
406 | matches = xrealloc(matches, nm1 * sizeof(char *)); | ||
407 | matches[nm] = matched; | ||
408 | num_matches++; | 405 | num_matches++; |
409 | } | 406 | } |
410 | 407 | ||
diff --git a/libbb/mtab.c b/libbb/mtab.c index 57654a695..2c171322a 100644 --- a/libbb/mtab.c +++ b/libbb/mtab.c | |||
@@ -27,14 +27,14 @@ void FAST_FUNC erase_mtab(const char *name) | |||
27 | } | 27 | } |
28 | 28 | ||
29 | while ((m = getmntent(mountTable)) != 0) { | 29 | while ((m = getmntent(mountTable)) != 0) { |
30 | entries = xrealloc(entries, 3, count); | ||
31 | entries[count].mnt_fsname = xstrdup(m->mnt_fsname); | ||
32 | entries[count].mnt_dir = xstrdup(m->mnt_dir); | ||
33 | entries[count].mnt_type = xstrdup(m->mnt_type); | ||
34 | entries[count].mnt_opts = xstrdup(m->mnt_opts); | ||
35 | entries[count].mnt_freq = m->mnt_freq; | ||
36 | entries[count].mnt_passno = m->mnt_passno; | ||
30 | i = count++; | 37 | i = count++; |
31 | entries = xrealloc(entries, count * sizeof(entries[0])); | ||
32 | entries[i].mnt_fsname = xstrdup(m->mnt_fsname); | ||
33 | entries[i].mnt_dir = xstrdup(m->mnt_dir); | ||
34 | entries[i].mnt_type = xstrdup(m->mnt_type); | ||
35 | entries[i].mnt_opts = xstrdup(m->mnt_opts); | ||
36 | entries[i].mnt_freq = m->mnt_freq; | ||
37 | entries[i].mnt_passno = m->mnt_passno; | ||
38 | } | 38 | } |
39 | endmntent(mountTable); | 39 | endmntent(mountTable); |
40 | 40 | ||
diff --git a/libbb/procps.c b/libbb/procps.c index 7d49d83ce..a5168a077 100644 --- a/libbb/procps.c +++ b/libbb/procps.c | |||
@@ -45,8 +45,8 @@ static int get_cached(cache_t *cp, unsigned id) | |||
45 | for (i = 0; i < cp->size; i++) | 45 | for (i = 0; i < cp->size; i++) |
46 | if (cp->cache[i].id == id) | 46 | if (cp->cache[i].id == id) |
47 | return i; | 47 | return i; |
48 | i = cp->size++; | 48 | i = cp->size; |
49 | cp->cache = xrealloc(cp->cache, cp->size * sizeof(*cp->cache)); | 49 | cp->cache = xrealloc_vector(cp->cache, 2, cp->size++); |
50 | cp->cache[i++].id = id; | 50 | cp->cache[i++].id = id; |
51 | return -i; | 51 | return -i; |
52 | } | 52 | } |
@@ -59,8 +59,8 @@ static char* get_cached(cache_t *cp, unsigned id, ug_func* fp) | |||
59 | for (i = 0; i < cp->size; i++) | 59 | for (i = 0; i < cp->size; i++) |
60 | if (cp->cache[i].id == id) | 60 | if (cp->cache[i].id == id) |
61 | return cp->cache[i].name; | 61 | return cp->cache[i].name; |
62 | i = cp->size++; | 62 | i = cp->size; |
63 | cp->cache = xrealloc(cp->cache, cp->size * sizeof(*cp->cache)); | 63 | cp->cache = xrealloc_vector(cp->cache, 2, cp->size++); |
64 | cp->cache[i].id = id; | 64 | cp->cache[i].id = id; |
65 | /* Never fails. Generates numeric string if name isn't found */ | 65 | /* Never fails. Generates numeric string if name isn't found */ |
66 | fp(cp->cache[i].name, sizeof(cp->cache[i].name), id); | 66 | fp(cp->cache[i].name, sizeof(cp->cache[i].name), id); |
diff --git a/libbb/read.c b/libbb/read.c index 7b804125a..405e216dc 100644 --- a/libbb/read.c +++ b/libbb/read.c | |||
@@ -291,3 +291,52 @@ void* FAST_FUNC xmalloc_xopen_read_close(const char *filename, size_t *sizep) | |||
291 | bb_perror_msg_and_die("can't read '%s'", filename); | 291 | bb_perror_msg_and_die("can't read '%s'", filename); |
292 | return buf; | 292 | return buf; |
293 | } | 293 | } |
294 | |||
295 | /* libbb candidate */ | ||
296 | #if 0 | ||
297 | static void *xmalloc_read(int fd, size_t *sizep) | ||
298 | { | ||
299 | char *buf; | ||
300 | size_t size, rd_size, total; | ||
301 | off_t to_read; | ||
302 | struct stat st; | ||
303 | |||
304 | to_read = sizep ? *sizep : INT_MAX; /* max to read */ | ||
305 | |||
306 | /* Estimate file size */ | ||
307 | st.st_size = 0; /* in case fstat fails, assume 0 */ | ||
308 | fstat(fd, &st); | ||
309 | /* /proc/N/stat files report st_size 0 */ | ||
310 | /* In order to make such files readable, we add small const */ | ||
311 | size = (st.st_size | 0x3ff) + 1; | ||
312 | |||
313 | total = 0; | ||
314 | buf = NULL; | ||
315 | while (1) { | ||
316 | if (to_read < size) | ||
317 | size = to_read; | ||
318 | buf = xrealloc(buf, total + size + 1); | ||
319 | rd_size = full_read(fd, buf + total, size); | ||
320 | if ((ssize_t)rd_size < 0) { /* error */ | ||
321 | free(buf); | ||
322 | return NULL; | ||
323 | } | ||
324 | total += rd_size; | ||
325 | if (rd_size < size) /* EOF */ | ||
326 | break; | ||
327 | to_read -= rd_size; | ||
328 | if (to_read <= 0) | ||
329 | break; | ||
330 | /* grow by 1/8, but in [1k..64k] bounds */ | ||
331 | size = ((total / 8) | 0x3ff) + 1; | ||
332 | if (size > 64*1024) | ||
333 | size = 64*1024; | ||
334 | } | ||
335 | xrealloc(buf, total + 1); | ||
336 | buf[total] = '\0'; | ||
337 | |||
338 | if (sizep) | ||
339 | *sizep = total; | ||
340 | return buf; | ||
341 | } | ||
342 | #endif | ||