|
1 /************************************************* |
|
2 * Perl-Compatible Regular Expressions * |
|
3 *************************************************/ |
|
4 |
|
5 /* PCRE is a library of functions to support regular expressions whose syntax |
|
6 and semantics are as close as possible to those of the Perl 5 language. |
|
7 |
|
8 Written by Philip Hazel |
|
9 Copyright (c) 1997-2008 University of Cambridge |
|
10 |
|
11 ----------------------------------------------------------------------------- |
|
12 Redistribution and use in source and binary forms, with or without |
|
13 modification, are permitted provided that the following conditions are met: |
|
14 |
|
15 * Redistributions of source code must retain the above copyright notice, |
|
16 this list of conditions and the following disclaimer. |
|
17 |
|
18 * Redistributions in binary form must reproduce the above copyright |
|
19 notice, this list of conditions and the following disclaimer in the |
|
20 documentation and/or other materials provided with the distribution. |
|
21 |
|
22 * Neither the name of the University of Cambridge nor the names of its |
|
23 contributors may be used to endorse or promote products derived from |
|
24 this software without specific prior written permission. |
|
25 |
|
26 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|
27 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
28 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
29 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
|
30 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|
31 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|
32 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|
33 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|
34 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
35 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|
36 POSSIBILITY OF SUCH DAMAGE. |
|
37 ----------------------------------------------------------------------------- |
|
38 */ |
|
39 |
|
40 |
|
41 /* This is a freestanding support program to generate a file containing |
|
42 character tables for PCRE. The tables are built according to the current |
|
43 locale. Now that pcre_maketables is a function visible to the outside world, we |
|
44 make use of its code from here in order to be consistent. */ |
|
45 |
|
46 #ifdef HAVE_CONFIG_H |
|
47 #include "config.h" |
|
48 #endif |
|
49 |
|
50 #include <ctype.h> |
|
51 #include <stdio.h> |
|
52 #include <string.h> |
|
53 #include <locale.h> |
|
54 |
|
55 #include "pcre_internal.h" |
|
56 |
|
57 #define DFTABLES /* pcre_maketables.c notices this */ |
|
58 #include "pcre_maketables.c" |
|
59 |
|
60 |
|
61 int main(int argc, char **argv) |
|
62 { |
|
63 FILE *f; |
|
64 int i = 1; |
|
65 const unsigned char *tables; |
|
66 const unsigned char *base_of_tables; |
|
67 |
|
68 /* By default, the default C locale is used rather than what the building user |
|
69 happens to have set. However, if the -L option is given, set the locale from |
|
70 the LC_xxx environment variables. */ |
|
71 |
|
72 if (argc > 1 && strcmp(argv[1], "-L") == 0) |
|
73 { |
|
74 setlocale(LC_ALL, ""); /* Set from environment variables */ |
|
75 i++; |
|
76 } |
|
77 |
|
78 if (argc < i + 1) |
|
79 { |
|
80 fprintf(stderr, "dftables: one filename argument is required\n"); |
|
81 return 1; |
|
82 } |
|
83 |
|
84 tables = pcre_maketables(); |
|
85 base_of_tables = tables; |
|
86 |
|
87 f = fopen(argv[i], "wb"); |
|
88 if (f == NULL) |
|
89 { |
|
90 fprintf(stderr, "dftables: failed to open %s for writing\n", argv[1]); |
|
91 return 1; |
|
92 } |
|
93 |
|
94 /* There are several fprintf() calls here, because gcc in pedantic mode |
|
95 complains about the very long string otherwise. */ |
|
96 |
|
97 fprintf(f, |
|
98 "/*************************************************\n" |
|
99 "* Perl-Compatible Regular Expressions *\n" |
|
100 "*************************************************/\n\n" |
|
101 "/* This file was automatically written by the dftables auxiliary\n" |
|
102 "program. It contains character tables that are used when no external\n" |
|
103 "tables are passed to PCRE by the application that calls it. The tables\n" |
|
104 "are used only for characters whose code values are less than 256.\n\n"); |
|
105 fprintf(f, |
|
106 "The following #includes are present because without them gcc 4.x may remove\n" |
|
107 "the array definition from the final binary if PCRE is built into a static\n" |
|
108 "library and dead code stripping is activated. This leads to link errors.\n" |
|
109 "Pulling in the header ensures that the array gets flagged as \"someone\n" |
|
110 "outside this compilation unit might reference this\" and so it will always\n" |
|
111 "be supplied to the linker. */\n\n" |
|
112 "#ifdef HAVE_CONFIG_H\n" |
|
113 "#include \"config.h\"\n" |
|
114 "#endif\n\n" |
|
115 "#include \"pcre_internal.h\"\n\n"); |
|
116 fprintf(f, |
|
117 "const unsigned char _pcre_default_tables[] = {\n\n" |
|
118 "/* This table is a lower casing table. */\n\n"); |
|
119 |
|
120 fprintf(f, " "); |
|
121 for (i = 0; i < 256; i++) |
|
122 { |
|
123 if ((i & 7) == 0 && i != 0) fprintf(f, "\n "); |
|
124 fprintf(f, "%3d", *tables++); |
|
125 if (i != 255) fprintf(f, ","); |
|
126 } |
|
127 fprintf(f, ",\n\n"); |
|
128 |
|
129 fprintf(f, "/* This table is a case flipping table. */\n\n"); |
|
130 |
|
131 fprintf(f, " "); |
|
132 for (i = 0; i < 256; i++) |
|
133 { |
|
134 if ((i & 7) == 0 && i != 0) fprintf(f, "\n "); |
|
135 fprintf(f, "%3d", *tables++); |
|
136 if (i != 255) fprintf(f, ","); |
|
137 } |
|
138 fprintf(f, ",\n\n"); |
|
139 |
|
140 fprintf(f, |
|
141 "/* This table contains bit maps for various character classes.\n" |
|
142 "Each map is 32 bytes long and the bits run from the least\n" |
|
143 "significant end of each byte. The classes that have their own\n" |
|
144 "maps are: space, xdigit, digit, upper, lower, word, graph\n" |
|
145 "print, punct, and cntrl. Other classes are built from combinations. */\n\n"); |
|
146 |
|
147 fprintf(f, " "); |
|
148 for (i = 0; i < cbit_length; i++) |
|
149 { |
|
150 if ((i & 7) == 0 && i != 0) |
|
151 { |
|
152 if ((i & 31) == 0) fprintf(f, "\n"); |
|
153 fprintf(f, "\n "); |
|
154 } |
|
155 fprintf(f, "0x%02x", *tables++); |
|
156 if (i != cbit_length - 1) fprintf(f, ","); |
|
157 } |
|
158 fprintf(f, ",\n\n"); |
|
159 |
|
160 fprintf(f, |
|
161 "/* This table identifies various classes of character by individual bits:\n" |
|
162 " 0x%02x white space character\n" |
|
163 " 0x%02x letter\n" |
|
164 " 0x%02x decimal digit\n" |
|
165 " 0x%02x hexadecimal digit\n" |
|
166 " 0x%02x alphanumeric or '_'\n" |
|
167 " 0x%02x regular expression metacharacter or binary zero\n*/\n\n", |
|
168 ctype_space, ctype_letter, ctype_digit, ctype_xdigit, ctype_word, |
|
169 ctype_meta); |
|
170 |
|
171 fprintf(f, " "); |
|
172 for (i = 0; i < 256; i++) |
|
173 { |
|
174 if ((i & 7) == 0 && i != 0) |
|
175 { |
|
176 fprintf(f, " /* "); |
|
177 if (isprint(i-8)) fprintf(f, " %c -", i-8); |
|
178 else fprintf(f, "%3d-", i-8); |
|
179 if (isprint(i-1)) fprintf(f, " %c ", i-1); |
|
180 else fprintf(f, "%3d", i-1); |
|
181 fprintf(f, " */\n "); |
|
182 } |
|
183 fprintf(f, "0x%02x", *tables++); |
|
184 if (i != 255) fprintf(f, ","); |
|
185 } |
|
186 |
|
187 fprintf(f, "};/* "); |
|
188 if (isprint(i-8)) fprintf(f, " %c -", i-8); |
|
189 else fprintf(f, "%3d-", i-8); |
|
190 if (isprint(i-1)) fprintf(f, " %c ", i-1); |
|
191 else fprintf(f, "%3d", i-1); |
|
192 fprintf(f, " */\n\n/* End of pcre_chartables.c */\n"); |
|
193 |
|
194 fclose(f); |
|
195 free((void *)base_of_tables); |
|
196 return 0; |
|
197 } |
|
198 |
|
199 /* End of dftables.c */ |