diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-05-02 00:50:38 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-05-02 00:50:38 +0200 |
commit | 48a29defcaeb3e3bbf32ae6ed3f77de2101e083a (patch) | |
tree | 1bff5f988c896a92d422d3ee9613eb329357e9f7 /networking | |
parent | 9c35a1cfb642c1d02cdfdc2290d9310606bdd72f (diff) |
httpd: speed up httpd.conf at the cost of 49 bytes of code
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking')
-rw-r--r-- | networking/httpd.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/networking/httpd.c b/networking/httpd.c index b8aa02fe4..52b2b2a7a 100644 --- a/networking/httpd.c +++ b/networking/httpd.c @@ -530,27 +530,39 @@ static void parse_conf(const char *path, int flag) while (fgets(buf, sizeof(buf), f) != NULL) { unsigned strlen_buf; unsigned char ch; - char *after_colon = NULL; + char *after_colon; { /* remove all whitespace, and # comments */ char *p, *p0; - p = p0 = buf; - while ((ch = *p0++) != '\0' && ch != '#') { - if (!isspace(ch)) { + p0 = buf; + /* skip non-whitespace beginning. Often the whole line + * is non-whitespace. We want this case to work fast, + * without needless copying, therefore we don't merge + * this operation into next while loop. */ + while ((ch = *p0) != '\0' && ch != '\n' && ch != '#' + && ch != ' ' && ch != '\t' + ) { + p0++; + } + p = p0; + /* if we enter this loop, we have some whitespace. + * discard it */ + while (ch != '\0' && ch != '\n' && ch != '#') { + if (ch != ' ' && ch != '\t') { *p++ = ch; - if (ch == ':' && after_colon == NULL) - after_colon = p; } + ch = *++p0; } *p = '\0'; strlen_buf = p - buf; if (strlen_buf == 0) - continue; + continue; /* empty line */ } + after_colon = strchr(buf, ':'); /* strange line? */ - if (after_colon == NULL || *after_colon == '\0') + if (after_colon == NULL || *++after_colon == '\0') goto config_error; ch = (buf[0] & ~0x20); /* toupper if it's a letter */ |