libbb: make trim() return pointer to terminating NUL
No binary (build failed)
—
(log yok)
| @@ -347,7 +347,7 @@ unsigned long long monotonic_ms(void) FAST_FUNC; | |
| unsigned monotonic_sec(void) FAST_FUNC; | |
| extern void chomp(char *s) FAST_FUNC; | |
| - | extern void trim(char *s) FAST_FUNC; |
| + | extern char *trim(char *s) FAST_FUNC; |
| extern char *skip_whitespace(const char *) FAST_FUNC; | |
| extern char *skip_non_whitespace(const char *) FAST_FUNC; | |
| extern char *skip_dev_pfx(const char *tty_name) FAST_FUNC; | |
| @@ -10,9 +10,10 @@ | |
| #include "libbb.h" | |
| - | void FAST_FUNC trim(char *s) |
| + | char* FAST_FUNC trim(char *s) |
| { | |
| size_t len = strlen(s); | |
| + | size_t old = len; |
| /* trim trailing whitespace */ | |
| while (len && isspace(s[len-1])) | |
| @@ -26,5 +27,12 @@ void FAST_FUNC trim(char *s) | |
| memmove(s, nws, len); | |
| } | |
| } | |
| - | s[len] = '\0'; |
| + | |
| + | s += len; |
| + | /* If it was a "const char*" which does not need trimming, |
| + | * avoid superfluous store */ |
| + | if (old != len) |
| + | *s = '\0'; |
| + | |
| + | return s; |
| } | |
| @@ -166,9 +166,8 @@ static char *angle_address(char *str) | |
| { | |
| char *s, *e; | |
| - | trim(str); |
| - | e = last_char_is(str, '>'); |
| - | if (e) { |
| + | e = trim(str); |
| + | if (e != str && e[-1] == '>') { |
| s = strrchr(str, '<'); | |
| if (s) { | |
| *e = '\0'; | |
| @@ -37,9 +37,8 @@ static char *get_line(const char *filename, char *buf, unsigned *bufsize_p) | |
| if (sz < 0) | |
| sz = 0; | |
| buf[sz] = '\0'; | |
| - | trim(buf); |
| - | sz = strlen(buf) + 1; |
| + | sz = (trim(buf) - buf) + 1; |
| bufsize -= sz; | |
| buf += sz; | |
| buf[0] = '\0'; | |
| @@ -257,12 +257,16 @@ static int sysctl_handle_preload_file(const char *filename) | |
| parse_flags &= ~PARSE_EOL_COMMENTS; // NO (only first char) - comments are recognized even if not first char | |
| while (config_read(parser, token, 2, 2, "#=", parse_flags)) { | |
| char *tp; | |
| - | trim(token[0]); |
| + | |
| trim(token[1]); | |
| + | tp = trim(token[0]); |
| sysctl_dots_to_slashes(token[0]); | |
| - | tp = xasprintf("%s=%s", token[0], token[1]); |
| - | sysctl_act_on_setting(tp); |
| - | free(tp); |
| + | /* ^^^converted in-place. tp still points to NUL */ |
| + | /* now, add "=TOKEN1" */ |
| + | *tp++ = '='; |
| + | overlapping_strcpy(tp, token[1]); |
| + | |
| + | sysctl_act_on_setting(token[0]); |
| } | |
| if (ENABLE_FEATURE_CLEAN_UP) | |
| config_close(parser); | |