libbb: auto_string() for efficient handling of temporary malloced stirngs
No binary (build failed)
—
(log yok)
| @@ -692,6 +692,7 @@ int bb_putchar(int ch) FAST_FUNC; | |
| /* Note: does not use stdio, writes to fd 2 directly */ | |
| int bb_putchar_stderr(char ch) FAST_FUNC; | |
| char *xasprintf(const char *format, ...) __attribute__ ((format(printf, 1, 2))) FAST_FUNC RETURNS_MALLOC; | |
| + | char *auto_string(char *str) FAST_FUNC; |
| // gcc-4.1.1 still isn't good enough at optimizing it | |
| // (+200 bytes compared to macro) | |
| //static ALWAYS_INLINE | |
| @@ -0,0 +1,23 @@ | |
| + | /* vi: set sw=4 ts=4: */ |
| + | /* |
| + | * Utility routines. |
| + | * |
| + | * Copyright (C) 2015 Denys Vlasenko |
| + | * |
| + | * Licensed under GPLv2, see file LICENSE in this source tree. |
| + | */ |
| + | //kbuild:lib-y += auto_string.o |
| + | |
| + | #include "libbb.h" |
| + | |
| + | char* FAST_FUNC auto_string(char *str) |
| + | { |
| + | static char *saved[4]; |
| + | static uint8_t cur_saved; /* = 0 */ |
| + | |
| + | free(saved[cur_saved]); |
| + | saved[cur_saved] = str; |
| + | cur_saved = (cur_saved + 1) & (ARRAY_SIZE(saved)-1); |
| + | |
| + | return str; |
| + | } |
| @@ -11,9 +11,6 @@ | |
| const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str) | |
| { | |
| - | static char *saved[4]; |
| - | static unsigned cur_saved; /* = 0 */ |
| - | |
| char *dst; | |
| const char *s; | |
| @@ -56,10 +53,5 @@ const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str) | |
| } | |
| } | |
| #endif | |
| - | |
| - | free(saved[cur_saved]); |
| - | saved[cur_saved] = dst; |
| - | cur_saved = (cur_saved + 1) & (ARRAY_SIZE(saved)-1); |
| - | |
| - | return dst; |
| + | return auto_string(dst); |
| } | |
| @@ -86,7 +86,8 @@ int FAST_FUNC ll_remember_index(const struct sockaddr_nl *who UNUSED_PARAM, | |
| return 0; | |
| } | |
| - | const char FAST_FUNC *ll_idx_n2a(int idx, char *buf) |
| + | static |
| + | const char FAST_FUNC *ll_idx_n2a(int idx/*, char *buf*/) |
| { | |
| struct idxmap *im; | |
| @@ -95,15 +96,15 @@ const char FAST_FUNC *ll_idx_n2a(int idx, char *buf) | |
| im = find_by_index(idx); | |
| if (im) | |
| return im->name; | |
| - | snprintf(buf, 16, "if%d", idx); |
| - | return buf; |
| + | //snprintf(buf, 16, "if%d", idx); |
| + | //return buf; |
| + | return auto_string(xasprintf("if%d", idx)); |
| } | |
| const char FAST_FUNC *ll_index_to_name(int idx) | |
| { | |
| - | static char nbuf[16]; |
| - | |
| - | return ll_idx_n2a(idx, nbuf); |
| + | //static char nbuf[16]; |
| + | return ll_idx_n2a(idx/*, nbuf*/); |
| } | |
| #ifdef UNUSED | |
| @@ -7,8 +7,8 @@ PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN | |
| int ll_remember_index(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) FAST_FUNC; | |
| int ll_init_map(struct rtnl_handle *rth) FAST_FUNC; | |
| int xll_name_to_index(const char *name) FAST_FUNC; | |
| + | //static: const char *ll_idx_n2a(int idx, char *buf) FAST_FUNC; |
| const char *ll_index_to_name(int idx) FAST_FUNC; | |
| - | const char *ll_idx_n2a(int idx, char *buf) FAST_FUNC; |
| /* int ll_index_to_type(int idx); */ | |
| unsigned ll_index_to_flags(int idx) FAST_FUNC; | |