NCBI C Toolkit Cross Reference

C/regexp/maketables.c


  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-2001 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 "pcre_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 const unsigned 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. Don't try to be clever and save effort
 85 on exclusive ones - in some locales things may be different. */
 86 
 87 memset(p, 0, cbit_length);
 88 for (i = 0; i < 256; i++)
 89   {
 90   if (isdigit(i))
 91     {
 92     p[cbit_digit  + i/8] |= 1 << (i&7);
 93     p[cbit_word   + i/8] |= 1 << (i&7);
 94     }
 95   if (isupper(i))
 96     {
 97     p[cbit_upper  + i/8] |= 1 << (i&7);
 98     p[cbit_word   + i/8] |= 1 << (i&7);
 99     }
100   if (islower(i))
101     {
102     p[cbit_lower  + i/8] |= 1 << (i&7);
103     p[cbit_word   + i/8] |= 1 << (i&7);
104     }
105   if (i == '_')   p[cbit_word   + i/8] |= 1 << (i&7);
106   if (isspace(i)) p[cbit_space  + i/8] |= 1 << (i&7);
107   if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7);
108   if (isgraph(i)) p[cbit_graph  + i/8] |= 1 << (i&7);
109   if (isprint(i)) p[cbit_print  + i/8] |= 1 << (i&7);
110   if (ispunct(i)) p[cbit_punct  + i/8] |= 1 << (i&7);
111   if (iscntrl(i)) p[cbit_cntrl  + i/8] |= 1 << (i&7);
112   }
113 p += cbit_length;
114 
115 /* Finally, the character type table */
116 
117 for (i = 0; i < 256; i++)
118   {
119   int x = 0;
120   if (isspace(i)) x += ctype_space;
121   if (isalpha(i)) x += ctype_letter;
122   if (isdigit(i)) x += ctype_digit;
123   if (isxdigit(i)) x += ctype_xdigit;
124   if (isalnum(i) || i == '_') x += ctype_word;
125   if (strchr("*+?{^.$|()[", i) != 0) x += ctype_meta;
126   *p++ = x;
127   }
128 
129 return yield;
130 }
131 
132 /* End of maketables.c */
133 

source navigation ]   [ diff markup ]   [ identifier search ]   [ freetext search ]   [ file search ]  

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.