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
This commit is contained in:
@@ -109,6 +109,7 @@ lib-y += xfunc_die.o
|
||||
lib-y += xgetcwd.o
|
||||
lib-y += xgethostbyname.o
|
||||
lib-y += xreadlink.o
|
||||
lib-y += xrealloc_vector.o
|
||||
|
||||
# conditionally compiled objects:
|
||||
lib-$(CONFIG_FEATURE_MOUNT_LOOP) += loop.o
|
||||
|
||||
@@ -245,7 +245,7 @@ static void rewrite(FS * fs)
|
||||
{
|
||||
savech = *p3;
|
||||
*p3 = '\0';
|
||||
pr->fmt = xrealloc(pr->fmt, strlen(pr->fmt)+(p3-p2)+1);
|
||||
pr->fmt = xrealloc(pr->fmt, strlen(pr->fmt) + (p3-p2) + 1);
|
||||
strcat(pr->fmt, p2);
|
||||
*p3 = savech;
|
||||
p2 = p3;
|
||||
|
||||
@@ -42,7 +42,7 @@ char* FAST_FUNC bb_get_chunk_from_file(FILE *file, int *end)
|
||||
// free(linebuf);
|
||||
// return NULL;
|
||||
//}
|
||||
linebuf = xrealloc(linebuf, idx+1);
|
||||
linebuf = xrealloc(linebuf, idx + 1);
|
||||
linebuf[idx] = '\0';
|
||||
}
|
||||
return linebuf;
|
||||
|
||||
@@ -400,11 +400,8 @@ static void free_tab_completion_data(void)
|
||||
|
||||
static void add_match(char *matched)
|
||||
{
|
||||
int nm = num_matches;
|
||||
int nm1 = nm + 1;
|
||||
|
||||
matches = xrealloc(matches, nm1 * sizeof(char *));
|
||||
matches[nm] = matched;
|
||||
matches = xrealloc_vector(matches, 4, num_matches);
|
||||
matches[num_matches] = matched;
|
||||
num_matches++;
|
||||
}
|
||||
|
||||
|
||||
14
libbb/mtab.c
14
libbb/mtab.c
@@ -27,14 +27,14 @@ void FAST_FUNC erase_mtab(const char *name)
|
||||
}
|
||||
|
||||
while ((m = getmntent(mountTable)) != 0) {
|
||||
entries = xrealloc(entries, 3, count);
|
||||
entries[count].mnt_fsname = xstrdup(m->mnt_fsname);
|
||||
entries[count].mnt_dir = xstrdup(m->mnt_dir);
|
||||
entries[count].mnt_type = xstrdup(m->mnt_type);
|
||||
entries[count].mnt_opts = xstrdup(m->mnt_opts);
|
||||
entries[count].mnt_freq = m->mnt_freq;
|
||||
entries[count].mnt_passno = m->mnt_passno;
|
||||
i = count++;
|
||||
entries = xrealloc(entries, count * sizeof(entries[0]));
|
||||
entries[i].mnt_fsname = xstrdup(m->mnt_fsname);
|
||||
entries[i].mnt_dir = xstrdup(m->mnt_dir);
|
||||
entries[i].mnt_type = xstrdup(m->mnt_type);
|
||||
entries[i].mnt_opts = xstrdup(m->mnt_opts);
|
||||
entries[i].mnt_freq = m->mnt_freq;
|
||||
entries[i].mnt_passno = m->mnt_passno;
|
||||
}
|
||||
endmntent(mountTable);
|
||||
|
||||
|
||||
@@ -45,8 +45,8 @@ static int get_cached(cache_t *cp, unsigned id)
|
||||
for (i = 0; i < cp->size; i++)
|
||||
if (cp->cache[i].id == id)
|
||||
return i;
|
||||
i = cp->size++;
|
||||
cp->cache = xrealloc(cp->cache, cp->size * sizeof(*cp->cache));
|
||||
i = cp->size;
|
||||
cp->cache = xrealloc_vector(cp->cache, 2, cp->size++);
|
||||
cp->cache[i++].id = id;
|
||||
return -i;
|
||||
}
|
||||
@@ -59,8 +59,8 @@ static char* get_cached(cache_t *cp, unsigned id, ug_func* fp)
|
||||
for (i = 0; i < cp->size; i++)
|
||||
if (cp->cache[i].id == id)
|
||||
return cp->cache[i].name;
|
||||
i = cp->size++;
|
||||
cp->cache = xrealloc(cp->cache, cp->size * sizeof(*cp->cache));
|
||||
i = cp->size;
|
||||
cp->cache = xrealloc_vector(cp->cache, 2, cp->size++);
|
||||
cp->cache[i].id = id;
|
||||
/* Never fails. Generates numeric string if name isn't found */
|
||||
fp(cp->cache[i].name, sizeof(cp->cache[i].name), id);
|
||||
|
||||
49
libbb/read.c
49
libbb/read.c
@@ -291,3 +291,52 @@ void* FAST_FUNC xmalloc_xopen_read_close(const char *filename, size_t *sizep)
|
||||
bb_perror_msg_and_die("can't read '%s'", filename);
|
||||
return buf;
|
||||
}
|
||||
|
||||
/* libbb candidate */
|
||||
#if 0
|
||||
static void *xmalloc_read(int fd, size_t *sizep)
|
||||
{
|
||||
char *buf;
|
||||
size_t size, rd_size, total;
|
||||
off_t to_read;
|
||||
struct stat st;
|
||||
|
||||
to_read = sizep ? *sizep : INT_MAX; /* max to read */
|
||||
|
||||
/* Estimate file size */
|
||||
st.st_size = 0; /* in case fstat fails, assume 0 */
|
||||
fstat(fd, &st);
|
||||
/* /proc/N/stat files report st_size 0 */
|
||||
/* In order to make such files readable, we add small const */
|
||||
size = (st.st_size | 0x3ff) + 1;
|
||||
|
||||
total = 0;
|
||||
buf = NULL;
|
||||
while (1) {
|
||||
if (to_read < size)
|
||||
size = to_read;
|
||||
buf = xrealloc(buf, total + size + 1);
|
||||
rd_size = full_read(fd, buf + total, size);
|
||||
if ((ssize_t)rd_size < 0) { /* error */
|
||||
free(buf);
|
||||
return NULL;
|
||||
}
|
||||
total += rd_size;
|
||||
if (rd_size < size) /* EOF */
|
||||
break;
|
||||
to_read -= rd_size;
|
||||
if (to_read <= 0)
|
||||
break;
|
||||
/* grow by 1/8, but in [1k..64k] bounds */
|
||||
size = ((total / 8) | 0x3ff) + 1;
|
||||
if (size > 64*1024)
|
||||
size = 64*1024;
|
||||
}
|
||||
xrealloc(buf, total + 1);
|
||||
buf[total] = '\0';
|
||||
|
||||
if (sizep)
|
||||
*sizep = total;
|
||||
return buf;
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user