Blame genUnicode.py

Packit Service a31ea6
#!/usr/bin/python -u
Packit Service a31ea6
#
Packit Service a31ea6
# Original script modified in November 2003 to take advantage of
Packit Service a31ea6
# the character-validation range routines, and updated to the
Packit Service a31ea6
# current Unicode information (Version 4.0.1)
Packit Service a31ea6
#
Packit Service a31ea6
# NOTE: there is an 'alias' facility for blocks which are not present in
Packit Service a31ea6
#	the current release, but are needed for ABI compatibility.  This
Packit Service a31ea6
#	must be accomplished MANUALLY!  Please see the comments below under
Packit Service a31ea6
#     'blockAliases'
Packit Service a31ea6
#
Packit Service a31ea6
import sys
Packit Service a31ea6
import string
Packit Service a31ea6
import time
Packit Service a31ea6
Packit Service a31ea6
webpage = "http://www.unicode.org/Public/4.0-Update1/UCD-4.0.1.html"
Packit Service a31ea6
sources = "Blocks-4.0.1.txt UnicodeData-4.0.1.txt"
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# blockAliases is a small hack - it is used for mapping block names which
Packit Service a31ea6
# were were used in the 3.1 release, but are missing or changed in the current
Packit Service a31ea6
# release.  The format is "OldBlockName:NewBlockName1[,NewBlockName2[,...]]"
Packit Service a31ea6
blockAliases = []
Packit Service a31ea6
blockAliases.append("CombiningMarksforSymbols:CombiningDiacriticalMarksforSymbols")
Packit Service a31ea6
blockAliases.append("Greek:GreekandCoptic")
Packit Service a31ea6
blockAliases.append("PrivateUse:PrivateUseArea,SupplementaryPrivateUseArea-A," + 
Packit Service a31ea6
	"SupplementaryPrivateUseArea-B")
Packit Service a31ea6
Packit Service a31ea6
# minTableSize gives the minimum number of ranges which must be present
Packit Service a31ea6
# before a range table is produced.  If there are less than this
Packit Service a31ea6
# number, inline comparisons are generated
Packit Service a31ea6
minTableSize = 8
Packit Service a31ea6
Packit Service a31ea6
(blockfile, catfile) = string.split(sources)
Packit Service a31ea6
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Now process the "blocks" file, reducing it to a dictionary
Packit Service a31ea6
# indexed by blockname, containing a tuple with the applicable
Packit Service a31ea6
# block range
Packit Service a31ea6
#
Packit Service a31ea6
BlockNames = {}
Packit Service a31ea6
try:
Packit Service a31ea6
    blocks = open(blockfile, "r")
Packit Service a31ea6
except:
Packit Service a31ea6
    print "Missing %s, aborting ..." % blockfile
Packit Service a31ea6
    sys.exit(1)
Packit Service a31ea6
Packit Service a31ea6
for line in blocks.readlines():
Packit Service a31ea6
    if line[0] == '#':
Packit Service a31ea6
        continue
Packit Service a31ea6
    line = string.strip(line)
Packit Service a31ea6
    if line == '':
Packit Service a31ea6
        continue
Packit Service a31ea6
    try:
Packit Service a31ea6
        fields = string.split(line, ';')
Packit Service a31ea6
        range = string.strip(fields[0])
Packit Service a31ea6
        (start, end) = string.split(range, "..")
Packit Service a31ea6
        name = string.strip(fields[1])
Packit Service a31ea6
        name = string.replace(name, ' ', '')
Packit Service a31ea6
    except:
Packit Service a31ea6
        print "Failed to process line: %s" % (line)
Packit Service a31ea6
        continue
Packit Service a31ea6
    start = "0x" + start
Packit Service a31ea6
    end = "0x" + end
Packit Service a31ea6
    try:
Packit Service a31ea6
        BlockNames[name].append((start, end))
Packit Service a31ea6
    except:
Packit Service a31ea6
        BlockNames[name] = [(start, end)]
Packit Service a31ea6
blocks.close()
Packit Service a31ea6
print "Parsed %d blocks descriptions" % (len(BlockNames.keys()))
Packit Service a31ea6
Packit Service a31ea6
for block in blockAliases:
Packit Service a31ea6
    alias = string.split(block,':')
Packit Service a31ea6
    alist = string.split(alias[1],',')
Packit Service a31ea6
    for comp in alist:
Packit Service a31ea6
        if BlockNames.has_key(comp):
Packit Service a31ea6
            if alias[0] not in BlockNames:
Packit Service a31ea6
                BlockNames[alias[0]] = []
Packit Service a31ea6
            for r in BlockNames[comp]:
Packit Service a31ea6
                BlockNames[alias[0]].append(r)
Packit Service a31ea6
        else:
Packit Service a31ea6
            print "Alias %s: %s not in Blocks" % (alias[0], comp)
Packit Service a31ea6
            continue
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Next process the Categories file. This is more complex, since
Packit Service a31ea6
# the file is in code sequence, and we need to invert it.  We use
Packit Service a31ea6
# a dictionary with index category-name, with each entry containing
Packit Service a31ea6
# all the ranges (codepoints) of that category.  Note that category
Packit Service a31ea6
# names comprise two parts - the general category, and the "subclass"
Packit Service a31ea6
# within that category.  Therefore, both "general category" (which is
Packit Service a31ea6
# the first character of the 2-character category-name) and the full
Packit Service a31ea6
# (2-character) name are entered into this dictionary.
Packit Service a31ea6
#
Packit Service a31ea6
try:
Packit Service a31ea6
    data = open(catfile, "r")
Packit Service a31ea6
except:
Packit Service a31ea6
    print "Missing %s, aborting ..." % catfile
Packit Service a31ea6
    sys.exit(1)
Packit Service a31ea6
Packit Service a31ea6
nbchar = 0;
Packit Service a31ea6
Categories = {}
Packit Service a31ea6
for line in data.readlines():
Packit Service a31ea6
    if line[0] == '#':
Packit Service a31ea6
        continue
Packit Service a31ea6
    line = string.strip(line)
Packit Service a31ea6
    if line == '':
Packit Service a31ea6
        continue
Packit Service a31ea6
    try:
Packit Service a31ea6
        fields = string.split(line, ';')
Packit Service a31ea6
        point = string.strip(fields[0])
Packit Service a31ea6
        value = 0
Packit Service a31ea6
        while point != '':
Packit Service a31ea6
            value = value * 16
Packit Service a31ea6
            if point[0] >= '0' and point[0] <= '9':
Packit Service a31ea6
                value = value + ord(point[0]) - ord('0')
Packit Service a31ea6
            elif point[0] >= 'A' and point[0] <= 'F':
Packit Service a31ea6
                value = value + 10 + ord(point[0]) - ord('A')
Packit Service a31ea6
            elif point[0] >= 'a' and point[0] <= 'f':
Packit Service a31ea6
                value = value + 10 + ord(point[0]) - ord('a')
Packit Service a31ea6
            point = point[1:]
Packit Service a31ea6
        name = fields[2]
Packit Service a31ea6
    except:
Packit Service a31ea6
        print "Failed to process line: %s" % (line)
Packit Service a31ea6
        continue
Packit Service a31ea6
    
Packit Service a31ea6
    nbchar = nbchar + 1
Packit Service a31ea6
    # update entry for "full name"
Packit Service a31ea6
    try:
Packit Service a31ea6
        Categories[name].append(value)
Packit Service a31ea6
    except:
Packit Service a31ea6
        try:
Packit Service a31ea6
            Categories[name] = [value]
Packit Service a31ea6
        except:
Packit Service a31ea6
            print "Failed to process line: %s" % (line)
Packit Service a31ea6
    # update "general category" name
Packit Service a31ea6
    try:
Packit Service a31ea6
        Categories[name[0]].append(value)
Packit Service a31ea6
    except:
Packit Service a31ea6
        try:
Packit Service a31ea6
            Categories[name[0]] = [value]
Packit Service a31ea6
        except:
Packit Service a31ea6
            print "Failed to process line: %s" % (line)
Packit Service a31ea6
Packit Service a31ea6
blocks.close()
Packit Service a31ea6
print "Parsed %d char generating %d categories" % (nbchar, len(Categories.keys()))
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# The data is now all read.  Time to process it into a more useful form.
Packit Service a31ea6
#
Packit Service a31ea6
# reduce the number list into ranges
Packit Service a31ea6
for cat in Categories.keys():
Packit Service a31ea6
    list = Categories[cat]
Packit Service a31ea6
    start = -1
Packit Service a31ea6
    prev = -1
Packit Service a31ea6
    end = -1
Packit Service a31ea6
    ranges = []
Packit Service a31ea6
    for val in list:
Packit Service a31ea6
        if start == -1:
Packit Service a31ea6
            start = val
Packit Service a31ea6
            prev = val
Packit Service a31ea6
            continue
Packit Service a31ea6
        elif val == prev + 1:
Packit Service a31ea6
            prev = val
Packit Service a31ea6
            continue
Packit Service a31ea6
        elif prev == start:
Packit Service a31ea6
            ranges.append((prev, prev))
Packit Service a31ea6
            start = val
Packit Service a31ea6
            prev = val
Packit Service a31ea6
            continue
Packit Service a31ea6
        else:
Packit Service a31ea6
            ranges.append((start, prev))
Packit Service a31ea6
            start = val
Packit Service a31ea6
            prev = val
Packit Service a31ea6
            continue
Packit Service a31ea6
    if prev == start:
Packit Service a31ea6
        ranges.append((prev, prev))
Packit Service a31ea6
    else:
Packit Service a31ea6
        ranges.append((start, prev))
Packit Service a31ea6
    Categories[cat] = ranges
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Assure all data is in alphabetic order, since we will be doing binary
Packit Service a31ea6
# searches on the tables.
Packit Service a31ea6
#
Packit Service a31ea6
bkeys = BlockNames.keys()
Packit Service a31ea6
bkeys.sort()
Packit Service a31ea6
Packit Service a31ea6
ckeys = Categories.keys()
Packit Service a31ea6
ckeys.sort()
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Generate the resulting files
Packit Service a31ea6
#
Packit Service a31ea6
try:
Packit Service a31ea6
    header = open("include/libxml/xmlunicode.h", "w")
Packit Service a31ea6
except:
Packit Service a31ea6
    print "Failed to open include/libxml/xmlunicode.h"
Packit Service a31ea6
    sys.exit(1)
Packit Service a31ea6
Packit Service a31ea6
try:
Packit Service a31ea6
    output = open("xmlunicode.c", "w")
Packit Service a31ea6
except:
Packit Service a31ea6
    print "Failed to open xmlunicode.c"
Packit Service a31ea6
    sys.exit(1)
Packit Service a31ea6
Packit Service a31ea6
date = time.asctime(time.localtime(time.time()))
Packit Service a31ea6
Packit Service a31ea6
header.write(
Packit Service a31ea6
"""/*
Packit Service a31ea6
 * Summary: Unicode character APIs
Packit Service a31ea6
 * Description: API for the Unicode character APIs
Packit Service a31ea6
 *
Packit Service a31ea6
 * This file is automatically generated from the
Packit Service a31ea6
 * UCS description files of the Unicode Character Database
Packit Service a31ea6
 * %s
Packit Service a31ea6
 * using the genUnicode.py Python script.
Packit Service a31ea6
 *
Packit Service a31ea6
 * Generation date: %s
Packit Service a31ea6
 * Sources: %s
Packit Service a31ea6
 * Author: Daniel Veillard
Packit Service a31ea6
 */
Packit Service a31ea6
Packit Service a31ea6
#ifndef __XML_UNICODE_H__
Packit Service a31ea6
#define __XML_UNICODE_H__
Packit Service a31ea6
Packit Service a31ea6
#include <libxml/xmlversion.h>
Packit Service a31ea6
Packit Service a31ea6
#ifdef LIBXML_UNICODE_ENABLED
Packit Service a31ea6
Packit Service a31ea6
#ifdef __cplusplus
Packit Service a31ea6
extern "C" {
Packit Service a31ea6
#endif
Packit Service a31ea6
Packit Service a31ea6
""" % (webpage, date, sources));
Packit Service a31ea6
Packit Service a31ea6
output.write(
Packit Service a31ea6
"""/*
Packit Service a31ea6
 * xmlunicode.c: this module implements the Unicode character APIs
Packit Service a31ea6
 *
Packit Service a31ea6
 * This file is automatically generated from the
Packit Service a31ea6
 * UCS description files of the Unicode Character Database
Packit Service a31ea6
 * %s
Packit Service a31ea6
 * using the genUnicode.py Python script.
Packit Service a31ea6
 *
Packit Service a31ea6
 * Generation date: %s
Packit Service a31ea6
 * Sources: %s
Packit Service a31ea6
 * Daniel Veillard <veillard@redhat.com>
Packit Service a31ea6
 */
Packit Service a31ea6
Packit Service a31ea6
#define IN_LIBXML
Packit Service a31ea6
#include "libxml.h"
Packit Service a31ea6
Packit Service a31ea6
#ifdef LIBXML_UNICODE_ENABLED
Packit Service a31ea6
Packit Service a31ea6
#include <string.h>
Packit Service a31ea6
#include <libxml/xmlversion.h>
Packit Service a31ea6
#include <libxml/xmlunicode.h>
Packit Service a31ea6
#include <libxml/chvalid.h>
Packit Service a31ea6
Packit Service a31ea6
typedef int (xmlIntFunc)(int);	/* just to keep one's mind untwisted */
Packit Service a31ea6
Packit Service a31ea6
typedef struct {
Packit Service a31ea6
    const char *rangename;
Packit Service a31ea6
    xmlIntFunc *func;
Packit Service a31ea6
} xmlUnicodeRange;
Packit Service a31ea6
Packit Service a31ea6
typedef struct {
Packit Service a31ea6
    const xmlUnicodeRange *table;
Packit Service a31ea6
    int		    numentries;
Packit Service a31ea6
} xmlUnicodeNameTable;
Packit Service a31ea6
Packit Service a31ea6
Packit Service a31ea6
static xmlIntFunc *xmlUnicodeLookup(xmlUnicodeNameTable *tptr, const char *tname);
Packit Service a31ea6
Packit Service a31ea6
static const xmlUnicodeRange xmlUnicodeBlocks[] = {
Packit Service a31ea6
""" % (webpage, date, sources));
Packit Service a31ea6
Packit Service a31ea6
flag = 0
Packit Service a31ea6
for block in bkeys:
Packit Service a31ea6
    name = string.replace(block, '-', '')
Packit Service a31ea6
    if flag:
Packit Service a31ea6
        output.write(',\n')
Packit Service a31ea6
    else:
Packit Service a31ea6
        flag = 1
Packit Service a31ea6
    output.write('  {"%s", xmlUCSIs%s}' % (block, name))
Packit Service a31ea6
output.write('};\n\n')
Packit Service a31ea6
Packit Service a31ea6
output.write('static xmlUnicodeRange xmlUnicodeCats[] = {\n')
Packit Service a31ea6
flag = 0;
Packit Service a31ea6
for name in ckeys:
Packit Service a31ea6
    if flag:
Packit Service a31ea6
        output.write(',\n')
Packit Service a31ea6
    else:
Packit Service a31ea6
        flag = 1
Packit Service a31ea6
    output.write('  {"%s", xmlUCSIsCat%s}' % (name, name))
Packit Service a31ea6
output.write('};\n\n')
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# For any categories with more than minTableSize ranges we generate
Packit Service a31ea6
# a range table suitable for xmlCharInRange
Packit Service a31ea6
#
Packit Service a31ea6
for name in ckeys:
Packit Service a31ea6
  if len(Categories[name]) > minTableSize:
Packit Service a31ea6
    numshort = 0
Packit Service a31ea6
    numlong = 0
Packit Service a31ea6
    ranges = Categories[name]
Packit Service a31ea6
    sptr = "NULL"
Packit Service a31ea6
    lptr = "NULL"
Packit Service a31ea6
    for range in ranges:
Packit Service a31ea6
      (low, high) = range
Packit Service a31ea6
      if high < 0x10000:
Packit Service a31ea6
        if numshort == 0:
Packit Service a31ea6
          pline = "static const xmlChSRange xml%sS[] = {" % name
Packit Service a31ea6
          sptr = "xml%sS" % name
Packit Service a31ea6
        else:
Packit Service a31ea6
          pline += ", "
Packit Service a31ea6
        numshort += 1
Packit Service a31ea6
      else:
Packit Service a31ea6
        if numlong == 0:
Packit Service a31ea6
          if numshort > 0:
Packit Service a31ea6
            output.write(pline + " };\n")
Packit Service a31ea6
          pline = "static const xmlChLRange xml%sL[] = {" % name
Packit Service a31ea6
          lptr = "xml%sL" % name
Packit Service a31ea6
        else:
Packit Service a31ea6
          pline += ", "
Packit Service a31ea6
        numlong += 1
Packit Service a31ea6
      if len(pline) > 60:
Packit Service a31ea6
        output.write(pline + "\n")
Packit Service a31ea6
        pline = "    "
Packit Service a31ea6
      pline += "{%s, %s}" % (hex(low), hex(high))
Packit Service a31ea6
    output.write(pline + " };\nstatic xmlChRangeGroup xml%sG = {%s,%s,%s,%s};\n\n"
Packit Service a31ea6
         % (name, numshort, numlong, sptr, lptr))
Packit Service a31ea6
Packit Service a31ea6
Packit Service a31ea6
output.write(
Packit Service a31ea6
"""static xmlUnicodeNameTable xmlUnicodeBlockTbl = {xmlUnicodeBlocks, %s};
Packit Service a31ea6
static xmlUnicodeNameTable xmlUnicodeCatTbl = {xmlUnicodeCats, %s};
Packit Service a31ea6
Packit Service a31ea6
/**
Packit Service a31ea6
 * xmlUnicodeLookup:
Packit Service a31ea6
 * @tptr: pointer to the name table
Packit Service a31ea6
 * @name: name to be found
Packit Service a31ea6
 *
Packit Service a31ea6
 * binary table lookup for user-supplied name
Packit Service a31ea6
 *
Packit Service a31ea6
 * Returns pointer to range function if found, otherwise NULL
Packit Service a31ea6
 */
Packit Service a31ea6
static xmlIntFunc
Packit Service a31ea6
*xmlUnicodeLookup(xmlUnicodeNameTable *tptr, const char *tname) {
Packit Service a31ea6
    int low, high, mid, cmp;
Packit Service a31ea6
    xmlUnicodeRange *sptr;
Packit Service a31ea6
Packit Service a31ea6
    if ((tptr == NULL) || (tname == NULL)) return(NULL);
Packit Service a31ea6
Packit Service a31ea6
    low = 0;
Packit Service a31ea6
    high = tptr->numentries - 1;
Packit Service a31ea6
    sptr = tptr->table;
Packit Service a31ea6
    while (low <= high) {
Packit Service a31ea6
	mid = (low + high) / 2;
Packit Service a31ea6
	if ((cmp=strcmp(tname, sptr[mid].rangename)) == 0)
Packit Service a31ea6
	    return (sptr[mid].func);
Packit Service a31ea6
	if (cmp < 0)
Packit Service a31ea6
	    high = mid - 1;
Packit Service a31ea6
	else
Packit Service a31ea6
	    low = mid + 1;
Packit Service a31ea6
    }
Packit Service a31ea6
    return (NULL);    
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
""" % (len(BlockNames), len(Categories)) )
Packit Service a31ea6
Packit Service a31ea6
for block in bkeys:
Packit Service a31ea6
    name = string.replace(block, '-', '')
Packit Service a31ea6
    header.write("XMLPUBFUN int XMLCALL xmlUCSIs%s\t(int code);\n" % name)
Packit Service a31ea6
    output.write("/**\n * xmlUCSIs%s:\n * @code: UCS code point\n" % (name))
Packit Service a31ea6
    output.write(" *\n * Check whether the character is part of %s UCS Block\n"%
Packit Service a31ea6
                 (block))
Packit Service a31ea6
    output.write(" *\n * Returns 1 if true 0 otherwise\n */\n");
Packit Service a31ea6
    output.write("int\nxmlUCSIs%s(int code) {\n    return(" % name)
Packit Service a31ea6
    flag = 0
Packit Service a31ea6
    for (start, end) in BlockNames[block]:
Packit Service a31ea6
        if flag:
Packit Service a31ea6
            output.write(" ||\n           ")
Packit Service a31ea6
        else:
Packit Service a31ea6
            flag = 1
Packit Service a31ea6
        output.write("((code >= %s) && (code <= %s))" % (start, end))
Packit Service a31ea6
    output.write(");\n}\n\n")
Packit Service a31ea6
Packit Service a31ea6
header.write("\nXMLPUBFUN int XMLCALL xmlUCSIsBlock\t(int code, const char *block);\n\n")
Packit Service a31ea6
output.write(
Packit Service a31ea6
"""/**
Packit Service a31ea6
 * xmlUCSIsBlock:
Packit Service a31ea6
 * @code: UCS code point
Packit Service a31ea6
 * @block: UCS block name
Packit Service a31ea6
 *
Packit Service a31ea6
 * Check whether the character is part of the UCS Block
Packit Service a31ea6
 *
Packit Service a31ea6
 * Returns 1 if true, 0 if false and -1 on unknown block
Packit Service a31ea6
 */
Packit Service a31ea6
int
Packit Service a31ea6
xmlUCSIsBlock(int code, const char *block) {
Packit Service a31ea6
    xmlIntFunc *func;
Packit Service a31ea6
Packit Service a31ea6
    func = xmlUnicodeLookup(&xmlUnicodeBlockTbl, block);
Packit Service a31ea6
    if (func == NULL)
Packit Service a31ea6
	return (-1);
Packit Service a31ea6
    return (func(code));
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
""")
Packit Service a31ea6
Packit Service a31ea6
for name in ckeys:
Packit Service a31ea6
    ranges = Categories[name]
Packit Service a31ea6
    header.write("XMLPUBFUN int XMLCALL xmlUCSIsCat%s\t(int code);\n" % name)
Packit Service a31ea6
    output.write("/**\n * xmlUCSIsCat%s:\n * @code: UCS code point\n" % (name))
Packit Service a31ea6
    output.write(" *\n * Check whether the character is part of %s UCS Category\n"%
Packit Service a31ea6
                 (name))
Packit Service a31ea6
    output.write(" *\n * Returns 1 if true 0 otherwise\n */\n");
Packit Service a31ea6
    output.write("int\nxmlUCSIsCat%s(int code) {\n" % name)
Packit Service a31ea6
    if len(Categories[name]) > minTableSize:
Packit Service a31ea6
        output.write("    return(xmlCharInRange((unsigned int)code, &xml%sG)"
Packit Service a31ea6
            % name)
Packit Service a31ea6
    else:
Packit Service a31ea6
        start = 1
Packit Service a31ea6
        for range in ranges:
Packit Service a31ea6
            (begin, end) = range;
Packit Service a31ea6
            if start:
Packit Service a31ea6
                output.write("    return(");
Packit Service a31ea6
                start = 0
Packit Service a31ea6
            else:
Packit Service a31ea6
                output.write(" ||\n           ");
Packit Service a31ea6
            if (begin == end):
Packit Service a31ea6
                output.write("(code == %s)" % (hex(begin)))
Packit Service a31ea6
            else:
Packit Service a31ea6
                output.write("((code >= %s) && (code <= %s))" % (
Packit Service a31ea6
                         hex(begin), hex(end)))
Packit Service a31ea6
    output.write(");\n}\n\n")
Packit Service a31ea6
Packit Service a31ea6
header.write("\nXMLPUBFUN int XMLCALL xmlUCSIsCat\t(int code, const char *cat);\n")
Packit Service a31ea6
output.write(
Packit Service a31ea6
"""/**
Packit Service a31ea6
 * xmlUCSIsCat:
Packit Service a31ea6
 * @code: UCS code point
Packit Service a31ea6
 * @cat: UCS Category name
Packit Service a31ea6
 *
Packit Service a31ea6
 * Check whether the character is part of the UCS Category
Packit Service a31ea6
 *
Packit Service a31ea6
 * Returns 1 if true, 0 if false and -1 on unknown category
Packit Service a31ea6
 */
Packit Service a31ea6
int
Packit Service a31ea6
xmlUCSIsCat(int code, const char *cat) {
Packit Service a31ea6
    xmlIntFunc *func;
Packit Service a31ea6
Packit Service a31ea6
    func = xmlUnicodeLookup(&xmlUnicodeCatTbl, cat);
Packit Service a31ea6
    if (func == NULL)
Packit Service a31ea6
	return (-1);
Packit Service a31ea6
    return (func(code));
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
#define bottom_xmlunicode
Packit Service a31ea6
#include "elfgcchack.h"
Packit Service a31ea6
#endif /* LIBXML_UNICODE_ENABLED */
Packit Service a31ea6
""")
Packit Service a31ea6
Packit Service a31ea6
header.write("""
Packit Service a31ea6
#ifdef __cplusplus
Packit Service a31ea6
}
Packit Service a31ea6
#endif
Packit Service a31ea6
Packit Service a31ea6
#endif /* LIBXML_UNICODE_ENABLED */
Packit Service a31ea6
Packit Service a31ea6
#endif /* __XML_UNICODE_H__ */
Packit Service a31ea6
""");
Packit Service a31ea6
Packit Service a31ea6
header.close()
Packit Service a31ea6
output.close()