Annotation of parser3/src/lib/pcre/maketables.c, revision 1.1
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:
! 78: for (i = 0; i < 256; i++) *p++ = tolower(i);
! 79:
! 80: /* Next the case-flipping table */
! 81:
! 82: for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i);
! 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;
! 107: *p++ = x;
! 108: }
! 109:
! 110: return yield;
! 111: }
! 112:
! 113: /* End of maketables.c */
E-mail: