Line data Source code
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-2000 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 0 : pcre_maketables(void) 63 : { 64 : unsigned char *yield, *p; 65 : int i; 66 : 67 : #ifndef DFTABLES 68 0 : yield = (unsigned char*)(pcre_malloc)(tables_length); 69 : #else 70 : yield = (unsigned char*)malloc(tables_length); 71 : #endif 72 : 73 0 : if (yield == NULL) return NULL; 74 0 : p = yield; 75 : 76 : /* First comes the lower casing table */ 77 : 78 0 : for (i = 0; i < 256; i++) *p++ = tolower(i); 79 : 80 : /* Next the case-flipping table */ 81 : 82 0 : for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i); 83 : 84 : /* Then the character class tables. Don't try to be clever and save effort 85 : on exclusive ones - in some locales things may be different. */ 86 : 87 0 : memset(p, 0, cbit_length); 88 0 : for (i = 0; i < 256; i++) 89 : { 90 0 : if (isdigit(i)) 91 : { 92 0 : p[cbit_digit + i/8] |= 1 << (i&7); 93 0 : p[cbit_word + i/8] |= 1 << (i&7); 94 : } 95 0 : if (isupper(i)) 96 : { 97 0 : p[cbit_upper + i/8] |= 1 << (i&7); 98 0 : p[cbit_word + i/8] |= 1 << (i&7); 99 : } 100 0 : if (islower(i)) 101 : { 102 0 : p[cbit_lower + i/8] |= 1 << (i&7); 103 0 : p[cbit_word + i/8] |= 1 << (i&7); 104 : } 105 0 : if (i == '_') p[cbit_word + i/8] |= 1 << (i&7); 106 0 : if (isspace(i)) p[cbit_space + i/8] |= 1 << (i&7); 107 0 : if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7); 108 0 : if (isgraph(i)) p[cbit_graph + i/8] |= 1 << (i&7); 109 0 : if (isprint(i)) p[cbit_print + i/8] |= 1 << (i&7); 110 0 : if (ispunct(i)) p[cbit_punct + i/8] |= 1 << (i&7); 111 0 : if (iscntrl(i)) p[cbit_cntrl + i/8] |= 1 << (i&7); 112 : } 113 0 : p += cbit_length; 114 : 115 : /* Finally, the character type table */ 116 : 117 0 : for (i = 0; i < 256; i++) 118 : { 119 0 : int x = 0; 120 0 : if (isspace(i)) x += ctype_space; 121 0 : if (isalpha(i)) x += ctype_letter; 122 0 : if (isdigit(i)) x += ctype_digit; 123 0 : if (isxdigit(i)) x += ctype_xdigit; 124 0 : if (isalnum(i) || i == '_') x += ctype_word; 125 0 : if (strchr("*+?{^.$|()[", i) != 0) x += ctype_meta; 126 0 : *p++ = x; 127 : } 128 : 129 0 : return yield; 130 : } 131 : 132 : /* End of maketables.c */