Annotation of parser3/src/lib/pcre/maketables.c, revision 1.2
1.1 paf 1: /*************************************************
2: * Perl-Compatible Regular Expressions *
3: *************************************************/
4:
5: /*
6: PCRE is a library of functions to support regular expressions whose syntax
7: and semantics are as close as possible to those of the Perl 5 language.
8:
9: Written by: Philip Hazel <ph10@cam.ac.uk>
10:
11: Copyright (c) 1997-1999 University of Cambridge
12:
13: -----------------------------------------------------------------------------
14: Permission is granted to anyone to use this software for any purpose on any
15: computer system, and to redistribute it freely, subject to the following
16: restrictions:
17:
18: 1. This software is distributed in the hope that it will be useful,
19: but WITHOUT ANY WARRANTY; without even the implied warranty of
20: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21:
22: 2. The origin of this software must not be misrepresented, either by
23: explicit claim or by omission.
24:
25: 3. Altered versions must be plainly marked as such, and must not be
26: misrepresented as being the original software.
27:
28: 4. If PCRE is embedded in any software that is released under the GNU
29: General Purpose Licence (GPL), then the terms of that licence shall
30: supersede any condition above with which it is incompatible.
31: -----------------------------------------------------------------------------
32:
33: See the file Tech.Notes for some information on the internals.
34: */
35:
36:
37: /* This file is compiled on its own as part of the PCRE library. However,
38: it is also included in the compilation of dftables.c, in which case the macro
39: DFTABLES is defined. */
40:
41: #ifndef DFTABLES
42: #include "internal.h"
43: #endif
44:
45:
46:
47: /*************************************************
48: * Create PCRE character tables *
49: *************************************************/
50:
51: /* This function builds a set of character tables for use by PCRE and returns
52: a pointer to them. They are build using the ctype functions, and consequently
53: their contents will depend upon the current locale setting. When compiled as
54: part of the library, the store is obtained via pcre_malloc(), but when compiled
55: inside dftables, use malloc().
56:
57: Arguments: none
58: Returns: pointer to the contiguous block of data
59: */
60:
61: unsigned const char *
62: pcre_maketables(void)
63: {
64: unsigned char *yield, *p;
65: int i;
66:
67: #ifndef DFTABLES
68: yield = (unsigned char*)(pcre_malloc)(tables_length);
69: #else
70: yield = (unsigned char*)malloc(tables_length);
71: #endif
72:
73: if (yield == NULL) return NULL;
74: p = yield;
75:
76: /* First comes the lower casing table */
77:
1.2 ! paf 78: for (i = 0; i < 256; i++) *p++ = (unsigned char)tolower(i);
1.1 paf 79:
80: /* Next the case-flipping table */
81:
1.2 ! paf 82: for (i = 0; i < 256; i++) *p++ = (unsigned char)(islower(i)? toupper(i) : tolower(i));
1.1 paf 83:
84: /* Then the character class tables */
85:
86: memset(p, 0, cbit_length);
87: for (i = 0; i < 256; i++)
88: {
89: if (isdigit(i)) p[cbit_digit + i/8] |= 1 << (i&7);
90: if (isalnum(i) || i == '_')
91: p[cbit_word + i/8] |= 1 << (i&7);
92: if (isspace(i)) p[cbit_space + i/8] |= 1 << (i&7);
93: }
94: p += cbit_length;
95:
96: /* Finally, the character type table */
97:
98: for (i = 0; i < 256; i++)
99: {
100: int x = 0;
101: if (isspace(i)) x += ctype_space;
102: if (isalpha(i)) x += ctype_letter;
103: if (isdigit(i)) x += ctype_digit;
104: if (isxdigit(i)) x += ctype_xdigit;
105: if (isalnum(i) || i == '_') x += ctype_word;
106: if (strchr("*+?{^.$|()[", i) != 0) x += ctype_meta;
1.2 ! paf 107: *p++ = (unsigned char)x;
1.1 paf 108: }
109:
110: return yield;
111: }
112:
113: /* End of maketables.c */
E-mail: