LTP GCOV extension - code coverage report
Current view: directory - ext/pcre/pcrelib - pcre_maketables.c
Test: PHP Code Coverage
Date: 2007-04-10 Instrumented lines: 30
Code covered: 100.0 % Executed lines: 30
Legend: not executed executed

       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-2006 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 module contains the external function pcre_maketables(), which builds
      42                 : character tables for PCRE in the current locale. The file is compiled on its
      43                 : own as part of the PCRE library. However, it is also included in the
      44                 : compilation of dftables.c, in which case the macro DFTABLES is defined. */
      45                 : 
      46                 : 
      47                 : #ifndef DFTABLES
      48                 : #include "pcre_internal.h"
      49                 : #endif
      50                 : 
      51                 : 
      52                 : /*************************************************
      53                 : *           Create PCRE character tables         *
      54                 : *************************************************/
      55                 : 
      56                 : /* This function builds a set of character tables for use by PCRE and returns
      57                 : a pointer to them. They are build using the ctype functions, and consequently
      58                 : their contents will depend upon the current locale setting. When compiled as
      59                 : part of the library, the store is obtained via pcre_malloc(), but when compiled
      60                 : inside dftables, use malloc().
      61                 : 
      62                 : Arguments:   none
      63                 : Returns:     pointer to the contiguous block of data
      64                 : */
      65                 : 
      66                 : const unsigned char *
      67                 : pcre_maketables(void)
      68             184 : {
      69                 : unsigned char *yield, *p;
      70                 : int i;
      71                 : 
      72                 : #ifndef DFTABLES
      73             184 : yield = (unsigned char*)(pcre_malloc)(tables_length);
      74                 : #else
      75                 : yield = (unsigned char*)malloc(tables_length);
      76                 : #endif
      77                 : 
      78             184 : if (yield == NULL) return NULL;
      79             184 : p = yield;
      80                 : 
      81                 : /* First comes the lower casing table */
      82                 : 
      83             184 : for (i = 0; i < 256; i++) *p++ = tolower(i);
      84                 : 
      85                 : /* Next the case-flipping table */
      86                 : 
      87             184 : for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i);
      88                 : 
      89                 : /* Then the character class tables. Don't try to be clever and save effort on
      90                 : exclusive ones - in some locales things may be different. Note that the table
      91                 : for "space" includes everything "isspace" gives, including VT in the default
      92                 : locale. This makes it work for the POSIX class [:space:]. Note also that it is
      93                 : possible for a character to be alnum or alpha without being lower or upper,
      94                 : such as "male and female ordinals" (\xAA and \xBA) in the fr_FR locale (at
      95                 : least under Debian Linux's locales as of 12/2005). So we must test for alnum
      96                 : specially. */
      97                 : 
      98             184 : memset(p, 0, cbit_length);
      99           47288 : for (i = 0; i < 256; i++)
     100                 :   {
     101           47104 :   if (isdigit(i)) p[cbit_digit  + i/8] |= 1 << (i&7);
     102           47104 :   if (isupper(i)) p[cbit_upper  + i/8] |= 1 << (i&7);
     103           47104 :   if (islower(i)) p[cbit_lower  + i/8] |= 1 << (i&7);
     104           47104 :   if (isalnum(i)) p[cbit_word   + i/8] |= 1 << (i&7);
     105           47104 :   if (i == '_')   p[cbit_word   + i/8] |= 1 << (i&7);
     106           47104 :   if (isspace(i)) p[cbit_space  + i/8] |= 1 << (i&7);
     107           47104 :   if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7);
     108           47104 :   if (isgraph(i)) p[cbit_graph  + i/8] |= 1 << (i&7);
     109           47104 :   if (isprint(i)) p[cbit_print  + i/8] |= 1 << (i&7);
     110           47104 :   if (ispunct(i)) p[cbit_punct  + i/8] |= 1 << (i&7);
     111           47104 :   if (iscntrl(i)) p[cbit_cntrl  + i/8] |= 1 << (i&7);
     112                 :   }
     113             184 : p += cbit_length;
     114                 : 
     115                 : /* Finally, the character type table. In this, we exclude VT from the white
     116                 : space chars, because Perl doesn't recognize it as such for \s and for comments
     117                 : within regexes. */
     118                 : 
     119           47288 : for (i = 0; i < 256; i++)
     120                 :   {
     121           47104 :   int x = 0;
     122           47104 :   if (i != 0x0b && isspace(i)) x += ctype_space;
     123           47104 :   if (isalpha(i)) x += ctype_letter;
     124           47104 :   if (isdigit(i)) x += ctype_digit;
     125           47104 :   if (isxdigit(i)) x += ctype_xdigit;
     126           47104 :   if (isalnum(i) || i == '_') x += ctype_word;
     127                 : 
     128                 :   /* Note: strchr includes the terminating zero in the characters it considers.
     129                 :   In this instance, that is ok because we want binary zero to be flagged as a
     130                 :   meta-character, which in this sense is any character that terminates a run
     131                 :   of data characters. */
     132                 : 
     133           47104 :   if (strchr("\\*+?{^.$|()[", i) != 0) x += ctype_meta;
     134           47104 :   *p++ = x;
     135                 :   }
     136                 : 
     137             184 : return yield;
     138                 : }
     139                 : 
     140                 : /* End of pcre_maketables.c */

Generated by: LTP GCOV extension version 1.5