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:
Denis Vlasenko
2008-07-08 05:14:36 +00:00
parent 493829207c
commit deeed59de0
29 changed files with 123 additions and 85 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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++;
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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