tools/pcre/dftables.c
author Nicholas Hastings <skamonkey@gmail.com>
Sun Jul 15 12:31:06 2012 -0400 (2012-07-15)
changeset 3579 6d730190a3e4
parent 2762 d2d467bf1b5a
child 3831 babd0eee3c5e
permissions -rw-r--r--
Added missing files to each core and logic makefiles (NPOTB).
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
dvander@2762
     9
           Copyright (c) 1997-2008 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"
dvander@2762
   111
  "be supplied to the linker. */\n\n"
dvander@2762
   112
  "#ifdef HAVE_CONFIG_H\n"
dvander@2762
   113
  "#include \"config.h\"\n"
dvander@2762
   114
  "#endif\n\n"
dvander@2762
   115
  "#include \"pcre_internal.h\"\n\n");
dvander@2762
   116
fprintf(f,
dvander@2762
   117
  "const unsigned char _pcre_default_tables[] = {\n\n"
dvander@2762
   118
  "/* This table is a lower casing table. */\n\n");
dvander@2762
   119
dvander@2762
   120
fprintf(f, "  ");
dvander@2762
   121
for (i = 0; i < 256; i++)
dvander@2762
   122
  {
dvander@2762
   123
  if ((i & 7) == 0 && i != 0) fprintf(f, "\n  ");
dvander@2762
   124
  fprintf(f, "%3d", *tables++);
dvander@2762
   125
  if (i != 255) fprintf(f, ",");
dvander@2762
   126
  }
dvander@2762
   127
fprintf(f, ",\n\n");
dvander@2762
   128
dvander@2762
   129
fprintf(f, "/* This table is a case flipping table. */\n\n");
dvander@2762
   130
dvander@2762
   131
fprintf(f, "  ");
dvander@2762
   132
for (i = 0; i < 256; i++)
dvander@2762
   133
  {
dvander@2762
   134
  if ((i & 7) == 0 && i != 0) fprintf(f, "\n  ");
dvander@2762
   135
  fprintf(f, "%3d", *tables++);
dvander@2762
   136
  if (i != 255) fprintf(f, ",");
dvander@2762
   137
  }
dvander@2762
   138
fprintf(f, ",\n\n");
dvander@2762
   139
dvander@2762
   140
fprintf(f,
dvander@2762
   141
  "/* This table contains bit maps for various character classes.\n"
dvander@2762
   142
  "Each map is 32 bytes long and the bits run from the least\n"
dvander@2762
   143
  "significant end of each byte. The classes that have their own\n"
dvander@2762
   144
  "maps are: space, xdigit, digit, upper, lower, word, graph\n"
dvander@2762
   145
  "print, punct, and cntrl. Other classes are built from combinations. */\n\n");
dvander@2762
   146
dvander@2762
   147
fprintf(f, "  ");
dvander@2762
   148
for (i = 0; i < cbit_length; i++)
dvander@2762
   149
  {
dvander@2762
   150
  if ((i & 7) == 0 && i != 0)
dvander@2762
   151
    {
dvander@2762
   152
    if ((i & 31) == 0) fprintf(f, "\n");
dvander@2762
   153
    fprintf(f, "\n  ");
dvander@2762
   154
    }
dvander@2762
   155
  fprintf(f, "0x%02x", *tables++);
dvander@2762
   156
  if (i != cbit_length - 1) fprintf(f, ",");
dvander@2762
   157
  }
dvander@2762
   158
fprintf(f, ",\n\n");
dvander@2762
   159
dvander@2762
   160
fprintf(f,
dvander@2762
   161
  "/* This table identifies various classes of character by individual bits:\n"
dvander@2762
   162
  "  0x%02x   white space character\n"
dvander@2762
   163
  "  0x%02x   letter\n"
dvander@2762
   164
  "  0x%02x   decimal digit\n"
dvander@2762
   165
  "  0x%02x   hexadecimal digit\n"
dvander@2762
   166
  "  0x%02x   alphanumeric or '_'\n"
dvander@2762
   167
  "  0x%02x   regular expression metacharacter or binary zero\n*/\n\n",
dvander@2762
   168
  ctype_space, ctype_letter, ctype_digit, ctype_xdigit, ctype_word,
dvander@2762
   169
  ctype_meta);
dvander@2762
   170
dvander@2762
   171
fprintf(f, "  ");
dvander@2762
   172
for (i = 0; i < 256; i++)
dvander@2762
   173
  {
dvander@2762
   174
  if ((i & 7) == 0 && i != 0)
dvander@2762
   175
    {
dvander@2762
   176
    fprintf(f, " /* ");
dvander@2762
   177
    if (isprint(i-8)) fprintf(f, " %c -", i-8);
dvander@2762
   178
      else fprintf(f, "%3d-", i-8);
dvander@2762
   179
    if (isprint(i-1)) fprintf(f, " %c ", i-1);
dvander@2762
   180
      else fprintf(f, "%3d", i-1);
dvander@2762
   181
    fprintf(f, " */\n  ");
dvander@2762
   182
    }
dvander@2762
   183
  fprintf(f, "0x%02x", *tables++);
dvander@2762
   184
  if (i != 255) fprintf(f, ",");
dvander@2762
   185
  }
dvander@2762
   186
dvander@2762
   187
fprintf(f, "};/* ");
dvander@2762
   188
if (isprint(i-8)) fprintf(f, " %c -", i-8);
dvander@2762
   189
  else fprintf(f, "%3d-", i-8);
dvander@2762
   190
if (isprint(i-1)) fprintf(f, " %c ", i-1);
dvander@2762
   191
  else fprintf(f, "%3d", i-1);
dvander@2762
   192
fprintf(f, " */\n\n/* End of pcre_chartables.c */\n");
dvander@2762
   193
dvander@2762
   194
fclose(f);
dvander@2762
   195
free((void *)base_of_tables);
dvander@2762
   196
return 0;
dvander@2762
   197
}
dvander@2762
   198
dvander@2762
   199
/* End of dftables.c */