]> granicus.if.org Git - apache/blob - server/gen_test_char.c
Sander's Stylistic Submission
[apache] / server / gen_test_char.c
1 /* ====================================================================
2  * The Apache Software License, Version 1.1
3  *
4  * Copyright (c) 2000-2001 The Apache Software Foundation.  All rights
5  * reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in
16  *    the documentation and/or other materials provided with the
17  *    distribution.
18  *
19  * 3. The end-user documentation included with the redistribution,
20  *    if any, must include the following acknowledgment:
21  *       "This product includes software developed by the
22  *        Apache Software Foundation (http://www.apache.org/)."
23  *    Alternately, this acknowledgment may appear in the software itself,
24  *    if and wherever such third-party acknowledgments normally appear.
25  *
26  * 4. The names "Apache" and "Apache Software Foundation" must
27  *    not be used to endorse or promote products derived from this
28  *    software without prior written permission. For written
29  *    permission, please contact apache@apache.org.
30  *
31  * 5. Products derived from this software may not be called "Apache",
32  *    nor may "Apache" appear in their name, without prior written
33  *    permission of the Apache Software Foundation.
34  *
35  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
39  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46  * SUCH DAMAGE.
47  * ====================================================================
48  *
49  * This software consists of voluntary contributions made by many
50  * individuals on behalf of the Apache Software Foundation.  For more
51  * information on the Apache Software Foundation, please see
52  * <http://www.apache.org/>.
53  *
54  * Portions of this software are based upon public domain software
55  * originally written at the National Center for Supercomputing Applications,
56  * University of Illinois, Urbana-Champaign.
57  */
58
59 #include "apr.h"
60 #include "apr_lib.h"
61
62 #if APR_HAVE_STDIO_H
63 #include <stdio.h>
64 #endif
65
66 /* we need some of the portability definitions... for strchr */
67 #include "httpd.h"
68
69 /* A bunch of functions in util.c scan strings looking for certain characters.
70  * To make that more efficient we encode a lookup table.
71  */
72 #define T_ESCAPE_SHELL_CMD    (0x01)
73 #define T_ESCAPE_PATH_SEGMENT (0x02)
74 #define T_OS_ESCAPE_PATH      (0x04)
75 #define T_HTTP_TOKEN_STOP     (0x08)
76
77 int main(int argc, char *argv[])
78 {
79     unsigned c;
80     unsigned char flags;
81
82     printf("/* this file is automatically generated by gen_test_char, "
83            "do not edit */\n"
84            "#define T_ESCAPE_SHELL_CMD     (%u)\n"
85            "#define T_ESCAPE_PATH_SEGMENT  (%u)\n"
86            "#define T_OS_ESCAPE_PATH       (%u)\n"
87            "#define T_HTTP_TOKEN_STOP      (%u)\n"
88            "\n"
89            "static const unsigned char test_char_table[256] = {\n"
90            "    0,",
91            T_ESCAPE_SHELL_CMD,
92            T_ESCAPE_PATH_SEGMENT,
93            T_OS_ESCAPE_PATH,
94            T_HTTP_TOKEN_STOP);
95
96     /* we explicitly dealt with NUL above
97      * in case some strchr() do bogosity with it */
98
99     for (c = 1; c < 256; ++c) {
100         flags = 0;
101         if (c % 20 == 0)
102             printf("\n    ");
103
104         /* escape_shell_cmd */
105         if (strchr("&;`'\"|*?~<>^()[]{}$\\\n", c)) {
106             flags |= T_ESCAPE_SHELL_CMD;
107         }
108
109         if (!apr_isalnum(c) && !strchr("$-_.+!*'(),:@&=~", c)) {
110             flags |= T_ESCAPE_PATH_SEGMENT;
111         }
112
113         if (!apr_isalnum(c) && !strchr("$-_.+!*'(),:@&=/~", c)) {
114             flags |= T_OS_ESCAPE_PATH;
115         }
116
117         /* these are the "tspecials" from RFC2068 */
118         if (apr_iscntrl(c) || strchr(" \t()<>@,;:\\/[]?={}", c)) {
119             flags |= T_HTTP_TOKEN_STOP;
120         }
121
122         printf("%u%c", flags, (c < 255) ? ',' : ' ');
123
124     }
125
126     printf("\n};\n");
127
128     return 0;
129 }