OSDN Git Service

Index: gcc/ChangeLog
authorgeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Mar 2005 00:36:33 +0000 (00:36 +0000)
committergeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Mar 2005 00:36:33 +0000 (00:36 +0000)
2005-03-14  Geoffrey Keating  <geoffk@apple.com>

* doc/cppopts.texi (-fexec-charset): Add concept index entry.
(-fwide-exec-charset): Likewise.
(-finput-charset): Likewise.
* doc/invoke.texi (Warning Options): Document -Wnormalized=.
* c-opts.c (c_common_handle_option): Handle -Wnormalized=.
* c.opt (Wnormalized): New.

Index: libcpp/ChangeLog
2005-03-14  Geoffrey Keating  <geoffk@apple.com>

* init.c (cpp_create_reader): Default warn_normalize to normalized_C.
* charset.c: Update for new format of ucnid.h.
(ucn_valid_in_identifier): Update for new format of ucnid.h.
Add NST parameter, and update it; update callers.
(cpp_valid_ucn): Add NST parameter, update callers.  Replace abort
with cpp_error.
(convert_ucn): Pass normalize_state to cpp_valid_ucn.
* internal.h (struct normalize_state): New.
(INITIAL_NORMALIZE_STATE): New.
(NORMALIZE_STATE_RESULT): New.
(NORMALIZE_STATE_UPDATE_IDNUM): New.
(_cpp_valid_ucn): New.
* lex.c (warn_about_normalization): New.
(forms_identifier_p): Add normalize_state parameter, update callers.
(lex_identifier): Add normalize_state parameter, update callers.  Keep
the state current.
(lex_number): Likewise.
(_cpp_lex_direct): Pass normalize_state to subroutines.  Check
it with warn_about_normalization.
* makeucnid.c: New.
* ucnid.h: Replace.
* ucnid.pl: Remove.
* ucnid.tab: Make appropriate for input to makeucnid.c.  Remove
comments about obsolete version of C++.
* include/cpplib.h (enum cpp_normalize_level): New.
(struct cpp_options): Add warn_normalize field.

Index: gcc/testsuite/ChangeLog
2005-03-14  Geoffrey Keating  <geoffk@apple.com>

* gcc.dg/cpp/normalize-1.c: New.
* gcc.dg/cpp/normalize-2.c: New.
* gcc.dg/cpp/normalize-3.c: New.
* gcc.dg/cpp/normalize-4.c: New.
* gcc.dg/cpp/ucnid-4.c: New.
* gcc.dg/cpp/ucnid-5.c: New.
* g++.dg/cpp/normalize-1.C: New.
* g++.dg/cpp/ucnid-1.C: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@96459 138bc75d-0d04-0410-961f-82ee72b054a4

24 files changed:
gcc/ChangeLog
gcc/c-opts.c
gcc/c.opt
gcc/doc/cppopts.texi
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp/normalize-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp/ucnid-1.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/normalize-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/normalize-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/normalize-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/normalize-4.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/ucnid-4.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/ucnid-5.c [new file with mode: 0644]
libcpp/ChangeLog
libcpp/charset.c
libcpp/include/cpplib.h
libcpp/init.c
libcpp/internal.h
libcpp/lex.c
libcpp/makeucnid.c [new file with mode: 0644]
libcpp/ucnid.h
libcpp/ucnid.pl [deleted file]
libcpp/ucnid.tab

index 9150a8c..13e2a83 100644 (file)
@@ -1,3 +1,12 @@
+2005-03-14  Geoffrey Keating  <geoffk@apple.com>
+
+       * doc/cppopts.texi (-fexec-charset): Add concept index entry.
+       (-fwide-exec-charset): Likewise.
+       (-finput-charset): Likewise.
+       * doc/invoke.texi (Warning Options): Document -Wnormalized=.
+       * c-opts.c (c_common_handle_option): Handle -Wnormalized=.
+       * c.opt (Wnormalized): New.
+
 2005-03-14  Devang Patel  <dpatel@apple.com>
 
        * doc/invoke.texi: Add reference to Visibility document.
index 128c83a..731511a 100644 (file)
@@ -460,6 +460,19 @@ c_common_handle_option (size_t scode, const char *arg, int value)
       cpp_opts->warn_multichar = value;
       break;
 
+    case OPT_Wnormalized_:
+      if (!value || (arg && strcasecmp (arg, "none") == 0))
+       cpp_opts->warn_normalize = normalized_none;
+      else if (!arg || strcasecmp (arg, "nfkc") == 0)
+       cpp_opts->warn_normalize = normalized_KC;
+      else if (strcasecmp (arg, "id") == 0)
+       cpp_opts->warn_normalize = normalized_identifier_C;
+      else if (strcasecmp (arg, "nfc") == 0)
+       cpp_opts->warn_normalize = normalized_C;
+      else
+       error ("argument %qs to %<-Wnormalized%> not recognized", arg);
+      break;
+
     case OPT_Wreturn_type:
       warn_return_type = value;
       break;
index 2582661..e5260f1 100644 (file)
--- a/gcc/c.opt
+++ b/gcc/c.opt
@@ -285,6 +285,10 @@ Wnonnull
 C ObjC Var(warn_nonnull)
 Warn about NULL being passed to argument slots marked as requiring non-NULL
 
+Wnormalized=
+C ObjC C++ ObjC++ Joined
+-Wnormalized=<id|nfc|nfkc>     Warn about non-normalised Unicode strings
+
 Wold-style-cast
 C++ ObjC++ Var(warn_old_style_cast)
 Warn if a C-style cast is used in a program
index 872cffc..c6376c6 100644 (file)
@@ -530,12 +530,14 @@ ignored.  The default is 8.
 
 @item -fexec-charset=@var{charset}
 @opindex fexec-charset
+@cindex character set, execution
 Set the execution character set, used for string and character
 constants.  The default is UTF-8.  @var{charset} can be any encoding
 supported by the system's @code{iconv} library routine.
 
 @item -fwide-exec-charset=@var{charset}
 @opindex fwide-exec-charset
+@cindex character set, wide execution
 Set the wide execution character set, used for wide string and
 character constants.  The default is UTF-32 or UTF-16, whichever
 corresponds to the width of @code{wchar_t}.  As with
@@ -545,6 +547,7 @@ problems with encodings that do not fit exactly in @code{wchar_t}.
 
 @item -finput-charset=@var{charset}
 @opindex finput-charset
+@cindex character set, input
 Set the input character set, used for translation from the character
 set of the input file to the source character set used by GCC@.  If the
 locale does not specify, or GCC cannot get this information from the
index 51cebb5..2e08c4f 100644 (file)
@@ -3039,6 +3039,51 @@ Do not warn if a multicharacter constant (@samp{'FOOF'}) is used.
 Usually they indicate a typo in the user's code, as they have
 implementation-defined values, and should not be used in portable code.
 
+@item -Wnormalized=<none|id|nfc|nfkc>
+@opindex Wnormalized
+@cindex NFC
+@cindex NFKC
+@cindex character set, input normalization
+In ISO C and ISO C++, two identifiers are different if they are
+different sequences of characters.  However, sometimes when characters
+outside the basic ASCII character set are used, you can have two
+different character sequences that look the same.  To avoid confusion,
+the ISO 10646 standard sets out some @dfn{normalization rules} which
+when applied ensure that two sequences that look the same are turned into
+the same sequence.  GCC can warn you if you are using identifiers which
+have not been normalized; this option controls that warning.
+
+There are four levels of warning that GCC supports.  The default is
+@option{-Wnormalized=nfc}, which warns about any identifier which is
+not in the ISO 10646 ``C'' normalized form, @dfn{NFC}.  NFC is the
+recommended form for most uses.
+
+Unfortunately, there are some characters which ISO C and ISO C++ allow
+in identifiers that when turned into NFC aren't allowable as
+identifiers.  That is, there's no way to use these symbols in portable
+ISO C or C++ and have all your identifiers in NFC.
+@option{-Wnormalized=id} suppresses the warning for these characters.
+It is hoped that future versions of the standards involved will correct
+this, which is why this option is not the default.
+
+You can switch the warning off for all characters by writing
+@option{-Wnormalized=none}.  You would only want to do this if you
+were using some other normalization scheme (like ``D''), because
+otherwise you can easily create bugs that are literally impossible to see.
+
+Some characters in ISO 10646 have distinct meanings but look identical
+in some fonts or display methodologies, especially once formatting has
+been applied.  For instance @code{\u207F}, ``SUPERSCRIPT LATIN SMALL
+LETTER N'', will display just like a regular @code{n} which has been
+placed in a superscript.  ISO 10646 defines the @dfn{NFKC}
+normalisation scheme to convert all these into a standard form as
+well, and GCC will warn if your code is not in NFKC if you use
+@option{-Wnormalized=nfkc}.  This warning is comparable to warning
+about every identifier that contains the letter O because it might be
+confused with the digit 0, and so is not the default, but may be
+useful as a local coding convention if the programming environment is
+unable to be fixed to display these characters distinctly.
+
 @item -Wno-deprecated-declarations
 @opindex Wno-deprecated-declarations
 Do not warn about uses of functions, variables, and types marked as
index 3053e82..647f155 100644 (file)
@@ -1,3 +1,14 @@
+2005-03-14  Geoffrey Keating  <geoffk@apple.com>
+
+       * gcc.dg/cpp/normalize-1.c: New.
+       * gcc.dg/cpp/normalize-2.c: New.
+       * gcc.dg/cpp/normalize-3.c: New.
+       * gcc.dg/cpp/normalize-4.c: New.
+       * gcc.dg/cpp/ucnid-4.c: New.
+       * gcc.dg/cpp/ucnid-5.c: New.
+       * g++.dg/cpp/normalize-1.C: New.
+       * g++.dg/cpp/ucnid-1.C: New.
+
 2005-03-14  Alexandre Oliva  <aoliva@redhat.com>
 
        * gcc.dg/pr18628.c: New.
diff --git a/gcc/testsuite/g++.dg/cpp/normalize-1.C b/gcc/testsuite/g++.dg/cpp/normalize-1.C
new file mode 100644 (file)
index 0000000..8c49602
--- /dev/null
@@ -0,0 +1,34 @@
+/* { dg-do preprocess } */
+/* { dg-options "-Wnormalized=id" } */
+
+\u00AA
+\u00B7
+\u0F43  /* { dg-warning "not in NFC" } */
+a\u05B8\u05B9\u05B9\u05BBb
+ a\u05BB\u05B9\u05B8\u05B9b  /* { dg-warning "not in NFC" } */
+\u09CB
+\u09C7\u09BE /* { dg-warning "not in NFC" } */
+\u0B4B
+\u0B47\u0B3E /* { dg-warning "not in NFC" } */
+\u0BCA
+\u0BC6\u0BBE /* { dg-warning "not in NFC" } */
+\u0BCB
+\u0BC7\u0BBE /* { dg-warning "not in NFC" } */
+\u0CCA
+\u0CC6\u0CC2 /* { dg-warning "not in NFC" } */
+\u0D4A
+\u0D46\u0D3E /* { dg-warning "not in NFC" } */
+\u0D4B
+\u0D47\u0D3E /* { dg-warning "not in NFC" } */
+
+K
+\u212A
+
+\u03AC
+\u1F71 /* { dg-warning "not in NFC" } */
+
+\uAC00
+\u1100\u1161
+\uAC01
+\u1100\u1161\u11A8
+\uAC00\u11A8
diff --git a/gcc/testsuite/g++.dg/cpp/ucnid-1.C b/gcc/testsuite/g++.dg/cpp/ucnid-1.C
new file mode 100644 (file)
index 0000000..ccbb1ea
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do preprocess } */
+/* { dg-options "-pedantic" } */
+
+\u00AA /* { dg-error "not valid in an identifier" } */
+\u00AB /* { dg-error "not valid in an identifier" } */
+\u00B6 /* { dg-error "not valid in an identifier" } */
+\u00BA /* { dg-error "not valid in an identifier" } */
+\u00C0
+\u00D6
+\u0384
+
+\u0669 /* { dg-error "not valid in an identifier" } */
+A\u0669 /* { dg-error "not valid in an identifier" } */
+0\u00BA /* { dg-error "not valid in an identifier" } */
+0\u0669 /* { dg-error "not valid in an identifier" } */
+\u0E59
+A\u0E59
diff --git a/gcc/testsuite/gcc.dg/cpp/normalize-1.c b/gcc/testsuite/gcc.dg/cpp/normalize-1.c
new file mode 100644 (file)
index 0000000..768e193
--- /dev/null
@@ -0,0 +1,34 @@
+/* { dg-do preprocess } */
+/* { dg-options "-std=c99" } */
+
+\u00AA
+\u00B7
+\u0F43  /* { dg-warning "not in NFC" } */
+a\u05B8\u05B9\u05B9\u05BBb
+ a\u05BB\u05B9\u05B8\u05B9b  /* { dg-warning "not in NFC" } */
+\u09CB
+\u09C7\u09BE /* { dg-warning "not in NFC" } */
+\u0B4B
+\u0B47\u0B3E /* { dg-warning "not in NFC" } */
+\u0BCA
+\u0BC6\u0BBE /* { dg-warning "not in NFC" } */
+\u0BCB
+\u0BC7\u0BBE /* { dg-warning "not in NFC" } */
+\u0CCA
+\u0CC6\u0CC2 /* { dg-warning "not in NFC" } */
+\u0D4A
+\u0D46\u0D3E /* { dg-warning "not in NFC" } */
+\u0D4B
+\u0D47\u0D3E /* { dg-warning "not in NFC" } */
+
+K
+\u212A /* { dg-warning "not in NFC" } */
+
+\u03AC
+\u1F71 /* { dg-warning "not in NFC" } */
+
+\uAC00
+\u1100\u1161 /* { dg-warning "not in NFC" } */
+\uAC01
+\u1100\u1161\u11A8 /* { dg-warning "not in NFC" } */
+\uAC00\u11A8 /* { dg-warning "not in NFC" } */
diff --git a/gcc/testsuite/gcc.dg/cpp/normalize-2.c b/gcc/testsuite/gcc.dg/cpp/normalize-2.c
new file mode 100644 (file)
index 0000000..28ef2f1
--- /dev/null
@@ -0,0 +1,34 @@
+/* { dg-do preprocess } */
+/* { dg-options "-std=c99 -Wnormalized=nfkc" } */
+
+\u00AA  /* { dg-warning "not in NFKC" } */
+\u00B7
+\u0F43  /* { dg-warning "not in NFC" } */
+a\u05B8\u05B9\u05B9\u05BBb
+ a\u05BB\u05B9\u05B8\u05B9b  /* { dg-warning "not in NFC" } */
+\u09CB
+\u09C7\u09BE /* { dg-warning "not in NFC" } */
+\u0B4B
+\u0B47\u0B3E /* { dg-warning "not in NFC" } */
+\u0BCA
+\u0BC6\u0BBE /* { dg-warning "not in NFC" } */
+\u0BCB
+\u0BC7\u0BBE /* { dg-warning "not in NFC" } */
+\u0CCA
+\u0CC6\u0CC2 /* { dg-warning "not in NFC" } */
+\u0D4A
+\u0D46\u0D3E /* { dg-warning "not in NFC" } */
+\u0D4B
+\u0D47\u0D3E /* { dg-warning "not in NFC" } */
+
+K
+\u212A /* { dg-warning "not in NFC" } */
+
+\u03AC
+\u1F71 /* { dg-warning "not in NFC" } */
+
+\uAC00
+\u1100\u1161 /* { dg-warning "not in NFC" } */
+\uAC01
+\u1100\u1161\u11A8 /* { dg-warning "not in NFC" } */
+\uAC00\u11A8 /* { dg-warning "not in NFC" } */
diff --git a/gcc/testsuite/gcc.dg/cpp/normalize-3.c b/gcc/testsuite/gcc.dg/cpp/normalize-3.c
new file mode 100644 (file)
index 0000000..0407492
--- /dev/null
@@ -0,0 +1,34 @@
+/* { dg-do preprocess } */
+/* { dg-options "-std=c99 -Wnormalized=id" } */
+
+\u00AA
+\u00B7
+\u0F43  /* { dg-warning "not in NFC" } */
+a\u05B8\u05B9\u05B9\u05BBb
+ a\u05BB\u05B9\u05B8\u05B9b  /* { dg-warning "not in NFC" } */
+\u09CB
+\u09C7\u09BE /* { dg-warning "not in NFC" } */
+\u0B4B
+\u0B47\u0B3E /* { dg-warning "not in NFC" } */
+\u0BCA
+\u0BC6\u0BBE /* { dg-warning "not in NFC" } */
+\u0BCB
+\u0BC7\u0BBE /* { dg-warning "not in NFC" } */
+\u0CCA
+\u0CC6\u0CC2 /* { dg-warning "not in NFC" } */
+\u0D4A
+\u0D46\u0D3E /* { dg-warning "not in NFC" } */
+\u0D4B
+\u0D47\u0D3E /* { dg-warning "not in NFC" } */
+
+K
+\u212A
+
+\u03AC
+\u1F71 /* { dg-warning "not in NFC" } */
+
+\uAC00
+\u1100\u1161
+\uAC01
+\u1100\u1161\u11A8
+\uAC00\u11A8
diff --git a/gcc/testsuite/gcc.dg/cpp/normalize-4.c b/gcc/testsuite/gcc.dg/cpp/normalize-4.c
new file mode 100644 (file)
index 0000000..1ee3ff5
--- /dev/null
@@ -0,0 +1,34 @@
+/* { dg-do preprocess } */
+/* { dg-options "-std=c99 -Wnormalized=none" } */
+
+\u00AA
+\u00B7
+\u0F43
+a\u05B8\u05B9\u05B9\u05BBb
+ a\u05BB\u05B9\u05B8\u05B9b
+\u09CB
+\u09C7\u09BE
+\u0B4B
+\u0B47\u0B3E
+\u0BCA
+\u0BC6\u0BBE
+\u0BCB
+\u0BC7\u0BBE
+\u0CCA
+\u0CC6\u0CC2
+\u0D4A
+\u0D46\u0D3E
+\u0D4B
+\u0D47\u0D3E
+
+K
+\u212A
+
+\u03AC
+\u1F71
+
+\uAC00
+\u1100\u1161
+\uAC01
+\u1100\u1161\u11A8
+\uAC00\u11A8
diff --git a/gcc/testsuite/gcc.dg/cpp/ucnid-4.c b/gcc/testsuite/gcc.dg/cpp/ucnid-4.c
new file mode 100644 (file)
index 0000000..e41a3f5
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do preprocess } */
+/* { dg-options "-std=c99" } */
+
+\u00AA
+\u00AB /* { dg-error "not valid in an identifier" } */
+\u00B6 /* { dg-error "not valid in an identifier" } */
+\u00BA
+\u00C0
+\u00D6
+\u0384
+
+\u0669 /* { dg-error "not valid at the start of an identifier" } */
+A\u0669
+0\u00BA
+0\u0669
+\u0E59 /* { dg-error "not valid at the start of an identifier" } */
+A\u0E59
diff --git a/gcc/testsuite/gcc.dg/cpp/ucnid-5.c b/gcc/testsuite/gcc.dg/cpp/ucnid-5.c
new file mode 100644 (file)
index 0000000..8fcaeac
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do preprocess } */
+/* { dg-options "-std=c99 -pedantic" } */
+
+\u00AA
+\u00AB /* { dg-error "not valid in an identifier" } */
+\u00B6 /* { dg-error "not valid in an identifier" } */
+\u00BA
+\u00C0
+\u00D6
+\u0384 /* { dg-error "not valid in an identifier" } */
+
+\u0669 /* { dg-error "not valid at the start of an identifier" } */
+A\u0669
+0\u00BA
+0\u0669
+\u0E59 /* { dg-error "not valid at the start of an identifier" } */
+A\u0E59
index 5190599..9f4303c 100644 (file)
@@ -1,3 +1,32 @@
+2005-03-14  Geoffrey Keating  <geoffk@apple.com>
+
+       * init.c (cpp_create_reader): Default warn_normalize to normalized_C.
+       * charset.c: Update for new format of ucnid.h.
+       (ucn_valid_in_identifier): Update for new format of ucnid.h.
+       Add NST parameter, and update it; update callers.
+       (cpp_valid_ucn): Add NST parameter, update callers.  Replace abort
+       with cpp_error.
+       (convert_ucn): Pass normalize_state to cpp_valid_ucn.
+       * internal.h (struct normalize_state): New.
+       (INITIAL_NORMALIZE_STATE): New.
+       (NORMALIZE_STATE_RESULT): New.
+       (NORMALIZE_STATE_UPDATE_IDNUM): New.
+       (_cpp_valid_ucn): New.
+       * lex.c (warn_about_normalization): New.
+       (forms_identifier_p): Add normalize_state parameter, update callers.
+       (lex_identifier): Add normalize_state parameter, update callers.  Keep
+       the state current.
+       (lex_number): Likewise.
+       (_cpp_lex_direct): Pass normalize_state to subroutines.  Check
+       it with warn_about_normalization.
+       * makeucnid.c: New.
+       * ucnid.h: Replace.
+       * ucnid.pl: Remove.
+       * ucnid.tab: Make appropriate for input to makeucnid.c.  Remove
+       comments about obsolete version of C++.
+       * include/cpplib.h (enum cpp_normalize_level): New.
+       (struct cpp_options): Add warn_normalize field.
+
 2005-03-11  Geoffrey Keating  <geoffk@apple.com>
 
        * directives.c (glue_header_name): Update call to cpp_spell_token.
index cd25f10..f028b37 100644 (file)
@@ -22,7 +22,6 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "system.h"
 #include "cpplib.h"
 #include "internal.h"
-#include "ucnid.h"
 
 /* Character set handling for C-family languages.
 
@@ -786,43 +785,128 @@ width_to_mask (size_t width)
     return ((size_t) 1 << width) - 1;
 }
 
+/* A large table of unicode character information.  */
+enum {
+  /* Valid in a C99 identifier?  */
+  C99 = 1,
+  /* Valid in a C99 identifier, but not as the first character?  */
+  DIG = 2,
+  /* Valid in a C++ identifier?  */
+  CXX = 4,
+  /* NFC representation is not valid in an identifier?  */
+  CID = 8,
+  /* Might be valid NFC form?  */
+  NFC = 16,
+  /* Might be valid NFKC form?  */
+  NKC = 32,
+  /* Certain preceding characters might make it not valid NFC/NKFC form?  */
+  CTX = 64
+};
+
+static const struct {
+  /* Bitmap of flags above.  */
+  unsigned char flags;
+  /* Combining class of the character.  */
+  unsigned char combine;
+  /* Last character in the range described by this entry.  */
+  unsigned short end;
+} ucnranges[] = {
+#include "ucnid.h"
+};
+
 /* Returns 1 if C is valid in an identifier, 2 if C is valid except at
    the start of an identifier, and 0 if C is not valid in an
    identifier.  We assume C has already gone through the checks of
-   _cpp_valid_ucn.  The algorithm is a simple binary search on the
-   table defined in cppucnid.h.  */
+   _cpp_valid_ucn.  Also update NST for C if returning nonzero.  The
+   algorithm is a simple binary search on the table defined in
+   ucnid.h.  */
 
 static int
-ucn_valid_in_identifier (cpp_reader *pfile, cppchar_t c)
+ucn_valid_in_identifier (cpp_reader *pfile, cppchar_t c,
+                        struct normalize_state *nst)
 {
   int mn, mx, md;
 
-  mn = -1;
-  mx = ARRAY_SIZE (ucnranges);
-  while (mx - mn > 1)
+  if (c > 0xFFFF)
+    return 0;
+
+  mn = 0;
+  mx = ARRAY_SIZE (ucnranges) - 1;
+  while (mx != mn)
     {
       md = (mn + mx) / 2;
-      if (c < ucnranges[md].lo)
+      if (c <= ucnranges[md].end)
        mx = md;
-      else if (c > ucnranges[md].hi)
-       mn = md;
       else
-       goto found;
+       mn = md + 1;
     }
-  return 0;
 
- found:
   /* When -pedantic, we require the character to have been listed by
      the standard for the current language.  Otherwise, we accept the
      union of the acceptable sets for C++98 and C99.  */
+  if (! (ucnranges[mn].flags & (C99 | CXX)))
+      return 0;
+
   if (CPP_PEDANTIC (pfile)
-      && ((CPP_OPTION (pfile, c99) && !(ucnranges[md].flags & C99))
+      && ((CPP_OPTION (pfile, c99) && !(ucnranges[mn].flags & C99))
          || (CPP_OPTION (pfile, cplusplus)
-             && !(ucnranges[md].flags & CXX))))
+             && !(ucnranges[mn].flags & CXX))))
     return 0;
 
+  /* Update NST.  */
+  if (ucnranges[mn].combine != 0 && ucnranges[mn].combine < nst->prev_class)
+    nst->level = normalized_none;
+  else if (ucnranges[mn].flags & CTX)
+    {
+      bool safe;
+      cppchar_t p = nst->previous;
+
+      /* Easy cases from Bengali, Oriya, Tamil, Jannada, and Malayalam.  */
+      if (c == 0x09BE)
+       safe = p != 0x09C7;  /* Use 09CB instead of 09C7 09BE.  */
+      else if (c == 0x0B3E)
+       safe = p != 0x0B47;  /* Use 0B4B instead of 0B47 0B3E.  */
+      else if (c == 0x0BBE)
+       safe = p != 0x0BC6 && p != 0x0BC7;  /* Use 0BCA/0BCB instead.  */
+      else if (c == 0x0CC2)
+       safe = p != 0x0CC6;  /* Use 0CCA instead of 0CC6 0CC2.  */
+      else if (c == 0x0D3E)
+       safe = p != 0x0D46 && p != 0x0D47;  /* Use 0D4A/0D4B instead.  */
+      /* For Hangul, characters in the range AC00-D7A3 are NFC/NFKC,
+        and are combined algorithmically from a sequence of the form
+        1100-1112 1161-1175 11A8-11C2
+        (if the third is not present, it is treated as 11A7, which is not
+        really a valid character).
+        Unfortunately, C99 allows (only) the NFC form, but C++ allows
+        only the combining characters.  */
+      else if (c >= 0x1161 && c <= 0x1175)
+       safe = p < 0x1100 || p > 0x1112;
+      else if (c >= 0x11A8 && c <= 0x11C2)
+       safe = (p < 0xAC00 || p > 0xD7A3 || (p - 0xAC00) % 28 != 0);
+      else
+       {
+         /* Uh-oh, someone updated ucnid.h without updating this code.  */
+         cpp_error (pfile, CPP_DL_ICE, "Character %x might not be NFKC", c);
+         safe = true;
+       }
+      if (!safe && c < 0x1161)
+       nst->level = normalized_none;
+      else if (!safe)
+       nst->level = MAX (nst->level, normalized_identifier_C);
+    }
+  else if (ucnranges[mn].flags & NKC)
+    ;
+  else if (ucnranges[mn].flags & NFC)
+    nst->level = MAX (nst->level, normalized_C);
+  else if (ucnranges[mn].flags & CID)
+    nst->level = MAX (nst->level, normalized_identifier_C);
+  else
+    nst->level = normalized_none;
+  nst->previous = c;
+  nst->prev_class = ucnranges[mn].combine;
+
   /* In C99, UCN digits may not begin identifiers.  */
-  if (CPP_OPTION (pfile, c99) && (ucnranges[md].flags & DIG))
+  if (CPP_OPTION (pfile, c99) && (ucnranges[mn].flags & DIG))
     return 2;
 
   return 1;
@@ -853,7 +937,8 @@ ucn_valid_in_identifier (cpp_reader *pfile, cppchar_t c)
 
 cppchar_t
 _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr,
-               const uchar *limit, int identifier_pos)
+               const uchar *limit, int identifier_pos,
+               struct normalize_state *nst)
 {
   cppchar_t result, c;
   unsigned int length;
@@ -873,7 +958,10 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr,
   else if (str[-1] == 'U')
     length = 8;
   else
-    abort();
+    {
+      cpp_error (pfile, CPP_DL_ICE, "In _cpp_valid_ucn but not a UCN");
+      length = 4;
+    }
 
   result = 0;
   do
@@ -915,10 +1003,11 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr,
          CPP_OPTION (pfile, warn_dollars) = 0;
          cpp_error (pfile, CPP_DL_PEDWARN, "'$' in identifier or number");
        }
+      NORMALIZE_STATE_UPDATE_IDNUM (nst);
     }
   else if (identifier_pos)
     {
-      int validity = ucn_valid_in_identifier (pfile, result);
+      int validity = ucn_valid_in_identifier (pfile, result, nst);
 
       if (validity == 0)
        cpp_error (pfile, CPP_DL_ERROR,
@@ -950,9 +1039,10 @@ convert_ucn (cpp_reader *pfile, const uchar *from, const uchar *limit,
   int rval;
   struct cset_converter cvt
     = wide ? pfile->wide_cset_desc : pfile->narrow_cset_desc;
+  struct normalize_state nst = INITIAL_NORMALIZE_STATE;
 
   from++;  /* Skip u/U.  */
-  ucn = _cpp_valid_ucn (pfile, &from, limit, 0);
+  ucn = _cpp_valid_ucn (pfile, &from, limit, 0, &nst);
 
   rval = one_cppchar_to_utf8 (ucn, &bufp, &bytesleft);
   if (rval)
index ccf8bff..321de40 100644 (file)
@@ -236,6 +236,19 @@ typedef CPPCHAR_SIGNED_T cppchar_signed_t;
 /* Style of header dependencies to generate.  */
 enum cpp_deps_style { DEPS_NONE = 0, DEPS_USER, DEPS_SYSTEM };
 
+/* The possible normalization levels, from most restrictive to least.  */
+enum cpp_normalize_level {
+  /* In NFKC.  */
+  normalized_KC = 0,
+  /* In NFC.  */
+  normalized_C,
+  /* In NFC, except for subsequences where being in NFC would make
+     the identifier invalid.  */
+  normalized_identifier_C,
+  /* Not normalized at all.  */
+  normalized_none
+};
+
 /* This structure is nested inside struct cpp_reader, and
    carries all the options visible to the command line.  */
 struct cpp_options
@@ -373,6 +386,10 @@ struct cpp_options
   /* Holds the name of the input character set.  */
   const char *input_charset;
 
+  /* The minimum permitted level of normalization before a warning
+     is generated.  */
+  enum cpp_normalize_level warn_normalize;
+
   /* True to warn about precompiled header files we couldn't use.  */
   bool warn_invalid_pch;
 
index 39e50f5..7ad5a73 100644 (file)
@@ -153,6 +153,7 @@ cpp_create_reader (enum c_lang lang, hash_table *table,
   CPP_OPTION (pfile, dollars_in_ident) = 1;
   CPP_OPTION (pfile, warn_dollars) = 1;
   CPP_OPTION (pfile, warn_variadic_macros) = 1;
+  CPP_OPTION (pfile, warn_normalize) = normalized_C;
 
   /* Default CPP arithmetic to something sensible for the host for the
      benefit of dumb users like fix-header.  */
index af823d7..f0bd537 100644 (file)
@@ -564,8 +564,31 @@ extern unsigned char *_cpp_copy_replacement_text (const cpp_macro *,
 extern size_t _cpp_replacement_text_len (const cpp_macro *);
 
 /* In charset.c.  */
+
+/* The normalization state at this point in the sequence.
+   It starts initialized to all zeros, and at the end
+   'level' is the normalization level of the sequence.  */
+
+struct normalize_state 
+{
+  /* The previous character.  */
+  cppchar_t previous;
+  /* The combining class of the previous character.  */
+  unsigned char prev_class;
+  /* The lowest normalization level so far.  */
+  enum cpp_normalize_level level;
+};
+#define INITIAL_NORMALIZE_STATE { 0, 0, normalized_KC }
+#define NORMALIZE_STATE_RESULT(st) ((st)->level)
+
+/* We saw a character that matches ISIDNUM(), update a
+   normalize_state appropriately.  */
+#define NORMALIZE_STATE_UPDATE_IDNUM(st) \
+  ((st)->previous = 0, (st)->prev_class = 0)
+
 extern cppchar_t _cpp_valid_ucn (cpp_reader *, const unsigned char **,
-                                const unsigned char *, int);
+                                const unsigned char *, int,
+                                struct normalize_state *state);
 extern void _cpp_destroy_iconv (cpp_reader *);
 extern unsigned char *_cpp_convert_input (cpp_reader *, const char *,
                                          unsigned char *, size_t, size_t,
index 8398c7c..9bcb91c 100644 (file)
@@ -53,9 +53,6 @@ static const struct token_spelling token_spellings[N_TTYPES] = { TTYPE_TABLE };
 static void add_line_note (cpp_buffer *, const uchar *, unsigned int);
 static int skip_line_comment (cpp_reader *);
 static void skip_whitespace (cpp_reader *, cppchar_t);
-static cpp_hashnode *lex_identifier (cpp_reader *, const uchar *, bool);
-static void lex_number (cpp_reader *, cpp_string *);
-static bool forms_identifier_p (cpp_reader *, int);
 static void lex_string (cpp_reader *, cpp_token *, const uchar *);
 static void save_comment (cpp_reader *, cpp_token *, const uchar *, cppchar_t);
 static void create_literal (cpp_reader *, cpp_token *, const uchar *,
@@ -430,10 +427,36 @@ name_p (cpp_reader *pfile, const cpp_string *string)
   return 1;
 }
 
+/* After parsing an identifier or other sequence, produce a warning about
+   sequences not in NFC/NFKC.  */
+static void
+warn_about_normalization (cpp_reader *pfile, 
+                         const cpp_token *token,
+                         const struct normalize_state *s)
+{
+  if (CPP_OPTION (pfile, warn_normalize) < NORMALIZE_STATE_RESULT (s)
+      && !pfile->state.skipping)
+    {
+      /* Make sure that the token is printed using UCNs, even
+        if we'd otherwise happily print UTF-8.  */
+      unsigned char *buf = xmalloc (cpp_token_len (token));
+      size_t sz;
+
+      sz = cpp_spell_token (pfile, token, buf, false) - buf;
+      if (NORMALIZE_STATE_RESULT (s) == normalized_C)
+       cpp_error_with_line (pfile, CPP_DL_WARNING, token->src_loc, 0,
+                            "`%.*s' is not in NFKC", sz, buf);
+      else
+       cpp_error_with_line (pfile, CPP_DL_WARNING, token->src_loc, 0,
+                            "`%.*s' is not in NFC", sz, buf);
+    }
+}
+
 /* Returns TRUE if the sequence starting at buffer->cur is invalid in
    an identifier.  FIRST is TRUE if this starts an identifier.  */
 static bool
-forms_identifier_p (cpp_reader *pfile, int first)
+forms_identifier_p (cpp_reader *pfile, int first,
+                   struct normalize_state *state)
 {
   cpp_buffer *buffer = pfile->buffer;
 
@@ -457,7 +480,8 @@ forms_identifier_p (cpp_reader *pfile, int first)
       && (buffer->cur[1] == 'u' || buffer->cur[1] == 'U'))
     {
       buffer->cur += 2;
-      if (_cpp_valid_ucn (pfile, &buffer->cur, buffer->rlimit, 1 + !first))
+      if (_cpp_valid_ucn (pfile, &buffer->cur, buffer->rlimit, 1 + !first,
+                         state))
        return true;
       buffer->cur -= 2;
     }
@@ -467,7 +491,8 @@ forms_identifier_p (cpp_reader *pfile, int first)
 
 /* Lex an identifier starting at BUFFER->CUR - 1.  */
 static cpp_hashnode *
-lex_identifier (cpp_reader *pfile, const uchar *base, bool starts_ucn)
+lex_identifier (cpp_reader *pfile, const uchar *base, bool starts_ucn,
+               struct normalize_state *nst)
 {
   cpp_hashnode *result;
   const uchar *cur;
@@ -482,13 +507,16 @@ lex_identifier (cpp_reader *pfile, const uchar *base, bool starts_ucn)
        cur++;
       }
   pfile->buffer->cur = cur;
-  if (starts_ucn || forms_identifier_p (pfile, false))
+  if (starts_ucn || forms_identifier_p (pfile, false, nst))
     {
       /* Slower version for identifiers containing UCNs (or $).  */
       do {
        while (ISIDNUM (*pfile->buffer->cur))
-         pfile->buffer->cur++;
-      } while (forms_identifier_p (pfile, false));
+         {
+           pfile->buffer->cur++;
+           NORMALIZE_STATE_UPDATE_IDNUM (nst);
+         }
+      } while (forms_identifier_p (pfile, false, nst));
       result = _cpp_interpret_identifier (pfile, base,
                                          pfile->buffer->cur - base);
     }
@@ -524,7 +552,8 @@ lex_identifier (cpp_reader *pfile, const uchar *base, bool starts_ucn)
 
 /* Lex a number to NUMBER starting at BUFFER->CUR - 1.  */
 static void
-lex_number (cpp_reader *pfile, cpp_string *number)
+lex_number (cpp_reader *pfile, cpp_string *number,
+           struct normalize_state *nst)
 {
   const uchar *cur;
   const uchar *base;
@@ -537,11 +566,14 @@ lex_number (cpp_reader *pfile, cpp_string *number)
 
       /* N.B. ISIDNUM does not include $.  */
       while (ISIDNUM (*cur) || *cur == '.' || VALID_SIGN (*cur, cur[-1]))
-       cur++;
+       {
+         cur++;
+         NORMALIZE_STATE_UPDATE_IDNUM (nst);
+       }
 
       pfile->buffer->cur = cur;
     }
-  while (forms_identifier_p (pfile, false));
+  while (forms_identifier_p (pfile, false, nst));
 
   number->len = cur - base;
   dest = _cpp_unaligned_alloc (pfile, number->len + 1);
@@ -897,9 +929,13 @@ _cpp_lex_direct (cpp_reader *pfile)
 
     case '0': case '1': case '2': case '3': case '4':
     case '5': case '6': case '7': case '8': case '9':
-      result->type = CPP_NUMBER;
-      lex_number (pfile, &result->val.str);
-      break;
+      {
+       struct normalize_state nst = INITIAL_NORMALIZE_STATE;
+       result->type = CPP_NUMBER;
+       lex_number (pfile, &result->val.str, &nst);
+       warn_about_normalization (pfile, result, &nst);
+       break;
+      }
 
     case 'L':
       /* 'L' may introduce wide characters or strings.  */
@@ -922,7 +958,12 @@ _cpp_lex_direct (cpp_reader *pfile)
     case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
     case 'Y': case 'Z':
       result->type = CPP_NAME;
-      result->val.node = lex_identifier (pfile, buffer->cur - 1, false);
+      {
+       struct normalize_state nst = INITIAL_NORMALIZE_STATE;
+       result->val.node = lex_identifier (pfile, buffer->cur - 1, false,
+                                          &nst);
+       warn_about_normalization (pfile, result, &nst);
+      }
 
       /* Convert named operators to their proper types.  */
       if (result->val.node->flags & NODE_OPERATOR)
@@ -1067,8 +1108,10 @@ _cpp_lex_direct (cpp_reader *pfile)
       result->type = CPP_DOT;
       if (ISDIGIT (*buffer->cur))
        {
+         struct normalize_state nst = INITIAL_NORMALIZE_STATE;
          result->type = CPP_NUMBER;
-         lex_number (pfile, &result->val.str);
+         lex_number (pfile, &result->val.str, &nst);
+         warn_about_normalization (pfile, result, &nst);
        }
       else if (*buffer->cur == '.' && buffer->cur[1] == '.')
        buffer->cur += 2, result->type = CPP_ELLIPSIS;
@@ -1151,11 +1194,13 @@ _cpp_lex_direct (cpp_reader *pfile)
     case '\\':
       {
        const uchar *base = --buffer->cur;
+       struct normalize_state nst = INITIAL_NORMALIZE_STATE;
 
-       if (forms_identifier_p (pfile, true))
+       if (forms_identifier_p (pfile, true, &nst))
          {
            result->type = CPP_NAME;
-           result->val.node = lex_identifier (pfile, base, true);
+           result->val.node = lex_identifier (pfile, base, true, &nst);
+           warn_about_normalization (pfile, result, &nst);
            break;
          }
        buffer->cur++;
diff --git a/libcpp/makeucnid.c b/libcpp/makeucnid.c
new file mode 100644 (file)
index 0000000..f969f99
--- /dev/null
@@ -0,0 +1,342 @@
+/* Make ucnid.h from various sources.
+   Copyright (C) 2005 Free Software Foundation, Inc.
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+/* Run this program as
+   ./makeucnid ucnid.tab UnicodeData.txt DerivedNormalizationProps.txt \
+       > ucnid.h
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+enum {
+  C99 = 1,
+  CXX = 2,
+  digit = 4,
+  not_NFC = 8,
+  not_NFKC = 16,
+  maybe_not_NFC = 32
+};
+
+static unsigned flags[65536];
+static unsigned short decomp[65536][2];
+static unsigned char combining_value[65536];
+
+/* Die!  */
+
+static void
+fail (const char *s)
+{
+  fprintf (stderr, "%s\n", s);
+  exit (1);
+}
+
+/* Read ucnid.tab and set the C99 and CXX flags in header[].  */
+
+static void
+read_ucnid (const char *fname)
+{
+  FILE *f = fopen (fname, "r");
+  unsigned fl = 0;
+  
+  if (!f)
+    fail ("opening ucnid.tab");
+  for (;;)
+    {
+      char line[256];
+
+      if (!fgets (line, sizeof (line), f))
+       break;
+      if (strcmp (line, "[C99]\n") == 0)
+       fl = C99;
+      else if (strcmp (line, "[CXX]\n") == 0)
+       fl = CXX;
+      else if (isxdigit (line[0]))
+       {
+         char *l = line;
+         while (*l)
+           {
+             unsigned long start, end;
+             char *endptr;
+             start = strtoul (l, &endptr, 16);
+             if (endptr == l || (*endptr != '-' && ! isspace (*endptr)))
+               fail ("parsing ucnid.tab [1]");
+             l = endptr;
+             if (*l != '-')
+               end = start;
+             else
+               {
+                 end = strtoul (l + 1, &endptr, 16);
+                 if (end < start)
+                   fail ("parsing ucnid.tab, end before start");
+                 l = endptr;
+                 if (! isspace (*l))
+                   fail ("parsing ucnid.tab, junk after range");
+               }
+             while (isspace (*l))
+               l++;
+             if (end > 0xFFFF)
+               fail ("parsing ucnid.tab, end too large");
+             while (start <= end)
+               flags[start++] |= fl;
+           }
+       }
+    }
+  if (ferror (f))
+    fail ("reading ucnid.tab");
+  fclose (f);
+}
+
+/* Read UnicodeData.txt and set the 'digit' flag, and
+   also fill in the 'decomp' table to be the decompositions of
+   characters for which both the character decomposed and all the code
+   points in the decomposition are either C99 or CXX.  */
+
+static void
+read_table (char *fname)
+{
+  FILE * f = fopen (fname, "r");
+  
+  if (!f)
+    fail ("opening UnicodeData.txt");
+  for (;;)
+    {
+      char line[256];
+      unsigned long codepoint, this_decomp[4];
+      char *l;
+      int i;
+      int decomp_useful;
+
+      if (!fgets (line, sizeof (line), f))
+       break;
+      codepoint = strtoul (line, &l, 16);
+      if (l == line || *l != ';')
+       fail ("parsing UnicodeData.txt, reading code point");
+      if (codepoint > 0xffff || ! (flags[codepoint] & (C99 | CXX)))
+       continue;
+
+      do {
+       l++;
+      } while (*l != ';');
+      /* Category value; things starting with 'N' are numbers of some
+        kind.  */
+      if (*++l == 'N')
+       flags[codepoint] |= digit;
+
+      do {
+       l++;
+      } while (*l != ';');
+      /* Canonical combining class; in NFC/NFKC, they must be increasing
+        (or zero).  */
+      if (! isdigit (*++l))
+       fail ("parsing UnicodeData.txt, combining class not number");
+      combining_value[codepoint] = strtoul (l, &l, 10);
+      if (*l++ != ';')
+       fail ("parsing UnicodeData.txt, junk after combining class");
+       
+      /* Skip over bidi value.  */
+      do {
+       l++;
+      } while (*l != ';');
+      
+      /* Decomposition mapping.  */
+      decomp_useful = flags[codepoint];
+      if (*++l == '<')  /* Compatibility mapping. */
+       continue;
+      for (i = 0; i < 4; i++)
+       {
+         if (*l == ';')
+           break;
+         if (!isxdigit (*l))
+           fail ("parsing UnicodeData.txt, decomposition format");
+         this_decomp[i] = strtoul (l, &l, 16);
+         decomp_useful &= flags[this_decomp[i]];
+         while (isspace (*l))
+           l++;
+       }
+      if (i > 2)  /* Decomposition too long.  */
+       fail ("parsing UnicodeData.txt, decomposition too long");
+      if (decomp_useful)
+       while (--i >= 0)
+         decomp[codepoint][i] = this_decomp[i];
+    }
+  if (ferror (f))
+    fail ("reading UnicodeData.txt");
+  fclose (f);
+}
+
+/* Read DerivedNormalizationProps.txt and set the flags that say whether
+   a character is in NFC, NFKC, or is context-dependent.  */
+
+static void
+read_derived (const char *fname)
+{
+  FILE * f = fopen (fname, "r");
+  
+  if (!f)
+    fail ("opening DerivedNormalizationProps.txt");
+  for (;;)
+    {
+      char line[256];
+      unsigned long start, end;
+      char *l;
+      bool not_NFC_p, not_NFKC_p, maybe_not_NFC_p;
+
+      if (!fgets (line, sizeof (line), f))
+       break;
+      not_NFC_p = (strstr (line, "; NFC_QC; N") != NULL);
+      not_NFKC_p = (strstr (line, "; NFKC_QC; N") != NULL);
+      maybe_not_NFC_p = (strstr (line, "; NFC_QC; M") != NULL);
+      if (! not_NFC_p && ! not_NFKC_p && ! maybe_not_NFC_p)
+       continue;
+       
+      start = strtoul (line, &l, 16);
+      if (l == line)
+       fail ("parsing DerivedNormalizationProps.txt, reading start");
+      if (start > 0xffff)
+       continue;
+      if (*l == '.' && l[1] == '.')
+       end = strtoul (l + 2, &l, 16);
+      else
+       end = start;
+
+      while (start <= end)
+       flags[start++] |= ((not_NFC_p ? not_NFC : 0) 
+                          | (not_NFKC_p ? not_NFKC : 0)
+                          | (maybe_not_NFC_p ? maybe_not_NFC : 0)
+                          );
+    }
+  if (ferror (f))
+    fail ("reading DerivedNormalizationProps.txt");
+  fclose (f);
+}
+
+/* Write out the table.
+   The table consists of two words per entry.  The first word is the flags
+   for the unicode code points up to and including the second word.  */
+
+static void
+write_table (void)
+{
+  unsigned i;
+  unsigned last_flag = flags[0];
+  bool really_safe = decomp[0][0] == 0;
+  unsigned char last_combine = combining_value[0];
+  
+  for (i = 1; i <= 65536; i++)
+    if (i == 65536
+       || (flags[i] != last_flag && ((flags[i] | last_flag) & (C99 | CXX)))
+       || really_safe != (decomp[i][0] == 0)
+       || combining_value[i] != last_combine)
+      {
+       printf ("{ %s|%s|%s|%s|%s|%s|%s, %3d, %#06x },\n",
+               last_flag & C99 ? "C99" : "  0",
+               last_flag & digit ? "DIG" : "  0",
+               last_flag & CXX ? "CXX" : "  0",
+               really_safe ? "CID" : "  0",
+               last_flag & not_NFC ? "  0" : "NFC",
+               last_flag & not_NFKC ? "  0" : "NKC",
+               last_flag & maybe_not_NFC ? "CTX" : "  0",
+               combining_value[i - 1],
+               i - 1);
+       last_flag = flags[i];
+       last_combine = combining_value[0];
+       really_safe = decomp[i][0] == 0;
+      }
+}
+
+/* Print out the huge copyright notice.  */
+
+static void
+write_copyright (void)
+{
+  static const char copyright[] = "\
+/* Unicode characters and various properties.\n\
+   Copyright (C) 2003, 2005 Free Software Foundation, Inc.\n\
+\n\
+   This program is free software; you can redistribute it and/or modify it\n\
+   under the terms of the GNU General Public License as published by the\n\
+   Free Software Foundation; either version 2, or (at your option) any\n\
+   later version.\n\
+\n\
+   This program is distributed in the hope that it will be useful,\n\
+   but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\
+   GNU General Public License for more details.\n\
+\n\
+   You should have received a copy of the GNU General Public License\n\
+   along with this program; if not, write to the Free Software\n\
+   Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n\
+\n\
+\n\
+   Copyright (C) 1991-2005 Unicode, Inc.  All rights reserved.\n\
+   Distributed under the Terms of Use in\n\
+   http://www.unicode.org/copyright.html.\n\
+\n\
+   Permission is hereby granted, free of charge, to any person\n\
+   obtaining a copy of the Unicode data files and any associated\n\
+   documentation (the \"Data Files\") or Unicode software and any\n\
+   associated documentation (the \"Software\") to deal in the Data Files\n\
+   or Software without restriction, including without limitation the\n\
+   rights to use, copy, modify, merge, publish, distribute, and/or\n\
+   sell copies of the Data Files or Software, and to permit persons to\n\
+   whom the Data Files or Software are furnished to do so, provided\n\
+   that (a) the above copyright notice(s) and this permission notice\n\
+   appear with all copies of the Data Files or Software, (b) both the\n\
+   above copyright notice(s) and this permission notice appear in\n\
+   associated documentation, and (c) there is clear notice in each\n\
+   modified Data File or in the Software as well as in the\n\
+   documentation associated with the Data File(s) or Software that the\n\
+   data or software has been modified.\n\
+\n\
+   THE DATA FILES AND SOFTWARE ARE PROVIDED \"AS IS\", WITHOUT WARRANTY\n\
+   OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n\
+   WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n\
+   NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE\n\
+   COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR\n\
+   ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY\n\
+   DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,\n\
+   WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS\n\
+   ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE\n\
+   OF THE DATA FILES OR SOFTWARE.\n\
+\n\
+   Except as contained in this notice, the name of a copyright holder\n\
+   shall not be used in advertising or otherwise to promote the sale,\n\
+   use or other dealings in these Data Files or Software without prior\n\
+   written authorization of the copyright holder.  */\n";
+   
+   puts (copyright);
+}
+
+/* Main program.  */
+
+int
+main(int argc, char ** argv)
+{
+  if (argc != 4)
+    fail ("too few arguments to makeucn");
+  read_ucnid (argv[1]);
+  read_table (argv[2]);
+  read_derived (argv[3]);
+
+  write_copyright ();
+  write_table ();
+  return 0;
+}
index 04c9513..3eff710 100644 (file)
-/* Table of UCNs which are valid in identifiers.
-   Copyright (C) 2003 Free Software Foundation, Inc.
+/* Unicode characters and various properties.
+   Copyright (C) 2003, 2005 Free Software Foundation, Inc.
 
-This program is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 2, or (at your option) any
-later version.
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by the
+   Free Software Foundation; either version 2, or (at your option) any
+   later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
-/* Automatically generated from cppucnid.tab, do not edit */
 
-/* This file reproduces the table in ISO/IEC 9899:1999 (C99) Annex
-   D, which is itself a reproduction from ISO/IEC TR 10176:1998, and
-   the similar table from ISO/IEC 14882:1988 (C++98) Annex E, which is
-   a reproduction of ISO/IEC PDTR 10176.  Unfortunately these tables
-   are not identical.  */
+   Copyright (C) 1991-2005 Unicode, Inc.  All rights reserved.
+   Distributed under the Terms of Use in
+   http://www.unicode.org/copyright.html.
 
-#ifndef LIBCPP_UCNID_H
-#define LIBCPP_UCNID_H
+   Permission is hereby granted, free of charge, to any person
+   obtaining a copy of the Unicode data files and any associated
+   documentation (the "Data Files") or Unicode software and any
+   associated documentation (the "Software") to deal in the Data Files
+   or Software without restriction, including without limitation the
+   rights to use, copy, modify, merge, publish, distribute, and/or
+   sell copies of the Data Files or Software, and to permit persons to
+   whom the Data Files or Software are furnished to do so, provided
+   that (a) the above copyright notice(s) and this permission notice
+   appear with all copies of the Data Files or Software, (b) both the
+   above copyright notice(s) and this permission notice appear in
+   associated documentation, and (c) there is clear notice in each
+   modified Data File or in the Software as well as in the
+   documentation associated with the Data File(s) or Software that the
+   data or software has been modified.
 
-#define C99 1
-#define CXX 2
-#define DIG 4
+   THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY
+   OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+   WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+   NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE
+   COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR
+   ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY
+   DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+   WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+   ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+   OF THE DATA FILES OR SOFTWARE.
 
-struct ucnrange
-{
-  unsigned short lo, hi;
-  unsigned short flags;
-};
+   Except as contained in this notice, the name of a copyright holder
+   shall not be used in advertising or otherwise to promote the sale,
+   use or other dealings in these Data Files or Software without prior
+   written authorization of the copyright holder.  */
 
-static const struct ucnrange ucnranges[] = {
-  { 0x00aa, 0x00aa,     C99     },  /* Latin */
-  { 0x00b5, 0x00b5,     C99     },  /* Special characters */
-  { 0x00b7, 0x00b7,     C99     },
-  { 0x00ba, 0x00ba,     C99     },  /* Latin */
-  { 0x00c0, 0x00d6, CXX|C99     },
-  { 0x00d8, 0x00f6, CXX|C99     },
-  { 0x00f8, 0x01f5, CXX|C99     },
-  { 0x01fa, 0x0217, CXX|C99     },
-  { 0x0250, 0x02a8, CXX|C99     },
-  { 0x02b0, 0x02b8,     C99     },  /* Special characters */
-  { 0x02bb, 0x02bb,     C99     },
-  { 0x02bd, 0x02c1,     C99     },
-  { 0x02d0, 0x02d1,     C99     },
-  { 0x02e0, 0x02e4,     C99     },
-  { 0x037a, 0x037a,     C99     },
-  { 0x0384, 0x0384, CXX         },  /* Greek */
-  { 0x0386, 0x0386,     C99     },
-  { 0x0388, 0x038a, CXX|C99     },
-  { 0x038c, 0x038c, CXX|C99     },
-  { 0x038e, 0x03a1, CXX|C99     },
-  { 0x03a3, 0x03ce, CXX|C99     },
-  { 0x03d0, 0x03d6, CXX|C99     },
-  { 0x03da, 0x03da, CXX|C99     },
-  { 0x03dc, 0x03dc, CXX|C99     },
-  { 0x03de, 0x03de, CXX|C99     },
-  { 0x03e0, 0x03e0, CXX|C99     },
-  { 0x03e2, 0x03f3, CXX|C99     },
-  { 0x0401, 0x040c, CXX|C99     },  /* Cyrillic */
-  { 0x040d, 0x040d, CXX         },
-  { 0x040e, 0x040e,     C99     },
-  { 0x040f, 0x044f, CXX|C99     },
-  { 0x0451, 0x045c, CXX|C99     },
-  { 0x045e, 0x0481, CXX|C99     },
-  { 0x0490, 0x04c4, CXX|C99     },
-  { 0x04c7, 0x04c8, CXX|C99     },
-  { 0x04cb, 0x04cc, CXX|C99     },
-  { 0x04d0, 0x04eb, CXX|C99     },
-  { 0x04ee, 0x04f5, CXX|C99     },
-  { 0x04f8, 0x04f9, CXX|C99     },
-  { 0x0531, 0x0556, CXX|C99     },  /* Armenian */
-  { 0x0559, 0x0559,     C99     },  /* Special characters */
-  { 0x0561, 0x0587, CXX|C99     },  /* Armenian */
-  { 0x05b0, 0x05b9,     C99     },  /* Hebrew */
-  { 0x05bb, 0x05bd,     C99     },
-  { 0x05bf, 0x05bf,     C99     },
-  { 0x05c1, 0x05c2,     C99     },
-  { 0x05d0, 0x05ea, CXX|C99     },
-  { 0x05f0, 0x05f2, CXX|C99     },
-  { 0x05f3, 0x05f4, CXX         },
-  { 0x0621, 0x063a, CXX|C99     },  /* Arabic */
-  { 0x0640, 0x0652, CXX|C99     },
-  { 0x0660, 0x0669,     C99|DIG },  /* Digits */
-  { 0x0670, 0x06b7, CXX|C99     },  /* Arabic */
-  { 0x06ba, 0x06be, CXX|C99     },
-  { 0x06c0, 0x06ce, CXX|C99     },
-  { 0x06d0, 0x06dc,     C99     },
-  { 0x06e5, 0x06e7, CXX|C99     },
-  { 0x06e8, 0x06e8,     C99     },
-  { 0x06ea, 0x06ed,     C99     },
-  { 0x06f0, 0x06f9,     C99|DIG },  /* Digits */
-  { 0x0901, 0x0903,     C99     },  /* Devanagari */
-  { 0x0905, 0x0939, CXX|C99     },
-  { 0x093d, 0x093d,     C99     },  /* Special characters */
-  { 0x093e, 0x094d,     C99     },  /* Devanagari */
-  { 0x0950, 0x0952,     C99     },
-  { 0x0958, 0x0962, CXX|C99     },
-  { 0x0963, 0x0963,     C99     },
-  { 0x0966, 0x096f,     C99|DIG },  /* Digits */
-  { 0x0981, 0x0983,     C99     },  /* Bengali */
-  { 0x0985, 0x098c, CXX|C99     },
-  { 0x098f, 0x0990, CXX|C99     },
-  { 0x0993, 0x09a8, CXX|C99     },
-  { 0x09aa, 0x09b0, CXX|C99     },
-  { 0x09b2, 0x09b2, CXX|C99     },
-  { 0x09b6, 0x09b9, CXX|C99     },
-  { 0x09be, 0x09c4,     C99     },
-  { 0x09c7, 0x09c8,     C99     },
-  { 0x09cb, 0x09cd,     C99     },
-  { 0x09dc, 0x09dd, CXX|C99     },
-  { 0x09df, 0x09e1, CXX|C99     },
-  { 0x09e2, 0x09e3,     C99     },
-  { 0x09e6, 0x09ef,     C99|DIG },  /* Digits */
-  { 0x09f0, 0x09f1, CXX|C99     },  /* Bengali */
-  { 0x0a02, 0x0a02,     C99     },  /* Gurmukhi */
-  { 0x0a05, 0x0a0a, CXX|C99     },
-  { 0x0a0f, 0x0a10, CXX|C99     },
-  { 0x0a13, 0x0a28, CXX|C99     },
-  { 0x0a2a, 0x0a30, CXX|C99     },
-  { 0x0a32, 0x0a33, CXX|C99     },
-  { 0x0a35, 0x0a36, CXX|C99     },
-  { 0x0a38, 0x0a39, CXX|C99     },
-  { 0x0a3e, 0x0a42,     C99     },
-  { 0x0a47, 0x0a48,     C99     },
-  { 0x0a4b, 0x0a4d,     C99     },
-  { 0x0a59, 0x0a5c, CXX|C99     },
-  { 0x0a5e, 0x0a5e, CXX|C99     },
-  { 0x0a66, 0x0a6f,     C99|DIG },  /* Digits */
-  { 0x0a74, 0x0a74,     C99     },  /* Gurmukhi */
-  { 0x0a81, 0x0a83,     C99     },  /* Gujarati */
-  { 0x0a85, 0x0a8b, CXX|C99     },
-  { 0x0a8d, 0x0a8d, CXX|C99     },
-  { 0x0a8f, 0x0a91, CXX|C99     },
-  { 0x0a93, 0x0aa8, CXX|C99     },
-  { 0x0aaa, 0x0ab0, CXX|C99     },
-  { 0x0ab2, 0x0ab3, CXX|C99     },
-  { 0x0ab5, 0x0ab9, CXX|C99     },
-  { 0x0abd, 0x0ac5,     C99     },
-  { 0x0ac7, 0x0ac9,     C99     },
-  { 0x0acb, 0x0acd,     C99     },
-  { 0x0ad0, 0x0ad0,     C99     },
-  { 0x0ae0, 0x0ae0, CXX|C99     },
-  { 0x0ae6, 0x0aef,     C99|DIG },  /* Digits */
-  { 0x0b01, 0x0b03,     C99     },  /* Oriya */
-  { 0x0b05, 0x0b0c, CXX|C99     },
-  { 0x0b0f, 0x0b10, CXX|C99     },
-  { 0x0b13, 0x0b28, CXX|C99     },
-  { 0x0b2a, 0x0b30, CXX|C99     },
-  { 0x0b32, 0x0b33, CXX|C99     },
-  { 0x0b36, 0x0b39, CXX|C99     },
-  { 0x0b3d, 0x0b3d,     C99     },  /* Special characters */
-  { 0x0b3e, 0x0b43,     C99     },  /* Oriya */
-  { 0x0b47, 0x0b48,     C99     },
-  { 0x0b4b, 0x0b4d,     C99     },
-  { 0x0b5c, 0x0b5d, CXX|C99     },
-  { 0x0b5f, 0x0b61, CXX|C99     },
-  { 0x0b66, 0x0b6f,     C99|DIG },  /* Digits */
-  { 0x0b82, 0x0b83,     C99     },  /* Tamil */
-  { 0x0b85, 0x0b8a, CXX|C99     },
-  { 0x0b8e, 0x0b90, CXX|C99     },
-  { 0x0b92, 0x0b95, CXX|C99     },
-  { 0x0b99, 0x0b9a, CXX|C99     },
-  { 0x0b9c, 0x0b9c, CXX|C99     },
-  { 0x0b9e, 0x0b9f, CXX|C99     },
-  { 0x0ba3, 0x0ba4, CXX|C99     },
-  { 0x0ba8, 0x0baa, CXX|C99     },
-  { 0x0bae, 0x0bb5, CXX|C99     },
-  { 0x0bb7, 0x0bb9, CXX|C99     },
-  { 0x0bbe, 0x0bc2,     C99     },
-  { 0x0bc6, 0x0bc8,     C99     },
-  { 0x0bca, 0x0bcd,     C99     },
-  { 0x0be7, 0x0bef,     C99|DIG },  /* Digits */
-  { 0x0c01, 0x0c03,     C99     },  /* Telugu */
-  { 0x0c05, 0x0c0c, CXX|C99     },
-  { 0x0c0e, 0x0c10, CXX|C99     },
-  { 0x0c12, 0x0c28, CXX|C99     },
-  { 0x0c2a, 0x0c33, CXX|C99     },
-  { 0x0c35, 0x0c39, CXX|C99     },
-  { 0x0c3e, 0x0c44,     C99     },
-  { 0x0c46, 0x0c48,     C99     },
-  { 0x0c4a, 0x0c4d,     C99     },
-  { 0x0c60, 0x0c61, CXX|C99     },
-  { 0x0c66, 0x0c6f,     C99|DIG },  /* Digits */
-  { 0x0c82, 0x0c83,     C99     },  /* Kannada */
-  { 0x0c85, 0x0c8c, CXX|C99     },
-  { 0x0c8e, 0x0c90, CXX|C99     },
-  { 0x0c92, 0x0ca8, CXX|C99     },
-  { 0x0caa, 0x0cb3, CXX|C99     },
-  { 0x0cb5, 0x0cb9, CXX|C99     },
-  { 0x0cbe, 0x0cc4,     C99     },
-  { 0x0cc6, 0x0cc8,     C99     },
-  { 0x0cca, 0x0ccd,     C99     },
-  { 0x0cde, 0x0cde,     C99     },
-  { 0x0ce0, 0x0ce1, CXX|C99     },
-  { 0x0ce6, 0x0cef,     C99|DIG },  /* Digits */
-  { 0x0d02, 0x0d03,     C99     },  /* Malayalam */
-  { 0x0d05, 0x0d0c, CXX|C99     },
-  { 0x0d0e, 0x0d10, CXX|C99     },
-  { 0x0d12, 0x0d28, CXX|C99     },
-  { 0x0d2a, 0x0d39, CXX|C99     },
-  { 0x0d3e, 0x0d43,     C99     },
-  { 0x0d46, 0x0d48,     C99     },
-  { 0x0d4a, 0x0d4d,     C99     },
-  { 0x0d60, 0x0d61, CXX|C99     },
-  { 0x0d66, 0x0d6f,     C99|DIG },  /* Digits */
-  { 0x0e01, 0x0e30, CXX|C99     },  /* Thai */
-  { 0x0e31, 0x0e31,     C99     },
-  { 0x0e32, 0x0e33, CXX|C99     },
-  { 0x0e34, 0x0e3a,     C99     },
-  { 0x0e40, 0x0e46, CXX|C99     },
-  { 0x0e47, 0x0e49,     C99     },
-  { 0x0e50, 0x0e59, CXX|C99|DIG },  /* Digits */
-  { 0x0e5a, 0x0e5b, CXX|C99     },  /* Thai */
-  { 0x0e81, 0x0e82, CXX|C99     },  /* Lao */
-  { 0x0e84, 0x0e84, CXX|C99     },
-  { 0x0e87, 0x0e88, CXX|C99     },
-  { 0x0e8a, 0x0e8a, CXX|C99     },
-  { 0x0e8d, 0x0e8d, CXX|C99     },
-  { 0x0e94, 0x0e97, CXX|C99     },
-  { 0x0e99, 0x0e9f, CXX|C99     },
-  { 0x0ea1, 0x0ea3, CXX|C99     },
-  { 0x0ea5, 0x0ea5, CXX|C99     },
-  { 0x0ea7, 0x0ea7, CXX|C99     },
-  { 0x0eaa, 0x0eab, CXX|C99     },
-  { 0x0ead, 0x0eae, CXX|C99     },
-  { 0x0eaf, 0x0eaf, CXX         },
-  { 0x0eb0, 0x0eb0, CXX|C99     },
-  { 0x0eb1, 0x0eb1,     C99     },
-  { 0x0eb2, 0x0eb3, CXX|C99     },
-  { 0x0eb4, 0x0eb9,     C99     },
-  { 0x0ebb, 0x0ebc,     C99     },
-  { 0x0ebd, 0x0ebd, CXX|C99     },
-  { 0x0ec0, 0x0ec4, CXX|C99     },
-  { 0x0ec6, 0x0ec6, CXX|C99     },
-  { 0x0ec8, 0x0ecd,     C99     },
-  { 0x0ed0, 0x0ed9,     C99|DIG },  /* Digits */
-  { 0x0edc, 0x0edd,     C99     },  /* Lao */
-  { 0x0f00, 0x0f00,     C99     },  /* Tibetan */
-  { 0x0f18, 0x0f19,     C99     },
-  { 0x0f20, 0x0f33,     C99|DIG },  /* Digits */
-  { 0x0f35, 0x0f35,     C99     },  /* Tibetan */
-  { 0x0f37, 0x0f37,     C99     },
-  { 0x0f39, 0x0f39,     C99     },
-  { 0x0f3e, 0x0f47,     C99     },
-  { 0x0f49, 0x0f69,     C99     },
-  { 0x0f71, 0x0f84,     C99     },
-  { 0x0f86, 0x0f8b,     C99     },
-  { 0x0f90, 0x0f95,     C99     },
-  { 0x0f97, 0x0f97,     C99     },
-  { 0x0f99, 0x0fad,     C99     },
-  { 0x0fb1, 0x0fb7,     C99     },
-  { 0x0fb9, 0x0fb9,     C99     },
-  { 0x10a0, 0x10c5, CXX|C99     },  /* Georgian */
-  { 0x10d0, 0x10f6, CXX|C99     },
-  { 0x1100, 0x1159, CXX         },  /* Hangul */
-  { 0x1161, 0x11a2, CXX         },
-  { 0x11a8, 0x11f9, CXX         },
-  { 0x1e00, 0x1e9a, CXX|C99     },  /* Latin */
-  { 0x1e9b, 0x1e9b,     C99     },
-  { 0x1ea0, 0x1ef9, CXX|C99     },
-  { 0x1f00, 0x1f15, CXX|C99     },  /* Greek */
-  { 0x1f18, 0x1f1d, CXX|C99     },
-  { 0x1f20, 0x1f45, CXX|C99     },
-  { 0x1f48, 0x1f4d, CXX|C99     },
-  { 0x1f50, 0x1f57, CXX|C99     },
-  { 0x1f59, 0x1f59, CXX|C99     },
-  { 0x1f5b, 0x1f5b, CXX|C99     },
-  { 0x1f5d, 0x1f5d, CXX|C99     },
-  { 0x1f5f, 0x1f7d, CXX|C99     },
-  { 0x1f80, 0x1fb4, CXX|C99     },
-  { 0x1fb6, 0x1fbc, CXX|C99     },
-  { 0x1fbe, 0x1fbe,     C99     },  /* Special characters */
-  { 0x1fc2, 0x1fc4, CXX|C99     },  /* Greek */
-  { 0x1fc6, 0x1fcc, CXX|C99     },
-  { 0x1fd0, 0x1fd3, CXX|C99     },
-  { 0x1fd6, 0x1fdb, CXX|C99     },
-  { 0x1fe0, 0x1fec, CXX|C99     },
-  { 0x1ff2, 0x1ff4, CXX|C99     },
-  { 0x1ff6, 0x1ffc, CXX|C99     },
-  { 0x203f, 0x2040,     C99     },  /* Special characters */
-  { 0x207f, 0x207f,     C99     },  /* Latin */
-  { 0x2102, 0x2102,     C99     },  /* Special characters */
-  { 0x2107, 0x2107,     C99     },
-  { 0x210a, 0x2113,     C99     },
-  { 0x2115, 0x2115,     C99     },
-  { 0x2118, 0x211d,     C99     },
-  { 0x2124, 0x2124,     C99     },
-  { 0x2126, 0x2126,     C99     },
-  { 0x2128, 0x2128,     C99     },
-  { 0x212a, 0x2131,     C99     },
-  { 0x2133, 0x2138,     C99     },
-  { 0x2160, 0x2182,     C99     },
-  { 0x3005, 0x3007,     C99     },
-  { 0x3021, 0x3029,     C99     },
-  { 0x3041, 0x3093, CXX|C99     },  /* Hiragana */
-  { 0x3094, 0x3094, CXX         },
-  { 0x309b, 0x309c, CXX|C99     },
-  { 0x309d, 0x309e, CXX         },
-  { 0x30a1, 0x30f6, CXX|C99     },  /* Katakana */
-  { 0x30f7, 0x30fa, CXX         },
-  { 0x30fb, 0x30fc, CXX|C99     },
-  { 0x30fd, 0x30fe, CXX         },
-  { 0x3105, 0x312c, CXX|C99     },  /* Bopomofo */
-  { 0x4e00, 0x9fa5, CXX|C99     },  /* CJK Unified Ideographs */
-  { 0xac00, 0xd7a3,     C99     },  /* Hangul */
-  { 0xf900, 0xfa2d, CXX         },  /* CJK Unified Ideographs */
-  { 0xfb1f, 0xfb36, CXX         },
-  { 0xfb38, 0xfb3c, CXX         },
-  { 0xfb3e, 0xfb3e, CXX         },
-  { 0xfb40, 0xfb44, CXX         },
-  { 0xfb46, 0xfbb1, CXX         },
-  { 0xfbd3, 0xfd3f, CXX         },
-  { 0xfd50, 0xfd8f, CXX         },
-  { 0xfd92, 0xfdc7, CXX         },
-  { 0xfdf0, 0xfdfb, CXX         },
-  { 0xfe70, 0xfe72, CXX         },
-  { 0xfe74, 0xfe74, CXX         },
-  { 0xfe76, 0xfefc, CXX         },
-  { 0xff21, 0xff3a, CXX         },
-  { 0xff41, 0xff5a, CXX         },
-  { 0xff66, 0xffbe, CXX         },
-  { 0xffc2, 0xffc7, CXX         },
-  { 0xffca, 0xffcf, CXX         },
-  { 0xffd2, 0xffd7, CXX         },
-  { 0xffda, 0xffdc, CXX         },
-};
-
-#endif /* LIBCPP_UCNID_H */
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x00a9 },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x00aa },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x00b4 },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x00b5 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x00b6 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x00b7 },
+{   0|  0|  0|CID|NFC|  0|  0,   0, 0x00b9 },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x00ba },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x00bf },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x00d6 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x00d7 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x00f6 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x00f7 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0131 },
+{ C99|  0|CXX|CID|NFC|  0|  0,   0, 0x0133 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x013e },
+{ C99|  0|CXX|CID|NFC|  0|  0,   0, 0x0140 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0148 },
+{ C99|  0|CXX|CID|NFC|  0|  0,   0, 0x0149 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x017e },
+{ C99|  0|CXX|CID|NFC|  0|  0,   0, 0x017f },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x01c3 },
+{ C99|  0|CXX|CID|NFC|  0|  0,   0, 0x01cc },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x01f0 },
+{ C99|  0|CXX|CID|NFC|  0|  0,   0, 0x01f3 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x01f5 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x01f9 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0217 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x024f },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x02a8 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x02af },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x02b8 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x02ba },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x02bb },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x02bc },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x02c1 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x02cf },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x02d1 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x02df },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x02e4 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0379 },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x037a },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0383 },
+{   0|  0|CXX|CID|NFC|  0|  0,   0, 0x0384 },
+{   0|  0|  0|CID|NFC|  0|  0,   0, 0x0385 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0386 },
+{   0|  0|  0|CID|  0|  0|  0,   0, 0x0387 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x038a },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x038b },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x038c },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x038d },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x03a1 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x03a2 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x03ce },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x03cf },
+{ C99|  0|CXX|CID|NFC|  0|  0,   0, 0x03d6 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x03d9 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x03da },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x03db },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x03dc },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x03dd },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x03de },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x03df },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x03e0 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x03e1 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x03ef },
+{ C99|  0|CXX|CID|NFC|  0|  0,   0, 0x03f2 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x03f3 },
+{   0|  0|  0|CID|NFC|  0|  0,   0, 0x0400 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x040c },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0x040d },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x040e },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x044f },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0450 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x045c },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x045d },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0481 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x048f },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x04c4 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x04c6 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x04c8 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x04ca },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x04cc },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x04cf },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x04eb },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x04ed },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x04f5 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x04f7 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x04f9 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0530 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0556 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0558 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0559 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0560 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0586 },
+{ C99|  0|CXX|CID|NFC|  0|  0,   0, 0x0587 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x05af },
+{ C99|  0|  0|CID|NFC|NKC|  0,  10, 0x05b0 },
+{ C99|  0|  0|CID|NFC|NKC|  0,  11, 0x05b1 },
+{ C99|  0|  0|CID|NFC|NKC|  0,  12, 0x05b2 },
+{ C99|  0|  0|CID|NFC|NKC|  0,  13, 0x05b3 },
+{ C99|  0|  0|CID|NFC|NKC|  0,  14, 0x05b4 },
+{ C99|  0|  0|CID|NFC|NKC|  0,  15, 0x05b5 },
+{ C99|  0|  0|CID|NFC|NKC|  0,  16, 0x05b6 },
+{ C99|  0|  0|CID|NFC|NKC|  0,  17, 0x05b7 },
+{ C99|  0|  0|CID|NFC|NKC|  0,  18, 0x05b8 },
+{ C99|  0|  0|CID|NFC|NKC|  0,  19, 0x05b9 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x05ba },
+{ C99|  0|  0|CID|NFC|NKC|  0,  20, 0x05bb },
+{ C99|  0|  0|CID|NFC|NKC|  0,  21, 0x05bc },
+{ C99|  0|  0|CID|NFC|NKC|  0,  22, 0x05bd },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x05be },
+{ C99|  0|  0|CID|NFC|NKC|  0,  23, 0x05bf },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x05c0 },
+{ C99|  0|  0|CID|NFC|NKC|  0,  24, 0x05c1 },
+{ C99|  0|  0|CID|NFC|NKC|  0,  25, 0x05c2 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x05cf },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x05ea },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x05ef },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x05f2 },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0x05f4 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0620 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x063a },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x063f },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x064a },
+{ C99|  0|CXX|CID|NFC|NKC|  0,  27, 0x064b },
+{ C99|  0|CXX|CID|NFC|NKC|  0,  28, 0x064c },
+{ C99|  0|CXX|CID|NFC|NKC|  0,  29, 0x064d },
+{ C99|  0|CXX|CID|NFC|NKC|  0,  30, 0x064e },
+{ C99|  0|CXX|CID|NFC|NKC|  0,  31, 0x064f },
+{ C99|  0|CXX|CID|NFC|NKC|  0,  32, 0x0650 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,  33, 0x0651 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,  34, 0x0652 },
+{   0|  0|  0|CID|NFC|NKC|CTX,   0, 0x065f },
+{ C99|DIG|  0|CID|NFC|NKC|  0,   0, 0x0669 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x066f },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0674 },
+{ C99|  0|CXX|CID|NFC|  0|  0,   0, 0x0678 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x06b7 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x06b9 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x06be },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x06bf },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x06ce },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x06cf },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x06d5 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 230, 0x06d6 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 230, 0x06d7 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 230, 0x06d8 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 230, 0x06d9 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 230, 0x06da },
+{ C99|  0|  0|CID|NFC|NKC|  0, 230, 0x06db },
+{ C99|  0|  0|CID|NFC|NKC|  0, 230, 0x06dc },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x06e4 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x06e6 },
+{ C99|  0|CXX|CID|NFC|NKC|  0, 230, 0x06e7 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 230, 0x06e8 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x06e9 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 220, 0x06ea },
+{ C99|  0|  0|CID|NFC|NKC|  0, 230, 0x06eb },
+{ C99|  0|  0|CID|NFC|NKC|  0, 230, 0x06ec },
+{ C99|  0|  0|CID|NFC|NKC|  0, 220, 0x06ed },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x06ef },
+{ C99|DIG|  0|CID|NFC|NKC|  0,   0, 0x06f9 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0900 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0903 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0904 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0939 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x093c },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x094c },
+{ C99|  0|  0|CID|NFC|NKC|  0,   9, 0x094d },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x094f },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0950 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 230, 0x0951 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 220, 0x0952 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0957 },
+{ C99|  0|CXX|CID|  0|  0|  0,   0, 0x095f },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0962 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0963 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0965 },
+{ C99|DIG|  0|CID|NFC|NKC|  0,   0, 0x096f },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0980 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0983 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0984 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x098c },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x098e },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0990 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0992 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x09a8 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x09a9 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x09b0 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x09b1 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x09b2 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x09b5 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x09b9 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x09bd },
+{ C99|  0|  0|CID|NFC|NKC|CTX,   0, 0x09be },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x09c4 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x09c6 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x09c8 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x09ca },
+{ C99|  0|  0|  0|NFC|NKC|  0,   0, 0x09cb },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x09cc },
+{ C99|  0|  0|CID|NFC|NKC|  0,   9, 0x09cd },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x09db },
+{ C99|  0|CXX|CID|  0|  0|  0,   0, 0x09dd },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x09de },
+{ C99|  0|CXX|CID|  0|  0|  0,   0, 0x09df },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x09e1 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x09e3 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x09e5 },
+{ C99|DIG|  0|CID|NFC|NKC|  0,   0, 0x09ef },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x09f1 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a01 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0a02 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a04 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0a0a },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a0e },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0a10 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a12 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0a28 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a29 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0a30 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a31 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0a32 },
+{ C99|  0|CXX|CID|  0|  0|  0,   0, 0x0a33 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a34 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0a35 },
+{ C99|  0|CXX|CID|  0|  0|  0,   0, 0x0a36 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a37 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0a39 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a3d },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0a42 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a46 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0a48 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a4a },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0a4c },
+{ C99|  0|  0|CID|NFC|NKC|  0,   9, 0x0a4d },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a58 },
+{ C99|  0|CXX|CID|  0|  0|  0,   0, 0x0a5b },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0a5c },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a5d },
+{ C99|  0|CXX|CID|  0|  0|  0,   0, 0x0a5e },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a65 },
+{ C99|DIG|  0|CID|NFC|NKC|  0,   0, 0x0a6f },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a73 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0a74 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a80 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0a83 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a84 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0a8b },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a8c },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0a8d },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a8e },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0a91 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0a92 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0aa8 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0aa9 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0ab0 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0ab1 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0ab3 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0ab4 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0ab9 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0abc },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0ac5 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0ac6 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0ac9 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0aca },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0acc },
+{ C99|  0|  0|CID|NFC|NKC|  0,   9, 0x0acd },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0acf },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0ad0 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0adf },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0ae0 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0ae5 },
+{ C99|DIG|  0|CID|NFC|NKC|  0,   0, 0x0aef },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b00 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0b03 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b04 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0b0c },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b0e },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0b10 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b12 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0b28 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b29 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0b30 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b31 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0b33 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b35 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0b39 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b3c },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0b3d },
+{ C99|  0|  0|CID|NFC|NKC|CTX,   0, 0x0b3e },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0b43 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b46 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0b48 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b4a },
+{ C99|  0|  0|  0|NFC|NKC|  0,   0, 0x0b4b },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0b4c },
+{ C99|  0|  0|CID|NFC|NKC|  0,   9, 0x0b4d },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b5b },
+{ C99|  0|CXX|CID|  0|  0|  0,   0, 0x0b5d },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b5e },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0b61 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b65 },
+{ C99|DIG|  0|CID|NFC|NKC|  0,   0, 0x0b6f },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b81 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0b83 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b84 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0b8a },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b8d },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0b90 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b91 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0b95 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b98 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0b9a },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b9b },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0b9c },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0b9d },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0b9f },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0ba2 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0ba4 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0ba7 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0baa },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0bad },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0bb5 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0bb6 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0bb9 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0bbd },
+{ C99|  0|  0|CID|NFC|NKC|CTX,   0, 0x0bbe },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0bc2 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0bc5 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0bc8 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0bc9 },
+{ C99|  0|  0|  0|NFC|NKC|  0,   0, 0x0bcb },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0bcc },
+{ C99|  0|  0|CID|NFC|NKC|  0,   9, 0x0bcd },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0be6 },
+{ C99|DIG|  0|CID|NFC|NKC|  0,   0, 0x0bef },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0c00 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0c03 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0c04 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0c0c },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0c0d },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0c10 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0c11 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0c28 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0c29 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0c33 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0c34 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0c39 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0c3d },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0c44 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0c45 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0c48 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0c49 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0c4c },
+{ C99|  0|  0|CID|NFC|NKC|  0,   9, 0x0c4d },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0c5f },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0c61 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0c65 },
+{ C99|DIG|  0|CID|NFC|NKC|  0,   0, 0x0c6f },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0c81 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0c83 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0c84 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0c8c },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0c8d },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0c90 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0c91 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0ca8 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0ca9 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0cb3 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0cb4 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0cb9 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0cbd },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0cc1 },
+{ C99|  0|  0|CID|NFC|NKC|CTX,   0, 0x0cc2 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0cc4 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0cc5 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0cc8 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0cc9 },
+{ C99|  0|  0|  0|NFC|NKC|  0,   0, 0x0cca },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0ccc },
+{ C99|  0|  0|CID|NFC|NKC|  0,   9, 0x0ccd },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0cdd },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0cde },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0cdf },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0ce1 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0ce5 },
+{ C99|DIG|  0|CID|NFC|NKC|  0,   0, 0x0cef },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0d01 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0d03 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0d04 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0d0c },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0d0d },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0d10 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0d11 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0d28 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0d29 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0d39 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0d3d },
+{ C99|  0|  0|CID|NFC|NKC|CTX,   0, 0x0d3e },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0d43 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0d45 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0d48 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0d49 },
+{ C99|  0|  0|  0|NFC|NKC|  0,   0, 0x0d4b },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0d4c },
+{ C99|  0|  0|CID|NFC|NKC|  0,   9, 0x0d4d },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0d5f },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0d61 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0d65 },
+{ C99|DIG|  0|CID|NFC|NKC|  0,   0, 0x0d6f },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0e00 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0e30 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0e31 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0e32 },
+{ C99|  0|CXX|CID|NFC|  0|  0,   0, 0x0e33 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0e37 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 103, 0x0e38 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 103, 0x0e39 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   9, 0x0e3a },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0e3f },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0e46 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0e47 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 107, 0x0e48 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 107, 0x0e49 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0e4e },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0x0e4f },
+{ C99|DIG|CXX|CID|NFC|NKC|  0,   0, 0x0e59 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0e5b },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0e80 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0e82 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0e83 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0e84 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0e86 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0e88 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0e89 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0e8a },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0e8c },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0e8d },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0e93 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0e97 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0e98 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0e9f },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0ea0 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0ea3 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0ea4 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0ea5 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0ea6 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0ea7 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0ea9 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0eab },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0eac },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0eae },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0x0eaf },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0eb0 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0eb1 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0eb2 },
+{ C99|  0|CXX|CID|NFC|  0|  0,   0, 0x0eb3 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0eb7 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 118, 0x0eb8 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 118, 0x0eb9 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0eba },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0ebc },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0ebd },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0ebf },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0ec4 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0ec5 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x0ec6 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0ec7 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 122, 0x0ec8 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 122, 0x0ec9 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 122, 0x0eca },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0ecd },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0ecf },
+{ C99|DIG|  0|CID|NFC|NKC|  0,   0, 0x0ed9 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0edb },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x0edd },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0eff },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0f00 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0f17 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 220, 0x0f18 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 220, 0x0f19 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0f1f },
+{ C99|DIG|  0|CID|NFC|NKC|  0,   0, 0x0f33 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0f34 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 220, 0x0f35 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0f36 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 220, 0x0f37 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0f38 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 216, 0x0f39 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0f3d },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0f42 },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x0f43 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0f47 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0f48 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0f4c },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x0f4d },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0f51 },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x0f52 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0f56 },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x0f57 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0f5b },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x0f5c },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0f68 },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x0f69 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0f70 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 129, 0x0f71 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 130, 0x0f72 },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x0f73 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 132, 0x0f74 },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x0f76 },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x0f77 },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x0f78 },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x0f79 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 130, 0x0f7a },
+{ C99|  0|  0|CID|NFC|NKC|  0, 130, 0x0f7b },
+{ C99|  0|  0|CID|NFC|NKC|  0, 130, 0x0f7c },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0f7f },
+{ C99|  0|  0|CID|NFC|NKC|  0, 130, 0x0f80 },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x0f81 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 230, 0x0f82 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 230, 0x0f83 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   9, 0x0f84 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0f85 },
+{ C99|  0|  0|CID|NFC|NKC|  0, 230, 0x0f86 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0f8b },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0f8f },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0f92 },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x0f93 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0f95 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0f96 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0f97 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0f98 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0f9c },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x0f9d },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0fa1 },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x0fa2 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0fa6 },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x0fa7 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0fab },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x0fac },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0fad },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0fb0 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x0fb7 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x0fb8 },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x0fb9 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x109f },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x10c5 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x10cf },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x10f6 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x10ff },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0x1159 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1160 },
+{   0|  0|CXX|CID|NFC|NKC|CTX,   0, 0x1175 },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0x11a2 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x11a7 },
+{   0|  0|CXX|CID|NFC|NKC|CTX,   0, 0x11c2 },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0x11f9 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1dff },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1e99 },
+{ C99|  0|CXX|CID|NFC|  0|  0,   0, 0x1e9a },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x1e9b },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1e9f },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1ef9 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1eff },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1f15 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1f17 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1f1d },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1f1f },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1f45 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1f47 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1f4d },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1f4f },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1f57 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1f58 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1f59 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1f5a },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1f5b },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1f5c },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1f5d },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1f5e },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1f70 },
+{ C99|  0|CXX|  0|  0|  0|  0,   0, 0x1f71 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1f72 },
+{ C99|  0|CXX|  0|  0|  0|  0,   0, 0x1f73 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1f74 },
+{ C99|  0|CXX|  0|  0|  0|  0,   0, 0x1f75 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1f76 },
+{ C99|  0|CXX|  0|  0|  0|  0,   0, 0x1f77 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1f78 },
+{ C99|  0|CXX|  0|  0|  0|  0,   0, 0x1f79 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1f7a },
+{ C99|  0|CXX|  0|  0|  0|  0,   0, 0x1f7b },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1f7c },
+{ C99|  0|CXX|  0|  0|  0|  0,   0, 0x1f7d },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1f7f },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1fb4 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1fb5 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1fba },
+{ C99|  0|CXX|  0|  0|  0|  0,   0, 0x1fbb },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1fbc },
+{   0|  0|  0|CID|NFC|  0|  0,   0, 0x1fbd },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x1fbe },
+{   0|  0|  0|CID|NFC|  0|  0,   0, 0x1fc1 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1fc4 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1fc5 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1fc8 },
+{ C99|  0|CXX|  0|  0|  0|  0,   0, 0x1fc9 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1fca },
+{ C99|  0|CXX|  0|  0|  0|  0,   0, 0x1fcb },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1fcc },
+{   0|  0|  0|CID|NFC|  0|  0,   0, 0x1fcf },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1fd2 },
+{ C99|  0|CXX|  0|  0|  0|  0,   0, 0x1fd3 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1fd5 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1fda },
+{ C99|  0|CXX|  0|  0|  0|  0,   0, 0x1fdb },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1fdf },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1fe2 },
+{ C99|  0|CXX|  0|  0|  0|  0,   0, 0x1fe3 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1fea },
+{ C99|  0|CXX|  0|  0|  0|  0,   0, 0x1feb },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1fec },
+{   0|  0|  0|CID|NFC|  0|  0,   0, 0x1ff1 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1ff4 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x1ff5 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1ff8 },
+{ C99|  0|CXX|  0|  0|  0|  0,   0, 0x1ff9 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1ffa },
+{ C99|  0|CXX|  0|  0|  0|  0,   0, 0x1ffb },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x1ffc },
+{   0|  0|  0|CID|  0|  0|  0,   0, 0x203e },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x2040 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x207e },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x207f },
+{   0|  0|  0|CID|NFC|  0|  0,   0, 0x2101 },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x2102 },
+{   0|  0|  0|CID|NFC|  0|  0,   0, 0x2106 },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x2107 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x2109 },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x2113 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x2114 },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x2115 },
+{   0|  0|  0|CID|NFC|  0|  0,   0, 0x2117 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x2118 },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x211d },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x2123 },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x2124 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x2125 },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x2126 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x2127 },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x2128 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x2129 },
+{ C99|  0|  0|CID|  0|  0|  0,   0, 0x212a },
+{ C99|  0|  0|  0|  0|  0|  0,   0, 0x212b },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x212d },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x212e },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x2131 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x2132 },
+{ C99|  0|  0|CID|NFC|  0|  0,   0, 0x2138 },
+{   0|  0|  0|CID|NFC|  0|  0,   0, 0x215f },
+{ C99|DIG|  0|CID|NFC|  0|  0,   0, 0x217f },
+{ C99|DIG|  0|CID|NFC|NKC|  0,   0, 0x2182 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x3004 },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0x3006 },
+{ C99|DIG|  0|CID|NFC|NKC|  0,   0, 0x3007 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x3020 },
+{ C99|DIG|  0|CID|NFC|NKC|  0,   0, 0x3029 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x3040 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x3093 },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0x3094 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x309a },
+{ C99|  0|CXX|CID|NFC|  0|  0,   0, 0x309c },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0x309e },
+{   0|  0|  0|CID|NFC|  0|  0,   0, 0x30a0 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x30f6 },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0x30fa },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x30fc },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0x30fe },
+{   0|  0|  0|CID|NFC|  0|  0,   0, 0x3104 },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x312c },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0x4dff },
+{ C99|  0|CXX|CID|NFC|NKC|  0,   0, 0x9fa5 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xabff },
+{ C99|  0|  0|CID|NFC|NKC|  0,   0, 0xd7a3 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xf8ff },
+{   0|  0|CXX|  0|  0|  0|  0,   0, 0xfa0d },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0xfa0f },
+{   0|  0|CXX|  0|  0|  0|  0,   0, 0xfa10 },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0xfa11 },
+{   0|  0|CXX|  0|  0|  0|  0,   0, 0xfa12 },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0xfa14 },
+{   0|  0|CXX|  0|  0|  0|  0,   0, 0xfa1e },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0xfa1f },
+{   0|  0|CXX|  0|  0|  0|  0,   0, 0xfa20 },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0xfa21 },
+{   0|  0|CXX|  0|  0|  0|  0,   0, 0xfa22 },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0xfa24 },
+{   0|  0|CXX|  0|  0|  0|  0,   0, 0xfa26 },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0xfa29 },
+{   0|  0|CXX|  0|  0|  0|  0,   0, 0xfa2d },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xfb1e },
+{   0|  0|CXX|CID|  0|  0|  0,   0, 0xfb1f },
+{   0|  0|CXX|CID|NFC|  0|  0,   0, 0xfb29 },
+{   0|  0|CXX|CID|  0|  0|  0,   0, 0xfb36 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xfb37 },
+{   0|  0|CXX|CID|  0|  0|  0,   0, 0xfb3c },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xfb3d },
+{   0|  0|CXX|CID|  0|  0|  0,   0, 0xfb3e },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xfb3f },
+{   0|  0|CXX|CID|  0|  0|  0,   0, 0xfb41 },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0xfb42 },
+{   0|  0|CXX|CID|  0|  0|  0,   0, 0xfb44 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xfb45 },
+{   0|  0|CXX|CID|  0|  0|  0,   0, 0xfb4e },
+{   0|  0|CXX|CID|NFC|  0|  0,   0, 0xfbb1 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xfbd2 },
+{   0|  0|CXX|CID|NFC|  0|  0,   0, 0xfd3d },
+{   0|  0|CXX|CID|NFC|NKC|  0,   0, 0xfd3f },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xfd4f },
+{   0|  0|CXX|CID|NFC|  0|  0,   0, 0xfd8f },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xfd91 },
+{   0|  0|CXX|CID|NFC|  0|  0,   0, 0xfdc7 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xfdef },
+{   0|  0|CXX|CID|NFC|  0|  0,   0, 0xfdfb },
+{   0|  0|  0|CID|NFC|  0|  0,   0, 0xfe6f },
+{   0|  0|CXX|CID|NFC|  0|  0,   0, 0xfe72 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xfe73 },
+{   0|  0|CXX|CID|NFC|  0|  0,   0, 0xfe74 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xfe75 },
+{   0|  0|CXX|CID|NFC|  0|  0,   0, 0xfefc },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xff20 },
+{   0|  0|CXX|CID|NFC|  0|  0,   0, 0xff3a },
+{   0|  0|  0|CID|NFC|  0|  0,   0, 0xff40 },
+{   0|  0|CXX|CID|NFC|  0|  0,   0, 0xff5a },
+{   0|  0|  0|CID|NFC|  0|  0,   0, 0xff65 },
+{   0|  0|CXX|CID|NFC|  0|  0,   0, 0xffbe },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xffc1 },
+{   0|  0|CXX|CID|NFC|  0|  0,   0, 0xffc7 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xffc9 },
+{   0|  0|CXX|CID|NFC|  0|  0,   0, 0xffcf },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xffd1 },
+{   0|  0|CXX|CID|NFC|  0|  0,   0, 0xffd7 },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xffd9 },
+{   0|  0|CXX|CID|NFC|  0|  0,   0, 0xffdc },
+{   0|  0|  0|CID|NFC|NKC|  0,   0, 0xffff },
diff --git a/libcpp/ucnid.pl b/libcpp/ucnid.pl
deleted file mode 100644 (file)
index eb8bbca..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-#! /usr/bin/perl -w
-use strict;
-
-# Convert cppucnid.tab to cppucnid.h.  We use two arrays of length
-# 65536 to represent the table, since this is nice and simple.  The
-# first array holds the tags indicating which ranges are valid in
-# which contexts.  The second array holds the language name associated
-# with each element.
-
-our(@tags, @names);
-@tags = ("") x 65536;
-@names = ("") x 65536;
-
-
-# Array mapping tag numbers to standard #defines
-our @stds;
-
-# Current standard and language
-our($curstd, $curlang);
-
-# First block of the file is a template to be saved for later.
-our @template;
-
-while (<>) {
-    chomp;
-    last if $_ eq '%%';
-    push @template, $_;
-};
-
-# Second block of the file is the UCN tables.
-# The format looks like this:
-#
-# [std]
-#
-# ; language
-# xxxx-xxxx xxxx xxxx-xxxx ....
-#
-# with comment lines starting with #.
-
-while (<>) {
-    chomp;
-    /^#/ and next;
-    /^\s*$/ and next;
-    /^\[(.+)\]$/ and do {
-       $curstd = $1;
-       next;
-    };
-    /^; (.+)$/ and do {
-       $curlang = $1;
-       next;
-    };
-
-    process_range(split);
-}
-
-# Print out the template, inserting as requested.
-$\ = "\n";
-for (@template) {
-    print("/* Automatically generated from cppucnid.tab, do not edit */"),
-        next if $_ eq "[dne]";
-    print_table(), next if $_ eq "[table]";
-    print;
-}
-
-sub print_table {
-    my($lo, $hi);
-    my $prevname = "";
-
-    for ($lo = 0; $lo <= $#tags; $lo = $hi) {
-       $hi = $lo;
-       $hi++ while $hi <= $#tags
-           && $tags[$hi] eq $tags[$lo]
-           && $names[$hi] eq $names[$lo];
-
-       # Range from $lo to $hi-1.
-       # Don't make entries for ranges that are not valid idchars.
-       next if ($tags[$lo] eq "");
-       my $tag = $tags[$lo];
-        $tag = "    ".$tag if $tag =~ /^C99/;
-
-       if ($names[$lo] eq $prevname) {
-           printf("  { 0x%04x, 0x%04x, %-11s },\n",
-                  $lo, $hi-1, $tag);
-       } else {
-           printf("  { 0x%04x, 0x%04x, %-11s },  /* %s */\n",
-                  $lo, $hi-1, $tag, $names[$lo]);
-       }
-       $prevname = $names[$lo];
-    }
-}
-
-# The line is a list of four-digit hexadecimal numbers or
-# pairs of such numbers.  Each is a valid identifier character
-# from the given language, under the given standard.
-sub process_range {
-    for my $range (@_) {
-       if ($range =~ /^[0-9a-f]{4}$/) {
-           my $i = hex($range);
-           if ($tags[$i] eq "") {
-               $tags[$i] = $curstd;
-           } else {
-               $tags[$i] = $curstd . "|" . $tags[$i];
-           }
-           if ($names[$i] ne "" && $names[$i] ne $curlang) {
-               warn sprintf ("language overlap: %s/%s at %x (tag %d)",
-                             $names[$i], $curlang, $i, $tags[$i]);
-               next;
-           }
-           $names[$i] = $curlang;
-       } elsif ($range =~ /^ ([0-9a-f]{4}) - ([0-9a-f]{4}) $/x) {
-           my ($start, $end) = (hex($1), hex($2));
-           my $i;
-           for ($i = $start; $i <= $end; $i++) {
-               if ($tags[$i] eq "") {
-                   $tags[$i] = $curstd;
-               } else {
-                   $tags[$i] = $curstd . "|" . $tags[$i];
-               }
-               if ($names[$i] ne "" && $names[$i] ne $curlang) {
-                   warn sprintf ("language overlap: %s/%s at %x (tag %d)",
-                                 $names[$i], $curlang, $i, $tags[$i]);
-                   next;
-               }
-               $names[$i] = $curlang;
-           }
-       } else {
-           warn "malformed range expression $range";
-       }
-    }
-}
index 7cb16e1..516f921 100644 (file)
@@ -1,47 +1,25 @@
-/* Table of UCNs which are valid in identifiers.
-   Copyright (C) 2003 Free Software Foundation, Inc.
-
-This program is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 2, or (at your option) any
-later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
-
-[dne]
-
-/* This file reproduces the table in ISO/IEC 9899:1999 (C99) Annex
-   D, which is itself a reproduction from ISO/IEC TR 10176:1998, and
-   the similar table from ISO/IEC 14882:1988 (C++98) Annex E, which is
-   a reproduction of ISO/IEC PDTR 10176.  Unfortunately these tables
-   are not identical.  */
-
-#ifndef LIBCPP_UCNID_H
-#define LIBCPP_UCNID_H
-
-#define C99 1
-#define CXX 2
-#define DIG 4
-
-struct ucnrange
-{
-  unsigned short lo, hi;
-  unsigned short flags;
-};
-
-static const struct ucnrange ucnranges[] = {
-[table]
-};
-
-#endif /* LIBCPP_UCNID_H */
-%%
+; Table of UCNs which are valid in identifiers.
+; Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+; 
+; This program is free software; you can redistribute it and/or modify it
+; under the terms of the GNU General Public License as published by the
+; Free Software Foundation; either version 2, or (at your option) any
+; later version.
+; 
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+; GNU General Public License for more details.
+; 
+; You should have received a copy of the GNU General Public License
+; along with this program; if not, write to the Free Software
+; Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+; 
+; This file reproduces the table in ISO/IEC 9899:1999 (C99) Annex
+; D, which is itself a reproduction from ISO/IEC TR 10176:1998, and
+; the similar table from ISO/IEC 14882:1988 (C++98) Annex E, which is
+; a reproduction of ISO/IEC PDTR 10176.  Unfortunately these tables
+; are not identical.
 
 [C99]
 
@@ -141,7 +119,6 @@ ac00-d7a3
 0b3d 1fbe 203f-2040 2102 2107 210a-2113 2115 2118-211d 2124 2126 2128
 212a-2131 2133-2138 2160-2182 3005-3007 3021-3029
 
-[C99|DIG]
 ; Digits
 0660-0669 06f0-06f9 0966-096f 09e6-09ef 0a66-0a6f 0ae6-0aef 0b66-0b6f
 0be7-0bef 0c66-0c6f 0ce6-0cef 0d66-0d6f 0e50-0e59 0ed0-0ed9 0f20-0f33
@@ -201,16 +178,12 @@ ac00-d7a3
 ; Malayalam
 0d05-0d0c 0d0e-0d10 0d12-0d28 0d2a-0d39 0d60-0d61
 
-# CORRECTION: Exclude 0e50-0e59 from the Thai range and make a fake
-# Digits range for it, to match C99.  cppcharset.c knows that C++
-# doesn't distinguish digits from other UCNs valid in identifiers.
 ; Thai
-0e01-0e30 0e32-0e33 0e40-0e46 0e4f-0e49 0e5a-0e5b
+0e01-0e30 0e32-0e33 0e40-0e46 0e4f-0e5b
 
 ; Digits
 0e50-0e59
 
-# CORRECTION: Change 0e0d to 0e8d (typo in standard; see C++ DR 131)
 ; Lao
 0e81-0e82 0e84 0e87-0e88 0e8a 0e8d 0e94-0e97 0e99-0e9f 0ea1-0ea3 0ea5
 0ea7 0eaa-0eab 0ead-0eb0 0eb2 0eb3 0ebd 0ec0-0ec4 0ec6
@@ -224,7 +197,6 @@ ac00-d7a3
 ; Katakana
 30a1-30fe
 
-# CORRECTION: language spelled "Bopmofo" in C++98.
 ; Bopomofo
 3105-312c