tools/pcre/dftables.c
author Nicholas Hastings <skamonkey@gmail.com>
Sun Mar 17 11:32:03 2013 -0400 (2013-03-17)
changeset 3831 babd0eee3c5e
parent 2762 d2d467bf1b5a
permissions -rw-r--r--
Updated PCRE source to version 8.32 (bug 5593).
dvander@2762
     1
/*************************************************
dvander@2762
     2
*      Perl-Compatible Regular Expressions       *
dvander@2762
     3
*************************************************/
dvander@2762
     4
dvander@2762
     5
/* PCRE is a library of functions to support regular expressions whose syntax
dvander@2762
     6
and semantics are as close as possible to those of the Perl 5 language.
dvander@2762
     7
dvander@2762
     8
                       Written by Philip Hazel
skamonkey@3831
     9
           Copyright (c) 1997-2012 University of Cambridge
dvander@2762
    10
dvander@2762
    11
-----------------------------------------------------------------------------
dvander@2762
    12
Redistribution and use in source and binary forms, with or without
dvander@2762
    13
modification, are permitted provided that the following conditions are met:
dvander@2762
    14
dvander@2762
    15
    * Redistributions of source code must retain the above copyright notice,
dvander@2762
    16
      this list of conditions and the following disclaimer.
dvander@2762
    17
dvander@2762
    18
    * Redistributions in binary form must reproduce the above copyright
dvander@2762
    19
      notice, this list of conditions and the following disclaimer in the
dvander@2762
    20
      documentation and/or other materials provided with the distribution.
dvander@2762
    21
dvander@2762
    22
    * Neither the name of the University of Cambridge nor the names of its
dvander@2762
    23
      contributors may be used to endorse or promote products derived from
dvander@2762
    24
      this software without specific prior written permission.
dvander@2762
    25
dvander@2762
    26
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
dvander@2762
    27
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
dvander@2762
    28
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
dvander@2762
    29
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
dvander@2762
    30
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
dvander@2762
    31
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
dvander@2762
    32
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
dvander@2762
    33
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
dvander@2762
    34
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
dvander@2762
    35
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
dvander@2762
    36
POSSIBILITY OF SUCH DAMAGE.
dvander@2762
    37
-----------------------------------------------------------------------------
dvander@2762
    38
*/
dvander@2762
    39
dvander@2762
    40
dvander@2762
    41
/* This is a freestanding support program to generate a file containing
dvander@2762
    42
character tables for PCRE. The tables are built according to the current
dvander@2762
    43
locale. Now that pcre_maketables is a function visible to the outside world, we
dvander@2762
    44
make use of its code from here in order to be consistent. */
dvander@2762
    45
dvander@2762
    46
#ifdef HAVE_CONFIG_H
dvander@2762
    47
#include "config.h"
dvander@2762
    48
#endif
dvander@2762
    49
dvander@2762
    50
#include <ctype.h>
dvander@2762
    51
#include <stdio.h>
dvander@2762
    52
#include <string.h>
dvander@2762
    53
#include <locale.h>
dvander@2762
    54
dvander@2762
    55
#include "pcre_internal.h"
dvander@2762
    56
dvander@2762
    57
#define DFTABLES          /* pcre_maketables.c notices this */
dvander@2762
    58
#include "pcre_maketables.c"
dvander@2762
    59
dvander@2762
    60
dvander@2762
    61
int main(int argc, char **argv)
dvander@2762
    62
{
dvander@2762
    63
FILE *f;
dvander@2762
    64
int i = 1;
dvander@2762
    65
const unsigned char *tables;
dvander@2762
    66
const unsigned char *base_of_tables;
dvander@2762
    67
dvander@2762
    68
/* By default, the default C locale is used rather than what the building user
dvander@2762
    69
happens to have set. However, if the -L option is given, set the locale from
dvander@2762
    70
the LC_xxx environment variables. */
dvander@2762
    71
dvander@2762
    72
if (argc > 1 && strcmp(argv[1], "-L") == 0)
dvander@2762
    73
  {
dvander@2762
    74
  setlocale(LC_ALL, "");        /* Set from environment variables */
dvander@2762
    75
  i++;
dvander@2762
    76
  }
dvander@2762
    77
dvander@2762
    78
if (argc < i + 1)
dvander@2762
    79
  {
dvander@2762
    80
  fprintf(stderr, "dftables: one filename argument is required\n");
dvander@2762
    81
  return 1;
dvander@2762
    82
  }
dvander@2762
    83
dvander@2762
    84
tables = pcre_maketables();
dvander@2762
    85
base_of_tables = tables;
dvander@2762
    86
dvander@2762
    87
f = fopen(argv[i], "wb");
dvander@2762
    88
if (f == NULL)
dvander@2762
    89
  {
dvander@2762
    90
  fprintf(stderr, "dftables: failed to open %s for writing\n", argv[1]);
dvander@2762
    91
  return 1;
dvander@2762
    92
  }
dvander@2762
    93
dvander@2762
    94
/* There are several fprintf() calls here, because gcc in pedantic mode
dvander@2762
    95
complains about the very long string otherwise. */
dvander@2762
    96
dvander@2762
    97
fprintf(f,
dvander@2762
    98
  "/*************************************************\n"
dvander@2762
    99
  "*      Perl-Compatible Regular Expressions       *\n"
dvander@2762
   100
  "*************************************************/\n\n"
dvander@2762
   101
  "/* This file was automatically written by the dftables auxiliary\n"
dvander@2762
   102
  "program. It contains character tables that are used when no external\n"
dvander@2762
   103
  "tables are passed to PCRE by the application that calls it. The tables\n"
dvander@2762
   104
  "are used only for characters whose code values are less than 256.\n\n");
dvander@2762
   105
fprintf(f,
dvander@2762
   106
  "The following #includes are present because without them gcc 4.x may remove\n"
dvander@2762
   107
  "the array definition from the final binary if PCRE is built into a static\n"
dvander@2762
   108
  "library and dead code stripping is activated. This leads to link errors.\n"
dvander@2762
   109
  "Pulling in the header ensures that the array gets flagged as \"someone\n"
dvander@2762
   110
  "outside this compilation unit might reference this\" and so it will always\n"
skamonkey@3831
   111
  "be supplied to the linker. */\n\n");
skamonkey@3831
   112
skamonkey@3831
   113
/* Force config.h in z/OS */
skamonkey@3831
   114
skamonkey@3831
   115
#if defined NATIVE_ZOS
skamonkey@3831
   116
fprintf(f,
skamonkey@3831
   117
  "/* For z/OS, config.h is forced */\n"
skamonkey@3831
   118
  "#ifndef HAVE_CONFIG_H\n"
skamonkey@3831
   119
  "#define HAVE_CONFIG_H 1\n"
skamonkey@3831
   120
  "#endif\n\n");
skamonkey@3831
   121
#endif
skamonkey@3831
   122
skamonkey@3831
   123
fprintf(f,
dvander@2762
   124
  "#ifdef HAVE_CONFIG_H\n"
dvander@2762
   125
  "#include \"config.h\"\n"
dvander@2762
   126
  "#endif\n\n"
dvander@2762
   127
  "#include \"pcre_internal.h\"\n\n");
skamonkey@3831
   128
dvander@2762
   129
fprintf(f,
skamonkey@3831
   130
  "const pcre_uint8 PRIV(default_tables)[] = {\n\n"
dvander@2762
   131
  "/* This table is a lower casing table. */\n\n");
dvander@2762
   132
dvander@2762
   133
fprintf(f, "  ");
dvander@2762
   134
for (i = 0; i < 256; i++)
dvander@2762
   135
  {
dvander@2762
   136
  if ((i & 7) == 0 && i != 0) fprintf(f, "\n  ");
dvander@2762
   137
  fprintf(f, "%3d", *tables++);
dvander@2762
   138
  if (i != 255) fprintf(f, ",");
dvander@2762
   139
  }
dvander@2762
   140
fprintf(f, ",\n\n");
dvander@2762
   141
dvander@2762
   142
fprintf(f, "/* This table is a case flipping table. */\n\n");
dvander@2762
   143
dvander@2762
   144
fprintf(f, "  ");
dvander@2762
   145
for (i = 0; i < 256; i++)
dvander@2762
   146
  {
dvander@2762
   147
  if ((i & 7) == 0 && i != 0) fprintf(f, "\n  ");
dvander@2762
   148
  fprintf(f, "%3d", *tables++);
dvander@2762
   149
  if (i != 255) fprintf(f, ",");
dvander@2762
   150
  }
dvander@2762
   151
fprintf(f, ",\n\n");
dvander@2762
   152
dvander@2762
   153
fprintf(f,
dvander@2762
   154
  "/* This table contains bit maps for various character classes.\n"
dvander@2762
   155
  "Each map is 32 bytes long and the bits run from the least\n"
dvander@2762
   156
  "significant end of each byte. The classes that have their own\n"
dvander@2762
   157
  "maps are: space, xdigit, digit, upper, lower, word, graph\n"
dvander@2762
   158
  "print, punct, and cntrl. Other classes are built from combinations. */\n\n");
dvander@2762
   159
dvander@2762
   160
fprintf(f, "  ");
dvander@2762
   161
for (i = 0; i < cbit_length; i++)
dvander@2762
   162
  {
dvander@2762
   163
  if ((i & 7) == 0 && i != 0)
dvander@2762
   164
    {
dvander@2762
   165
    if ((i & 31) == 0) fprintf(f, "\n");
dvander@2762
   166
    fprintf(f, "\n  ");
dvander@2762
   167
    }
dvander@2762
   168
  fprintf(f, "0x%02x", *tables++);
dvander@2762
   169
  if (i != cbit_length - 1) fprintf(f, ",");
dvander@2762
   170
  }
dvander@2762
   171
fprintf(f, ",\n\n");
dvander@2762
   172
dvander@2762
   173
fprintf(f,
dvander@2762
   174
  "/* This table identifies various classes of character by individual bits:\n"
dvander@2762
   175
  "  0x%02x   white space character\n"
dvander@2762
   176
  "  0x%02x   letter\n"
dvander@2762
   177
  "  0x%02x   decimal digit\n"
dvander@2762
   178
  "  0x%02x   hexadecimal digit\n"
dvander@2762
   179
  "  0x%02x   alphanumeric or '_'\n"
dvander@2762
   180
  "  0x%02x   regular expression metacharacter or binary zero\n*/\n\n",
dvander@2762
   181
  ctype_space, ctype_letter, ctype_digit, ctype_xdigit, ctype_word,
dvander@2762
   182
  ctype_meta);
dvander@2762
   183
dvander@2762
   184
fprintf(f, "  ");
dvander@2762
   185
for (i = 0; i < 256; i++)
dvander@2762
   186
  {
dvander@2762
   187
  if ((i & 7) == 0 && i != 0)
dvander@2762
   188
    {
dvander@2762
   189
    fprintf(f, " /* ");
dvander@2762
   190
    if (isprint(i-8)) fprintf(f, " %c -", i-8);
dvander@2762
   191
      else fprintf(f, "%3d-", i-8);
dvander@2762
   192
    if (isprint(i-1)) fprintf(f, " %c ", i-1);
dvander@2762
   193
      else fprintf(f, "%3d", i-1);
dvander@2762
   194
    fprintf(f, " */\n  ");
dvander@2762
   195
    }
dvander@2762
   196
  fprintf(f, "0x%02x", *tables++);
dvander@2762
   197
  if (i != 255) fprintf(f, ",");
dvander@2762
   198
  }
dvander@2762
   199
dvander@2762
   200
fprintf(f, "};/* ");
dvander@2762
   201
if (isprint(i-8)) fprintf(f, " %c -", i-8);
dvander@2762
   202
  else fprintf(f, "%3d-", i-8);
dvander@2762
   203
if (isprint(i-1)) fprintf(f, " %c ", i-1);
dvander@2762
   204
  else fprintf(f, "%3d", i-1);
dvander@2762
   205
fprintf(f, " */\n\n/* End of pcre_chartables.c */\n");
dvander@2762
   206
dvander@2762
   207
fclose(f);
dvander@2762
   208
free((void *)base_of_tables);
dvander@2762
   209
return 0;
dvander@2762
   210
}
dvander@2762
   211
dvander@2762
   212
/* End of dftables.c */