diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2009-04-22 17:49:16 +0400 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2009-04-22 17:49:16 +0400 |
commit | 1cf4a0eb81ed85d222d3310c39ac89c84c13ca17 (patch) | |
tree | 11875bcafe1a1bb8b41ab1ef41d47c0a6d856326 /libbb | |
parent | 574c316e5ac576ba8f4aa07596dd21bca95eb333 (diff) |
httpd: simplify insane conf file parser
function old new delta
bb_simplify_abs_path_inplace - 98 +98
parse_expr 824 832 +8
passwd_main 1025 1027 +2
evalvar 1374 1376 +2
parse_command 1463 1460 -3
bb_simplify_path 137 55 -82
parse_conf 1572 1422 -150
------------------------------------------------------------------------------
(add/remove: 3/2 grow/shrink: 3/3 up/down: 126/-251) Total: -125 bytes
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/simplify_path.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/libbb/simplify_path.c b/libbb/simplify_path.c index 367f1f04d..f80e3e8a5 100644 --- a/libbb/simplify_path.c +++ b/libbb/simplify_path.c @@ -6,22 +6,13 @@ * * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ - #include "libbb.h" -char* FAST_FUNC bb_simplify_path(const char *path) +char* FAST_FUNC bb_simplify_abs_path_inplace(char *start) { - char *s, *start, *p; + char *s, *p; - if (path[0] == '/') - start = xstrdup(path); - else { - s = xrealloc_getcwd_or_warn(NULL); - start = concat_path_file(s, path); - free(s); - } p = s = start; - do { if (*p == '/') { if (*s == '/') { /* skip duplicate (or initial) slash */ @@ -47,7 +38,22 @@ char* FAST_FUNC bb_simplify_path(const char *path) if ((p == start) || (*p != '/')) { /* not a trailing slash */ ++p; /* so keep last character */ } - *p = 0; + *p = '\0'; + return p; +} + +char* FAST_FUNC bb_simplify_path(const char *path) +{ + char *s, *p; + + if (path[0] == '/') + s = xstrdup(path); + else { + p = xrealloc_getcwd_or_warn(NULL); + s = concat_path_file(p, path); + free(p); + } - return start; + bb_simplify_abs_path_inplace(s); + return s; } |