diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2008-12-12 14:02:27 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2008-12-12 14:02:27 +0100 |
commit | ddaedab835fa7ea3457f21a772d636921defdc46 (patch) | |
tree | 8f96b5a3a6700704e0a64bdcdedee1d2caf68517 | |
parent | 2cd136cf7a0210e3cfde7a6f8ba32c9f09560047 (diff) | |
download | Nim-ddaedab835fa7ea3457f21a772d636921defdc46.tar.gz |
version 0.7.2
158 files changed, 34811 insertions, 10001 deletions
diff --git a/.bzrignore b/.bzrignore index 72d60500a..0fbaa3444 100644 --- a/.bzrignore +++ b/.bzrignore @@ -10,4 +10,7 @@ doc/*.html *.zip *.tar.gz dist -dist +web +lib/base/devel +lib/base/devel/* + diff --git a/config/nimdoc.cfg b/config/nimdoc.cfg new file mode 100644 index 000000000..a2a638a89 --- /dev/null +++ b/config/nimdoc.cfg @@ -0,0 +1,293 @@ +# This is the config file for the documentation generator. +# (c) 2008 Andreas Rumpf +# Feel free to edit the templates as you need. + +split.item.toc = "20" +# too long entries in the table of contents get truncated +# after this number of characters + +doc.section = """ +<div class="section" id="$sectionID"> +<h1><a class="toc-backref" href="#$sectionTitleID">$sectionTitle</a></h1> +<dl class="item"> +$content +</dl></div> +""" + +doc.section.toc = """ +<li> + <a class="reference" href="#$sectionID" id="$sectionTitleID">$sectionTitle</a> + <ul class="simple"> + $content + </ul> +</li> +""" + +doc.item = """ +<dt id="$itemID"><pre>$header</pre></dt> +<dd> +$desc +</dd> +""" + +doc.item.toc = """ + <li><a class="reference" href="#$itemID">$name</a></li> +""" + +doc.toc = """ +<div class="navigation"> +<p class="topic-title first">Navigation</p> +<ul class="simple"> +$content +</ul> +</div>""" + +doc.body_toc = """ +$tableofcontents +<div class="content"> +$moduledesc +$content +</div> +""" + +doc.body_no_toc = """ +$moduledesc +$content +""" + +doc.file = """<?xml version="1.0" encoding="utf-8" ?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<!-- This file is generated by Nimrod. --> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>$title</title> +<style type="text/css"> + +span.DecNumber {color: blue} +span.BinNumber {color: blue} +span.HexNumber {color: blue} +span.OctNumber {color: blue} +span.FloatNumber {color: blue} +span.Identifier {color: black} +span.Keyword {font-weight: bold} +span.StringLit {color: blue} +span.LongStringLit {color: blue} +span.CharLit {color: blue} +span.EscapeSequence {color: black} +span.Operator {color: black} +span.Punctation {color: black} +span.Comment, span.LongComment {font-style:italic; color: green} +span.RegularExpression {color: pink} +span.TagStart {color: yellow} +span.TagEnd {color: yellow} +span.Key {color: blue} +span.Value {color: black} +span.RawData {color: blue} +span.Assembler {color: blue} +span.Preprocessor {color: yellow} +span.Directive {color: yellow} +span.Command, span.Rule, span.Hyperlink, span.Label, span.Reference, +span.Other {color: black} + +div.navigation { + float: left; + width: 27%; //25em; + margin: 0; padding: 0; /* + border: 1px dashed gold; */ + outline: 3px outset #7F7F7F; //#99ff99; //gold; + background-color: #7F7F7F; +} + +div.navigation ul {list-style-type: none;} +div.navigation ul li a, div.navigation ul li a:visited { + font-weight: bold; + color: #FFFFFF; // #CC0000; + text-decoration: none; +} +div.navigation ul li a:hover { + font-weight: bold; + text-decoration: none; + /*outline: 2px outset #7F7F7F;*/ + color: gold; + /* background-color: #FFFFFF; // #1A1A1A; // #779977;*/ +} + +div.content { + margin-left: 27%; // 25em; + padding: 0 1em; + /*border: 1px dashed #1A1A1A;*/ + min-width: 16em; +} + +dl.item dd, dl.item dd p { + margin-top:3px; +} +dl.item dd pre { + margin-left: 15pt; + border: 0px; +} +dl.item dt, dl.item dt pre { + margin: 20pt 0 0 0; +} + +pre, span.tok { + background-color:#F9F9F9; + border:1px dotted #2F6FAB; + color:black; +} + +/* +:Author: David Goodger +:Contact: goodger@python.org +:Date: Date: 2006-05-21 22:44:42 +0200 (Sun, 21 May 2006) +:Revision: Revision: 4564 +:Copyright: This stylesheet has been placed in the public domain. + +Default cascading style sheet for the HTML output of Docutils. + +See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to +customize this style sheet. +*/ +/* used to remove borders from tables and images */ +.borderless, table.borderless td, table.borderless th { border: 0 } + +table.borderless td, table.borderless th { + /* Override padding for "table.docutils td" with "! important". + The right padding separates the table cells. */ + padding: 0 0.5em 0 0 ! important } + +.first { margin-top: 0 ! important } +.last, .with-subtitle { margin-bottom: 0 ! important } +.hidden { display: none } +a.toc-backref { text-decoration: none ; color: black } +blockquote.epigraph { margin: 2em 5em ; } +dl.docutils dd { margin-bottom: 0.5em } +div.abstract { margin: 2em 5em } +div.abstract p.topic-title { font-weight: bold ; text-align: center } +div.admonition, div.attention, div.caution, div.danger, div.error, +div.hint, div.important, div.note, div.tip, div.warning { + margin: 2em ; border: medium outset ; padding: 1em } +div.admonition p.admonition-title, div.hint p.admonition-title, +div.important p.admonition-title, div.note p.admonition-title, +div.tip p.admonition-title { font-weight: bold ; font-family: sans-serif } + +div.attention p.admonition-title, div.caution p.admonition-title, +div.danger p.admonition-title, div.error p.admonition-title, +div.warning p.admonition-title { color: red ; font-weight: bold ; + font-family: sans-serif } + +/* Uncomment (and remove this text!) to get reduced vertical space in + compound paragraphs. +div.compound .compound-first, div.compound .compound-middle { + margin-bottom: 0.5em } + +div.compound .compound-last, div.compound .compound-middle { + margin-top: 0.5em } +*/ + +div.dedication { margin: 2em 5em ; text-align: center ; font-style: italic } +div.dedication p.topic-title { font-weight: bold ; font-style: normal } +div.figure { margin-left: 2em ; margin-right: 2em } +div.footer, div.header { clear: both; font-size: smaller } +div.line-block { display: block ; margin-top: 1em ; margin-bottom: 1em } +div.line-block div.line-block { margin-top: 0 ; margin-bottom: 0 ; + margin-left: 1.5em } +div.sidebar { margin-left: 1em ; border: medium outset ; + padding: 1em ; background-color: #ffffee ; width: 40% ; float: right ; + clear: right } + +div.sidebar p.rubric { font-family: sans-serif ; font-size: medium } +div.system-messages { margin: 5em } +div.system-messages h1 { color: red } +div.system-message { border: medium outset ; padding: 1em } +div.system-message p.system-message-title { color: red ; font-weight: bold } +div.topic { margin: 2em;} +h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, +h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { + margin-top: 0.4em } +h1.title { text-align: center } +h2.subtitle { text-align: center } +hr.docutils { width: 75% } +img.align-left { clear: left } +img.align-right { clear: right } +ol.simple, ul.simple { margin-bottom: 1em } +ol.arabic { list-style: decimal } +ol.loweralpha { list-style: lower-alpha } +ol.upperalpha { list-style: upper-alpha } +ol.lowerroman { list-style: lower-roman } +ol.upperroman { list-style: upper-roman } +p.attribution { text-align: right ; margin-left: 50% } +p.caption { font-style: italic } +p.credits { font-style: italic ; font-size: smaller } +p.label { white-space: nowrap } +p.rubric { font-weight:bold;font-size:larger;color:maroon;text-align:center} +p.sidebar-title {font-family: sans-serif ;font-weight: bold ;font-size: larger } +p.sidebar-subtitle {font-family: sans-serif ; font-weight: bold } +p.topic-title { font-weight: bold } +pre.address { margin-bottom: 0;margin-top:0;font-family:serif;font-size:100% } +pre.literal-block, pre.doctest-block {margin-left: 2em ;margin-right: 2em } +span.classifier {font-family: sans-serif;font-style: oblique } +span.classifier-delimiter {font-family: sans-serif;font-weight: bold } +span.interpreted {font-family: sans-serif } +span.option {white-space: nowrap } +span.pre {white-space: pre } +span.problematic {color: red } +span.section-subtitle { + /* font-size relative to parent (h1..h6 element) */ + font-size: 80% } + +table.citation { border-left: solid 1px gray; margin-left: 1px } +table.docinfo {margin: 2em 4em } +table.docutils {margin-top: 0.5em;margin-bottom: 0.5em } +table.footnote {border-left: solid 1px black;margin-left: 1px } + +table.docutils td, table.docutils th, +table.docinfo td, table.docinfo th {padding-left: 0.5em;padding-right: 0.5em; + vertical-align: top} + +table.docutils th.field-name, table.docinfo th.docinfo-name { + font-weight: bold;text-align: left;white-space: nowrap;padding-left: 0 } +h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, +h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {font-size: 100% } +ul.auto-toc { list-style-type: none } +/*a.reference { color: #E00000; font-weight:bold;} +a.reference:hover {color: #E00000;background-color: #ffff00;display: margin; + font-weight:bold;}*/ + +</style> +<script type="text/javascript"> + //<![CDATA[ + function toggleElem(id) { + var e = document.getElementById(id); + e.style.display = e.style.display == 'none' ? 'block' : 'none'; + } + + var gOpen = 'none' + function toggleAll() { + gOpen = gOpen == 'none' ? 'block' : 'none'; + var i = 1 + while (1) { + var e = document.getElementById("m"+i) + if (!e) break; + e.style.display = gOpen + i++; + } + document.getElementById('toggleButton').value = + gOpen == 'none' ? 'Show Details' : 'Hide Details'; + } + //]]> +</script> + +</head> +<body> +<div class="document" id="documentId"> +<h1 class="title">$title</h1> +$content +<small>Generated: $date $time UTC</small> +</div> +</body> +</html> +""" + diff --git a/copying.txt b/copying.txt new file mode 100644 index 000000000..65b743e4a --- /dev/null +++ b/copying.txt @@ -0,0 +1,18 @@ +======================================================= + The Nimrod Compiler + Copyright (C) 2004-2008 Andreas Rumpf +======================================================= + +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; version 2 +of the License. + +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, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. diff --git a/deinstall.sh b/deinstall.sh new file mode 100644 index 000000000..818b276dc --- /dev/null +++ b/deinstall.sh @@ -0,0 +1,38 @@ +#! /bin/sh +# +# Nimrod deinstallation script +# (c) 2008 Andreas Rumpf +# + +if [ $# -eq 1 ] ; then + case $1 in + "/usr/bin") + rm -rf /usr/lib/nimrod + rm -rf /usr/share/nimrod/doc + rm -f /usr/bin/nimrod + rm -f /etc/nimrod.cfg + rm -f /etc/nimdoc.cfg || exit 1 + ;; + "/usr/local/bin") + rm -rf /usr/local/lib/nimrod + rm -rf /usr/local/share/nimrod/doc + rm -f /usr/local/bin/nimrod + rm -f /etc/nimrod.cfg + rm -f /etc/nimdoc.cfg || exit 1 + ;; + *) + rm -rf $1/nimrod || exit 1 + ;; + esac + echo "deinstallation successful" +else + echo "Nimrod deinstallation script" + echo "Usage: [sudo] sh deinstall.sh DIR" + echo "Where DIR may be:" + echo " /usr/bin" + echo " /usr/local/bin" + echo " /opt" + echo " <some other dir> (treated like '/opt')" + exit 1 +fi + diff --git a/doc/endb.txt b/doc/endb.txt index b69a6ec6d..63e382859 100644 --- a/doc/endb.txt +++ b/doc/endb.txt @@ -14,7 +14,7 @@ compiled with the ``--debugger:on`` command line option. This also defines the conditional symbol ``ENDB`` for you. Note: You must not compile your program with the ``--app:gui`` -command line option because then there is no console +command line option because then there would be no console available for the debugger. If you start your program the debugger will immediately show diff --git a/doc/grammar.txt b/doc/grammar.txt index d8387670b..ee46cd63a 100644 --- a/doc/grammar.txt +++ b/doc/grammar.txt @@ -1,6 +1,6 @@ module ::= ([COMMENT] [SAD] stmt)* -optComma ::= [ ',' ] [COMMENT] [IND] +comma ::= ',' [COMMENT] [IND] operator ::= OP0 | OR | XOR | AND | OP3 | OP4 | OP5 | IS | ISNOT | IN | NOTIN | OP6 | DIV | MOD | SHL | SHR | OP7 | NOT @@ -34,11 +34,9 @@ primary ::= ( prefixOperator optInd )* ( symbol | constructor | | castExpr | addrExpr ) ( DOT optInd symbol #| CURLY_LE namedTypeDescList CURLY_RI - | PAR_LE optInd - namedExprList - PAR_RI + | PAR_LE optInd namedExprList PAR_RI | BRACKET_LE optInd - (namedTypeOrExpr optComma)* + [ namedTypeOrExpr (comma namedTypeOrExpr)* [comma] ] BRACKET_RI | CIRCUM | pragma )* @@ -50,17 +48,20 @@ literal ::= INT_LIT | INT8_LIT | INT16_LIT | INT32_LIT | INT64_LIT | NIL constructor ::= literal - | BRACKET_LE optInd (expr [COLON expr] optComma )* BRACKET_RI # []-Constructor - | CURLY_LE optInd (expr [DOTDOT expr] optComma )* CURLY_RI # {}-Constructor - | PAR_LE optInd (expr [COLON expr] optComma )* PAR_RI # ()-Constructor + | BRACKET_LE optInd colonExprList BRACKET_RI # []-Constructor + | CURLY_LE optInd sliceExprList CURLY_RI # {}-Constructor + | PAR_LE optInd colonExprList PAR_RI # ()-Constructor -exprList ::= ( expr optComma )* +exprList ::= [ expr (comma expr)* [comma] ] + +colonExpr ::= expr [COLON expr] +colonExprList ::= [ colonExpr (comma colonExpr)* [comma] ] namedExpr ::= expr [EQUALS expr] # actually this is symbol EQUALS expr|expr -namedExprList ::= ( namedExpr optComma )* +namedExprList ::= [ namedExpr (comma namedExpr)* [comma] ] -exprOrSlice ::= expr [ DOTDOT expr ] -sliceList ::= ( exprOrSlice optComma )+ +sliceExpr ::= expr [ DOTDOT expr ] +sliceExprList ::= [ sliceExpr (comma sliceExpr)* [comma] ] anonymousProc ::= LAMBDA paramList [pragma] EQUALS stmt expr ::= lowestExpr @@ -70,7 +71,7 @@ expr ::= lowestExpr ELSE COLON expr namedTypeDesc ::= typeDescK | expr [EQUALS (typeDescK | expr)] -namedTypeDescList ::= ( namedTypeDesc optComma )* +namedTypeDescList ::= [ namedTypeDesc (comma namedTypeDesc)* [comma] ] qualifiedIdent ::= symbol [ DOT symbol ] @@ -85,7 +86,7 @@ typeDesc ::= typeDescK | primary optSemicolon ::= [SEMICOLON] -macroStmt ::= COLON [stmt] (OF [sliceList] COLON stmt +macroStmt ::= COLON [stmt] (OF [sliceExprList] COLON stmt | ELIF expr COLON stmt | EXCEPT exceptList COLON stmt )* [ELSE COLON stmt] @@ -112,7 +113,7 @@ stmt ::= simpleStmt [SAD] ([SAD] (complexStmt | simpleStmt) )* DED -exprStmt ::= lowestExpr [EQUALS expr | (expr optComma)* [macroStmt]] +exprStmt ::= lowestExpr [EQUALS expr | [expr (comma expr)* [comma]] [macroStmt]] returnStmt ::= RETURN [expr] yieldStmt ::= YIELD expr discardStmt ::= DISCARD expr @@ -121,25 +122,27 @@ breakStmt ::= BREAK [symbol] continueStmt ::= CONTINUE ifStmt ::= IF expr COLON stmt (ELIF expr COLON stmt)* [ELSE COLON stmt] whenStmt ::= WHEN expr COLON stmt (ELIF expr COLON stmt)* [ELSE COLON stmt] -caseStmt ::= CASE expr (OF sliceList COLON stmt)* +caseStmt ::= CASE expr (OF sliceExprList COLON stmt)* (ELIF expr COLON stmt)* [ELSE COLON stmt] whileStmt ::= WHILE expr COLON stmt -forStmt ::= FOR (symbol optComma)+ IN expr [DOTDOT expr] COLON stmt -exceptList ::= (qualifiedIdent optComma)* +forStmt ::= FOR symbol (comma symbol)* [comma] IN expr [DOTDOT expr] COLON stmt +exceptList ::= [qualifiedIdent (comma qualifiedIdent)* [comma]] tryStmt ::= TRY COLON stmt (EXCEPT exceptList COLON stmt)* [FINALLY COLON stmt] asmStmt ::= ASM [pragma] (STR_LIT | RSTR_LIT | TRIPLESTR_LIT) blockStmt ::= BLOCK [symbol] COLON stmt -importStmt ::= IMPORT ((symbol | STR_LIT | RSTR_LIT | TRIPLESTR_LIT) [AS symbol] optComma)+ -includeStmt ::= INCLUDE ((symbol | STR_LIT | RSTR_LIT | TRIPLESTR_LIT) optComma)+ -fromStmt ::= FROM (symbol | STR_LIT | RSTR_LIT | TRIPLESTR_LIT) IMPORT (symbol optComma)+ +filename ::= symbol | STR_LIT | RSTR_LIT | TRIPLESTR_LIT +importStmt ::= IMPORT filename (comma filename)* [comma] +includeStmt ::= INCLUDE filename (comma filename)* [comma] +fromStmt ::= FROM filename IMPORT symbol (comma symbol)* [comma] -pragma ::= CURLYDOT_LE (expr [COLON expr] optComma)+ (CURLYDOT_RI | CURLY_RI) +pragma ::= CURLYDOT_LE colonExprList (CURLYDOT_RI | CURLY_RI) -paramList ::= [PAR_LE ((symbol optComma)+ COLON typeDesc optComma)* PAR_RI] [COLON typeDesc] +param ::= symbol (comma symbol)* [comma] COLON typeDesc +paramList ::= [PAR_LE [param (comma param)* [comma]] PAR_RI] [COLON typeDesc] genericParams ::= BRACKET_LE (symbol [EQUALS typeDesc] )* BRACKET_RI @@ -160,22 +163,24 @@ constDecl ::= symbol ["*"] [pragma] colonAndEquals [COMMENT | IND COMMENT] constSection ::= CONST indPush constDecl (SAD constDecl)* DED typeDef ::= typeDesc | objectDef | enumDef +objectField ::= symbol ["*"] [pragma] objectIdentPart ::= - (symbol ["*" | "-"] [pragma] optComma)+ COLON typeDesc [COMMENT | IND COMMENT] + objectField (comma objectField)* [comma] COLON typeDesc [COMMENT|IND COMMENT] objectWhen ::= WHEN expr COLON [COMMENT] objectPart (ELIF expr COLON [COMMENT] objectPart)* [ELSE COLON [COMMENT] objectPart] objectCase ::= CASE expr COLON typeDesc [COMMENT] - (OF sliceList COLON [COMMENT] objectPart)* + (OF sliceExprList COLON [COMMENT] objectPart)* [ELSE COLON [COMMENT] objectPart] objectPart ::= objectWhen | objectCase | objectIdentPart | NIL | indPush objectPart (SAD objectPart)* DED -tupleDesc ::= BRACKET_LE optInd ((symbol optComma)+ COLON typeDesc optComma)* BRACKET_RI +tupleDesc ::= BRACKET_LE optInd [param (comma param)* [comma]] BRACKET_RI objectDef ::= OBJECT [pragma] [OF typeDesc] objectPart -enumDef ::= ENUM [OF typeDesc] (symbol [EQUALS expr] optComma [COMMENT | IND COMMENT])+ +enumField ::= symbol [EQUALS expr] +enumDef ::= ENUM [OF typeDesc] (enumField [comma | COMMENT | IND COMMENT])+ typeDecl ::= COMMENT | symbol ["*"] [genericParams] [EQUALS typeDef] [COMMENT | IND COMMENT] @@ -183,5 +188,7 @@ typeDecl ::= COMMENT typeSection ::= TYPE indPush typeDecl (SAD typeDecl)* DED colonOrEquals ::= COLON typeDesc [EQUALS expr] | EQUALS expr -varPart ::= (symbol ["*" | "-"] [pragma] optComma)+ colonOrEquals [COMMENT | IND COMMENT] -varSection ::= VAR (varPart | indPush (COMMENT|varPart) (SAD (COMMENT|varPart))* DED) +varField ::= symbol ["*"] [pragma] +varPart ::= symbol (comma symbol)* [comma] colonOrEquals [COMMENT | IND COMMENT] +varSection ::= VAR (varPart + | indPush (COMMENT|varPart) (SAD (COMMENT|varPart))* DED) diff --git a/doc/manual.txt b/doc/manual.txt index 1c8faf4ac..cd982302f 100644 --- a/doc/manual.txt +++ b/doc/manual.txt @@ -223,7 +223,7 @@ A character is not an Unicode character but a single byte. The reason for this is efficiency: For the overwhelming majority of use-cases, the resulting programs will still handle UTF-8 properly as UTF-8 was specially designed for this. -Another reason is that Nimrod should support ``array[char, int]`` or +Another reason is that Nimrod can thus support ``array[char, int]`` or ``set[char]`` efficiently as many algorithms rely on this feature. @@ -363,9 +363,9 @@ constant declaration at compile time. Types ----- -All expressions have a `type`:idx: which is known at compile time. Thus Nimrod -is statically typed. One can declare new types, which is in -essence defining an identifier that can be used to denote this custom type. +All expressions have a `type`:idx: which is known at compile time. Nimrod +is statically typed. One can declare new types, which is in essence defining +an identifier that can be used to denote this custom type. These are the major type classes: @@ -386,9 +386,9 @@ Ordinal types - Ordinal types are countable and ordered. This property allows the operation of functions as ``Inc``, ``Ord``, ``Dec`` on ordinal types to be defined. -- Ordinal values have a smallest possible value. Trying to count farther +- Ordinal values have a smallest possible value. Trying to count further down than the smallest value gives a checked runtime or static error. -- Ordinal values have a largest possible value. Trying to count farther +- Ordinal values have a largest possible value. Trying to count further than the largest value gives a checked runtime or static error. Integers, bool, characters and enumeration types (and subrange of these @@ -453,16 +453,16 @@ floatXX implementation supports ``float32`` and ``float64``. Literals of these types have the suffix 'fXX. -`Automatic type conversion`:idx: in expressions where different kinds -of integer types are used is performed. However, if the type conversion -loses information, the `EInvalidValue`:idx: exception is raised. Certain cases -of the convert error are detected at compile time. +`Automatic type conversion`:idx: is performed in expressions where different +kinds of integer types are used. However, if the type conversion +loses information, the `EOutOfRange`:idx: exception is raised (if the error +cannot be detected at compile time). Automatic type conversion in expressions with different kinds of floating point types is performed: The smaller type is converted to the larger. Arithmetic performed on floating point types -follows the IEEE standard. Only the ``int`` type is converted to a floating -point type automatically, other integer types are not. +follows the IEEE standard. Integer types are not converted to floating point +types automatically and vice versa. Boolean type @@ -475,7 +475,7 @@ This condition holds:: ord(false) == 0 and ord(true) == 1 -The operators ``not, and, or, xor, implies, <, <=, >, >=, !=, ==`` are defined +The operators ``not, and, or, xor, <, <=, >, >=, !=, ==`` are defined for the bool type. The ``and`` and ``or`` operators perform short-cut evaluation. Example: @@ -633,6 +633,8 @@ The lower bound of an array or sequence may be received by the built-in proc received by ``len()``. ``low()`` for a sequence or an open array always returns 0, as this is the first valid index. +The notation ``x[i]`` can be used to access the i-th element of ``x``. + Arrays are always bounds checked (at compile-time or at runtime). These checks can be disabled via pragmas or invoking the compiler with the ``--bound_checks:off`` command line switch. @@ -642,8 +644,8 @@ Tuples and object types ~~~~~~~~~~~~~~~~~~~~~~~ A variable of a `tuple`:idx: or `object`:idx: type is a heterogenous storage container. -A tuple or object defines various named *fields* of a type. A tuple defines an -*order* of the fields additionally. Tuples are meant for heterogenous storage +A tuple or object defines various named *fields* of a type. A tuple also +defines an *order* of the fields. Tuples are meant for heterogenous storage types with no overhead and few abstraction possibilities. The constructor ``()`` can be used to construct tuples. The order of the fields in the constructor must match the order of the tuple's definition. Different tuple-types are @@ -651,8 +653,9 @@ must match the order of the tuple's definition. Different tuple-types are order. The assignment operator for tuples copies each component. -The default assignment operator for objects is not defined. The programmer may -provide one, however. +The default assignment operator for objects copies each component. Overloading +of the assignment operator for objects is not possible, but this may change in +future versions of the compiler. .. code-block:: nimrod @@ -667,7 +670,7 @@ provide one, however. person = ("Peter", 30) The implementation aligns the fields for best access performance. The alignment -is done in a way that is compatible the way the C compiler does it. +is compatible with the way the C compiler does it. Objects provide many features that tuples do not. Object provide inheritance and information hiding. Objects have access to their type at runtime, so that @@ -677,7 +680,7 @@ the ``is`` operator can be used to determine the object's type. type TPerson = object - name*: string # the * means that `name` is accessible from the outside + name*: string # the * means that `name` is accessible from other modules age: int # no * means that the field is hidden TStudent = object of TPerson # a student is a person @@ -692,6 +695,7 @@ Object fields that should be visible outside from the defining module, have to marked by ``*``. In contrast to tuples, different object types are never *equivalent*. + Object variants ~~~~~~~~~~~~~~~ Often an object hierarchy is overkill in certain situations where simple @@ -726,6 +730,7 @@ An example: new(n) # creates a new node n.kind = nkFloat n.floatVal = 0.0 # valid, because ``n.kind==nkFloat``, so that it fits + # the following statement raises an `EInvalidField` exception, because # n.kind's value does not fit: n.strVal = "" @@ -739,9 +744,7 @@ Set type ~~~~~~~~ The `set type`:idx: models the mathematical notion of a set. The set's basetype can only be an ordinal type. The reason is that sets are implemented -as bit vectors. Sets are designed for high performance computing. - -Note: The sets module can be used for sets of other types. +as high performance bit vectors. Sets can be constructed via the set constructor: ``{}`` is the empty set. The empty set is type combatible with any special set type. The constructor @@ -767,22 +770,23 @@ operation meaning ``e in A`` set membership (A contains element e) ``A -+- B`` symmetric set difference (= (A - B) + (B - A)) ``card(A)`` the cardinality of A (number of elements in A) -``incl(A, elem)`` same as A = A + {elem}, but may be faster -``excl(A, elem)`` same as A = A - {elem}, but may be faster +``incl(A, elem)`` same as A = A + {elem} +``excl(A, elem)`` same as A = A - {elem} ================== ======================================================== -Reference type -~~~~~~~~~~~~~~ + +Reference and pointer types +~~~~~~~~~~~~~~~~~~~~~~~~~~~ References (similiar to `pointers`:idx: in other programming languages) are a way to introduce many-to-one relationships. This means different references can -point to and modify the same location in memory. References should be used -sparingly in a program. They are only needed for constructing graphs. +point to and modify the same location in memory. Nimrod distinguishes between `traced`:idx: and `untraced`:idx: references. -Untraced references are also called *pointers*. The difference between them is -that traced references are garbage collected, untraced are not. Thus untraced -references are *unsafe*. However for certain low-level operations (accessing -the hardware) untraced references are unavoidable. +Untraced references are also called *pointers*. Traced references point to +objects of a garbage collected heap, untraced references point to +manually allocated objects or to objects somewhere else in memory. Thus +untraced references are *unsafe*. However for certain low-level operations +(accessing the hardware) untraced references are unavoidable. Traced references are declared with the **ref** keyword, untraced references are declared with the **ptr** keyword. @@ -806,13 +810,15 @@ dereferencing operations for reference types: var n: PNode new(n) - n.data = 9 # no need to write n^.data + n.data = 9 # no need to write n^ .data To allocate a new traced object, the built-in procedure ``new`` has to be used. To deal with untraced memory, the procedures ``alloc``, ``dealloc`` and ``realloc`` can be used. The documentation of the system module contains further information. +If a reference points to *nothing*, it has the value ``nil``. + Special care has to be taken if an untraced object contains traced objects like traced references, strings or sequences: In order to free everything properly, the built-in procedure ``GCunref`` has to be called before freeing the @@ -822,7 +828,7 @@ untraced memory manually! Procedural type ~~~~~~~~~~~~~~~ -A `procedural type`:idx: is internally a pointer to procedure. ``nil`` is +A `procedural type`:idx: is internally a pointer to a procedure. ``nil`` is an allowed value for variables of a procedural type. Nimrod uses procedural types to achieve `functional`:idx: programming techniques. Dynamic dispatch for OOP constructs can also be implemented with procedural types. @@ -928,7 +934,7 @@ statements always have to be intended:: complexStmt ::= ifStmt | whileStmt | caseStmt | tryStmt | forStmt | blockStmt | asmStmt | procDecl | iteratorDecl | macroDecl | templateDecl - | constDecl | typeDecl | whenStmt | varStmt + | constSection | typeSection | whenStmt | varSection @@ -957,8 +963,10 @@ Var statement Syntax:: colonOrEquals ::= COLON typeDesc [EQUALS expr] | EQUALS expr - varPart ::= (symbol ["*" | "-"] [pragma] optComma)+ colonOrEquals [COMMENT] - varStmt ::= VAR (varPart | indPush varPart (SAD varPart)* DED) + varField ::= symbol ["*"] [pragma] + varPart ::= symbol (comma symbol)* [comma] colonOrEquals [COMMENT | IND COMMENT] + varSection ::= VAR (varPart + | indPush (COMMENT|varPart) (SAD (COMMENT|varPart))* DED) `Var`:idx: statements declare new local and global variables and initialize them. A comma seperated list of variables can be used to specify @@ -1126,14 +1134,12 @@ Syntax:: Example: .. code-block:: nimrod - raise EOS("operating system failed") + raise newEOS("operating system failed") Apart from built-in operations like array indexing, memory allocation, etc. -the ``raise`` statement is the only way to raise an exception. The -identifier has to be the name of a previously declared exception. A -comma followed by an expression may follow; the expression must be of type -``string`` or ``cstring``; this is an error message that can be extracted -with the `getCurrentExceptionMsg`:idx: procedure in the module ``system``. +the ``raise`` statement is the only way to raise an exception. + +.. XXX document this better! If no exception name is given, the current exception is `re-raised`:idx:. The `ENoExceptionToReraise`:idx: exception is raised if there is no exception to @@ -1146,10 +1152,11 @@ Try statement Syntax:: - exceptList ::= (qualifiedIdent optComma)* + exceptList ::= [qualifiedIdent (comma qualifiedIdent)* [comma]] tryStmt ::= TRY COLON stmt - (EXCEPT exceptList COLON stmt)* - [FINALLY COLON stmt] + (EXCEPT exceptList COLON stmt)* + [FINALLY COLON stmt] + Example: @@ -1209,10 +1216,15 @@ sugar for: .. code-block:: nimrod result = expr - return + return result + +``return`` without an expression is a short notation for ``return result`` if +the proc has a return type. The `result`:idx: variable is always the return +value of the procedure. It is automatically declared by the compiler. As all +variables, ``result`` is initialized to (binary) zero:: -The `result`:idx: variable is always the return value of the procedure. It is -automatically declared by the compiler. +.. code-block:: nimrod + proc returnZero(): int = nil # implicitely returns 0 Yield statement @@ -1274,7 +1286,7 @@ Example: The `break`:idx: statement is used to leave a block immediately. If ``symbol`` is given, it is the name of the enclosing block that is to leave. If it is -absent, the innermost block is leaved. +absent, the innermost block is left. While statement @@ -1343,14 +1355,16 @@ called `procedures`:idx: in Nimrod (which is the correct terminology). A procedure declaration defines an identifier and associates it with a block of code. A procedure may call itself recursively. The syntax is:: - paramList ::= [PAR_LE ((symbol optComma)+ COLON typeDesc optComma)* PAR_RI] - [COLON typeDesc] + param ::= symbol (comma symbol)* [comma] COLON typeDesc + paramList ::= [PAR_LE [param (comma param)* [comma]] PAR_RI] [COLON typeDesc] + genericParams ::= BRACKET_LE (symbol [EQUALS typeDesc] )* BRACKET_RI - - procDecl ::= PROC symbol ["*"] [genericParams] paramList [pragma] + + procDecl ::= PROC symbol ["*"] [genericParams] + paramList [pragma] [EQUALS stmt] - -If the ``EQUALS stms`` part is missing, it is a `forward`:idx: declaration. If + +If the ``EQUALS stmt`` part is missing, it is a `forward`:idx: declaration. If the proc returns a value, the procedure body can access an implicit declared variable named `result`:idx: that represents the return value. Procs can be overloaded. The overloading resolution algorithm tries to find the proc that is @@ -1388,8 +1402,8 @@ Calling a procedure can be done in many different ways: callme(y=1, x=0, "abd", '\t') # (x=0, y=1, s="abd", c='\t', b=false) # call with named arguments (order is not relevant): callme(c='\t', y=1, x=0) # (x=0, y=1, s="", c='\t', b=false) - # call as a command statement: no () or , needed: - callme 0 1 "abc" '\t' + # call as a command statement: no () needed: + callme 0, 1, "abc", '\t' Iterators and the for statement @@ -1397,12 +1411,13 @@ Iterators and the for statement Syntax:: - forStmt ::= FOR (symbol optComma)+ IN expr [DOTDOT expr] COLON stmt + forStmt ::= FOR symbol (comma symbol)* [comma] IN expr [DOTDOT expr] COLON stmt - paramList ::= [PAR_LE ((symbol optComma)+ COLON typeDesc optComma)* PAR_RI] - [COLON typeDesc] + param ::= symbol (comma symbol)* [comma] COLON typeDesc + paramList ::= [PAR_LE [param (comma param)* [comma]] PAR_RI] [COLON typeDesc] + genericParams ::= BRACKET_LE (symbol [EQUALS typeDesc] )* BRACKET_RI - + iteratorDecl ::= ITERATOR symbol ["*"] [genericParams] paramList [pragma] [EQUALS stmt] @@ -1482,7 +1497,7 @@ Example: A `type`:idx: section begins with the ``type`` keyword. It contains multiple type definitions. A type definition binds a type to a name. Type definitions -can be recursive or even mutually recursive. Mutually Recursive types are only +can be recursive or even mutually recursive. Mutually recursive types are only possible within a single ``type`` section. @@ -1579,17 +1594,16 @@ macros. Modules ------- Nimrod supports splitting a program into pieces by a `module`:idx: concept. -Modules make separate compilation possible. Each module needs to be in its -own file. Modules enable `information hiding`:idx: and -`separate compilation`:idx:. A module may gain access to symbols of another -module by the `import`:idx: statement. `Recursive module dependancies`:idx: are -allowed, but slightly subtle. Only top-level symbols that are marked with an -asterisk (``*``) are exported. +Each module needs to be in its own file. Modules enable +`information hiding`:idx: and `separate compilation`:idx:. A module may gain +access to symbols of another module by the `import`:idx: statement. +`Recursive module dependancies`:idx: are allowed, but slightly subtle. Only +top-level symbols that are marked with an asterisk (``*``) are exported. The algorithm for compiling modules is: - Compile the whole module as usual, following import statements recursively -- if we have a cycle only import the already parsed symbols (that are +- if there is a cycle only import the already parsed symbols (that are exported); if an unknown identifier occurs then abort This is best illustrated by an example: @@ -1684,7 +1698,10 @@ Pragmas Syntax:: - pragma ::= CURLYDOT_LE (expr [COLON expr] optComma)+ (CURLYDOT_RI | CURLY_RI) + colonExpr ::= expr [COLON expr] + colonExprList ::= [ colonExpr (comma colonExpr)* [comma] ] + + pragma ::= CURLYDOT_LE colonExprList (CURLYDOT_RI | CURLY_RI) Pragmas are Nimrod's method to give the compiler additional information/ commands without introducing a massive number of new keywords. Pragmas are @@ -1770,7 +1787,6 @@ hints on|off Turns the hint messages of the compiler optimization none|speed|size Optimize the code for speed or size, or disable optimization. For non-optimizing compilers this option has no effect. - Neverless they must parse it properly. callconv cdecl|... Specifies the default calling convention for all procedures (and procedure types) that follow. diff --git a/doc/theindex.txt b/doc/theindex.txt index 997329242..f60e85d28 100644 --- a/doc/theindex.txt +++ b/doc/theindex.txt @@ -400,7 +400,7 @@ Index `posix.html#1093 <posix.html#1093>`_ `assembler`:idx: - `manual.html#198 <manual.html#198>`_ + `manual.html#197 <manual.html#197>`_ `assert`:idx: `system.html#416 <system.html#416>`_ @@ -425,7 +425,7 @@ Index `system.html#373 <system.html#373>`_ `block`:idx: - `manual.html#194 <manual.html#194>`_ + `manual.html#193 <manual.html#193>`_ `bool`:idx: `system.html#109 <system.html#109>`_ @@ -434,7 +434,7 @@ Index `manual.html#147 <manual.html#147>`_ `break`:idx: - `manual.html#195 <manual.html#195>`_ + `manual.html#194 <manual.html#194>`_ `breakpoint`:idx: `endb.html#103 <endb.html#103>`_ @@ -702,7 +702,7 @@ Index `libzip.html#169 <libzip.html#169>`_ `continue`:idx: - `manual.html#197 <manual.html#197>`_ + `manual.html#196 <manual.html#196>`_ `copy`:idx: * `system.html#403 <system.html#403>`_ @@ -857,7 +857,7 @@ Index `system.html#157 <system.html#157>`_ `define`:idx: - `manual.html#224 <manual.html#224>`_ + `manual.html#223 <manual.html#223>`_ `defined`:idx: `system.html#114 <system.html#114>`_ @@ -933,7 +933,7 @@ Index `nimrodc.html#120 <nimrodc.html#120>`_ `domain specific languages`:idx: - `manual.html#213 <manual.html#213>`_ + `manual.html#212 <manual.html#212>`_ `D_T_FMT`:idx: `posix.html#390 <posix.html#390>`_ @@ -1083,8 +1083,7 @@ Index `regexprs.html#104 <regexprs.html#104>`_ `EInvalidValue`:idx: - * `manual.html#146 <manual.html#146>`_ - * `system.html#143 <system.html#143>`_ + `system.html#143 <system.html#143>`_ `EIO`:idx: * `system.html#134 <system.html#134>`_ @@ -1161,7 +1160,7 @@ Index `posix.html#264 <posix.html#264>`_ `ENoExceptionToReraise`:idx: - * `manual.html#186 <manual.html#186>`_ + * `manual.html#185 <manual.html#185>`_ * `system.html#149 <system.html#149>`_ `ENOEXEC`:idx: @@ -1228,7 +1227,8 @@ Index `system.html#144 <system.html#144>`_ `EOutOfRange`:idx: - `system.html#147 <system.html#147>`_ + * `manual.html#146 <manual.html#146>`_ + * `system.html#147 <system.html#147>`_ `EOVERFLOW`:idx: `posix.html#283 <posix.html#283>`_ @@ -1279,8 +1279,8 @@ Index `posix.html#219 <posix.html#219>`_ `error`:idx: - * `manual.html#223 <manual.html#223>`_ - * `manual.html#226 <manual.html#226>`_ + * `manual.html#222 <manual.html#222>`_ + * `manual.html#225 <manual.html#225>`_ * `dialogs.html#104 <dialogs.html#104>`_ `errorStr`:idx: @@ -1324,10 +1324,10 @@ Index `posix.html#297 <posix.html#297>`_ `except`:idx: - `manual.html#189 <manual.html#189>`_ + `manual.html#188 <manual.html#188>`_ `exception handlers`:idx: - `manual.html#188 <manual.html#188>`_ + `manual.html#187 <manual.html#187>`_ `excl`:idx: `system.html#165 <system.html#165>`_ @@ -1396,7 +1396,7 @@ Index `manual.html#169 <manual.html#169>`_ `fatal`:idx: - `manual.html#227 <manual.html#227>`_ + `manual.html#226 <manual.html#226>`_ `fchdir`:idx: `posix.html#984 <posix.html#984>`_ @@ -1522,7 +1522,7 @@ Index `os.html#106 <os.html#106>`_ `finally`:idx: - `manual.html#190 <manual.html#190>`_ + `manual.html#189 <manual.html#189>`_ `find`:idx: * `system.html#456 <system.html#456>`_ @@ -1573,7 +1573,7 @@ Index `posix.html#478 <posix.html#478>`_ `for`:idx: - `manual.html#205 <manual.html#205>`_ + `manual.html#204 <manual.html#204>`_ `fork`:idx: `posix.html#986 <posix.html#986>`_ @@ -1582,7 +1582,7 @@ Index `manual.html#124 <manual.html#124>`_ `forward`:idx: - `manual.html#202 <manual.html#202>`_ + `manual.html#201 <manual.html#201>`_ `fpathconf`:idx: `posix.html#987 <posix.html#987>`_ @@ -1678,7 +1678,7 @@ Index `posix.html#311 <posix.html#311>`_ `funtions`:idx: - `manual.html#200 <manual.html#200>`_ + `manual.html#199 <manual.html#199>`_ `F_WRLCK`:idx: `posix.html#312 <posix.html#312>`_ @@ -1718,7 +1718,7 @@ Index `regexprs.html#102 <regexprs.html#102>`_ `Generics`:idx: - `manual.html#209 <manual.html#209>`_ + `manual.html#208 <manual.html#208>`_ `getApplicationDir`:idx: `os.html#110 <os.html#110>`_ @@ -1748,8 +1748,7 @@ Index `os.html#112 <os.html#112>`_ `getCurrentExceptionMsg`:idx: - * `manual.html#184 <manual.html#184>`_ - * `system.html#428 <system.html#428>`_ + `system.html#428 <system.html#428>`_ `getCurrentLine`:idx: `lexbase.html#106 <lexbase.html#106>`_ @@ -2027,8 +2026,8 @@ Index `system.html#118 <system.html#118>`_ `hint`:idx: - * `manual.html#221 <manual.html#221>`_ - * `manual.html#229 <manual.html#229>`_ + * `manual.html#220 <manual.html#220>`_ + * `manual.html#228 <manual.html#228>`_ `htonl`:idx: `posix.html#792 <posix.html#792>`_ @@ -2058,10 +2057,10 @@ Index `manual.html#181 <manual.html#181>`_ `implicit block`:idx: - `manual.html#207 <manual.html#207>`_ + `manual.html#206 <manual.html#206>`_ `import`:idx: - `manual.html#217 <manual.html#217>`_ + `manual.html#216 <manual.html#216>`_ `importc`:idx: `nimrodc.html#101 <nimrodc.html#101>`_ @@ -2127,7 +2126,7 @@ Index `dialogs.html#102 <dialogs.html#102>`_ `information hiding`:idx: - `manual.html#215 <manual.html#215>`_ + `manual.html#214 <manual.html#214>`_ `init`:idx: `parseopt.html#103 <parseopt.html#103>`_ @@ -2213,7 +2212,7 @@ Index * `system.html#443 <system.html#443>`_ `iterator`:idx: - `manual.html#206 <manual.html#206>`_ + `manual.html#205 <manual.html#205>`_ `iterOverEnvironment`:idx: `os.html#152 <os.html#152>`_ @@ -2339,7 +2338,7 @@ Index `posix.html#1061 <posix.html#1061>`_ `Macros`:idx: - `manual.html#212 <manual.html#212>`_ + `manual.html#211 <manual.html#211>`_ `makecontext`:idx: `posix.html#1189 <posix.html#1189>`_ @@ -2384,7 +2383,7 @@ Index `posix.html#685 <posix.html#685>`_ `methods`:idx: - `manual.html#199 <manual.html#199>`_ + `manual.html#198 <manual.html#198>`_ `min`:idx: * `system.html#263 <system.html#263>`_ @@ -2501,7 +2500,7 @@ Index * `system.html#217 <system.html#217>`_ `module`:idx: - `manual.html#214 <manual.html#214>`_ + `manual.html#213 <manual.html#213>`_ `MON_1`:idx: `posix.html#410 <posix.html#410>`_ @@ -2775,7 +2774,7 @@ Index `manual.html#139 <manual.html#139>`_ `Operators`:idx: - `manual.html#204 <manual.html#204>`_ + `manual.html#203 <manual.html#203>`_ `or`:idx: * `system.html#233 <system.html#233>`_ @@ -3122,7 +3121,7 @@ Index `manual.html#162 <manual.html#162>`_ `procedures`:idx: - `manual.html#201 <manual.html#201>`_ + `manual.html#200 <manual.html#200>`_ `PROT_EXEC`:idx: `posix.html#676 <posix.html#676>`_ @@ -3563,7 +3562,7 @@ Index `zlib.html#104 <zlib.html#104>`_ `push/pop`:idx: - `manual.html#230 <manual.html#230>`_ + `manual.html#229 <manual.html#229>`_ `putEnv`:idx: `os.html#142 <os.html#142>`_ @@ -3624,7 +3623,7 @@ Index `system.html#120 <system.html#120>`_ `re-raised`:idx: - `manual.html#185 <manual.html#185>`_ + `manual.html#184 <manual.html#184>`_ `read`:idx: `posix.html#1018 <posix.html#1018>`_ @@ -3686,7 +3685,7 @@ Index `system.html#413 <system.html#413>`_ `Recursive module dependancies`:idx: - `manual.html#218 <manual.html#218>`_ + `manual.html#217 <manual.html#217>`_ `register`:idx: `nimrodc.html#113 <nimrodc.html#113>`_ @@ -3708,11 +3707,11 @@ Index `system.html#371 <system.html#371>`_ `result`:idx: - * `manual.html#192 <manual.html#192>`_ - * `manual.html#203 <manual.html#203>`_ + * `manual.html#191 <manual.html#191>`_ + * `manual.html#202 <manual.html#202>`_ `return`:idx: - `manual.html#191 <manual.html#191>`_ + `manual.html#190 <manual.html#190>`_ `rewinddir`:idx: `posix.html#804 <posix.html#804>`_ @@ -3965,7 +3964,7 @@ Index `scope`:idx: * `manual.html#106 <manual.html#106>`_ - * `manual.html#219 <manual.html#219>`_ + * `manual.html#218 <manual.html#218>`_ `SC_OPEN_MAX`:idx: `posix.html#571 <posix.html#571>`_ @@ -4229,7 +4228,7 @@ Index `posix.html#1054 <posix.html#1054>`_ `separate compilation`:idx: - `manual.html#216 <manual.html#216>`_ + `manual.html#215 <manual.html#215>`_ `seq`:idx: `system.html#123 <system.html#123>`_ @@ -6355,7 +6354,7 @@ Index `posix.html#1034 <posix.html#1034>`_ `system`:idx: - `manual.html#220 <manual.html#220>`_ + `manual.html#219 <manual.html#219>`_ `tabulator`:idx: `manual.html#125 <manual.html#125>`_ @@ -6427,7 +6426,7 @@ Index `posix.html#806 <posix.html#806>`_ `template`:idx: - `manual.html#211 <manual.html#211>`_ + `manual.html#210 <manual.html#210>`_ `TEndian`:idx: `system.html#385 <system.html#385>`_ @@ -6696,7 +6695,7 @@ Index `posix.html#1037 <posix.html#1037>`_ `try`:idx: - `manual.html#187 <manual.html#187>`_ + `manual.html#186 <manual.html#186>`_ `Tsched_param`:idx: `posix.html#199 <posix.html#199>`_ @@ -6854,10 +6853,10 @@ Index `type`:idx: * `manual.html#102 <manual.html#102>`_ * `manual.html#141 <manual.html#141>`_ - * `manual.html#208 <manual.html#208>`_ + * `manual.html#207 <manual.html#207>`_ `type parameters`:idx: - `manual.html#210 <manual.html#210>`_ + `manual.html#209 <manual.html#209>`_ `type suffix`:idx: `manual.html#138 <manual.html#138>`_ @@ -6908,7 +6907,7 @@ Index `zlib.html#156 <zlib.html#156>`_ `undef`:idx: - `manual.html#225 <manual.html#225>`_ + `manual.html#224 <manual.html#224>`_ `UnixToNativePath`:idx: `os.html#124 <os.html#124>`_ @@ -6963,8 +6962,8 @@ Index * `zipfiles.html#110 <zipfiles.html#110>`_ `warning`:idx: - * `manual.html#222 <manual.html#222>`_ - * `manual.html#228 <manual.html#228>`_ + * `manual.html#221 <manual.html#221>`_ + * `manual.html#227 <manual.html#227>`_ * `dialogs.html#103 <dialogs.html#103>`_ `WCONTINUED`:idx: @@ -6980,7 +6979,7 @@ Index `manual.html#183 <manual.html#183>`_ `while`:idx: - `manual.html#196 <manual.html#196>`_ + `manual.html#195 <manual.html#195>`_ `Whitespace`:idx: `strutils.html#102 <strutils.html#102>`_ @@ -7058,7 +7057,7 @@ Index `posix.html#441 <posix.html#441>`_ `yield`:idx: - `manual.html#193 <manual.html#193>`_ + `manual.html#192 <manual.html#192>`_ `Z_ASCII`:idx: `zlib.html#138 <zlib.html#138>`_ diff --git a/gpl.html b/gpl.html new file mode 100644 index 000000000..0aec9fff0 --- /dev/null +++ b/gpl.html @@ -0,0 +1,493 @@ +<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN"> +<html> +<head> +<title>GNU General Public License - GNU Project - Free Software Foundation (FSF)</title> +</head> +<body bgcolor="#FFFFFF" text="#000000" link="#1F00FF" alink="#FF0000" vlink="#9900DD"> +<h1>GNU General Public License</h1> +<hr> +<h2>Table of Contents</h2> +<ul> + <li><a name="TOC1" href="gpl.html#SEC1">GNU GENERAL PUBLIC LICENSE</a> +<ul> +<li><a name="TOC2" href="gpl.html#SEC2">Preamble</a> +<li><a name="TOC3" href="gpl.html#SEC3">TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</a> +<li><a name="TOC4" href="gpl.html#SEC4">How to Apply These Terms to Your New Programs</a> + +</ul> +</ul> + +<p> + +<hr> + +<p> + + + +<h2><a name="SEC1" href="gpl.html#TOC1">GNU GENERAL PUBLIC LICENSE</a></h2> +<p> +Version 2, June 1991 + +</p> + +<pre> +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +</pre> + + + +<h2><a name="SEC2" href="gpl.html#TOC2">Preamble</a></h2> + +<p> + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +</p> +<p> + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +</p> +<p> + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +</p> +<p> + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +</p> +<p> + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +</p> +<p> + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +</p> +<p> + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +</p> +<p> + The precise terms and conditions for copying, distribution and +modification follow. + +</p> + + +<h2><a name="SEC3" href="gpl.html#TOC3">TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</a></h2> + + +<p> + +<strong>0.</strong> + This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". +<p> + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +<p> + +<strong>1.</strong> + You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. +<p> + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. +<p> + +<strong>2.</strong> + You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: +<p> + +<ul> + +<li><strong>a)</strong> + You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + +<p> +<li><strong>b)</strong> + You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + +<p> +<li><strong>c)</strong> + If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) +</ul> + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. +<p> + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. +<p> + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +<p> + +<strong>3.</strong> + You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + +<!-- we use this doubled UL to get the sub-sections indented, --> +<!-- while making the bullets as unobvious as possible. --> +<ul> + +<li><strong>a)</strong> + Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + +<p> +<li><strong>b)</strong> + Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + +<p> +<li><strong>c)</strong> + Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) +</ul> + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. +<p> + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. +<p> + +<strong>4.</strong> + You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +<p> + +<strong>5.</strong> + You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +<p> + +<strong>6.</strong> + Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +<p> + +<strong>7.</strong> + If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. +<p> + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. +<p> + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. +<p> + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +<p> + +<strong>8.</strong> + If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +<p> + +<strong>9.</strong> + The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. +<p> + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +<p> + + +<strong>10.</strong> + If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + + +<p><strong>NO WARRANTY</strong></p> + +<p> + +<strong>11.</strong> + BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +<p> + +<strong>12.</strong> + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +<p> + + +<h2>END OF TERMS AND CONDITIONS</h2> + + + +<h2><a name="SEC4" href="gpl.html#TOC4">How to Apply These Terms to Your New Programs</a></h2> + +<p> + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +</p> +<p> + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + +</p> + +<pre> +<var>one line to give the program's name and an idea of what it does.</var> +Copyright (C) <var>yyyy</var> <var>name of author</var> + +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 +of the License, 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, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +</pre> + +<p> +Also add information on how to contact you by electronic and paper mail. + +</p> +<p> +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +</p> + +<pre> +Gnomovision version 69, Copyright (C) <var>year</var> <var>name of author</var> +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details +type `show w'. This is free software, and you are welcome +to redistribute it under certain conditions; type `show c' +for details. +</pre> + +<p> +The hypothetical commands <samp>`show w'</samp> and <samp>`show c'</samp> should show +the appropriate parts of the General Public License. Of course, the +commands you use may be called something other than <samp>`show w'</samp> and +<samp>`show c'</samp>; they could even be mouse-clicks or menu items--whatever +suits your program. + +</p> +<p> +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +</p> + +<pre> +Yoyodyne, Inc., hereby disclaims all copyright +interest in the program `Gnomovision' +(which makes passes at compilers) written +by James Hacker. + +<var>signature of Ty Coon</var>, 1 April 1989 +Ty Coon, President of Vice +</pre> + +<p> +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. +</body></html> diff --git a/ide/config.nim b/ide/config.nim new file mode 100644 index 000000000..448a67bda --- /dev/null +++ b/ide/config.nim @@ -0,0 +1,93 @@ +# Does the config parsing for us + +import + parsecfg, strtabs, strutils + +type + TTokenClass* = enum + gtBackground, + gtNone, + gtWhitespace, + gtDecNumber, + gtBinNumber, + gtHexNumber, + gtOctNumber, + gtFloatNumber, + gtIdentifier, + gtKeyword, + gtStringLit, + gtLongStringLit, + gtCharLit, + gtEscapeSequence, + gtOperator, + gtPunctation, + gtComment, + gtLongComment, + gtRegularExpression, + gtTagStart, + gtTagEnd, + gtKey, + gtValue, + gtRawData, + gtAssembler, + gtPreprocessor, + gtDirective, + gtCommand, + gtRule, + gtHyperlink, + gtLabel, + gtReference, + gtOther, + gtCursor + + TColor* = colKeywords, colIdentifiers, colComments + TConfiguration* = object of TObject ## the configuration object + colors*: array [TTokenClass] of TColor ## the colors to use + filelist*: seq[string] ## the filelist + +const + colWhite = 0x00ffffff # rgb + colBlack = 0x00000000 + colYellow = + +proc readConfig(filename: string): TConfiguration = + # fill with reasonable defaults: + result.filelist = [] + result.colors[gtBackground] = colWhite + gtNone: + gtWhitespace, + gtDecNumber, + gtBinNumber, + gtHexNumber, + gtOctNumber, + gtFloatNumber, + gtIdentifier, + gtKeyword, + gtStringLit, + gtLongStringLit, + gtCharLit, + gtEscapeSequence, + gtOperator, + gtPunctation, + gtComment, + gtLongComment, + gtRegularExpression, + gtTagStart, + gtTagEnd, + gtKey, + gtValue, + gtRawData, + gtAssembler, + gtPreprocessor, + gtDirective, + gtCommand, + gtRule, + gtHyperlink, + gtLabel, + gtReference, + gtOther + gtCursor + var + p: TCfgParser + if open(p, filename): + diff --git a/ide/main.nim b/ide/main.nim index 22ab88d67..a7e9bb642 100644 --- a/ide/main.nim +++ b/ide/main.nim @@ -1,13 +1,13 @@ # The beginning of an IDE for Nimrod # (c) 2008 Andreas Rumpf -import glib2, gtk2, libglade2, dialogs, parseopt +import os, glib2, gtk2, libglade2, dialogs, parseopt proc on_window_destroy(obj: PGtkObject, data: pointer) {.cdecl.} = gtk_main_quit() const - GuiTemplate = "/media/hda4/nimrod/ide/nimide.glade" + GuiTemplate = "/media/hda1/Eigenes/nimrod/ide/nimide.glade" type TTab = object of TObject @@ -35,19 +35,19 @@ proc on_about_menu_item_activate(menuItem: PGtkMenuItem, proc load_file(e: var TMyTextEditor, filename: string) = var - err: ptr GError + err: pointer status: cstring text: cstring result: bool buffer: PGtkTextBuffer - gtk_statusbar_push(e.statusbar, e.statusbar_context_id, "Loading...") - while gtk_events_pending(): gtk_main_iteration() + discard gtk_statusbar_push(e.statusbar, e.statusbar_context_id, "Loading...") + while gtk_events_pending() != 0: discard gtk_main_iteration() # get the file contents result = g_file_get_contents(filename, addr(text), nil, addr(err)) if not result: - error_message("Cannot load file") - g_error_free(err) + error(e.window, "Cannot load file") + #g_error_free(err) # disable the text view while loading the buffer with the text gtk_widget_set_sensitive(e.text_view, false) @@ -103,7 +103,8 @@ proc check_for_save(e: var TMyTextEditor): bool = GtkWidget *dialog; const gchar *msg = "Do you want to save the changes you have made?"; dialog = gtk_message_dialog_new (nil, - GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_DIALOG_MODAL or + GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, msg); @@ -146,15 +147,13 @@ proc main() = var editor: TMyTextEditor - gtk_nimrod_init() initApp(editor) gtk_widget_show(editor.window) gtk_main() +gtk_nimrod_init() main() - - proc on_window_delete_event(widget: PGtkWidget, event: PGdkEvent, e: TMyTextEditor): bool {.cdecl.} = if check_for_save(editor): diff --git a/ide/nimide.glade b/ide/nimide.glade index 0bd5f11f1..ce24683b2 100644 --- a/ide/nimide.glade +++ b/ide/nimide.glade @@ -1,224 +1,192 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> - -<glade-interface> - -<widget class="GtkWindow" id="window"> - <property name="extension_events">GDK_EXTENSION_EVENTS_ALL</property> - <property name="title" translatable="yes"></property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">False</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - <property name="decorated">True</property> - <property name="skip_taskbar_hint">False</property> - <property name="skip_pager_hint">False</property> - <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property> - <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> - <property name="focus_on_map">True</property> - <property name="urgency_hint">False</property> - <signal name="destroy" handler="on_window_destroy" object="destroy"/> - - <child> - <widget class="GtkVBox" id="mainvbox"> - <property name="width_request">600</property> - <property name="height_request">400</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child> - <widget class="GtkMenuBar" id="menubar"> - <property name="visible">True</property> - <property name="pack_direction">GTK_PACK_DIRECTION_LTR</property> - <property name="child_pack_direction">GTK_PACK_DIRECTION_LTR</property> - - <child> - <widget class="GtkMenuItem" id="menuitem1"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Datei</property> - <property name="use_underline">True</property> - - <child> - <widget class="GtkMenu" id="menu1"> - <property name="visible">True</property> - - <child> - <widget class="GtkImageMenuItem" id="new_menu_item"> - <property name="visible">True</property> - <property name="label">gtk-new</property> - <property name="use_stock">True</property> - </widget> - </child> - - <child> - <widget class="GtkImageMenuItem" id="open_menu_item"> - <property name="visible">True</property> - <property name="label">gtk-open</property> - <property name="use_stock">True</property> - </widget> - </child> - - <child> - <widget class="GtkImageMenuItem" id="save_menu_item"> - <property name="visible">True</property> - <property name="label">gtk-save</property> - <property name="use_stock">True</property> - </widget> - </child> - - <child> - <widget class="GtkImageMenuItem" id="save_as_menu_item"> - <property name="visible">True</property> - <property name="label">gtk-save-as</property> - <property name="use_stock">True</property> - </widget> - </child> - - <child> - <widget class="GtkSeparatorMenuItem" id="separatormenuitem1"> - <property name="visible">True</property> - </widget> - </child> - - <child> - <widget class="GtkImageMenuItem" id="quit_menu_item"> - <property name="visible">True</property> - <property name="label">gtk-quit</property> - <property name="use_stock">True</property> - </widget> - </child> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem2"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Bearbeiten</property> - <property name="use_underline">True</property> - - <child> - <widget class="GtkMenu" id="menu2"> - <property name="visible">True</property> - - <child> - <widget class="GtkImageMenuItem" id="cut_menu_item"> - <property name="visible">True</property> - <property name="label">gtk-cut</property> - <property name="use_stock">True</property> - </widget> - </child> - - <child> - <widget class="GtkImageMenuItem" id="copy_menu_item"> - <property name="visible">True</property> - <property name="label">gtk-copy</property> - <property name="use_stock">True</property> - </widget> - </child> - - <child> - <widget class="GtkImageMenuItem" id="paste_menu_item"> - <property name="visible">True</property> - <property name="label">gtk-paste</property> - <property name="use_stock">True</property> - </widget> - </child> - - <child> - <widget class="GtkImageMenuItem" id="delete_menu_item"> - <property name="visible">True</property> - <property name="label">gtk-delete</property> - <property name="use_stock">True</property> - </widget> - </child> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem4"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Hilfe</property> - <property name="use_underline">True</property> - - <child> - <widget class="GtkMenu" id="menu3"> - <property name="visible">True</property> - - <child> - <widget class="GtkImageMenuItem" id="about_menu_item"> - <property name="visible">True</property> - <property name="label">gtk-about</property> - <property name="use_stock">True</property> - </widget> - </child> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkScrolledWindow" id="scrolledwindow"> - <property name="border_width">1</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property> - <property name="window_placement">GTK_CORNER_TOP_LEFT</property> - - <child> - <widget class="GtkTextView" id="textview"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="overwrite">False</property> - <property name="accepts_tab">True</property> - <property name="justification">GTK_JUSTIFY_LEFT</property> - <property name="wrap_mode">GTK_WRAP_NONE</property> - <property name="cursor_visible">True</property> - <property name="pixels_above_lines">0</property> - <property name="pixels_below_lines">0</property> - <property name="pixels_inside_wrap">0</property> - <property name="left_margin">2</property> - <property name="right_margin">2</property> - <property name="indent">0</property> - <property name="text" translatable="yes"></property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkStatusbar" id="statusbar"> - <property name="visible">True</property> - <property name="has_resize_grip">True</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> -</widget> - -</glade-interface> +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd"> +<!--*- mode: xml -*--> +<glade-interface> + <widget class="GtkWindow" id="window"> + <property name="extension_events">GDK_EXTENSION_EVENTS_ALL</property> + <signal name="destroy" handler="on_window_destroy" object="destroy"/> + <child> + <widget class="GtkVBox" id="mainvbox"> + <property name="width_request">600</property> + <property name="height_request">400</property> + <property name="visible">True</property> + <child> + <widget class="GtkMenuBar" id="menubar"> + <property name="visible">True</property> + <child> + <widget class="GtkMenuItem" id="menuitem1"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Datei</property> + <property name="use_underline">True</property> + <child> + <widget class="GtkMenu" id="menu1"> + <property name="visible">True</property> + <child> + <widget class="GtkImageMenuItem" id="new_menu_item"> + <property name="visible">True</property> + <property name="label">gtk-new</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="open_menu_item"> + <property name="visible">True</property> + <property name="label">gtk-open</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="save_menu_item"> + <property name="visible">True</property> + <property name="label">gtk-save</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="save_as_menu_item"> + <property name="visible">True</property> + <property name="label">gtk-save-as</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + <child> + <widget class="GtkSeparatorMenuItem" id="separatormenuitem1"> + <property name="visible">True</property> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="quit_menu_item"> + <property name="visible">True</property> + <property name="label">gtk-quit</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + </widget> + </child> + </widget> + </child> + <child> + <widget class="GtkMenuItem" id="menuitem2"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Bearbeiten</property> + <property name="use_underline">True</property> + <child> + <widget class="GtkMenu" id="menu2"> + <property name="visible">True</property> + <child> + <widget class="GtkImageMenuItem" id="cut_menu_item"> + <property name="visible">True</property> + <property name="label">gtk-cut</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="copy_menu_item"> + <property name="visible">True</property> + <property name="label">gtk-copy</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="paste_menu_item"> + <property name="visible">True</property> + <property name="label">gtk-paste</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="delete_menu_item"> + <property name="visible">True</property> + <property name="label">gtk-delete</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + </widget> + </child> + </widget> + </child> + <child> + <widget class="GtkMenuItem" id="menuitem4"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Hilfe</property> + <property name="use_underline">True</property> + <child> + <widget class="GtkMenu" id="menu3"> + <property name="visible">True</property> + <child> + <widget class="GtkImageMenuItem" id="about_menu_item"> + <property name="visible">True</property> + <property name="label">gtk-about</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + </widget> + </child> + </widget> + </child> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkNotebook" id="notebook"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tab_hborder">10</property> + <property name="tab_vborder">0</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + <packing> + <property name="type">tab</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + <packing> + <property name="type">tab</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + <packing> + <property name="type">tab</property> + </packing> + </child> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkStatusbar" id="statusbar"> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">2</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> diff --git a/ide/nimide.nim b/ide/nimide.nim new file mode 100644 index 000000000..c5abc3bbf --- /dev/null +++ b/ide/nimide.nim @@ -0,0 +1,118 @@ +# The beginning of an IDE for Nimrod +# (c) 2008 Andreas Rumpf + +import os, glib2, gdk2, gtk2, libglade2, pango, dialogs, parseopt + +const + GuiTemplate = "nimide.glade" + dummyConst = "" + +type + TTab {.pure, final.} = object + textview: PGtkTextView + filename: string + untitled: bool + hbox: PGtkHBox + e: PEditor + PTab = ptr TTab + + TEditor = object of TObject + window: PGtkWindow + statusbar: PGtkStatusBar + menu: PGtkMenuBar + notebook: PGtkNotebook + tabname: int # used for generating tab names + PEditor = ptr TEditor + +proc on_window_destroy(obj: PGtkObject, event: PGdkEvent, + data: pointer): gboolean {.cdecl.} = + gtk_main_quit() + +proc on_about_menu_item_activate(menuItem: PGtkMenuItem, e: PEditor) {.cdecl.} = + gtk_show_about_dialog(e.window, + "comments", "A fast and leight-weight IDE for Nimrod", + "copyright", "Copyright \xc2\xa9 2008 Andreas Rumpf", + "version", "0.1", + "website", "http://nimrod.ethexor.com", + "program-name", "Nimrod IDE", + nil) + +proc getTabIndex(e: PEditor, tab: PTab): int = + var i = 0 + while true: + var w = gtk_notebook_get_nth_page(e.notebook, i) + if w == nil: return -1 + var v = gtk_notebook_get_tab_label(e.notebook, w) + if tab.hbox == v: return i + inc(i) + +proc OnCloseTab(button: PGtkButton, tab: PTab) {.cdecl.} = + var idx = getTabIndex(tab.e, tab) + if idx >= 0: gtk_notebook_remove_page(tab.e.notebook, idx) + +proc createTab(e: PEditor, filename: string, untitled: bool) = + var t = cast[PTab](alloc0(sizeof(TTab))) + t.textview = gtk_text_view_new_with_buffer(gtk_text_buffer_new(nil)) + var font_desc = pango_font_description_from_string("monospace 10") + gtk_widget_modify_font(t.textview, font_desc) + pango_font_description_free(font_desc) + t.filename = filename + t.untitled = untitled + gtk_widget_show(t.textview) + var scroll = gtk_scrolled_window_new(nil, nil) + gtk_container_add(scroll, t.textview) + gtk_widget_show(scroll) + + t.e = e + t.hbox = gtk_hbox_new(false, 0) + var image = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU) + var button = gtk_button_new() + var lab = gtk_label_new(filename) + gtk_button_set_image(button, image) + gtk_button_set_relief(button, GTK_RELIEF_NONE) + gtk_box_pack_start(t.hbox, lab, false, false, 2) + gtk_box_pack_end(t.hbox, button, false, false, 0) + + discard g_signal_connect(button, "clicked", G_Callback(onCloseTab), t) + gtk_widget_show(button) + gtk_widget_show(lab) + + var idx = gtk_notebook_append_page(e.notebook, scroll, t.hbox) + gtk_notebook_set_current_page(e.notebook, idx) + +proc on_new_menu_item_activate(menuItem: PGtkMenuItem, e: PEditor) {.cdecl.} = + inc(e.tabname) + createTab(e, "untitled-" & $e.tabname, true) + +proc main(e: PEditor) = + var builder = glade_xml_new(getApplicationDir() / GuiTemplate, nil, nil) + if builder == nil: quit("cannot open: " & GuiTemplate) + # get the components: + e.window = GTK_WINDOW(glade_xml_get_widget(builder, "window")) + e.statusbar = GTK_STATUSBAR(glade_xml_get_widget(builder, "statusbar")) + e.notebook = GTK_NOTEBOOK(glade_xml_get_widget(builder, "notebook")) + setHomogeneous(e.notebook^, 1) + + # connect the signal handlers: + glade_xml_signal_connect(builder, "on_window_destroy", + GCallback(on_window_destroy)) + var about = GTK_MENU_ITEM(glade_xml_get_widget(builder, "about_menu_item")) + discard g_signal_connect(about, "activate", + G_CALLBACK(on_about_menu_item_activate), e) + + var newItem = GTK_MENU_ITEM(glade_xml_get_widget(builder, "new_menu_item")) + discard g_signal_connect(newItem, "activate", + G_CALLBACK(on_new_menu_item_activate), e) + + var quitItem = GTK_MENU_ITEM(glade_xml_get_widget(builder, "quit_menu_item")) + discard g_signal_connect(quitItem, "activate", + G_CALLBACK(on_window_destroy), e) + + gtk_window_set_default_icon_name(GTK_STOCK_EDIT) + gtk_widget_show(e.window) + gtk_main() + + +gtk_nimrod_init() +var e = cast[PEditor](alloc0(sizeof(TEditor))) +main(e) diff --git a/install.sh b/install.sh new file mode 100644 index 000000000..eb592da84 --- /dev/null +++ b/install.sh @@ -0,0 +1,126 @@ +#! /bin/sh +# +# Nimrod installation script +# (c) 2008 Andreas Rumpf +# + +if [ $# -eq 1 ] ; then + + if test -f bin/nimrod + then + echo "Nimrod already built -- skipping this phase" + else + echo "building Nimrod..." + sh ./build.sh || exit 1 + echo "...done" + fi + + case $1 in + "/usr/bin") + configdir=/etc + libdir=/usr/lib/nimrod + mkdir -p /usr/lib/nimrod + mkdir -p /usr/share/nimrod/doc + + cp bin/nimrod /usr/bin/nimrod + cp config/nimdoc.cfg /etc/nimdoc.cfg + cp -r -p lib /usr/lib/nimrod + cp -r -p doc /usr/share/nimrod/doc + ;; + "/usr/local/bin") + configdir=/etc + libdir=/usr/local/lib/nimrod + mkdir -p /usr/local/lib/nimrod + mkdir -p /usr/local/share/nimrod/doc + + cp bin/nimrod /usr/local/bin/nimrod + cp config/nimdoc.cfg /etc/nimdoc.cfg + cp -r -p lib /usr/local/lib/nimrod + cp -r -p doc /usr/local/share/nimrod/doc + ;; + *) + configdir="$1/nimrod/config" + libdir="$1/nimrod/lib" + mkdir -p $1/nimrod + mkdir -p $1/nimrod/bin + mkdir -p $1/nimrod/config + mkdir -p $1/nimrod/lib + mkdir -p $1/nimrod/doc + + cp bin/nimrod $1/nimrod/bin/nimrod + cp config/nimdoc.cfg $1/nimrod/config/nimdoc.cfg + cp -r -p lib $1/nimrod + cp -r -p doc $1/nimrod + ;; + esac + # write the configuration file + cat >$configdir/nimrod.cfg <<EOF +# Configuration file for the Nimrod Compiler. +# Feel free to edit the default values as you need. + +cc = gcc +lib=$libdir +path="\$lib/base" +path="\$lib/base/gtk" +path="\$lib/base/cairo" +path="\$lib/base/x11" +path="\$lib/base/sdl" +path="\$lib/base/opengl" +path="\$lib/base/zip" +path="\$lib/windows" +path="\$lib/posix" +path="\$lib/ecmas" +path="\$lib/extra" + +@if release: + obj_checks:off + field_checks:off + range_checks:off + bound_checks:off + overflow_checks:off + assertions:off + + stacktrace:off + debugger:off + line_dir:off + opt:speed +@end + +# additional options always passed to the compiler: +--verbosity: "1" +hint[LineTooLong]=off + +@if unix and not bsd: + passl= "-ldl" +@end + +@if icc: + passl = "-cxxlib" + passc = "-cxxlib" +@end + +# Configuration for the GNU C/C++ compiler: +#gcc.exe = "gcc-4.3" +#gcc.linkerExe = "gcc-4.3" +gcc.options.debug = "-g" +@if macosx: + gcc.options.always = "-w -fasm-blocks" +@else: + gcc.options.always = "-w" +@end +gcc.options.speed = "-O3 -fno-strict-aliasing" +gcc.options.size = "-Os" +EOF + echo "installation successful" +else + echo "Nimrod installation script" + echo "Usage: [sudo] sh install.h DIR" + echo "Where DIR may be:" + echo " /usr/bin" + echo " /usr/local/bin" + echo " /opt" + echo " <some other dir> (treated like '/opt')" + echo "To deinstall, use the command:" + echo "sh deinstall.sh DIR" + exit 1 +fi diff --git a/install.txt b/install.txt index 60d52e228..c6059882a 100644 --- a/install.txt +++ b/install.txt @@ -61,5 +61,6 @@ Currently, the following C compilers are supported under Windows: - | Digital Mars C++ | http://www.digitalmars.com/download/freecompiler.html -For faster compile times I recommend Digital Mars C++ -- it is easy to install +For better compile times I recommend Digital Mars C++ -- it is easy to install and a small package. + diff --git a/koch.py b/koch.py index d8d42a02b..1f5ae0d2c 100644 --- a/koch.py +++ b/koch.py @@ -18,7 +18,7 @@ False = 0 == 1 # --------------------- constants ---------------------------------------- -NIMROD_VERSION = '0.7.0' +NIMROD_VERSION = '0.7.2' # This string contains Nimrod's version. It is the only place # where the version needs to be updated. The rest is done by # the build process automatically. It is replaced **everywhere** @@ -405,8 +405,10 @@ Possible Commands: clean cleans Nimrod project; removes generated files boot [options] bootstraps with given command line options rodsrc generates Nimrod version from Pascal version - web generates the website (requires Cheetah) + web generates the website profile profile the Nimrod compiler + zip build the installation ZIP package + inno build the Inno Setup installer """ % (NIMROD_VERSION + ' ' * (44-len(NIMROD_VERSION)), sys.version) def main(args): @@ -440,8 +442,20 @@ def main(args): elif cmd == "rodsrc": cmd_rodsrc() elif cmd == "web": cmd_web() elif cmd == "profile": cmd_profile() + elif cmd == "zip": cmd_zip() + elif cmd == "inno": cmd_inno() else: Error("illegal command: " + cmd) +def cmd_zip(): + Exec("nimrod cc -r tools/niminst --var:version=%s csource rod/nimrod" % + NIMROD_VERSION) + Exec("nimrod cc -r tools/niminst --var:version=%s zip rod/nimrod" % + NIMROD_VERSION) + +def cmd_inno(): + Exec("nimrod cc -r tools/niminst --var:version=%s inno rod/nimrod" % + NIMROD_VERSION) + # -------------------------- bootstrap ---------------------------------------- def readCFiles(): @@ -678,6 +692,8 @@ def getOSandProcessor(): else: processor = os.uname()[4] if lower(processor) in ("i686", "i586", "i468", "i386"): processor = "i386" + if lower(processor) in ("x86_64", "x86-64", "amd64"): + processor = "amd64" if find(lower(processor), "sparc") >= 0: processor = "sparc" return (host, processor) diff --git a/lib/alloc.nim b/lib/alloc.nim new file mode 100644 index 000000000..504453699 --- /dev/null +++ b/lib/alloc.nim @@ -0,0 +1,394 @@ +# +# +# Nimrod's Runtime Library +# (c) Copyright 2008 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +# Low level allocator for Nimrod. + +# ------------ platform specific chunk allocation code ----------------------- + +when defined(posix): + const # XXX: make these variables for portability? + PROT_READ = 1 # page can be read + PROT_WRITE = 2 # page can be written + PROT_EXEC = 4 # page can be executed + PROT_NONE = 0 # page can not be accessed + + MAP_SHARED = 1 # Share changes + MAP_PRIVATE = 2 # Changes are private + MAP_TYPE = 0xf # Mask for type of mapping + MAP_FIXED = 0x10 # Interpret addr exactly + MAP_ANONYMOUS = 0x20 # don't use a file + + MAP_GROWSDOWN = 0x100 # stack-like segment + MAP_DENYWRITE = 0x800 # ETXTBSY + MAP_EXECUTABLE = 0x1000 # mark it as an executable + MAP_LOCKED = 0x2000 # pages are locked + MAP_NORESERVE = 0x4000 # don't check for reservations + + proc mmap(adr: pointer, len: int, prot, flags, fildes: cint, + off: int): pointer {.header: "<sys/mman.h>".} + + proc munmap(adr: pointer, len: int) {.header: "<sys/mman.h>".} + + proc osAllocPages(size: int): pointer {.inline.} = + result = mmap(nil, size, PROT_READ or PROT_WRITE, + MAP_PRIVATE or MAP_ANONYMOUS, -1, 0) + if result == nil or result == cast[pointer](-1): + raiseOutOfMem() + + proc osDeallocPages(p: pointer, size: int) {.inline} = + munmap(p, len) + +elif defined(windows): + const + MEM_RESERVE = 0x2000 + MEM_COMMIT = 0x1000 + MEM_TOP_DOWN = 0x100000 + PAGE_READWRITE = 0x04 + + proc VirtualAlloc(lpAddress: pointer, dwSize: int, flAllocationType, + flProtect: int32): pointer {. + header: "<windows.h>", stdcall.} + + proc osAllocPages(size: int): pointer {.inline.} = + result = VirtualAlloc(nil, size, MEM_RESERVE or MEM_COMMIT, + PAGE_READWRITE) + if result == nil: raiseOutOfMem() + + proc osDeallocPages(p: pointer, size: int) {.inline.} = + nil + +else: + {.error: "Port GC to your platform".} + +# --------------------- end of non-portable code ----------------------------- + +# We manage *chunks* of memory. Each chunk is a multiple of the page size. +# The page size may or may not the operating system's page size. Each chunk +# starts at an address that is divisible by the page size. Chunks that are +# bigger than ``ChunkOsReturn`` are returned back to the operating system +# immediately. + + +# Guess the page size of the system; if it is the +# wrong value, performance may be worse (this is not +# for sure though), but GC still works; must be a power of two! +const + PageShift = if sizeof(pointer) == 4: 12 else: 13 + PageSize = 1 shl PageShift # on 32 bit systems 4096 + + MemAlignment = sizeof(pointer)*2 # minimal memory block that can be allocated + BitsPerUnit = sizeof(int)*8 + # a "unit" is a word, i.e. 4 bytes + # on a 32 bit system; I do not use the term "word" because under 32-bit + # Windows it is sometimes only 16 bits + + BitsPerPage = PageSize div MemAlignment + UnitsPerPage = BitsPerPage div BitsPerUnit + # how many units do we need to describe a page: + # on 32 bit systems this is only 16 (!) + + smallRequest = PageSize div 4 + ChunkOsReturn = 1024 # in pages + InitialMemoryRequest = ChunkOsReturn div 2 # < ChunkOsReturn! + debugMemMan = true # we wish to debug the memory manager... + +type + PChunkDesc = ptr TChunkDesc + TChunkDesc {.final, pure.} = object + key: TAddress # address at bit 0 + next: PChunkDesc + bits: array[0..127, int] # a bit vector + + PChunkDescArray = ptr array[0..1000_000, PChunkDesc] + TChunkSet {.final, pure.} = object + counter, max: int + head: PChunkDesc + data: PChunkDescArray + +when sizeof(int) == 4: + type THalfWord = int16 +else: + type THalfWord = int32 + +type + TFreeCell {.final, pure.} = object + zeroField: pointer # type info nil means cell is not used + next: ptr TFreeCell # next free cell in chunk + + PChunk = ptr TChunk + TChunk {.final, pure.} = object + size: int # lowest two bits are used for merging: + # bit 0: chunk to the left is accessible and free + # bit 1: chunk to the right is accessible and free + len: int # for small object allocation + prev, next: PChunk # chunks of the same (or bigger) size + #len, used: THalfWord # index of next to allocate cell + freeList: ptr TFreeCell + data: float # a float for alignment purposes + +proc roundup(x, v: int): int {.inline.} = return ((-x) and (v-1)) +% x + +assert(roundup(14, PageSize) == PageSize) +assert(roundup(15, 8) == 16) + +# ------------- chunk table --------------------------------------------------- +# We use a PtrSet of chunk starts and a table[Page, chunksize] for chunk +# endings of big chunks. This is needed by the merging operation. The only +# remaining operation is best-fit for big chunks. Since there is a size-limit +# for big chunks (because greater than the limit means they are returned back +# to the OS), a fixed size array can be used. + +type + PLLChunk = ptr TLLChunk + TLLChunk {.pure.} = object ## *low-level* chunk + size: int + when sizeof(int) == 4: + align: int + + TAllocator {.final, pure.} = object + llmem: PLLChunk + UsedPagesCount, FreePagesCount, maxPagesCount: int + freeSmallChunks: array[0..smallRequest div MemAlign-1, PChunk] + freeBigChunks: array[0..ChunkOsReturn-1, PChunk] + + +proc llAlloc(a: var TAllocator, size: int): pointer = + # *low-level* alloc for the memory managers data structures. Deallocation + # is never done. + assert(size <= PageSize-8) + if a.llmem.size + size > PageSize: + a.llmem = osGetPages(PageSize) + inc(a.gUsedPages) + a.llmem.size = 8 + result = cast[pointer](cast[TAddress](a.llmem) + a.llmem.size) + inc(llmem.size, size) + zeroMem(result, size) + + +const + InitChunkSetSize = 1024 # must be a power of two! + +proc ChunkSetInit(s: var TChunkSet) = + s.data = cast[PChunkDescArray](llAlloc(InitChunkSetSize * sizeof(PChunkDesc))) + s.max = InitChunkSetSize-1 + s.counter = 0 + s.head = nil + +proc ChunkSetGet(t: TChunkSet, key: TAddress): PChunkDesc = + var h = cast[int](key) and t.max + while t.data[h] != nil: + if t.data[h].key == key: return t.data[h] + h = nextTry(h, t.max) + return nil + +proc ChunkSetRawInsert(t: TChunkSet, data: PChunkDescArray, + desc: PChunkDesc) = + var h = cast[int](desc.key) and t.max + while data[h] != nil: + assert(data[h] != desc) + h = nextTry(h, t.max) + assert(data[h] == nil) + data[h] = desc + +proc ChunkSetEnlarge(t: var TChunkSet) = + var oldMax = t.max + t.max = ((t.max+1)*2)-1 + var n = cast[PChunkDescArray](llAlloc((t.max + 1) * sizeof(PChunkDescArray))) + for i in 0 .. oldmax: + if t.data[i] != nil: + ChunkSetRawInsert(t, n, t.data[i]) + tlsf_free(t.data) + t.data = n + +proc ChunkSetPut(t: var TChunkSet, key: TAddress): PChunkDesc = + var h = cast[int](key) and t.max + while true: + var x = t.data[h] + if x == nil: break + if x.key == key: return x + h = nextTry(h, t.max) + + if ((t.max+1)*2 < t.counter*3) or ((t.max+1)-t.counter < 4): + ChunkSetEnlarge(t) + inc(t.counter) + h = cast[int](key) and t.max + while t.data[h] != nil: h = nextTry(h, t.max) + assert(t.data[h] == nil) + # the new page descriptor goes into result + result = cast[PChunkDesc](llAlloc(sizeof(TChunkDesc))) + result.next = t.head + result.key = key + t.head = result + t.data[h] = result + +# ---------- slightly higher level procs -------------------------------------- + +proc in_Operator(s: TChunkSet, cell: PChunk): bool = + var u = cast[TAddress](cell) + var t = ChunkSetGet(s, u shr PageShift) + if t != nil: + u = (u %% PageSize) /% MemAlignment + result = (t.bits[u /% BitsPerUnit] and (1 shl (u %% BitsPerUnit))) != 0 + else: + result = false + +proc incl(s: var TCellSet, cell: PCell) = + var u = cast[TAddress](cell) + var t = ChunkSetPut(s, u shr PageShift) + u = (u %% PageSize) /% MemAlignment + t.bits[u /% BitsPerUnit] = t.bits[u /% BitsPerUnit] or + (1 shl (u %% BitsPerUnit)) + +proc excl(s: var TCellSet, cell: PCell) = + var u = cast[TAddress](cell) + var t = ChunkSetGet(s, u shr PageShift) + if t != nil: + u = (u %% PageSize) /% MemAlignment + t.bits[u /% BitsPerUnit] = (t.bits[u /% BitsPerUnit] and + not (1 shl (u %% BitsPerUnit))) + +iterator elements(t: TChunkSet): PChunk {.inline.} = + # while traversing it is forbidden to add pointers to the tree! + var r = t.head + while r != nil: + var i = 0 + while i <= high(r.bits): + var w = r.bits[i] # taking a copy of r.bits[i] here is correct, because + # modifying operations are not allowed during traversation + var j = 0 + while w != 0: # test all remaining bits for zero + if (w and 1) != 0: # the bit is set! + yield cast[PCell]((r.key shl PageShift) or # +% + (i*%BitsPerUnit+%j) *% MemAlignment) + inc(j) + w = w shr 1 + inc(i) + r = r.next + + +# ------------- chunk management ---------------------------------------------- +proc removeChunk(a: var TAllocator, c: PChunk) {.inline.} = + if c.prev != nil: c.prev.next = c.next + if c.next != nil: c.next.prev = c.prev + if a.freeChunks[c.size div PageSize] == c: + a.freeChunks[c.size div PageSize] = c.next + +proc addChunk(a: var TAllocator, c: PChunk) {.inline.} = + var s = abs(c.size) div PageSize + c.prev = nil + c.next = a.freeChunks[s] + a.freeChunks[s] = c + +proc freeChunk(a: var TAllocator, c: PChunk) = + assert(c.size > 0) + if c.size < PageSize: c.size = PageSize + var le = cast[PChunk](cast[TAddress](p) and not PageMask -% PageSize) + var ri = cast[PChunk](cast[TAddress](p) and not PageMask +% + c.size +% PageSize) + if isStartOfAChunk(ri) and ri.size < 0: + removeChunk(a, ri) + inc(c.size, -ri.size) + if isEndOfAChunk(le): + le = cast[PChunk](cast[TAddress](p) and not PageMask -% + le.chunkStart+PageSize) + if le.size < 0: + removeChunk(a, le) + inc(le.size, c.size) + addChunk(a, le) + return + c.size = -c.size + addChunk(a, c) + +proc splitChunk(a: var TAllocator, c: PChunk, size: int) = + var rest = cast[PChunk](cast[TAddress](p) + size) + rest.size = size - c.size # results in negative number, because rest is free + addChunk(a, rest) + # mark pages as accessible: + ChunkTablePut(a, rest, bitAccessible) + c.size = size + +proc getChunkOfSize(a: var TAllocator, size: int): PChunk = + for i in size..high(a.freeChunks): + result = a.freeChunks[i] + if result != nil: + if i != size: splitChunk(a, result, size) + else: removeChunk(a, result) + result.prev = nil + result.next = nil + break + +# ----------------------------------------------------------------------------- + +proc getChunk(p: pointer): PChunk {.inline.} = + result = cast[PChunk](cast[TAddress](p) and not PageMask) + +proc getCellSize(p: pointer): int {.inline.} = + var c = getChunk(p) + result = abs(c.size) + +proc alloc(a: var TAllocator, size: int): pointer = + if size <= smallRequest: + # allocate a small block + var s = size div MemAlign + var c = a.freeSmallChunks[s] + if c == nil: + c = getChunkOfSize(0) + c.freeList = nil + c.size = size + a.freeSmallChunks[s] = c + c.len = 1 + c.used = 1 + c.chunkStart = 0 + result = addr(c.data[0]) + elif c.freeList != nil: + result = c.freeList + assert(c.freeList.zeroField == nil) + c.freeList = c.freeList.next + inc(c.used) + if c.freeList == nil: removeChunk(a, c) + else: + assert(c.len*size <= high(c.data)) + result = addr(c.data[c.len*size]) + inc(c.len) + inc(c.used) + if c.len*size > high(c.data): removeChunk(a, c) + else: + # allocate a large block + var c = getChunkOfSize(size shr PageShift) + result = addr(c.data[0]) + c.freeList = nil + c.size = size + c.len = 0 + c.used = 0 + c.chunkStart = 0 + +proc dealloc(a: var TAllocator, p: pointer) = + var c = getChunk(p) + if c.size <= smallRequest: + # free small block: + var f = cast[ptr TFreeCell](p) + f.zeroField = nil + f.next = c.freeList + c.freeList = p + dec(c.used) + if c.used == 0: freeChunk(c) + else: + # free big chunk + freeChunk(c) + +proc realloc(a: var TAllocator, p: pointer, size: int): pointer = + # could be made faster, but this is unnecessary, the GC does not use it anyway + result = alloc(a, size) + copyMem(result, p, getCellSize(p)) + dealloc(a, p) + +proc isAllocatedPtr(a: TAllocator, p: pointer): bool = + var c = getChunk(p) + if c in a.accessibleChunks and c.size > 0: + result = cast[ptr TFreeCell](p).zeroField != nil diff --git a/lib/arithm.nim b/lib/arithm.nim index 91a2232c9..5c8b5726c 100644 --- a/lib/arithm.nim +++ b/lib/arithm.nim @@ -14,7 +14,7 @@ proc raiseOverflow {.compilerproc, noinline.} = # a single proc to reduce code size to a minimum raise newException(EOverflow, "over- or underflow") -proc raiseDivByZero {.exportc: "raiseDivByZero", noinline.} = +proc raiseDivByZero {.compilerproc, noinline.} = raise newException(EDivByZero, "divison by zero") proc addInt64(a, b: int64): int64 {.compilerProc, inline.} = diff --git a/lib/atomic.h b/lib/atomic.h new file mode 100644 index 000000000..afab4843f --- /dev/null +++ b/lib/atomic.h @@ -0,0 +1,2716 @@ +/* Atomic operations for Nimrod */ + +#if defined(_MSCVER) +__declspec(naked) int __fastcall Xadd (volatile int* pNum, int val) +{ + __asm + { + lock xadd dword ptr [ECX], EDX + mov EAX, EDX + ret + } +} + + + +#endif + + +#define ATOMIC_ASM(type,op) \ + __asm __volatile ("lock; " op : "=m" (*(type *)p) : "ir" (v), "0" (*(type *)p)) + +#define ATOMIC_ASM_NOLOCK(type,op) \ + __asm __volatile (op : "=m" (*(type *)p) : "ir" (v), "0" (*(type *)p)) + +static __inline void +atomic_add_int(void *p, u_int v) +{ + ATOMIC_ASM(int, "addl %1,%0"); +} + +static __inline void +atomic_add_int_nolock(void *p, u_int v) +{ + ATOMIC_ASM_NOLOCK(int, "addl %1,%0"); +} + + + +/* +Atomic.h + +Joshua Scholar +May 26, 2003 + +This header contains: + +a multiprocessor nonblocking FIFO, + +a multiprocessor nonblocking LIFO + +multiprocessor nonblocking reference counting (including volatile pointers +that can be safely shared between processors) + +nonblocking memory allocation routines + +template types that encapsulate variables meant to be shared between +processors - all changes to these variables are atomic and globally visible + +All kinds of atomic operations that are useful in a multiprocessor context. + +The philosophy behind this code is that I created templates that encapsulate +atomic access so that while the templates themselves may not be the easiest +code to read, code that uses these templates can be simple, abstract and +reliable. + +I also created regular C style functions, overloaded by type for some of +the more basic operations. If you have regular variables or memory +locations that you want to use in a globally visible way you have two +choices. + +If the operation you want is one of the basic building blocks you can +call one of the overloaded functions like InterlockedSetIfEqual(). + +Otherwise it's perfectly safe to cast a pointer to your data to be a pointer +to one of the atomic types so that you can use their methods. For instance: +if (((AtomicInt *)foo)->CompareSomeBitsAndExchangeSomeOtherBits(exchange, + bitsToExchange, + comperand, + bitsToCompare)) + ... +or even + +//atomically allocate n bytes out of the pool + data = ((*(AtomicPtr<char> *)curPool)+= n) - n; + + + +State of code: + +Unlike other libraries of similar routines that I wrote in the past, this +has not been thoroughly tested. In fact I don't remember how much of it has +been tested at this point. + +It would take an 8 way machine for me to really pound on the routines. + + + +Overview + +Some basic types are: +typedef Atomic<int> AtomicInt; +typedef Atomic<unsigned int> AtomicUInt; +typedef Atomic<__int64> AtomicInt64; +typedef Atomic<unsigned __int64> AtomicUInt64; + +Fancier types include +template <typename T> struct AtomicPtr; +This is a pointer that has the same semantics as the above integer types + +template <typename T>struct AtomicPtrWithCount; + +AtomicPtrWithCount<T> is a very important type. It has 32 bits of pointer +and 32 bits of counter. There are a number of algorithms that are possible +when a pointer and a counter can be changed atomically together including a +lock free pushdown stack and reference counted garbage collection where +multiple processors can share pointers as well as sharing the data that's +pointed at. + +template <typename T> struct AtomicPtrWithMark; + +This is similar to AtomicPtrWithCount<T> but the extra 32 bits are accessed +as individual bits instead of being accessed as a counter. It's not as +important. I was playing with algorithms before I realized that the +important ones I was afraid of using had been published independently of my +former employer. + + + +The atomic number types act as integer variables, but all changes to these +variable happen through interlocked atomic instructions. +All changes are therefor "globally visible" in Intel's parlance. + +Note that incrementing (or decrementing or adding to) one of these uses +InterlockedExchangeAdd, which for 64 bit numbers ends up relying on "lock +CMPXCHG8B" + +There's an Exchange method. + +There are also special methods that use compare exchange in some forms that +I've found useful: + +T CompareExchange(T exchange, T comperand) +bool SetIfEqual(T exchange, T comperand) + +and fancier ones I found some uses for + + inline bool SetIfSomeBitsAreEqual(T exchange, T comperand, T bitsToCompare) + inline bool SetSomeBitsIfThoseBitsAreEqual(T exchange, + T comperand, + T bitsToCompare) + inline bool SetSomeBitsIfSomeOtherBitsAreEqual(T exchange, + T bitsToExchange, + T comperand, + T bitsToCompare + ) + + inline T CompareSomeBitsAndExchange(T exchange, + T comperand, + T bitsToCompare) + inline T CompareSomeBitsAndExchangeThoseBits(T exchange, + T comperand, + T bitsToCompare) + inline T CompareSomeBitsAndExchangeSomeOtherBits(T exchange, + T bitsToExchange, + T comperand, + T bitsToCompare + ) + +There are also atomic bit test, bit test and set etc. methods: + + inline bool BTS(int bit) + inline bool BTC(int bit) + inline bool BTR(int bit) + inline bool BT(int bit) + +ALGORITHMS and their classes: + +The important ones are: + +struct Counted +Use this as the base type for any object you want to be reference counted + +template <typename T> class CountedPtr; +Safely acts as pointer to a reference counted type. This pointer can not be +shared between threads safely. + +template <typename T> class AtomicCountedPtr; +Like CountedPtr<T> but this pointer CAN be shared between threads/processors +safely. + +template <typename T> class MPQueue; +Multiprocessor queue. This is the nonblocking shared FIFO. + +Note, for the sake of convenience there is a Fifo that has the same +semantics but can only be used single threaded: +template <typename T> class Queue ; + +class MPCountStack; +This is the multiprocessor nonblocking LIFO stack. Note that what gets +pushed on the stack are pointers to MPStackElement. Your data must be +objects derived from MPStackElements. Note that it is not legal to push a +NULL onto the stack - NULL is used to signal an empty stack. + +Note that for the sake of convienience there is, once again, a single +threaded version of the stack: +class SimpleStack. + +There are also classes for allocators that use the MPCountStack as a +freelist. +template <typename T, typename BLOCK_ALLOCATOR> +struct MPCountFreeListAllocator; + +This template is recursive in the sense that each allocator gets new blocks +from a shared allocatorn passed in the constructor (of type +BLOCK_ALLOCATOR). You can build a tree of allocators this way. The root of +the tree should be of type SimpleAllocator<T> which just calls new and +delete. + +Once again, for the sake of simplicity, there is a single threaded version +of the block allocator called +template <typename T, typename BLOCK_ALLOCATOR> struct SimpleBlockAllocator + +*/ +#ifndef ATOMIC_H +#define ATOMIC_H +#include <windows.h> +#include <assert.h> +#include <new> +using namespace std; +/* + windows defines the following interlocked routines + we need to define the equivalent for volatiles (which + they should have been in the first place, and the following + types voltatile long, volatile int, volatile unsigned long, + volatile unsigned int, volatile T*, volatile __int64, + volatile unsigned __int64. + + Note: I use the platform SDK which has different header files + for interlocked instructions than the Windows includes in Visual + C + + If you have the platform SDK and the code doesn't compile then + you need to make sure that + "C:\Program Files\Microsoft Platform SDK\include" + is the first directory listed under menus "Tools" -> menu item + "Options" -> tab "Directories" (of course if you installed the + platform SDK in a different directory than + "C:\Program Files\Microsoft Platform SDK" then you should use + YOUR path. + + If you don't have the plaform SDK then InterlockedCompareExchange + is defined for void * instead of being defined for longs... and + there is no InterlockedCompareExchangePointer + + The whole point of Microsoft having different headers was an update + to support 64 bit platforms which doesn't matter here at all (some + of the code here relies on CMPXCHG8B swaping out both a pointer AND + a counter - a trick that won't work on the current 64 bit platforms). + + In any case, if you don't have the platform SDK then just + appropriate casts to make the code compile. Keep in mind that + casting from 64 bit types to 32 bit types is wrong - where there's + a 64 bit type I meant it to call one of my assembly language + routines that uses CMPXCHG8B. + + LONG + InterlockedIncrement( + LPLONG lpAddend + ); + + LONG + InterlockedDecrement( + LPLONG lpAddend + ); + + LONG + InterlockedExchange( + LPLONG Target, + LONG Value + ); + + LONG + InterlockedExchangeAdd( + LPLONG Addend, + LONG Value + ); + + LONG + InterlockedCompareExchange ( + PLONG Destination, + LONG ExChange, + LONG Comperand + ); + + PVOID + InterlockedExchangePointer ( + PVOID *Target, + PVOID Value + ); + + PVOID + InterlockedCompareExchangePointer ( + PVOID *Destination, + PVOID ExChange, + PVOID Comperand + ); +*/ + +//we'll need a special cases for volatile __int64 and +//volatile unsigned __int64 + +template <typename T> +inline T InterlockedIncrement(volatile T * ptr) +{ + return (T)InterlockedIncrement((LPLONG)ptr); +} + +template <typename T> +inline T InterlockedDecrement(volatile T * ptr) +{ + return (T)InterlockedDecrement((LPLONG)ptr); +} + +template <typename T> +inline T InterlockedExchange(volatile T * target,T value) +{ + return (T)InterlockedExchange((LPLONG)target,(LONG)value); +} + +template <typename T> +inline T InterlockedExchangeAdd(volatile T *addend,T value) +{ + return (T)InterlockedExchangeAdd((LPLONG)addend,(LONG)value); +} + +template <typename T> +T InterlockedCompareExchange (volatile T * dest,T exchange,T comperand) +{ + return (T)InterlockedCompareExchange ((LPLONG)dest, + (LONG)exchange, + (LONG)comperand); +} +//most common use of InterlockedCompareExchange +template <typename T> +bool InterlockedSetIfEqual (volatile T * dest,T exchange,T comperand) +{ + return comperand==InterlockedCompareExchange(dest,exchange,comperand); +} + +//disable the no return value warning, because the assembly language +//routines load the appropriate registers directly +#pragma warning(disable:4035) + +inline unsigned __int64 +InterlockedCompareExchange(volatile unsigned __int64 *dest + ,unsigned __int64 exchange + ,unsigned __int64 comperand) +{ + //value returned in eax::edx + __asm { + lea esi,comperand; + lea edi,exchange; + + mov eax,[esi]; + mov edx,4[esi]; + mov ebx,[edi]; + mov ecx,4[edi]; + mov esi,dest; + //lock CMPXCHG8B [esi] is equivalent to the following except + //that it's atomic: + //ZeroFlag = (edx:eax == *esi); + //if (ZeroFlag) *esi = ecx:ebx; + //else edx:eax = *esi; + lock CMPXCHG8B [esi]; + } +} + +//most common use of InterlockedCompareExchange +//It's more efficient to use the z flag than to do another compare +inline bool +InterlockedSetIfEqual(volatile unsigned __int64 *dest + ,unsigned __int64 exchange + ,unsigned __int64 comperand) +{ + //value returned in eax + __asm { + lea esi,comperand; + lea edi,exchange; + + mov eax,[esi]; + mov edx,4[esi]; + mov ebx,[edi]; + mov ecx,4[edi]; + mov esi,dest; + //lock CMPXCHG8B [esi] is equivalent to the following except + //that it's atomic: + //ZeroFlag = (edx:eax == *esi); + //if (ZeroFlag) *esi = ecx:ebx; + //else edx:eax = *esi; + lock CMPXCHG8B [esi]; + mov eax,0; + setz al; + } +} +#pragma warning(default:4035) + +inline unsigned __int64 InterlockedIncrement(volatile unsigned __int64 * ptr) +{ + unsigned __int64 comperand; + unsigned __int64 exchange; + do { + comperand = *ptr; + exchange = comperand+1; + }while(!InterlockedSetIfEqual(ptr,exchange,comperand)); + return exchange; +} + +inline unsigned __int64 InterlockedDecrement(volatile unsigned __int64 * ptr) +{ + unsigned __int64 comperand; + unsigned __int64 exchange; + do { + comperand = *ptr; + exchange = comperand-1; + }while(!InterlockedSetIfEqual(ptr,exchange,comperand)); + return exchange; +} + +inline unsigned __int64 InterlockedExchange(volatile unsigned __int64 * target, + unsigned __int64 value) +{ + unsigned __int64 comperand; + do { + comperand = *target; + }while(!InterlockedSetIfEqual(target,value,comperand)); + return comperand; +} + +inline unsigned __int64 InterlockedExchangeAdd(volatile unsigned __int64 *addend, + unsigned __int64 value) +{ + unsigned __int64 comperand; + do { + comperand = *addend; + }while(!InterlockedSetIfEqual(addend,comperand+value,comperand)); + return comperand; +} + +#pragma warning(disable:4035) +inline __int64 +InterlockedCompareExchange(volatile __int64 *dest + ,__int64 exchange + ,__int64 comperand) +{ + //value returned in eax::edx + __asm { + lea esi,comperand; + lea edi,exchange; + + mov eax,[esi]; + mov edx,4[esi]; + mov ebx,[edi]; + mov ecx,4[edi]; + mov esi,dest; + //lock CMPXCHG8B [esi] is equivalent to the following except + //that it's atomic: + //ZeroFlag = (edx:eax == *esi); + //if (ZeroFlag) *esi = ecx:ebx; + //else edx:eax = *esi; + lock CMPXCHG8B [esi]; + } +} + +//most common use of InterlockedCompareExchange +//It's more efficient to use the z flag than to do another compare +inline bool +InterlockedSetIfEqual(volatile __int64 *dest + ,__int64 exchange + ,__int64 comperand) +{ + //value returned in eax + __asm { + lea esi,comperand; + lea edi,exchange; + + mov eax,[esi]; + mov edx,4[esi]; + mov ebx,[edi]; + mov ecx,4[edi]; + mov esi,dest; + //lock CMPXCHG8B [esi] is equivalent to the following except + //that it's atomic: + //ZeroFlag = (edx:eax == *esi); + //if (ZeroFlag) *esi = ecx:ebx; + //else edx:eax = *esi; + lock CMPXCHG8B [esi]; + mov eax,0; + setz al; + } +} +#pragma warning(default:4035) + +inline __int64 InterlockedIncrement(volatile __int64 * dest) +{ + __int64 comperand; + __int64 exchange; + do { + comperand = *dest; + exchange = comperand+1; + }while(!InterlockedSetIfEqual(dest,exchange,comperand)); + return exchange; +} + +inline __int64 InterlockedDecrement(volatile __int64 * dest) +{ + __int64 comperand; + __int64 exchange; + do { + comperand = *dest; + exchange = comperand-1; + }while(!InterlockedSetIfEqual(dest,exchange,comperand)); + return exchange; +} + +inline __int64 InterlockedExchange(volatile __int64 * target,__int64 value) +{ + __int64 comperand; + do { + comperand = *target; + }while(!InterlockedSetIfEqual(target,value,comperand)); + return comperand; +} + +inline __int64 InterlockedExchangeAdd(volatile __int64 *addend, + __int64 value) +{ + __int64 comperand; + do { + comperand = *addend; + }while(!InterlockedSetIfEqual(addend,comperand+value,comperand)); + return comperand; +} + +#pragma warning(disable:4035) +//I've just thought of some algorithms that use BTS and all so I'm including them +inline bool InterlockedBTS(volatile int *dest, int bit) +{ + //value returned in eax + __asm{ + mov eax,bit; + mov ebx,dest; + lock bts [ebx],eax; + mov eax,0; + setc al; + } +} +inline bool InterlockedBTC(volatile int *dest, int bit) +{ + //value returned in eax + __asm{ + mov eax,bit; + mov ebx,dest; + lock btc [ebx],eax; + mov eax,0; + setc al; + } +} +inline bool InterlockedBTR(volatile int *dest, int bit) +{ + //value returned in eax + __asm{ + mov eax,bit; + mov ebx,dest; + lock btr [ebx],eax; + mov eax,0; + setc al; + } +} +//you can lock BT but since it doesn't change memory there isn't really any point +inline bool BT(volatile int *dest, int bit) +{ + //value returned in eax + __asm{ + mov eax,bit; + mov ebx,dest; + bt [ebx],eax; + mov eax,0; + setc al; + } +} +#pragma warning(default:4035) + +inline bool InterlockedBTS(volatile unsigned *dest, int bit) +{ + return InterlockedBTS((volatile int *)dest,bit); +} +inline bool InterlockedBTC(volatile unsigned *dest, int bit) +{ + return InterlockedBTC((volatile int *)dest,bit); +} +inline bool InterlockedBTR(volatile unsigned *dest, int bit) +{ + return InterlockedBTR((volatile int *)dest,bit); +} +inline bool BT(volatile unsigned *dest, int bit) +{ + return BT((volatile int *)dest,bit); +} + +inline bool InterlockedBTS(volatile unsigned long *dest, int bit) +{ + return InterlockedBTS((volatile int *)dest,bit); +} +inline bool InterlockedBTC(volatile unsigned long *dest, int bit) +{ + return InterlockedBTC((volatile int *)dest,bit); +} +inline bool InterlockedBTR(volatile unsigned long *dest, int bit) +{ + return InterlockedBTR((volatile int *)dest,bit); +} +inline bool BT(volatile unsigned long *dest, int bit) +{ + return BT((volatile int *)dest,bit); +} + +inline bool InterlockedBTS(volatile long *dest, int bit) +{ + return InterlockedBTS((volatile int *)dest,bit); +} +inline bool InterlockedBTC(volatile long *dest, int bit) +{ + return InterlockedBTC((volatile int *)dest,bit); +} +inline bool InterlockedBTR(volatile long *dest, int bit) +{ + return InterlockedBTR((volatile int *)dest,bit); +} +inline bool BT(volatile long *dest, int bit) +{ + return BT((volatile int *)dest,bit); +} + +inline bool InterlockedBTS(volatile __int64 *dest, int bit) +{ + if (bit<32) return InterlockedBTS((volatile int *)&dest,bit); + return InterlockedBTS(1+(volatile int *)&dest,bit-32); +} +inline bool InterlockedBTC(volatile __int64 *dest, int bit) +{ + if (bit<32) return InterlockedBTC((volatile int *)&dest,bit); + return InterlockedBTC(1+(volatile int *)&dest,bit-32); +} +inline bool InterlockedBTR(volatile __int64 *dest, int bit) +{ + if (bit<32) return InterlockedBTR((volatile int *)&dest,bit); + return InterlockedBTR(1+(volatile int *)&dest,bit-32); +} +inline bool BT(volatile __int64 *dest, int bit) +{ + if (bit<32) return BT((volatile int *)&dest,bit); + return BT(1+(volatile int *)&dest,bit-32); +} +inline bool InterlockedBTS(volatile unsigned __int64 *dest, int bit) +{ + if (bit<32) return InterlockedBTS((volatile int *)&dest,bit); + return InterlockedBTS(1+(volatile int *)&dest,bit-32); +} +inline bool InterlockedBTC(volatile unsigned __int64 *dest, int bit) +{ + if (bit<32) return InterlockedBTC((volatile int *)&dest,bit); + return InterlockedBTC(1+(volatile int *)&dest,bit-32); +} +inline bool InterlockedBTR(volatile unsigned __int64 *dest, int bit) +{ + if (bit<32) return InterlockedBTR((volatile int *)&dest,bit); + return InterlockedBTR(1+(volatile int *)&dest,bit-32); +} +inline bool BT(volatile unsigned __int64 *dest, int bit) +{ + if (bit<32) return BT((volatile int *)&dest,bit); + return BT(1+(volatile int *)&dest,bit-32); +} + +//T can be int, unsigned int, long, unsigned long +//__int64 or unsigned __int64 +template <typename T> +struct Atomic +{ + volatile T value; + + inline Atomic(){} + + explicit inline Atomic(T n) + { //so that it's globally visible (to use intel's terminology) + InterlockedExchange(&value,n); + } + + //if you need an atomic load then use (*this += 0) + //but I haven't found any algorithms that + //require an atomic load + inline operator T() const + { + return value; + } + + inline T CompareExchange(T exchange, T comperand) + { + return InterlockedCompareExchange(&value,exchange,comperand); + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare + inline T CompareSomeBitsAndExchange(T exchange, T comperand, T bitsToCompare) + { + T returned; + T bitsToIgnore = ~bitsToCompare; + for (;;){ + returned = InterlockedCompareExchange(&value,exchange,comperand); + if (returned == comperand) return returned; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned); + } + return returned; + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare and in the set + inline T CompareSomeBitsAndExchangeThoseBits(T exchange, T comperand, T bitsToCompare) + { + T returned = comperand; + T bitsToIgnore = ~bitsToCompare; + for (;;){ + exchange = (exchange&bitsToCompare) | (bitsToIgnore&returned); + returned = InterlockedCompareExchange(&value,exchange,comperand); + if (returned == comperand) return returned; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned); + } + return returned; + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare and others in the set + inline T CompareSomeBitsAndExchangeSomeOtherBits(T exchange, + T bitsToExchange, + T comperand, + T bitsToCompare + ) + { + T returned = value; + T bitsToIgnore = ~bitsToCompare; + T bitsToLeave = ~bitsToExchange; + for (;;){ + exchange = (exchange&bitsToExchange) | (bitsToLeave&returned); + returned = InterlockedCompareExchange(&value,exchange,comperand); + if (returned == comperand) return returned; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned); + } + return returned; + } + + inline T Exchange(T exchange) + { + return InterlockedExchange(&value,exchange); + } + + inline bool SetIfEqual(T exchange, T comperand) + { + return InterlockedSetIfEqual(&value,exchange,comperand); + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare + inline bool SetIfSomeBitsAreEqual(T exchange, T comperand, T bitsToCompare) + { + T returned; + T bitsToIgnore = ~bitsToCompare; + for (;;){ + returned = InterlockedCompareExchange(&value,exchange,comperand); + if (returned == comperand) return true; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned); + } + return false; + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare and in the set + inline bool SetSomeBitsIfThoseBitsAreEqual(T exchange, T comperand, T bitsToCompare) + { + T returned = comperand; + T bitsToIgnore = ~bitsToCompare; + for (;;){ + exchange = (exchange&bitsToCompare) | (bitsToIgnore&returned); + returned = InterlockedCompareExchange(&value,exchange,comperand); + if (returned == comperand) return true; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comperand = (comperand&bitsToCompare) | (bitsToIgnore&returned); + } + return false; + } + //useful - simulates having a compareexchange that ignores some bits in + //the compare and others in the set + inline bool SetSomeBitsIfSomeOtherBitsAreEqual(T exchange, + T bitsToExchange, + T comperand, + T bitsToCompare + ) + { + T returned = value; + T bitsToIgnore = ~bitsToCompare; + T bitsToLeave = ~bitsToExchange; + for (;;){ + exchange = (exchange&bitsToExchange) | (bitsToLeave&returned); + returned = InterlockedCompareExchange(&value,exchange,comperand); + if (returned == comperand) return true; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comperand = (comperand&bitsToCompare) | (bitsToIgnore&returned); + } + return false; + } + + inline T operator =(T exchange) + { + Exchange(exchange); + return exchange; + } + + inline T operator +=(T n) + { + return n + InterlockedExchangeAdd(&value, n); + } + + inline T operator -=(T n) + { + return InterlockedExchangeAdd(&value, -n) - n; + } + inline T operator ++() + { + return (*this += 1); + } + + inline T operator --() + { + return (*this -= 1); + } + + inline T operator ++(int) + { + return InterlockedExchangeAdd(&value, (T)1); + } + + inline T operator --(int) + { + return InterlockedExchangeAdd(&value, (T)-1); + } + + inline T operator &=(T n) + { + T comperand; + T exchange; + do { + comperand = value; + exchange = comperand & n; + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + inline T operator |= (T n) + { + T comperand; + T exchange; + do { + comperand = value; + exchange = comperand | n; + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + //yes this isn't standard, but it's useful + inline T Mask(T bitsToKeep, T bitsToSet) + { + T comperand; + T exchange; + do { + comperand = value ; + exchange = ((comperand & bitsToKeep) | bitsToSet); + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + inline T operator ^= (T n) + { + T comperand; + T exchange; + do { + comperand = value; + exchange = comperand ^ n; + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + inline T operator *= (T n) + { + T comperand; + T exchange; + do { + comperand = value; + exchange = comperand * n; + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + inline T operator /= (T n) + { + T comperand; + T exchange; + do { + comperand = value; + exchange = comperand / n; + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + inline T operator >>= (unsigned n) + { + T comperand; + T exchange; + do { + comperand = value; + exchange = comperand >> n; + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + inline T operator <<= (unsigned n) + { + T comperand; + T exchange; + do { + comperand = value; + exchange = comperand << n; + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + inline bool BTS(int bit) + { + return InterlockedBTS(&value,bit); + } + inline bool BTC(int bit) + { + return InterlockedBTC(&value,bit); + } + inline bool BTR(int bit) + { + return InterlockedBTR(&value,bit); + } + inline bool BT(int bit) + { + return BT(&value,bit); + } +}; + +template <typename T> +T * InterlockedCompareExchangePointer ( + T *volatile *dest, + T * exchange, + T * comperand + ) +{ + return (T*)InterlockedCompareExchangePointer((PVOID *)dest,(PVOID)exchange,(PVOID)comperand); +} + +template <typename T> +struct AtomicPtr +{ + T * volatile value; + + inline AtomicPtr(){} + + explicit inline AtomicPtr(T *n) + { //so that it's globally visible (to use intel's terminology) + InterlockedExchange(&value,n); + } + explicit inline AtomicPtr(const T *n) + { //so that it's globally visible (to use intel's terminology) + InterlockedExchange(&value,(T *)n); + } + + inline operator T *() const + { + return value; + } + + inline operator const T *() const + { + return value; + } + + inline T *CompareExchange(T *exchange, T *comperand) + { + return InterlockedCompareExchangePointer(&value,exchange,comperand); + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare + inline T * CompareSomeBitsAndExchange(T * exchange, T * comperand, int bitsToCompare) + { + T *returned; + int bitsToIgnore = ~bitsToCompare; + for (;;){ + returned = InterlockedCompareExchangePointer(&value,exchange,comperand); + if (returned == comperand) return returned; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned); + } + return returned; + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare and in the set + inline T * CompareSomeBitsAndExchangeThoseBits(T * exchange, T * comperand, int bitsToCompare) + { + T *returned = comperand; + int bitsToIgnore = ~bitsToCompare; + for (;;){ + exchange = (T*)((int)exchange&bitsToCompare) | (bitsToIgnore&(int)returned); + returned = InterlockedCompareExchangePointer(&value,exchange,comperand); + if (returned == comperand) return returned; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (T*)((int)comparand&bitsToCompare) | (bitsToIgnore&(int)returned); + } + return returned; + } + //useful - simulates having a compareexchange that ignores some bits in + //the compare and others in the set + inline T* CompareSomeBitsAndExchangeSomeOtherBits(T *exchange, + int bitsToExchange, + T * comperand, + int bitsToCompare + ) + { + T * returned = value; + int bitsToIgnore = ~bitsToCompare; + int bitsToLeave = ~bitsToExchange; + for (;;){ + exchange = (T*)((int)exchange&bitsToExchange) | (bitsToLeave&(int)returned); + returned = InterlockedCompareExchange(&value,exchange,comperand); + if (returned == comperand) return returned; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (T*)((int)comparand&bitsToCompare) | (bitsToIgnore&(int)returned); + } + return returned; + } + + inline T * operator ->() const + { + assert (value != NULL); + return value; + } + + inline T *Exchange(T *exchange) + { + return InterlockedExchange(&value,exchange); + } + + inline bool SetIfEqual(T *exchange, T *comperand) + { + return comperand==InterlockedCompareExchangePointer(&value,exchange,comperand); + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare + inline bool SetIfSomeBitsAreEqual(T * exchange, T * comperand, int bitsToCompare) + { + T *returned; + int bitsToIgnore = ~bitsToCompare; + for (;;){ + returned = InterlockedCompareExchangePointer(&value,exchange,comperand); + if (returned == comperand) return true; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (comparand&bitsToCompare) | (bitsToIgnore&returned); + } + return false; + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare and in the set + inline bool SetSomeBitsIfThoseBitsAreEqual(T * exchange, T * comperand, int bitsToCompare) + { + T *returned = comperand; + int bitsToIgnore = ~bitsToCompare; + for (;;){ + exchange = (T*)((int)exchange&bitsToCompare) | (bitsToIgnore&(int)returned); + returned = InterlockedCompareExchangePointer(&value,exchange,comperand); + if (returned == comperand) return true; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (T*)((int)comparand&bitsToCompare) | (bitsToIgnore&(int)returned); + } + return false; + } + + //useful - simulates having a compareexchange that ignores some bits in + //the compare and others in the set + inline bool SetSomeBitsIfSomeOtherBitsAreEqual(T *exchange, + int bitsToExchange, + T * comperand, + int bitsToCompare + ) + { + T * returned = value; + int bitsToIgnore = ~bitsToCompare; + int bitsToLeave = ~bitsToExchange; + for (;;){ + exchange = (T*)((int)exchange&bitsToExchange) | (bitsToLeave&(int)returned); + returned = InterlockedCompareExchange(&value,exchange,comperand); + if (returned == comperand) return true; + if (0 != ((returned ^ comperand) & bitsToCompare)) break; + comparand = (T*)((int)comparand&bitsToCompare) | (bitsToIgnore&(int)returned); + } + return false; + } + + inline T *operator =(T *exchange) + { + Exchange(exchange); + return exchange; + } + + template <typename INT_TYPE> + inline T *operator +=(INT_TYPE n) + { + return n + (T *)InterlockedExchangeAdd((LPLONG)&value, (LONG)(n * (LONG)sizeof(T))); + } + + template <typename INT_TYPE> + inline T *operator -=(INT_TYPE n) + { + return (T *)InterlockedExchangeAdd((LPLONG)&value, (LONG)(-n * (LONG)sizeof(T))) - n; + } + inline T *operator ++() + { + return (T *)InterlockedExchangeAdd((LPLONG)&value, (LONG)(sizeof(T))) + 1; + } + + inline T *operator --() + { + return (T *)InterlockedExchangeAdd((LPLONG)&value, -(LONG)(sizeof(T))) - 1; + } + + inline T *operator ++(int) + { + return (T*)InterlockedExchangeAdd((LPLONG)&value, (LONG)sizeof(T)); + } + + inline T *operator --(int) + { + return (T*)InterlockedExchangeAdd((LPLONG)&value, -(LONG)sizeof(T)); + } + + //yes this isn't standard, but it's useful + template <typename INT_TYPE> + inline T *operator &=(INT_TYPE n) + { + T * comperand; + T * exchange; + do { + comperand = value; + exchange = (T *)((LONG)comperand & n); + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + //yes this isn't standard, but it's useful + template <typename INT_TYPE> + inline T *operator |= (INT_TYPE n) + { + T * comperand; + T * exchange; + do { + comperand = value; + exchange = (T *)((LONG)comperand | n); + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + //yes this isn't standard, but it's useful + template <typename INT_TYPE> + inline T operator ^= (INT_TYPE n) + { + T * comperand; + T * exchange; + do { + comperand = value; + exchange = (T *)((LONG)comperand ^ n); + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + //yes this isn't standard, but it's useful + template <typename INT_TYPE_A, typename INT_TYPE_B> + inline T * Mask(INT_TYPE_A bitsToKeep, INT_TYPE_B bitsToSet) + { + T * comperand; + T * exchange; + do { + comperand = value ; + exchange = (T *)(((LONG)comperand & bitsToKeep) | bitsToSet); + }while(!SetIfEqual(exchange, comperand)); + return exchange; + } + + + inline bool BTS(int bit) + { + return InterlockedBTS((volatile int *)&value,bit); + } + inline bool BTC(int bit) + { + return InterlockedBTC((volatile int *)&value,bit); + } + inline bool BTR(int bit) + { + return InterlockedBTR((volatile int *)&value,bit); + } + inline bool BT(int bit) + { + return BT((volatile int *)&value,bit); + } +}; + +typedef Atomic<int> AtomicInt; +typedef Atomic<unsigned int> AtomicUInt; +typedef Atomic<__int64> AtomicInt64; +typedef Atomic<unsigned __int64> AtomicUInt64; + +template +<typename T, typename A = AtomicUInt64> +struct AtomicUnion +{ + A whole; + + AtomicUnion() + { + assert(sizeof(T)<=sizeof(A)); + new((void *)&whole) T();//in place new + + } + + ~AtomicUnion() + { + ((T *)&whole)->~T(); + } + + T &Value() + { + return *(T *)&whole; + } + const T &Value() const + { + return *(const T *)&whole; + } +}; + + +template <typename T> +struct AtomicPtrWithCountStruct +{ + AtomicPtr<T> ptr; + AtomicInt count; +}; + + +template <typename T> +struct PtrWithCountStruct +{ + T* ptr; + int count; +}; + +template <typename T, int MARKBITS=3> +struct BitMarkedAtomicPtr : public AtomicPtr<T> +{ + const int MarkMask() const + { + return (1<<MARKBITS)-1; + } + + const int DataMask() const + { + return ~ThreadBitMask(); + } + + static T * MaskPtr(T *data) + { + return (T*)((int)data & DataMask()); + } + + static int MaskMark(T * data) + { + return ((int)data & MarkMask()); + } + + static T* Mark(T * data, int bit) + { + return (T*)((int)data | 1<<bit); + } + + static T* Unmark(T * data, int bit) + { + return (T*)((int)data & ~(1<<bit)); + } + + T * MaskPtr() + { + return MaskPtr(value); + } + + int MaskMark() + { + return MaskMark(value); + } + + //note new value has the marks in exchange not the original marks + inline bool SetIfMarked(T *exchange, int bit) + { + assert(bit<MARKBITS); + return SetIfSomeBitsAreEqual(exchange,DataMask(),(T*)(1<<bit),1<<bit); + } + + //note new value has the marks in exchange not the original marks + T * ExchangeIfMarked(T *exchange, int bit) + { + assert(bit<MARKBITS); + return CompareSomeBitsAndExchange(exchange,DataMask(),(T*)(1<<bit),1<<bit); + } + + inline bool SetAndClearMarksIfMarked(T *exchange, int bit) + { + return SetIfMarked(MaskPtr(exchange),bit); + } + + inline T * ExchangeAndClearMarksIfMarked(T *exchange, int bit) + { + return ExchangeIfMarked(MaskPtr(exchange),bit); + } + + inline bool SetAndClearOtherMarksIfMarked(T *exchange, int bit) + { + return SetIfMarked(Mark(MaskPtr(exchange),bit), + bit); + } + + //note new value has the marks in exchange not the original marks + T * ExchangeAndClearOtherMarksIfMarked(T *exchange, int bit) + { + return ExchangeIfMarked(Mark(MaskPtr(exchange),bit), + bit); + } + + inline bool SetAndMarkIfMarked(T *exchange, int bit) + { + return SetSomeBitsIfSomeOtherBitsAreEqual( + Mark(MaskPtr(exchange),bit), + DataMask() | 1<<bit, + (T*)(1<<bit), + 1<<bit); + } + + inline T * ExchangeAndMarkIfMarked(T *exchange, int bit) + { + return CompareSomeBitsAndExchangeSomeOtherBits( + Mark(MaskPtr(exchange),bit), + DataMask() | 1<<bit, + (T*)(1<<bit), + 1<<bit); + } + + bool Mark(int bit) + { + assert(bit<MARKBITS); + return BTS(bit); + } + + bool Unmark(int bit) + { + assert(bit<MARKBITS); + return BTC(bit); + } + + bool InvertMark(int bit) + { + assert(bit<MARKBITS); + return BTR(bit); + } + + bool IsMarked(int bit) + { + assert(bit<MARKBITS); + return BT(bit); + } +}; + +template <typename T> +struct AtomicPtrWithCount : public AtomicUnion< AtomicPtrWithCountStruct<T> > +{ + typedef AtomicUnion< PtrWithCountStruct<T>, unsigned __int64 > SimpleUnionType; + AtomicPtrWithCount() + { + whole = 0; + } + AtomicPtrWithCount(unsigned __int64 o) + { + whole = o.whole; + } + AtomicPtrWithCount(T *ptr) + { + SimpleUnionType o; + o.Value().ptr = ptr; + o.Value().count = 0; + whole = o.whole; + } + + operator unsigned __int64() const + { + return whole; + } + T *Ptr() const + { + return Value().ptr; + } + int Count() const + { + return Value().count; + } + unsigned __int64 Whole() const + { + return whole; + } + + AtomicPtr<T> & Ptr() + { + return Value().ptr; + } + AtomicInt & Count() + { + return Value().count; + } + AtomicUInt64 & Whole() + { + return whole; + } + unsigned __int64 SetPtrAndIncCount(T *ptr) + { + SimpleUnionType was; + SimpleUnionType to; + to.Value().ptr = ptr; + do { + was.whole = whole; + to.Value().count = was.Value().count+1; + }while(!whole.SetIfEqual(to.whole,was.whole)); + return to.whole; + } + bool SetIfPtrEqualAndIncCount(T *exchange, T *comperand) + { + SimpleUnionType was; + SimpleUnionType to; + to.ptr = exchange; + do { + was.whole = whole; + if (was.Value().ptr != comperand) return false; + to.Value().count = was.Value().count+1; + }while(!whole.SetIfEqual(to.whole,was.whole)); + return true; + } + unsigned __int64 ExchangeIfPtrEqualAndIncCount(T *exchange, T *comperand) + { + SimpleUnionType was; + SimpleUnionType to; + to.ptr = exchange; + do { + was.whole = whole; + if (was.Value().ptr != comperand) return was.whole; + to.Value().count = was.Value().count+1; + }while(!whole.SetIfEqual(to.whole,was.whole)); + return was.whole; + } + inline T *operator =(T *exchange) + { + SetPtrAndIncCount(exchange); + return exchange; + } + + template <typename INT_TYPE> + inline T *operator +=(INT_TYPE n) + { + T *was; + T *to; + do { + was = Ptr(); + to = was + n; + }while (!SetIfPtrEqualAndIncCount(to,was)); + return to; + } + + template <typename INT_TYPE> + inline T *operator -=(INT_TYPE n) + { + T *was; + T *to; + do { + was = Ptr(); + to = was - n; + }while (!SetIfPtrEqualAndIncCount(to,was)); + return to; + } + inline T *operator ++() + { + return (*this += 1); + } + + inline T *operator --() + { + return (*this -= 1); + } + + inline T *operator ++(int) + { + return (++ *this) - 1; + } + + inline T *operator --(int) + { + return (-- *this) + 1; + } +}; + +template <typename T> +struct AtomicPtrWithMarkStruct +{ + AtomicPtr<T> ptr; + AtomicUInt mark; +}; + + +template <typename T> +struct PtrWithMarkStruct +{ + T* ptr; + unsigned int mark; +}; + +template <typename T> +struct AtomicPtrWithMark : public AtomicUnion< AtomicPtrWithMarkStruct<T> > +{ + typedef AtomicUnion< PtrWithMarkStruct<T>, unsigned __int64 > SimpleUnionType; + AtomicPtrWithMark() + { + whole = 0; + } + AtomicPtrWithMark(unsigned __int64 o) + { + whole = o.whole; + } + AtomicPtrWithMark(T *ptr) + { + SimpleUnionType o; + o.Value().ptr = ptr; + o.Value().mark = 0; + whole = o.whole; + } + + operator unsigned __int64() const + { + return whole; + } + T *Ptr() const + { + return Value().ptr; + } + int Mark() const + { + return Value().mark; + } + unsigned __int64 Whole() const + { + return whole; + } + + AtomicPtr<T> & Ptr() + { + return Value().ptr; + } + AtomicInt & Mark() + { + return Value().mark; + } + AtomicUInt64 & Whole() + { + return whole; + } + + inline bool SetAndClearOtherMarksIfMarked(T *exchange, int bit) + { + assert(bit<32); + SimpleUnionType compareMask; + compareMask.Value().ptr = NULL; + compareMask.Value().mark = 1u<<bit; + + SimpleUnionType exchangeValue; + exchangeValue.Value().ptr = exchange; + exchangeValue.Value().mark = compareMask.Value().mark; + + return whole.SetSomeBitsIfSomeOtherBitsAreEqual(exchangeValue.whole, + (unsigned __int64)-1i64, + compareMask.whole, + compareMask.whole); + } + inline bool SetAndClearMarksIfPtrEqual(T *exchange, T*comparend) + { + SimpleUnionType compareMask; + compareMask.Value().ptr = (T*)-1; + compareMask.Value().mark = 0; + + SimpleUnionType compareValue; + compareValue.Value().ptr = comparend; + compareValue.Value().mark = 0; + + SimpleUnionType exchangeValue; + exchangeValue.Value().ptr = exchange; + exchangeValue.Value().mark = 0; + + return whole.SetSomeBitsIfThoseBitsAreEqual(exchangeValue.whole, + compareValue.whole, + compareMask.whole); + } + + inline bool SetAndClearMarksIfMarked(T *exchange, int bit) + { + assert(bit<32); + SimpleUnionType compareMask; + compareMask.Value().ptr = NULL; + compareMask.Value().mark = 1u<<bit; + + SimpleUnionType exchangeValue; + exchangeValue.Value().ptr = exchange; + exchangeValue.Value().mark = 0; + + return whole.SetSomeBitsIfSomeOtherBitsAreEqual(exchangeValue.whole, + (unsigned __int64)-1i64, + compareMask.whole, + compareMask.whole); + } + //note new value has the marks in exchange not the original marks + unsigned __int64 ExchangeAndClearOtherMarksIfMarked(T *exchange, int bit) + { + assert(bit<32); + SimpleUnionType compareMask; + compareMask.Value().ptr = NULL; + compareMask.Value().mark = 1u<<bit; + + SimpleUnionType exchangeValue; + exchangeValue.Value().ptr = exchange; + exchangeValue.Value().mark = compareMask.Value().mark; + + return whole.CompareSomeBitsAndExchangeSomeOtherBits(exchangeValue.whole, + exchangeMask.whole, + compareMask.whole, + compareMask.whole); + } + + unsigned __int64 ExchangeAndClearMarksIfMarked(T *exchange, int bit) + { + assert(bit<32); + SimpleUnionType compareMask; + compareMask.Value().ptr = NULL; + compareMask.Value().mark = 1u<<bit; + + SimpleUnionType exchangeValue; + exchangeValue.Value().ptr = exchange; + exchangeValue.Value().mark = 0; + + return whole.CompareSomeBitsAndExchangeSomeOtherBits(exchangeValue.whole, + exchangeMask.whole, + compareMask.whole, + compareMask.whole); + } + + + bool Mark(int bit) + { + assert(bit<32); + return whole.BTS(bit); + } + + bool Unmark(int bit) + { + assert(bit<32); + return whole.BTC(bit); + } + + bool InvertMark(int bit) + { + assert(bit<32); + return whole.BTR(bit); + } + + bool IsMarked(int bit) + { + assert(bit<32); + return whole.BT(bit); + } +}; + +struct MPStackElement +{ + MPStackElement * next; +}; + +class MPMarkStack +{ +protected: + AtomicPtrWithMark<MPStackElement> tos; + AtomicUInt availableThreadBits; + AtomicInt lastReserved; + +public: + + MPStackElement* ExchangeStack(MPStackElement *newStack = NULL) + { + AtomicPtrWithMark<MPStackElement>::SimpleUnionType newWhole, ret; + newWhole.Value().mark = 0; + newWhole.Value().ptr = newStack; + ret.whole = tos.whole.Exchange(newWhole.whole); + return ret.Value().ptr; + } + + MPMarkStack() + { + lastReserved = 0; + tos.whole = 0; + availableThreadBits = (unsigned)-1; + } + + //expensive - call once per thread to reserve a bit + int ReserveThreadBit() + { + int offset = lastReserved; + //since locked operations are slow we only do + //bit tests on bits that look acceptable because + //of a nonlocked read. + unsigned readOnce = availableThreadBits; + for (int i=0; i< 32;++i){ + const int bit = (31&(i+offset)); + const unsigned mask = 1u<<bit; + if ((readOnce & mask)!=0){ + if (availableThreadBits.BTR(bit)) { + lastReserved = ((bit+1)&31);//try the next one + return bit+1; + } + readOnce = availableThreadBits; + } + } + return 0; + } + int BlockingReserveThreadBit() + { + int i; + while (0==(i=ReserveThreadBit())); + return i; + } + int ReturnThreadBit(int i) + { + availableThreadBits.BTS(i-1); + } + + void PushElement(MPStackElement *element) + { + MPStackElement * next; + do { + next = tos.Value().ptr; + element->next = tos.Value().ptr; + }while(!tos.SetAndClearMarksIfPtrEqual(element,next)); + } + + void PushList(MPStackElement *top, MPStackElement *bottom) + { + MPStackElement * next; + do { + next = tos.Value().ptr; + bottom->next = tos.Value().ptr; + }while(!tos.SetAndClearMarksIfPtrEqual(top,next)); + } + + MPStackElement* PopElement(int i) + { + for(;;) { + tos.Value().mark.BTS(i-1); + MPStackElement * was = tos.Value().ptr; + if (was == NULL) return NULL; + if (tos.SetAndClearMarksIfMarked(was->next,i-1)) return was; + } + } + MPStackElement* PopElement() + { + int id = BlockingReserveThreadBit(); + MPStackElement * ret = PopElement(id); + ReturnThreadBit(id); + return ret; + } +}; +class MPCountStack +{ +protected: + AtomicPtrWithCount<MPStackElement> tos; + +public: + + MPStackElement* ExchangeStack(MPStackElement *newStack = NULL) + { + return tos.Value().ptr.Exchange(newStack); + } + + MPCountStack() + { + tos = 0; + } + + + void PushElement(MPStackElement *element) + { + MPStackElement * next; + do { + next = tos.Value().ptr; + element->next = tos.Value().ptr; + }while(!tos.Value().ptr.SetIfEqual(element,next)); + } + + void PushList(MPStackElement *top, MPStackElement *bottom) + { + MPStackElement * next; + do { + next = tos.Value().ptr; + bottom->next = tos.Value().ptr; + }while(!tos.Value().ptr.SetIfEqual(top,next)); + } + + MPStackElement* PopElement() + { + AtomicPtrWithCount<MPStackElement>::SimpleUnionType was; + AtomicPtrWithCount<MPStackElement>::SimpleUnionType to; + do { + was.whole = tos.whole; + if (was.Value().ptr == NULL) return NULL; + to.Value().count = was.Value().count + 1; + to.Value().ptr = was.Value().ptr->next; + }while(!tos.whole.SetIfEqual(was.whole,to.whole)); + return was.Value().ptr; + } +}; + +class SimpleStack +{ +protected: + MPStackElement * tos; + +public: + + MPStackElement* ExchangeStack(MPStackElement *newStack = NULL) + { + MPStackElement* was = tos; + tos = newStack; + return was; + } + + SimpleStack() + { + tos = 0; + } + + + void PushElement(MPStackElement *element) + { + element->next = tos; + tos = element; + } + + void PushList(MPStackElement *top, MPStackElement *bottom) + { + bottom->next = tos; + tos = top; + } + + MPStackElement* PopElement() + { + MPStackElement* was = tos; + if (was) tos = was->next; + return was; + } +}; + +template <typename T> +struct MPMemBlock : public MPStackElement +{ + T data; + char bottomOfBlock; +}; + +#define OFFSET_OF_MEMBER(type,member) ((int)&(((type *)0)->member)) + +//put one of these in each thread object +//and you have thread local allocation +template <typename T, typename BLOCK_ALLOCATOR> +struct SimpleBlockAllocator +{ + SimpleStack data; + + typedef SimpleBlockAllocator<T,BLOCK_ALLOCATOR> AllocatorType; + + BLOCK_ALLOCATOR & MyAllocator; + + SimpleBlockAllocator(BLOCK_ALLOCATOR &source) + :MyAllocator(source) + {} + + int ReserveThreadBit(){return 1;} + int BlockingReserveThreadBit(){return 1;} + void ReturnThreadBit(int){ } + + int Size() const { return sizeof(T); } + void AddBlock() + { + int blockSize = MyAllocator.Size(); + int elementSize = sizeof(MPMemBlock<T>); + assert( MyAllocator.Size() >= elementSize); + MPMemBlock<T> *bottom = (MPMemBlock<T> *)MyAllocator.Allocate(); + void *prev = 0; + MPMemBlock<T> *top = bottom; + do { + top->bottomOfBlock = 0; + top->next = prev; + prev = (void *)top; + ++top; + }while( (blockSize-=elementSize) >= elementSize); + bottom->bottomOfBlock = 1; + data.PushList(top-1,bottom); + } + void *Allocate(int) + { + return Allocate(); + } + void *Allocate() + { + MPMemBlock<T> *ret; + for(;;) { + ret = (MPMemBlock<T> *)data.PopElement(); + if (ret!=NULL) return &ret->data; + AddBlock(); + } + } + void Deallocate(void *ob) + { + if (!ob) return; + MPMemBlock<T> *ret = (MPMemBlock<T> *) + ((char *)data - OFFSET_OF_MEMBER(MPMemBlock<T>,ob)); + data.PushElement(ret); + } + //all memory allocated must be Deallocated before Clear() or the destructor is called + void Clear() + { + MPMemBlock<T> *stackWas = (MPMemBlock<T> *)data.ExchangeStack(NULL); + MPMemBlock<T> *blocks = NULL; + while(stackWas){ + if (stackWas->bottomOfBlock){ + if (blocks) { + blocks->next = stackWas; + } + blocks = stackWas; + } + stackWas = (MPMemBlock<T> *)(stackWas->next); + } + while(blocks) + { + stackWas = (MPMemBlock<T> *)blocks->next; + MyAllocator.Deallocate(blocks); + blocks = stackWas; + } + } + //all memory allocated must be Deallocated before Clear() or the destructor is called + ~SimpleBlockAllocator() + { + Clear(); + } +}; + +template<class T> +struct SimpleAllocator +{ + void *Allocate() { return (void *)new char[sizeof(T)]; } + void *Allocate(int) { return Allocate(); } + + int ReserveThreadBit(){return 1;} + int BlockingReserveThreadBit(){return 1;} + void ReturnThreadBit(int){} + + void Deallocate(void *data) { delete[] (char[])data; } + int Size() const { return sizeof(T); } + typedef SimpleAllocator AllocatorType; +}; + +enum DontReserve{ DONT_RESERVE }; + +template<class T> +struct ThreadMarkedAllocator +{ + T& allocator; + int bit; + + ThreadMarkedAllocator(T &sourceAllocator) + :allocator(sourceAllocator) + ,bit(sourceAllocator.BlockingReserveThreadBit()) + {} + + ThreadMarkedAllocator(T &sourceAllocator,DontReserve) + :allocator(sourceAllocator) + ,bit(0) + {} + + ~ThreadMarkedAllocator() + { + allocator.ReturnThreadBit(bit); + } + + bool ReserveThreadBit() + { + if (bit==0) bit=sourceAllocator.ReserveThreadBit(); + return bit!=0; + } + void BlockingReserveThreadBit() + { + if (bit==0) bit=sourceAllocator.BlockingReserveThreadBit(); + } + void ReturnThreadBit() + { + int was = bit; + bit = 0; + sourceAllocator.ReturnThreadBit(was); + } + + void *Allocate() + { + assert(bit!=0); + return allocator.Allocate(bit); + } + + void Deallocate(void *data) { allocator.Deallocate(data); } + int Size() const { return Allocator.Size(); } + typedef ThreadMarkedAllocator<T> AllocatorType; +}; + +template <typename T, typename BLOCK_ALLOCATOR> +struct MPMarkFreeListAllocator +{ + MPMarkStack data; + + typedef MPMarkFreeListAllocator<T,BLOCK_ALLOCATOR> AllocatorType; + + BLOCK_ALLOCATOR &MyAllocator; + + MPMarkFreeListAllocator(BLOCK_ALLOCATOR &source) + :MyAllocator(source) + {} + + int ReserveThreadBit(){return data.ReserveThreadBit();} + int BlockingReserveThreadBit(){return data.BlockingReserveThreadBit();} + void ReturnThreadBit(int bit){ data.ReturnThreadBit(bit); } + + int Size() const { return sizeof(T); } + void AddBlock() + { + int blockSize = MyAllocator.Size(); + int elementSize = sizeof(MPMemBlock<T>); + assert( MyAllocator.Size() >= elementSize); + MPMemBlock<T> *bottom = (MPMemBlock<T> *)MyAllocator.Allocate(); + void *prev = 0; + MPMemBlock<T> *top = bottom; + do { + top->bottomOfBlock = 0; + top->next = prev; + prev = (void *)top; + ++top; + }while( (blockSize-=elementSize) >= elementSize); + bottom->bottomOfBlock = 1; + data.PushList(top-1,bottom); + } + void *Allocate(int mark) + { + MPMemBlock<T> *ret; + for(;;) { + ret = (MPMemBlock<T> *)data.PopElement(mark); + if (ret!=NULL) return ret; + AddBlock(); + } + } + void *Allocate() + { + MPMemBlock<T> *ret; + for(;;) { + ret = (MPMemBlock<T> *)data.PopElement(); + if (ret!=NULL) return &ret->data; + AddBlock(); + } + } + void Deallocate(void *ob) + { + if (!ob) return; + MPMemBlock<T> *ret = (MPMemBlock<T> *) + ((char *)data - OFFSET_OF_MEMBER(MPMemBlock<T>,ob)); + data.PushElement(ret); + } + //all memory allocated must be Deallocated before Clear() or the destructor is called + void Clear() + { + MPMemBlock<T> *stackWas = (MPMemBlock<T> *)data.ExchangeStack(NULL); + MPMemBlock<T> *blocks = NULL; + while(stackWas){ + if (stackWas->bottomOfBlock){ + if (blocks) { + blocks->next = stackWas; + } + blocks = stackWas; + } + stackWas = (MPMemBlock<T> *)(stackWas->next); + } + while(blocks) + { + stackWas = (MPMemBlock<T> *)blocks->next; + MyAllocator.Deallocate(blocks); + blocks = stackWas; + } + } + //all memory allocated must be Deallocated before Clear() or the destructor is called + ~MPMarkFreeListAllocator() + { + Clear(); + } +}; +template <typename T, typename BLOCK_ALLOCATOR> +struct MPCountFreeListAllocator +{ + MPCountStack data; + + typedef MPCountFreeListAllocator<T,BLOCK_ALLOCATOR> AllocatorType; + + BLOCK_ALLOCATOR & MyAllocator; + + MPCountFreeListAllocator(BLOCK_ALLOCATOR &source) + :MyAllocator(source) + {} + + int ReserveThreadBit(){return 1;} + int BlockingReserveThreadBit(){return 1;} + void ReturnThreadBit(int){ } + + int Size() const { return sizeof(T); } + void AddBlock() + { + int blockSize = MyAllocator.Size(); + int elementSize = sizeof(MPMemBlock<T>); + assert( MyAllocator.Size() >= elementSize); + MPMemBlock<T> *bottom = (MPMemBlock<T> *)MyAllocator.Allocate(); + void *prev = 0; + MPMemBlock<T> *top = bottom; + do { + top->bottomOfBlock = 0; + top->next = prev; + prev = (void *)top; + ++top; + }while( (blockSize-=elementSize) >= elementSize); + bottom->bottomOfBlock = 1; + data.PushList(top-1,bottom); + } + void *Allocate(int) + { + return Allocate(); + } + void *Allocate() + { + MPMemBlock<T> *ret; + for(;;) { + ret = (MPMemBlock<T> *)data.PopElement(); + if (ret!=NULL) return &ret->data; + AddBlock(); + } + } + void Deallocate(void *ob) + { + if (!ob) return; + MPMemBlock<T> *ret = (MPMemBlock<T> *) + ((char *)data - OFFSET_OF_MEMBER(MPMemBlock<T>,ob)); + data.PushElement(ret); + } + //all memory allocated must be Deallocated before Clear() or the destructor is called + void Clear() + { + MPMemBlock<T> *stackWas = (MPMemBlock<T> *)data.ExchangeStack(NULL); + MPMemBlock<T> *blocks = NULL; + while(stackWas){ + if (stackWas->bottomOfBlock){ + if (blocks) { + blocks->next = stackWas; + } + blocks = stackWas; + } + stackWas = (MPMemBlock<T> *)(stackWas->next); + } + while(blocks) + { + stackWas = (MPMemBlock<T> *)blocks->next; + MyAllocator.Deallocate(blocks); + blocks = stackWas; + } + } + //all memory allocated must be Deallocated before Clear() or the destructor is called + ~MPCountFreeListAllocator() + { + Clear(); + } +}; + +struct Counted +{ + mutable AtomicInt refCount; + Counted():refCount(0){} +}; + +//it is NOT safe to read or write from more than one thread at a time +template <typename T> +class CountedPtr +{ + +protected: + T *value; + void decRefCount() + { + decRefCount(value); + } +public: + static void decRefCount(T *ptr) + { + if (ptr && 0 == --ptr->refCount){ + delete ptr; + } + } + void SetValueIgnoringRefCounts(T *ptr) + { + value = ptr; + } + CountedPtr():letter(NULL){} + + CountedPtr(T *ptr) + { + value = ptr; + if (value) ++value->refCount; + } + + operator const T *() const { return value; } + operator T *() { return value; } + + CountedPtr<T> & operator=(const T *ptr) + { + if (ptr) ++ptr->refCount; + decRefCount(); + value = ptr; + return *this; + } + + operator bool() const + { return value!=NULL; } + + bool operator !() const + { return value==NULL; } + + + const T & operator*() const + { return *value; } + + T & operator*() + { return *value; } + + T * operator->() + { assert(value); return value; } + const T * operator->()const + { assert(value); return value; } + + ~CountedPtr() + { + decRefCount(); + } +}; + +template <typename T> +class AtomicCountedPtr +{ +protected: + mutable AtomicPtrWithCount<T> value; +public: + + + CountedPtr<T> & LoadValue(CountedPtr<T> &dest) const + { +retry: + AtomicPtrWithCount<T>::SimpleUnionType inc; + inc.Value().ptr = 0; + inc.Value().count = 1; + AtomicPtrWithCount<T>::SimpleUnionType ret; + ret.whole = (value.whole+=inc.whole); //increment in ptr + dest = ret.Value().ptr ; //increment in object + AtomicPtrWithCount<T>::SimpleUnionType update; + update.Value().ptr = ret.Value().ptr; + for(;;){ + update.Value().count = ret.Value().count-1; + AtomicPtrWithCount<T>::SimpleUnionType current; + current.whole = value.whole.SetIfEqual(update.whole,ret.whole); + if (current.whole == ret.whole) break; //successfully decremented in ptr + if (current.Value().ptr != ret.Value().ptr) || current.Value().count < 1){ + //because of the line "dest = ret.Value().ptr" above + //the old value will decrement in the prev object as the next object is loaded + goto retry; + } + ret.Value().count = current.Value().count; + } + return dest; + } + + CountedPtr<T> & LoadValue(CountedPtr<T> &dest, int &count) const + { +retry: + AtomicPtrWithCount<T>::SimpleUnionType inc; + inc.Value().ptr = 0; + inc.Value().count = 1; + AtomicPtrWithCount<T>::SimpleUnionType ret; + ret.whole = (value.whole+=inc.whole); //increment in ptr + dest = ret.Value().ptr ; //increment in object + AtomicPtrWithCount<T>::SimpleUnionType update; + update.Value().ptr = ret.Value().ptr; + for(;;){ + update.Value().count = ret.Value().count-1; + AtomicPtrWithCount<T>::SimpleUnionType current; + current.whole = value.whole.SetIfEqual(update.whole,ret.whole); + if (current.whole == ret.whole) break; //successfully decremented in ptr + if (current.Value().ptr != ret.Value().ptr) || current.Value().count < 1){ + //because of the line "dest = ret.Value().ptr" above + //the old value will decrement in the prev object as the next object is loaded + goto retry; + } + ret.Value().count = current.Value().count; + } + count = ret.Value().count; + return dest; + } + + CountedPtr<T> & ExchangeInPlace(CountedPtr<T> &dest) + { + AtomicPtrWithCount<T>::SimpleUnionType destWhole; + destWhole.Value().ptr = dest; + destWhole.Value().count = 0; + destWhole.whole = value.whole.Exchange(destWhole.whole); + if (destWhole.Value().ptr != NULL && destWhole.Value().count != 0) + destWhole.Value().ptr->refCount += destWhole.Value().count; + dest.SetValueIgnoringRefCounts(destWhole.Value().ptr); + return dest; + } + + CountedPtr<T> & Exchange(CountedPtr<T> &dest, T *source) + { + dest = source; + return ExchangeInPlace(dest); + } + + bool CompareExchange(CountedPtr<T> &dest, T *exchange, T * comparend) + { + CountedPtr<T> holdExchange(exchange); +retry: + AtomicPtrWithCount<T>::SimpleUnionType comp; + if (LoadValue(dest,comp.Value().count) != comparend) return false; + comp.Value().ptr = dest; + AtomicPtrWithCount<T>::SimpleUnionType exch; + exch.Value().ptr=exchange; + exch.Value().count = 0; + AtomicPtrWithCount<T>::SimpleUnionType ret; + for (;;){ + ret.whole = value.whole.CompareExchange(exch.whole,comp.whole); + if (ret.whole == comp.whole) { + //transfer increment from holdExchange to this + holdExchange.SetValueIgnoringRefCounts(NULL); + //had inc from Load and the one from this + if (dest) { + const int dec = 1-comp.Value().count; + if (dec!=0) dest->refCount -= dec; + } + return true; + } + if (ret.Value().ptr != comp.Value().ptr) { + //cant return the new pointer because there's no + //reason to think it hasn't been collected already + goto retry; + } + comp.Value().count = ret.Value().count; + } + } + + bool SetIfEqual(T *exchange, T * comparend) + { + CountedPtr<T> holdExchange(exchange); +retry: + AtomicPtrWithCount<T>::SimpleUnionType comp; + comp.whole = value.whole; + if (comp.Value().ptr != comparend) return false; + AtomicPtrWithCount<T>::SimpleUnionType exch; + exch.Value().ptr=exchange; + exch.Value().count = 0; + AtomicPtrWithCount<T>::SimpleUnionType ret; + for (;;){ + ret.whole = value.whole.CompareExchange(exch.whole,comp.whole); + if (ret.whole == comp.whole) { + if (comp.Value().ptr) { + const int dec = 1-comp.Value().count; + if (dec!=0 && 0==(comp.Value().ptr->refCount -= dec)){ + delete comp.Value().ptr; + }; + } + //transfer increment from holdExchange to this + holdExchange.SetValueIgnoringRefCounts(NULL); + return true; + } + if (ret.Value().ptr != comp.Value().ptr) { + return false; + } + comp.Value().count = ret.Value().count; + } + } + + void operator = (const T *ptr) + { + CountedPtr<T> dest(ptr); + ExchangeInPlace(dest); + } + + //not recommended because value won't be consistant throughout + //a given expression + operator bool() const + { return value.Value().ptr!=NULL; } + + //not recommended because value won't be consistant throughout + //a given expression + bool operator !() const + { return value.Value().ptr==NULL; } + + + AtomicCountedPtr() + {} + + ~AtomicCountedPtr() + { + *this = (T*)NULL; + } +}; + +class MPQueueBase +{ + AtomicUInt * data; + int len; + + struct AtomicHeadAndTail{ + AtomicInt head; + AtomicInt tail; + }; + + AtomicUnion<AtomicHeadAndTail> headAndTail; + + struct HeadAndTailStruct{ + int head; + int tail; + }; + union HeadAndTailUnion + { + HeadAndTailStruct value; + unsigned __int64 whole; + }; + + AtomicUInt & Index(int i) + { + return data[i & (len-1)]; + } + bool IsNil(int i) + { + return (i & 1) != 0; + } + + public: + + int Used() const + { + HeadAndTailUnion ht; + ht.whole = headAndTail.whole; + return ht.value.head-ht.value.tail; + + } + bool Empty() const + { + HeadAndTailUnion ht; + ht.whole = headAndTail.whole; + return ht.value.head==ht.value.tail; + } + int Available() const + { + return MaxLen()-Used(); + + } + int MaxLen() const + { + return len; + } + + MPQueueBase(int lenLn2) + :len(1<<lenLn2) + { + headAndTail.whole = 0; + data = new AtomicUInt[len]; + for (int i=0;i<len;++i) data[i] = 1; + } + + ~MPQueueBase() + { + delete [] data; + } + + bool Put(int v) + { + assert((v&1)==0); + for(;;){ + HeadAndTailUnion ht; + ht.whole = headAndTail.whole; + if (ht.value.head-ht.value.tail >= len) return false; + + int wasThere = Index(ht.value.head); + + if (IsNil(wasThere)){ + if (Index(ht.value.head).SetIfEqual(v,wasThere)){ + headAndTail.Value().head.SetIfEqual(1+ht.value.head,ht.value.head); + return true; + } + } + headAndTail.Value().head.SetIfEqual(1+ht.value.head,ht.value.head); + } + } + int Get() + { + for(;;){ + HeadAndTailUnion ht; + ht.whole = headAndTail.whole; + if (ht.value.head-ht.value.tail < 1) return 0; + + int wasThere = Index(ht.value.tail); + int newNil = (ht.value.tail|1); + + if (!IsNil(wasThere)){ + if (Index(ht.value.tail).SetIfEqual(newNil,wasThere)){ + headAndTail.Value().tail.SetIfEqual(1+ht.value.tail,ht.value.tail); + return wasThere; + } + } + headAndTail.Value().tail.SetIfEqual(1+ht.value.tail,ht.value.tail); + } + } +}; + +template <typename T> +class MPQueue +{ + MPQueueBase queue; +public: + MPQueue(int lenLn2) + :queue(lenLn2) + {} + T *Get() + { + return (T*)queue.Get(); + } + bool Put(T * v) + { + return queue.Put((int)v); + } + bool Empty() const + { + return queue.Empty(); + } + int Used() const + { + return queue.Used(); + + } + int Available() const + { + return queue.Available(); + + } + int MaxLen() const + { + return queue.MaxLen(); + } +}; + +class QueueBase +{ + unsigned * data; + int len; + + int head; + int tail; + + unsigned & Index(int i) + { + return data[i & (len-1)]; + } + +public: + + int Used() const + { + return head-tail; + + } + bool Empty() const + { + return head==tail; + + } + + int Available() const + { + return MaxLen()-Used(); + + } + int MaxLen() const + { + return len; + } + + QueueBase(int lenLn2) + :len(1<<lenLn2) + ,head(0) + ,tail(0) + { + data = new unsigned[len]; + for (int i=0;i<len;++i) data[i] = 1; + } + + ~QueueBase() + { + delete [] data; + } + + bool Put(int v) + { + if (Available() < 1) return false; + Index(head++) = v; + return true; + } + + int Get() + { + if (Used() < 1) return 0; + return Index(tail++); + } +}; +template <typename T> +class Queue +{ + QueueBase queue; +public: + Queue(int lenLn2) + :queue(lenLn2) + {} + T *Get() + { + return (T*)queue.Get(); + } + bool Put(T * v) + { + return queue.Put((int)v); + } + bool Empty() const + { + return queue.Empty(); + } + int Used() const + { + return queue.Used(); + + } + int Available() const + { + return queue.Available(); + + } + int MaxLen() const + { + return queue.MaxLen(); + } +}; + + +#endif diff --git a/lib/base/cgi.html b/lib/base/cgi.html new file mode 100644 index 000000000..dded002bc --- /dev/null +++ b/lib/base/cgi.html @@ -0,0 +1,486 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<!-- This file is generated by Nimrod. --> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Module cgi</title> +<style type="text/css"> + +span.DecNumber {color: blue} +span.BinNumber {color: blue} +span.HexNumber {color: blue} +span.OctNumber {color: blue} +span.FloatNumber {color: blue} +span.Identifier {color: black} +span.Keyword {font-weight: bold} +span.StringLit {color: blue} +span.LongStringLit {color: blue} +span.CharLit {color: blue} +span.EscapeSequence {color: black} +span.Operator {color: black} +span.Punctation {color: black} +span.Comment, span.LongComment {font-style:italic; color: green} +span.RegularExpression {color: pink} +span.TagStart {color: yellow} +span.TagEnd {color: yellow} +span.Key {color: blue} +span.Value {color: black} +span.RawData {color: blue} +span.Assembler {color: blue} +span.Preprocessor {color: yellow} +span.Directive {color: yellow} +span.Command, span.Rule, span.Hyperlink, span.Label, span.Reference, +span.Other {color: black} + +div.navigation { + float: left; + width: 27%; //25em; + margin: 0; padding: 0; /* + border: 1px dashed gold; */ + outline: 3px outset #7F7F7F; //#99ff99; //gold; + background-color: #7F7F7F; +} + +div.navigation ul {list-style-type: none;} +div.navigation ul li a, div.navigation ul li a:visited { + font-weight: bold; + color: #FFFFFF; // #CC0000; + text-decoration: none; +} +div.navigation ul li a:hover { + font-weight: bold; + text-decoration: none; + /*outline: 2px outset #7F7F7F;*/ + color: gold; + /* background-color: #FFFFFF; // #1A1A1A; // #779977;*/ +} + +div.content { + margin-left: 27%; // 25em; + padding: 0 1em; + /*border: 1px dashed #1A1A1A;*/ + min-width: 16em; +} + +dl.item dd, dl.item dd p { + margin-top:3px; +} +dl.item dd pre { + margin-left: 15pt; + border: 0px; +} +dl.item dt, dl.item dt pre { + margin: 20pt 0 0 0; +} + +pre, span.tok { + background-color:#F9F9F9; + border:1px dotted #2F6FAB; + color:black; +} + +/* +:Author: David Goodger +:Contact: goodger@python.org +:Date: Date: 2006-05-21 22:44:42 +0200 (Sun, 21 May 2006) +:Revision: Revision: 4564 +:Copyright: This stylesheet has been placed in the public domain. + +Default cascading style sheet for the HTML output of Docutils. + +See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to +customize this style sheet. +*/ +/* used to remove borders from tables and images */ +.borderless, table.borderless td, table.borderless th { border: 0 } + +table.borderless td, table.borderless th { + /* Override padding for "table.docutils td" with "! important". + The right padding separates the table cells. */ + padding: 0 0.5em 0 0 ! important } + +.first { margin-top: 0 ! important } +.last, .with-subtitle { margin-bottom: 0 ! important } +.hidden { display: none } +a.toc-backref { text-decoration: none ; color: black } +blockquote.epigraph { margin: 2em 5em ; } +dl.docutils dd { margin-bottom: 0.5em } +div.abstract { margin: 2em 5em } +div.abstract p.topic-title { font-weight: bold ; text-align: center } +div.admonition, div.attention, div.caution, div.danger, div.error, +div.hint, div.important, div.note, div.tip, div.warning { + margin: 2em ; border: medium outset ; padding: 1em } +div.admonition p.admonition-title, div.hint p.admonition-title, +div.important p.admonition-title, div.note p.admonition-title, +div.tip p.admonition-title { font-weight: bold ; font-family: sans-serif } + +div.attention p.admonition-title, div.caution p.admonition-title, +div.danger p.admonition-title, div.error p.admonition-title, +div.warning p.admonition-title { color: red ; font-weight: bold ; + font-family: sans-serif } + +/* Uncomment (and remove this text!) to get reduced vertical space in + compound paragraphs. +div.compound .compound-first, div.compound .compound-middle { + margin-bottom: 0.5em } + +div.compound .compound-last, div.compound .compound-middle { + margin-top: 0.5em } +*/ + +div.dedication { margin: 2em 5em ; text-align: center ; font-style: italic } +div.dedication p.topic-title { font-weight: bold ; font-style: normal } +div.figure { margin-left: 2em ; margin-right: 2em } +div.footer, div.header { clear: both; font-size: smaller } +div.line-block { display: block ; margin-top: 1em ; margin-bottom: 1em } +div.line-block div.line-block { margin-top: 0 ; margin-bottom: 0 ; + margin-left: 1.5em } +div.sidebar { margin-left: 1em ; border: medium outset ; + padding: 1em ; background-color: #ffffee ; width: 40% ; float: right ; + clear: right } + +div.sidebar p.rubric { font-family: sans-serif ; font-size: medium } +div.system-messages { margin: 5em } +div.system-messages h1 { color: red } +div.system-message { border: medium outset ; padding: 1em } +div.system-message p.system-message-title { color: red ; font-weight: bold } +div.topic { margin: 2em;} +h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, +h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { + margin-top: 0.4em } +h1.title { text-align: center } +h2.subtitle { text-align: center } +hr.docutils { width: 75% } +img.align-left { clear: left } +img.align-right { clear: right } +ol.simple, ul.simple { margin-bottom: 1em } +ol.arabic { list-style: decimal } +ol.loweralpha { list-style: lower-alpha } +ol.upperalpha { list-style: upper-alpha } +ol.lowerroman { list-style: lower-roman } +ol.upperroman { list-style: upper-roman } +p.attribution { text-align: right ; margin-left: 50% } +p.caption { font-style: italic } +p.credits { font-style: italic ; font-size: smaller } +p.label { white-space: nowrap } +p.rubric { font-weight:bold;font-size:larger;color:maroon;text-align:center} +p.sidebar-title {font-family: sans-serif ;font-weight: bold ;font-size: larger } +p.sidebar-subtitle {font-family: sans-serif ; font-weight: bold } +p.topic-title { font-weight: bold } +pre.address { margin-bottom: 0;margin-top:0;font-family:serif;font-size:100% } +pre.literal-block, pre.doctest-block {margin-left: 2em ;margin-right: 2em } +span.classifier {font-family: sans-serif;font-style: oblique } +span.classifier-delimiter {font-family: sans-serif;font-weight: bold } +span.interpreted {font-family: sans-serif } +span.option {white-space: nowrap } +span.pre {white-space: pre } +span.problematic {color: red } +span.section-subtitle { + /* font-size relative to parent (h1..h6 element) */ + font-size: 80% } + +table.citation { border-left: solid 1px gray; margin-left: 1px } +table.docinfo {margin: 2em 4em } +table.docutils {margin-top: 0.5em;margin-bottom: 0.5em } +table.footnote {border-left: solid 1px black;margin-left: 1px } + +table.docutils td, table.docutils th, +table.docinfo td, table.docinfo th {padding-left: 0.5em;padding-right: 0.5em; + vertical-align: top} + +table.docutils th.field-name, table.docinfo th.docinfo-name { + font-weight: bold;text-align: left;white-space: nowrap;padding-left: 0 } +h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, +h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {font-size: 100% } +ul.auto-toc { list-style-type: none } +/*a.reference { color: #E00000; font-weight:bold;} +a.reference:hover {color: #E00000;background-color: #ffff00;display: margin; + font-weight:bold;}*/ + +</style> +<script type="text/javascript"> + //<![CDATA[ + function toggleElem(id) { + var e = document.getElementById(id); + e.style.display = e.style.display == 'none' ? 'block' : 'none'; + } + + var gOpen = 'none' + function toggleAll() { + gOpen = gOpen == 'none' ? 'block' : 'none'; + var i = 1 + while (1) { + var e = document.getElementById("m"+i) + if (!e) break; + e.style.display = gOpen + i++; + } + document.getElementById('toggleButton').value = + gOpen == 'none' ? 'Show Details' : 'Hide Details'; + } + //]]> +</script> + +</head> +<body> +<div class="document" id="documentId"> +<h1 class="title">Module cgi</h1> +<div class="navigation"> +<p class="topic-title first">Navigation</p> +<ul class="simple"> +<li> + <a class="reference" href="#6" id="56">Types</a> + <ul class="simple"> + <li><a class="reference" href="#103">ECgi</a></li> + <li><a class="reference" href="#104">TRequestMethod</a></li> + + </ul> +</li> +<li> + <a class="reference" href="#9" id="59">Procs</a> + <ul class="simple"> + <li><a class="reference" href="#101">URLencode</a></li> + <li><a class="reference" href="#102">URLdecode</a></li> + <li><a class="reference" href="#105">readData</a></li> + <li><a class="reference" href="#106">validateData</a></li> + <li><a class="reference" href="#107">getContentLength</a></li> + <li><a class="reference" href="#108">getContentType</a></li> + <li><a class="reference" href="#109">getDocumentRoot</a></li> + <li><a class="reference" href="#110">getGatewayInterface</a></li> + <li><a class="reference" href="#111">getHttpAccept</a></li> + <li><a class="reference" href="#112">getHttpAcceptCharset</a></li> + <li><a class="reference" href="#113">getHttpAccept Encoding</a></li> + <li><a class="reference" href="#114">getHttpAccept Language</a></li> + <li><a class="reference" href="#115">getHttpConnection</a></li> + <li><a class="reference" href="#116">getHttpCookie</a></li> + <li><a class="reference" href="#117">getHttpHost</a></li> + <li><a class="reference" href="#118">getHttpReferer</a></li> + <li><a class="reference" href="#119">getHttpUserAgent</a></li> + <li><a class="reference" href="#120">getPathInfo</a></li> + <li><a class="reference" href="#121">getPathTranslated</a></li> + <li><a class="reference" href="#122">getQueryString</a></li> + <li><a class="reference" href="#123">getRemoteAddr</a></li> + <li><a class="reference" href="#124">getRemoteHost</a></li> + <li><a class="reference" href="#125">getRemoteIdent</a></li> + <li><a class="reference" href="#126">getRemotePort</a></li> + <li><a class="reference" href="#127">getRemoteUser</a></li> + <li><a class="reference" href="#128">getRequestMethod</a></li> + <li><a class="reference" href="#129">getRequestURI</a></li> + <li><a class="reference" href="#130">getScriptFilename</a></li> + <li><a class="reference" href="#131">getScriptName</a></li> + <li><a class="reference" href="#132">getServerAddr</a></li> + <li><a class="reference" href="#133">getServerAdmin</a></li> + <li><a class="reference" href="#134">getServerName</a></li> + <li><a class="reference" href="#135">getServerPort</a></li> + <li><a class="reference" href="#136">getServerProtocol</a></li> + <li><a class="reference" href="#137">getServerSignature</a></li> + <li><a class="reference" href="#138">getServerSoftware</a></li> + <li><a class="reference" href="#139">setTestData</a></li> + <li><a class="reference" href="#140">writeContentType</a></li> + + </ul> +</li> + +</ul> +</div> +<div class="content"> +This module implements helper procs for CGI applictions. Example:<pre> +<span class="Keyword">import</span> <span class="Identifier">strtabs</span><span class="Punctation">,</span> <span class="Identifier">cgi</span> + +<span class="Comment"># Fill the values when debugging:</span> +<span class="Keyword">when</span> <span class="Identifier">debug</span><span class="Punctation">:</span> + <span class="Identifier">setTestData</span><span class="Punctation">(</span><span class="StringLit">"name"</span><span class="Punctation">,</span> <span class="StringLit">"Klaus"</span><span class="Punctation">,</span> <span class="StringLit">"password"</span><span class="Punctation">,</span> <span class="StringLit">"123456"</span><span class="Punctation">)</span> +<span class="Comment"># read the data into `myData`</span> +<span class="Keyword">var</span> <span class="Identifier">myData</span> <span class="Operator">=</span> <span class="Identifier">readData</span><span class="Punctation">(</span><span class="Punctation">)</span> +<span class="Comment"># check that the data's variable names are "name" or "passwort"</span> +<span class="Identifier">validateData</span><span class="Punctation">(</span><span class="Identifier">myData</span><span class="Punctation">,</span> <span class="StringLit">"name"</span><span class="Punctation">,</span> <span class="StringLit">"password"</span><span class="Punctation">)</span> +<span class="Comment"># start generating content:</span> +<span class="Identifier">writeContentType</span><span class="Punctation">(</span><span class="Punctation">)</span> +<span class="Comment"># generate content:</span> +<span class="Identifier">write</span><span class="Punctation">(</span><span class="Identifier">stdout</span><span class="Punctation">,</span> <span class="StringLit">"<!DOCTYPE HTML PUBLIC </span><span class="EscapeSequence">\"</span>-//W3C//DTD HTML 4.01//EN<span class="EscapeSequence">\"</span><span class="EscapeSequence">>\n</span><span class="StringLit">"</span><span class="Punctation">)</span> +<span class="Identifier">write</span><span class="Punctation">(</span><span class="Identifier">stdout</span><span class="Punctation">,</span> <span class="StringLit">"<html><head><title>Test</title></head><body></span><span class="EscapeSequence">\n</span><span class="StringLit">"</span><span class="Punctation">)</span> +<span class="Identifier">writeln</span><span class="Punctation">(</span><span class="Identifier">stdout</span><span class="Punctation">,</span> <span class="StringLit">"your name: "</span> <span class="Operator">&</span> <span class="Identifier">myData</span><span class="Punctation">[</span><span class="StringLit">"name"</span><span class="Punctation">]</span><span class="Punctation">)</span> +<span class="Identifier">writeln</span><span class="Punctation">(</span><span class="Identifier">stdout</span><span class="Punctation">,</span> <span class="StringLit">"your password: "</span> <span class="Operator">&</span> <span class="Identifier">myData</span><span class="Punctation">[</span><span class="StringLit">"password"</span><span class="Punctation">]</span><span class="Punctation">)</span> +<span class="Identifier">writeln</span><span class="Punctation">(</span><span class="Identifier">stdout</span><span class="Punctation">,</span> <span class="StringLit">"</body></html>"</span><span class="Punctation">)</span></pre> +<div class="section" id="6"> +<h1><a class="toc-backref" href="#56">Types</a></h1> +<dl class="item"> +<dt id="103"><pre><span class="Identifier">ECgi</span><span class="Operator">*</span> <span class="Other">=</span> <span class="Keyword">object</span> <span class="Keyword">of</span> <span class="Identifier">EIO</span></pre></dt> +<dd> +the exception that is raised, if a CGI error occurs +</dd> +<dt id="104"><pre><span class="Identifier">TRequestMethod</span><span class="Operator">*</span> <span class="Other">=</span> <span class="Keyword">enum</span> + <span class="Identifier">methodPost</span><span class="Other">,</span> <span class="Comment">## query uses the POST method</span> + <span class="Identifier">methodGet</span> <span class="Comment">## query uses the GET method</span></pre></dt> +<dd> +the used request method +</dd> + +</dl></div> +<div class="section" id="9"> +<h1><a class="toc-backref" href="#59">Procs</a></h1> +<dl class="item"> +<dt id="101"><pre><span class="Keyword">proc</span> <span class="Identifier">URLencode</span><span class="Operator">*</span><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +Encodes a value to be HTTP safe: This means that characters in the set <tt class="docutils literal"><span class="pre">{'A'..'Z', 'a'..'z', '0'..'9', '_'}</span></tt> are carried over to the result, a space is converted to <tt class="docutils literal"><span class="pre">'+'</span></tt> and every other character is encoded as <tt class="docutils literal"><span class="pre">'%xx'</span></tt> where <tt class="docutils literal"><span class="pre">xx</span></tt> denotes its hexadecimal value. +</dd> +<dt id="102"><pre><span class="Keyword">proc</span> <span class="Identifier">URLdecode</span><span class="Operator">*</span><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +Decodes a value from its HTTP representation: This means that a <tt class="docutils literal"><span class="pre">'+'</span></tt> is converted to a space, <tt class="docutils literal"><span class="pre">'%xx'</span></tt> (where <tt class="docutils literal"><span class="pre">xx</span></tt> denotes a hexadecimal value) is converted to the character with ordinal number <tt class="docutils literal"><span class="pre">xx</span></tt>, and and every other character is carried over. +</dd> +<dt id="105"><pre><span class="Keyword">proc</span> <span class="Identifier">readData</span><span class="Operator">*</span><span class="Other">(</span><span class="Identifier">allowedMethods</span><span class="Other">:</span> <span class="Identifier">set</span><span class="Other">[</span><span class="Identifier">TRequestMethod</span><span class="Other">]</span> <span class="Other">=</span> <span class="Other">{</span><span class="Identifier">methodPost</span><span class="Other">,</span> <span class="Identifier">methodGet</span><span class="Other">}</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">PStringTable</span></pre></dt> +<dd> +Read CGI data. If the client does not use a method listed in the <cite>allowedMethods</cite> set, an <cite>ECgi</cite> exception is raised. +</dd> +<dt id="106"><pre><span class="Keyword">proc</span> <span class="Identifier">validateData</span><span class="Operator">*</span><span class="Other">(</span><span class="Identifier">data</span><span class="Other">:</span> <span class="Identifier">PStringTable</span><span class="Other">,</span> <span class="Identifier">validKeys</span><span class="Other">:</span> <span class="Identifier">openarray</span><span class="Other">[</span><span class="Identifier">string</span><span class="Other">]</span><span class="Other">)</span></pre></dt> +<dd> +validates data; raises <cite>ECgi</cite> if this fails. This checks that each variable name of the CGI <cite>data</cite> occurs in the <cite>validKeys</cite> array. +</dd> +<dt id="107"><pre><span class="Keyword">proc</span> <span class="Identifier">getContentLength</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">CONTENT_LENGTH</span></tt> environment variable +</dd> +<dt id="108"><pre><span class="Keyword">proc</span> <span class="Identifier">getContentType</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">CONTENT_TYPE</span></tt> environment variable +</dd> +<dt id="109"><pre><span class="Keyword">proc</span> <span class="Identifier">getDocumentRoot</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">DOCUMENT_ROOT</span></tt> environment variable +</dd> +<dt id="110"><pre><span class="Keyword">proc</span> <span class="Identifier">getGatewayInterface</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">GATEWAY_INTERFACE</span></tt> environment variable +</dd> +<dt id="111"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpAccept</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">HTTP_ACCEPT</span></tt> environment variable +</dd> +<dt id="112"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpAcceptCharset</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">HTTP_ACCEPT_CHARSET</span></tt> environment variable +</dd> +<dt id="113"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpAcceptEncoding</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">HTTP_ACCEPT_ENCODING</span></tt> environment variable +</dd> +<dt id="114"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpAcceptLanguage</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">HTTP_ACCEPT_LANGUAGE</span></tt> environment variable +</dd> +<dt id="115"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpConnection</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">HTTP_CONNECTION</span></tt> environment variable +</dd> +<dt id="116"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpCookie</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">HTTP_COOKIE</span></tt> environment variable +</dd> +<dt id="117"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpHost</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">HTTP_HOST</span></tt> environment variable +</dd> +<dt id="118"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpReferer</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">HTTP_REFERER</span></tt> environment variable +</dd> +<dt id="119"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpUserAgent</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">HTTP_USER_AGENT</span></tt> environment variable +</dd> +<dt id="120"><pre><span class="Keyword">proc</span> <span class="Identifier">getPathInfo</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">PATH_INFO</span></tt> environment variable +</dd> +<dt id="121"><pre><span class="Keyword">proc</span> <span class="Identifier">getPathTranslated</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">PATH_TRANSLATED</span></tt> environment variable +</dd> +<dt id="122"><pre><span class="Keyword">proc</span> <span class="Identifier">getQueryString</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">QUERY_STRING</span></tt> environment variable +</dd> +<dt id="123"><pre><span class="Keyword">proc</span> <span class="Identifier">getRemoteAddr</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">REMOTE_ADDR</span></tt> environment variable +</dd> +<dt id="124"><pre><span class="Keyword">proc</span> <span class="Identifier">getRemoteHost</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">REMOTE_HOST</span></tt> environment variable +</dd> +<dt id="125"><pre><span class="Keyword">proc</span> <span class="Identifier">getRemoteIdent</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">REMOTE_IDENT</span></tt> environment variable +</dd> +<dt id="126"><pre><span class="Keyword">proc</span> <span class="Identifier">getRemotePort</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">REMOTE_PORT</span></tt> environment variable +</dd> +<dt id="127"><pre><span class="Keyword">proc</span> <span class="Identifier">getRemoteUser</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">REMOTE_USER</span></tt> environment variable +</dd> +<dt id="128"><pre><span class="Keyword">proc</span> <span class="Identifier">getRequestMethod</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">REQUEST_METHOD</span></tt> environment variable +</dd> +<dt id="129"><pre><span class="Keyword">proc</span> <span class="Identifier">getRequestURI</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">REQUEST_URI</span></tt> environment variable +</dd> +<dt id="130"><pre><span class="Keyword">proc</span> <span class="Identifier">getScriptFilename</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">SCRIPT_FILENAME</span></tt> environment variable +</dd> +<dt id="131"><pre><span class="Keyword">proc</span> <span class="Identifier">getScriptName</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">SCRIPT_NAME</span></tt> environment variable +</dd> +<dt id="132"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerAddr</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">SERVER_ADDR</span></tt> environment variable +</dd> +<dt id="133"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerAdmin</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">SERVER_ADMIN</span></tt> environment variable +</dd> +<dt id="134"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerName</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">SERVER_NAME</span></tt> environment variable +</dd> +<dt id="135"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerPort</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">SERVER_PORT</span></tt> environment variable +</dd> +<dt id="136"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerProtocol</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">SERVER_PROTOCOL</span></tt> environment variable +</dd> +<dt id="137"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerSignature</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">SERVER_SIGNATURE</span></tt> environment variable +</dd> +<dt id="138"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerSoftware</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> +<dd> +returns contents of the <tt class="docutils literal"><span class="pre">SERVER_SOFTWARE</span></tt> environment variable +</dd> +<dt id="139"><pre><span class="Keyword">proc</span> <span class="Identifier">setTestData</span><span class="Operator">*</span><span class="Other">(</span><span class="Identifier">keysvalues</span><span class="Other">:</span> <span class="Identifier">openarray</span><span class="Other">[</span><span class="Identifier">string</span><span class="Other">]</span><span class="Other">)</span></pre></dt> +<dd> +fills the appropriate environment variables to test your CGI application. This can only simulate the 'GET' 'REQUEST_METHOD'. <cite>keysvalues</cite> should provide embedded (name, value)-pairs. Example:<pre><span class="Identifier">setTestData</span><span class="Punctation">(</span><span class="StringLit">"name"</span><span class="Punctation">,</span> <span class="StringLit">"Hanz"</span><span class="Punctation">,</span> <span class="StringLit">"password"</span><span class="Punctation">,</span> <span class="StringLit">"12345"</span><span class="Punctation">)</span></pre> +</dd> +<dt id="140"><pre><span class="Keyword">proc</span> <span class="Identifier">writeContentType</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span></pre></dt> +<dd> +call this before starting to send your HTML data to <cite>stdout</cite>. This is just a shorthand for: .. code-block:: Nimrod<blockquote>write(stdout, "Content-type: text/htmlnn")</blockquote> + +</dd> + +</dl></div> + +</div> + +<small>Generated: 2008-12-08 20:29:49 UTC</small> +</div> +</body> +</html> diff --git a/lib/base/cgi.nim b/lib/base/cgi.nim new file mode 100644 index 000000000..3ed94c9b7 --- /dev/null +++ b/lib/base/cgi.nim @@ -0,0 +1,305 @@ +# +# +# Nimrod's Runtime Library +# (c) Copyright 2008 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +## This module implements helper procs for CGI applictions. Example: +## +## .. code-block:: Nimrod +## +## import strtabs, cgi +## +## # Fill the values when debugging: +## when debug: +## setTestData("name", "Klaus", "password", "123456") +## # read the data into `myData` +## var myData = readData() +## # check that the data's variable names are "name" or "passwort" +## validateData(myData, "name", "password") +## # start generating content: +## writeContentType() +## # generate content: +## write(stdout, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n") +## write(stdout, "<html><head><title>Test</title></head><body>\n") +## writeln(stdout, "your name: " & myData["name"]) +## writeln(stdout, "your password: " & myData["password"]) +## writeln(stdout, "</body></html>") + +import strutils, os, strtabs + +proc URLencode*(s: string): string = + ## Encodes a value to be HTTP safe: This means that characters in the set + ## ``{'A'..'Z', 'a'..'z', '0'..'9', '_'}`` are carried over to the result, + ## a space is converted to ``'+'`` and every other character is encoded as + ## ``'%xx'`` where ``xx`` denotes its hexadecimal value. + result = "" + for i in 0..s.len-1: + case s[i] + of 'a'..'z', 'A'..'Z', '0'..'9', '_': add(result, s[i]) + of ' ': add(result, '+') + else: + add(result, '%') + add(result, toHex(ord(s[i]), 2)) + +proc handleHexChar(c: char, x: var int) {.inline.} = + case c + of '0'..'9': x = (x shl 4) or (ord(c) - ord('0')) + of 'a'..'f': x = (x shl 4) or (ord(c) - ord('a') + 10) + of 'A'..'F': x = (x shl 4) or (ord(c) - ord('A') + 10) + else: assert(false) + +proc URLdecode*(s: string): string = + ## Decodes a value from its HTTP representation: This means that a ``'+'`` + ## is converted to a space, ``'%xx'`` (where ``xx`` denotes a hexadecimal + ## value) is converted to the character with ordinal number ``xx``, and + ## and every other character is carried over. + result = "" + var i = 0 + while i < s.len: + case s[i] + of '%': + var x = 0 + handleHexChar(s[i+1], x) + handleHexChar(s[i+2], x) + inc(i, 2) + add(result, chr(x)) + of '+': add(result, ' ') + else: add(result, s[i]) + inc(i) + +type + ECgi* = object of EIO ## the exception that is raised, if a CGI error occurs + TRequestMethod* = enum ## the used request method + methodPost, ## query uses the POST method + methodGet ## query uses the GET method + +proc cgiError(msg: string) {.noreturn.} = + var e: ref ECgi + new(e) + e.msg = msg + raise e + +proc readData*(allowedMethods: set[TRequestMethod] = + {methodPost, methodGet}): PStringTable = + ## Read CGI data. If the client does not use a method listed in the + ## `allowedMethods` set, an `ECgi` exception is raised. + result = newStringTable() + var enc: string # encoded data + case getenv("REQUEST_METHOD") + of "POST": + if methodPost notin allowedMethods: + cgiError("'REQUEST_METHOD' 'POST' is not supported") + # read from stdin: + var L = parseInt(getenv("CONTENT_LENGTH")) + enc = newString(L) + if readBuffer(stdin, addr(enc[0]), L) != L: + cgiError("cannot read from stdin") + of "GET": + if methodGet notin allowedMethods: + cgiError("'REQUEST_METHOD' 'GET' is not supported") + # read from the QUERY_STRING environment variable: + enc = getenv("QUERY_STRING") + else: cgiError("'REQUEST_METHOD' must be 'POST' or 'GET'") + + # decode everything in one pass: + var i = 0 + var name = "" + var value = "" + while true: + setLen(name, 0) # reuse memory + while true: + case enc[i] + of '\0': return + of '%': + var x = 0 + handleHexChar(enc[i+1], x) + handleHexChar(enc[i+2], x) + inc(i, 2) + add(name, chr(x)) + of '+': add(name, ' ') + of '=', '&': break + else: add(name, enc[i]) + inc(i) + if enc[i] != '=': cgiError("'=' expected") + inc(i) # skip '=' + setLen(value, 0) # reuse memory + while true: + case enc[i] + of '\0': return + of '%': + var x = 0 + handleHexChar(enc[i+1], x) + handleHexChar(enc[i+2], x) + inc(i, 2) + add(value, chr(x)) + of '+': add(value, ' ') + of '=', '&': break + else: add(value, enc[i]) + inc(i) + if enc[i] != '&': cgiError("'&' expected") + inc(i) # skip '=' + result[name] = value + +proc validateData*(data: PStringTable, validKeys: openarray[string]) = + ## validates data; raises `ECgi` if this fails. This checks that each variable + ## name of the CGI `data` occurs in the `validKeys` array. + for key, val in pairs(data): + if find(validKeys, key) < 0: + cgiError("unknown variable name: " & key) + +proc getContentLength*(): string = + ## returns contents of the ``CONTENT_LENGTH`` environment variable + return getenv("CONTENT_LENGTH") + +proc getContentType*(): string = + ## returns contents of the ``CONTENT_TYPE`` environment variable + return getenv("CONTENT_Type") + +proc getDocumentRoot*(): string = + ## returns contents of the ``DOCUMENT_ROOT`` environment variable + return getenv("DOCUMENT_ROOT") + +proc getGatewayInterface*(): string = + ## returns contents of the ``GATEWAY_INTERFACE`` environment variable + return getenv("GATEWAY_INTERFACE") + +proc getHttpAccept*(): string = + ## returns contents of the ``HTTP_ACCEPT`` environment variable + return getenv("HTTP_ACCEPT") + +proc getHttpAcceptCharset*(): string = + ## returns contents of the ``HTTP_ACCEPT_CHARSET`` environment variable + return getenv("HTTP_ACCEPT_CHARSET") + +proc getHttpAcceptEncoding*(): string = + ## returns contents of the ``HTTP_ACCEPT_ENCODING`` environment variable + return getenv("HTTP_ACCEPT_ENCODING") + +proc getHttpAcceptLanguage*(): string = + ## returns contents of the ``HTTP_ACCEPT_LANGUAGE`` environment variable + return getenv("HTTP_ACCEPT_LANGUAGE") + +proc getHttpConnection*(): string = + ## returns contents of the ``HTTP_CONNECTION`` environment variable + return getenv("HTTP_CONNECTION") + +proc getHttpCookie*(): string = + ## returns contents of the ``HTTP_COOKIE`` environment variable + return getenv("HTTP_COOKIE") + +proc getHttpHost*(): string = + ## returns contents of the ``HTTP_HOST`` environment variable + return getenv("HTTP_HOST") + +proc getHttpReferer*(): string = + ## returns contents of the ``HTTP_REFERER`` environment variable + return getenv("HTTP_REFERER") + +proc getHttpUserAgent*(): string = + ## returns contents of the ``HTTP_USER_AGENT`` environment variable + return getenv("HTTP_USER_AGENT") + +proc getPathInfo*(): string = + ## returns contents of the ``PATH_INFO`` environment variable + return getenv("PATH_INFO") + +proc getPathTranslated*(): string = + ## returns contents of the ``PATH_TRANSLATED`` environment variable + return getenv("PATH_TRANSLATED") + +proc getQueryString*(): string = + ## returns contents of the ``QUERY_STRING`` environment variable + return getenv("QUERY_STRING") + +proc getRemoteAddr*(): string = + ## returns contents of the ``REMOTE_ADDR`` environment variable + return getenv("REMOTE_ADDR") + +proc getRemoteHost*(): string = + ## returns contents of the ``REMOTE_HOST`` environment variable + return getenv("REMOTE_HOST") + +proc getRemoteIdent*(): string = + ## returns contents of the ``REMOTE_IDENT`` environment variable + return getenv("REMOTE_IDENT") + +proc getRemotePort*(): string = + ## returns contents of the ``REMOTE_PORT`` environment variable + return getenv("REMOTE_PORT") + +proc getRemoteUser*(): string = + ## returns contents of the ``REMOTE_USER`` environment variable + return getenv("REMOTE_USER") + +proc getRequestMethod*(): string = + ## returns contents of the ``REQUEST_METHOD`` environment variable + return getenv("REQUEST_METHOD") + +proc getRequestURI*(): string = + ## returns contents of the ``REQUEST_URI`` environment variable + return getenv("REQUEST_URI") + +proc getScriptFilename*(): string = + ## returns contents of the ``SCRIPT_FILENAME`` environment variable + return getenv("SCRIPT_FILENAME") + +proc getScriptName*(): string = + ## returns contents of the ``SCRIPT_NAME`` environment variable + return getenv("SCRIPT_NAME") + +proc getServerAddr*(): string = + ## returns contents of the ``SERVER_ADDR`` environment variable + return getenv("SERVER_ADDR") + +proc getServerAdmin*(): string = + ## returns contents of the ``SERVER_ADMIN`` environment variable + return getenv("SERVER_ADMIN") + +proc getServerName*(): string = + ## returns contents of the ``SERVER_NAME`` environment variable + return getenv("SERVER_NAME") + +proc getServerPort*(): string = + ## returns contents of the ``SERVER_PORT`` environment variable + return getenv("SERVER_PORT") + +proc getServerProtocol*(): string = + ## returns contents of the ``SERVER_PROTOCOL`` environment variable + return getenv("SERVER_PROTOCOL") + +proc getServerSignature*(): string = + ## returns contents of the ``SERVER_SIGNATURE`` environment variable + return getenv("SERVER_SIGNATURE") + +proc getServerSoftware*(): string = + ## returns contents of the ``SERVER_SOFTWARE`` environment variable + return getenv("SERVER_SOFTWARE") + +proc setTestData*(keysvalues: openarray[string]) = + ## fills the appropriate environment variables to test your CGI application. + ## This can only simulate the 'GET' 'REQUEST_METHOD'. `keysvalues` should + ## provide embedded (name, value)-pairs. Example: + ## + ## .. code-block:: Nimrod + ## setTestData("name", "Hanz", "password", "12345") + putenv("REQUEST_METHOD", "GET") + var i = 0 + var query = "" + while i < keysvalues.len: + add(query, URLencode(keysvalues[i])) + add(query, '=') + add(query, URLencode(keysvalues[i+1])) + add(query, '&') + inc(i, 2) + putenv("QUERY_STRING", query) + +proc writeContentType*() = + ## call this before starting to send your HTML data to `stdout`. This + ## is just a shorthand for: + ## .. code-block:: Nimrod + ## write(stdout, "Content-type: text/html\n\n") + write(stdout, "Content-type: text/html\n\n") diff --git a/lib/base/devel/FGInt.pas b/lib/base/devel/FGInt.pas deleted file mode 100644 index 7cb5a8516..000000000 --- a/lib/base/devel/FGInt.pas +++ /dev/null @@ -1,2199 +0,0 @@ -{License, info, etc - ------------------ - -This implementation is made by me, Walied Othman, to contact me -mail to Walied.Othman@belgacom.net or Triade@ulyssis.org, -always mention wether it 's about the FGInt for Delphi or for -FreePascal, or wether it 's about the 6xs, preferably in the subject line. -If you 're going to use these implementations, at least mention my -name or something and notify me so I may even put a link on my page. -This implementation is freeware and according to the coderpunks' -manifesto it should remain so, so don 't use these implementations -in commercial software. Encryption, as a tool to ensure privacy -should be free and accessible for anyone. If you plan to use these -implementations in a commercial application, contact me before -doing so, that way you can license the software to use it in commercial -Software. If any algorithm is patented in your country, you should -acquire a license before using this software. Modified versions of this -software must contain an acknowledgement of the original author (=me). -This implementation is available at -http://triade.studentenweb.org - -copyright 2000, Walied Othman -This header may not be removed. -} - -Unit FGInt; - -{$H+} - -Interface - -Uses SysUtils, Math; - -Type - TCompare = (Lt, St, Eq, Er); - TSign = (negative, positive); - TFGInt = Record - Sign : TSign; - Number : Array Of LongWord; - End; - -Procedure zeronetochar8(Var g : char; Const x : String); -Procedure zeronetochar6(Var g : integer; Const x : String); -Procedure initialize8(Var trans : Array Of String); -Procedure initialize6(Var trans : Array Of String); -Procedure initialize6PGP(Var trans : Array Of String); -Procedure ConvertBase256to64(Const str256 : String; Var str64 : String); -Procedure ConvertBase64to256(Const str64 : String; Var str256 : String); -Procedure ConvertBase256to2(Const str256 : String; Var str2 : String); -Procedure ConvertBase64to2(Const str64 : String; Var str2 : String); -Procedure ConvertBase2to256(str2 : String; Var str256 : String); -Procedure ConvertBase2to64(str2 : String; Var str64 : String); -Procedure ConvertBase256StringToHexString(Str256 : String; Var HexStr : String); -Procedure ConvertHexStringToBase256String(HexStr : String; Var Str256 : String); -Procedure PGPConvertBase256to64(Var str256, str64 : String); -Procedure PGPConvertBase64to256(str64 : String; Var str256 : String); -Procedure PGPConvertBase64to2(str64 : String; Var str2 : String); -Procedure FGIntToBase2String(Const FGInt : TFGInt; Var S : String); -Procedure Base2StringToFGInt(S : String; Var FGInt : TFGInt); -Procedure FGIntToBase256String(Const FGInt : TFGInt; Var str256 : String); -Procedure Base256StringToFGInt(str256 : String; Var FGInt : TFGInt); -Procedure PGPMPIToFGInt(PGPMPI : String; Var FGInt : TFGInt); -Procedure FGIntToPGPMPI(FGInt : TFGInt; Var PGPMPI : String); -Procedure Base10StringToFGInt(Base10 : String; Var FGInt : TFGInt); -Procedure FGIntToBase10String(Const FGInt : TFGInt; Var Base10 : String); -Procedure FGIntDestroy(Var FGInt : TFGInt); -Function FGIntCompareAbs(Const FGInt1, FGInt2 : TFGInt) : TCompare; -Procedure FGIntAdd(Const FGInt1, FGInt2 : TFGInt; Var Sum : TFGInt); -Procedure FGIntChangeSign(Var FGInt : TFGInt); -Procedure FGIntSub(Var FGInt1, FGInt2, dif : TFGInt); -Procedure FGIntMulByInt(Const FGInt : TFGInt; Var res : TFGInt; by : LongWord); -Procedure FGIntMulByIntbis(Var FGInt : TFGInt; by : LongWord); -Procedure FGIntDivByInt(Const FGInt : TFGInt; Var res : TFGInt; by : LongWord; Var modres : LongWord); -Procedure FGIntDivByIntBis(Var FGInt : TFGInt; by : LongWord; Var modres : LongWord); -Procedure FGIntModByInt(Const FGInt : TFGInt; by : LongWord; Var modres : LongWord); -Procedure FGIntAbs(Var FGInt : TFGInt); -Procedure FGIntCopy(Const FGInt1 : TFGInt; Var FGInt2 : TFGInt); -Procedure FGIntShiftLeft(Var FGInt : TFGInt); -Procedure FGIntShiftRight(Var FGInt : TFGInt); -Procedure FGIntShiftRightBy31(Var FGInt : TFGInt); -Procedure FGIntAddBis(Var FGInt1 : TFGInt; Const FGInt2 : TFGInt); -Procedure FGIntSubBis(Var FGInt1 : TFGInt; Const FGInt2 : TFGInt); -Procedure FGIntMul(Const FGInt1, FGInt2 : TFGInt; Var Prod : TFGInt); -Procedure FGIntSquare(Const FGInt : TFGInt; Var Square : TFGInt); -Procedure FGIntExp(Const FGInt, exp : TFGInt; Var res : TFGInt); -Procedure FGIntFac(Const FGInt : TFGInt; Var res : TFGInt); -Procedure FGIntShiftLeftBy31(Var FGInt : TFGInt); -Procedure FGIntDivMod(Var FGInt1, FGInt2, QFGInt, MFGInt : TFGInt); -Procedure FGIntDiv(Var FGInt1, FGInt2, QFGInt : TFGInt); -Procedure FGIntMod(Var FGInt1, FGInt2, MFGInt : TFGInt); -Procedure FGIntSquareMod(Var FGInt, Modb, FGIntSM : TFGInt); -Procedure FGIntAddMod(Var FGInt1, FGInt2, base, FGIntres : TFGInt); -Procedure FGIntMulMod(Var FGInt1, FGInt2, base, FGIntres : TFGInt); -Procedure FGIntModExp(Var FGInt, exp, modb, res : TFGInt); -Procedure FGIntModBis(Const FGInt : TFGInt; Var FGIntOut : TFGInt; b, head : LongWord); -Procedure FGIntMulModBis(Const FGInt1, FGInt2 : TFGInt; Var Prod : TFGInt; b, head : LongWord); -Procedure FGIntMontgomeryMod(Const GInt, base, baseInv : TFGInt; Var MGInt : TFGInt; b : Longword; head : LongWord); -Procedure FGIntMontgomeryModExp(Var FGInt, exp, modb, res : TFGInt); -Procedure FGIntGCD(Const FGInt1, FGInt2 : TFGInt; Var GCD : TFGInt); -Procedure FGIntLCM(Const FGInt1, FGInt2 : TFGInt; Var LCM : TFGInt); -Procedure FGIntTrialDiv9999(Const FGInt : TFGInt; Var ok : boolean); -Procedure FGIntRandom1(Var Seed, RandomFGInt : TFGInt); -Procedure FGIntRabinMiller(Var FGIntp : TFGInt; nrtest : Longword; Var ok : boolean); -Procedure FGIntBezoutBachet(Var FGInt1, FGInt2, a, b : TFGInt); -Procedure FGIntModInv(Const FGInt1, base : TFGInt; Var Inverse : TFGInt); -Procedure FGIntPrimetest(Var FGIntp : TFGInt; nrRMtests : integer; Var ok : boolean); -Procedure FGIntLegendreSymbol(Var a, p : TFGInt; Var L : integer); -Procedure FGIntSquareRootModP(Square, Prime : TFGInt; Var SquareRoot : TFGInt); - - - -Implementation - -Var - primes : Array[1..1228] Of integer = - (3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, - 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, - 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, - 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, - 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, - 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, - 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, - 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, - 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, - 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, - 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, - 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, - 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, - 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, - 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, - 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, - 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, - 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, - 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, - 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, - 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, - 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, - 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, - 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, - 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, - 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, - 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, - 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, - 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, - 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, - 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, - 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, - 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, - 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, - 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, - 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, - 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, - 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, - 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, - 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, - 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, - 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, - 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, - 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, - 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, - 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, - 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, - 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, - 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, - 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, - 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, - 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, - 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, - 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, - 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, - 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, - 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, - 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, - 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, - 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, - 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, - 9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, - 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973); - chr64 : Array[1..64] Of char = ('a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 'f', 'F', - 'g', 'G', 'h', 'H', 'i', 'I', 'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'o', 'O', 'p', - 'P', 'q', 'Q', 'r', 'R', 's', 'S', 't', 'T', 'u', 'U', 'v', 'V', 'w', 'W', 'x', 'X', 'y', 'Y', - 'z', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '='); - PGPchr64 : Array[1..64] Of char = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', - 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'); - - - -Procedure zeronetochar8(Var g : char; Const x : String); -Var - i : Integer; - b : byte; -Begin - b := 0; - For i := 1 To 8 Do - Begin - If copy(x, i, 1) = '1' Then - b := b Or (1 Shl (8 - I)); - End; - g := chr(b); -End; - - -Procedure zeronetochar6(Var g : integer; Const x : String); -Var - I : Integer; -Begin - G := 0; - For I := 1 To Length(X) Do - Begin - If I > 6 Then - Break; - If X[I] <> '0' Then - G := G Or (1 Shl (6 - I)); - End; - Inc(G); -End; - - -Procedure initialize8(Var trans : Array Of String); -Var - c1, c2, c3, c4, c5, c6, c7, c8 : integer; - x : String; - g : char; -Begin - For c1 := 0 To 1 Do - For c2 := 0 To 1 Do - For c3 := 0 To 1 Do - For c4 := 0 To 1 Do - For c5 := 0 To 1 Do - For c6 := 0 To 1 Do - For c7 := 0 To 1 Do - For c8 := 0 To 1 Do - Begin - x := chr(48+c1) + chr(48+c2) + chr(48+c3) + chr(48+c4) + chr(48+c5) + chr(48+c6) + chr(48+c7) + chr(48+c8); - zeronetochar8(g, x); - trans[ord(g)] := x; - End; -End; - - -Procedure initialize6(Var trans : Array Of String); -Var - c1, c2, c3, c4, c5, c6 : integer; - x : String; - g : integer; -Begin - For c1 := 0 To 1 Do - For c2 := 0 To 1 Do - For c3 := 0 To 1 Do - For c4 := 0 To 1 Do - For c5 := 0 To 1 Do - For c6 := 0 To 1 Do - Begin - x := chr(48+c1) + chr(48+c2) + chr(48+c3) + chr(48+c4) + chr(48+c5) + chr(48+c6); - zeronetochar6(g, x); - trans[ord(chr64[g])] := x; - End; -End; - -Procedure initialize6PGP(Var trans : Array Of String); -Var - c1, c2, c3, c4, c5, c6 : integer; - x : String; - g : integer; -Begin - For c1 := 0 To 1 Do - For c2 := 0 To 1 Do - For c3 := 0 To 1 Do - For c4 := 0 To 1 Do - For c5 := 0 To 1 Do - For c6 := 0 To 1 Do - Begin - x := chr(48+c1) + chr(48+c2) + chr(48+c3) + chr(48+c4) + chr(48+c5) + chr(48+c6); - zeronetochar6(g, x); - trans[ord(PGPchr64[g])] := x; - End; -End; - - -// Convert base 8 strings to base 6 strings and visa versa - -Procedure ConvertBase256to64(Const str256 : String; Var str64 : String); -Var - temp : String; - trans : Array[0..255] Of String; - i, len6 : longint; - g : integer; -Begin - initialize8(trans); - temp := ''; - For i := 1 To length(str256) Do temp := temp + trans[ord(str256[i])]; - While (length(temp) Mod 6) <> 0 Do temp := temp + '0'; - len6 := length(temp) Div 6; - str64 := ''; - For i := 1 To len6 Do - Begin - zeronetochar6(g, copy(temp, 1, 6)); - str64 := str64 + chr64[g]; - delete(temp, 1, 6); - End; -End; - - -Procedure ConvertBase64to256(Const str64 : String; Var str256 : String); -Var - temp : String; - trans : Array[0..255] Of String; - i, len8 : longint; - g : char; -Begin - initialize6(trans); - temp := ''; - For i := 1 To length(str64) Do temp := temp + trans[ord(str64[i])]; - str256 := ''; - len8 := length(temp) Div 8; - For i := 1 To len8 Do - Begin - zeronetochar8(g, copy(temp, 1, 8)); - str256 := str256 + g; - delete(temp, 1, 8); - End; -End; - - -// Convert base 8 & 6 bit strings to base 2 strings and visa versa - -Procedure ConvertBase256to2(Const str256 : String; Var str2 : String); -Var - trans : Array[0..255] Of String; - i : longint; -Begin - str2 := ''; - initialize8(trans); - For i := 1 To length(str256) Do str2 := str2 + trans[ord(str256[i])]; -End; - - -Procedure ConvertBase64to2(Const str64 : String; Var str2 : String); -Var - trans : Array[0..255] Of String; - i : longint; -Begin - str2 := ''; - initialize6(trans); - For i := 1 To length(str64) Do str2 := str2 + trans[ord(str64[i])]; -End; - - -Procedure ConvertBase2to256(str2 : String; Var str256 : String); -Var - i, len8 : longint; - g : char; -Begin - str256 := ''; - While (length(str2) Mod 8) <> 0 Do str2 := '0' + str2; - len8 := length(str2) Div 8; - For i := 1 To len8 Do - Begin - zeronetochar8(g, copy(str2, 1, 8)); - str256 := str256 + g; - delete(str2, 1, 8); - End; -End; - - -Procedure ConvertBase2to64(str2 : String; Var str64 : String); -Var - i, len6 : longint; - g : integer; -Begin - str64 := ''; - While (length(str2) Mod 6) <> 0 Do str2 := '0' + str2; - len6 := length(str2) Div 6; - For i := 1 To len6 Do - Begin - zeronetochar6(g, copy(str2, 1, 6)); - str64 := str64 + chr64[g]; - delete(str2, 1, 6); - End; -End; - - -// Convert base 256 strings to base 16 (HexaDecimal) strings and visa versa - -Procedure ConvertBase256StringToHexString(Str256 : String; Var HexStr : String); -Var - i : longint; - b : byte; -Begin - HexStr := ''; - For i := 1 To length(str256) Do - Begin - b := ord(str256[i]); - If (b Shr 4) < 10 Then HexStr := HexStr + chr(48 + (b Shr 4)) - Else HexStr := HexStr + chr(55 + (b Shr 4)); - If (b And 15) < 10 Then HexStr := HexStr + chr(48 + (b And 15)) - Else HexStr := HexStr + chr(55 + (b And 15)); - End; -End; - - -Procedure ConvertHexStringToBase256String(HexStr : String; Var Str256 : String); -Var - i : longint; - b, h1, h2 : byte; - temp : string; -Begin - Str256 := ''; - If (length(Hexstr) mod 2) = 1 Then temp := '0' + HexStr Else temp := HexStr; - For i := 1 To (length(temp) Div 2) Do - Begin - h2 := ord(temp[2 * i]); - h1 := ord(temp[2 * i - 1]); - If h1 < 58 Then - b := ((h1 - 48) Shl 4) - Else - b := ((h1 - 55) Shl 4); - If h2 < 58 Then - b := (b Or (h2 - 48)) - Else - b := (b Or ((h2 - 55) and 15)); - Str256 := Str256 + chr(b); - End; -End; - - -// Convert base 256 strings to base 64 strings and visa versa, PGP style - -Procedure PGPConvertBase256to64(Var str256, str64 : String); -Var - temp, x, a : String; - i, len6 : longint; - g : integer; - trans : Array[0..255] Of String; -Begin - initialize8(trans); - temp := ''; - For i := 1 To length(str256) Do temp := temp + trans[ord(str256[i])]; - If (length(temp) Mod 6) = 0 Then a := '' Else - If (length(temp) Mod 6) = 4 Then - Begin - temp := temp + '00'; - a := '=' - End - Else - Begin - temp := temp + '0000'; - a := '==' - End; - str64 := ''; - len6 := length(temp) Div 6; - For i := 1 To len6 Do - Begin - x := copy(temp, 1, 6); - zeronetochar6(g, x); - str64 := str64 + PGPchr64[g]; - delete(temp, 1, 6); - End; - str64 := str64 + a; -End; - - -Procedure PGPConvertBase64to256(str64 : String; Var str256 : String); -Var - temp, x : String; - i, j, len8 : longint; - g : char; - trans : Array[0..255] Of String; -Begin - initialize6PGP(trans); - temp := ''; - str256 := ''; - If str64[length(str64) - 1] = '=' Then j := 2 Else - If str64[length(str64)] = '=' Then j := 1 Else j := 0; - For i := 1 To (length(str64) - j) Do temp := temp + trans[ord(str64[i])]; - If j <> 0 Then delete(temp, length(temp) - 2 * j + 1, 2 * j); - len8 := length(temp) Div 8; - For i := 1 To len8 Do - Begin - x := copy(temp, 1, 8); - zeronetochar8(g, x); - str256 := str256 + g; - delete(temp, 1, 8); - End; -End; - -// Convert base 64 strings to base 2 strings, PGP style - - -Procedure PGPConvertBase64to2(str64 : String; Var str2 : String); -Var - i, j : longint; - trans : Array[0..255] Of String; -Begin - str2 := ''; - initialize6(trans); - If str64[length(str64) - 1] = '=' Then j := 2 Else - If str64[length(str64)] = '=' Then j := 1 Else j := 0; - For i := 1 To (length(str64) - j) Do str2 := str2 + trans[ord(str64[i])]; - delete(str2, length(str2) - 2 * j + 1, 2 * j); -End; - - -// Convert a FGInt to a binary string (base 2) & visa versa - -Procedure FGIntToBase2String(Const FGInt : TFGInt; Var S : String); -Var - i : LongWord; - j : integer; -Begin - S := ''; - For i := 1 To FGInt.Number[0] Do - Begin - For j := 0 To 30 Do - If (1 And (FGInt.Number[i] Shr j)) = 1 Then - S := '1' + S - Else - S := '0' + S; - End; - While (length(S) > 1) And (S[1] = '0') Do - delete(S, 1, 1); - If S = '' Then S := '0'; -End; - - -Procedure Base2StringToFGInt(S : String; Var FGInt : TFGInt); -Var - i, j, size : LongWord; -Begin - While (S[1] = '0') And (length(S) > 1) Do - delete(S, 1, 1); - size := length(S) Div 31; - If (length(S) Mod 31) <> 0 Then size := size + 1; - SetLength(FGInt.Number, (size + 1)); - FGInt.Number[0] := size; - j := 1; - FGInt.Number[j] := 0; - i := 0; - While length(S) > 0 Do - Begin - If S[length(S)] = '1' Then - FGInt.Number[j] := FGInt.Number[j] Or (1 Shl i); - i := i + 1; - If i = 31 Then - Begin - i := 0; - j := j + 1; - If j <= size Then FGInt.Number[j] := 0; - End; - delete(S, length(S), 1); - End; - FGInt.Sign := positive; -End; - - -// Convert a FGInt to an base 256 string & visa versa - -Procedure FGIntToBase256String(Const FGInt : TFGInt; Var str256 : String); -Var - temp1 : String; - i, len8 : LongWord; - g : char; -Begin - FGIntToBase2String(FGInt, temp1); - While (length(temp1) Mod 8) <> 0 Do temp1 := '0' + temp1; - len8 := length(temp1) Div 8; - str256 := ''; - For i := 1 To len8 Do - Begin - zeronetochar8(g, copy(temp1, 1, 8)); - str256 := str256 + g; - delete(temp1, 1, 8); - End; -End; - - -Procedure Base256StringToFGInt(str256 : String; Var FGInt : TFGInt); -Var - temp1 : String; - i : longint; - trans : Array[0..255] Of String; -Begin - temp1 := ''; - initialize8(trans); - For i := 1 To length(str256) Do temp1 := temp1 + trans[ord(str256[i])]; - While (temp1[1] = '0') And (temp1 <> '0') Do delete(temp1, 1, 1); - Base2StringToFGInt(temp1, FGInt); -End; - -// Convert an MPI (Multiple Precision Integer, PGP style) to an FGInt & -// visa versa - -Procedure PGPMPIToFGInt(PGPMPI : String; Var FGInt : TFGInt); -Var - temp : String; -Begin - temp := PGPMPI; - delete(temp, 1, 2); - Base256StringToFGInt(temp, FGInt); -End; - - -Procedure FGIntToPGPMPI(FGInt : TFGInt; Var PGPMPI : String); -Var - len, i : word; - c : char; - b : byte; -Begin - FGIntToBase256String(FGInt, PGPMPI); - len := length(PGPMPI) * 8; - c := PGPMPI[1]; - For i := 7 Downto 0 Do If (ord(c) Shr i) = 0 Then len := len - 1 Else break; - b := len Mod 256; - PGPMPI := chr(b) + PGPMPI; - b := len Div 256; - PGPMPI := chr(b) + PGPMPI; -End; - - -// Convert a base 10 string to a FGInt -// NESTED -Procedure GIntDivByIntBis1(Var GInt : TFGInt; by : LongWord; Var modres : word); -Var - i, size, rest, temp : LongWord; -Begin - size := GInt.Number[0]; - temp := 0; - For i := size Downto 1 Do - Begin - temp := temp * 10000; - rest := temp + GInt.Number[i]; - GInt.Number[i] := rest Div by; - temp := rest Mod by; - End; - modres := temp; - While (GInt.Number[size] = 0) And (size > 1) Do - size := size - 1; - If size <> GInt.Number[0] Then - Begin - SetLength(GInt.Number, size + 1); - GInt.Number[0] := size; - End; -End; - -Procedure Base10StringToFGInt(Base10 : String; Var FGInt : TFGInt); -Var - i, size : LongWord; - j : word; - S, x : String; - sign : TSign; - - -Begin - While (Not (Base10[1] In ['-', '0'..'9'])) And (length(Base10) > 1) Do - delete(Base10, 1, 1); - If copy(Base10, 1, 1) = '-' Then - Begin - Sign := negative; - delete(Base10, 1, 1); - End - Else - Sign := positive; - While (length(Base10) > 1) And (copy(Base10, 1, 1) = '0') Do - delete(Base10, 1, 1); - size := length(Base10) Div 4; - If (length(Base10) Mod 4) <> 0 Then size := size + 1; - SetLength(FGInt.Number, size + 1); - FGInt.Number[0] := size; - For i := 1 To (size - 1) Do - Begin - x := copy(Base10, length(Base10) - 3, 4); - FGInt.Number[i] := StrToInt(x); - delete(Base10, length(Base10) - 3, 4); - End; - FGInt.Number[size] := StrToInt(Base10); - - S := ''; - While (FGInt.Number[0] <> 1) Or (FGInt.Number[1] <> 0) Do - Begin - GIntDivByIntBis1(FGInt, 2, j); - S := inttostr(j) + S; - End; - If S = '' Then S := '0'; - FGIntDestroy(FGInt); - Base2StringToFGInt(S, FGInt); - FGInt.Sign := sign; -End; - - -// Convert a FGInt to a base 10 string - -Procedure FGIntToBase10String(Const FGInt : TFGInt; Var Base10 : String); -Var - S : String; - j : LongWord; - temp : TFGInt; -Begin - FGIntCopy(FGInt, temp); - Base10 := ''; - While (temp.Number[0] > 1) Or (temp.Number[1] > 0) Do - Begin - FGIntDivByIntBis(temp, 10000, j); - S := IntToStr(j); - While Length(S) < 4 Do - S := '0' + S; - Base10 := S + Base10; - End; - Base10 := '0' + Base10; - While (length(Base10) > 1) And (Base10[1] = '0') Do - delete(Base10, 1, 1); - If FGInt.Sign = negative Then Base10 := '-' + Base10; -End; - - -// Destroy a FGInt to free memory - -Procedure FGIntDestroy(Var FGInt : TFGInt); -Begin - FGInt.Number := Nil; -End; - - -// Compare 2 FGInts in absolute value, returns -// Lt if FGInt1 > FGInt2, St if FGInt1 < FGInt2, Eq if FGInt1 = FGInt2, -// Er otherwise - -Function FGIntCompareAbs(Const FGInt1, FGInt2 : TFGInt) : TCompare; -Var - size1, size2, i : LongWord; -Begin - FGIntCompareAbs := Er; - size1 := FGInt1.Number[0]; - size2 := FGInt2.Number[0]; - If size1 > size2 Then FGIntCompareAbs := Lt Else - If size1 < size2 Then FGIntCompareAbs := St Else - Begin - i := size2; - While (FGInt1.Number[i] = FGInt2.Number[i]) And (i > 1) Do i := i - 1; - If FGInt1.Number[i] = FGInt2.Number[i] Then FGIntCompareAbs := Eq Else - If FGInt1.Number[i] < FGInt2.Number[i] Then FGIntCompareAbs := St Else - If FGInt1.Number[i] > FGInt2.Number[i] Then FGIntCompareAbs := Lt; - End; -End; - - -// Add 2 FGInts, FGInt1 + FGInt2 = Sum - -Procedure FGIntAdd(Const FGInt1, FGInt2 : TFGInt; Var Sum : TFGInt); -Var - i, size1, size2, size, rest, Trest : LongWord; -Begin - size1 := FGInt1.Number[0]; - size2 := FGInt2.Number[0]; - If size1 < size2 Then - FGIntAdd(FGInt2, FGInt1, Sum) - Else - Begin - If FGInt1.Sign = FGInt2.Sign Then - Begin - Sum.Sign := FGInt1.Sign; - setlength(Sum.Number, (size1 + 2)); - rest := 0; - For i := 1 To size2 Do - Begin - Trest := FGInt1.Number[i]; - Trest := Trest + FGInt2.Number[i]; - Trest := Trest + rest; - Sum.Number[i] := Trest And 2147483647; - rest := Trest Shr 31; - End; - For i := (size2 + 1) To size1 Do - Begin - Trest := FGInt1.Number[i] + rest; - Sum.Number[i] := Trest And 2147483647; - rest := Trest Shr 31; - End; - size := size1 + 1; - Sum.Number[0] := size; - Sum.Number[size] := rest; - While (Sum.Number[size] = 0) And (size > 1) Do - size := size - 1; - If Sum.Number[0] <> size Then SetLength(Sum.Number, size + 1); - Sum.Number[0] := size; - End - Else - Begin - If FGIntCompareAbs(FGInt2, FGInt1) = Lt Then - FGIntAdd(FGInt2, FGInt1, Sum) - Else - Begin - SetLength(Sum.Number, (size1 + 1)); - rest := 0; - For i := 1 To size2 Do - Begin - Trest := $80000000; // 2147483648; - TRest := Trest + FGInt1.Number[i]; - TRest := Trest - FGInt2.Number[i]; - TRest := Trest - rest; - Sum.Number[i] := Trest And 2147483647; - If (Trest > 2147483647) Then - rest := 0 - Else - rest := 1; - End; - For i := (size2 + 1) To size1 Do - Begin - Trest := $80000000; - TRest := Trest + FGInt1.Number[i]; - TRest := Trest - rest; - Sum.Number[i] := Trest And 2147483647; - If (Trest > 2147483647) Then - rest := 0 - Else - rest := 1; - End; - size := size1; - While (Sum.Number[size] = 0) And (size > 1) Do - size := size - 1; - If size <> size1 Then SetLength(Sum.Number, size + 1); - Sum.Number[0] := size; - Sum.Sign := FGInt1.Sign; - End; - End; - End; -End; - - - -Procedure FGIntChangeSign(Var FGInt : TFGInt); -Begin - If FGInt.Sign = negative Then FGInt.Sign := positive Else FGInt.Sign := negative; -End; - - -// Substract 2 FGInts, FGInt1 - FGInt2 = dif - -Procedure FGIntSub(Var FGInt1, FGInt2, dif : TFGInt); -Begin - FGIntChangeSign(FGInt2); - FGIntAdd(FGInt1, FGInt2, dif); - FGIntChangeSign(FGInt2); -End; - - -// multiply a FGInt by an integer, FGInt * by = res, by < 2147483648 - -Procedure FGIntMulByInt(Const FGInt : TFGInt; Var res : TFGInt; by : LongWord); -Var - i, size, rest : LongWord; - Trest : int64; -Begin - size := FGInt.Number[0]; - setlength(res.Number, (size + 2)); - rest := 0; - For i := 1 To size Do - Begin - Trest := FGInt.Number[i]; - TRest := Trest * by; - TRest := Trest + rest; - res.Number[i] := Trest And 2147483647; - rest := Trest Shr 31; - End; - If rest <> 0 Then - Begin - size := size + 1; - Res.Number[size] := rest; - End - Else - SetLength(Res.Number, size + 1); - Res.Number[0] := size; - Res.Sign := FGInt.Sign; -End; - - -// multiply a FGInt by an integer, FGInt * by = res, by < 1000000000 - -Procedure FGIntMulByIntbis(Var FGInt : TFGInt; by : LongWord); -Var - i, size, rest : LongWord; - Trest : int64; -Begin - size := FGInt.Number[0]; - Setlength(FGInt.Number, size + 2); - rest := 0; - For i := 1 To size Do - Begin - Trest := FGInt.Number[i]; - TRest := Trest * by; - TRest := Trest + rest; - FGInt.Number[i] := Trest And 2147483647; - rest := Trest Shr 31; - End; - If rest <> 0 Then - Begin - size := size + 1; - FGInt.Number[size] := rest; - End - Else - SetLength(FGInt.Number, size + 1); - FGInt.Number[0] := size; -End; - - -// divide a FGInt by an integer, FGInt = res * by + modres - -Procedure FGIntDivByInt(Const FGInt : TFGInt; Var res : TFGInt; by : LongWord; Var modres : LongWord); -Var - i, size : LongWord; - rest : int64; -Begin - size := FGInt.Number[0]; - setlength(res.Number, (size + 1)); - modres := 0; - For i := size Downto 1 Do - Begin - rest := modres; - rest := rest Shl 31; - rest := rest Or FGInt.Number[i]; - res.Number[i] := rest Div by; - modres := rest Mod by; - End; - While (res.Number[size] = 0) And (size > 1) Do - size := size - 1; - If size <> FGInt.Number[0] Then SetLength(res.Number, size + 1); - res.Number[0] := size; - Res.Sign := FGInt.Sign; - If FGInt.sign = negative Then modres := by - modres; -End; - - -// divide a FGInt by an integer, FGInt = FGInt * by + modres - -Procedure FGIntDivByIntBis(Var FGInt : TFGInt; by : LongWord; Var modres : LongWord); -Var - i, size : LongWord; - temp, rest : int64; -Begin - size := FGInt.Number[0]; - temp := 0; - For i := size Downto 1 Do - Begin - temp := temp Shl 31; - rest := temp Or FGInt.Number[i]; - FGInt.Number[i] := rest Div by; - temp := rest Mod by; - End; - modres := temp; - While (FGInt.Number[size] = 0) And (size > 1) Do - size := size - 1; - If size <> FGInt.Number[0] Then - Begin - SetLength(FGInt.Number, size + 1); - FGInt.Number[0] := size; - End; -End; - - -// Reduce a FGInt modulo by (=an integer), FGInt mod by = modres - -Procedure FGIntModByInt(Const FGInt : TFGInt; by : LongWord; Var modres : LongWord); -Var - i, size : LongWord; - temp, rest : int64; -Begin - size := FGInt.Number[0]; - temp := 0; - For i := size Downto 1 Do - Begin - temp := temp Shl 31; - rest := temp Or FGInt.Number[i]; - temp := rest Mod by; - End; - modres := temp; - If FGInt.sign = negative Then modres := by - modres; -End; - - -// Returns the FGInt in absolute value - -Procedure FGIntAbs(Var FGInt : TFGInt); -Begin - FGInt.Sign := positive; -End; - - -// Copy a FGInt1 into FGInt2 - -Procedure FGIntCopy(Const FGInt1 : TFGInt; Var FGInt2 : TFGInt); -Begin - FGInt2.Sign := FGInt1.Sign; - FGInt2.Number := Nil; - FGInt2.Number := Copy(FGInt1.Number, 0, FGInt1.Number[0] + 1); -End; - - -// Shift the FGInt to the left in base 2 notation, ie FGInt = FGInt * 2 - -Procedure FGIntShiftLeft(Var FGInt : TFGInt); -Var - l, m, i, size : LongWord; -Begin - size := FGInt.Number[0]; - l := 0; - For i := 1 To Size Do - Begin - m := FGInt.Number[i] Shr 30; - FGInt.Number[i] := ((FGInt.Number[i] Shl 1) Or l) And 2147483647; - l := m; - End; - If l <> 0 Then - Begin - setlength(FGInt.Number, size + 2); - FGInt.Number[size + 1] := l; - FGInt.Number[0] := size + 1; - End; -End; - - -// Shift the FGInt to the right in base 2 notation, ie FGInt = FGInt div 2 - -Procedure FGIntShiftRight(Var FGInt : TFGInt); -Var - l, m, i, size : LongWord; -Begin - size := FGInt.Number[0]; - l := 0; - For i := size Downto 1 Do - Begin - m := FGInt.Number[i] And 1; - FGInt.Number[i] := (FGInt.Number[i] Shr 1) Or l; - l := m Shl 30; - End; - If (FGInt.Number[size] = 0) And (size > 1) Then - Begin - setlength(FGInt.Number, size); - FGInt.Number[0] := size - 1; - End; -End; - - -// FGInt = FGInt / 2147483648 - -Procedure FGIntShiftRightBy31(Var FGInt : TFGInt); -Var - size, i : LongWord; -Begin - size := FGInt.Number[0]; - If size > 1 Then - Begin - For i := 1 To size - 1 Do - Begin - FGInt.Number[i] := FGInt.Number[i + 1]; - End; - SetLength(FGInt.Number, Size); - FGInt.Number[0] := size - 1; - End - Else - FGInt.Number[1] := 0; -End; - - -// FGInt1 = FGInt1 + FGInt2, FGInt1 > FGInt2 - -Procedure FGIntAddBis(Var FGInt1 : TFGInt; Const FGInt2 : TFGInt); -Var - i, size1, size2, Trest, rest : LongWord; -Begin - size1 := FGInt1.Number[0]; - size2 := FGInt2.Number[0]; - rest := 0; - For i := 1 To size2 Do - Begin - Trest := FGInt1.Number[i] + FGInt2.Number[i] + rest; - rest := Trest Shr 31; - FGInt1.Number[i] := Trest And 2147483647; - End; - For i := size2 + 1 To size1 Do - Begin - Trest := FGInt1.Number[i] + rest; - rest := Trest Shr 31; - FGInt1.Number[i] := Trest And 2147483647; - End; - If rest <> 0 Then - Begin - SetLength(FGInt1.Number, size1 + 2); - FGInt1.Number[0] := size1 + 1; - FGInt1.Number[size1 + 1] := rest; - End; -End; - - -// FGInt1 = FGInt1 - FGInt2, use only when 0 < FGInt2 < FGInt1 - -Procedure FGIntSubBis(Var FGInt1 : TFGInt; Const FGInt2 : TFGInt); -Var - i, size1, size2, rest, Trest : LongWord; -Begin - size1 := FGInt1.Number[0]; - size2 := FGInt2.Number[0]; - rest := 0; - For i := 1 To size2 Do - Begin - Trest := ($80000000 Or FGInt1.Number[i]) - FGInt2.Number[i] - rest; - If (Trest > 2147483647) Then - rest := 0 - Else - rest := 1; - FGInt1.Number[i] := Trest And 2147483647; - End; - For i := size2 + 1 To size1 Do - Begin - Trest := ($80000000 Or FGInt1.Number[i]) - rest; - If (Trest > 2147483647) Then - rest := 0 - Else - rest := 1; - FGInt1.Number[i] := Trest And 2147483647; - End; - i := size1; - While (FGInt1.Number[i] = 0) And (i > 1) Do - i := i - 1; - If i <> size1 Then - Begin - SetLength(FGInt1.Number, i + 1); - FGInt1.Number[0] := i; - End; -End; - - -// Multiply 2 FGInts, FGInt1 * FGInt2 = Prod - -Procedure FGIntMul(Const FGInt1, FGInt2 : TFGInt; Var Prod : TFGInt); -Var - i, j, size, size1, size2, rest : LongWord; - Trest : int64; -Begin - size1 := FGInt1.Number[0]; - size2 := FGInt2.Number[0]; - size := size1 + size2; - SetLength(Prod.Number, (size + 1)); - For i := 1 To size Do - Prod.Number[i] := 0; - - For i := 1 To size2 Do - Begin - rest := 0; - For j := 1 To size1 Do - Begin - Trest := FGInt1.Number[j]; - Trest := Trest * FGInt2.Number[i]; - Trest := Trest + Prod.Number[j + i - 1]; - Trest := Trest + rest; - Prod.Number[j + i - 1] := Trest And 2147483647; - rest := Trest Shr 31; - End; - Prod.Number[i + size1] := rest; - End; - - Prod.Number[0] := size; - While (Prod.Number[size] = 0) And (size > 1) Do - size := size - 1; - If size <> Prod.Number[0] Then - Begin - SetLength(Prod.Number, size + 1); - Prod.Number[0] := size; - End; - If FGInt1.Sign = FGInt2.Sign Then - Prod.Sign := Positive - Else - prod.Sign := negative; -End; - - -// Square a FGInt, FGInt² = Square - -Procedure FGIntSquare(Const FGInt : TFGInt; Var Square : TFGInt); -Var - size, size1, i, j, rest : LongWord; - Trest : int64; -Begin - size1 := FGInt.Number[0]; - size := 2 * size1; - SetLength(Square.Number, (size + 1)); - Square.Number[0] := size; - For i := 1 To size Do - Square.Number[i] := 0; - For i := 1 To size1 Do - Begin - Trest := FGInt.Number[i]; - Trest := Trest * FGInt.Number[i]; - Trest := Trest + Square.Number[2 * i - 1]; - Square.Number[2 * i - 1] := Trest And 2147483647; - rest := Trest Shr 31; - For j := i + 1 To size1 Do - Begin - Trest := FGInt.Number[i] Shl 1; - Trest := Trest * FGInt.Number[j]; - Trest := Trest + Square.Number[i + j - 1]; - Trest := Trest + rest; - Square.Number[i + j - 1] := Trest And 2147483647; - rest := Trest Shr 31; - End; - Square.Number[i + size1] := rest; - End; - Square.Sign := positive; - While (Square.Number[size] = 0) And (size > 1) Do - size := size - 1; - If size <> (2 * size1) Then - Begin - SetLength(Square.Number, size + 1); - Square.Number[0] := size; - End; -End; - - -// Exponentiate a FGInt, FGInt^exp = res - -Procedure FGIntExp(Const FGInt, exp : TFGInt; Var res : TFGInt); -Var - temp2, temp3 : TFGInt; - S : String; - i : LongWord; -Begin - FGIntToBase2String(exp, S); - If S[length(S)] = '0' Then Base10StringToFGInt('1', res) Else FGIntCopy(FGInt, res); - FGIntCopy(FGInt, temp2); - If length(S) > 1 Then - For i := (length(S) - 1) Downto 1 Do - Begin - FGIntSquare(temp2, temp3); - FGIntCopy(temp3, temp2); - If S[i] = '1' Then - Begin - FGIntMul(res, temp2, temp3); - FGIntCopy(temp3, res); - End; - End; -End; - - -// Compute FGInt! = FGInt * (FGInt - 1) * (FGInt - 2) * ... * 3 * 2 * 1 - -Procedure FGIntFac(Const FGInt : TFGInt; Var res : TFGInt); -Var - one, temp, temp1 : TFGInt; -Begin - FGIntCopy(FGInt, temp); - Base10StringToFGInt('1', res); - Base10StringToFGInt('1', one); - - While Not (FGIntCompareAbs(temp, one) = Eq) Do - Begin - FGIntMul(temp, res, temp1); - FGIntCopy(temp1, res); - FGIntSubBis(temp, one); - End; - - FGIntDestroy(one); - FGIntDestroy(temp); -End; - - -// FGInt = FGInt * 2147483648 - -Procedure FGIntShiftLeftBy31(Var FGInt : TFGInt); -Var - f1, f2 : LongWord; - i, size : longint; -Begin - size := FGInt.Number[0]; - SetLength(FGInt.Number, size + 2); - f1 := 0; - For i := 1 To (size + 1) Do - Begin - f2 := FGInt.Number[i]; - FGInt.Number[i] := f1; - f1 := f2; - End; - FGInt.Number[0] := size + 1; -End; - - -// Divide 2 FGInts, FGInt1 = FGInt2 * QFGInt + MFGInt, MFGInt is always positive - -Procedure FGIntDivMod(Var FGInt1, FGInt2, QFGInt, MFGInt : TFGInt); -Var - one, zero, temp1, temp2 : TFGInt; - s1, s2 : TSign; - j, s, t : LongWord; - i : int64; -Begin - s1 := FGInt1.Sign; - s2 := FGInt2.Sign; - FGIntAbs(FGInt1); - FGIntAbs(FGInt2); - FGIntCopy(FGInt1, MFGInt); - FGIntCopy(FGInt2, temp1); - - If FGIntCompareAbs(FGInt1, FGInt2) <> St Then - Begin - s := FGInt1.Number[0] - FGInt2.Number[0]; - SetLength(QFGInt.Number, (s + 2)); - QFGInt.Number[0] := s + 1; - For t := 1 To s Do - Begin - FGIntShiftLeftBy31(temp1); - QFGInt.Number[t] := 0; - End; - j := s + 1; - QFGInt.Number[j] := 0; - While FGIntCompareAbs(MFGInt, FGInt2) <> St Do - Begin - While FGIntCompareAbs(MFGInt, temp1) <> St Do - Begin - If MFGInt.Number[0] > temp1.Number[0] Then - Begin - i := MFGInt.Number[MFGInt.Number[0]]; - i := i Shl 31; - i := i + MFGInt.Number[MFGInt.Number[0] - 1]; - i := i Div (temp1.Number[temp1.Number[0]] + 1); - End - Else - i := MFGInt.Number[MFGInt.Number[0]] Div (temp1.Number[temp1.Number[0]] + 1); - If (i <> 0) Then - Begin - FGIntCopy(temp1, temp2); - FGIntMulByIntBis(temp2, i); - FGIntSubBis(MFGInt, temp2); - QFGInt.Number[j] := QFGInt.Number[j] + i; - If FGIntCompareAbs(MFGInt, temp2) <> St Then - Begin - QFGInt.Number[j] := QFGInt.Number[j] + i; - FGIntSubBis(MFGInt, temp2); - End; - FGIntDestroy(temp2); - End - Else - Begin - QFGInt.Number[j] := QFGInt.Number[j] + 1; - FGIntSubBis(MFGInt, temp1); - End; - End; - If MFGInt.Number[0] <= temp1.Number[0] Then - If FGIntCompareAbs(temp1, FGInt2) <> Eq Then - Begin - FGIntShiftRightBy31(temp1); - j := j - 1; - End; - End; - End - Else - Base10StringToFGInt('0', QFGInt); - s := QFGInt.Number[0]; - While (s > 1) And (QFGInt.Number[s] = 0) Do - s := s - 1; - If s < QFGInt.Number[0] Then - Begin - setlength(QFGInt.Number, s + 1); - QFGInt.Number[0] := s; - End; - QFGInt.Sign := positive; - - FGIntDestroy(temp1); - Base10StringToFGInt('0', zero); - Base10StringToFGInt('1', one); - If s1 = negative Then - Begin - If FGIntCompareAbs(MFGInt, zero) <> Eq Then - Begin - FGIntadd(QFGInt, one, temp1); - FGIntDestroy(QFGInt); - FGIntCopy(temp1, QFGInt); - FGIntDestroy(temp1); - FGIntsub(FGInt2, MFGInt, temp1); - FGIntDestroy(MFGInt); - FGIntCopy(temp1, MFGInt); - FGIntDestroy(temp1); - End; - If s2 = positive Then QFGInt.Sign := negative; - End - Else - QFGInt.Sign := s2; - FGIntDestroy(one); - FGIntDestroy(zero); - - FGInt1.Sign := s1; - FGInt2.Sign := s2; -End; - - -// Same as above but doesn 't compute MFGInt - -Procedure FGIntDiv(Var FGInt1, FGInt2, QFGInt : TFGInt); -Var - one, zero, temp1, temp2, MFGInt : TFGInt; - s1, s2 : TSign; - j, s, t : LongWord; - i : int64; -Begin - s1 := FGInt1.Sign; - s2 := FGInt2.Sign; - FGIntAbs(FGInt1); - FGIntAbs(FGInt2); - FGIntCopy(FGInt1, MFGInt); - FGIntCopy(FGInt2, temp1); - - If FGIntCompareAbs(FGInt1, FGInt2) <> St Then - Begin - s := FGInt1.Number[0] - FGInt2.Number[0]; - SetLength(QFGInt.Number, (s + 2)); - QFGInt.Number[0] := s + 1; - For t := 1 To s Do - Begin - FGIntShiftLeftBy31(temp1); - QFGInt.Number[t] := 0; - End; - j := s + 1; - QFGInt.Number[j] := 0; - While FGIntCompareAbs(MFGInt, FGInt2) <> St Do - Begin - While FGIntCompareAbs(MFGInt, temp1) <> St Do - Begin - If MFGInt.Number[0] > temp1.Number[0] Then - Begin - i := MFGInt.Number[MFGInt.Number[0]]; - i := i Shl 31; - i := i + MFGInt.Number[MFGInt.Number[0] - 1]; - i := i Div (temp1.Number[temp1.Number[0]] + 1); - End - Else - i := MFGInt.Number[MFGInt.Number[0]] Div (temp1.Number[temp1.Number[0]] + 1); - If (i <> 0) Then - Begin - FGIntCopy(temp1, temp2); - FGIntMulByIntBis(temp2, i); - FGIntSubBis(MFGInt, temp2); - QFGInt.Number[j] := QFGInt.Number[j] + i; - If FGIntCompareAbs(MFGInt, temp2) <> St Then - Begin - QFGInt.Number[j] := QFGInt.Number[j] + i; - FGIntSubBis(MFGInt, temp2); - End; - FGIntDestroy(temp2); - End - Else - Begin - QFGInt.Number[j] := QFGInt.Number[j] + 1; - FGIntSubBis(MFGInt, temp1); - End; - End; - If MFGInt.Number[0] <= temp1.Number[0] Then - If FGIntCompareAbs(temp1, FGInt2) <> Eq Then - Begin - FGIntShiftRightBy31(temp1); - j := j - 1; - End; - End; - End - Else - Base10StringToFGInt('0', QFGInt); - s := QFGInt.Number[0]; - While (s > 1) And (QFGInt.Number[s] = 0) Do - s := s - 1; - If s < QFGInt.Number[0] Then - Begin - setlength(QFGInt.Number, s + 1); - QFGInt.Number[0] := s; - End; - QFGInt.Sign := positive; - - FGIntDestroy(temp1); - Base10StringToFGInt('0', zero); - Base10StringToFGInt('1', one); - If s1 = negative Then - Begin - If FGIntCompareAbs(MFGInt, zero) <> Eq Then - Begin - FGIntadd(QFGInt, one, temp1); - FGIntDestroy(QFGInt); - FGIntCopy(temp1, QFGInt); - FGIntDestroy(temp1); - FGIntsub(FGInt2, MFGInt, temp1); - FGIntDestroy(MFGInt); - FGIntCopy(temp1, MFGInt); - FGIntDestroy(temp1); - End; - If s2 = positive Then QFGInt.Sign := negative; - End - Else - QFGInt.Sign := s2; - FGIntDestroy(one); - FGIntDestroy(zero); - FGIntDestroy(MFGInt); - - FGInt1.Sign := s1; - FGInt2.Sign := s2; -End; - - - -// Same as above but this computes MFGInt in stead of QFGInt -// MFGInt = FGInt1 mod FGInt2 - -Procedure FGIntMod(Var FGInt1, FGInt2, MFGInt : TFGInt); -Var - one, zero, temp1, temp2 : TFGInt; - s1, s2 : TSign; - s, t : LongWord; - i : int64; -Begin - s1 := FGInt1.Sign; - s2 := FGInt2.Sign; - FGIntAbs(FGInt1); - FGIntAbs(FGInt2); - FGIntCopy(FGInt1, MFGInt); - FGIntCopy(FGInt2, temp1); - - If FGIntCompareAbs(FGInt1, FGInt2) <> St Then - Begin - s := FGInt1.Number[0] - FGInt2.Number[0]; - For t := 1 To s Do - FGIntShiftLeftBy31(temp1); - While FGIntCompareAbs(MFGInt, FGInt2) <> St Do - Begin - While FGIntCompareAbs(MFGInt, temp1) <> St Do - Begin - If MFGInt.Number[0] > temp1.Number[0] Then - Begin - i := MFGInt.Number[MFGInt.Number[0]]; - i := i Shl 31; - i := i + MFGInt.Number[MFGInt.Number[0] - 1]; - i := i Div (temp1.Number[temp1.Number[0]] + 1); - End - Else - i := MFGInt.Number[MFGInt.Number[0]] Div (temp1.Number[temp1.Number[0]] + 1); - If (i <> 0) Then - Begin - FGIntCopy(temp1, temp2); - FGIntMulByIntBis(temp2, i); - FGIntSubBis(MFGInt, temp2); - If FGIntCompareAbs(MFGInt, temp2) <> St Then FGIntSubBis(MFGInt, temp2); - FGIntDestroy(temp2); - End - Else - FGIntSubBis(MFGInt, temp1); -// If FGIntCompareAbs(MFGInt, temp1) <> St Then FGIntSubBis(MFGInt,temp1); - End; - If MFGInt.Number[0] <= temp1.Number[0] Then - If FGIntCompareAbs(temp1, FGInt2) <> Eq Then FGIntShiftRightBy31(temp1); - End; - End; - - FGIntDestroy(temp1); - Base10StringToFGInt('0', zero); - Base10StringToFGInt('1', one); - If s1 = negative Then - Begin - If FGIntCompareAbs(MFGInt, zero) <> Eq Then - Begin - FGIntSub(FGInt2, MFGInt, temp1); - FGIntDestroy(MFGInt); - FGIntCopy(temp1, MFGInt); - FGIntDestroy(temp1); - End; - End; - FGIntDestroy(one); - FGIntDestroy(zero); - - FGInt1.Sign := s1; - FGInt2.Sign := s2; -End; - - -// Square a FGInt modulo Modb, FGInt^2 mod Modb = FGIntSM - -Procedure FGIntSquareMod(Var FGInt, Modb, FGIntSM : TFGInt); -Var - temp : TFGInt; -Begin - FGIntSquare(FGInt, temp); - FGIntMod(temp, Modb, FGIntSM); - FGIntDestroy(temp); -End; - - -// Add 2 FGInts modulo base, (FGInt1 + FGInt2) mod base = FGIntres - -Procedure FGIntAddMod(Var FGInt1, FGInt2, base, FGIntres : TFGInt); -Var - temp : TFGInt; -Begin - FGIntadd(FGInt1, FGInt2, temp); - FGIntMod(temp, base, FGIntres); - FGIntDestroy(temp); -End; - - -// Multiply 2 FGInts modulo base, (FGInt1 * FGInt2) mod base = FGIntres - -Procedure FGIntMulMod(Var FGInt1, FGInt2, base, FGIntres : TFGInt); -Var - temp : TFGInt; -Begin - FGIntMul(FGInt1, FGInt2, temp); - FGIntMod(temp, base, FGIntres); - FGIntDestroy(temp); -End; - - -// Exponentiate 2 FGInts modulo base, (FGInt1 ^ FGInt2) mod modb = res - -Procedure FGIntModExp(Var FGInt, exp, modb, res : TFGInt); -Var - temp2, temp3 : TFGInt; - i : LongWord; - S : String; -Begin - If (Modb.Number[1] Mod 2) = 1 Then - Begin - FGIntMontgomeryModExp(FGInt, exp, modb, res); - exit; - End; - FGIntToBase2String(exp, S); - Base10StringToFGInt('1', res); - FGIntcopy(FGInt, temp2); - - For i := length(S) Downto 1 Do - Begin - If S[i] = '1' Then - Begin - FGIntmulMod(res, temp2, modb, temp3); - FGIntCopy(temp3, res); - End; - FGIntSquareMod(temp2, Modb, temp3); - FGIntCopy(temp3, temp2); - End; - FGIntDestroy(temp2); -End; - - -// Procedures for Montgomery Exponentiation - -Procedure FGIntModBis(Const FGInt : TFGInt; Var FGIntOut : TFGInt; b, head : LongWord); -Var - i : LongWord; -Begin - If b <= FGInt.Number[0] Then - Begin - SetLength(FGIntOut.Number, (b + 1)); - For i := 0 To b Do - FGIntOut.Number[i] := FGInt.Number[i]; - FGIntOut.Number[b] := FGIntOut.Number[b] And head; - i := b; - While (FGIntOut.Number[i] = 0) And (i > 1) Do - i := i - 1; - If i < b Then SetLength(FGIntOut.Number, i + 1); - FGIntOut.Number[0] := i; - FGIntOut.Sign := positive; - End - Else - FGIntCopy(FGInt, FGIntOut); -End; - - -Procedure FGIntMulModBis(Const FGInt1, FGInt2 : TFGInt; Var Prod : TFGInt; b, head : LongWord); -Var - i, j, size, size1, size2, t, rest : LongWord; - Trest : int64; -Begin - size1 := FGInt1.Number[0]; - size2 := FGInt2.Number[0]; - size := min(b, size1 + size2); - SetLength(Prod.Number, (size + 1)); - For i := 1 To size Do - Prod.Number[i] := 0; - - For i := 1 To size2 Do - Begin - rest := 0; - t := min(size1, b - i + 1); - For j := 1 To t Do - Begin - Trest := FGInt1.Number[j]; - Trest := Trest * FGInt2.Number[i]; - Trest := Trest + Prod.Number[j + i - 1]; - Trest := Trest + rest; - Prod.Number[j + i - 1] := Trest And 2147483647; - rest := Trest Shr 31; - End; - If (i + size1) <= b Then Prod.Number[i + size1] := rest; - End; - - Prod.Number[0] := size; - If size = b Then Prod.Number[b] := Prod.Number[b] And head; - While (Prod.Number[size] = 0) And (size > 1) Do - size := size - 1; - If size < Prod.Number[0] Then - Begin - SetLength(Prod.Number, size + 1); - Prod.Number[0] := size; - End; - If FGInt1.Sign = FGInt2.Sign Then - Prod.Sign := Positive - Else - prod.Sign := negative; -End; - - -Procedure FGIntMontgomeryMod(Const GInt, base, baseInv : TFGInt; Var MGInt : TFGInt; b : Longword; head : LongWord); -Var - m, temp, temp1 : TFGInt; - r : LongWord; -Begin - FGIntModBis(GInt, temp, b, head); - FGIntMulModBis(temp, baseInv, m, b, head); - FGIntMul(m, base, temp1); - FGIntDestroy(temp); - FGIntAdd(temp1, GInt, temp); - FGIntDestroy(temp1); - MGInt.Number := copy(temp.Number, b - 1, temp.Number[0] - b + 2); - MGInt.Sign := positive; - MGInt.Number[0] := temp.Number[0] - b + 1; - FGIntDestroy(temp); - If (head Shr 30) = 0 Then FGIntDivByIntBis(MGInt, head + 1, r) - Else FGIntShiftRightBy31(MGInt); - If FGIntCompareAbs(MGInt, base) <> St Then FGIntSubBis(MGInt, base); - FGIntDestroy(temp); - FGIntDestroy(m); -End; - - -Procedure FGIntMontgomeryModExp(Var FGInt, exp, modb, res : TFGInt); -Var - temp2, temp3, baseInv, r, zero : TFGInt; - i, j, t, b, head : LongWord; - S : String; -Begin - Base2StringToFGInt('0', zero); - FGIntMod(FGInt, modb, res); - If FGIntCompareAbs(res, zero)=Eq then - Begin - FGIntDestroy(zero); - Exit; - End else FGIntDestroy(res); - FGIntDestroy(zero); - - FGIntToBase2String(exp, S); - t := modb.Number[0]; - b := t; - - If (modb.Number[t] Shr 30) = 1 Then t := t + 1; - SetLength(r.Number, (t + 1)); - r.Number[0] := t; - r.Sign := positive; - For i := 1 To t Do - r.Number[i] := 0; - If t = modb.Number[0] Then - Begin - head := 2147483647; - For j := 29 Downto 0 Do - Begin - head := head Shr 1; - If (modb.Number[t] Shr j) = 1 Then - Begin - r.Number[t] := 1 Shl (j + 1); - break; - End; - End; - End - Else - Begin - r.Number[t] := 1; - head := 2147483647; - End; - - FGIntModInv(modb, r, temp2); - If temp2.Sign = negative Then - FGIntCopy(temp2, BaseInv) - Else - Begin - FGIntCopy(r, BaseInv); - FGIntSubBis(BaseInv, temp2); - End; -// FGIntBezoutBachet(r, modb, temp2, BaseInv); - FGIntAbs(BaseInv); - FGIntDestroy(temp2); - FGIntMod(r, modb, res); - FGIntMulMod(FGInt, res, modb, temp2); - FGIntDestroy(r); - - For i := length(S) Downto 1 Do - Begin - If S[i] = '1' Then - Begin - FGIntmul(res, temp2, temp3); - FGIntDestroy(res); - FGIntMontgomeryMod(temp3, modb, baseinv, res, b, head); - FGIntDestroy(temp3); - End; - FGIntSquare(temp2, temp3); - FGIntDestroy(temp2); - FGIntMontgomeryMod(temp3, modb, baseinv, temp2, b, head); - FGIntDestroy(temp3); - End; - FGIntDestroy(temp2); - FGIntMontgomeryMod(res, modb, baseinv, temp3, b, head); - FGIntCopy(temp3, res); - FGIntDestroy(temp3); - FGIntDestroy(baseinv); -End; - - -// Compute the Greatest Common Divisor of 2 FGInts - -Procedure FGIntGCD(Const FGInt1, FGInt2 : TFGInt; Var GCD : TFGInt); -Var - k : TCompare; - zero, temp1, temp2, temp3 : TFGInt; -Begin - k := FGIntCompareAbs(FGInt1, FGInt2); - If (k = Eq) Then FGIntCopy(FGInt1, GCD) Else - If (k = St) Then FGIntGCD(FGInt2, FGInt1, GCD) Else - Begin - Base10StringToFGInt('0', zero); - FGIntCopy(FGInt1, temp1); - FGIntCopy(FGInt2, temp2); - While (temp2.Number[0] <> 1) Or (temp2.Number[1] <> 0) Do - Begin - FGIntMod(temp1, temp2, temp3); - FGIntCopy(temp2, temp1); - FGIntCopy(temp3, temp2); - FGIntDestroy(temp3); - End; - FGIntCopy(temp1, GCD); - FGIntDestroy(temp2); - FGIntDestroy(zero); - End; -End; - - -// Compute the Least Common Multiple of 2 FGInts - -Procedure FGIntLCM(Const FGInt1, FGInt2 : TFGInt; Var LCM : TFGInt); -Var - temp1, temp2 : TFGInt; -Begin - FGIntGCD(FGInt1, FGInt2, temp1); - FGIntmul(FGInt1, FGInt2, temp2); - FGIntdiv(temp2, temp1, LCM); - FGIntDestroy(temp1); - FGIntDestroy(temp2); -End; - - -// Trialdivision of a FGInt upto 9999 and stopping when a divisor is found, returning ok=false - -Procedure FGIntTrialDiv9999(Const FGInt : TFGInt; Var ok : boolean); -Var - j : LongWord; - i : integer; -Begin - If ((FGInt.Number[1] Mod 2) = 0) Then ok := false - Else - Begin - i := 0; - ok := true; - While ok And (i < 1228) Do - Begin - i := i + 1; - FGIntmodbyint(FGInt, primes[i], j); - If j = 0 Then ok := false; - End; - End; -End; - - -// A prng - -Procedure FGIntRandom1(Var Seed, RandomFGInt : TFGInt); -Var - temp, base : TFGInt; -Begin - Base10StringToFGInt('281474976710656', base); - Base10StringToFGInt('44485709377909', temp); - FGIntMulMod(seed, temp, base, RandomFGInt); - FGIntDestroy(temp); - FGIntDestroy(base); -End; - - -// Perform a Rabin Miller Primality Test nrtest times on FGIntp, returns ok=true when FGIntp passes the test - -Procedure FGIntRabinMiller(Var FGIntp : TFGInt; nrtest : Longword; Var ok : boolean); -Var - j, b, i : LongWord; - m, z, temp1, temp2, temp3, zero, one, two, pmin1 : TFGInt; - ok1, ok2 : boolean; -Begin - randomize; - j := 0; - Base10StringToFGInt('0', zero); - Base10StringToFGInt('1', one); - Base10StringToFGInt('2', two); - FGIntsub(FGIntp, one, temp1); - FGIntsub(FGIntp, one, pmin1); - - b := 0; - While (temp1.Number[1] Mod 2) = 0 Do - Begin - b := b + 1; - FGIntShiftRight(temp1); - End; - m := temp1; - - i := 0; - ok := true; - Randomize; - While (i < nrtest) And ok Do - Begin - i := i + 1; - Base10StringToFGInt(inttostr(Primes[Random(1227) + 1]), temp2); - FGIntMontGomeryModExp(temp2, m, FGIntp, z); - FGIntDestroy(temp2); - ok1 := (FGIntCompareAbs(z, one) = Eq); - ok2 := (FGIntCompareAbs(z, pmin1) = Eq); - If Not (ok1 Or ok2) Then - Begin - - While (ok And (j < b)) Do - Begin - If (j > 0) And ok1 Then ok := false - Else - Begin - j := j + 1; - If (j < b) And (Not ok2) Then - Begin - FGIntSquaremod(z, FGIntp, temp3); - FGIntCopy(temp3, z); - ok1 := (FGIntCompareAbs(z, one) = Eq); - ok2 := (FGIntCompareAbs(z, pmin1) = Eq); - If ok2 Then j := b; - End - Else If (Not ok2) And (j >= b) Then ok := false; - End; - End; - - End - End; - - FGIntDestroy(zero); - FGIntDestroy(one); - FGIntDestroy(two); - FGIntDestroy(m); - FGIntDestroy(z); - FGIntDestroy(pmin1); -End; - - -// Compute the coefficients from the Bezout Bachet theorem, FGInt1 * a + FGInt2 * b = GCD(FGInt1, FGInt2) - -Procedure FGIntBezoutBachet(Var FGInt1, FGInt2, a, b : TFGInt); -Var - zero, r1, r2, r3, ta, gcd, temp, temp1, temp2 : TFGInt; -Begin - If FGIntCompareAbs(FGInt1, FGInt2) <> St Then - Begin - FGIntcopy(FGInt1, r1); - FGIntcopy(FGInt2, r2); - Base10StringToFGInt('0', zero); - Base10StringToFGInt('1', a); - Base10StringToFGInt('0', ta); - - Repeat - FGIntdivmod(r1, r2, temp, r3); - FGIntDestroy(r1); - r1 := r2; - r2 := r3; - - FGIntmul(ta, temp, temp1); - FGIntsub(a, temp1, temp2); - FGIntCopy(ta, a); - FGIntCopy(temp2, ta); - FGIntDestroy(temp1); - - FGIntDestroy(temp); - Until FGIntCompareAbs(r3, zero) = Eq; - - FGIntGCD(FGInt1, FGInt2, gcd); - FGIntmul(a, FGInt1, temp1); - FGIntsub(gcd, temp1, temp2); - FGIntDestroy(temp1); - FGIntdiv(temp2, FGInt2, b); - FGIntDestroy(temp2); - - FGIntDestroy(ta); - FGIntDestroy(r1); - FGIntDestroy(r2); - FGIntDestroy(gcd); - End - Else FGIntBezoutBachet(FGInt2, FGInt1, b, a); -End; - - -// Find the (multiplicative) Modular inverse of a FGInt in a finite ring -// of additive order base - -Procedure FGIntModInv(Const FGInt1, base : TFGInt; Var Inverse : TFGInt); -Var - zero, one, r1, r2, r3, tb, gcd, temp, temp1, temp2 : TFGInt; -Begin - Base10StringToFGInt('1', one); - FGIntGCD(FGInt1, base, gcd); - If FGIntCompareAbs(one, gcd) = Eq Then - Begin - FGIntcopy(base, r1); - FGIntcopy(FGInt1, r2); - Base10StringToFGInt('0', zero); - Base10StringToFGInt('0', inverse); - Base10StringToFGInt('1', tb); - - Repeat - FGIntDestroy(r3); - FGIntdivmod(r1, r2, temp, r3); - FGIntCopy(r2, r1); - FGIntCopy(r3, r2); - - FGIntmul(tb, temp, temp1); - FGIntsub(inverse, temp1, temp2); - FGIntDestroy(inverse); - FGIntDestroy(temp1); - FGIntCopy(tb, inverse); - FGIntCopy(temp2, tb); - - FGIntDestroy(temp); - Until FGIntCompareAbs(r3, zero) = Eq; - - If inverse.Sign = negative Then - Begin - FGIntadd(base, inverse, temp); - FGIntCopy(temp, inverse); - End; - - FGIntDestroy(tb); - FGIntDestroy(r1); - FGIntDestroy(r2); - End; - FGIntDestroy(gcd); - FGIntDestroy(one); -End; - - -// Perform a (combined) primality test on FGIntp consisting of a trialdivision upto 8192, -// if the FGInt passes perform nrRMtests Rabin Miller primality tests, returns ok when a -// FGInt is probably prime - -Procedure FGIntPrimetest(Var FGIntp : TFGInt; nrRMtests : integer; Var ok : boolean); -Begin - FGIntTrialdiv9999(FGIntp, ok); - If ok Then FGIntRabinMiller(FGIntp, nrRMtests, ok); -End; - - -// Computes the Legendre symbol for a any number and -// p a prime, returns 0 if p divides a, 1 if a is a -// quadratic residu mod p, -1 if a is a quadratic -// nonresidu mod p - -Procedure FGIntLegendreSymbol(Var a, p : TFGInt; Var L : integer); -Var - temp1, temp2, temp3, temp4, temp5, zero, one : TFGInt; - i : LongWord; - ok1, ok2 : boolean; -Begin - Base10StringToFGInt('0', zero); - Base10StringToFGInt('1', one); - FGIntMod(a, p, temp1); - If FGIntCompareAbs(zero, temp1) = Eq Then - Begin - FGIntDestroy(temp1); - L := 0; - End - Else - Begin - FGIntDestroy(temp1); - FGIntCopy(p, temp1); - FGIntCopy(a, temp2); - L := 1; - While FGIntCompareAbs(temp2, one) <> Eq Do - Begin - If (temp2.Number[1] Mod 2) = 0 Then - Begin - FGIntSquare(temp1, temp3); - FGIntSub(temp3, one, temp4); - FGIntDestroy(temp3); - FGIntDivByInt(temp4, temp3, 8, i); - If (temp3.Number[1] Mod 2) = 0 Then ok1 := false Else ok1 := true; - FGIntDestroy(temp3); - FGIntDestroy(temp4); - If ok1 = true Then L := L * (-1); - FGIntDivByIntBis(temp2, 2, i); - End - Else - Begin - FGIntSub(temp1, one, temp3); - FGIntSub(temp2, one, temp4); - FGIntMul(temp3, temp4, temp5); - FGIntDestroy(temp3); - FGIntDestroy(temp4); - FGIntDivByInt(temp5, temp3, 4, i); - If (temp3.Number[1] Mod 2) = 0 Then ok2 := false Else ok2 := true; - FGIntDestroy(temp5); - FGIntDestroy(temp3); - If ok2 = true Then L := L * (-1); - FGIntMod(temp1, temp2, temp3); - FGIntCopy(temp2, temp1); - FGIntCopy(temp3, temp2); - End; - End; - FGIntDestroy(temp1); - FGIntDestroy(temp2); - End; - FGIntDestroy(zero); - FGIntDestroy(one); -End; - - -// Compute a square root modulo a prime number -// SquareRoot^2 mod Prime = Square - -Procedure FGIntSquareRootModP(Square, Prime : TFGInt; Var SquareRoot : TFGInt); -Var - one, n, b, s, r, temp, temp1, temp2, temp3 : TFGInt; - a, i, j : longint; - L : Integer; -Begin - Base2StringToFGInt('1', one); - Base2StringToFGInt('10', n); - a := 0; - FGIntLegendreSymbol(n, Prime, L); - While L <> -1 Do - Begin - FGIntAddBis(n, one); - FGIntLegendreSymbol(n, Prime, L); - End; - FGIntCopy(Prime, s); - s.Number[1] := s.Number[1] - 1; - While (s.Number[1] Mod 2) = 0 Do - Begin - FGIntShiftRight(s); - a := a + 1; - End; - FGIntMontgomeryModExp(n, s, Prime, b); - FGIntAdd(s, one, temp); - FGIntShiftRight(temp); - FGIntMontgomeryModExp(Square, temp, Prime, r); - FGIntDestroy(temp); - FGIntModInv(Square, Prime, temp1); - - For i := 0 To (a - 2) Do - Begin - FGIntSquareMod(r, Prime, temp2); - FGIntMulMod(temp1, temp2, Prime, temp); - FGIntDestroy(temp2); - For j := 1 To (a - i - 2) Do - Begin - FGIntSquareMod(temp, Prime, temp2); - FGIntDestroy(temp); - FGIntCopy(temp2, temp); - FGIntDestroy(temp2); - End; - If FGIntCompareAbs(temp, one) <> Eq Then - Begin - FGIntMulMod(r, b, Prime, temp3); - FGIntDestroy(r); - FGIntCopy(temp3, r); - FGIntDestroy(temp3); - End; - FGIntDestroy(temp); - FGIntDestroy(temp2); - If i = (a - 2) Then break; - FGIntSquareMod(b, Prime, temp3); - FGIntDestroy(b); - FGIntCopy(temp3, b); - FGIntDestroy(temp3); - End; - - FGIntCopy(r, SquareRoot); - FGIntDestroy(r); - FGIntDestroy(s); - FGIntDestroy(b); - FGIntDestroy(temp1); - FGIntDestroy(one); - FGIntDestroy(n); -End; - - -End. diff --git a/lib/base/devel/bignums.nim b/lib/base/devel/bignums.nim deleted file mode 100644 index 1d2b3685d..000000000 --- a/lib/base/devel/bignums.nim +++ /dev/null @@ -1,1712 +0,0 @@ -# -# -# Nimrod's Runtime Library -# (c) Copyright 2008 Andreas Rumpf -# -# See the file "copying.txt", included in this -# distribution, for details about the copyright. -# - -## This module implements big integers for Nimrod. -## This module is an adaptation of the FGInt module for Pascal by Walied -## Othman: http://triade.studentenweb.org - - -# License, info, etc -# ------------------ -# -# This implementation is made by me, Walied Othman, to contact me -# mail to Walied.Othman@belgacom.net or Triade@ulyssis.org, -# always mention wether it 's about the FGInt for Delphi or for -# FreePascal, or wether it 's about the 6xs, preferably in the subject line. -# If you 're going to use these implementations, at least mention my -# name or something and notify me so I may even put a link on my page. -# This implementation is freeware and according to the coderpunks' -# manifesto it should remain so, so don 't use these implementations -# in commercial software. Encryption, as a tool to ensure privacy -# should be free and accessible for anyone. If you plan to use these -# implementations in a commercial application, contact me before -# doing so, that way you can license the software to use it in commercial -# Software. If any algorithm is patented in your country, you should -# acquire a license before using this software. Modified versions of this -# software must contain an acknowledgement of the original author (=me). -# This implementation is available at -# http://triade.studentenweb.org -# -# copyright 2000, Walied Othman -# This header may not be removed. -# - -type - TBigInt* {.final.} = object ## type that represent an arbitrary long - ## signed integer - s: int # sign: -1 or 1 - n: seq[int] # the number part - -proc len(x: TBigInt): int {.inline.} = return x.n.len - -proc CompareAbs(a, b: TBigInt): int = - result = a.len - b.len - if result == 0: - var i = b.len-1 - while (i > 0) and a.n[i] == b.n[i]: dec(i) - result = a.n[i] - b.n[i] - -const - bitMask = high(int) - bitshift = sizeof(int)*8 - 1 - -proc cutZeros(a: var TBigInt) = - var L = a.len - while a.len > 0 and a[L-1] == 0: dec(L) - setLen(a.n, L) - -proc addAux(a, b: TBigInt, bSign: int): TBigInt - if a.len < b.len: - result = addAux(b, a, bSign) - elif a.s == bSign: - result.s = a.s - result.n = [] - setlen(result.n, a.len+1) - var rest = 0 - for i in 0..b.len-1: - var trest = a.n[i] - trest = trest +% b.n[i] +% rest - result.n[i] = trest and bitMask - rest = trest shr bitshift - for i in b.len .. a.len-1: - var trest = a.n[i] +% rest - result.n[i] = trest and bitMask - rest = trest shr bitshift - result.n[a.len] = rest - cutZeros(result) - elif compareAbs(a, b) > 0: - result = addAux(b, a, bSign) - else: - setlen(result.n, a.len+1) - result.s = a.s - var rest = 0 - for i in 0..b.len-1: - var Trest = low(int) - TRest = Trest +% a.n[i] -% b.n[i] -% rest - result.n[i] = Trest and bitmask - if Trest >% bitMask: rest = 0 else: rest = 1 - for i in b.len .. a.len-1: - var Trest = low(int) - TRest = Trest +% a.n[i] -% rest - result.n[i] = Trest and bitmask - if (Trest >% bitmask): rest = 0 else: rest = 1 - cutZeros(result) - -proc `+` *(a, b: TBigInt): TBigInt = - ## the `+` operator for bigints - result = addAux(a, b, +1) - -proc `-` *(a, b: TBigInt): TBigInt = - ## the `-` operator for bigints - result = addAux(a, b, -1) - -proc mulInPlace(a: var TBigInt, b: int) = - var - size, rest: int32 - Trest: int64 - size = FGInt.Number[0] - setlen(FGInt.Number, size + 2) - rest = 0 - for i in countup(1, size): - Trest = FGInt.Number[i] - TRest = Trest * by - TRest = Trest + rest - FGInt.Number[i] = Trest And 2147483647 - rest = Trest Shr 31 - if rest != 0: - size = size + 1 - FGInt.Number[size] = rest - else: - setlen(FGInt.Number, size + 1) - FGInt.Number[0] = size - - -import - SysUtils, Math - -type - TCompare* = enum - Lt, St, Eq, Er - TSign = enum - negative, positive - TBigInt* {.final.} = object - Sign: TSign - Number: seq[int32] - - -proc zeronetochar8*(g: var char, x: String) -proc zeronetochar6*(g: var int, x: String) -proc initialize8*(trans: var openarray[String]) -proc initialize6*(trans: var openarray[String]) -proc initialize6PGP*(trans: var openarray[String]) -proc ConvertBase256to64*(str256: String, str64: var String) -proc ConvertBase64to256*(str64: String, str256: var String) -proc ConvertBase256to2*(str256: String, str2: var String) -proc ConvertBase64to2*(str64: String, str2: var String) -proc ConvertBase2to256*(str2: String, str256: var String) -proc ConvertBase2to64*(str2: String, str64: var String) -proc ConvertBase256StringToHexString*(Str256: String, HexStr: var String) -proc ConvertHexStringToBase256String*(HexStr: String, Str256: var String) -proc PGPConvertBase256to64*(str256, str64: var String) -proc PGPConvertBase64to256*(str64: String, str256: var String) -proc PGPConvertBase64to2*(str64: String, str2: var String) -proc FGIntToBase2String*(FGInt: TBigInt, S: var String) -proc Base2StringToFGInt*(S: String, FGInt: var TBigInt) -proc FGIntToBase256String*(FGInt: TBigInt, str256: var String) -proc Base256StringToFGInt*(str256: String, FGInt: var TBigInt) -proc PGPMPIToFGInt*(PGPMPI: String, FGInt: var TBigInt) -proc FGIntToPGPMPI*(FGInt: TBigInt, PGPMPI: var String) -proc Base10StringToFGInt*(Base10: String, FGInt: var TBigInt) -proc FGIntToBase10String*(FGInt: TBigInt, Base10: var String) -proc FGIntDestroy*(FGInt: var TBigInt) -proc FGIntCompareAbs*(FGInt1, FGInt2: TBigInt): TCompare -proc FGIntAdd*(FGInt1, FGInt2: TBigInt, Sum: var TBigInt) -proc FGIntChangeSign*(FGInt: var TBigInt) -proc FGIntSub*(FGInt1, FGInt2, dif: var TBigInt) -proc FGIntMulByInt*(FGInt: TBigInt, res: var TBigInt, by: int32) -proc FGIntMulByIntbis*(FGInt: var TBigInt, by: int32) -proc FGIntDivByInt*(FGInt: TBigInt, res: var TBigInt, by: int32, modres: var int32) -proc FGIntDivByIntBis*(FGInt: var TBigInt, by: int32, modres: var int32) -proc FGIntModByInt*(FGInt: TBigInt, by: int32, modres: var int32) -proc FGIntAbs*(FGInt: var TBigInt) -proc FGIntCopy*(FGInt1: TBigInt, FGInt2: var TBigInt) -proc FGIntShiftLeft*(FGInt: var TBigInt) -proc FGIntShiftRight*(FGInt: var TBigInt) -proc FGIntShiftRightBy31*(FGInt: var TBigInt) -proc FGIntAddBis*(FGInt1: var TBigInt, FGInt2: TBigInt) -proc FGIntSubBis*(FGInt1: var TBigInt, FGInt2: TBigInt) -proc FGIntMul*(FGInt1, FGInt2: TBigInt, Prod: var TBigInt) -proc FGIntSquare*(FGInt: TBigInt, Square: var TBigInt) -proc FGIntExp*(FGInt, exp: TBigInt, res: var TBigInt) -proc FGIntFac*(FGInt: TBigInt, res: var TBigInt) -proc FGIntShiftLeftBy31*(FGInt: var TBigInt) -proc FGIntDivMod*(FGInt1, FGInt2, QFGInt, MFGInt: var TBigInt) -proc FGIntDiv*(FGInt1, FGInt2, QFGInt: var TBigInt) -proc FGIntMod*(FGInt1, FGInt2, MFGInt: var TBigInt) -proc FGIntSquareMod*(FGInt, Modb, FGIntSM: var TBigInt) -proc FGIntAddMod*(FGInt1, FGInt2, base, FGIntres: var TBigInt) -proc FGIntMulMod*(FGInt1, FGInt2, base, FGIntres: var TBigInt) -proc FGIntModExp*(FGInt, exp, modb, res: var TBigInt) -proc FGIntModBis*(FGInt: TBigInt, FGIntOut: var TBigInt, b, head: int32) -proc FGIntMulModBis*(FGInt1, FGInt2: TBigInt, Prod: var TBigInt, b, head: int32) -proc FGIntMontgomeryMod*(GInt, base, baseInv: TBigInt, MGInt: var TBigInt, - b: int32, head: int32) -proc FGIntMontgomeryModExp*(FGInt, exp, modb, res: var TBigInt) -proc FGIntGCD*(FGInt1, FGInt2: TBigInt, GCD: var TBigInt) -proc FGIntLCM*(FGInt1, FGInt2: TBigInt, LCM: var TBigInt) -proc FGIntTrialDiv9999*(FGInt: TBigInt, ok: var bool) -proc FGIntRandom1*(Seed, RandomFGInt: var TBigInt) -proc FGIntRabinMiller*(FGIntp: var TBigInt, nrtest: int32, ok: var bool) -proc FGIntBezoutBachet*(FGInt1, FGInt2, a, b: var TBigInt) -proc FGIntModInv*(FGInt1, base: TBigInt, Inverse: var TBigInt) -proc FGIntPrimetest*(FGIntp: var TBigInt, nrRMtests: int, ok: var bool) -proc FGIntLegendreSymbol*(a, p: var TBigInt, L: var int) -proc FGIntSquareRootModP*(Square, Prime: TBigInt, SquareRoot: var TBigInt) -# implementation - -var - primes: array[1..1228, int] = [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, - 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, - 101, 103, 107, 109, 113, 127, 131, 137, 139, - 149, 151, 157, 163, 167, 173, 179, 181, 191, - 193, 197, 199, 211, 223, 227, 229, 233, 239, - 241, 251, 257, 263, 269, 271, 277, 281, 283, - 293, 307, 311, 313, 317, 331, 337, 347, 349, - 353, 359, 367, 373, 379, 383, 389, 397, 401, - 409, 419, 421, 431, 433, 439, 443, 449, 457, - 461, 463, 467, 479, 487, 491, 499, 503, 509, - 521, 523, 541, 547, 557, 563, 569, 571, 577, - 587, 593, 599, 601, 607, 613, 617, 619, 631, - 641, 643, 647, 653, 659, 661, 673, 677, 683, - 691, 701, 709, 719, 727, 733, 739, 743, 751, - 757, 761, 769, 773, 787, 797, 809, 811, 821, - 823, 827, 829, 839, 853, 857, 859, 863, 877, - 881, 883, 887, 907, 911, 919, 929, 937, 941, - 947, 953, 967, 971, 977, 983, 991, 997, 1009, - 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, - 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, - 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, - 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, - 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, - 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, - 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, - 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, - 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, - 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, - 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, - 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, - 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, - 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, - 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, - 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, - 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, - 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, - 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, - 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, - 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, - 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, - 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, - 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, - 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, - 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, - 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, - 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, - 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, - 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, - 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, - 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, - 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, - 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, - 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, - 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, - 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, - 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, - 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, - 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, - 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, - 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, - 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, - 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, - 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, - 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, - 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, - 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, - 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, - 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, - 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, - 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, - 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, - 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, - 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, - 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, - 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, - 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, - 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, - 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, - 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, - 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, - 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, - 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, - 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, - 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, - 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, - 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, - 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, - 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, - 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, - 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, - 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, - 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, - 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, - 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, - 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, - 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, - 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, - 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, - 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, - 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, - 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, - 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, - 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, - 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, - 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, - 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, - 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, - 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, - 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, - 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, - 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, - 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, - 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, - 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, - 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, - 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, - 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, - 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, - 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, - 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, - 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, - 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, - 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, - 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, - 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, - 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, - 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, - 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, - 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, - 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, - 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, - 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, - 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, - 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, - 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, - 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, - 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, - 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, - 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, - 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, - 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, - 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, - 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, - 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, - 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, - 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, - 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, - 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, - 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, - 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, - 9941, 9949, 9967, 9973] - chr64: array[1..64, char] = ['a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', - 'f', 'F', 'g', 'G', 'h', 'H', 'i', 'I', 'j', 'J', - 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'o', 'O', - 'p', 'P', 'q', 'Q', 'r', 'R', 's', 'S', 't', 'T', - 'u', 'U', 'v', 'V', 'w', 'W', 'x', 'X', 'y', 'Y', - 'z', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', '+', '='] - PGPchr64: array[1..64, char] = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', - 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', - 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', - 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', - 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', - 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', - '2', '3', '4', '5', '6', '7', '8', '9', '+', - '/'] - -proc zeronetochar8(g: var char, x: String) = - var b: int8 - b = 0 - for i in countup(1, 8): - if copy(x, i, 1) == '1': b = b Or (1 Shl (8 - I)) - g = chr(b) - -proc zeronetochar6(g: var int, x: String) = - G = 0 - for I in countup(1, len(X)): - if I > 6: break - if X[I] != '0': G = G Or (1 Shl (6 - I)) - Inc(G) - -proc initialize8(trans: var openarray[String]) = - var - x: String - g: char - for c1 in countup(0, 1): - for c2 in countup(0, 1): - for c3 in countup(0, 1): - for c4 in countup(0, 1): - for c5 in countup(0, 1): - for c6 in countup(0, 1): - for c7 in countup(0, 1): - for c8 in countup(0, 1): - x = chr(48 + c1) + chr(48 + c2) + chr(48 + c3) + chr(48 + c4) + - chr(48 + c5) + chr(48 + c6) + chr(48 + c7) + chr(48 + c8) - zeronetochar8(g, x) - trans[ord(g)] = x - -proc initialize6(trans: var openarray[String]) = - var - x: String - g: int - for c1 in countup(0, 1): - for c2 in countup(0, 1): - for c3 in countup(0, 1): - for c4 in countup(0, 1): - for c5 in countup(0, 1): - for c6 in countup(0, 1): - x = chr(48 + c1) + chr(48 + c2) + chr(48 + c3) + chr(48 + c4) + - chr(48 + c5) + chr(48 + c6) - zeronetochar6(g, x) - trans[ord(chr64[g])] = x - -proc initialize6PGP(trans: var openarray[String]) = - var - x: String - g: int - for c1 in countup(0, 1): - for c2 in countup(0, 1): - for c3 in countup(0, 1): - for c4 in countup(0, 1): - for c5 in countup(0, 1): - for c6 in countup(0, 1): - x = chr(48 + c1) + chr(48 + c2) + chr(48 + c3) + chr(48 + c4) + - chr(48 + c5) + chr(48 + c6) - zeronetochar6(g, x) - trans[ord(PGPchr64[g])] = x - -proc ConvertBase256to64(str256: String, str64: var String) = - var - temp: String - trans: array[0..255, String] - len6: int32 - g: int - initialize8(trans) - temp = "" - for i in countup(1, len(str256)): temp = temp + trans[ord(str256[i])] - while (len(temp) Mod 6) != 0: temp = temp & '0' - len6 = len(temp) Div 6 - str64 = "" - for i in countup(1, len6): - zeronetochar6(g, copy(temp, 1, 6)) - str64 = str64 + chr64[g] - delete(temp, 1, 6) - -proc ConvertBase64to256(str64: String, str256: var String) = - var - temp: String - trans: array[0..255, String] - len8: int32 - g: char - initialize6(trans) - temp = "" - for i in countup(1, len(str64)): temp = temp + trans[ord(str64[i])] - str256 = "" - len8 = len(temp) Div 8 - for i in countup(1, len8): - zeronetochar8(g, copy(temp, 1, 8)) - str256 = str256 + g - delete(temp, 1, 8) - -proc ConvertBase256to2(str256: String, str2: var String) = - var trans: array[0..255, String] - str2 = "" - initialize8(trans) - for i in countup(1, len(str256)): str2 = str2 + trans[ord(str256[i])] - -proc ConvertBase64to2(str64: String, str2: var String) = - var trans: array[0..255, String] - str2 = "" - initialize6(trans) - for i in countup(1, len(str64)): str2 = str2 + trans[ord(str64[i])] - -proc ConvertBase2to256(str2: String, str256: var String) = - var - len8: int32 - g: char - str256 = "" - while (len(str2) Mod 8) != 0: str2 = '0' & str2 - len8 = len(str2) Div 8 - for i in countup(1, len8): - zeronetochar8(g, copy(str2, 1, 8)) - str256 = str256 + g - delete(str2, 1, 8) - -proc ConvertBase2to64(str2: String, str64: var String) = - var - len6: int32 - g: int - str64 = "" - while (len(str2) Mod 6) != 0: str2 = '0' & str2 - len6 = len(str2) Div 6 - for i in countup(1, len6): - zeronetochar6(g, copy(str2, 1, 6)) - str64 = str64 + chr64[g] - delete(str2, 1, 6) - -proc ConvertBase256StringToHexString(Str256: String, HexStr: var String) = - var b: int8 - HexStr = "" - for i in countup(1, len(str256)): - b = ord(str256[i]) - if (b Shr 4) < 10: HexStr = HexStr + chr(48 + (b Shr 4)) - else: HexStr = HexStr + chr(55 + (b Shr 4)) - if (b And 15) < 10: HexStr = HexStr + chr(48 + (b And 15)) - else: HexStr = HexStr + chr(55 + (b And 15)) - -proc ConvertHexStringToBase256String(HexStr: String, Str256: var String) = - var - b, h1, h2: int8 - temp: string - Str256 = "" - if (len(Hexstr) mod 2) == 1: temp = '0' & HexStr - else: temp = HexStr - for i in countup(1, (len(temp) Div 2)): - h2 = ord(temp[2 * i]) - h1 = ord(temp[2 * i - 1]) - if h1 < 58: b = ((h1 - 48) Shl 4) - else: b = ((h1 - 55) Shl 4) - if h2 < 58: b = (b Or (h2 - 48)) - else: b = (b Or ((h2 - 55) and 15)) - Str256 = Str256 + chr(b) - -proc PGPConvertBase256to64(str256, str64: var String) = - var - temp, x, a: String - len6: int32 - g: int - trans: array[0..255, String] - initialize8(trans) - temp = "" - for i in countup(1, len(str256)): temp = temp + trans[ord(str256[i])] - if (len(temp) Mod 6) == 0: - a = "" - elif (len(temp) Mod 6) == 4: - temp = temp & "00" - a = '=' - else: - temp = temp & "0000" - a = "==" - str64 = "" - len6 = len(temp) Div 6 - for i in countup(1, len6): - x = copy(temp, 1, 6) - zeronetochar6(g, x) - str64 = str64 + PGPchr64[g] - delete(temp, 1, 6) - str64 = str64 + a - -proc PGPConvertBase64to256(str64: String, str256: var String) = - var - temp, x: String - j, len8: int32 - g: char - trans: array[0..255, String] - initialize6PGP(trans) - temp = "" - str256 = "" - if str64[len(str64) - 1] == '=': j = 2 - elif str64[len(str64)] == '=': j = 1 - else: j = 0 - for i in countup(1, (len(str64) - j)): temp = temp + trans[ord(str64[i])] - if j != 0: delete(temp, len(temp) - 2 * j + 1, 2 * j) - len8 = len(temp) Div 8 - for i in countup(1, len8): - x = copy(temp, 1, 8) - zeronetochar8(g, x) - str256 = str256 + g - delete(temp, 1, 8) - -proc PGPConvertBase64to2(str64: String, str2: var String) = - var - j: int32 - trans: array[0..255, String] - str2 = "" - initialize6(trans) - if str64[len(str64) - 1] == '=': j = 2 - elif str64[len(str64)] == '=': j = 1 - else: j = 0 - for i in countup(1, (len(str64) - j)): str2 = str2 + trans[ord(str64[i])] - delete(str2, len(str2) - 2 * j + 1, 2 * j) - -proc FGIntToBase2String(FGInt: TBigInt, S: var String) = - S = "" - for i in countup(1, FGInt.Number[0]): - for j in countup(0, 30): - if (1 And (FGInt.Number[i] Shr j)) == 1: S = '1' & S - else: S = '0' & S - while (len(S) > 1) And (S[1] == '0'): delete(S, 1, 1) - if S == "": S = '0' - -proc Base2StringToFGInt(S: String, FGInt: var TBigInt) = - var i, j, size: int32 - while (S[1] == '0') And (len(S) > 1): delete(S, 1, 1) - size = len(S) Div 31 - if (len(S) Mod 31) != 0: size = size + 1 - setlen(FGInt.Number, (size + 1)) - FGInt.Number[0] = size - j = 1 - FGInt.Number[j] = 0 - i = 0 - while len(S) > 0: - if S[len(S)] == '1': FGInt.Number[j] = FGInt.Number[j] Or (1 Shl i) - i = i + 1 - if i == 31: - i = 0 - j = j + 1 - if j <= size: FGInt.Number[j] = 0 - delete(S, len(S), 1) - FGInt.Sign = positive - -proc FGIntToBase256String(FGInt: TBigInt, str256: var String) = - var - temp1: String - len8: int32 - g: char - FGIntToBase2String(FGInt, temp1) - while (len(temp1) Mod 8) != 0: temp1 = '0' & temp1 - len8 = len(temp1) Div 8 - str256 = "" - for i in countup(1, len8): - zeronetochar8(g, copy(temp1, 1, 8)) - str256 = str256 + g - delete(temp1, 1, 8) - -proc Base256StringToFGInt(str256: String, FGInt: var TBigInt) = - var - temp1: String - trans: array[0..255, String] - temp1 = "" - initialize8(trans) - for i in countup(1, len(str256)): temp1 = temp1 + trans[ord(str256[i])] - while (temp1[1] == '0') And (temp1 != '0'): delete(temp1, 1, 1) - Base2StringToFGInt(temp1, FGInt) - -proc PGPMPIToFGInt(PGPMPI: String, FGInt: var TBigInt) = - var temp: String - temp = PGPMPI - delete(temp, 1, 2) - Base256StringToFGInt(temp, FGInt) - -proc FGIntToPGPMPI(FGInt: TBigInt, PGPMPI: var String) = - var - length: int16 - c: char - b: int8 - FGIntToBase256String(FGInt, PGPMPI) - length = len(PGPMPI) * 8 - c = PGPMPI[1] - for i in countdown(7, 0): - if (ord(c) Shr i) == 0: length = length - 1 - else: break - b = length Mod 256 - PGPMPI = chr(b) + PGPMPI - b = length Div 256 - PGPMPI = chr(b) + PGPMPI - -proc GIntDivByIntBis1(GInt: var TBigInt, by: int32, modres: var int16) = - var size, rest, temp: int32 - size = GInt.Number[0] - temp = 0 - for i in countdown(size, 1): - temp = temp * 10000 - rest = temp + GInt.Number[i] - GInt.Number[i] = rest Div by - temp = rest Mod by - modres = temp - while (GInt.Number[size] == 0) And (size > 1): size = size - 1 - if size != GInt.Number[0]: - setlen(GInt.Number, size + 1) - GInt.Number[0] = size - -proc Base10StringToFGInt(Base10: String, FGInt: var TBigInt) = - var - size: int32 - j: int16 - S, x: String - sign: TSign - while (Not (Base10[1] In {'-', '0'..'9'})) And (len(Base10) > 1): - delete(Base10, 1, 1) - if copy(Base10, 1, 1) == '-': - Sign = negative - delete(Base10, 1, 1) - else: - Sign = positive - while (len(Base10) > 1) And (copy(Base10, 1, 1) == '0'): delete(Base10, 1, 1) - size = len(Base10) Div 4 - if (len(Base10) Mod 4) != 0: size = size + 1 - setlen(FGInt.Number, size + 1) - FGInt.Number[0] = size - for i in countup(1, (size - 1)): - x = copy(Base10, len(Base10) - 3, 4) - FGInt.Number[i] = StrToInt(x) - delete(Base10, len(Base10) - 3, 4) - FGInt.Number[size] = StrToInt(Base10) - S = "" - while (FGInt.Number[0] != 1) Or (FGInt.Number[1] != 0): - GIntDivByIntBis1(FGInt, 2, j) - S = inttostr(j) + S - if S == "": S = '0' - FGIntDestroy(FGInt) - Base2StringToFGInt(S, FGInt) - FGInt.Sign = sign - -proc FGIntToBase10String(FGInt: TBigInt, Base10: var String) = - var - S: String - j: int32 - temp: TBigInt - FGIntCopy(FGInt, temp) - Base10 = "" - while (temp.Number[0] > 1) Or (temp.Number[1] > 0): - FGIntDivByIntBis(temp, 10000, j) - S = IntToStr(j) - while len(S) < 4: S = '0' & S - Base10 = S + Base10 - Base10 = '0' & Base10 - while (len(Base10) > 1) And (Base10[1] == '0'): delete(Base10, 1, 1) - if FGInt.Sign == negative: Base10 = '-' & Base10 - -proc FGIntDestroy(FGInt: var TBigInt) = - FGInt.Number = nil - -proc FGIntCompareAbs(FGInt1, FGInt2: TBigInt): TCompare = - var size1, size2, i: int32 - FGIntCompareAbs = Er - size1 = FGInt1.Number[0] - size2 = FGInt2.Number[0] - if size1 > size2: - FGIntCompareAbs = Lt - elif size1 < size2: - FGIntCompareAbs = St - else: - i = size2 - while (FGInt1.Number[i] == FGInt2.Number[i]) And (i > 1): i = i - 1 - if FGInt1.Number[i] == FGInt2.Number[i]: FGIntCompareAbs = Eq - elif FGInt1.Number[i] < FGInt2.Number[i]: FGIntCompareAbs = St - elif FGInt1.Number[i] > FGInt2.Number[i]: FGIntCompareAbs = Lt - -proc FGIntAdd(FGInt1, FGInt2: TBigInt, Sum: var TBigInt) = - var size1, size2, size, rest, Trest: int32 - size1 = FGInt1.Number[0] - size2 = FGInt2.Number[0] - if size1 < size2: - FGIntAdd(FGInt2, FGInt1, Sum) - else: - if FGInt1.Sign == FGInt2.Sign: - Sum.Sign = FGInt1.Sign - setlen(Sum.Number, (size1 + 2)) - rest = 0 - for i in countup(1, size2): - Trest = FGInt1.Number[i] - Trest = Trest + FGInt2.Number[i] - Trest = Trest + rest - Sum.Number[i] = Trest And 2147483647 - rest = Trest Shr 31 - for i in countup((size2 + 1), size1): - Trest = FGInt1.Number[i] + rest - Sum.Number[i] = Trest And 2147483647 - rest = Trest Shr 31 - size = size1 + 1 - Sum.Number[0] = size - Sum.Number[size] = rest - while (Sum.Number[size] == 0) And (size > 1): size = size - 1 - if Sum.Number[0] != size: setlen(Sum.Number, size + 1) - Sum.Number[0] = size - else: - if FGIntCompareAbs(FGInt2, FGInt1) == Lt: - FGIntAdd(FGInt2, FGInt1, Sum) - else: - setlen(Sum.Number, (size1 + 1)) - rest = 0 - for i in countup(1, size2): - Trest = 0x80000000 # 2147483648; - TRest = Trest + FGInt1.Number[i] - TRest = Trest - FGInt2.Number[i] - TRest = Trest - rest - Sum.Number[i] = Trest And 2147483647 - if (Trest > 2147483647): rest = 0 - else: rest = 1 - for i in countup((size2 + 1), size1): - Trest = 0x80000000 - TRest = Trest + FGInt1.Number[i] - TRest = Trest - rest - Sum.Number[i] = Trest And 2147483647 - if (Trest > 2147483647): rest = 0 - else: rest = 1 - size = size1 - while (Sum.Number[size] == 0) And (size > 1): size = size - 1 - if size != size1: setlen(Sum.Number, size + 1) - Sum.Number[0] = size - Sum.Sign = FGInt1.Sign - -proc FGIntChangeSign(FGInt: var TBigInt) = - if FGInt.Sign == negative: FGInt.Sign = positive - else: FGInt.Sign = negative - -proc FGIntSub(FGInt1, FGInt2, dif: var TBigInt) = - FGIntChangeSign(FGInt2) - FGIntAdd(FGInt1, FGInt2, dif) - FGIntChangeSign(FGInt2) - -proc FGIntMulByInt(FGInt: TBigInt, res: var TBigInt, by: int32) = - var - size, rest: int32 - Trest: int64 - size = FGInt.Number[0] - setlen(res.Number, (size + 2)) - rest = 0 - for i in countup(1, size): - Trest = FGInt.Number[i] - TRest = Trest * by - TRest = Trest + rest - res.Number[i] = Trest And 2147483647 - rest = Trest Shr 31 - if rest != 0: - size = size + 1 - Res.Number[size] = rest - else: - setlen(Res.Number, size + 1) - Res.Number[0] = size - Res.Sign = FGInt.Sign - -proc FGIntMulByIntbis(FGInt: var TBigInt, by: int32) = - var - size, rest: int32 - Trest: int64 - size = FGInt.Number[0] - setlen(FGInt.Number, size + 2) - rest = 0 - for i in countup(1, size): - Trest = FGInt.Number[i] - TRest = Trest * by - TRest = Trest + rest - FGInt.Number[i] = Trest And 2147483647 - rest = Trest Shr 31 - if rest != 0: - size = size + 1 - FGInt.Number[size] = rest - else: - setlen(FGInt.Number, size + 1) - FGInt.Number[0] = size - -proc FGIntDivByInt(FGInt: TBigInt, res: var TBigInt, by: int32, modres: var int32) = - var - size: int32 - rest: int64 - size = FGInt.Number[0] - setlen(res.Number, (size + 1)) - modres = 0 - for i in countdown(size, 1): - rest = modres - rest = rest Shl 31 - rest = rest Or FGInt.Number[i] - res.Number[i] = rest Div by - modres = rest Mod by - while (res.Number[size] == 0) And (size > 1): size = size - 1 - if size != FGInt.Number[0]: setlen(res.Number, size + 1) - res.Number[0] = size - Res.Sign = FGInt.Sign - if FGInt.sign == negative: modres = by - modres - -proc FGIntDivByIntBis(FGInt: var TBigInt, by: int32, modres: var int32) = - var - size: int32 - temp, rest: int64 - size = FGInt.Number[0] - temp = 0 - for i in countdown(size, 1): - temp = temp Shl 31 - rest = temp Or FGInt.Number[i] - FGInt.Number[i] = rest Div by - temp = rest Mod by - modres = temp - while (FGInt.Number[size] == 0) And (size > 1): size = size - 1 - if size != FGInt.Number[0]: - setlen(FGInt.Number, size + 1) - FGInt.Number[0] = size - -proc FGIntModByInt(FGInt: TBigInt, by: int32, modres: var int32) = - var - size: int32 - temp, rest: int64 - size = FGInt.Number[0] - temp = 0 - for i in countdown(size, 1): - temp = temp Shl 31 - rest = temp Or FGInt.Number[i] - temp = rest Mod by - modres = temp - if FGInt.sign == negative: modres = by - modres - -proc FGIntAbs(FGInt: var TBigInt) = - FGInt.Sign = positive - -proc FGIntCopy(FGInt1: TBigInt, FGInt2: var TBigInt) = - FGInt2.Sign = FGInt1.Sign - FGInt2.Number = nil - FGInt2.Number = Copy(FGInt1.Number, 0, FGInt1.Number[0] + 1) - -proc FGIntShiftLeft(FGInt: var TBigInt) = - var l, m, size: int32 - size = FGInt.Number[0] - l = 0 - for i in countup(1, Size): - m = FGInt.Number[i] Shr 30 - FGInt.Number[i] = ((FGInt.Number[i] Shl 1) Or l) And 2147483647 - l = m - if l != 0: - setlen(FGInt.Number, size + 2) - FGInt.Number[size + 1] = l - FGInt.Number[0] = size + 1 - -proc FGIntShiftRight(FGInt: var TBigInt) = - var l, m, size: int32 - size = FGInt.Number[0] - l = 0 - for i in countdown(size, 1): - m = FGInt.Number[i] And 1 - FGInt.Number[i] = (FGInt.Number[i] Shr 1) Or l - l = m Shl 30 - if (FGInt.Number[size] == 0) And (size > 1): - setlen(FGInt.Number, size) - FGInt.Number[0] = size - 1 - -proc FGIntShiftRightBy31(FGInt: var TBigInt) = - var size: int32 - size = FGInt.Number[0] - if size > 1: - for i in countup(1, size - 1): - FGInt.Number[i] = FGInt.Number[i + 1] - setlen(FGInt.Number, Size) - FGInt.Number[0] = size - 1 - else: - FGInt.Number[1] = 0 - -proc FGIntAddBis(FGInt1: var TBigInt, FGInt2: TBigInt) = - var size1, size2, Trest, rest: int32 - size1 = FGInt1.Number[0] - size2 = FGInt2.Number[0] - rest = 0 - for i in countup(1, size2): - Trest = FGInt1.Number[i] + FGInt2.Number[i] + rest - rest = Trest Shr 31 - FGInt1.Number[i] = Trest And 2147483647 - for i in countup(size2 + 1, size1): - Trest = FGInt1.Number[i] + rest - rest = Trest Shr 31 - FGInt1.Number[i] = Trest And 2147483647 - if rest != 0: - setlen(FGInt1.Number, size1 + 2) - FGInt1.Number[0] = size1 + 1 - FGInt1.Number[size1 + 1] = rest - -proc FGIntSubBis(FGInt1: var TBigInt, FGInt2: TBigInt) = - var size1, size2, rest, Trest: int32 - size1 = FGInt1.Number[0] - size2 = FGInt2.Number[0] - rest = 0 - for i in countup(1, size2): - Trest = (0x80000000 Or FGInt1.Number[i]) - FGInt2.Number[i] - rest - if (Trest > 2147483647): rest = 0 - else: rest = 1 - FGInt1.Number[i] = Trest And 2147483647 - for i in countup(size2 + 1, size1): - Trest = (0x80000000 Or FGInt1.Number[i]) - rest - if (Trest > 2147483647): rest = 0 - else: rest = 1 - FGInt1.Number[i] = Trest And 2147483647 - i = size1 - while (FGInt1.Number[i] == 0) And (i > 1): i = i - 1 - if i != size1: - setlen(FGInt1.Number, i + 1) - FGInt1.Number[0] = i - -proc FGIntMul(FGInt1, FGInt2: TBigInt, Prod: var TBigInt) = - var - size, size1, size2, rest: int32 - Trest: int64 - size1 = FGInt1.Number[0] - size2 = FGInt2.Number[0] - size = size1 + size2 - setlen(Prod.Number, (size + 1)) - for i in countup(1, size): Prod.Number[i] = 0 - for i in countup(1, size2): - rest = 0 - for j in countup(1, size1): - Trest = FGInt1.Number[j] - Trest = Trest * FGInt2.Number[i] - Trest = Trest + Prod.Number[j + i - 1] - Trest = Trest + rest - Prod.Number[j + i - 1] = Trest And 2147483647 - rest = Trest Shr 31 - Prod.Number[i + size1] = rest - Prod.Number[0] = size - while (Prod.Number[size] == 0) And (size > 1): size = size - 1 - if size != Prod.Number[0]: - setlen(Prod.Number, size + 1) - Prod.Number[0] = size - if FGInt1.Sign == FGInt2.Sign: Prod.Sign = Positive - else: prod.Sign = negative - -proc FGIntSquare(FGInt: TBigInt, Square: var TBigInt) = - var - size, size1, rest: int32 - Trest: int64 - size1 = FGInt.Number[0] - size = 2 * size1 - setlen(Square.Number, (size + 1)) - Square.Number[0] = size - for i in countup(1, size): Square.Number[i] = 0 - for i in countup(1, size1): - Trest = FGInt.Number[i] - Trest = Trest * FGInt.Number[i] - Trest = Trest + Square.Number[2 * i - 1] - Square.Number[2 * i - 1] = Trest And 2147483647 - rest = Trest Shr 31 - for j in countup(i + 1, size1): - Trest = FGInt.Number[i] Shl 1 - Trest = Trest * FGInt.Number[j] - Trest = Trest + Square.Number[i + j - 1] - Trest = Trest + rest - Square.Number[i + j - 1] = Trest And 2147483647 - rest = Trest Shr 31 - Square.Number[i + size1] = rest - Square.Sign = positive - while (Square.Number[size] == 0) And (size > 1): size = size - 1 - if size != (2 * size1): - setlen(Square.Number, size + 1) - Square.Number[0] = size - -proc FGIntExp(FGInt, exp: TBigInt, res: var TBigInt) = - var - temp2, temp3: TBigInt - S: String - FGIntToBase2String(exp, S) - if S[len(S)] == '0': Base10StringToFGInt('1', res) - else: FGIntCopy(FGInt, res) - FGIntCopy(FGInt, temp2) - if len(S) > 1: - for i in countdown((len(S) - 1), 1): - FGIntSquare(temp2, temp3) - FGIntCopy(temp3, temp2) - if S[i] == '1': - FGIntMul(res, temp2, temp3) - FGIntCopy(temp3, res) - -proc FGIntFac(FGInt: TBigInt, res: var TBigInt) = - var one, temp, temp1: TBigInt - FGIntCopy(FGInt, temp) - Base10StringToFGInt('1', res) - Base10StringToFGInt('1', one) - while Not (FGIntCompareAbs(temp, one) == Eq): - FGIntMul(temp, res, temp1) - FGIntCopy(temp1, res) - FGIntSubBis(temp, one) - FGIntDestroy(one) - FGIntDestroy(temp) - -proc FGIntShiftLeftBy31(FGInt: var TBigInt) = - var - f1, f2: int32 - size: int32 - size = FGInt.Number[0] - setlen(FGInt.Number, size + 2) - f1 = 0 - for i in countup(1, (size + 1)): - f2 = FGInt.Number[i] - FGInt.Number[i] = f1 - f1 = f2 - FGInt.Number[0] = size + 1 - -proc FGIntDivMod(FGInt1, FGInt2, QFGInt, MFGInt: var TBigInt) = - var - one, zero, temp1, temp2: TBigInt - s1, s2: TSign - j, s: int32 - i: int64 - s1 = FGInt1.Sign - s2 = FGInt2.Sign - FGIntAbs(FGInt1) - FGIntAbs(FGInt2) - FGIntCopy(FGInt1, MFGInt) - FGIntCopy(FGInt2, temp1) - if FGIntCompareAbs(FGInt1, FGInt2) != St: - s = FGInt1.Number[0] - FGInt2.Number[0] - setlen(QFGInt.Number, (s + 2)) - QFGInt.Number[0] = s + 1 - for t in countup(1, s): - FGIntShiftLeftBy31(temp1) - QFGInt.Number[t] = 0 - j = s + 1 - QFGInt.Number[j] = 0 - while FGIntCompareAbs(MFGInt, FGInt2) != St: - while FGIntCompareAbs(MFGInt, temp1) != St: - if MFGInt.Number[0] > temp1.Number[0]: - i = MFGInt.Number[MFGInt.Number[0]] - i = i Shl 31 - i = i + MFGInt.Number[MFGInt.Number[0] - 1] - i = i Div (temp1.Number[temp1.Number[0]] + 1) - else: - i = MFGInt.Number[MFGInt.Number[0]] Div - (temp1.Number[temp1.Number[0]] + 1) - if (i != 0): - FGIntCopy(temp1, temp2) - FGIntMulByIntBis(temp2, i) - FGIntSubBis(MFGInt, temp2) - QFGInt.Number[j] = QFGInt.Number[j] + i - if FGIntCompareAbs(MFGInt, temp2) != St: - QFGInt.Number[j] = QFGInt.Number[j] + i - FGIntSubBis(MFGInt, temp2) - FGIntDestroy(temp2) - else: - QFGInt.Number[j] = QFGInt.Number[j] + 1 - FGIntSubBis(MFGInt, temp1) - if MFGInt.Number[0] <= temp1.Number[0]: - if FGIntCompareAbs(temp1, FGInt2) != Eq: - FGIntShiftRightBy31(temp1) - j = j - 1 - else: - Base10StringToFGInt('0', QFGInt) - s = QFGInt.Number[0] - while (s > 1) And (QFGInt.Number[s] == 0): s = s - 1 - if s < QFGInt.Number[0]: - setlen(QFGInt.Number, s + 1) - QFGInt.Number[0] = s - QFGInt.Sign = positive - FGIntDestroy(temp1) - Base10StringToFGInt('0', zero) - Base10StringToFGInt('1', one) - if s1 == negative: - if FGIntCompareAbs(MFGInt, zero) != Eq: - FGIntadd(QFGInt, one, temp1) - FGIntDestroy(QFGInt) - FGIntCopy(temp1, QFGInt) - FGIntDestroy(temp1) - FGIntsub(FGInt2, MFGInt, temp1) - FGIntDestroy(MFGInt) - FGIntCopy(temp1, MFGInt) - FGIntDestroy(temp1) - if s2 == positive: QFGInt.Sign = negative - else: - QFGInt.Sign = s2 - FGIntDestroy(one) - FGIntDestroy(zero) - FGInt1.Sign = s1 - FGInt2.Sign = s2 - -proc FGIntDiv(FGInt1, FGInt2, QFGInt: var TBigInt) = - var - one, zero, temp1, temp2, MFGInt: TBigInt - s1, s2: TSign - j, s: int32 - i: int64 - s1 = FGInt1.Sign - s2 = FGInt2.Sign - FGIntAbs(FGInt1) - FGIntAbs(FGInt2) - FGIntCopy(FGInt1, MFGInt) - FGIntCopy(FGInt2, temp1) - if FGIntCompareAbs(FGInt1, FGInt2) != St: - s = FGInt1.Number[0] - FGInt2.Number[0] - setlen(QFGInt.Number, (s + 2)) - QFGInt.Number[0] = s + 1 - for t in countup(1, s): - FGIntShiftLeftBy31(temp1) - QFGInt.Number[t] = 0 - j = s + 1 - QFGInt.Number[j] = 0 - while FGIntCompareAbs(MFGInt, FGInt2) != St: - while FGIntCompareAbs(MFGInt, temp1) != St: - if MFGInt.Number[0] > temp1.Number[0]: - i = MFGInt.Number[MFGInt.Number[0]] - i = i Shl 31 - i = i + MFGInt.Number[MFGInt.Number[0] - 1] - i = i Div (temp1.Number[temp1.Number[0]] + 1) - else: - i = MFGInt.Number[MFGInt.Number[0]] Div - (temp1.Number[temp1.Number[0]] + 1) - if (i != 0): - FGIntCopy(temp1, temp2) - FGIntMulByIntBis(temp2, i) - FGIntSubBis(MFGInt, temp2) - QFGInt.Number[j] = QFGInt.Number[j] + i - if FGIntCompareAbs(MFGInt, temp2) != St: - QFGInt.Number[j] = QFGInt.Number[j] + i - FGIntSubBis(MFGInt, temp2) - FGIntDestroy(temp2) - else: - QFGInt.Number[j] = QFGInt.Number[j] + 1 - FGIntSubBis(MFGInt, temp1) - if MFGInt.Number[0] <= temp1.Number[0]: - if FGIntCompareAbs(temp1, FGInt2) != Eq: - FGIntShiftRightBy31(temp1) - j = j - 1 - else: - Base10StringToFGInt('0', QFGInt) - s = QFGInt.Number[0] - while (s > 1) And (QFGInt.Number[s] == 0): s = s - 1 - if s < QFGInt.Number[0]: - setlen(QFGInt.Number, s + 1) - QFGInt.Number[0] = s - QFGInt.Sign = positive - FGIntDestroy(temp1) - Base10StringToFGInt('0', zero) - Base10StringToFGInt('1', one) - if s1 == negative: - if FGIntCompareAbs(MFGInt, zero) != Eq: - FGIntadd(QFGInt, one, temp1) - FGIntDestroy(QFGInt) - FGIntCopy(temp1, QFGInt) - FGIntDestroy(temp1) - FGIntsub(FGInt2, MFGInt, temp1) - FGIntDestroy(MFGInt) - FGIntCopy(temp1, MFGInt) - FGIntDestroy(temp1) - if s2 == positive: QFGInt.Sign = negative - else: - QFGInt.Sign = s2 - FGIntDestroy(one) - FGIntDestroy(zero) - FGIntDestroy(MFGInt) - FGInt1.Sign = s1 - FGInt2.Sign = s2 - -proc FGIntMod(FGInt1, FGInt2, MFGInt: var TBigInt) = - var - one, zero, temp1, temp2: TBigInt - s1, s2: TSign - s: int32 - i: int64 - s1 = FGInt1.Sign - s2 = FGInt2.Sign - FGIntAbs(FGInt1) - FGIntAbs(FGInt2) - FGIntCopy(FGInt1, MFGInt) - FGIntCopy(FGInt2, temp1) - if FGIntCompareAbs(FGInt1, FGInt2) != St: - s = FGInt1.Number[0] - FGInt2.Number[0] - for t in countup(1, s): FGIntShiftLeftBy31(temp1) - while FGIntCompareAbs(MFGInt, FGInt2) != St: - while FGIntCompareAbs(MFGInt, temp1) != St: - if MFGInt.Number[0] > temp1.Number[0]: - i = MFGInt.Number[MFGInt.Number[0]] - i = i Shl 31 - i = i + MFGInt.Number[MFGInt.Number[0] - 1] - i = i Div (temp1.Number[temp1.Number[0]] + 1) - else: - i = MFGInt.Number[MFGInt.Number[0]] Div - (temp1.Number[temp1.Number[0]] + 1) - if (i != 0): - FGIntCopy(temp1, temp2) - FGIntMulByIntBis(temp2, i) - FGIntSubBis(MFGInt, temp2) - if FGIntCompareAbs(MFGInt, temp2) != St: FGIntSubBis(MFGInt, temp2) - FGIntDestroy(temp2) - else: - FGIntSubBis(MFGInt, temp1) # If FGIntCompareAbs(MFGInt, temp1) <> St Then FGIntSubBis(MFGInt,temp1); - if MFGInt.Number[0] <= temp1.Number[0]: - if FGIntCompareAbs(temp1, FGInt2) != Eq: FGIntShiftRightBy31(temp1) - FGIntDestroy(temp1) - Base10StringToFGInt('0', zero) - Base10StringToFGInt('1', one) - if s1 == negative: - if FGIntCompareAbs(MFGInt, zero) != Eq: - FGIntSub(FGInt2, MFGInt, temp1) - FGIntDestroy(MFGInt) - FGIntCopy(temp1, MFGInt) - FGIntDestroy(temp1) - FGIntDestroy(one) - FGIntDestroy(zero) - FGInt1.Sign = s1 - FGInt2.Sign = s2 - -proc FGIntSquareMod(FGInt, Modb, FGIntSM: var TBigInt) = - var temp: TBigInt - FGIntSquare(FGInt, temp) - FGIntMod(temp, Modb, FGIntSM) - FGIntDestroy(temp) - -proc FGIntAddMod(FGInt1, FGInt2, base, FGIntres: var TBigInt) = - var temp: TBigInt - FGIntadd(FGInt1, FGInt2, temp) - FGIntMod(temp, base, FGIntres) - FGIntDestroy(temp) - -proc FGIntMulMod(FGInt1, FGInt2, base, FGIntres: var TBigInt) = - var temp: TBigInt - FGIntMul(FGInt1, FGInt2, temp) - FGIntMod(temp, base, FGIntres) - FGIntDestroy(temp) - -proc FGIntModExp(FGInt, exp, modb, res: var TBigInt) = - var - temp2, temp3: TBigInt - S: String - if (Modb.Number[1] Mod 2) == 1: - FGIntMontgomeryModExp(FGInt, exp, modb, res) - return - FGIntToBase2String(exp, S) - Base10StringToFGInt('1', res) - FGIntcopy(FGInt, temp2) - for i in countdown(len(S), 1): - if S[i] == '1': - FGIntmulMod(res, temp2, modb, temp3) - FGIntCopy(temp3, res) - FGIntSquareMod(temp2, Modb, temp3) - FGIntCopy(temp3, temp2) - FGIntDestroy(temp2) - -proc FGIntModBis(FGInt: TBigInt, FGIntOut: var TBigInt, b, head: int32) = - if b <= FGInt.Number[0]: - setlen(FGIntOut.Number, (b + 1)) - for i in countup(0, b): FGIntOut.Number[i] = FGInt.Number[i] - FGIntOut.Number[b] = FGIntOut.Number[b] And head - i = b - while (FGIntOut.Number[i] == 0) And (i > 1): i = i - 1 - if i < b: setlen(FGIntOut.Number, i + 1) - FGIntOut.Number[0] = i - FGIntOut.Sign = positive - else: - FGIntCopy(FGInt, FGIntOut) - -proc FGIntMulModBis(FGInt1, FGInt2: TBigInt, Prod: var TBigInt, b, head: int32) = - var - size, size1, size2, t, rest: int32 - Trest: int64 - size1 = FGInt1.Number[0] - size2 = FGInt2.Number[0] - size = min(b, size1 + size2) - setlen(Prod.Number, (size + 1)) - for i in countup(1, size): Prod.Number[i] = 0 - for i in countup(1, size2): - rest = 0 - t = min(size1, b - i + 1) - for j in countup(1, t): - Trest = FGInt1.Number[j] - Trest = Trest * FGInt2.Number[i] - Trest = Trest + Prod.Number[j + i - 1] - Trest = Trest + rest - Prod.Number[j + i - 1] = Trest And 2147483647 - rest = Trest Shr 31 - if (i + size1) <= b: Prod.Number[i + size1] = rest - Prod.Number[0] = size - if size == b: Prod.Number[b] = Prod.Number[b] And head - while (Prod.Number[size] == 0) And (size > 1): size = size - 1 - if size < Prod.Number[0]: - setlen(Prod.Number, size + 1) - Prod.Number[0] = size - if FGInt1.Sign == FGInt2.Sign: Prod.Sign = Positive - else: prod.Sign = negative - -proc FGIntMontgomeryMod(GInt, base, baseInv: TBigInt, MGInt: var TBigInt, - b: int32, head: int32) = - var - m, temp, temp1: TBigInt - r: int32 - FGIntModBis(GInt, temp, b, head) - FGIntMulModBis(temp, baseInv, m, b, head) - FGIntMul(m, base, temp1) - FGIntDestroy(temp) - FGIntAdd(temp1, GInt, temp) - FGIntDestroy(temp1) - MGInt.Number = copy(temp.Number, b - 1, temp.Number[0] - b + 2) - MGInt.Sign = positive - MGInt.Number[0] = temp.Number[0] - b + 1 - FGIntDestroy(temp) - if (head Shr 30) == 0: FGIntDivByIntBis(MGInt, head + 1, r) - else: FGIntShiftRightBy31(MGInt) - if FGIntCompareAbs(MGInt, base) != St: FGIntSubBis(MGInt, base) - FGIntDestroy(temp) - FGIntDestroy(m) - -proc FGIntMontgomeryModExp(FGInt, exp, modb, res: var TBigInt) = - var - temp2, temp3, baseInv, r, zero: TBigInt - t, b, head: int32 - S: String - Base2StringToFGInt('0', zero) - FGIntMod(FGInt, modb, res) - if FGIntCompareAbs(res, zero) == Eq: - FGIntDestroy(zero) - return - else: - FGIntDestroy(res) - FGIntDestroy(zero) - FGIntToBase2String(exp, S) - t = modb.Number[0] - b = t - if (modb.Number[t] Shr 30) == 1: t = t + 1 - setlen(r.Number, (t + 1)) - r.Number[0] = t - r.Sign = positive - for i in countup(1, t): r.Number[i] = 0 - if t == modb.Number[0]: - head = 2147483647 - for j in countdown(29, 0): - head = head Shr 1 - if (modb.Number[t] Shr j) == 1: - r.Number[t] = 1 Shl (j + 1) - break - else: - r.Number[t] = 1 - head = 2147483647 - FGIntModInv(modb, r, temp2) - if temp2.Sign == negative: - FGIntCopy(temp2, BaseInv) - else: - FGIntCopy(r, BaseInv) - FGIntSubBis(BaseInv, temp2) - FGIntAbs(BaseInv) - FGIntDestroy(temp2) - FGIntMod(r, modb, res) - FGIntMulMod(FGInt, res, modb, temp2) - FGIntDestroy(r) - for i in countdown(len(S), 1): - if S[i] == '1': - FGIntmul(res, temp2, temp3) - FGIntDestroy(res) - FGIntMontgomeryMod(temp3, modb, baseinv, res, b, head) - FGIntDestroy(temp3) - FGIntSquare(temp2, temp3) - FGIntDestroy(temp2) - FGIntMontgomeryMod(temp3, modb, baseinv, temp2, b, head) - FGIntDestroy(temp3) - FGIntDestroy(temp2) - FGIntMontgomeryMod(res, modb, baseinv, temp3, b, head) - FGIntCopy(temp3, res) - FGIntDestroy(temp3) - FGIntDestroy(baseinv) - -proc FGIntGCD(FGInt1, FGInt2: TBigInt, GCD: var TBigInt) = - var - k: TCompare - zero, temp1, temp2, temp3: TBigInt - k = FGIntCompareAbs(FGInt1, FGInt2) - if (k == Eq): - FGIntCopy(FGInt1, GCD) - elif (k == St): - FGIntGCD(FGInt2, FGInt1, GCD) - else: - Base10StringToFGInt('0', zero) - FGIntCopy(FGInt1, temp1) - FGIntCopy(FGInt2, temp2) - while (temp2.Number[0] != 1) Or (temp2.Number[1] != 0): - FGIntMod(temp1, temp2, temp3) - FGIntCopy(temp2, temp1) - FGIntCopy(temp3, temp2) - FGIntDestroy(temp3) - FGIntCopy(temp1, GCD) - FGIntDestroy(temp2) - FGIntDestroy(zero) - -proc FGIntLCM(FGInt1, FGInt2: TBigInt, LCM: var TBigInt) = - var temp1, temp2: TBigInt - FGIntGCD(FGInt1, FGInt2, temp1) - FGIntmul(FGInt1, FGInt2, temp2) - FGIntdiv(temp2, temp1, LCM) - FGIntDestroy(temp1) - FGIntDestroy(temp2) - -proc FGIntTrialDiv9999(FGInt: TBigInt, ok: var bool) = - var - j: int32 - i: int - if ((FGInt.Number[1] Mod 2) == 0): - ok = false - else: - i = 0 - ok = true - while ok And (i < 1228): - i = i + 1 - FGIntmodbyint(FGInt, primes[i], j) - if j == 0: ok = false - -proc FGIntRandom1(Seed, RandomFGInt: var TBigInt) = - var temp, base: TBigInt - Base10StringToFGInt("281474976710656", base) - Base10StringToFGInt("44485709377909", temp) - FGIntMulMod(seed, temp, base, RandomFGInt) - FGIntDestroy(temp) - FGIntDestroy(base) - -proc FGIntRabinMiller(FGIntp: var TBigInt, nrtest: int32, ok: var bool) = - var - j, b, i: int32 - m, z, temp1, temp2, temp3, zero, one, two, pmin1: TBigInt - ok1, ok2: bool - randomize - j = 0 - Base10StringToFGInt('0', zero) - Base10StringToFGInt('1', one) - Base10StringToFGInt('2', two) - FGIntsub(FGIntp, one, temp1) - FGIntsub(FGIntp, one, pmin1) - b = 0 - while (temp1.Number[1] Mod 2) == 0: - b = b + 1 - FGIntShiftRight(temp1) - m = temp1 - i = 0 - ok = true - Randomize - while (i < nrtest) And ok: - i = i + 1 - Base10StringToFGInt(inttostr(Primes[Random(1227) + 1]), temp2) - FGIntMontGomeryModExp(temp2, m, FGIntp, z) - FGIntDestroy(temp2) - ok1 = (FGIntCompareAbs(z, one) == Eq) - ok2 = (FGIntCompareAbs(z, pmin1) == Eq) - if Not (ok1 Or ok2): - while (ok And (j < b)): - if (j > 0) And ok1: - ok = false - else: - j = j + 1 - if (j < b) And (Not ok2): - FGIntSquaremod(z, FGIntp, temp3) - FGIntCopy(temp3, z) - ok1 = (FGIntCompareAbs(z, one) == Eq) - ok2 = (FGIntCompareAbs(z, pmin1) == Eq) - if ok2: j = b - elif (Not ok2) And (j >= b): - ok = false - FGIntDestroy(zero) - FGIntDestroy(one) - FGIntDestroy(two) - FGIntDestroy(m) - FGIntDestroy(z) - FGIntDestroy(pmin1) - -proc FGIntBezoutBachet(FGInt1, FGInt2, a, b: var TBigInt) = - var zero, r1, r2, r3, ta, gcd, temp, temp1, temp2: TBigInt - if FGIntCompareAbs(FGInt1, FGInt2) != St: - FGIntcopy(FGInt1, r1) - FGIntcopy(FGInt2, r2) - Base10StringToFGInt('0', zero) - Base10StringToFGInt('1', a) - Base10StringToFGInt('0', ta) - while true: - FGIntdivmod(r1, r2, temp, r3) - FGIntDestroy(r1) - r1 = r2 - r2 = r3 - FGIntmul(ta, temp, temp1) - FGIntsub(a, temp1, temp2) - FGIntCopy(ta, a) - FGIntCopy(temp2, ta) - FGIntDestroy(temp1) - FGIntDestroy(temp) - if FGIntCompareAbs(r3, zero) == Eq: break - FGIntGCD(FGInt1, FGInt2, gcd) - FGIntmul(a, FGInt1, temp1) - FGIntsub(gcd, temp1, temp2) - FGIntDestroy(temp1) - FGIntdiv(temp2, FGInt2, b) - FGIntDestroy(temp2) - FGIntDestroy(ta) - FGIntDestroy(r1) - FGIntDestroy(r2) - FGIntDestroy(gcd) - else: - FGIntBezoutBachet(FGInt2, FGInt1, b, a) - -proc FGIntModInv(FGInt1, base: TBigInt, Inverse: var TBigInt) = - var zero, one, r1, r2, r3, tb, gcd, temp, temp1, temp2: TBigInt - Base10StringToFGInt('1', one) - FGIntGCD(FGInt1, base, gcd) - if FGIntCompareAbs(one, gcd) == Eq: - FGIntcopy(base, r1) - FGIntcopy(FGInt1, r2) - Base10StringToFGInt('0', zero) - Base10StringToFGInt('0', inverse) - Base10StringToFGInt('1', tb) - while true: - FGIntDestroy(r3) - FGIntdivmod(r1, r2, temp, r3) - FGIntCopy(r2, r1) - FGIntCopy(r3, r2) - FGIntmul(tb, temp, temp1) - FGIntsub(inverse, temp1, temp2) - FGIntDestroy(inverse) - FGIntDestroy(temp1) - FGIntCopy(tb, inverse) - FGIntCopy(temp2, tb) - FGIntDestroy(temp) - if FGIntCompareAbs(r3, zero) == Eq: break - if inverse.Sign == negative: - FGIntadd(base, inverse, temp) - FGIntCopy(temp, inverse) - FGIntDestroy(tb) - FGIntDestroy(r1) - FGIntDestroy(r2) - FGIntDestroy(gcd) - FGIntDestroy(one) - -proc FGIntPrimetest(FGIntp: var TBigInt, nrRMtests: int, ok: var bool) = - FGIntTrialdiv9999(FGIntp, ok) - if ok: FGIntRabinMiller(FGIntp, nrRMtests, ok) - -proc FGIntLegendreSymbol(a, p: var TBigInt, L: var int) = - var - temp1, temp2, temp3, temp4, temp5, zero, one: TBigInt - i: int32 - ok1, ok2: bool - Base10StringToFGInt('0', zero) - Base10StringToFGInt('1', one) - FGIntMod(a, p, temp1) - if FGIntCompareAbs(zero, temp1) == Eq: - FGIntDestroy(temp1) - L = 0 - else: - FGIntDestroy(temp1) - FGIntCopy(p, temp1) - FGIntCopy(a, temp2) - L = 1 - while FGIntCompareAbs(temp2, one) != Eq: - if (temp2.Number[1] Mod 2) == 0: - FGIntSquare(temp1, temp3) - FGIntSub(temp3, one, temp4) - FGIntDestroy(temp3) - FGIntDivByInt(temp4, temp3, 8, i) - if (temp3.Number[1] Mod 2) == 0: ok1 = false - else: ok1 = true - FGIntDestroy(temp3) - FGIntDestroy(temp4) - if ok1 == true: L = L * (- 1) - FGIntDivByIntBis(temp2, 2, i) - else: - FGIntSub(temp1, one, temp3) - FGIntSub(temp2, one, temp4) - FGIntMul(temp3, temp4, temp5) - FGIntDestroy(temp3) - FGIntDestroy(temp4) - FGIntDivByInt(temp5, temp3, 4, i) - if (temp3.Number[1] Mod 2) == 0: ok2 = false - else: ok2 = true - FGIntDestroy(temp5) - FGIntDestroy(temp3) - if ok2 == true: L = L * (- 1) - FGIntMod(temp1, temp2, temp3) - FGIntCopy(temp2, temp1) - FGIntCopy(temp3, temp2) - FGIntDestroy(temp1) - FGIntDestroy(temp2) - FGIntDestroy(zero) - FGIntDestroy(one) - -proc FGIntSquareRootModP(Square, Prime: TBigInt, SquareRoot: var TBigInt) = - var - one, n, b, s, r, temp, temp1, temp2, temp3: TBigInt - a: int32 - L: int - Base2StringToFGInt('1', one) - Base2StringToFGInt("10", n) - a = 0 - FGIntLegendreSymbol(n, Prime, L) - while L != - 1: - FGIntAddBis(n, one) - FGIntLegendreSymbol(n, Prime, L) - FGIntCopy(Prime, s) - s.Number[1] = s.Number[1] - 1 - while (s.Number[1] Mod 2) == 0: - FGIntShiftRight(s) - a = a + 1 - FGIntMontgomeryModExp(n, s, Prime, b) - FGIntAdd(s, one, temp) - FGIntShiftRight(temp) - FGIntMontgomeryModExp(Square, temp, Prime, r) - FGIntDestroy(temp) - FGIntModInv(Square, Prime, temp1) - for i in countup(0, (a - 2)): - FGIntSquareMod(r, Prime, temp2) - FGIntMulMod(temp1, temp2, Prime, temp) - FGIntDestroy(temp2) - for j in countup(1, (a - i - 2)): - FGIntSquareMod(temp, Prime, temp2) - FGIntDestroy(temp) - FGIntCopy(temp2, temp) - FGIntDestroy(temp2) - if FGIntCompareAbs(temp, one) != Eq: - FGIntMulMod(r, b, Prime, temp3) - FGIntDestroy(r) - FGIntCopy(temp3, r) - FGIntDestroy(temp3) - FGIntDestroy(temp) - FGIntDestroy(temp2) - if i == (a - 2): break - FGIntSquareMod(b, Prime, temp3) - FGIntDestroy(b) - FGIntCopy(temp3, b) - FGIntDestroy(temp3) - FGIntCopy(r, SquareRoot) - FGIntDestroy(r) - FGIntDestroy(s) - FGIntDestroy(b) - FGIntDestroy(temp1) - FGIntDestroy(one) - FGIntDestroy(n) diff --git a/lib/base/devel/diff.nim b/lib/base/devel/diff.nim deleted file mode 100644 index 4fda69b45..000000000 --- a/lib/base/devel/diff.nim +++ /dev/null @@ -1,460 +0,0 @@ -# -# -# Nimrod's Runtime Library -# (c) Copyright 2008 Andreas Rumpf -# -# See the file "copying.txt", included in this -# distribution, for details about the copyright. -# - -## This module implements the Difference Algorithm published in -## "An O(ND) Difference Algorithm and its Variations" by Eugene Myers -## Algorithmica Vol. 1 No. 2, 1986, p 251. - -## This implementation is based on: -## -## diff.cs: A port of the algorythm to C# -## Copyright (c) by Matthias Hertel, http://www.mathertel.de -## This work is licensed under a BSD style license. -## See http://www.mathertel.de/License.aspx - -{.push debugger:off .} # the user does not want to trace a part - # of the standard library! - -import - strutils - -type - TResultItem* = object of TObject - startA*: int ## start of line number in A - startB*: int ## start of line number in B - deletedA*: int ## number of deletions in A - deletedB*: int ## number of deletions in B - - SMSRD = tuple[x, y: int] ## shortest middle snake return data - - TDiffData {.final.} = object - len: int - data: seq[int] - modified: seq[bool] - -proc diffText*(a, b: seq[string], - eq: proc (x, y: string): bool): seq[TResultItem] = - ## returns the difference of two texts `a` and `b`. The texts are compared - ## line by line with the `eq` proc. - nil - -proc diffText*(a, b: string, eq: proc (x, y: string): bool): seq[TResultItem] = - ## returns the difference of two texts `a` and `b`. The texts are compared - ## line by line with the `eq` proc. - result = diffText(linesSeq(a), linesSeq(b), eq) - - /// <summary>details of one difference.</summary> - public struct Item - { - /// <summary>Start Line number in Data A.</summary> - public int StartA; - /// <summary>Start Line number in Data B.</summary> - public int StartB; - - /// <summary>Number of changes in Data A.</summary> - public int deletedA; - /// <summary>Number of changes in Data B.</summary> - public int insertedB; - } // Item - - /// <summary> - /// Shortest Middle Snake Return Data - /// </summary> - private struct SMSRD - { - internal int x, y; - // internal int u, v; // 2002.09.20: no need for 2 points - } - - - /// <summary> - /// Find the difference in 2 texts, comparing by textlines. - /// </summary> - /// <param name="TextA">A-version of the text (usualy the old one)</param> - /// <param name="TextB">B-version of the text (usualy the new one)</param> - /// <returns>Returns a array of Items that describe the differences.</returns> - public Item[] DiffText(string TextA, string TextB) { - return (DiffText(TextA, TextB, false, false, false)); - } // DiffText - - - /// <summary> - /// Find the difference in 2 text documents, comparing by textlines. - /// The algorithm itself is comparing 2 arrays of numbers so when comparing 2 text documents - /// each line is converted into a (hash) number. This hash-value is computed by storing all - /// textlines into a common hashtable so i can find dublicates in there, and generating a - /// new number each time a new textline is inserted. - /// </summary> - /// <param name="TextA">A-version of the text (usualy the old one)</param> - /// <param name="TextB">B-version of the text (usualy the new one)</param> - /// <param name="trimSpace">When set to true, all leading and trailing whitespace characters are stripped out before the comparation is done.</param> - /// <param name="ignoreSpace">When set to true, all whitespace characters are converted to a single space character before the comparation is done.</param> - /// <param name="ignoreCase">When set to true, all characters are converted to their lowercase equivivalence before the comparation is done.</param> - /// <returns>Returns a array of Items that describe the differences.</returns> - public static Item[] DiffText(string TextA, string TextB, bool trimSpace, bool ignoreSpace, bool ignoreCase) { - // prepare the input-text and convert to comparable numbers. - Hashtable h = new Hashtable(TextA.Length + TextB.Length); - - // The A-Version of the data (original data) to be compared. - DiffData DataA = new DiffData(DiffCodes(TextA, h, trimSpace, ignoreSpace, ignoreCase)); - - // The B-Version of the data (modified data) to be compared. - DiffData DataB = new DiffData(DiffCodes(TextB, h, trimSpace, ignoreSpace, ignoreCase)); - - h = null; // free up hashtable memory (maybe) - - int MAX = DataA.Length + DataB.Length + 1; - /// vector for the (0,0) to (x,y) search - int[] DownVector = new int[2 * MAX + 2]; - /// vector for the (u,v) to (N,M) search - int[] UpVector = new int[2 * MAX + 2]; - - LCS(DataA, 0, DataA.Length, DataB, 0, DataB.Length, DownVector, UpVector); - - Optimize(DataA); - Optimize(DataB); - return CreateDiffs(DataA, DataB); - } // DiffText - - -proc Optimize(d: var TDiffData) = - ## If a sequence of modified lines starts with a line that contains the - ## same content as the line that appends the changes, the difference sequence - ## is modified so that the appended line and not the starting line is marked - ## as modified. This leads to more readable diff sequences when comparing - ## text files. - var startPos = 0 - while startPos < d.len: - while StartPos < d.len and not d.modified[StartPos]: inc(startPos) - var endPos = startPos - while EndPos < d.len and d.modified[EndPos]: inc(endPos) - if EndPos < d.len and d.data[StartPos] == d.data[EndPos]: - d.modified[StartPos] = false - d.modified[EndPos] = true - else: - StartPos = EndPos - - - /// <summary> - /// Find the difference in 2 arrays of integers. - /// </summary> - /// <param name="ArrayA">A-version of the numbers (usualy the old one)</param> - /// <param name="ArrayB">B-version of the numbers (usualy the new one)</param> - /// <returns>Returns a array of Items that describe the differences.</returns> - public static Item[] DiffInt(int[] ArrayA, int[] ArrayB) { - // The A-Version of the data (original data) to be compared. - DiffData DataA = new DiffData(ArrayA); - - // The B-Version of the data (modified data) to be compared. - DiffData DataB = new DiffData(ArrayB); - - int MAX = DataA.Length + DataB.Length + 1; - /// vector for the (0,0) to (x,y) search - int[] DownVector = new int[2 * MAX + 2]; - /// vector for the (u,v) to (N,M) search - int[] UpVector = new int[2 * MAX + 2]; - - LCS(DataA, 0, DataA.Length, DataB, 0, DataB.Length, DownVector, UpVector); - return CreateDiffs(DataA, DataB); - } // Diff - - - /// <summary> - /// This function converts all textlines of the text into unique numbers for every unique textline - /// so further work can work only with simple numbers. - /// </summary> - /// <param name="aText">the input text</param> - /// <param name="h">This extern initialized hashtable is used for storing all ever used textlines.</param> - /// <param name="trimSpace">ignore leading and trailing space characters</param> - /// <returns>a array of integers.</returns> - private static int[] DiffCodes(string aText, Hashtable h, bool trimSpace, bool ignoreSpace, bool ignoreCase) { - // get all codes of the text - string[] Lines; - int[] Codes; - int lastUsedCode = h.Count; - object aCode; - string s; - - // strip off all cr, only use lf as textline separator. - aText = aText.Replace("\r", ""); - Lines = aText.Split('\n'); - - Codes = new int[Lines.Length]; - - for (int i = 0; i < Lines.Length; ++i) { - s = Lines[i]; - if (trimSpace) - s = s.Trim(); - - if (ignoreSpace) { - s = Regex.Replace(s, "\\s+", " "); // TODO: optimization: faster blank removal. - } - - if (ignoreCase) - s = s.ToLower(); - - aCode = h[s]; - if (aCode == null) { - lastUsedCode++; - h[s] = lastUsedCode; - Codes[i] = lastUsedCode; - } else { - Codes[i] = (int)aCode; - } // if - } // for - return (Codes); - } // DiffCodes - - - /// <summary> - /// This is the algorithm to find the Shortest Middle Snake (SMS). - /// </summary> - /// <param name="DataA">sequence A</param> - /// <param name="LowerA">lower bound of the actual range in DataA</param> - /// <param name="UpperA">upper bound of the actual range in DataA (exclusive)</param> - /// <param name="DataB">sequence B</param> - /// <param name="LowerB">lower bound of the actual range in DataB</param> - /// <param name="UpperB">upper bound of the actual range in DataB (exclusive)</param> - /// <param name="DownVector">a vector for the (0,0) to (x,y) search. Passed as a parameter for speed reasons.</param> - /// <param name="UpVector">a vector for the (u,v) to (N,M) search. Passed as a parameter for speed reasons.</param> - /// <returns>a MiddleSnakeData record containing x,y and u,v</returns> - private static SMSRD SMS(DiffData DataA, int LowerA, int UpperA, DiffData DataB, int LowerB, int UpperB, - int[] DownVector, int[] UpVector) { - - SMSRD ret; - int MAX = DataA.Length + DataB.Length + 1; - - int DownK = LowerA - LowerB; // the k-line to start the forward search - int UpK = UpperA - UpperB; // the k-line to start the reverse search - - int Delta = (UpperA - LowerA) - (UpperB - LowerB); - bool oddDelta = (Delta & 1) != 0; - - // The vectors in the publication accepts negative indexes. the vectors implemented here are 0-based - // and are access using a specific offset: UpOffset UpVector and DownOffset for DownVektor - int DownOffset = MAX - DownK; - int UpOffset = MAX - UpK; - - int MaxD = ((UpperA - LowerA + UpperB - LowerB) / 2) + 1; - - // Debug.Write(2, "SMS", String.Format("Search the box: A[{0}-{1}] to B[{2}-{3}]", LowerA, UpperA, LowerB, UpperB)); - - // init vectors - DownVector[DownOffset + DownK + 1] = LowerA; - UpVector[UpOffset + UpK - 1] = UpperA; - - for (int D = 0; D <= MaxD; D++) { - - // Extend the forward path. - for (int k = DownK - D; k <= DownK + D; k += 2) { - // Debug.Write(0, "SMS", "extend forward path " + k.ToString()); - - // find the only or better starting point - int x, y; - if (k == DownK - D) { - x = DownVector[DownOffset + k + 1]; // down - } else { - x = DownVector[DownOffset + k - 1] + 1; // a step to the right - if ((k < DownK + D) && (DownVector[DownOffset + k + 1] >= x)) - x = DownVector[DownOffset + k + 1]; // down - } - y = x - k; - - // find the end of the furthest reaching forward D-path in diagonal k. - while ((x < UpperA) && (y < UpperB) && (DataA.data[x] == DataB.data[y])) { - x++; y++; - } - DownVector[DownOffset + k] = x; - - // overlap ? - if (oddDelta && (UpK - D < k) && (k < UpK + D)) { - if (UpVector[UpOffset + k] <= DownVector[DownOffset + k]) { - ret.x = DownVector[DownOffset + k]; - ret.y = DownVector[DownOffset + k] - k; - // ret.u = UpVector[UpOffset + k]; // 2002.09.20: no need for 2 points - // ret.v = UpVector[UpOffset + k] - k; - return (ret); - } // if - } // if - - } // for k - - // Extend the reverse path. - for (int k = UpK - D; k <= UpK + D; k += 2) { - // Debug.Write(0, "SMS", "extend reverse path " + k.ToString()); - - // find the only or better starting point - int x, y; - if (k == UpK + D) { - x = UpVector[UpOffset + k - 1]; // up - } else { - x = UpVector[UpOffset + k + 1] - 1; // left - if ((k > UpK - D) && (UpVector[UpOffset + k - 1] < x)) - x = UpVector[UpOffset + k - 1]; // up - } // if - y = x - k; - - while ((x > LowerA) && (y > LowerB) && (DataA.data[x - 1] == DataB.data[y - 1])) { - x--; y--; // diagonal - } - UpVector[UpOffset + k] = x; - - // overlap ? - if (!oddDelta && (DownK - D <= k) && (k <= DownK + D)) { - if (UpVector[UpOffset + k] <= DownVector[DownOffset + k]) { - ret.x = DownVector[DownOffset + k]; - ret.y = DownVector[DownOffset + k] - k; - // ret.u = UpVector[UpOffset + k]; // 2002.09.20: no need for 2 points - // ret.v = UpVector[UpOffset + k] - k; - return (ret); - } // if - } // if - - } // for k - - } // for D - - throw new ApplicationException("the algorithm should never come here."); - } // SMS - - - /// <summary> - /// This is the divide-and-conquer implementation of the longes common-subsequence (LCS) - /// algorithm. - /// The published algorithm passes recursively parts of the A and B sequences. - /// To avoid copying these arrays the lower and upper bounds are passed while the sequences stay constant. - /// </summary> - /// <param name="DataA">sequence A</param> - /// <param name="LowerA">lower bound of the actual range in DataA</param> - /// <param name="UpperA">upper bound of the actual range in DataA (exclusive)</param> - /// <param name="DataB">sequence B</param> - /// <param name="LowerB">lower bound of the actual range in DataB</param> - /// <param name="UpperB">upper bound of the actual range in DataB (exclusive)</param> - /// <param name="DownVector">a vector for the (0,0) to (x,y) search. Passed as a parameter for speed reasons.</param> - /// <param name="UpVector">a vector for the (u,v) to (N,M) search. Passed as a parameter for speed reasons.</param> - private static void LCS(DiffData DataA, int LowerA, int UpperA, DiffData DataB, int LowerB, int UpperB, int[] DownVector, int[] UpVector) { - // Debug.Write(2, "LCS", String.Format("Analyse the box: A[{0}-{1}] to B[{2}-{3}]", LowerA, UpperA, LowerB, UpperB)); - - // Fast walkthrough equal lines at the start - while (LowerA < UpperA && LowerB < UpperB && DataA.data[LowerA] == DataB.data[LowerB]) { - LowerA++; LowerB++; - } - - // Fast walkthrough equal lines at the end - while (LowerA < UpperA && LowerB < UpperB && DataA.data[UpperA - 1] == DataB.data[UpperB - 1]) { - --UpperA; --UpperB; - } - - if (LowerA == UpperA) { - // mark as inserted lines. - while (LowerB < UpperB) - DataB.modified[LowerB++] = true; - - } else if (LowerB == UpperB) { - // mark as deleted lines. - while (LowerA < UpperA) - DataA.modified[LowerA++] = true; - - } else { - // Find the middle snakea and length of an optimal path for A and B - SMSRD smsrd = SMS(DataA, LowerA, UpperA, DataB, LowerB, UpperB, DownVector, UpVector); - // Debug.Write(2, "MiddleSnakeData", String.Format("{0},{1}", smsrd.x, smsrd.y)); - - // The path is from LowerX to (x,y) and (x,y) to UpperX - LCS(DataA, LowerA, smsrd.x, DataB, LowerB, smsrd.y, DownVector, UpVector); - LCS(DataA, smsrd.x, UpperA, DataB, smsrd.y, UpperB, DownVector, UpVector); // 2002.09.20: no need for 2 points - } - } // LCS() - - - /// <summary>Scan the tables of which lines are inserted and deleted, - /// producing an edit script in forward order. - /// </summary> - /// dynamic array - private static Item[] CreateDiffs(DiffData DataA, DiffData DataB) { - ArrayList a = new ArrayList(); - Item aItem; - Item[] result; - - int StartA, StartB; - int LineA, LineB; - - LineA = 0; - LineB = 0; - while (LineA < DataA.Length || LineB < DataB.Length) { - if ((LineA < DataA.Length) && (!DataA.modified[LineA]) - && (LineB < DataB.Length) && (!DataB.modified[LineB])) { - // equal lines - LineA++; - LineB++; - - } else { - // maybe deleted and/or inserted lines - StartA = LineA; - StartB = LineB; - - while (LineA < DataA.Length && (LineB >= DataB.Length || DataA.modified[LineA])) - // while (LineA < DataA.Length && DataA.modified[LineA]) - LineA++; - - while (LineB < DataB.Length && (LineA >= DataA.Length || DataB.modified[LineB])) - // while (LineB < DataB.Length && DataB.modified[LineB]) - LineB++; - - if ((StartA < LineA) || (StartB < LineB)) { - // store a new difference-item - aItem = new Item(); - aItem.StartA = StartA; - aItem.StartB = StartB; - aItem.deletedA = LineA - StartA; - aItem.insertedB = LineB - StartB; - a.Add(aItem); - } // if - } // if - } // while - - result = new Item[a.Count]; - a.CopyTo(result); - - return (result); - } - - } // class Diff - - /// <summary>Data on one input file being compared. - /// </summary> - internal class DiffData - { - - /// <summary>Number of elements (lines).</summary> - internal int Length; - - /// <summary>Buffer of numbers that will be compared.</summary> - internal int[] data; - - /// <summary> - /// Array of booleans that flag for modified data. - /// This is the result of the diff. - /// This means deletedA in the first Data or inserted in the second Data. - /// </summary> - internal bool[] modified; - - /// <summary> - /// Initialize the Diff-Data buffer. - /// </summary> - /// <param name="data">reference to the buffer</param> - internal DiffData(int[] initData) { - data = initData; - Length = initData.Length; - modified = new bool[Length + 2]; - } // DiffData - - } // class DiffData - -{.pop.} diff --git a/lib/base/devel/lex.nim b/lib/base/devel/lex.nim deleted file mode 100644 index 34f0c32a8..000000000 --- a/lib/base/devel/lex.nim +++ /dev/null @@ -1,73 +0,0 @@ -# Lexer generator for Nimrod -# (c) 2008 Andreas Rumpf - -# Stress testing for the macro feature - -# the syntax that should be supported is: - -# template numpostfix = -# '\'' & 'F'|'f'|'i'|'I' & "32"|"64"|"8"|"16" -# template edigits = -# 'e'|'E' & +digits -# tokens( -# tkIdent: +UniIdentStart & *UniIdentRest, -# tkHexNumber: '0' & ('x'|'X') & +hexDigits & ?( numpostfix ), -# tkOctNumber: '0' & ('c'|'C') & +octDigits & ?( numpostfix ), -# tkBinNumber: '0' & ('b'|'B') & +binDigits & ?( numpostfix ), -# tkIntNumber: +digits & ?( numpostfix ), -# tkFloatNumber: +digits & ('.' & +digits & ?(edigits) | edigits) & ?(numpostfix), -# -# ) -# actions( -# tkIdent: lookup -# ) -# - -# -# match inputstream -# of +('A'..'Z' | '_' | 'a'..'z') *('A'..'Z' | '_' | 'a'..'z' | '0'..'9') : -# -# x = inputstream[pos..length] -# of '0' 'x' +('0'..'9' | 'a'..'f' | '_' | 'A'..'F') : -# y = ... - -const - AsciiLetter = {'A'..'Z', 'a'..'z'} - uniLetter = AsciiLetter + {'\128'..'\255'} - digits = {'0'..'9'} - hexDigits = {'0'..'9', 'a'..'f', 'A'..'F'} - octDigits = {'0'..'7'} - binDigits = {'0'..'1'} - AsciiIdentStart = AsciiLetter + {'_'} - AsciiIdentRest = AsciiIdentStart + Digits - UniIdentStart = UniLetter + {'_'} - UniIdentRest = UniIdentStart + Digits - -# --> if match(s, +AsciiIdentStart & *AsciiIdentRest): - -# Regular expressions in Nimrod itself! -# ------------------------------------- -# -# 'a' -- matches the character a -# 'a'..'z' -- range operator '-' -# 'A' | 'B' -- alternative operator | -# * 'a' -- prefix * is needed -# + 'a' -- prefix + is needed -# ? 'a' -- prefix ? is needed -# *? prefix is needed -# +? prefix is needed -# letter -- character classes with real names! -# letters -# white -# whites -# any -- any character -# () -- are Nimrod syntax -# ! 'a'-'z' -# -# -- concatentation via proc call: -# -# re('A' 'Z' *word ) - -macro re(n: expr): expr = - - result = newCall("magic_re", x) diff --git a/lib/base/devel/nregex.nim b/lib/base/devel/nregex.nim deleted file mode 100644 index 77afb8421..000000000 --- a/lib/base/devel/nregex.nim +++ /dev/null @@ -1,124 +0,0 @@ -# new implementation of regular expressions - -type - TRegexKind = enum - regNone, - regChar, - regSet, - regConc, - regAlt, - regStar, - regPlus, - regMN, - regNewline - - TRegex = object of TObject - case kind: TRegexKind - of regChar: c: char - of regSet: s: ref set[char] - else: a, b: PRegEx - - PRegEx* = ref TRegEx - - TRegExFlag* = enum ## Flags concerning the semantics of regular expressions - reCaseInsensitive, ## case insensitive match - reStyleInsensitive ## style insensitive match - - - TRegExFlags* = set[TRegExFlag] - ## Flags concerning the semantics of regular expressions - -proc raiseRegex(msg: string) {.noreturn.} = - var e: ref Exception - new(e) - e.msg = msg - raise e - -proc compileAux(i: int, s: string, r: PRegEx): int - -proc compileBackslash(i: int, s: string, r: PRegEx): int = - var i = i - inc(i) - case s[i] - of 'A'..'Z': - of 'a'..'z': - of '0': - of '1'..'9': - - else: - r.kind = regChar - r.c = s[i] - inc(i) - result = i - -proc compileAtom(i: int, s: string, r: PRegEx): int = - var i = i - case s[i] - of '[': - inc(i) - var inverse = s[i] == '^' - if inverse: inc(i) - r.kind = regSet - new(r.s) - while true: - case s[i] - of '\\': i = compileBackslash(i, s, r) - of ']': - inc(i) - break - of '\0': - raiseRegex("']' expected") - elif s[i+1] == '-': - var x = s[i] - inc(i, 2) - var y = s[i] - inc(i) - r.s = r.s + {x..y} - else: - incl(r.s, s[i]) - inc(i) - if inverse: - r.s = {'\0'..'\255'} - r.s - of '\\': - inc(i) - i = compileBackslash(i, s, r) - of '.': - r.kind = regAny - inc(i) - of '(': - inc(i) - i = compileAux(i, s, r) - if s[i] = ')': inc(i) - else: raiseRegex("')' expected") - of '\0': nil # do nothing - else: - r.kind = regChar - r.c = s[i] - inc(i) - result = i - -proc compilePostfix(i: int, s: string, r: PRegEx): int = - var i = compileAtom(i, s, r) - var a: PRegEx - case s[i] - of '*': - of '+': - of '?': - else: nil - -proc compileAux(i: int, s: string, r: PRegEx): int = - var i = i - i = compileAtom(i, s, r) - - while s[i] != '\0': - - result = i - -proc compile*(regex: string, flags: TRegExFlags = {}): PRegEx = - ## Compiles the string `regex` that represents a regular expression into - ## an internal data structure that can be used for matching. - new(result) - var i = compileAux(0, regex, result) - if i < len(regex)-1: - # not all characters used for the regular expression? - raiseRegEx("invalid regular expression") diff --git a/lib/base/devel/python.nim b/lib/base/devel/python.nim deleted file mode 100644 index d9e87af8c..000000000 --- a/lib/base/devel/python.nim +++ /dev/null @@ -1,1877 +0,0 @@ -# -# Light-weight binding for the Python interpreter -# (c) 2008 Andreas Rumpf -# Based on 'PythonEngine' module by Dr. Dietmar Budelsky -# -# -#************************************************************************ -# -# Module: Unit 'PythonEngine' Copyright (c) 1997 -# -# Version: 3.0 Dr. Dietmar Budelsky -# Sub-Version: 0.25 dbudelsky@web.de -# Germany -# -# Morgan Martinet -# 4721 rue Brebeuf -# H2J 3L2 MONTREAL (QC) -# CANADA -# e-mail: mmm@free.fr -# -# look our page at: http://www.multimania.com/marat -#************************************************************************ -# Functionality: Delphi Components that provide an interface to the -# Python language (see python.txt for more infos on -# Python itself). -# -#************************************************************************ -# Contributors: -# Grzegorz Makarewicz (mak@mikroplan.com.pl) -# Andrew Robinson (andy@hps1.demon.co.uk) -# Mark Watts(mark_watts@hotmail.com) -# Olivier Deckmyn (olivier.deckmyn@mail.dotcom.fr) -# Sigve Tjora (public@tjora.no) -# Mark Derricutt (mark@talios.com) -# Igor E. Poteryaev (jah@mail.ru) -# Yuri Filimonov (fil65@mail.ru) -# Stefan Hoffmeister (Stefan.Hoffmeister@Econos.de) -#************************************************************************ -# This source code is distributed with no WARRANTY, for no reason or use. -# Everyone is allowed to use and change this code free for his own tasks -# and projects, as long as this header and its copyright text is intact. -# For changed versions of this code, which are public distributed the -# following additional conditions have to be fullfilled: -# 1) The header has to contain a comment on the change and the author of -# it. -# 2) A copy of the changed source has to be sent to the above E-Mail -# address or my then valid address, if this is possible to the -# author. -# The second condition has the target to maintain an up to date central -# version of the component. If this condition is not acceptable for -# confidential or legal reasons, everyone is free to derive a component -# or to generate a diff file to my or other original sources. -# Dr. Dietmar Budelsky, 1997-11-17 -#************************************************************************ - -import - dyncalls - -when defined(windows): - const - DllName* = "python24.dll" -else: - const - DllName* = "libpython2.4.so" # for UNIX systems -const - PYT_METHOD_BUFFER_INCREASE* = 10 - PYT_MEMBER_BUFFER_INCREASE* = 10 - PYT_GETSET_BUFFER_INCREASE* = 10 - METH_VARARGS* = 0x0001 - METH_KEYWORDS* = 0x0002 # Masks for the co_flags field of PyCodeObject - CO_OPTIMIZED* = 0x0001 - CO_NEWLOCALS* = 0x0002 - CO_VARARGS* = 0x0004 - CO_VARKEYWORDS* = 0x0008 - -type # Rich comparison opcodes introduced in version 2.1 - TRichComparisonOpcode* = enum - pyLT, pyLE, pyEQ, pyNE, pyGT, pyGE - -const - Py_TPFLAGS_HAVE_GETCHARBUFFER* = (1 shl 0) # PySequenceMethods contains sq_contains - Py_TPFLAGS_HAVE_SEQUENCE_IN* = (1 shl 1) # Objects which participate in garbage collection (see objimp.h) - Py_TPFLAGS_GC* = (1 shl 2) # PySequenceMethods and PyNumberMethods contain in-place operators - Py_TPFLAGS_HAVE_INPLACEOPS* = (1 shl 3) # PyNumberMethods do their own coercion */ - Py_TPFLAGS_CHECKTYPES* = (1 shl 4) - Py_TPFLAGS_HAVE_RICHCOMPARE* = (1 shl 5) # Objects which are weakly referencable if their tp_weaklistoffset is >0 - # XXX Should this have the same value as Py_TPFLAGS_HAVE_RICHCOMPARE? - # These both indicate a feature that appeared in the same alpha release. - Py_TPFLAGS_HAVE_WEAKREFS* = (1 shl 6) # tp_iter is defined - Py_TPFLAGS_HAVE_ITER* = (1 shl 7) # New members introduced by Python 2.2 exist - Py_TPFLAGS_HAVE_CLASS* = (1 shl 8) # Set if the type object is dynamically allocated - Py_TPFLAGS_HEAPTYPE* = (1 shl 9) # Set if the type allows subclassing - Py_TPFLAGS_BASETYPE* = (1 shl 10) # Set if the type is 'ready' -- fully initialized - Py_TPFLAGS_READY* = (1 shl 12) # Set while the type is being 'readied', to prevent recursive ready calls - Py_TPFLAGS_READYING* = (1 shl 13) # Objects support garbage collection (see objimp.h) - Py_TPFLAGS_HAVE_GC* = (1 shl 14) - Py_TPFLAGS_DEFAULT* = Py_TPFLAGS_HAVE_GETCHARBUFFER or - Py_TPFLAGS_HAVE_SEQUENCE_IN or Py_TPFLAGS_HAVE_INPLACEOPS or - Py_TPFLAGS_HAVE_RICHCOMPARE or Py_TPFLAGS_HAVE_WEAKREFS or - Py_TPFLAGS_HAVE_ITER or Py_TPFLAGS_HAVE_CLASS - -type - TPFlag* = enum - tpfHaveGetCharBuffer, tpfHaveSequenceIn, tpfGC, tpfHaveInplaceOps, - tpfCheckTypes, tpfHaveRichCompare, tpfHaveWeakRefs, tpfHaveIter, - tpfHaveClass, tpfHeapType, tpfBaseType, tpfReady, tpfReadying, tpfHaveGC - TPFlags* = set[TPFlag] - -const - TPFLAGS_DEFAULT* = {tpfHaveGetCharBuffer, tpfHaveSequenceIn, - tpfHaveInplaceOps, tpfHaveRichCompare, tpfHaveWeakRefs, tpfHaveIter, - tpfHaveClass} - -const # Python opcodes - single_input* = 256 - file_input* = 257 - eval_input* = 258 - funcdef* = 259 - parameters* = 260 - varargslist* = 261 - fpdef* = 262 - fplist* = 263 - stmt* = 264 - simple_stmt* = 265 - small_stmt* = 266 - expr_stmt* = 267 - augassign* = 268 - print_stmt* = 269 - del_stmt* = 270 - pass_stmt* = 271 - flow_stmt* = 272 - break_stmt* = 273 - continue_stmt* = 274 - return_stmt* = 275 - raise_stmt* = 276 - import_stmt* = 277 - import_as_name* = 278 - dotted_as_name* = 279 - dotted_name* = 280 - global_stmt* = 281 - exec_stmt* = 282 - assert_stmt* = 283 - compound_stmt* = 284 - if_stmt* = 285 - while_stmt* = 286 - for_stmt* = 287 - try_stmt* = 288 - except_clause* = 289 - suite* = 290 - test* = 291 - and_test* = 291 - not_test* = 293 - comparison* = 294 - comp_op* = 295 - expr* = 296 - xor_expr* = 297 - and_expr* = 298 - shift_expr* = 299 - arith_expr* = 300 - term* = 301 - factor* = 302 - power* = 303 - atom* = 304 - listmaker* = 305 - lambdef* = 306 - trailer* = 307 - subscriptlist* = 308 - subscript* = 309 - sliceop* = 310 - exprlist* = 311 - testlist* = 312 - dictmaker* = 313 - classdef* = 314 - arglist* = 315 - argument* = 316 - list_iter* = 317 - list_for* = 318 - list_if* = 319 - -const - T_SHORT* = 0 - T_INT* = 1 - T_LONG* = 2 - T_FLOAT* = 3 - T_DOUBLE* = 4 - T_STRING* = 5 - T_OBJECT* = 6 - T_CHAR* = 7 # 1-character string - T_BYTE* = 8 # 8-bit signed int - T_UBYTE* = 9 - T_USHORT* = 10 - T_UINT* = 11 - T_ULONG* = 12 - T_STRING_INPLACE* = 13 - T_OBJECT_EX* = 16 - READONLY* = 1 - RO* = READONLY # Shorthand - READ_RESTRICTED* = 2 - WRITE_RESTRICTED* = 4 - RESTRICTED* = (READ_RESTRICTED or WRITE_RESTRICTED) - -type - TPyMemberType* = enum - mtShort, mtInt, mtLong, mtFloat, mtDouble, mtString, mtObject, mtChar, - mtByte, mtUByte, mtUShort, mtUInt, mtULong, mtStringInplace, mtObjectEx - TPyMemberFlag* = enum - mfDefault, mfReadOnly, mfReadRestricted, mfWriteRestricted, mfRestricted - -type - TPChar* = array[0..16000, cstring] - PPChar* = ptr TPChar - PInt* = ptr int - PDouble* = ptr float64 - PFloat* = ptr float - PLong* = ptr int32 - PShort* = ptr int8 - PString* = ptr cstring - -type - PP_frozen* = ptr Pfrozen - P_frozen* = ptr Tfrozen - PPyObject* = ptr PyObject - PPPyObject* = ptr PPyObject - PPPPyObject* = ptr PPPyObject - PPyIntObject* = ptr PyIntObject - PPyTypeObject* = ptr PyTypeObject - PPySliceObject* = ptr PySliceObject - TPyCFunction* = proc (self, args: PPyObject): PPyObject{.cdecl.} - Tunaryfunc* = proc (ob1: PPyObject): PPyObject{.cdecl.} - Tbinaryfunc* = proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} - Tternaryfunc* = proc (ob1, ob2, ob3: PPyObject): PPyObject{.cdecl.} - Tinquiry* = proc (ob1: PPyObject): int{.cdecl.} - Tcoercion* = proc (ob1, ob2: PPPyObject): int{.cdecl.} - Tintargfunc* = proc (ob1: PPyObject, i: int): PPyObject{.cdecl.} - Tintintargfunc* = proc (ob1: PPyObject, i1, i2: int): PPyObject{.cdecl.} - Tintobjargproc* = proc (ob1: PPyObject, i: int, ob2: PPyObject): int{.cdecl.} - Tintintobjargproc* = proc (ob1: PPyObject, i1, i2: int, ob2: PPyObject): int{. - cdecl.} - Tobjobjargproc* = proc (ob1, ob2, ob3: PPyObject): int{.cdecl.} - Tpydestructor* = proc (ob: PPyObject){.cdecl.} - Tprintfunc* = proc (ob: PPyObject, f: var file, i: int): int{.cdecl.} - Tgetattrfunc* = proc (ob1: PPyObject, name: cstring): PPyObject{.cdecl.} - Tsetattrfunc* = proc (ob1: PPyObject, name: cstring, ob2: PPyObject): int{. - cdecl.} - Tcmpfunc* = proc (ob1, ob2: PPyObject): int{.cdecl.} - Treprfunc* = proc (ob: PPyObject): PPyObject{.cdecl.} - Thashfunc* = proc (ob: PPyObject): int32{.cdecl.} - Tgetattrofunc* = proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} - Tsetattrofunc* = proc (ob1, ob2, ob3: PPyObject): int{.cdecl.} - Tgetreadbufferproc* = proc (ob1: PPyObject, i: int, ptr: Pointer): int{.cdecl.} - Tgetwritebufferproc* = proc (ob1: PPyObject, i: int, ptr: Pointer): int{.cdecl.} - Tgetsegcountproc* = proc (ob1: PPyObject, i: int): int{.cdecl.} - Tgetcharbufferproc* = proc (ob1: PPyObject, i: int, pstr: cstring): int{.cdecl.} - Tobjobjproc* = proc (ob1, ob2: PPyObject): int{.cdecl.} - Tvisitproc* = proc (ob1: PPyObject, ptr: Pointer): int{.cdecl.} - Ttraverseproc* = proc (ob1: PPyObject, proc: visitproc, ptr: Pointer): int{. - cdecl.} - Trichcmpfunc* = proc (ob1, ob2: PPyObject, i: int): PPyObject{.cdecl.} - Tgetiterfunc* = proc (ob1: PPyObject): PPyObject{.cdecl.} - Titernextfunc* = proc (ob1: PPyObject): PPyObject{.cdecl.} - Tdescrgetfunc* = proc (ob1, ob2, ob3: PPyObject): PPyObject{.cdecl.} - Tdescrsetfunc* = proc (ob1, ob2, ob3: PPyObject): int{.cdecl.} - Tinitproc* = proc (self, args, kwds: PPyObject): int{.cdecl.} - Tnewfunc* = proc (subtype: PPyTypeObject, args, kwds: PPyObject): PPyObject{. - cdecl.} - Tallocfunc* = proc (self: PPyTypeObject, nitems: int): PPyObject{.cdecl.} - TPyNumberMethods*{.final.} = object - nb_add*: Tbinaryfunc - nb_substract*: Tbinaryfunc - nb_multiply*: Tbinaryfunc - nb_divide*: Tbinaryfunc - nb_remainder*: Tbinaryfunc - nb_divmod*: Tbinaryfunc - nb_power*: Tternaryfunc - nb_negative*: Tunaryfunc - nb_positive*: Tunaryfunc - nb_absolute*: Tunaryfunc - nb_nonzero*: Tinquiry - nb_invert*: Tunaryfunc - nb_lshift*: Tbinaryfunc - nb_rshift*: Tbinaryfunc - nb_and*: Tbinaryfunc - nb_xor*: Tbinaryfunc - nb_or*: Tbinaryfunc - nb_coerce*: Tcoercion - nb_int*: Tunaryfunc - nb_long*: Tunaryfunc - nb_float*: Tunaryfunc - nb_oct*: Tunaryfunc - nb_hex*: Tunaryfunc #/ jah 29-sep-2000: updated for python 2.0 - #/ added from .h - nb_inplace_add*: Tbinaryfunc - nb_inplace_subtract*: Tbinaryfunc - nb_inplace_multiply*: Tbinaryfunc - nb_inplace_divide*: Tbinaryfunc - nb_inplace_remainder*: Tbinaryfunc - nb_inplace_power*: Tternaryfunc - nb_inplace_lshift*: Tbinaryfunc - nb_inplace_rshift*: Tbinaryfunc - nb_inplace_and*: Tbinaryfunc - nb_inplace_xor*: Tbinaryfunc - nb_inplace_or*: Tbinaryfunc # Added in release 2.2 - # The following require the Py_TPFLAGS_HAVE_CLASS flag - nb_floor_divide*: Tbinaryfunc - nb_true_divide*: Tbinaryfunc - nb_inplace_floor_divide*: Tbinaryfunc - nb_inplace_true_divide*: Tbinaryfunc - - PPyNumberMethods* = ptr TPyNumberMethods - TPySequenceMethods*{.final.} = object - sq_length*: Tinquiry - sq_concat*: Tbinaryfunc - sq_repeat*: Tintargfunc - sq_item*: Tintargfunc - sq_slice*: Tintintargfunc - sq_ass_item*: Tintobjargproc - sq_ass_slice*: Tintintobjargproc #/ jah 29-sep-2000: updated for python 2.0 - #/ added from .h - sq_contains*: Tobjobjproc - sq_inplace_concat*: Tbinaryfunc - sq_inplace_repeat*: Tintargfunc - - PPySequenceMethods* = ptr TPySequenceMethods - TPyMappingMethods*{.final.} = object - mp_length*: Tinquiry - mp_subscript*: Tbinaryfunc - mp_ass_subscript*: Tobjobjargproc - - PPyMappingMethods* = ptr PyMappingMethods #/ jah 29-sep-2000: updated for python 2.0 - #/ added from .h - TPyBufferProcs*{.final.} = object - bf_getreadbuffer*: Tgetreadbufferproc - bf_getwritebuffer*: Tgetwritebufferproc - bf_getsegcount*: Tgetsegcountproc - bf_getcharbuffer*: Tgetcharbufferproc - - PPyBufferProcs* = ptr TPyBufferProcs - TPy_complex*{.final.} = object - float*: float64 - imag*: float64 - - TPyObject*{.pure.} = object - ob_refcnt*: int - ob_type*: PPyTypeObject - - TPyIntObject* = object of TPyObject - ob_ival*: int32 - - PByte* = ptr int8 - Tfrozen*{.final.} = object - name*: cstring - code*: PByte - size*: int - - TPySliceObject* = object of TPyObject - start*, stop*, step*: PPyObject - - PPyMethodDef* = ptr TPyMethodDef - TPyMethodDef*{.final.} = object # structmember.h - ml_name*: cstring - ml_meth*: TPyCFunction - ml_flags*: int - ml_doc*: cstring - - PPyMemberDef* = ptr TPyMemberDef - TPyMemberDef*{.final.} = object # descrobject.h - # Descriptors - name*: cstring - theType*: int - offset*: int - flags*: int - doc*: cstring - - Tgetter* = proc (obj: PPyObject, context: Pointer): PPyObject{.cdecl.} - Tsetter* = proc (obj, value: PPyObject, context: Pointer): int{.cdecl.} - PPyGetSetDef* = ptr TPyGetSetDef - TPyGetSetDef*{.final.} = object - name*: cstring - get*: Tgetter - set_*: Tsetter - doc*: cstring - closure*: Pointer - - Twrapperfunc* = proc (self, args: PPyObject, wrapped: Pointer): PPyObject{. - cdecl.} - pwrapperbase* = ptr Twrapperbase - Twrapperbase*{.final.} = object # Various kinds of descriptor objects - ##define PyDescr_COMMON \ - # PyObject_HEAD \ - # PyTypeObject *d_type; \ - # PyObject *d_name - # - name*: cstring - wrapper*: Twrapperfunc - doc*: cstring - - PPyDescrObject* = ptr TPyDescrObject - TPyDescrObject* = object of TPyObject - d_type*: PPyTypeObject - d_name*: PPyObject - - PPyMethodDescrObject* = ptr TPyMethodDescrObject - TPyMethodDescrObject* = object of TPyDescrObject - d_method*: PPyMethodDef - - PPyMemberDescrObject* = ptr TPyMemberDescrObject - TPyMemberDescrObject* = object of TPyDescrObject - d_member*: PPyMemberDef - - PPyGetSetDescrObject* = ptr TPyGetSetDescrObject - TPyGetSetDescrObject* = object of TPyDescrObject - d_getset*: PPyGetSetDef - - PPyWrapperDescrObject* = ptr TPyWrapperDescrObject - TPyWrapperDescrObject* = object of TPyDescrObject # object.h - d_base*: pwrapperbase - d_wrapped*: Pointer # This can be any function pointer - - TPyTypeObject* = object of TPyObject - ob_size*: int # Number of items in variable part - tp_name*: cstring # For printing - tp_basicsize*, tp_itemsize*: int # For allocation - # Methods to implement standard operations - tp_dealloc*: Tpydestructor - tp_print*: Tprintfunc - tp_getattr*: Tgetattrfunc - tp_setattr*: Tsetattrfunc - tp_compare*: Tcmpfunc - tp_repr*: Treprfunc # Method suites for standard classes - tp_as_number*: PPyNumberMethods - tp_as_sequence*: PPySequenceMethods - tp_as_mapping*: PPyMappingMethods # More standard operations (here for binary compatibility) - tp_hash*: Thashfunc - tp_call*: Tternaryfunc - tp_str*: Treprfunc - tp_getattro*: Tgetattrofunc - tp_setattro*: Tsetattrofunc #/ jah 29-sep-2000: updated for python 2.0 - # Functions to access object as input/output buffer - tp_as_buffer*: PPyBufferProcs # Flags to define presence of optional/expanded features - tp_flags*: int32 - tp_doc*: cstring # Documentation string - # call function for all accessible objects - tp_traverse*: Ttraverseproc # delete references to contained objects - tp_clear*: Tinquiry # rich comparisons - tp_richcompare*: Trichcmpfunc # weak reference enabler - tp_weaklistoffset*: int32 # Iterators - tp_iter*: Tgetiterfunc - tp_iternext*: Titernextfunc # Attribute descriptor and subclassing stuff - tp_methods*: PPyMethodDef - tp_members*: PPyMemberDef - tp_getset*: PPyGetSetDef - tp_base*: PPyTypeObject - tp_dict*: PPyObject - tp_descr_get*: Tdescrgetfunc - tp_descr_set*: Tdescrsetfunc - tp_dictoffset*: int32 - tp_init*: Tinitproc - tp_alloc*: Tallocfunc - tp_new*: Tnewfunc - tp_free*: Tpydestructor # Low-level free-memory routine - tp_is_gc*: Tinquiry # For PyObject_IS_GC - tp_bases*: PPyObject - tp_mro*: PPyObject # method resolution order - tp_cache*: PPyObject - tp_subclasses*: PPyObject - tp_weaklist*: PPyObject #More spares - tp_xxx7*: pointer - tp_xxx8*: pointer - - PPyMethodChain* = ptr TPyMethodChain - TPyMethodChain*{.final.} = object - methods*: PPyMethodDef - link*: PPyMethodChain - - PPyClassObject* = ptr TPyClassObject - TPyClassObject* = object of TPyObject - cl_bases*: PPyObject # A tuple of class objects - cl_dict*: PPyObject # A dictionary - cl_name*: PPyObject # A string - # The following three are functions or NULL - cl_getattr*: PPyObject - cl_setattr*: PPyObject - cl_delattr*: PPyObject - - PPyInstanceObject* = ptr TPyInstanceObject - TPyInstanceObject* = object of TPyObject # Instance method objects are used for two purposes: - # (a) as bound instance methods (returned by instancename.methodname) - # (b) as unbound methods (returned by ClassName.methodname) - # In case (b), im_self is NULL - # - in_class*: PPyClassObject # The class object - in_dict*: PPyObject # A dictionary - - PPyMethodObject* = ptr TPyMethodObject - TPyMethodObject* = object of TPyObject # Bytecode object, compile.h - im_func*: PPyObject # The function implementing the method - im_self*: PPyObject # The instance it is bound to, or NULL - im_class*: PPyObject # The class that defined the method - - PPyCodeObject* = ptr TPyCodeObject - TPyCodeObject* = object of TPyObject # from pystate.h - co_argcount*: int # #arguments, except *args - co_nlocals*: int # #local variables - co_stacksize*: int # #entries needed for evaluation stack - co_flags*: int # CO_..., see below - co_code*: PPyObject # instruction opcodes (it hides a PyStringObject) - co_consts*: PPyObject # list (constants used) - co_names*: PPyObject # list of strings (names used) - co_varnames*: PPyObject # tuple of strings (local variable names) - co_freevars*: PPyObject # tuple of strings (free variable names) - co_cellvars*: PPyObject # tuple of strings (cell variable names) - # The rest doesn't count for hash/cmp - co_filename*: PPyObject # string (where it was loaded from) - co_name*: PPyObject # string (name, for reference) - co_firstlineno*: int # first source line number - co_lnotab*: PPyObject # string (encoding addr<->lineno mapping) - - PPyInterpreterState* = ptr TPyInterpreterState - PPyThreadState* = ptr TPyThreadState - PPyFrameObject* = ptr TPyFrameObject # Interpreter environments - TPyInterpreterState*{.final.} = object # Thread specific information - next*: PPyInterpreterState - tstate_head*: PPyThreadState - modules*: PPyObject - sysdict*: PPyObject - builtins*: PPyObject - checkinterval*: int - - TPyThreadState*{.final.} = object # from frameobject.h - next*: PPyThreadState - interp*: PPyInterpreterState - frame*: PPyFrameObject - recursion_depth*: int - ticker*: int - tracing*: int - sys_profilefunc*: PPyObject - sys_tracefunc*: PPyObject - curexc_type*: PPyObject - curexc_value*: PPyObject - curexc_traceback*: PPyObject - exc_type*: PPyObject - exc_value*: PPyObject - exc_traceback*: PPyObject - dict*: PPyObject - - PPyTryBlock* = ptr TPyTryBlock - TPyTryBlock*{.final.} = object - b_type*: int # what kind of block this is - b_handler*: int # where to jump to find handler - b_level*: int # value stack level to pop to - - CO_MAXBLOCKS* = range[0..19] - TPyFrameObject* = object of TPyObject # start of the VAR_HEAD of an object - # From traceback.c - ob_size*: int # Number of items in variable part - # End of the Head of an object - f_back*: PPyFrameObject # previous frame, or NULL - f_code*: PPyCodeObject # code segment - f_builtins*: PPyObject # builtin symbol table (PyDictObject) - f_globals*: PPyObject # global symbol table (PyDictObject) - f_locals*: PPyObject # local symbol table (PyDictObject) - f_valuestack*: PPPyObject # points after the last local - # Next free slot in f_valuestack. Frame creation sets to f_valuestack. - # Frame evaluation usually NULLs it, but a frame that yields sets it - # to the current stack top. - f_stacktop*: PPPyObject - f_trace*: PPyObject # Trace function - f_exc_type*, f_exc_value*, f_exc_traceback*: PPyObject - f_tstate*: PPyThreadState - f_lasti*: int # Last instruction if called - f_lineno*: int # Current line number - f_restricted*: int # Flag set if restricted operations - # in this scope - f_iblock*: int # index in f_blockstack - f_blockstack*: array[CO_MAXBLOCKS, PyTryBlock] # for try and loop blocks - f_nlocals*: int # number of locals - f_ncells*: int - f_nfreevars*: int - f_stacksize*: int # size of value stack - f_localsplus*: array[0..0, PPyObject] # locals+stack, dynamically sized - - PPyTraceBackObject* = ptr TPyTraceBackObject - TPyTraceBackObject* = object of TPyObject # Parse tree node interface - tb_next*: PPyTraceBackObject - tb_frame*: PPyFrameObject - tb_lasti*: int - tb_lineno*: int - - PNode* = ptr Tnode - Tnode*{.final.} = object # From weakrefobject.h - n_type*: int16 - n_str*: cstring - n_lineno*: int16 - n_nchildren*: int16 - n_child*: PNode - - PPyWeakReference* = ptr TPyWeakReference - TPyWeakReference* = object of TPyObject # from datetime.h - #* Fields are packed into successive bytes, each viewed as unsigned and - # * big-endian, unless otherwise noted: - # * - # * byte offset - # * 0 year 2 bytes, 1-9999 - # * 2 month 1 byte, 1-12 - # * 3 day 1 byte, 1-31 - # * 4 hour 1 byte, 0-23 - # * 5 minute 1 byte, 0-59 - # * 6 second 1 byte, 0-59 - # * 7 usecond 3 bytes, 0-999999 - # * 10 - # * - wr_object*: PPyObject - wr_callback*: PPyObject - hash*: int32 - wr_prev*: PPyWeakReference - wr_next*: PPyWeakReference - - -const # # of bytes for year, month, and day. - PyDateTime_DATE_DATASIZE* = 4 # # of bytes for hour, minute, second, and usecond. - PyDateTime_TIME_DATASIZE* = 6 # # of bytes for year, month, day, hour, minute, second, and usecond. - PyDateTime_DATETIME_DATASIZE* = 10 - -type - TPyDateTime_Delta* = object of TPyObject - hashcode*: int # -1 when unknown - days*: int # -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS - seconds*: int # 0 <= seconds < 24*3600 is invariant - microseconds*: int # 0 <= microseconds < 1000000 is invariant - - PPyDateTime_Delta* = ptr TPyDateTime_Delta - TPyDateTime_TZInfo* = object of TPyObject # a pure abstract base clase - PPyDateTime_TZInfo* = ptr TPyDateTime_TZInfo # - #/* The datetime and time types have hashcodes, and an optional tzinfo member, - # * present if and only if hastzinfo is true. - # */ - ##define _PyTZINFO_HEAD \ - # PyObject_HEAD \ - # long hashcode; \ - # char hastzinfo; /* boolean flag */ - # - #* No _PyDateTime_BaseTZInfo is allocated; it's just to have something - # * convenient to cast to, when getting at the hastzinfo member of objects - # * starting with _PyTZINFO_HEAD. - # * - TPyDateTime_BaseTZInfo* = object of TPyObject - hashcode*: int - hastzinfo*: bool # boolean flag - - PPyDateTime_BaseTZInfo* = ptr TPyDateTime_BaseTZInfo #* All time objects are of PyDateTime_TimeType, but that can be allocated - # * in two ways, with or without a tzinfo member. Without is the same as - # * tzinfo == None, but consumes less memory. _PyDateTime_BaseTime is an - # * internal struct used to allocate the right amount of space for the - # * "without" case. - # * - ##define _PyDateTime_TIMEHEAD \ - # _PyTZINFO_HEAD \ - # unsigned char data[_PyDateTime_TIME_DATASIZE]; - # - TPyDateTime_BaseTime* = object of TPyDateTime_BaseTZInfo - data*: array[0..Pred(PyDateTime_TIME_DATASIZE), int8] - - PPyDateTime_BaseTime* = ptr TPyDateTime_BaseTime - TPyDateTime_Time* = object of TPyDateTime_BaseTime # hastzinfo true - tzinfo*: PPyObject - - PPyDateTime_Time* = ptr PyDateTime_Time #* All datetime objects are of PyDateTime_DateTimeType, but that can be - # * allocated in two ways too, just like for time objects above. In addition, - # * the plain date type is a base class for datetime, so it must also have - # * a hastzinfo member (although it's unused there). - # * - TPyDateTime_Date* = object of TPyDateTime_BaseTZInfo - data*: array[0..Pred(PyDateTime_DATE_DATASIZE), int8] - - PPyDateTime_Date* = ptr TPyDateTime_Date # - ##define _PyDateTime_DATETIMEHEAD \ - # _PyTZINFO_HEAD \ - # unsigned char data[_PyDateTime_DATETIME_DATASIZE]; - # - TPyDateTime_BaseDateTime* = object of TPyDateTime_BaseTZInfo # hastzinfo false - data*: array[0..Pred(PyDateTime_DATETIME_DATASIZE), int8] - - PPyDateTime_BaseDateTime* = ptr TPyDateTime_BaseDateTime - TPyDateTime_DateTime* = object of TPyDateTime_BaseTZInfo # hastzinfo true - data*: array[0..Pred(PyDateTime_DATETIME_DATASIZE), int8] - tzinfo*: PPyObject - - PPyDateTime_DateTime* = ptr TPyDateTime_DateTime - -######################################################## -### ## -### New exception classes ## -### ## -######################################################## -# -# // Python's exceptions -# EPythonError = object(Exception) -# EName: String; -# EValue: String; -# end; -# EPyExecError = object(EPythonError) -# end; -# -# // Standard exception classes of Python -# -#/// jah 29-sep-2000: updated for python 2.0 -#/// base classes updated according python documentation -# -#{ Hierarchy of Python exceptions, Python 2.3, copied from <INSTALL>\Python\exceptions.c -# -#Exception\n\ -# |\n\ -# +-- SystemExit\n\ -# +-- StopIteration\n\ -# +-- StandardError\n\ -# | |\n\ -# | +-- KeyboardInterrupt\n\ -# | +-- ImportError\n\ -# | +-- EnvironmentError\n\ -# | | |\n\ -# | | +-- IOError\n\ -# | | +-- OSError\n\ -# | | |\n\ -# | | +-- WindowsError\n\ -# | | +-- VMSError\n\ -# | |\n\ -# | +-- EOFError\n\ -# | +-- RuntimeError\n\ -# | | |\n\ -# | | +-- NotImplementedError\n\ -# | |\n\ -# | +-- NameError\n\ -# | | |\n\ -# | | +-- UnboundLocalError\n\ -# | |\n\ -# | +-- AttributeError\n\ -# | +-- SyntaxError\n\ -# | | |\n\ -# | | +-- IndentationError\n\ -# | | |\n\ -# | | +-- TabError\n\ -# | |\n\ -# | +-- TypeError\n\ -# | +-- AssertionError\n\ -# | +-- LookupError\n\ -# | | |\n\ -# | | +-- IndexError\n\ -# | | +-- KeyError\n\ -# | |\n\ -# | +-- ArithmeticError\n\ -# | | |\n\ -# | | +-- OverflowError\n\ -# | | +-- ZeroDivisionError\n\ -# | | +-- FloatingPointError\n\ -# | |\n\ -# | +-- ValueError\n\ -# | | |\n\ -# | | +-- UnicodeError\n\ -# | | |\n\ -# | | +-- UnicodeEncodeError\n\ -# | | +-- UnicodeDecodeError\n\ -# | | +-- UnicodeTranslateError\n\ -# | |\n\ -# | +-- ReferenceError\n\ -# | +-- SystemError\n\ -# | +-- MemoryError\n\ -# |\n\ -# +---Warning\n\ -# |\n\ -# +-- UserWarning\n\ -# +-- DeprecationWarning\n\ -# +-- PendingDeprecationWarning\n\ -# +-- SyntaxWarning\n\ -# +-- OverflowWarning\n\ -# +-- RuntimeWarning\n\ -# +-- FutureWarning" -#} -# EPyException = class (EPythonError); -# EPyStandardError = class (EPyException); -# EPyArithmeticError = class (EPyStandardError); -# EPyLookupError = class (EPyStandardError); -# EPyAssertionError = class (EPyStandardError); -# EPyAttributeError = class (EPyStandardError); -# EPyEOFError = class (EPyStandardError); -# EPyFloatingPointError = class (EPyArithmeticError); -# EPyEnvironmentError = class (EPyStandardError); -# EPyIOError = class (EPyEnvironmentError); -# EPyOSError = class (EPyEnvironmentError); -# EPyImportError = class (EPyStandardError); -# EPyIndexError = class (EPyLookupError); -# EPyKeyError = class (EPyLookupError); -# EPyKeyboardInterrupt = class (EPyStandardError); -# EPyMemoryError = class (EPyStandardError); -# EPyNameError = class (EPyStandardError); -# EPyOverflowError = class (EPyArithmeticError); -# EPyRuntimeError = class (EPyStandardError); -# EPyNotImplementedError = class (EPyRuntimeError); -# EPySyntaxError = class (EPyStandardError) -# public -# EFileName: string; -# ELineStr: string; -# ELineNumber: Integer; -# EOffset: Integer; -# end; -# EPyIndentationError = class (EPySyntaxError); -# EPyTabError = class (EPyIndentationError); -# EPySystemError = class (EPyStandardError); -# EPySystemExit = class (EPyException); -# EPyTypeError = class (EPyStandardError); -# EPyUnboundLocalError = class (EPyNameError); -# EPyValueError = class (EPyStandardError); -# EPyUnicodeError = class (EPyValueError); -# UnicodeEncodeError = class (EPyUnicodeError); -# UnicodeDecodeError = class (EPyUnicodeError); -# UnicodeTranslateError = class (EPyUnicodeError); -# EPyZeroDivisionError = class (EPyArithmeticError); -# EPyStopIteration = class(EPyException); -# EPyWarning = class (EPyException); -# EPyUserWarning = class (EPyWarning); -# EPyDeprecationWarning = class (EPyWarning); -# PendingDeprecationWarning = class (EPyWarning); -# FutureWarning = class (EPyWarning); -# EPySyntaxWarning = class (EPyWarning); -# EPyOverflowWarning = class (EPyWarning); -# EPyRuntimeWarning = class (EPyWarning); -# EPyReferenceError = class (EPyStandardError); -# - -var - PyArg_Parse*: proc (args: PPyObject, format: cstring): int{.cdecl, varargs.} - PyArg_ParseTuple*: proc (args: PPyObject, format: cstring, x1: Pointer = nil, - x2: Pointer = nil, x3: Pointer = nil): int{.cdecl, varargs.} - Py_BuildValue*: proc (format: cstring): PPyObject{.cdecl, varargs.} - PyCode_Addr2Line*: proc (co: PPyCodeObject, addrq: int): int{.cdecl.} - DLL_Py_GetBuildInfo*: proc (): cstring{.cdecl.} # define Python flags. See file pyDebug.h - Py_DebugFlag*: PInt - Py_VerboseFlag*: PInt - Py_InteractiveFlag*: PInt - Py_OptimizeFlag*: PInt - Py_NoSiteFlag*: PInt - Py_UseClassExceptionsFlag*: PInt - Py_FrozenFlag*: PInt - Py_TabcheckFlag*: PInt - Py_UnicodeFlag*: PInt - Py_IgnoreEnvironmentFlag*: PInt - Py_DivisionWarningFlag*: PInt #_PySys_TraceFunc: PPPyObject; - #_PySys_ProfileFunc: PPPPyObject; - PyImport_FrozenModules*: PP_frozen - Py_None*: PPyObject - Py_Ellipsis*: PPyObject - Py_False*: PPyIntObject - Py_True*: PPyIntObject - Py_NotImplemented*: PPyObject - PyExc_AttributeError*: PPPyObject - PyExc_EOFError*: PPPyObject - PyExc_IOError*: PPPyObject - PyExc_ImportError*: PPPyObject - PyExc_IndexError*: PPPyObject - PyExc_KeyError*: PPPyObject - PyExc_KeyboardInterrupt*: PPPyObject - PyExc_MemoryError*: PPPyObject - PyExc_NameError*: PPPyObject - PyExc_OverflowError*: PPPyObject - PyExc_RuntimeError*: PPPyObject - PyExc_SyntaxError*: PPPyObject - PyExc_SystemError*: PPPyObject - PyExc_SystemExit*: PPPyObject - PyExc_TypeError*: PPPyObject - PyExc_ValueError*: PPPyObject - PyExc_ZeroDivisionError*: PPPyObject - PyExc_ArithmeticError*: PPPyObject - PyExc_Exception*: PPPyObject - PyExc_FloatingPointError*: PPPyObject - PyExc_LookupError*: PPPyObject - PyExc_StandardError*: PPPyObject - PyExc_AssertionError*: PPPyObject - PyExc_EnvironmentError*: PPPyObject - PyExc_IndentationError*: PPPyObject - PyExc_MemoryErrorInst*: PPPyObject - PyExc_NotImplementedError*: PPPyObject - PyExc_OSError*: PPPyObject - PyExc_TabError*: PPPyObject - PyExc_UnboundLocalError*: PPPyObject - PyExc_UnicodeError*: PPPyObject - PyExc_Warning*: PPPyObject - PyExc_DeprecationWarning*: PPPyObject - PyExc_RuntimeWarning*: PPPyObject - PyExc_SyntaxWarning*: PPPyObject - PyExc_UserWarning*: PPPyObject - PyExc_OverflowWarning*: PPPyObject - PyExc_ReferenceError*: PPPyObject - PyExc_StopIteration*: PPPyObject - PyExc_FutureWarning*: PPPyObject - PyExc_PendingDeprecationWarning*: PPPyObject - PyExc_UnicodeDecodeError*: PPPyObject - PyExc_UnicodeEncodeError*: PPPyObject - PyExc_UnicodeTranslateError*: PPPyObject - PyType_Type*: PPyTypeObject - PyCFunction_Type*: PPyTypeObject - PyCObject_Type*: PPyTypeObject - PyClass_Type*: PPyTypeObject - PyCode_Type*: PPyTypeObject - PyComplex_Type*: PPyTypeObject - PyDict_Type*: PPyTypeObject - PyFile_Type*: PPyTypeObject - PyFloat_Type*: PPyTypeObject - PyFrame_Type*: PPyTypeObject - PyFunction_Type*: PPyTypeObject - PyInstance_Type*: PPyTypeObject - PyInt_Type*: PPyTypeObject - PyList_Type*: PPyTypeObject - PyLong_Type*: PPyTypeObject - PyMethod_Type*: PPyTypeObject - PyModule_Type*: PPyTypeObject - PyObject_Type*: PPyTypeObject - PyRange_Type*: PPyTypeObject - PySlice_Type*: PPyTypeObject - PyString_Type*: PPyTypeObject - PyTuple_Type*: PPyTypeObject - PyBaseObject_Type*: PPyTypeObject - PyBuffer_Type*: PPyTypeObject - PyCallIter_Type*: PPyTypeObject - PyCell_Type*: PPyTypeObject - PyClassMethod_Type*: PPyTypeObject - PyProperty_Type*: PPyTypeObject - PySeqIter_Type*: PPyTypeObject - PyStaticMethod_Type*: PPyTypeObject - PySuper_Type*: PPyTypeObject - PySymtableEntry_Type*: PPyTypeObject - PyTraceBack_Type*: PPyTypeObject - PyUnicode_Type*: PPyTypeObject - PyWrapperDescr_Type*: PPyTypeObject - PyBaseString_Type*: PPyTypeObject - PyBool_Type*: PPyTypeObject - PyEnum_Type*: PPyTypeObject #PyArg_GetObject: function(args: PPyObject; nargs, i: integer; p_a: PPPyObject): integer; cdecl; - #PyArg_GetLong: function(args: PPyObject; nargs, i: integer; p_a: PLong): integer; cdecl; - #PyArg_GetShort: function(args: PPyObject; nargs, i: integer; p_a: PShort): integer; cdecl; - #PyArg_GetFloat: function(args: PPyObject; nargs, i: integer; p_a: PFloat): integer; cdecl; - #PyArg_GetString: function(args: PPyObject; nargs, i: integer; p_a: PString): integer; cdecl; - #PyArgs_VaParse: function (args: PPyObject; format: PChar; va_list: array of const): integer; cdecl; - # Does not work! - # Py_VaBuildValue: function (format: PChar; va_list: array of const): PPyObject; cdecl; - #PyBuiltin_Init: procedure; cdecl; - PyComplex_FromCComplex*: proc (c: TPy_complex): PPyObject{.cdecl.} - PyComplex_FromDoubles*: proc (realv, imag: float64): PPyObject{.cdecl.} - PyComplex_RealAsDouble*: proc (op: PPyObject): float64{.cdecl.} - PyComplex_ImagAsDouble*: proc (op: PPyObject): float64{.cdecl.} - PyComplex_AsCComplex*: proc (op: PPyObject): TPy_complex{.cdecl.} - PyCFunction_GetFunction*: proc (ob: PPyObject): Pointer{.cdecl.} - PyCFunction_GetSelf*: proc (ob: PPyObject): PPyObject{.cdecl.} - PyCallable_Check*: proc (ob: PPyObject): int{.cdecl.} - PyCObject_FromVoidPtr*: proc (cobj, destruct: Pointer): PPyObject{.cdecl.} - PyCObject_AsVoidPtr*: proc (ob: PPyObject): Pointer{.cdecl.} - PyClass_New*: proc (ob1, ob2, ob3: PPyObject): PPyObject{.cdecl.} - PyClass_IsSubclass*: proc (ob1, ob2: PPyObject): int{.cdecl.} - Py_InitModule4*: proc (name: cstring, methods: PPyMethodDef, doc: cstring, - passthrough: PPyObject, Api_Version: int): PPyObject{. - cdecl.} - PyErr_BadArgument*: proc (): int{.cdecl.} - PyErr_BadInternalCall*: proc (){.cdecl.} - PyErr_CheckSignals*: proc (): int{.cdecl.} - PyErr_Clear*: proc (){.cdecl.} - PyErr_Fetch*: proc (errtype, errvalue, errtraceback: PPPyObject){.cdecl.} - PyErr_NoMemory*: proc (): PPyObject{.cdecl.} - PyErr_Occurred*: proc (): PPyObject{.cdecl.} - PyErr_Print*: proc (){.cdecl.} - PyErr_Restore*: proc (errtype, errvalue, errtraceback: PPyObject){.cdecl.} - PyErr_SetFromErrno*: proc (ob: PPyObject): PPyObject{.cdecl.} - PyErr_SetNone*: proc (value: PPyObject){.cdecl.} - PyErr_SetObject*: proc (ob1, ob2: PPyObject){.cdecl.} - PyErr_SetString*: proc (ErrorObject: PPyObject, text: cstring){.cdecl.} - PyImport_GetModuleDict*: proc (): PPyObject{.cdecl.} - PyInt_FromLong*: proc (x: int32): PPyObject{.cdecl.} - Py_Initialize*: proc (){.cdecl.} - Py_Exit*: proc (RetVal: int){.cdecl.} - PyEval_GetBuiltins*: proc (): PPyObject{.cdecl.} - PyDict_GetItem*: proc (mp, key: PPyObject): PPyObject{.cdecl.} - PyDict_SetItem*: proc (mp, key, item: PPyObject): int{.cdecl.} - PyDict_DelItem*: proc (mp, key: PPyObject): int{.cdecl.} - PyDict_Clear*: proc (mp: PPyObject){.cdecl.} - PyDict_Next*: proc (mp: PPyObject, pos: PInt, key, value: PPPyObject): int{. - cdecl.} - PyDict_Keys*: proc (mp: PPyObject): PPyObject{.cdecl.} - PyDict_Values*: proc (mp: PPyObject): PPyObject{.cdecl.} - PyDict_Items*: proc (mp: PPyObject): PPyObject{.cdecl.} - PyDict_Size*: proc (mp: PPyObject): int{.cdecl.} - PyDict_DelItemString*: proc (dp: PPyObject, key: cstring): int{.cdecl.} - PyDict_New*: proc (): PPyObject{.cdecl.} - PyDict_GetItemString*: proc (dp: PPyObject, key: cstring): PPyObject{.cdecl.} - PyDict_SetItemString*: proc (dp: PPyObject, key: cstring, item: PPyObject): int{. - cdecl.} - PyDictProxy_New*: proc (obj: PPyObject): PPyObject{.cdecl.} - PyModule_GetDict*: proc (module: PPyObject): PPyObject{.cdecl.} - PyObject_Str*: proc (v: PPyObject): PPyObject{.cdecl.} - PyRun_String*: proc (str: cstring, start: int, globals: PPyObject, - locals: PPyObject): PPyObject{.cdecl.} - PyRun_SimpleString*: proc (str: cstring): int{.cdecl.} - PyString_AsString*: proc (ob: PPyObject): cstring{.cdecl.} - PyString_FromString*: proc (str: cstring): PPyObject{.cdecl.} - PySys_SetArgv*: proc (argc: int, argv: PPChar){.cdecl.} #+ means, Grzegorz or me has tested his non object version of this function - #+ - PyCFunction_New*: proc (md: PPyMethodDef, ob: PPyObject): PPyObject{.cdecl.} #+ - PyEval_CallObject*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyEval_CallObjectWithKeywords*: proc (ob1, ob2, ob3: PPyObject): PPyObject{. - cdecl.} #- - PyEval_GetFrame*: proc (): PPyObject{.cdecl.} #- - PyEval_GetGlobals*: proc (): PPyObject{.cdecl.} #- - PyEval_GetLocals*: proc (): PPyObject{.cdecl.} #- - #PyEval_GetOwner:function:PPyObject; cdecl; - #- - PyEval_GetRestricted*: proc (): int{.cdecl.} #- - PyEval_InitThreads*: proc (){.cdecl.} #- - PyEval_RestoreThread*: proc (tstate: PPyThreadState){.cdecl.} #- - PyEval_SaveThread*: proc (): PPyThreadState{.cdecl.} #- - PyFile_FromString*: proc (pc1, pc2: cstring): PPyObject{.cdecl.} #- - PyFile_GetLine*: proc (ob: PPyObject, i: int): PPyObject{.cdecl.} #- - PyFile_Name*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyFile_SetBufSize*: proc (ob: PPyObject, i: int){.cdecl.} #- - PyFile_SoftSpace*: proc (ob: PPyObject, i: int): int{.cdecl.} #- - PyFile_WriteObject*: proc (ob1, ob2: PPyObject, i: int): int{.cdecl.} #- - PyFile_WriteString*: proc (s: cstring, ob: PPyObject){.cdecl.} #+ - PyFloat_AsDouble*: proc (ob: PPyObject): float64{.cdecl.} #+ - PyFloat_FromDouble*: proc (db: float64): PPyObject{.cdecl.} #- - PyFunction_GetCode*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyFunction_GetGlobals*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyFunction_New*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyImport_AddModule*: proc (name: cstring): PPyObject{.cdecl.} #- - PyImport_Cleanup*: proc (){.cdecl.} #- - PyImport_GetMagicNumber*: proc (): int32{.cdecl.} #+ - PyImport_ImportFrozenModule*: proc (key: cstring): int{.cdecl.} #+ - PyImport_ImportModule*: proc (name: cstring): PPyObject{.cdecl.} #+ - PyImport_Import*: proc (name: PPyObject): PPyObject{.cdecl.} #- - #PyImport_Init:procedure; cdecl; - #- - PyImport_ReloadModule*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyInstance_New*: proc (obClass, obArg, obKW: PPyObject): PPyObject{.cdecl.} #+ - PyInt_AsLong*: proc (ob: PPyObject): int32{.cdecl.} #- - PyList_Append*: proc (ob1, ob2: PPyObject): int{.cdecl.} #- - PyList_AsTuple*: proc (ob: PPyObject): PPyObject{.cdecl.} #+ - PyList_GetItem*: proc (ob: PPyObject, i: int): PPyObject{.cdecl.} #- - PyList_GetSlice*: proc (ob: PPyObject, i1, i2: int): PPyObject{.cdecl.} #- - PyList_Insert*: proc (dp: PPyObject, idx: int, item: PPyObject): int{.cdecl.} #- - PyList_New*: proc (size: int): PPyObject{.cdecl.} #- - PyList_Reverse*: proc (ob: PPyObject): int{.cdecl.} #- - PyList_SetItem*: proc (dp: PPyObject, idx: int, item: PPyObject): int{.cdecl.} #- - PyList_SetSlice*: proc (ob: PPyObject, i1, i2: int, ob2: PPyObject): int{. - cdecl.} #+ - PyList_Size*: proc (ob: PPyObject): int{.cdecl.} #- - PyList_Sort*: proc (ob: PPyObject): int{.cdecl.} #- - PyLong_AsDouble*: proc (ob: PPyObject): float64{.cdecl.} #+ - PyLong_AsLong*: proc (ob: PPyObject): int32{.cdecl.} #+ - PyLong_FromDouble*: proc (db: float64): PPyObject{.cdecl.} #+ - PyLong_FromLong*: proc (l: int32): PPyObject{.cdecl.} #- - PyLong_FromString*: proc (pc: cstring, ppc: var cstring, i: int): PPyObject{. - cdecl.} #- - PyLong_FromUnsignedLong*: proc (val: int): PPyObject{.cdecl.} #- - PyLong_AsUnsignedLong*: proc (ob: PPyObject): int{.cdecl.} #- - PyLong_FromUnicode*: proc (ob: PPyObject, a, b: int): PPyObject{.cdecl.} #- - PyLong_FromLongLong*: proc (val: Int64): PPyObject{.cdecl.} #- - PyLong_AsLongLong*: proc (ob: PPyObject): Int64{.cdecl.} #- - PyMapping_Check*: proc (ob: PPyObject): int{.cdecl.} #- - PyMapping_GetItemString*: proc (ob: PPyObject, key: cstring): PPyObject{.cdecl.} #- - PyMapping_HasKey*: proc (ob, key: PPyObject): int{.cdecl.} #- - PyMapping_HasKeyString*: proc (ob: PPyObject, key: cstring): int{.cdecl.} #- - PyMapping_Length*: proc (ob: PPyObject): int{.cdecl.} #- - PyMapping_SetItemString*: proc (ob: PPyObject, key: cstring, value: PPyObject): int{. - cdecl.} #- - PyMethod_Class*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyMethod_Function*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyMethod_New*: proc (ob1, ob2, ob3: PPyObject): PPyObject{.cdecl.} #- - PyMethod_Self*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyModule_GetName*: proc (ob: PPyObject): cstring{.cdecl.} #- - PyModule_New*: proc (key: cstring): PPyObject{.cdecl.} #- - PyNumber_Absolute*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Add*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_And*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Check*: proc (ob: PPyObject): int{.cdecl.} #- - PyNumber_Coerce*: proc (ob1, ob2: var PPyObject): int{.cdecl.} #- - PyNumber_Divide*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_FloorDivide*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_TrueDivide*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Divmod*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Float*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Int*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Invert*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Long*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Lshift*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Multiply*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Negative*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Or*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Positive*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Power*: proc (ob1, ob2, ob3: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Remainder*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Rshift*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Subtract*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyNumber_Xor*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyOS_InitInterrupts*: proc (){.cdecl.} #- - PyOS_InterruptOccurred*: proc (): int{.cdecl.} #- - PyObject_CallObject*: proc (ob, args: PPyObject): PPyObject{.cdecl.} #- - PyObject_Compare*: proc (ob1, ob2: PPyObject): int{.cdecl.} #- - PyObject_GetAttr*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #+ - PyObject_GetAttrString*: proc (ob: PPyObject, c: cstring): PPyObject{.cdecl.} #- - PyObject_GetItem*: proc (ob, key: PPyObject): PPyObject{.cdecl.} #- - PyObject_DelItem*: proc (ob, key: PPyObject): PPyObject{.cdecl.} #- - PyObject_HasAttrString*: proc (ob: PPyObject, key: cstring): int{.cdecl.} #- - PyObject_Hash*: proc (ob: PPyObject): int32{.cdecl.} #- - PyObject_IsTrue*: proc (ob: PPyObject): int{.cdecl.} #- - PyObject_Length*: proc (ob: PPyObject): int{.cdecl.} #- - PyObject_Repr*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PyObject_SetAttr*: proc (ob1, ob2, ob3: PPyObject): int{.cdecl.} #- - PyObject_SetAttrString*: proc (ob: PPyObject, key: cstring, value: PPyObject): int{. - cdecl.} #- - PyObject_SetItem*: proc (ob1, ob2, ob3: PPyObject): int{.cdecl.} #- - PyObject_Init*: proc (ob: PPyObject, t: PPyTypeObject): PPyObject{.cdecl.} #- - PyObject_InitVar*: proc (ob: PPyObject, t: PPyTypeObject, size: int): PPyObject{. - cdecl.} #- - PyObject_New*: proc (t: PPyTypeObject): PPyObject{.cdecl.} #- - PyObject_NewVar*: proc (t: PPyTypeObject, size: int): PPyObject{.cdecl.} - PyObject_Free*: proc (ob: PPyObject){.cdecl.} #- - PyObject_IsInstance*: proc (inst, cls: PPyObject): int{.cdecl.} #- - PyObject_IsSubclass*: proc (derived, cls: PPyObject): int{.cdecl.} - PyObject_GenericGetAttr*: proc (obj, name: PPyObject): PPyObject{.cdecl.} - PyObject_GenericSetAttr*: proc (obj, name, value: PPyObject): int{.cdecl.} #- - PyObject_GC_Malloc*: proc (size: int): PPyObject{.cdecl.} #- - PyObject_GC_New*: proc (t: PPyTypeObject): PPyObject{.cdecl.} #- - PyObject_GC_NewVar*: proc (t: PPyTypeObject, size: int): PPyObject{.cdecl.} #- - PyObject_GC_Resize*: proc (t: PPyObject, newsize: int): PPyObject{.cdecl.} #- - PyObject_GC_Del*: proc (ob: PPyObject){.cdecl.} #- - PyObject_GC_Track*: proc (ob: PPyObject){.cdecl.} #- - PyObject_GC_UnTrack*: proc (ob: PPyObject){.cdecl.} #- - PyRange_New*: proc (l1, l2, l3: int32, i: int): PPyObject{.cdecl.} #- - PySequence_Check*: proc (ob: PPyObject): int{.cdecl.} #- - PySequence_Concat*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PySequence_Count*: proc (ob1, ob2: PPyObject): int{.cdecl.} #- - PySequence_GetItem*: proc (ob: PPyObject, i: int): PPyObject{.cdecl.} #- - PySequence_GetSlice*: proc (ob: PPyObject, i1, i2: int): PPyObject{.cdecl.} #- - PySequence_In*: proc (ob1, ob2: PPyObject): int{.cdecl.} #- - PySequence_Index*: proc (ob1, ob2: PPyObject): int{.cdecl.} #- - PySequence_Length*: proc (ob: PPyObject): int{.cdecl.} #- - PySequence_Repeat*: proc (ob: PPyObject, count: int): PPyObject{.cdecl.} #- - PySequence_SetItem*: proc (ob: PPyObject, i: int, value: PPyObject): int{. - cdecl.} #- - PySequence_SetSlice*: proc (ob: PPyObject, i1, i2: int, value: PPyObject): int{. - cdecl.} #- - PySequence_DelSlice*: proc (ob: PPyObject, i1, i2: int): int{.cdecl.} #- - PySequence_Tuple*: proc (ob: PPyObject): PPyObject{.cdecl.} #- - PySequence_Contains*: proc (ob, value: PPyObject): int{.cdecl.} #- - PySlice_GetIndices*: proc (ob: PPySliceObject, len: int, - start, stop, step: var int): int{.cdecl.} #- - PySlice_GetIndicesEx*: proc (ob: PPySliceObject, len: int, - start, stop, step, slicelength: var int): int{. - cdecl.} #- - PySlice_New*: proc (start, stop, step: PPyObject): PPyObject{.cdecl.} #- - PyString_Concat*: proc (ob1: var PPyObject, ob2: PPyObject){.cdecl.} #- - PyString_ConcatAndDel*: proc (ob1: var PPyObject, ob2: PPyObject){.cdecl.} #- - PyString_Format*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} #- - PyString_FromStringAndSize*: proc (s: cstring, i: int): PPyObject{.cdecl.} #- - PyString_Size*: proc (ob: PPyObject): int{.cdecl.} #- - PyString_DecodeEscape*: proc (s: cstring, length: int, errors: cstring, - unicode: int, recode_encoding: cstring): PPyObject{. - cdecl.} #- - PyString_Repr*: proc (ob: PPyObject, smartquotes: int): PPyObject{.cdecl.} #+ - PySys_GetObject*: proc (s: cstring): PPyObject{.cdecl.} #- - #PySys_Init:procedure; cdecl; - #- - PySys_SetObject*: proc (s: cstring, ob: PPyObject): int{.cdecl.} #- - PySys_SetPath*: proc (path: cstring){.cdecl.} #- - #PyTraceBack_Fetch:function:PPyObject; cdecl; - #- - PyTraceBack_Here*: proc (p: pointer): int{.cdecl.} #- - PyTraceBack_Print*: proc (ob1, ob2: PPyObject): int{.cdecl.} #- - #PyTraceBack_Store:function (ob:PPyObject):integer; cdecl; - #+ - PyTuple_GetItem*: proc (ob: PPyObject, i: int): PPyObject{.cdecl.} #- - PyTuple_GetSlice*: proc (ob: PPyObject, i1, i2: int): PPyObject{.cdecl.} #+ - PyTuple_New*: proc (size: int): PPyObject{.cdecl.} #+ - PyTuple_SetItem*: proc (ob: PPyObject, key: int, value: PPyObject): int{.cdecl.} #+ - PyTuple_Size*: proc (ob: PPyObject): int{.cdecl.} #+ - PyType_IsSubtype*: proc (a, b: PPyTypeObject): int{.cdecl.} - PyType_GenericAlloc*: proc (atype: PPyTypeObject, nitems: int): PPyObject{. - cdecl.} - PyType_GenericNew*: proc (atype: PPyTypeObject, args, kwds: PPyObject): PPyObject{. - cdecl.} - PyType_Ready*: proc (atype: PPyTypeObject): int{.cdecl.} #+ - PyUnicode_FromWideChar*: proc (w: PWideChar, size: int): PPyObject{.cdecl.} #+ - PyUnicode_AsWideChar*: proc (unicode: PPyObject, w: PWideChar, size: int): int{. - cdecl.} #- - PyUnicode_FromOrdinal*: proc (ordinal: int): PPyObject{.cdecl.} - PyWeakref_GetObject*: proc (ref: PPyObject): PPyObject{.cdecl.} - PyWeakref_NewProxy*: proc (ob, callback: PPyObject): PPyObject{.cdecl.} - PyWeakref_NewRef*: proc (ob, callback: PPyObject): PPyObject{.cdecl.} - PyWrapper_New*: proc (ob1, ob2: PPyObject): PPyObject{.cdecl.} - PyBool_FromLong*: proc (ok: int): PPyObject{.cdecl.} #- - Py_AtExit*: proc (proc: proc ()): int{.cdecl.} #- - #Py_Cleanup:procedure; cdecl; - #- - Py_CompileString*: proc (s1, s2: cstring, i: int): PPyObject{.cdecl.} #- - Py_FatalError*: proc (s: cstring){.cdecl.} #- - Py_FindMethod*: proc (md: PPyMethodDef, ob: PPyObject, key: cstring): PPyObject{. - cdecl.} #- - Py_FindMethodInChain*: proc (mc: PPyMethodChain, ob: PPyObject, key: cstring): PPyObject{. - cdecl.} #- - Py_FlushLine*: proc (){.cdecl.} #+ - Py_Finalize*: proc (){.cdecl.} #- - PyErr_ExceptionMatches*: proc (exc: PPyObject): int{.cdecl.} #- - PyErr_GivenExceptionMatches*: proc (raised_exc, exc: PPyObject): int{.cdecl.} #- - PyEval_EvalCode*: proc (co: PPyCodeObject, globals, locals: PPyObject): PPyObject{. - cdecl.} #+ - Py_GetVersion*: proc (): cstring{.cdecl.} #+ - Py_GetCopyright*: proc (): cstring{.cdecl.} #+ - Py_GetExecPrefix*: proc (): cstring{.cdecl.} #+ - Py_GetPath*: proc (): cstring{.cdecl.} #+ - Py_GetPrefix*: proc (): cstring{.cdecl.} #+ - Py_GetProgramName*: proc (): cstring{.cdecl.} #- - PyParser_SimpleParseString*: proc (str: cstring, start: int): PNode{.cdecl.} #- - PyNode_Free*: proc (n: PNode){.cdecl.} #- - PyErr_NewException*: proc (name: cstring, base, dict: PPyObject): PPyObject{. - cdecl.} #- - Py_Malloc*: proc (size: int): Pointer #- - PyMem_Malloc*: proc (size: int): Pointer #- - PyObject_CallMethod*: proc (obj: PPyObject, method, format: cstring): PPyObject{. - cdecl.} #New exported Objects in Python 1.5 - Py_SetProgramName*: proc (name: cstring){.cdecl.} - Py_IsInitialized*: proc (): int{.cdecl.} - Py_GetProgramFullPath*: proc (): cstring{.cdecl.} - Py_NewInterpreter*: proc (): PPyThreadState{.cdecl.} - Py_EndInterpreter*: proc (tstate: PPyThreadState){.cdecl.} - PyEval_AcquireLock*: proc (){.cdecl.} - PyEval_ReleaseLock*: proc (){.cdecl.} - PyEval_AcquireThread*: proc (tstate: PPyThreadState){.cdecl.} - PyEval_ReleaseThread*: proc (tstate: PPyThreadState){.cdecl.} - PyInterpreterState_New*: proc (): PPyInterpreterState{.cdecl.} - PyInterpreterState_Clear*: proc (interp: PPyInterpreterState){.cdecl.} - PyInterpreterState_Delete*: proc (interp: PPyInterpreterState){.cdecl.} - PyThreadState_New*: proc (interp: PPyInterpreterState): PPyThreadState{.cdecl.} - PyThreadState_Clear*: proc (tstate: PPyThreadState){.cdecl.} - PyThreadState_Delete*: proc (tstate: PPyThreadState){.cdecl.} - PyThreadState_Get*: proc (): PPyThreadState{.cdecl.} - PyThreadState_Swap*: proc (tstate: PPyThreadState): PPyThreadState{.cdecl.} - -#Further exported Objects, may be implemented later -# -# PyCode_New: Pointer; -# PyErr_SetInterrupt: Pointer; -# PyFile_AsFile: Pointer; -# PyFile_FromFile: Pointer; -# PyFloat_AsString: Pointer; -# PyFrame_BlockPop: Pointer; -# PyFrame_BlockSetup: Pointer; -# PyFrame_ExtendStack: Pointer; -# PyFrame_FastToLocals: Pointer; -# PyFrame_LocalsToFast: Pointer; -# PyFrame_New: Pointer; -# PyGrammar_AddAccelerators: Pointer; -# PyGrammar_FindDFA: Pointer; -# PyGrammar_LabelRepr: Pointer; -# PyInstance_DoBinOp: Pointer; -# PyInt_GetMax: Pointer; -# PyMarshal_Init: Pointer; -# PyMarshal_ReadLongFromFile: Pointer; -# PyMarshal_ReadObjectFromFile: Pointer; -# PyMarshal_ReadObjectFromString: Pointer; -# PyMarshal_WriteLongToFile: Pointer; -# PyMarshal_WriteObjectToFile: Pointer; -# PyMember_Get: Pointer; -# PyMember_Set: Pointer; -# PyNode_AddChild: Pointer; -# PyNode_Compile: Pointer; -# PyNode_New: Pointer; -# PyOS_GetLastModificationTime: Pointer; -# PyOS_Readline: Pointer; -# PyOS_strtol: Pointer; -# PyOS_strtoul: Pointer; -# PyObject_CallFunction: Pointer; -# PyObject_CallMethod: Pointer; -# PyObject_Print: Pointer; -# PyParser_AddToken: Pointer; -# PyParser_Delete: Pointer; -# PyParser_New: Pointer; -# PyParser_ParseFile: Pointer; -# PyParser_ParseString: Pointer; -# PyParser_SimpleParseFile: Pointer; -# PyRun_AnyFile: Pointer; -# PyRun_File: Pointer; -# PyRun_InteractiveLoop: Pointer; -# PyRun_InteractiveOne: Pointer; -# PyRun_SimpleFile: Pointer; -# PySys_GetFile: Pointer; -# PyToken_OneChar: Pointer; -# PyToken_TwoChars: Pointer; -# PyTokenizer_Free: Pointer; -# PyTokenizer_FromFile: Pointer; -# PyTokenizer_FromString: Pointer; -# PyTokenizer_Get: Pointer; -# Py_Main: Pointer; -# _PyObject_NewVar: Pointer; -# _PyParser_Grammar: Pointer; -# _PyParser_TokenNames: Pointer; -# _PyThread_Started: Pointer; -# _Py_c_diff: Pointer; -# _Py_c_neg: Pointer; -# _Py_c_pow: Pointer; -# _Py_c_prod: Pointer; -# _Py_c_quot: Pointer; -# _Py_c_sum: Pointer; -# - -# This function handles all cardinals, pointer types (with no adjustment of pointers!) -# (Extended) floats, which are handled as Python doubles and currencies, handled -# as (normalized) Python doubles. -proc PyImport_ExecCodeModule*(name: String, codeobject: PPyObject): PPyObject -proc PyString_Check*(obj: PPyObject): bool -proc PyString_CheckExact*(obj: PPyObject): bool -proc PyFloat_Check*(obj: PPyObject): bool -proc PyFloat_CheckExact*(obj: PPyObject): bool -proc PyInt_Check*(obj: PPyObject): bool -proc PyInt_CheckExact*(obj: PPyObject): bool -proc PyLong_Check*(obj: PPyObject): bool -proc PyLong_CheckExact*(obj: PPyObject): bool -proc PyTuple_Check*(obj: PPyObject): bool -proc PyTuple_CheckExact*(obj: PPyObject): bool -proc PyInstance_Check*(obj: PPyObject): bool -proc PyClass_Check*(obj: PPyObject): bool -proc PyMethod_Check*(obj: PPyObject): bool -proc PyList_Check*(obj: PPyObject): bool -proc PyList_CheckExact*(obj: PPyObject): bool -proc PyDict_Check*(obj: PPyObject): bool -proc PyDict_CheckExact*(obj: PPyObject): bool -proc PyModule_Check*(obj: PPyObject): bool -proc PyModule_CheckExact*(obj: PPyObject): bool -proc PySlice_Check*(obj: PPyObject): bool -proc PyFunction_Check*(obj: PPyObject): bool -proc PyUnicode_Check*(obj: PPyObject): bool -proc PyUnicode_CheckExact*(obj: PPyObject): bool -proc PyType_IS_GC*(t: PPyTypeObject): bool -proc PyObject_IS_GC*(obj: PPyObject): bool -proc PyWeakref_Check*(obj: PPyObject): bool -proc PyWeakref_CheckRef*(obj: PPyObject): bool -proc PyWeakref_CheckProxy*(obj: PPyObject): bool -proc PyBool_Check*(obj: PPyObject): bool -proc PyBaseString_Check*(obj: PPyObject): bool -proc PyEnum_Check*(obj: PPyObject): bool -proc PyObject_TypeCheck*(obj: PPyObject, t: PPyTypeObject): bool -proc Py_InitModule*(name: cstring, md: PPyMethodDef): PPyObject -proc PyType_HasFeature*(AType: PPyTypeObject, AFlag: int): bool -# implementation - -proc Py_INCREF*(op: PPyObject) {.inline.} = - Inc(op.ob_refcnt) - -proc Py_DECREF*(op: PPyObject) {.inline.} = - Dec(op.ob_refcnt) - if op.ob_refcnt == 0: - op.ob_type.tp_dealloc(op) - -proc Py_XINCREF*(op: PPyObject) {.inline.} = - if op != nil: Py_INCREF(op) - -proc Py_XDECREF*(op: PPyObject) {.inline.} = - if op != nil: Py_DECREF(op) - -proc PyImport_ExecCodeModule(name: String, codeobject: PPyObject): PPyObject = - var m, d, v, modules: PPyObject - m = PyImport_AddModule(cstring(name)) - if m == nil: - return nil - d = PyModule_GetDict(m) - if PyDict_GetItemString(d, "__builtins__") == nil: - if PyDict_SetItemString(d, "__builtins__", PyEval_GetBuiltins) != 0: - return nil - if PyDict_SetItemString(d, "__file__", PPyCodeObject(codeobject).co_filename) != - 0: - PyErr_Clear() # Not important enough to report - v = PyEval_EvalCode(PPyCodeObject(codeobject), d, d) # XXX owner ? - if v == nil: - return nil - Py_XDECREF(v) - modules = PyImport_GetModuleDict() - if PyDict_GetItemString(modules, cstring(name)) == nil: - PyErr_SetString(PyExc_ImportError^ , cstring( - Format("Loaded module %.200s not found in sys.modules", [name]))) - return nil - Py_XINCREF(m) - Result = m - -proc PyString_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyString_Type) - -proc PyString_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyString_Type)) - -proc PyFloat_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyFloat_Type) - -proc PyFloat_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyFloat_Type)) - -proc PyInt_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyInt_Type) - -proc PyInt_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyInt_Type)) - -proc PyLong_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyLong_Type) - -proc PyLong_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyLong_Type)) - -proc PyTuple_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyTuple_Type) - -proc PyTuple_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyTuple_Type)) - -proc PyInstance_Check(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyInstance_Type)) - -proc PyClass_Check(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyClass_Type)) - -proc PyMethod_Check(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyMethod_Type)) - -proc PyList_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyList_Type) - -proc PyList_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyList_Type)) - -proc PyDict_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyDict_Type) - -proc PyDict_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyDict_Type)) - -proc PyModule_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyModule_Type) - -proc PyModule_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyModule_Type)) - -proc PySlice_Check(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PySlice_Type)) - -proc PyFunction_Check(obj: PPyObject): bool = - Result = (obj != nil) and - ((obj.ob_type == PPyTypeObject(PyCFunction_Type)) or - (obj.ob_type == PPyTypeObject(PyFunction_Type))) - -proc PyUnicode_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyUnicode_Type) - -proc PyUnicode_CheckExact(obj: PPyObject): bool = - Result = (obj != nil) and (obj^ .ob_type == PPyTypeObject(PyUnicode_Type)) - -proc PyType_IS_GC(t: PPyTypeObject): bool = - Result = PyType_HasFeature(t, Py_TPFLAGS_HAVE_GC) - -proc PyObject_IS_GC(obj: PPyObject): bool = - Result = PyType_IS_GC(obj.ob_type) and - ((obj.ob_type.tp_is_gc == nil) or (obj.ob_type.tp_is_gc(obj) == 1)) - -proc PyWeakref_Check(obj: PPyObject): bool = - Result = (obj != nil) and - (PyWeakref_CheckRef(obj) or PyWeakref_CheckProxy(obj)) - -proc PyWeakref_CheckRef(obj: PPyObject): bool = - Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyWeakref_RefType)) - -proc PyWeakref_CheckProxy(obj: PPyObject): bool = - Result = (obj != nil) and - ((obj.ob_type == PPyTypeObject(PyWeakref_ProxyType)) or - (obj.ob_type == PPyTypeObject(PyWeakref_CallableProxyType))) - -proc PyBool_Check(obj: PPyObject): bool = - Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyBool_Type)) - -proc PyBaseString_Check(obj: PPyObject): bool = - Result = PyObject_TypeCheck(obj, PyBaseString_Type) - -proc PyEnum_Check(obj: PPyObject): bool = - Result = (obj != nil) and (obj.ob_type == PPyTypeObject(PyEnum_Type)) - -proc PyObject_TypeCheck(obj: PPyObject, t: PPyTypeObject): bool = - Result = (obj != nil) and (obj.ob_type == t) - if not Result and (obj != nil) and (t != nil): - Result = PyType_IsSubtype(obj.ob_type, t) == 1 - -proc Py_InitModule(name: cstring, md: PPyMethodDef): PPyObject = - result = Py_InitModule4(name, md, nil, nil, 1012) - -proc PyType_HasFeature(AType: PPyTypeObject, AFlag: int): bool = - #(((t)->tp_flags & (f)) != 0) - Result = (AType.tp_flags and AFlag) != 0 - -proc init(lib: TLibHandle) = - Py_DebugFlag = getProcAddr(lib, "Py_DebugFlag") - Py_VerboseFlag = getProcAddr(lib, "Py_VerboseFlag") - Py_InteractiveFlag = getProcAddr(lib, "Py_InteractiveFlag") - Py_OptimizeFlag = getProcAddr(lib, "Py_OptimizeFlag") - Py_NoSiteFlag = getProcAddr(lib, "Py_NoSiteFlag") - Py_UseClassExceptionsFlag = getProcAddr(lib, "Py_UseClassExceptionsFlag") - Py_FrozenFlag = getProcAddr(lib, "Py_FrozenFlag") - Py_TabcheckFlag = getProcAddr(lib, "Py_TabcheckFlag") - Py_UnicodeFlag = getProcAddr(lib, "Py_UnicodeFlag") - Py_IgnoreEnvironmentFlag = getProcAddr(lib, "Py_IgnoreEnvironmentFlag") - Py_DivisionWarningFlag = getProcAddr(lib, "Py_DivisionWarningFlag") - Py_None = getProcAddr(lib, "_Py_NoneStruct") - Py_Ellipsis = getProcAddr(lib, "_Py_EllipsisObject") - Py_False = getProcAddr(lib, "_Py_ZeroStruct") - Py_True = getProcAddr(lib, "_Py_TrueStruct") - Py_NotImplemented = getProcAddr(lib, "_Py_NotImplementedStruct") - PyImport_FrozenModules = getProcAddr(lib, "PyImport_FrozenModules") - PyExc_AttributeError = getProcAddr(lib, "PyExc_AttributeError") - PyExc_EOFError = getProcAddr(lib, "PyExc_EOFError") - PyExc_IOError = getProcAddr(lib, "PyExc_IOError") - PyExc_ImportError = getProcAddr(lib, "PyExc_ImportError") - PyExc_IndexError = getProcAddr(lib, "PyExc_IndexError") - PyExc_KeyError = getProcAddr(lib, "PyExc_KeyError") - PyExc_KeyboardInterrupt = getProcAddr(lib, "PyExc_KeyboardInterrupt") - PyExc_MemoryError = getProcAddr(lib, "PyExc_MemoryError") - PyExc_NameError = getProcAddr(lib, "PyExc_NameError") - PyExc_OverflowError = getProcAddr(lib, "PyExc_OverflowError") - PyExc_RuntimeError = getProcAddr(lib, "PyExc_RuntimeError") - PyExc_SyntaxError = getProcAddr(lib, "PyExc_SyntaxError") - PyExc_SystemError = getProcAddr(lib, "PyExc_SystemError") - PyExc_SystemExit = getProcAddr(lib, "PyExc_SystemExit") - PyExc_TypeError = getProcAddr(lib, "PyExc_TypeError") - PyExc_ValueError = getProcAddr(lib, "PyExc_ValueError") - PyExc_ZeroDivisionError = getProcAddr(lib, "PyExc_ZeroDivisionError") - PyExc_ArithmeticError = getProcAddr(lib, "PyExc_ArithmeticError") - PyExc_Exception = getProcAddr(lib, "PyExc_Exception") - PyExc_FloatingPointError = getProcAddr(lib, "PyExc_FloatingPointError") - PyExc_LookupError = getProcAddr(lib, "PyExc_LookupError") - PyExc_StandardError = getProcAddr(lib, "PyExc_StandardError") - PyExc_AssertionError = getProcAddr(lib, "PyExc_AssertionError") - PyExc_EnvironmentError = getProcAddr(lib, "PyExc_EnvironmentError") - PyExc_IndentationError = getProcAddr(lib, "PyExc_IndentationError") - PyExc_MemoryErrorInst = getProcAddr(lib, "PyExc_MemoryErrorInst") - PyExc_NotImplementedError = getProcAddr(lib, "PyExc_NotImplementedError") - PyExc_OSError = getProcAddr(lib, "PyExc_OSError") - PyExc_TabError = getProcAddr(lib, "PyExc_TabError") - PyExc_UnboundLocalError = getProcAddr(lib, "PyExc_UnboundLocalError") - PyExc_UnicodeError = getProcAddr(lib, "PyExc_UnicodeError") - PyExc_Warning = getProcAddr(lib, "PyExc_Warning") - PyExc_DeprecationWarning = getProcAddr(lib, "PyExc_DeprecationWarning") - PyExc_RuntimeWarning = getProcAddr(lib, "PyExc_RuntimeWarning") - PyExc_SyntaxWarning = getProcAddr(lib, "PyExc_SyntaxWarning") - PyExc_UserWarning = getProcAddr(lib, "PyExc_UserWarning") - PyExc_OverflowWarning = getProcAddr(lib, "PyExc_OverflowWarning") - PyExc_ReferenceError = getProcAddr(lib, "PyExc_ReferenceError") - PyExc_StopIteration = getProcAddr(lib, "PyExc_StopIteration") - PyExc_FutureWarning = getProcAddr(lib, "PyExc_FutureWarning") - PyExc_PendingDeprecationWarning = getProcAddr(lib, - "PyExc_PendingDeprecationWarning") - PyExc_UnicodeDecodeError = getProcAddr(lib, "PyExc_UnicodeDecodeError") - PyExc_UnicodeEncodeError = getProcAddr(lib, "PyExc_UnicodeEncodeError") - PyExc_UnicodeTranslateError = getProcAddr(lib, "PyExc_UnicodeTranslateError") - PyType_Type = getProcAddr(lib, "PyType_Type") - PyCFunction_Type = getProcAddr(lib, "PyCFunction_Type") - PyCObject_Type = getProcAddr(lib, "PyCObject_Type") - PyClass_Type = getProcAddr(lib, "PyClass_Type") - PyCode_Type = getProcAddr(lib, "PyCode_Type") - PyComplex_Type = getProcAddr(lib, "PyComplex_Type") - PyDict_Type = getProcAddr(lib, "PyDict_Type") - PyFile_Type = getProcAddr(lib, "PyFile_Type") - PyFloat_Type = getProcAddr(lib, "PyFloat_Type") - PyFrame_Type = getProcAddr(lib, "PyFrame_Type") - PyFunction_Type = getProcAddr(lib, "PyFunction_Type") - PyInstance_Type = getProcAddr(lib, "PyInstance_Type") - PyInt_Type = getProcAddr(lib, "PyInt_Type") - PyList_Type = getProcAddr(lib, "PyList_Type") - PyLong_Type = getProcAddr(lib, "PyLong_Type") - PyMethod_Type = getProcAddr(lib, "PyMethod_Type") - PyModule_Type = getProcAddr(lib, "PyModule_Type") - PyObject_Type = getProcAddr(lib, "PyObject_Type") - PyRange_Type = getProcAddr(lib, "PyRange_Type") - PySlice_Type = getProcAddr(lib, "PySlice_Type") - PyString_Type = getProcAddr(lib, "PyString_Type") - PyTuple_Type = getProcAddr(lib, "PyTuple_Type") - PyUnicode_Type = getProcAddr(lib, "PyUnicode_Type") - PyBaseObject_Type = getProcAddr(lib, "PyBaseObject_Type") - PyBuffer_Type = getProcAddr(lib, "PyBuffer_Type") - PyCallIter_Type = getProcAddr(lib, "PyCallIter_Type") - PyCell_Type = getProcAddr(lib, "PyCell_Type") - PyClassMethod_Type = getProcAddr(lib, "PyClassMethod_Type") - PyProperty_Type = getProcAddr(lib, "PyProperty_Type") - PySeqIter_Type = getProcAddr(lib, "PySeqIter_Type") - PyStaticMethod_Type = getProcAddr(lib, "PyStaticMethod_Type") - PySuper_Type = getProcAddr(lib, "PySuper_Type") - PySymtableEntry_Type = getProcAddr(lib, "PySymtableEntry_Type") - PyTraceBack_Type = getProcAddr(lib, "PyTraceBack_Type") - PyWrapperDescr_Type = getProcAddr(lib, "PyWrapperDescr_Type") - PyBaseString_Type = getProcAddr(lib, "PyBaseString_Type") - PyBool_Type = getProcAddr(lib, "PyBool_Type") - PyEnum_Type = getProcAddr(lib, "PyEnum_Type") #PyArg_GetObject := getProcAddr(lib, 'PyArg_GetObject'); - #PyArg_GetLong := getProcAddr(lib, 'PyArg_GetLong'); - #PyArg_GetShort := getProcAddr(lib, 'PyArg_GetShort'); - #PyArg_GetFloat := getProcAddr(lib, 'PyArg_GetFloat'); - #PyArg_GetString := getProcAddr(lib, 'PyArg_GetString'); - #PyArgs_VaParse := getProcAddr(lib, 'PyArgs_VaParse'); - #Py_VaBuildValue := getProcAddr(lib, 'Py_VaBuildValue'); - #PyBuiltin_Init := getProcAddr(lib, 'PyBuiltin_Init'); - PyComplex_FromCComplex = getProcAddr(lib, "PyComplex_FromCComplex") - PyComplex_FromDoubles = getProcAddr(lib, "PyComplex_FromDoubles") - PyComplex_RealAsDouble = getProcAddr(lib, "PyComplex_RealAsDouble") - PyComplex_ImagAsDouble = getProcAddr(lib, "PyComplex_ImagAsDouble") - PyComplex_AsCComplex = getProcAddr(lib, "PyComplex_AsCComplex") - PyCFunction_GetFunction = getProcAddr(lib, "PyCFunction_GetFunction") - PyCFunction_GetSelf = getProcAddr(lib, "PyCFunction_GetSelf") - PyCallable_Check = getProcAddr(lib, "PyCallable_Check") - PyCObject_FromVoidPtr = getProcAddr(lib, "PyCObject_FromVoidPtr") - PyCObject_AsVoidPtr = getProcAddr(lib, "PyCObject_AsVoidPtr") - PyClass_New = getProcAddr(lib, "PyClass_New") - PyClass_IsSubclass = getProcAddr(lib, "PyClass_IsSubclass") - PyDict_GetItem = getProcAddr(lib, "PyDict_GetItem") - PyDict_SetItem = getProcAddr(lib, "PyDict_SetItem") - PyDict_DelItem = getProcAddr(lib, "PyDict_DelItem") - PyDict_Clear = getProcAddr(lib, "PyDict_Clear") - PyDict_Next = getProcAddr(lib, "PyDict_Next") - PyDict_Keys = getProcAddr(lib, "PyDict_Keys") - PyDict_Values = getProcAddr(lib, "PyDict_Values") - PyDict_Items = getProcAddr(lib, "PyDict_Items") - PyDict_Size = getProcAddr(lib, "PyDict_Size") - PyDict_DelItemString = getProcAddr(lib, "PyDict_DelItemString") - PyDictProxy_New = getProcAddr(lib, "PyDictProxy_New") - Py_InitModule4 = getProcAddr(lib, "Py_InitModule4") - PyErr_Print = getProcAddr(lib, "PyErr_Print") - PyErr_SetNone = getProcAddr(lib, "PyErr_SetNone") - PyErr_SetObject = getProcAddr(lib, "PyErr_SetObject") - PyErr_Restore = getProcAddr(lib, "PyErr_Restore") - PyErr_BadArgument = getProcAddr(lib, "PyErr_BadArgument") - PyErr_NoMemory = getProcAddr(lib, "PyErr_NoMemory") - PyErr_SetFromErrno = getProcAddr(lib, "PyErr_SetFromErrno") - PyErr_BadInternalCall = getProcAddr(lib, "PyErr_BadInternalCall") - PyErr_CheckSignals = getProcAddr(lib, "PyErr_CheckSignals") - PyErr_Occurred = getProcAddr(lib, "PyErr_Occurred") - PyErr_Clear = getProcAddr(lib, "PyErr_Clear") - PyErr_Fetch = getProcAddr(lib, "PyErr_Fetch") - PyErr_SetString = getProcAddr(lib, "PyErr_SetString") - PyEval_GetBuiltins = getProcAddr(lib, "PyEval_GetBuiltins") - PyImport_GetModuleDict = getProcAddr(lib, "PyImport_GetModuleDict") - PyInt_FromLong = getProcAddr(lib, "PyInt_FromLong") - PyArg_ParseTuple = getProcAddr(lib, "PyArg_ParseTuple") - PyArg_Parse = getProcAddr(lib, "PyArg_Parse") - Py_BuildValue = getProcAddr(lib, "Py_BuildValue") - Py_Initialize = getProcAddr(lib, "Py_Initialize") - PyDict_New = getProcAddr(lib, "PyDict_New") - PyDict_SetItemString = getProcAddr(lib, "PyDict_SetItemString") - PyModule_GetDict = getProcAddr(lib, "PyModule_GetDict") - PyObject_Str = getProcAddr(lib, "PyObject_Str") - PyRun_String = getProcAddr(lib, "PyRun_String") - PyRun_SimpleString = getProcAddr(lib, "PyRun_SimpleString") - PyDict_GetItemString = getProcAddr(lib, "PyDict_GetItemString") - PyString_AsString = getProcAddr(lib, "PyString_AsString") - PyString_FromString = getProcAddr(lib, "PyString_FromString") - PySys_SetArgv = getProcAddr(lib, "PySys_SetArgv") - Py_Exit = getProcAddr(lib, "Py_Exit") - PyCFunction_New = getProcAddr(lib, "PyCFunction_New") - PyEval_CallObject = getProcAddr(lib, "PyEval_CallObject") - PyEval_CallObjectWithKeywords = getProcAddr(lib, - "PyEval_CallObjectWithKeywords") - PyEval_GetFrame = getProcAddr(lib, "PyEval_GetFrame") - PyEval_GetGlobals = getProcAddr(lib, "PyEval_GetGlobals") - PyEval_GetLocals = getProcAddr(lib, "PyEval_GetLocals") #PyEval_GetOwner :=getProcAddr(lib, 'PyEval_GetOwner'); - PyEval_GetRestricted = getProcAddr(lib, "PyEval_GetRestricted") - PyEval_InitThreads = getProcAddr(lib, "PyEval_InitThreads") - PyEval_RestoreThread = getProcAddr(lib, "PyEval_RestoreThread") - PyEval_SaveThread = getProcAddr(lib, "PyEval_SaveThread") - PyFile_FromString = getProcAddr(lib, "PyFile_FromString") - PyFile_GetLine = getProcAddr(lib, "PyFile_GetLine") - PyFile_Name = getProcAddr(lib, "PyFile_Name") - PyFile_SetBufSize = getProcAddr(lib, "PyFile_SetBufSize") - PyFile_SoftSpace = getProcAddr(lib, "PyFile_SoftSpace") - PyFile_WriteObject = getProcAddr(lib, "PyFile_WriteObject") - PyFile_WriteString = getProcAddr(lib, "PyFile_WriteString") - PyFloat_AsDouble = getProcAddr(lib, "PyFloat_AsDouble") - PyFloat_FromDouble = getProcAddr(lib, "PyFloat_FromDouble") - PyFunction_GetCode = getProcAddr(lib, "PyFunction_GetCode") - PyFunction_GetGlobals = getProcAddr(lib, "PyFunction_GetGlobals") - PyFunction_New = getProcAddr(lib, "PyFunction_New") - PyImport_AddModule = getProcAddr(lib, "PyImport_AddModule") - PyImport_Cleanup = getProcAddr(lib, "PyImport_Cleanup") - PyImport_GetMagicNumber = getProcAddr(lib, "PyImport_GetMagicNumber") - PyImport_ImportFrozenModule = getProcAddr(lib, "PyImport_ImportFrozenModule") - PyImport_ImportModule = getProcAddr(lib, "PyImport_ImportModule") - PyImport_Import = getProcAddr(lib, "PyImport_Import") #@PyImport_Init :=getProcAddr(lib, 'PyImport_Init'); - PyImport_ReloadModule = getProcAddr(lib, "PyImport_ReloadModule") - PyInstance_New = getProcAddr(lib, "PyInstance_New") - PyInt_AsLong = getProcAddr(lib, "PyInt_AsLong") - PyList_Append = getProcAddr(lib, "PyList_Append") - PyList_AsTuple = getProcAddr(lib, "PyList_AsTuple") - PyList_GetItem = getProcAddr(lib, "PyList_GetItem") - PyList_GetSlice = getProcAddr(lib, "PyList_GetSlice") - PyList_Insert = getProcAddr(lib, "PyList_Insert") - PyList_New = getProcAddr(lib, "PyList_New") - PyList_Reverse = getProcAddr(lib, "PyList_Reverse") - PyList_SetItem = getProcAddr(lib, "PyList_SetItem") - PyList_SetSlice = getProcAddr(lib, "PyList_SetSlice") - PyList_Size = getProcAddr(lib, "PyList_Size") - PyList_Sort = getProcAddr(lib, "PyList_Sort") - PyLong_AsDouble = getProcAddr(lib, "PyLong_AsDouble") - PyLong_AsLong = getProcAddr(lib, "PyLong_AsLong") - PyLong_FromDouble = getProcAddr(lib, "PyLong_FromDouble") - PyLong_FromLong = getProcAddr(lib, "PyLong_FromLong") - PyLong_FromString = getProcAddr(lib, "PyLong_FromString") - PyLong_FromString = getProcAddr(lib, "PyLong_FromString") - PyLong_FromUnsignedLong = getProcAddr(lib, "PyLong_FromUnsignedLong") - PyLong_AsUnsignedLong = getProcAddr(lib, "PyLong_AsUnsignedLong") - PyLong_FromUnicode = getProcAddr(lib, "PyLong_FromUnicode") - PyLong_FromLongLong = getProcAddr(lib, "PyLong_FromLongLong") - PyLong_AsLongLong = getProcAddr(lib, "PyLong_AsLongLong") - PyMapping_Check = getProcAddr(lib, "PyMapping_Check") - PyMapping_GetItemString = getProcAddr(lib, "PyMapping_GetItemString") - PyMapping_HasKey = getProcAddr(lib, "PyMapping_HasKey") - PyMapping_HasKeyString = getProcAddr(lib, "PyMapping_HasKeyString") - PyMapping_Length = getProcAddr(lib, "PyMapping_Length") - PyMapping_SetItemString = getProcAddr(lib, "PyMapping_SetItemString") - PyMethod_Class = getProcAddr(lib, "PyMethod_Class") - PyMethod_Function = getProcAddr(lib, "PyMethod_Function") - PyMethod_New = getProcAddr(lib, "PyMethod_New") - PyMethod_Self = getProcAddr(lib, "PyMethod_Self") - PyModule_GetName = getProcAddr(lib, "PyModule_GetName") - PyModule_New = getProcAddr(lib, "PyModule_New") - PyNumber_Absolute = getProcAddr(lib, "PyNumber_Absolute") - PyNumber_Add = getProcAddr(lib, "PyNumber_Add") - PyNumber_And = getProcAddr(lib, "PyNumber_And") - PyNumber_Check = getProcAddr(lib, "PyNumber_Check") - PyNumber_Coerce = getProcAddr(lib, "PyNumber_Coerce") - PyNumber_Divide = getProcAddr(lib, "PyNumber_Divide") - PyNumber_FloorDivide = getProcAddr(lib, "PyNumber_FloorDivide") - PyNumber_TrueDivide = getProcAddr(lib, "PyNumber_TrueDivide") - PyNumber_Divmod = getProcAddr(lib, "PyNumber_Divmod") - PyNumber_Float = getProcAddr(lib, "PyNumber_Float") - PyNumber_Int = getProcAddr(lib, "PyNumber_Int") - PyNumber_Invert = getProcAddr(lib, "PyNumber_Invert") - PyNumber_Long = getProcAddr(lib, "PyNumber_Long") - PyNumber_Lshift = getProcAddr(lib, "PyNumber_Lshift") - PyNumber_Multiply = getProcAddr(lib, "PyNumber_Multiply") - PyNumber_Negative = getProcAddr(lib, "PyNumber_Negative") - PyNumber_Or = getProcAddr(lib, "PyNumber_Or") - PyNumber_Positive = getProcAddr(lib, "PyNumber_Positive") - PyNumber_Power = getProcAddr(lib, "PyNumber_Power") - PyNumber_Remainder = getProcAddr(lib, "PyNumber_Remainder") - PyNumber_Rshift = getProcAddr(lib, "PyNumber_Rshift") - PyNumber_Subtract = getProcAddr(lib, "PyNumber_Subtract") - PyNumber_Xor = getProcAddr(lib, "PyNumber_Xor") - PyOS_InitInterrupts = getProcAddr(lib, "PyOS_InitInterrupts") - PyOS_InterruptOccurred = getProcAddr(lib, "PyOS_InterruptOccurred") - PyObject_CallObject = getProcAddr(lib, "PyObject_CallObject") - PyObject_Compare = getProcAddr(lib, "PyObject_Compare") - PyObject_GetAttr = getProcAddr(lib, "PyObject_GetAttr") - PyObject_GetAttrString = getProcAddr(lib, "PyObject_GetAttrString") - PyObject_GetItem = getProcAddr(lib, "PyObject_GetItem") - PyObject_DelItem = getProcAddr(lib, "PyObject_DelItem") - PyObject_HasAttrString = getProcAddr(lib, "PyObject_HasAttrString") - PyObject_Hash = getProcAddr(lib, "PyObject_Hash") - PyObject_IsTrue = getProcAddr(lib, "PyObject_IsTrue") - PyObject_Length = getProcAddr(lib, "PyObject_Length") - PyObject_Repr = getProcAddr(lib, "PyObject_Repr") - PyObject_SetAttr = getProcAddr(lib, "PyObject_SetAttr") - PyObject_SetAttrString = getProcAddr(lib, "PyObject_SetAttrString") - PyObject_SetItem = getProcAddr(lib, "PyObject_SetItem") - PyObject_Init = getProcAddr(lib, "PyObject_Init") - PyObject_InitVar = getProcAddr(lib, "PyObject_InitVar") - PyObject_New = getProcAddr(lib, "_PyObject_New") - PyObject_NewVar = getProcAddr(lib, "_PyObject_NewVar") - PyObject_Free = getProcAddr(lib, "PyObject_Free") - PyObject_IsInstance = getProcAddr(lib, "PyObject_IsInstance") - PyObject_IsSubclass = getProcAddr(lib, "PyObject_IsSubclass") - PyObject_GenericGetAttr = getProcAddr(lib, "PyObject_GenericGetAttr") - PyObject_GenericSetAttr = getProcAddr(lib, "PyObject_GenericSetAttr") - PyObject_GC_Malloc = getProcAddr(lib, "_PyObject_GC_Malloc") - PyObject_GC_New = getProcAddr(lib, "_PyObject_GC_New") - PyObject_GC_NewVar = getProcAddr(lib, "_PyObject_GC_NewVar") - PyObject_GC_Resize = getProcAddr(lib, "_PyObject_GC_Resize") - PyObject_GC_Del = getProcAddr(lib, "PyObject_GC_Del") - PyObject_GC_Track = getProcAddr(lib, "PyObject_GC_Track") - PyObject_GC_UnTrack = getProcAddr(lib, "PyObject_GC_UnTrack") - PyRange_New = getProcAddr(lib, "PyRange_New") - PySequence_Check = getProcAddr(lib, "PySequence_Check") - PySequence_Concat = getProcAddr(lib, "PySequence_Concat") - PySequence_Count = getProcAddr(lib, "PySequence_Count") - PySequence_GetItem = getProcAddr(lib, "PySequence_GetItem") - PySequence_GetSlice = getProcAddr(lib, "PySequence_GetSlice") - PySequence_In = getProcAddr(lib, "PySequence_In") - PySequence_Index = getProcAddr(lib, "PySequence_Index") - PySequence_Length = getProcAddr(lib, "PySequence_Length") - PySequence_Repeat = getProcAddr(lib, "PySequence_Repeat") - PySequence_SetItem = getProcAddr(lib, "PySequence_SetItem") - PySequence_SetSlice = getProcAddr(lib, "PySequence_SetSlice") - PySequence_DelSlice = getProcAddr(lib, "PySequence_DelSlice") - PySequence_Tuple = getProcAddr(lib, "PySequence_Tuple") - PySequence_Contains = getProcAddr(lib, "PySequence_Contains") - PySlice_GetIndices = getProcAddr(lib, "PySlice_GetIndices") - PySlice_GetIndicesEx = getProcAddr(lib, "PySlice_GetIndicesEx") - PySlice_New = getProcAddr(lib, "PySlice_New") - PyString_Concat = getProcAddr(lib, "PyString_Concat") - PyString_ConcatAndDel = getProcAddr(lib, "PyString_ConcatAndDel") - PyString_Format = getProcAddr(lib, "PyString_Format") - PyString_FromStringAndSize = getProcAddr(lib, "PyString_FromStringAndSize") - PyString_Size = getProcAddr(lib, "PyString_Size") - PyString_DecodeEscape = getProcAddr(lib, "PyString_DecodeEscape") - PyString_Repr = getProcAddr(lib, "PyString_Repr") - PySys_GetObject = getProcAddr(lib, "PySys_GetObject") #PySys_Init :=getProcAddr(lib, 'PySys_Init'); - PySys_SetObject = getProcAddr(lib, "PySys_SetObject") - PySys_SetPath = getProcAddr(lib, "PySys_SetPath") #PyTraceBack_Fetch :=getProcAddr(lib, 'PyTraceBack_Fetch'); - PyTraceBack_Here = getProcAddr(lib, "PyTraceBack_Here") - PyTraceBack_Print = getProcAddr(lib, "PyTraceBack_Print") #PyTraceBack_Store :=getProcAddr(lib, 'PyTraceBack_Store'); - PyTuple_GetItem = getProcAddr(lib, "PyTuple_GetItem") - PyTuple_GetSlice = getProcAddr(lib, "PyTuple_GetSlice") - PyTuple_New = getProcAddr(lib, "PyTuple_New") - PyTuple_SetItem = getProcAddr(lib, "PyTuple_SetItem") - PyTuple_Size = getProcAddr(lib, "PyTuple_Size") - PyType_IsSubtype = getProcAddr(lib, "PyType_IsSubtype") - PyType_GenericAlloc = getProcAddr(lib, "PyType_GenericAlloc") - PyType_GenericNew = getProcAddr(lib, "PyType_GenericNew") - PyType_Ready = getProcAddr(lib, "PyType_Ready") - PyUnicode_FromWideChar = getProcAddr(lib, "PyUnicodeUCS2_FromWideChar") - PyUnicode_AsWideChar = getProcAddr(lib, "PyUnicodeUCS2_AsWideChar") - PyUnicode_FromOrdinal = getProcAddr(lib, "PyUnicodeUCS2_FromOrdinal") - PyWeakref_GetObject = getProcAddr(lib, "PyWeakref_GetObject") - PyWeakref_NewProxy = getProcAddr(lib, "PyWeakref_NewProxy") - PyWeakref_NewRef = getProcAddr(lib, "PyWeakref_NewRef") - PyWrapper_New = getProcAddr(lib, "PyWrapper_New") - PyBool_FromLong = getProcAddr(lib, "PyBool_FromLong") - Py_AtExit = getProcAddr(lib, "Py_AtExit") #Py_Cleanup :=getProcAddr(lib, 'Py_Cleanup'); - Py_CompileString = getProcAddr(lib, "Py_CompileString") - Py_FatalError = getProcAddr(lib, "Py_FatalError") - Py_FindMethod = getProcAddr(lib, "Py_FindMethod") - Py_FindMethodInChain = getProcAddr(lib, "Py_FindMethodInChain") - Py_FlushLine = getProcAddr(lib, "Py_FlushLine") - Py_Finalize = getProcAddr(lib, "Py_Finalize") - PyCode_Addr2Line = getProcAddr(lib, "PyCode_Addr2Line") - PyClass_IsSubclass = getProcAddr(lib, "PyClass_IsSubclass") - PyErr_ExceptionMatches = getProcAddr(lib, "PyErr_ExceptionMatches") - PyErr_GivenExceptionMatches = getProcAddr(lib, "PyErr_GivenExceptionMatches") - PyEval_EvalCode = getProcAddr(lib, "PyEval_EvalCode") - Py_GetVersion = getProcAddr(lib, "Py_GetVersion") - Py_GetCopyright = getProcAddr(lib, "Py_GetCopyright") - Py_GetExecPrefix = getProcAddr(lib, "Py_GetExecPrefix") - Py_GetPath = getProcAddr(lib, "Py_GetPath") - Py_GetPrefix = getProcAddr(lib, "Py_GetPrefix") - Py_GetProgramName = getProcAddr(lib, "Py_GetProgramName") - PyParser_SimpleParseString = getProcAddr(lib, "PyParser_SimpleParseString") - PyNode_Free = getProcAddr(lib, "PyNode_Free") - PyErr_NewException = getProcAddr(lib, "PyErr_NewException") #/ jah 29-sep-2000 : updated for python 2.0 - #/ replaced Py_Malloc with PyMem_Malloc - #/--- @Py_Malloc := Import ('Py_Malloc'); - #/+++ @Py_Malloc := Import ('PyMem_Malloc'); - Py_Malloc = getProcAddr(lib, "PyMem_Malloc") - PyMem_Malloc = getProcAddr(lib, "PyMem_Malloc") - PyObject_CallMethod = getProcAddr(lib, "PyObject_CallMethod") - Py_SetProgramName = getProcAddr(lib, "Py_SetProgramName") - Py_IsInitialized = getProcAddr(lib, "Py_IsInitialized") - Py_GetProgramFullPath = getProcAddr(lib, "Py_GetProgramFullPath") - DLL_Py_GetBuildInfo = getProcAddr(lib, "Py_GetBuildInfo") - Py_NewInterpreter = getProcAddr(lib, "Py_NewInterpreter") - Py_EndInterpreter = getProcAddr(lib, "Py_EndInterpreter") - PyEval_AcquireLock = getProcAddr(lib, "PyEval_AcquireLock") - PyEval_ReleaseLock = getProcAddr(lib, "PyEval_ReleaseLock") - PyEval_AcquireThread = getProcAddr(lib, "PyEval_AcquireThread") - PyEval_ReleaseThread = getProcAddr(lib, "PyEval_ReleaseThread") - PyInterpreterState_New = getProcAddr(lib, "PyInterpreterState_New") - PyInterpreterState_Clear = getProcAddr(lib, "PyInterpreterState_Clear") - PyInterpreterState_Delete = getProcAddr(lib, "PyInterpreterState_Delete") - PyThreadState_New = getProcAddr(lib, "PyThreadState_New") - PyThreadState_Clear = getProcAddr(lib, "PyThreadState_Clear") - PyThreadState_Delete = getProcAddr(lib, "PyThreadState_Delete") - PyThreadState_Get = getProcAddr(lib, "PyThreadState_Get") - PyThreadState_Swap = getProcAddr(lib, "PyThreadState_Swap") - -var lib: TLibHandle - -lib = loadLibrary(dllName) -if lib != NilLibHandle: init(lib) diff --git a/lib/base/devel/python.pas b/lib/base/devel/python.pas deleted file mode 100644 index 587ec6dc9..000000000 --- a/lib/base/devel/python.pas +++ /dev/null @@ -1,2205 +0,0 @@ -{ - Light-weight binding for the Python interpreter - (c) 2008 Andreas Rumpf - Based on 'PythonEngine' module by Dr. Dietmar Budelsky - -} - -(**************************************************************************) -(* *) -(* Module: Unit 'PythonEngine' Copyright (c) 1997 *) -(* *) -(* Version: 3.0 Dr. Dietmar Budelsky *) -(* Sub-Version: 0.25 dbudelsky@web.de *) -(* Germany *) -(* *) -(* Morgan Martinet *) -(* 4721 rue Brebeuf *) -(* H2J 3L2 MONTREAL (QC) *) -(* CANADA *) -(* e-mail: mmm@free.fr *) -(* *) -(* look our page at: http://www.multimania.com/marat *) -(**************************************************************************) -(* Functionality: Delphi Components that provide an interface to the *) -(* Python language (see python.txt for more infos on *) -(* Python itself). *) -(* *) -(**************************************************************************) -(* Contributors: *) -(* Grzegorz Makarewicz (mak@mikroplan.com.pl) *) -(* Andrew Robinson (andy@hps1.demon.co.uk) *) -(* Mark Watts(mark_watts@hotmail.com) *) -(* Olivier Deckmyn (olivier.deckmyn@mail.dotcom.fr) *) -(* Sigve Tjora (public@tjora.no) *) -(* Mark Derricutt (mark@talios.com) *) -(* Igor E. Poteryaev (jah@mail.ru) *) -(* Yuri Filimonov (fil65@mail.ru) *) -(* Stefan Hoffmeister (Stefan.Hoffmeister@Econos.de) *) -(**************************************************************************) -(* This source code is distributed with no WARRANTY, for no reason or use.*) -(* Everyone is allowed to use and change this code free for his own tasks *) -(* and projects, as long as this header and its copyright text is intact. *) -(* For changed versions of this code, which are public distributed the *) -(* following additional conditions have to be fullfilled: *) -(* 1) The header has to contain a comment on the change and the author of *) -(* it. *) -(* 2) A copy of the changed source has to be sent to the above E-Mail *) -(* address or my then valid address, if this is possible to the *) -(* author. *) -(* The second condition has the target to maintain an up to date central *) -(* version of the component. If this condition is not acceptable for *) -(* confidential or legal reasons, everyone is free to derive a component *) -(* or to generate a diff file to my or other original sources. *) -(* Dr. Dietmar Budelsky, 1997-11-17 *) -(**************************************************************************) -unit python; - -interface - -uses - dyncalls; - -{$ifdef windows} -const - DllName = 'python24.dll'; -{$else} -const - DllName = 'libpython2.4.so'; // for UNIX systems -{$endif} - -const - PYT_METHOD_BUFFER_INCREASE = 10; - PYT_MEMBER_BUFFER_INCREASE = 10; - PYT_GETSET_BUFFER_INCREASE = 10; - - METH_VARARGS = $0001; - METH_KEYWORDS = $0002; - - // Masks for the co_flags field of PyCodeObject - CO_OPTIMIZED = $0001; - CO_NEWLOCALS = $0002; - CO_VARARGS = $0004; - CO_VARKEYWORDS = $0008; - -type - // Rich comparison opcodes introduced in version 2.1 - TRichComparisonOpcode = (pyLT, pyLE, pyEQ, pyNE, pyGT, pyGE); -const -{Type flags (tp_flags) introduced in version 2.0 - -These flags are used to extend the type structure in a backwards-compatible -fashion. Extensions can use the flags to indicate (and test) when a given -type structure contains a new feature. The Python core will use these when -introducing new functionality between major revisions (to avoid mid-version -changes in the PYTHON_API_VERSION). - -Arbitration of the flag bit positions will need to be coordinated among -all extension writers who publically release their extensions (this will -be fewer than you might expect!).. - -Python 1.5.2 introduced the bf_getcharbuffer slot into PyBufferProcs. - -Type definitions should use Py_TPFLAGS_DEFAULT for their tp_flags value. - -Code can use PyType_HasFeature(type_ob, flag_value) to test whether the -given type object has a specified feature. -} - -// PyBufferProcs contains bf_getcharbuffer - Py_TPFLAGS_HAVE_GETCHARBUFFER = (1 shl 0); - -// PySequenceMethods contains sq_contains - Py_TPFLAGS_HAVE_SEQUENCE_IN = (1 shl 1); - -// Objects which participate in garbage collection (see objimp.h) - Py_TPFLAGS_GC = (1 shl 2); - -// PySequenceMethods and PyNumberMethods contain in-place operators - Py_TPFLAGS_HAVE_INPLACEOPS = (1 shl 3); - -// PyNumberMethods do their own coercion */ - Py_TPFLAGS_CHECKTYPES = (1 shl 4); - - Py_TPFLAGS_HAVE_RICHCOMPARE = (1 shl 5); - -// Objects which are weakly referencable if their tp_weaklistoffset is >0 -// XXX Should this have the same value as Py_TPFLAGS_HAVE_RICHCOMPARE? -// These both indicate a feature that appeared in the same alpha release. - - Py_TPFLAGS_HAVE_WEAKREFS = (1 shl 6); - -// tp_iter is defined - Py_TPFLAGS_HAVE_ITER = (1 shl 7); - -// New members introduced by Python 2.2 exist - Py_TPFLAGS_HAVE_CLASS = (1 shl 8); - -// Set if the type object is dynamically allocated - Py_TPFLAGS_HEAPTYPE = (1 shl 9); - -// Set if the type allows subclassing - Py_TPFLAGS_BASETYPE = (1 shl 10); - -// Set if the type is 'ready' -- fully initialized - Py_TPFLAGS_READY = (1 shl 12); - -// Set while the type is being 'readied', to prevent recursive ready calls - Py_TPFLAGS_READYING = (1 shl 13); - -// Objects support garbage collection (see objimp.h) - Py_TPFLAGS_HAVE_GC = (1 shl 14); - - Py_TPFLAGS_DEFAULT = Py_TPFLAGS_HAVE_GETCHARBUFFER - or Py_TPFLAGS_HAVE_SEQUENCE_IN - or Py_TPFLAGS_HAVE_INPLACEOPS - or Py_TPFLAGS_HAVE_RICHCOMPARE - or Py_TPFLAGS_HAVE_WEAKREFS - or Py_TPFLAGS_HAVE_ITER - or Py_TPFLAGS_HAVE_CLASS; - -// See function PyType_HasFeature below for testing the flags. - -// Delphi equivalent used by TPythonType -type - TPFlag = (tpfHaveGetCharBuffer, tpfHaveSequenceIn, tpfGC, tpfHaveInplaceOps, - tpfCheckTypes, tpfHaveRichCompare, tpfHaveWeakRefs, - tpfHaveIter, tpfHaveClass, tpfHeapType, tpfBaseType, tpfReady, - tpfReadying, tpfHaveGC - ); - TPFlags = set of TPFlag; -const - TPFLAGS_DEFAULT = [tpfHaveGetCharBuffer, tpfHaveSequenceIn, tpfHaveInplaceOps, - tpfHaveRichCompare, tpfHaveWeakRefs, tpfHaveIter, - tpfHaveClass]; -//------- Python opcodes ----------// -Const - single_input = 256; - file_input = 257; - eval_input = 258; - funcdef = 259; - parameters = 260; - varargslist = 261; - fpdef = 262; - fplist = 263; - stmt = 264; - simple_stmt = 265; - small_stmt = 266; - expr_stmt = 267; - augassign = 268; - print_stmt = 269; - del_stmt = 270; - pass_stmt = 271; - flow_stmt = 272; - break_stmt = 273; - continue_stmt = 274; - return_stmt = 275; - raise_stmt = 276; - import_stmt = 277; - import_as_name = 278; - dotted_as_name = 279; - dotted_name = 280; - global_stmt = 281; - exec_stmt = 282; - assert_stmt = 283; - compound_stmt = 284; - if_stmt = 285; - while_stmt = 286; - for_stmt = 287; - try_stmt = 288; - except_clause = 289; - suite = 290; - test = 291; - and_test = 291; - not_test = 293; - comparison = 294; - comp_op = 295; - expr = 296; - xor_expr = 297; - and_expr = 298; - shift_expr = 299; - arith_expr = 300; - term = 301; - factor = 302; - power = 303; - atom = 304; - listmaker = 305; - lambdef = 306; - trailer = 307; - subscriptlist = 308; - subscript = 309; - sliceop = 310; - exprlist = 311; - testlist = 312; - dictmaker = 313; - classdef = 314; - arglist = 315; - argument = 316; - list_iter = 317; - list_for = 318; - list_if = 319; - -const - T_SHORT = 0; - T_INT = 1; - T_LONG = 2; - T_FLOAT = 3; - T_DOUBLE = 4; - T_STRING = 5; - T_OBJECT = 6; - T_CHAR = 7; // 1-character string - T_BYTE = 8; // 8-bit signed int - T_UBYTE = 9; - T_USHORT = 10; - T_UINT = 11; - T_ULONG = 12; - -// Added by Jack: strings contained in the structure - T_STRING_INPLACE= 13; - - T_OBJECT_EX = 16;{ Like T_OBJECT, but raises AttributeError - when the value is NULL, instead of - converting to None. } - -// Flags - READONLY = 1; - RO = READONLY; // Shorthand - READ_RESTRICTED = 2; - WRITE_RESTRICTED = 4; - RESTRICTED = (READ_RESTRICTED or WRITE_RESTRICTED); -type - TPyMemberType = (mtShort, mtInt, mtLong, mtFloat, mtDouble, mtString, - mtObject, mtChar, mtByte, mtUByte, mtUShort, mtUInt, - mtULong, mtStringInplace, mtObjectEx); - TPyMemberFlag = (mfDefault, mfReadOnly, mfReadRestricted, mfWriteRestricted, mfRestricted); - -//####################################################### -//## ## -//## Global declarations, nothing Python specific ## -//## ## -//####################################################### - -type - TPChar = array[0..16000] of PChar; - PPChar = ^TPChar; - PInt = ^Integer; - PDouble = ^Double; - PFloat = ^Real; - PLong = ^LongInt; - PShort = ^ShortInt; - PString = ^PChar; - -//####################################################### -//## ## -//## Python specific interface ## -//## ## -//####################################################### - -type - PP_frozen = ^Pfrozen; - P_frozen = ^Tfrozen; - PPyObject = ^PyObject; - PPPyObject = ^PPyObject; - PPPPyObject = ^PPPyObject; - PPyIntObject = ^PyIntObject; - PPyTypeObject = ^PyTypeObject; - PPySliceObject = ^PySliceObject; - - TPyCFunction = function (self, args: PPyObject): PPyObject; cdecl; - - Tunaryfunc = function (ob1: PPyObject): PPyObject; cdecl; - Tbinaryfunc = function (ob1,ob2: PPyObject): PPyObject; cdecl; - Tternaryfunc = function (ob1,ob2,ob3: PPyObject): PPyObject; cdecl; - Tinquiry = function (ob1: PPyObject): integer; cdecl; - Tcoercion = function (ob1,ob2: PPPyObject): integer; cdecl; - Tintargfunc = function (ob1: PPyObject; i: integer): PPyObject; cdecl; - Tintintargfunc = function (ob1: PPyObject; i1, i2: integer): - PPyObject; cdecl; - Tintobjargproc = function (ob1: PPyObject; i: integer; ob2: PPyObject): - integer; cdecl; - Tintintobjargproc = function (ob1: PPyObject; i1, i2: integer; - ob2: PPyObject): integer; cdecl; - Tobjobjargproc = function (ob1,ob2,ob3: PPyObject): integer; cdecl; - - Tpydestructor = procedure (ob: PPyObject); cdecl; - Tprintfunc = function (ob: PPyObject; var f: file; i: integer): integer; cdecl; - Tgetattrfunc = function (ob1: PPyObject; name: PChar): PPyObject; cdecl; - Tsetattrfunc = function (ob1: PPyObject; name: PChar; ob2: PPyObject): integer; cdecl; - Tcmpfunc = function (ob1, ob2: PPyObject): integer; cdecl; - Treprfunc = function (ob: PPyObject): PPyObject; cdecl; - Thashfunc = function (ob: PPyObject): LongInt; cdecl; - Tgetattrofunc = function (ob1, ob2: PPyObject): PPyObject; cdecl; - Tsetattrofunc = function (ob1, ob2, ob3: PPyObject): integer; cdecl; - -/// jah 29-sep-2000: updated for python 2.0 -/// added from object.h - Tgetreadbufferproc = function (ob1: PPyObject; i: integer; ptr: Pointer): integer; cdecl; - Tgetwritebufferproc= function (ob1: PPyObject; i: integer; ptr: Pointer): integer; cdecl; - Tgetsegcountproc = function (ob1: PPyObject; i: integer): integer; cdecl; - Tgetcharbufferproc = function (ob1: PPyObject; i: integer; const pstr: PChar): integer; cdecl; - Tobjobjproc = function (ob1, ob2: PPyObject): integer; cdecl; - Tvisitproc = function (ob1: PPyObject; ptr: Pointer): integer; cdecl; - Ttraverseproc = function (ob1: PPyObject; proc: visitproc; ptr: Pointer): integer; cdecl; - - Trichcmpfunc = function (ob1, ob2: PPyObject; i: Integer): PPyObject; cdecl; - Tgetiterfunc = function (ob1: PPyObject): PPyObject; cdecl; - Titernextfunc = function (ob1: PPyObject): PPyObject; cdecl; - Tdescrgetfunc = function (ob1, ob2, ob3: PPyObject): PPyObject; cdecl; - Tdescrsetfunc = function (ob1, ob2, ob3: PPyObject): Integer; cdecl; - Tinitproc = function (self, args, kwds: PPyObject): Integer; cdecl; - Tnewfunc = function (subtype: PPyTypeObject; args, kwds: PPyObject): PPyObject; cdecl; - Tallocfunc = function (self: PPyTypeObject; nitems: integer): PPyObject; cdecl; - - TPyNumberMethods = record - nb_add: Tbinaryfunc; - nb_substract: Tbinaryfunc; - nb_multiply: Tbinaryfunc; - nb_divide: Tbinaryfunc; - nb_remainder: Tbinaryfunc; - nb_divmod: Tbinaryfunc; - nb_power: Tternaryfunc; - nb_negative: Tunaryfunc; - nb_positive: Tunaryfunc; - nb_absolute: Tunaryfunc; - nb_nonzero: Tinquiry; - nb_invert: Tunaryfunc; - nb_lshift: Tbinaryfunc; - nb_rshift: Tbinaryfunc; - nb_and: Tbinaryfunc; - nb_xor: Tbinaryfunc; - nb_or: Tbinaryfunc; - nb_coerce: Tcoercion; - nb_int: Tunaryfunc; - nb_long: Tunaryfunc; - nb_float: Tunaryfunc; - nb_oct: Tunaryfunc; - nb_hex: Tunaryfunc; -/// jah 29-sep-2000: updated for python 2.0 -/// added from .h - nb_inplace_add: Tbinaryfunc; - nb_inplace_subtract: Tbinaryfunc; - nb_inplace_multiply: Tbinaryfunc; - nb_inplace_divide: Tbinaryfunc; - nb_inplace_remainder: Tbinaryfunc; - nb_inplace_power: Tternaryfunc; - nb_inplace_lshift: Tbinaryfunc; - nb_inplace_rshift: Tbinaryfunc; - nb_inplace_and: Tbinaryfunc; - nb_inplace_xor: Tbinaryfunc; - nb_inplace_or: Tbinaryfunc; - // Added in release 2.2 - // The following require the Py_TPFLAGS_HAVE_CLASS flag - nb_floor_divide: Tbinaryfunc; - nb_true_divide: Tbinaryfunc; - nb_inplace_floor_divide: Tbinaryfunc; - nb_inplace_true_divide: Tbinaryfunc; - end; - PPyNumberMethods = ^TPyNumberMethods; - - TPySequenceMethods = record - sq_length: Tinquiry; - sq_concat: Tbinaryfunc; - sq_repeat: Tintargfunc; - sq_item: Tintargfunc; - sq_slice: Tintintargfunc; - sq_ass_item: Tintobjargproc; - sq_ass_slice: Tintintobjargproc; -/// jah 29-sep-2000: updated for python 2.0 -/// added from .h - sq_contains: Tobjobjproc; - sq_inplace_concat: Tbinaryfunc; - sq_inplace_repeat: Tintargfunc; - end; - PPySequenceMethods = ^TPySequenceMethods; - - TPyMappingMethods = record - mp_length : Tinquiry; - mp_subscript: Tbinaryfunc; - mp_ass_subscript: Tobjobjargproc; - end; - PPyMappingMethods = ^PyMappingMethods; - -/// jah 29-sep-2000: updated for python 2.0 -/// added from .h - TPyBufferProcs = record - bf_getreadbuffer: Tgetreadbufferproc; - bf_getwritebuffer: Tgetwritebufferproc; - bf_getsegcount: Tgetsegcountproc; - bf_getcharbuffer: Tgetcharbufferproc; - end; - PPyBufferProcs = ^TPyBufferProcs; - - TPy_complex = record - real: double; - imag: double; - end; - - TPyObject = record - ob_refcnt: Integer; - ob_type: PPyTypeObject; - end; - - TPyIntObject = object(TPyObject) - ob_ival: LongInt; - end; - - PByte = ^Byte; - Tfrozen = packed record - name: PChar; - code: PByte; - size: Integer; - end; - - TPySliceObject = object(TPyObject) - start, stop, step: PPyObject; - end; - - PPyMethodDef = ^TPyMethodDef; - TPyMethodDef = record - ml_name: PChar; - ml_meth: TPyCFunction; - ml_flags: Integer; - ml_doc: PChar; - end; - - // structmember.h - PPyMemberDef = ^TPyMemberDef; - TPyMemberDef = record - name: PChar; - theType: integer; - offset: integer; - flags: integer; - doc: PChar; - end; - - // descrobject.h - - // Descriptors - - Tgetter = function (obj: PPyObject; context: Pointer): PPyObject; cdecl; - Tsetter = function (obj, value: PPyObject; context: Pointer): integer; cdecl; - - PPyGetSetDef = ^TPyGetSetDef; - TPyGetSetDef = record - name: PChar; - get: Tgetter; - set_: Tsetter; - doc: PChar; - closure: Pointer; - end; - - Twrapperfunc = function (self, args: PPyObject; wrapped: Pointer): PPyObject; cdecl; - - pwrapperbase = ^Twrapperbase; - Twrapperbase = record - name: PChar; - wrapper: Twrapperfunc; - doc: PChar; - end; - - // Various kinds of descriptor objects - - {#define PyDescr_COMMON \ - PyObject_HEAD \ - PyTypeObject *d_type; \ - PyObject *d_name - } - - PPyDescrObject = ^TPyDescrObject; - TPyDescrObject = object(TPyObject) - d_type: PPyTypeObject; - d_name: PPyObject; - end; - - PPyMethodDescrObject = ^TPyMethodDescrObject; - TPyMethodDescrObject = object(TPyDescrObject) - d_method: PPyMethodDef; - end; - - PPyMemberDescrObject = ^TPyMemberDescrObject; - TPyMemberDescrObject = object(TPyDescrObject) - d_member: PPyMemberDef; - end; - - PPyGetSetDescrObject = ^TPyGetSetDescrObject; - TPyGetSetDescrObject = object(TPyDescrObject) - d_getset: PPyGetSetDef; - end; - - PPyWrapperDescrObject = ^TPyWrapperDescrObject; - TPyWrapperDescrObject = object(TPyDescrObject) - d_base: pwrapperbase; - d_wrapped: Pointer; // This can be any function pointer - end; - - // object.h - TPyTypeObject = object(TPyObject) - ob_size: Integer; // Number of items in variable part - tp_name: PChar; // For printing - tp_basicsize, tp_itemsize: Integer; // For allocation - - // Methods to implement standard operations - - tp_dealloc: Tpydestructor; - tp_print: Tprintfunc; - tp_getattr: Tgetattrfunc; - tp_setattr: Tsetattrfunc; - tp_compare: Tcmpfunc; - tp_repr: Treprfunc; - - // Method suites for standard classes - - tp_as_number: PPyNumberMethods; - tp_as_sequence: PPySequenceMethods; - tp_as_mapping: PPyMappingMethods; - - // More standard operations (here for binary compatibility) - - tp_hash: Thashfunc; - tp_call: Tternaryfunc; - tp_str: Treprfunc; - tp_getattro: Tgetattrofunc; - tp_setattro: Tsetattrofunc; - -/// jah 29-sep-2000: updated for python 2.0 - - // Functions to access object as input/output buffer - tp_as_buffer: PPyBufferProcs; - // Flags to define presence of optional/expanded features - tp_flags: LongInt; - - tp_doc: PChar; // Documentation string - - // call function for all accessible objects - tp_traverse: Ttraverseproc; - - // delete references to contained objects - tp_clear: Tinquiry; - // rich comparisons - tp_richcompare: Trichcmpfunc; - - // weak reference enabler - tp_weaklistoffset: Longint; - // Iterators - tp_iter: Tgetiterfunc; - tp_iternext: Titernextfunc; - - // Attribute descriptor and subclassing stuff - tp_methods: PPyMethodDef; - tp_members: PPyMemberDef; - tp_getset: PPyGetSetDef; - tp_base: PPyTypeObject; - tp_dict: PPyObject; - tp_descr_get: Tdescrgetfunc; - tp_descr_set: Tdescrsetfunc; - tp_dictoffset: longint; - tp_init: Tinitproc; - tp_alloc: Tallocfunc; - tp_new: Tnewfunc; - tp_free: Tpydestructor; // Low-level free-memory routine - tp_is_gc: Tinquiry; // For PyObject_IS_GC - tp_bases: PPyObject; - tp_mro: PPyObject; // method resolution order - tp_cache: PPyObject; - tp_subclasses: PPyObject; - tp_weaklist: PPyObject; - //More spares - tp_xxx7: pointer; - tp_xxx8: pointer; - end; - - PPyMethodChain = ^TPyMethodChain; - TPyMethodChain = record - methods: PPyMethodDef; - link: PPyMethodChain; - end; - - PPyClassObject = ^TPyClassObject; - TPyClassObject = object(TPyObject) - cl_bases: PPyObject; // A tuple of class objects - cl_dict: PPyObject; // A dictionary - cl_name: PPyObject; // A string - // The following three are functions or NULL - cl_getattr: PPyObject; - cl_setattr: PPyObject; - cl_delattr: PPyObject; - end; - - PPyInstanceObject = ^TPyInstanceObject; - TPyInstanceObject = object(TPyObject) - in_class: PPyClassObject; // The class object - in_dict: PPyObject; // A dictionary - end; - -{ Instance method objects are used for two purposes: - (a) as bound instance methods (returned by instancename.methodname) - (b) as unbound methods (returned by ClassName.methodname) - In case (b), im_self is NULL -} - - PPyMethodObject = ^TPyMethodObject; - TPyMethodObject = object(TPyObject) - im_func: PPyObject; // The function implementing the method - im_self: PPyObject; // The instance it is bound to, or NULL - im_class: PPyObject; // The class that defined the method - end; - - // Bytecode object, compile.h - PPyCodeObject = ^TPyCodeObject; - TPyCodeObject = object(TPyObject) - co_argcount: Integer; // #arguments, except *args - co_nlocals: Integer; // #local variables - co_stacksize: Integer; // #entries needed for evaluation stack - co_flags: Integer; // CO_..., see below - co_code: PPyObject; // instruction opcodes (it hides a PyStringObject) - co_consts: PPyObject; // list (constants used) - co_names: PPyObject; // list of strings (names used) - co_varnames: PPyObject; // tuple of strings (local variable names) - co_freevars: PPyObject; // tuple of strings (free variable names) - co_cellvars: PPyObject; // tuple of strings (cell variable names) - // The rest doesn't count for hash/cmp - co_filename: PPyObject; // string (where it was loaded from) - co_name: PPyObject; // string (name, for reference) - co_firstlineno: Integer; // first source line number - co_lnotab: PPyObject; // string (encoding addr<->lineno mapping) - end; - - // from pystate.h - PPyInterpreterState = ^TPyInterpreterState; - PPyThreadState = ^TPyThreadState; - PPyFrameObject = ^TPyFrameObject; - - // Interpreter environments - TPyInterpreterState = record - next: PPyInterpreterState; - tstate_head: PPyThreadState; - - modules: PPyObject; - sysdict: PPyObject; - builtins: PPyObject; - - checkinterval: integer; - end; - - // Thread specific information - TPyThreadState = record - next: PPyThreadState; - interp: PPyInterpreterState; - - frame: PPyFrameObject; - recursion_depth: integer; - ticker: integer; - tracing: integer; - - sys_profilefunc: PPyObject; - sys_tracefunc: PPyObject; - - curexc_type: PPyObject; - curexc_value: PPyObject; - curexc_traceback: PPyObject; - - exc_type: PPyObject; - exc_value: PPyObject; - exc_traceback: PPyObject; - - dict: PPyObject; - end; - - // from frameobject.h - - PPyTryBlock = ^TPyTryBlock; - TPyTryBlock = record - b_type: Integer; // what kind of block this is - b_handler: Integer; // where to jump to find handler - b_level: Integer; // value stack level to pop to - end; - - CO_MAXBLOCKS = 0..19; - TPyFrameObject = object(TPyObject) - // start of the VAR_HEAD of an object - ob_size: Integer; // Number of items in variable part - // End of the Head of an object - f_back: PPyFrameObject; // previous frame, or NULL - f_code: PPyCodeObject; // code segment - f_builtins: PPyObject; // builtin symbol table (PyDictObject) - f_globals: PPyObject; // global symbol table (PyDictObject) - f_locals: PPyObject; // local symbol table (PyDictObject) - f_valuestack: PPPyObject; // points after the last local - (* Next free slot in f_valuestack. Frame creation sets to f_valuestack. - Frame evaluation usually NULLs it, but a frame that yields sets it - to the current stack top. *) - f_stacktop: PPPyObject; - f_trace: PPyObject; // Trace function - f_exc_type, f_exc_value, f_exc_traceback: PPyObject; - f_tstate: PPyThreadState; - f_lasti: Integer; // Last instruction if called - f_lineno: Integer; // Current line number - f_restricted: Integer; // Flag set if restricted operations - // in this scope - f_iblock: Integer; // index in f_blockstack - f_blockstack: array[CO_MAXBLOCKS] of PyTryBlock; // for try and loop blocks - f_nlocals: Integer; // number of locals - f_ncells: Integer; - f_nfreevars: Integer; - f_stacksize: Integer; // size of value stack - f_localsplus: array[0..0] of PPyObject; // locals+stack, dynamically sized - end; - - // From traceback.c - PPyTraceBackObject = ^TPyTraceBackObject; - TPyTraceBackObject = object(TPyObject) - tb_next: PPyTraceBackObject; - tb_frame: PPyFrameObject; - tb_lasti: Integer; - tb_lineno: Integer; - end; - - // Parse tree node interface - - PNode = ^Tnode; - Tnode = record - n_type: smallint; - n_str: PChar; - n_lineno: smallint; - n_nchildren: smallint; - n_child: PNode; - end; - - // From weakrefobject.h - - PPyWeakReference = ^TPyWeakReference; - TPyWeakReference = object(TPyObject) - wr_object: PPyObject; - wr_callback: PPyObject; - hash: longint; - wr_prev: PPyWeakReference; - wr_next: PPyWeakReference; - end; - - // from datetime.h - - -{* Fields are packed into successive bytes, each viewed as unsigned and - * big-endian, unless otherwise noted: - * - * byte offset - * 0 year 2 bytes, 1-9999 - * 2 month 1 byte, 1-12 - * 3 day 1 byte, 1-31 - * 4 hour 1 byte, 0-23 - * 5 minute 1 byte, 0-59 - * 6 second 1 byte, 0-59 - * 7 usecond 3 bytes, 0-999999 - * 10 - *} - -const - { # of bytes for year, month, and day. } - PyDateTime_DATE_DATASIZE = 4; - - { # of bytes for hour, minute, second, and usecond. } - PyDateTime_TIME_DATASIZE = 6; - - { # of bytes for year, month, day, hour, minute, second, and usecond. } - PyDateTime_DATETIME_DATASIZE = 10; -type - TPyDateTime_Delta = object(TPyObject) - hashcode: Integer; // -1 when unknown - days: Integer; // -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS - seconds: Integer; // 0 <= seconds < 24*3600 is invariant - microseconds: Integer; // 0 <= microseconds < 1000000 is invariant - end; - PPyDateTime_Delta = ^TPyDateTime_Delta; - - TPyDateTime_TZInfo = object(TPyObject) // a pure abstract base clase - end; - PPyDateTime_TZInfo = ^TPyDateTime_TZInfo; - -{ -/* The datetime and time types have hashcodes, and an optional tzinfo member, - * present if and only if hastzinfo is true. - */ -#define _PyTZINFO_HEAD \ - PyObject_HEAD \ - long hashcode; \ - char hastzinfo; /* boolean flag */ -} - -{* No _PyDateTime_BaseTZInfo is allocated; it's just to have something - * convenient to cast to, when getting at the hastzinfo member of objects - * starting with _PyTZINFO_HEAD. - *} - TPyDateTime_BaseTZInfo = object(TPyObject) - hashcode: Integer; - hastzinfo: bool; // boolean flag - end; - PPyDateTime_BaseTZInfo = ^TPyDateTime_BaseTZInfo; - -{* All time objects are of PyDateTime_TimeType, but that can be allocated - * in two ways, with or without a tzinfo member. Without is the same as - * tzinfo == None, but consumes less memory. _PyDateTime_BaseTime is an - * internal struct used to allocate the right amount of space for the - * "without" case. - *} -{#define _PyDateTime_TIMEHEAD \ - _PyTZINFO_HEAD \ - unsigned char data[_PyDateTime_TIME_DATASIZE]; -} - - TPyDateTime_BaseTime = object(TPyDateTime_BaseTZInfo) - data: array[0..Pred(PyDateTime_TIME_DATASIZE)] of Byte; - end; - PPyDateTime_BaseTime = ^TPyDateTime_BaseTime; - - TPyDateTime_Time = object(TPyDateTime_BaseTime) // hastzinfo true - tzinfo: PPyObject; - end; - PPyDateTime_Time = ^PyDateTime_Time; - -{* All datetime objects are of PyDateTime_DateTimeType, but that can be - * allocated in two ways too, just like for time objects above. In addition, - * the plain date type is a base class for datetime, so it must also have - * a hastzinfo member (although it's unused there). - *} - TPyDateTime_Date = object(TPyDateTime_BaseTZInfo) - data: array [0..Pred(PyDateTime_DATE_DATASIZE)] of Byte; - end; - PPyDateTime_Date = ^TPyDateTime_Date; - - { -#define _PyDateTime_DATETIMEHEAD \ - _PyTZINFO_HEAD \ - unsigned char data[_PyDateTime_DATETIME_DATASIZE]; -} - - TPyDateTime_BaseDateTime = object(TPyDateTime_BaseTZInfo) // hastzinfo false - data: array[0..Pred(PyDateTime_DATETIME_DATASIZE)] of Byte; - end; - PPyDateTime_BaseDateTime = ^TPyDateTime_BaseDateTime; - - TPyDateTime_DateTime = object(TPyDateTime_BaseTZInfo) // hastzinfo true - data: array[0..Pred(PyDateTime_DATETIME_DATASIZE)] of Byte; - tzinfo: PPyObject; - end; - PPyDateTime_DateTime = ^TPyDateTime_DateTime; - - -//####################################################### -//## ## -//## New exception classes ## -//## ## -//####################################################### -(* - // Python's exceptions - EPythonError = object(Exception) - EName: String; - EValue: String; - end; - EPyExecError = object(EPythonError) - end; - - // Standard exception classes of Python - -/// jah 29-sep-2000: updated for python 2.0 -/// base classes updated according python documentation - -{ Hierarchy of Python exceptions, Python 2.3, copied from <INSTALL>\Python\exceptions.c - -Exception\n\ - |\n\ - +-- SystemExit\n\ - +-- StopIteration\n\ - +-- StandardError\n\ - | |\n\ - | +-- KeyboardInterrupt\n\ - | +-- ImportError\n\ - | +-- EnvironmentError\n\ - | | |\n\ - | | +-- IOError\n\ - | | +-- OSError\n\ - | | |\n\ - | | +-- WindowsError\n\ - | | +-- VMSError\n\ - | |\n\ - | +-- EOFError\n\ - | +-- RuntimeError\n\ - | | |\n\ - | | +-- NotImplementedError\n\ - | |\n\ - | +-- NameError\n\ - | | |\n\ - | | +-- UnboundLocalError\n\ - | |\n\ - | +-- AttributeError\n\ - | +-- SyntaxError\n\ - | | |\n\ - | | +-- IndentationError\n\ - | | |\n\ - | | +-- TabError\n\ - | |\n\ - | +-- TypeError\n\ - | +-- AssertionError\n\ - | +-- LookupError\n\ - | | |\n\ - | | +-- IndexError\n\ - | | +-- KeyError\n\ - | |\n\ - | +-- ArithmeticError\n\ - | | |\n\ - | | +-- OverflowError\n\ - | | +-- ZeroDivisionError\n\ - | | +-- FloatingPointError\n\ - | |\n\ - | +-- ValueError\n\ - | | |\n\ - | | +-- UnicodeError\n\ - | | |\n\ - | | +-- UnicodeEncodeError\n\ - | | +-- UnicodeDecodeError\n\ - | | +-- UnicodeTranslateError\n\ - | |\n\ - | +-- ReferenceError\n\ - | +-- SystemError\n\ - | +-- MemoryError\n\ - |\n\ - +---Warning\n\ - |\n\ - +-- UserWarning\n\ - +-- DeprecationWarning\n\ - +-- PendingDeprecationWarning\n\ - +-- SyntaxWarning\n\ - +-- OverflowWarning\n\ - +-- RuntimeWarning\n\ - +-- FutureWarning" -} - EPyException = class (EPythonError); - EPyStandardError = class (EPyException); - EPyArithmeticError = class (EPyStandardError); - EPyLookupError = class (EPyStandardError); - EPyAssertionError = class (EPyStandardError); - EPyAttributeError = class (EPyStandardError); - EPyEOFError = class (EPyStandardError); - EPyFloatingPointError = class (EPyArithmeticError); - EPyEnvironmentError = class (EPyStandardError); - EPyIOError = class (EPyEnvironmentError); - EPyOSError = class (EPyEnvironmentError); - EPyImportError = class (EPyStandardError); - EPyIndexError = class (EPyLookupError); - EPyKeyError = class (EPyLookupError); - EPyKeyboardInterrupt = class (EPyStandardError); - EPyMemoryError = class (EPyStandardError); - EPyNameError = class (EPyStandardError); - EPyOverflowError = class (EPyArithmeticError); - EPyRuntimeError = class (EPyStandardError); - EPyNotImplementedError = class (EPyRuntimeError); - EPySyntaxError = class (EPyStandardError) - public - EFileName: string; - ELineStr: string; - ELineNumber: Integer; - EOffset: Integer; - end; - EPyIndentationError = class (EPySyntaxError); - EPyTabError = class (EPyIndentationError); - EPySystemError = class (EPyStandardError); - EPySystemExit = class (EPyException); - EPyTypeError = class (EPyStandardError); - EPyUnboundLocalError = class (EPyNameError); - EPyValueError = class (EPyStandardError); - EPyUnicodeError = class (EPyValueError); - UnicodeEncodeError = class (EPyUnicodeError); - UnicodeDecodeError = class (EPyUnicodeError); - UnicodeTranslateError = class (EPyUnicodeError); - EPyZeroDivisionError = class (EPyArithmeticError); - EPyStopIteration = class(EPyException); - EPyWarning = class (EPyException); - EPyUserWarning = class (EPyWarning); - EPyDeprecationWarning = class (EPyWarning); - PendingDeprecationWarning = class (EPyWarning); - FutureWarning = class (EPyWarning); - EPySyntaxWarning = class (EPyWarning); - EPyOverflowWarning = class (EPyWarning); - EPyRuntimeWarning = class (EPyWarning); - EPyReferenceError = class (EPyStandardError); -*) - -var - PyArg_Parse: function(args: PPyObject; format: PChar): - Integer; cdecl;// varargs; - PyArg_ParseTuple: function(args: PPyObject; format: PChar; - x1: Pointer = nil; - x2: Pointer = nil; - x3: Pointer = nil): - Integer; cdecl;// varargs - Py_BuildValue: function(format: PChar): PPyObject; cdecl; // varargs - PyCode_Addr2Line: function (co: PPyCodeObject; addrq: Integer): Integer; cdecl; - DLL_Py_GetBuildInfo: function: PChar; cdecl; - - // define Python flags. See file pyDebug.h - Py_DebugFlag: PInt; - Py_VerboseFlag: PInt; - Py_InteractiveFlag: PInt; - Py_OptimizeFlag: PInt; - Py_NoSiteFlag: PInt; - Py_UseClassExceptionsFlag: PInt; - Py_FrozenFlag: PInt; - Py_TabcheckFlag: PInt; - Py_UnicodeFlag: PInt; - Py_IgnoreEnvironmentFlag: PInt; - Py_DivisionWarningFlag: PInt; - //_PySys_TraceFunc: PPPyObject; - //_PySys_ProfileFunc: PPPPyObject; - - PyImport_FrozenModules: PP_frozen; - - Py_None: PPyObject; - Py_Ellipsis: PPyObject; - Py_False: PPyIntObject; - Py_True: PPyIntObject; - Py_NotImplemented: PPyObject; - - PyExc_AttributeError: PPPyObject; - PyExc_EOFError: PPPyObject; - PyExc_IOError: PPPyObject; - PyExc_ImportError: PPPyObject; - PyExc_IndexError: PPPyObject; - PyExc_KeyError: PPPyObject; - PyExc_KeyboardInterrupt: PPPyObject; - PyExc_MemoryError: PPPyObject; - PyExc_NameError: PPPyObject; - PyExc_OverflowError: PPPyObject; - PyExc_RuntimeError: PPPyObject; - PyExc_SyntaxError: PPPyObject; - PyExc_SystemError: PPPyObject; - PyExc_SystemExit: PPPyObject; - PyExc_TypeError: PPPyObject; - PyExc_ValueError: PPPyObject; - PyExc_ZeroDivisionError: PPPyObject; - PyExc_ArithmeticError: PPPyObject; - PyExc_Exception: PPPyObject; - PyExc_FloatingPointError: PPPyObject; - PyExc_LookupError: PPPyObject; - PyExc_StandardError: PPPyObject; - PyExc_AssertionError: PPPyObject; - PyExc_EnvironmentError: PPPyObject; - PyExc_IndentationError: PPPyObject; - PyExc_MemoryErrorInst: PPPyObject; - PyExc_NotImplementedError: PPPyObject; - PyExc_OSError: PPPyObject; - PyExc_TabError: PPPyObject; - PyExc_UnboundLocalError: PPPyObject; - PyExc_UnicodeError: PPPyObject; - - PyExc_Warning: PPPyObject; - PyExc_DeprecationWarning: PPPyObject; - PyExc_RuntimeWarning: PPPyObject; - PyExc_SyntaxWarning: PPPyObject; - PyExc_UserWarning: PPPyObject; - PyExc_OverflowWarning: PPPyObject; - PyExc_ReferenceError: PPPyObject; - PyExc_StopIteration: PPPyObject; - PyExc_FutureWarning: PPPyObject; - PyExc_PendingDeprecationWarning: PPPyObject; - PyExc_UnicodeDecodeError: PPPyObject; - PyExc_UnicodeEncodeError: PPPyObject; - PyExc_UnicodeTranslateError: PPPyObject; - - PyType_Type: PPyTypeObject; - PyCFunction_Type: PPyTypeObject; - PyCObject_Type: PPyTypeObject; - PyClass_Type: PPyTypeObject; - PyCode_Type: PPyTypeObject; - PyComplex_Type: PPyTypeObject; - PyDict_Type: PPyTypeObject; - PyFile_Type: PPyTypeObject; - PyFloat_Type: PPyTypeObject; - PyFrame_Type: PPyTypeObject; - PyFunction_Type: PPyTypeObject; - PyInstance_Type: PPyTypeObject; - PyInt_Type: PPyTypeObject; - PyList_Type: PPyTypeObject; - PyLong_Type: PPyTypeObject; - PyMethod_Type: PPyTypeObject; - PyModule_Type: PPyTypeObject; - PyObject_Type: PPyTypeObject; - PyRange_Type: PPyTypeObject; - PySlice_Type: PPyTypeObject; - PyString_Type: PPyTypeObject; - PyTuple_Type: PPyTypeObject; - - PyBaseObject_Type: PPyTypeObject; - PyBuffer_Type: PPyTypeObject; - PyCallIter_Type: PPyTypeObject; - PyCell_Type: PPyTypeObject; - PyClassMethod_Type: PPyTypeObject; - PyProperty_Type: PPyTypeObject; - PySeqIter_Type: PPyTypeObject; - PyStaticMethod_Type: PPyTypeObject; - PySuper_Type: PPyTypeObject; - PySymtableEntry_Type: PPyTypeObject; - PyTraceBack_Type: PPyTypeObject; - PyUnicode_Type: PPyTypeObject; - PyWrapperDescr_Type: PPyTypeObject; - - PyBaseString_Type: PPyTypeObject; - PyBool_Type: PPyTypeObject; - PyEnum_Type: PPyTypeObject; - - //PyArg_GetObject: function(args: PPyObject; nargs, i: integer; p_a: PPPyObject): integer; cdecl; - //PyArg_GetLong: function(args: PPyObject; nargs, i: integer; p_a: PLong): integer; cdecl; - //PyArg_GetShort: function(args: PPyObject; nargs, i: integer; p_a: PShort): integer; cdecl; - //PyArg_GetFloat: function(args: PPyObject; nargs, i: integer; p_a: PFloat): integer; cdecl; - //PyArg_GetString: function(args: PPyObject; nargs, i: integer; p_a: PString): integer; cdecl; - //PyArgs_VaParse: function (args: PPyObject; format: PChar; va_list: array of const): integer; cdecl; - // Does not work! - // Py_VaBuildValue: function (format: PChar; va_list: array of const): PPyObject; cdecl; - //PyBuiltin_Init: procedure; cdecl; - - PyComplex_FromCComplex: function(c: TPy_complex):PPyObject; cdecl; - PyComplex_FromDoubles: function(realv,imag: double):PPyObject; cdecl; - PyComplex_RealAsDouble: function(op: PPyObject): double; cdecl; - PyComplex_ImagAsDouble: function(op: PPyObject): double; cdecl; - PyComplex_AsCComplex: function(op: PPyObject): TPy_complex; cdecl; - PyCFunction_GetFunction: function(ob: PPyObject): Pointer; cdecl; - PyCFunction_GetSelf: function(ob: PPyObject): PPyObject; cdecl; - PyCallable_Check: function(ob : PPyObject): integer; cdecl; - PyCObject_FromVoidPtr: function(cobj, destruct: Pointer): PPyObject; cdecl; - PyCObject_AsVoidPtr: function(ob: PPyObject): Pointer; cdecl; - PyClass_New: function (ob1,ob2,ob3: PPyObject): PPyObject; cdecl; - PyClass_IsSubclass: function (ob1, ob2: PPyObject): integer cdecl; - - Py_InitModule4: function(name: PChar; methods: PPyMethodDef; doc: PChar; - passthrough: PPyObject; Api_Version: Integer):PPyObject; cdecl; - PyErr_BadArgument: function: integer; cdecl; - PyErr_BadInternalCall: procedure; cdecl; - PyErr_CheckSignals: function: integer; cdecl; - PyErr_Clear: procedure; cdecl; - PyErr_Fetch: procedure(errtype, errvalue, errtraceback: PPPyObject); cdecl; - PyErr_NoMemory: function: PPyObject; cdecl; - PyErr_Occurred: function: PPyObject; cdecl; - PyErr_Print: procedure; cdecl; - PyErr_Restore: procedure (errtype, errvalue, errtraceback: PPyObject); cdecl; - PyErr_SetFromErrno: function (ob: PPyObject):PPyObject; cdecl; - PyErr_SetNone: procedure(value: PPyObject); cdecl; - PyErr_SetObject: procedure (ob1, ob2 : PPyObject); cdecl; - PyErr_SetString: procedure(ErrorObject: PPyObject; text: PChar); cdecl; - PyImport_GetModuleDict: function: PPyObject; cdecl; - PyInt_FromLong: function(x: LongInt):PPyObject; cdecl; - Py_Initialize: procedure; cdecl; - Py_Exit: procedure(RetVal: Integer); cdecl; - PyEval_GetBuiltins: function: PPyObject; cdecl; - PyDict_GetItem: function(mp, key: PPyObject):PPyObject; cdecl; - PyDict_SetItem: function(mp, key, item:PPyObject):integer; cdecl; - PyDict_DelItem: function(mp, key: PPyObject):integer; cdecl; - PyDict_Clear: procedure(mp: PPyObject); cdecl; - PyDict_Next: function(mp: PPyObject; pos: PInt; key, value: PPPyObject):integer; cdecl; - PyDict_Keys: function(mp: PPyObject):PPyObject; cdecl; - PyDict_Values: function(mp: PPyObject):PPyObject; cdecl; - PyDict_Items: function(mp: PPyObject):PPyObject; cdecl; - PyDict_Size: function(mp: PPyObject):integer; cdecl; - PyDict_DelItemString: function(dp: PPyObject;key: PChar):integer; cdecl; - PyDict_New: function: PPyObject; cdecl; - PyDict_GetItemString: function(dp: PPyObject; key: PChar): PPyObject; cdecl; - PyDict_SetItemString: function(dp: PPyObject; key: PChar; item: PPyObject): - Integer; cdecl; - PyDictProxy_New: function (obj: PPyObject): PPyObject; cdecl; - PyModule_GetDict: function(module:PPyObject): PPyObject; cdecl; - PyObject_Str: function(v: PPyObject): PPyObject; cdecl; - PyRun_String: function(str: PChar; start: Integer; globals: PPyObject; - locals: PPyObject): PPyObject; cdecl; - PyRun_SimpleString: function(str: PChar): Integer; cdecl; - PyString_AsString: function(ob: PPyObject): PChar; cdecl; - PyString_FromString: function(str: PChar): PPyObject; cdecl; - PySys_SetArgv: procedure(argc: Integer; argv: PPChar); cdecl; - -{+ means, Grzegorz or me has tested his non object version of this function} -{+} PyCFunction_New: function(md:PPyMethodDef;ob:PPyObject):PPyObject; cdecl; -{+} PyEval_CallObject: function(ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyEval_CallObjectWithKeywords:function (ob1,ob2,ob3:PPyObject):PPyObject; cdecl; -{-} PyEval_GetFrame:function:PPyObject; cdecl; -{-} PyEval_GetGlobals:function:PPyObject; cdecl; -{-} PyEval_GetLocals:function:PPyObject; cdecl; -{-} //PyEval_GetOwner:function:PPyObject; cdecl; -{-} PyEval_GetRestricted:function:integer; cdecl; - -{-} PyEval_InitThreads:procedure; cdecl; -{-} PyEval_RestoreThread:procedure(tstate: PPyThreadState); cdecl; -{-} PyEval_SaveThread:function:PPyThreadState; cdecl; - -{-} PyFile_FromString:function (pc1,pc2:PChar):PPyObject; cdecl; -{-} PyFile_GetLine:function (ob:PPyObject;i:integer):PPyObject; cdecl; -{-} PyFile_Name:function (ob:PPyObject):PPyObject; cdecl; -{-} PyFile_SetBufSize:procedure(ob:PPyObject;i:integer); cdecl; -{-} PyFile_SoftSpace:function (ob:PPyObject;i:integer):integer; cdecl; -{-} PyFile_WriteObject:function (ob1,ob2:PPyObject;i:integer):integer; cdecl; -{-} PyFile_WriteString:procedure(s:PChar;ob:PPyObject); cdecl; -{+} PyFloat_AsDouble:function (ob:PPyObject):DOUBLE; cdecl; -{+} PyFloat_FromDouble:function (db:double):PPyObject; cdecl; -{-} PyFunction_GetCode:function (ob:PPyObject):PPyObject; cdecl; -{-} PyFunction_GetGlobals:function (ob:PPyObject):PPyObject; cdecl; -{-} PyFunction_New:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyImport_AddModule:function (name:PChar):PPyObject; cdecl; -{-} PyImport_Cleanup:procedure; cdecl; -{-} PyImport_GetMagicNumber:function:LONGINT; cdecl; -{+} PyImport_ImportFrozenModule:function (key:PChar):integer; cdecl; -{+} PyImport_ImportModule:function (name:PChar):PPyObject; cdecl; -{+} PyImport_Import:function (name:PPyObject):PPyObject; cdecl; -{-} //PyImport_Init:procedure; cdecl; -{-} PyImport_ReloadModule:function (ob:PPyObject):PPyObject; cdecl; -{-} PyInstance_New:function (obClass, obArg, obKW:PPyObject):PPyObject; cdecl; -{+} PyInt_AsLong:function (ob:PPyObject):LONGINT; cdecl; -{-} PyList_Append:function (ob1,ob2:PPyObject):integer; cdecl; -{-} PyList_AsTuple:function (ob:PPyObject):PPyObject; cdecl; -{+} PyList_GetItem:function (ob:PPyObject;i:integer):PPyObject; cdecl; -{-} PyList_GetSlice:function (ob:PPyObject;i1,i2:integer):PPyObject; cdecl; -{-} PyList_Insert:function (dp:PPyObject;idx:Integer;item:PPyObject):integer; cdecl; -{-} PyList_New:function (size:integer):PPyObject; cdecl; -{-} PyList_Reverse:function (ob:PPyObject):integer; cdecl; -{-} PyList_SetItem:function (dp:PPyObject;idx:Integer;item:PPyObject):integer; cdecl; -{-} PyList_SetSlice:function (ob:PPyObject;i1,i2:integer;ob2:PPyObject):integer; cdecl; -{+} PyList_Size:function (ob:PPyObject):integer; cdecl; -{-} PyList_Sort:function (ob:PPyObject):integer; cdecl; -{-} PyLong_AsDouble:function (ob:PPyObject):DOUBLE; cdecl; -{+} PyLong_AsLong:function (ob:PPyObject):LONGINT; cdecl; -{+} PyLong_FromDouble:function (db:double):PPyObject; cdecl; -{+} PyLong_FromLong:function (l:longint):PPyObject; cdecl; -{-} PyLong_FromString:function (pc:PChar;var ppc:PChar;i:integer):PPyObject; cdecl; -{-} PyLong_FromUnsignedLong:function(val:cardinal): PPyObject; cdecl; -{-} PyLong_AsUnsignedLong:function(ob:PPyObject): Cardinal; cdecl; -{-} PyLong_FromUnicode:function(ob:PPyObject; a, b: integer): PPyObject; cdecl; -{-} PyLong_FromLongLong:function(val:Int64): PPyObject; cdecl; -{-} PyLong_AsLongLong:function(ob:PPyObject): Int64; cdecl; -{-} PyMapping_Check:function (ob:PPyObject):integer; cdecl; -{-} PyMapping_GetItemString:function (ob:PPyObject;key:PChar):PPyObject; cdecl; -{-} PyMapping_HasKey:function (ob,key:PPyObject):integer; cdecl; -{-} PyMapping_HasKeyString:function (ob:PPyObject;key:PChar):integer; cdecl; -{-} PyMapping_Length:function (ob:PPyObject):integer; cdecl; -{-} PyMapping_SetItemString:function (ob:PPyObject; key:PChar; value:PPyObject):integer; cdecl; -{-} PyMethod_Class:function (ob:PPyObject):PPyObject; cdecl; -{-} PyMethod_Function:function (ob:PPyObject):PPyObject; cdecl; -{-} PyMethod_New:function (ob1,ob2,ob3:PPyObject):PPyObject; cdecl; -{-} PyMethod_Self:function (ob:PPyObject):PPyObject; cdecl; -{-} PyModule_GetName:function (ob:PPyObject):PChar; cdecl; -{-} PyModule_New:function (key:PChar):PPyObject; cdecl; -{-} PyNumber_Absolute:function (ob:PPyObject):PPyObject; cdecl; -{-} PyNumber_Add:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_And:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Check:function (ob:PPyObject):integer; cdecl; -{-} PyNumber_Coerce:function (var ob1,ob2:PPyObject):integer; cdecl; -{-} PyNumber_Divide:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_FloorDivide:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_TrueDivide:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Divmod:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Float:function (ob:PPyObject):PPyObject; cdecl; -{-} PyNumber_Int:function (ob:PPyObject):PPyObject; cdecl; -{-} PyNumber_Invert:function (ob:PPyObject):PPyObject; cdecl; -{-} PyNumber_Long:function (ob:PPyObject):PPyObject; cdecl; -{-} PyNumber_Lshift:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Multiply:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Negative:function (ob:PPyObject):PPyObject; cdecl; -{-} PyNumber_Or:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Positive:function (ob:PPyObject):PPyObject; cdecl; -{-} PyNumber_Power:function (ob1,ob2,ob3:PPyObject):PPyObject; cdecl; -{-} PyNumber_Remainder:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Rshift:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Subtract:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyNumber_Xor:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyOS_InitInterrupts:procedure; cdecl; -{-} PyOS_InterruptOccurred:function:integer; cdecl; -{-} PyObject_CallObject:function (ob,args:PPyObject):PPyObject; cdecl; -{-} PyObject_Compare:function (ob1,ob2:PPyObject):integer; cdecl; -{-} PyObject_GetAttr:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{+} PyObject_GetAttrString:function (ob:PPyObject;c:PChar):PPyObject; cdecl; -{-} PyObject_GetItem:function (ob,key:PPyObject):PPyObject; cdecl; -{-} PyObject_DelItem:function (ob,key:PPyObject):PPyObject; cdecl; -{-} PyObject_HasAttrString:function (ob:PPyObject;key:PChar):integer; cdecl; -{-} PyObject_Hash:function (ob:PPyObject):LONGINT; cdecl; -{-} PyObject_IsTrue:function (ob:PPyObject):integer; cdecl; -{-} PyObject_Length:function (ob:PPyObject):integer; cdecl; -{-} PyObject_Repr:function (ob:PPyObject):PPyObject; cdecl; -{-} PyObject_SetAttr:function (ob1,ob2,ob3:PPyObject):integer; cdecl; -{-} PyObject_SetAttrString:function (ob:PPyObject;key:Pchar;value:PPyObject):integer; cdecl; -{-} PyObject_SetItem:function (ob1,ob2,ob3:PPyObject):integer; cdecl; -{-} PyObject_Init:function (ob:PPyObject; t:PPyTypeObject):PPyObject; cdecl; -{-} PyObject_InitVar:function (ob:PPyObject; t:PPyTypeObject; size:integer):PPyObject; cdecl; -{-} PyObject_New:function (t:PPyTypeObject):PPyObject; cdecl; -{-} PyObject_NewVar:function (t:PPyTypeObject; size:integer):PPyObject; cdecl; - PyObject_Free:procedure (ob:PPyObject); cdecl; -{-} PyObject_IsInstance:function (inst, cls:PPyObject):integer; cdecl; -{-} PyObject_IsSubclass:function (derived, cls:PPyObject):integer; cdecl; - PyObject_GenericGetAttr:function (obj, name: PPyObject): PPyObject; cdecl; - PyObject_GenericSetAttr:function (obj, name, value: PPyObject): Integer; cdecl; -{-} PyObject_GC_Malloc:function (size:integer):PPyObject; cdecl; -{-} PyObject_GC_New:function (t:PPyTypeObject):PPyObject; cdecl; -{-} PyObject_GC_NewVar:function (t:PPyTypeObject; size:integer):PPyObject; cdecl; -{-} PyObject_GC_Resize:function (t:PPyObject; newsize:integer):PPyObject; cdecl; -{-} PyObject_GC_Del:procedure (ob:PPyObject); cdecl; -{-} PyObject_GC_Track:procedure (ob:PPyObject); cdecl; -{-} PyObject_GC_UnTrack:procedure (ob:PPyObject); cdecl; -{-} PyRange_New:function (l1,l2,l3:longint;i:integer):PPyObject; cdecl; -{-} PySequence_Check:function (ob:PPyObject):integer; cdecl; -{-} PySequence_Concat:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PySequence_Count:function (ob1,ob2:PPyObject):integer; cdecl; -{-} PySequence_GetItem:function (ob:PPyObject;i:integer):PPyObject; cdecl; -{-} PySequence_GetSlice:function (ob:PPyObject;i1,i2:integer):PPyObject; cdecl; -{-} PySequence_In:function (ob1,ob2:PPyObject):integer; cdecl; -{-} PySequence_Index:function (ob1,ob2:PPyObject):integer; cdecl; -{-} PySequence_Length:function (ob:PPyObject):integer; cdecl; -{-} PySequence_Repeat:function (ob:PPyObject;count:integer):PPyObject; cdecl; -{-} PySequence_SetItem:function (ob:PPyObject;i:integer;value:PPyObject):integer; cdecl; -{-} PySequence_SetSlice:function (ob:PPyObject;i1,i2:integer;value:PPyObject):integer; cdecl; -{-} PySequence_DelSlice:function (ob:PPyObject;i1,i2:integer):integer; cdecl; -{-} PySequence_Tuple:function (ob:PPyObject):PPyObject; cdecl; -{-} PySequence_Contains:function (ob, value:PPyObject):integer; cdecl; -{-} PySlice_GetIndices:function (ob:PPySliceObject;length:integer;var start,stop,step:integer):integer; cdecl; -{-} PySlice_GetIndicesEx:function (ob:PPySliceObject;length:integer;var start,stop,step,slicelength:integer):integer; cdecl; -{-} PySlice_New:function (start,stop,step:PPyObject):PPyObject; cdecl; -{-} PyString_Concat:procedure(var ob1:PPyObject;ob2:PPyObject); cdecl; -{-} PyString_ConcatAndDel:procedure(var ob1:PPyObject;ob2:PPyObject); cdecl; -{-} PyString_Format:function (ob1,ob2:PPyObject):PPyObject; cdecl; -{-} PyString_FromStringAndSize:function (s:PChar;i:integer):PPyObject; cdecl; -{-} PyString_Size:function (ob:PPyObject):integer; cdecl; -{-} PyString_DecodeEscape:function(s:PChar; len:integer; errors:PChar; unicode:integer; recode_encoding:PChar):PPyObject; cdecl; -{-} PyString_Repr:function(ob:PPyObject; smartquotes:integer):PPyObject; cdecl; -{+} PySys_GetObject:function (s:PChar):PPyObject; cdecl; -{-} //PySys_Init:procedure; cdecl; -{-} PySys_SetObject:function (s:PChar;ob:PPyObject):integer; cdecl; -{-} PySys_SetPath:procedure(path:PChar); cdecl; -{-} //PyTraceBack_Fetch:function:PPyObject; cdecl; -{-} PyTraceBack_Here:function (p:pointer):integer; cdecl; -{-} PyTraceBack_Print:function (ob1,ob2:PPyObject):integer; cdecl; -{-} //PyTraceBack_Store:function (ob:PPyObject):integer; cdecl; -{+} PyTuple_GetItem:function (ob:PPyObject;i:integer):PPyObject; cdecl; -{-} PyTuple_GetSlice:function (ob:PPyObject;i1,i2:integer):PPyObject; cdecl; -{+} PyTuple_New:function (size:Integer):PPyObject; cdecl; -{+} PyTuple_SetItem:function (ob:PPyObject;key:integer;value:PPyObject):integer; cdecl; -{+} PyTuple_Size:function (ob:PPyObject):integer; cdecl; -{+} PyType_IsSubtype:function (a, b: PPyTypeObject):integer; cdecl; - PyType_GenericAlloc:function(atype: PPyTypeObject; nitems:Integer): PPyObject; cdecl; - PyType_GenericNew:function(atype: PPyTypeObject; args, kwds: PPyObject): PPyObject; cdecl; - PyType_Ready:function(atype: PPyTypeObject): integer; cdecl; -{+} PyUnicode_FromWideChar:function (const w:PWideChar; size:integer):PPyObject; cdecl; -{+} PyUnicode_AsWideChar:function (unicode: PPyObject; w:PWideChar; size:integer):integer; cdecl; -{-} PyUnicode_FromOrdinal:function (ordinal:integer):PPyObject; cdecl; - PyWeakref_GetObject: function (ref: PPyObject): PPyObject; cdecl; - PyWeakref_NewProxy: function (ob, callback: PPyObject): PPyObject; cdecl; - PyWeakref_NewRef: function (ob, callback: PPyObject): PPyObject; cdecl; - PyWrapper_New: function (ob1, ob2: PPyObject): PPyObject; cdecl; - PyBool_FromLong: function (ok: Integer): PPyObject; cdecl; -{-} Py_AtExit:function (proc: procedure):integer; cdecl; -{-} //Py_Cleanup:procedure; cdecl; -{-} Py_CompileString:function (s1,s2:PChar;i:integer):PPyObject; cdecl; -{-} Py_FatalError:procedure(s:PChar); cdecl; -{-} Py_FindMethod:function (md:PPyMethodDef;ob:PPyObject;key:PChar):PPyObject; cdecl; -{-} Py_FindMethodInChain:function (mc:PPyMethodChain;ob:PPyObject;key:PChar):PPyObject; cdecl; -{-} Py_FlushLine:procedure; cdecl; -{+} Py_Finalize: procedure; cdecl; -{-} PyErr_ExceptionMatches: function (exc: PPyObject): Integer; cdecl; -{-} PyErr_GivenExceptionMatches: function (raised_exc, exc: PPyObject): Integer; cdecl; -{-} PyEval_EvalCode: function (co: PPyCodeObject; globals, locals: PPyObject): PPyObject; cdecl; -{+} Py_GetVersion: function: PChar; cdecl; -{+} Py_GetCopyright: function: PChar; cdecl; -{+} Py_GetExecPrefix: function: PChar; cdecl; -{+} Py_GetPath: function: PChar; cdecl; -{+} Py_GetPrefix: function: PChar; cdecl; -{+} Py_GetProgramName: function: PChar; cdecl; - -{-} PyParser_SimpleParseString: function (str: PChar; start: Integer): PNode; cdecl; -{-} PyNode_Free: procedure(n: PNode); cdecl; -{-} PyErr_NewException: function (name: PChar; base, dict: PPyObject): PPyObject; cdecl; -{-} Py_Malloc: function (size: Integer): Pointer; -{-} PyMem_Malloc: function (size: Integer): Pointer; -{-} PyObject_CallMethod: function (obj: PPyObject; method, format: PChar): PPyObject; cdecl; - -{New exported Objects in Python 1.5} - Py_SetProgramName: procedure(name: PChar); cdecl; - Py_IsInitialized: function: integer; cdecl; - Py_GetProgramFullPath: function: PChar; cdecl; - Py_NewInterpreter: function: PPyThreadState; cdecl; - Py_EndInterpreter: procedure(tstate: PPyThreadState); cdecl; - PyEval_AcquireLock: procedure; cdecl; - PyEval_ReleaseLock: procedure; cdecl; - PyEval_AcquireThread: procedure(tstate: PPyThreadState); cdecl; - PyEval_ReleaseThread: procedure(tstate: PPyThreadState); cdecl; - PyInterpreterState_New: function: PPyInterpreterState; cdecl; - PyInterpreterState_Clear: procedure(interp: PPyInterpreterState); cdecl; - PyInterpreterState_Delete: procedure(interp: PPyInterpreterState); cdecl; - PyThreadState_New: function (interp: PPyInterpreterState): PPyThreadState; cdecl; - PyThreadState_Clear: procedure(tstate: PPyThreadState); cdecl; - PyThreadState_Delete: procedure(tstate: PPyThreadState); cdecl; - PyThreadState_Get: function: PPyThreadState; cdecl; - PyThreadState_Swap: function (tstate: PPyThreadState): PPyThreadState; cdecl; - -{Further exported Objects, may be implemented later} -{ - PyCode_New: Pointer; - PyErr_SetInterrupt: Pointer; - PyFile_AsFile: Pointer; - PyFile_FromFile: Pointer; - PyFloat_AsString: Pointer; - PyFrame_BlockPop: Pointer; - PyFrame_BlockSetup: Pointer; - PyFrame_ExtendStack: Pointer; - PyFrame_FastToLocals: Pointer; - PyFrame_LocalsToFast: Pointer; - PyFrame_New: Pointer; - PyGrammar_AddAccelerators: Pointer; - PyGrammar_FindDFA: Pointer; - PyGrammar_LabelRepr: Pointer; - PyInstance_DoBinOp: Pointer; - PyInt_GetMax: Pointer; - PyMarshal_Init: Pointer; - PyMarshal_ReadLongFromFile: Pointer; - PyMarshal_ReadObjectFromFile: Pointer; - PyMarshal_ReadObjectFromString: Pointer; - PyMarshal_WriteLongToFile: Pointer; - PyMarshal_WriteObjectToFile: Pointer; - PyMember_Get: Pointer; - PyMember_Set: Pointer; - PyNode_AddChild: Pointer; - PyNode_Compile: Pointer; - PyNode_New: Pointer; - PyOS_GetLastModificationTime: Pointer; - PyOS_Readline: Pointer; - PyOS_strtol: Pointer; - PyOS_strtoul: Pointer; - PyObject_CallFunction: Pointer; - PyObject_CallMethod: Pointer; - PyObject_Print: Pointer; - PyParser_AddToken: Pointer; - PyParser_Delete: Pointer; - PyParser_New: Pointer; - PyParser_ParseFile: Pointer; - PyParser_ParseString: Pointer; - PyParser_SimpleParseFile: Pointer; - PyRun_AnyFile: Pointer; - PyRun_File: Pointer; - PyRun_InteractiveLoop: Pointer; - PyRun_InteractiveOne: Pointer; - PyRun_SimpleFile: Pointer; - PySys_GetFile: Pointer; - PyToken_OneChar: Pointer; - PyToken_TwoChars: Pointer; - PyTokenizer_Free: Pointer; - PyTokenizer_FromFile: Pointer; - PyTokenizer_FromString: Pointer; - PyTokenizer_Get: Pointer; - Py_Main: Pointer; - _PyObject_NewVar: Pointer; - _PyParser_Grammar: Pointer; - _PyParser_TokenNames: Pointer; - _PyThread_Started: Pointer; - _Py_c_diff: Pointer; - _Py_c_neg: Pointer; - _Py_c_pow: Pointer; - _Py_c_prod: Pointer; - _Py_c_quot: Pointer; - _Py_c_sum: Pointer; -} -// functions redefined in Delphi -procedure Py_INCREF(op: PPyObject); -procedure Py_DECREF(op: PPyObject); -procedure Py_XINCREF(op: PPyObject); -procedure Py_XDECREF(op: PPyObject); - -// This function handles all cardinals, pointer types (with no adjustment of pointers!) -// (Extended) floats, which are handled as Python doubles and currencies, handled -// as (normalized) Python doubles. -function PyImport_ExecCodeModule(const name: String; codeobject: PPyObject): PPyObject; -function PyString_Check(obj: PPyObject): Boolean; -function PyString_CheckExact(obj: PPyObject): Boolean; -function PyFloat_Check(obj: PPyObject): Boolean; -function PyFloat_CheckExact(obj: PPyObject): Boolean; -function PyInt_Check(obj: PPyObject): Boolean; -function PyInt_CheckExact(obj: PPyObject): Boolean; -function PyLong_Check(obj: PPyObject): Boolean; -function PyLong_CheckExact(obj: PPyObject): Boolean; -function PyTuple_Check(obj: PPyObject): Boolean; -function PyTuple_CheckExact(obj: PPyObject): Boolean; -function PyInstance_Check(obj: PPyObject): Boolean; -function PyClass_Check(obj: PPyObject): Boolean; -function PyMethod_Check(obj: PPyObject): Boolean; -function PyList_Check(obj: PPyObject): Boolean; -function PyList_CheckExact(obj: PPyObject): Boolean; -function PyDict_Check(obj: PPyObject): Boolean; -function PyDict_CheckExact(obj: PPyObject): Boolean; -function PyModule_Check(obj: PPyObject): Boolean; -function PyModule_CheckExact(obj: PPyObject): Boolean; -function PySlice_Check(obj: PPyObject): Boolean; -function PyFunction_Check(obj: PPyObject): Boolean; -function PyUnicode_Check(obj: PPyObject): Boolean; -function PyUnicode_CheckExact(obj: PPyObject): Boolean; -function PyType_IS_GC(t: PPyTypeObject): Boolean; -function PyObject_IS_GC(obj: PPyObject): Boolean; -function PyWeakref_Check(obj: PPyObject): Boolean; -function PyWeakref_CheckRef(obj: PPyObject): Boolean; -function PyWeakref_CheckProxy(obj: PPyObject): Boolean; -function PyBool_Check(obj: PPyObject): Boolean; -function PyBaseString_Check(obj: PPyObject): Boolean; -function PyEnum_Check(obj: PPyObject): Boolean; -function PyObject_TypeCheck(obj:PPyObject; t:PPyTypeObject): Boolean; -function Py_InitModule(const name: PChar; md: PPyMethodDef): PPyObject; - -function PyType_HasFeature(AType: PPyTypeObject; AFlag: Integer): Boolean; - -implementation - -procedure Py_INCREF(op: PPyObject); -begin - Inc(op.ob_refcnt); -end; - -procedure Py_DECREF(op: PPyObject); -begin - Dec(op.ob_refcnt); - if op.ob_refcnt = 0 then begin - op.ob_type.tp_dealloc(op); - end; -end; - -procedure Py_XINCREF(op: PPyObject); -begin - if op <> nil then Py_INCREF(op); -end; - -procedure Py_XDECREF(op: PPyObject); -begin - if op <> nil then Py_DECREF(op); -end; - -function PyImport_ExecCodeModule(const name: String; - codeobject: PPyObject): PPyObject; -var - m, d, v, modules: PPyObject; -begin - m:= PyImport_AddModule(PChar(name)); - if m = nil then - begin - Result:= nil; - Exit; - end; - d:= PyModule_GetDict(m); - if PyDict_GetItemString(d, '__builtins__') = nil then - begin - if PyDict_SetItemString(d, '__builtins__', PyEval_GetBuiltins) <> 0 then - begin - Result:= nil; - Exit; - end; - end; - // Remember the fielname as the __file__ attribute - if PyDict_SetItemString(d, '__file__', PPyCodeObject(codeobject).co_filename) <> 0 then - PyErr_Clear(); // Not important enough to report - v:= PyEval_EvalCode(PPyCodeObject(codeobject), d, d); // XXX owner ? - if v = nil then - begin - Result:= nil; - Exit; - end; - Py_XDECREF(v); - modules:= PyImport_GetModuleDict(); - if PyDict_GetItemString(modules, PChar(name)) = nil then - begin - PyErr_SetString(PyExc_ImportError^, PChar(Format('Loaded module %.200s not found in sys.modules', [name]))); - Result:= nil; - Exit; - end; - Py_XINCREF(m); - Result:= m; -end; - -function PyString_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyString_Type); -end; - -function PyString_CheckExact(obj: PPyObject): Boolean; -begin - Result:= (obj <> nil) and (obj.ob_type = PPyTypeObject(PyString_Type)); -end; - -function PyFloat_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyFloat_Type); -end; - -function PyFloat_CheckExact(obj: PPyObject): Boolean; -begin - Result:= (obj <> nil) and (obj.ob_type = PPyTypeObject(PyFloat_Type)); -end; - -function PyInt_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyInt_Type); -end; - -function PyInt_CheckExact(obj: PPyObject): Boolean; -begin - Result:= (obj <> nil) and (obj.ob_type = PPyTypeObject(PyInt_Type)); -end; - -function PyLong_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyLong_Type); -end; - -function PyLong_CheckExact(obj: PPyObject): Boolean; -begin - Result:= (obj <> nil) and (obj.ob_type = PPyTypeObject(PyLong_Type)); -end; - -function PyTuple_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyTuple_Type); -end; - -function PyTuple_CheckExact(obj: PPyObject): Boolean; -begin - Result:= ( obj<> nil) and (obj^.ob_type = PPyTypeObject(PyTuple_Type)); -end; - -function PyInstance_Check(obj: PPyObject): Boolean; -begin - Result:= (obj <> nil) and (obj^.ob_type = PPyTypeObject(PyInstance_Type)); -end; - -function PyClass_Check(obj: PPyObject): Boolean; -begin - Result:= ( obj<> nil) and (obj^.ob_type = PPyTypeObject(PyClass_Type)); -end; - -function PyMethod_Check(obj: PPyObject): Boolean; -begin - Result:= (obj <> nil) and (obj^.ob_type = PPyTypeObject(PyMethod_Type)); -end; - -function PyList_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyList_Type); -end; - -function PyList_CheckExact(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (obj^.ob_type = PPyTypeObject(PyList_Type)); -end; - -function PyDict_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyDict_Type); -end; - -function PyDict_CheckExact(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (obj^.ob_type = PPyTypeObject(PyDict_Type)); -end; - -function PyModule_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyModule_Type); -end; - -function PyModule_CheckExact(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (obj^.ob_type = PPyTypeObject(PyModule_Type)); -end; - -function PySlice_Check(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (obj^.ob_type = PPyTypeObject(PySlice_Type)); -end; - -function PyFunction_Check(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and - ((obj.ob_type = PPyTypeObject(PyCFunction_Type)) or - (obj.ob_type = PPyTypeObject(PyFunction_Type))); -end; - -function PyUnicode_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyUnicode_Type); -end; - -function PyUnicode_CheckExact(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (obj^.ob_type = PPyTypeObject(PyUnicode_Type)); -end; - -function PyType_IS_GC(t: PPyTypeObject): Boolean; -begin - Result:= PyType_HasFeature(t, Py_TPFLAGS_HAVE_GC); -end; - -function PyObject_IS_GC(obj: PPyObject): Boolean; -begin - Result:= PyType_IS_GC(obj.ob_type) and - ((obj.ob_type.tp_is_gc = nil) or (obj.ob_type.tp_is_gc(obj) = 1)); -end; - -function PyWeakref_Check(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (PyWeakref_CheckRef(obj) or PyWeakref_CheckProxy(obj)); -end; - -function PyWeakref_CheckRef(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (obj.ob_type = PPyTypeObject(PyWeakref_RefType)); -end; - -function PyWeakref_CheckProxy(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and - ((obj.ob_type = PPyTypeObject(PyWeakref_ProxyType)) or - (obj.ob_type = PPyTypeObject(PyWeakref_CallableProxyType))); -end; - -function PyBool_Check(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (obj.ob_type = PPyTypeObject(PyBool_Type)); -end; - -function PyBaseString_Check(obj: PPyObject): Boolean; -begin - Result:= PyObject_TypeCheck(obj, PyBaseString_Type); -end; - -function PyEnum_Check(obj: PPyObject): Boolean; -begin - Result:= (obj<>nil) and (obj.ob_type = PPyTypeObject(PyEnum_Type)); -end; - -function PyObject_TypeCheck(obj: PPyObject; t: PPyTypeObject): Boolean; -begin - Result:= (obj<>nil) and (obj.ob_type = t); - if not Result and (obj<>nil) and (t<>nil) then - Result:= PyType_IsSubtype(obj.ob_type, t) = 1; -end; - -function Py_InitModule(const name: PChar; md: PPyMethodDef): PPyObject; -begin - result:= Py_InitModule4(name, md, nil, nil, 1012); -end; - -function PyType_HasFeature(AType: PPyTypeObject; AFlag: Integer): Boolean; -begin - //(((t)->tp_flags & (f)) != 0) - Result:= (AType.tp_flags and AFlag) <> 0; -end; - -procedure init(lib: TLibHandle); -begin - Py_DebugFlag := getProcAddr(lib, 'Py_DebugFlag'); - Py_VerboseFlag := getProcAddr(lib, 'Py_VerboseFlag'); - Py_InteractiveFlag := getProcAddr(lib, 'Py_InteractiveFlag'); - Py_OptimizeFlag := getProcAddr(lib, 'Py_OptimizeFlag'); - Py_NoSiteFlag := getProcAddr(lib, 'Py_NoSiteFlag'); - Py_UseClassExceptionsFlag := getProcAddr(lib, 'Py_UseClassExceptionsFlag'); - Py_FrozenFlag := getProcAddr(lib, 'Py_FrozenFlag'); - Py_TabcheckFlag := getProcAddr(lib, 'Py_TabcheckFlag'); - Py_UnicodeFlag := getProcAddr(lib, 'Py_UnicodeFlag'); - - Py_IgnoreEnvironmentFlag := getProcAddr(lib, 'Py_IgnoreEnvironmentFlag'); - Py_DivisionWarningFlag := getProcAddr(lib, 'Py_DivisionWarningFlag'); - Py_None := getProcAddr(lib, '_Py_NoneStruct'); - Py_Ellipsis := getProcAddr(lib, '_Py_EllipsisObject'); - Py_False := getProcAddr(lib, '_Py_ZeroStruct'); - Py_True := getProcAddr(lib, '_Py_TrueStruct'); - Py_NotImplemented := getProcAddr(lib, '_Py_NotImplementedStruct'); - - PyImport_FrozenModules := getProcAddr(lib, 'PyImport_FrozenModules'); - - PyExc_AttributeError := getProcAddr(lib, 'PyExc_AttributeError'); - PyExc_EOFError := getProcAddr(lib, 'PyExc_EOFError'); - PyExc_IOError := getProcAddr(lib, 'PyExc_IOError'); - PyExc_ImportError := getProcAddr(lib, 'PyExc_ImportError'); - PyExc_IndexError := getProcAddr(lib, 'PyExc_IndexError'); - PyExc_KeyError := getProcAddr(lib, 'PyExc_KeyError'); - PyExc_KeyboardInterrupt := getProcAddr(lib, 'PyExc_KeyboardInterrupt'); - PyExc_MemoryError := getProcAddr(lib, 'PyExc_MemoryError'); - PyExc_NameError := getProcAddr(lib, 'PyExc_NameError'); - PyExc_OverflowError := getProcAddr(lib, 'PyExc_OverflowError'); - PyExc_RuntimeError := getProcAddr(lib, 'PyExc_RuntimeError'); - PyExc_SyntaxError := getProcAddr(lib, 'PyExc_SyntaxError'); - PyExc_SystemError := getProcAddr(lib, 'PyExc_SystemError'); - PyExc_SystemExit := getProcAddr(lib, 'PyExc_SystemExit'); - PyExc_TypeError := getProcAddr(lib, 'PyExc_TypeError'); - PyExc_ValueError := getProcAddr(lib, 'PyExc_ValueError'); - PyExc_ZeroDivisionError := getProcAddr(lib, 'PyExc_ZeroDivisionError'); - PyExc_ArithmeticError := getProcAddr(lib, 'PyExc_ArithmeticError'); - PyExc_Exception := getProcAddr(lib, 'PyExc_Exception'); - PyExc_FloatingPointError := getProcAddr(lib, 'PyExc_FloatingPointError'); - PyExc_LookupError := getProcAddr(lib, 'PyExc_LookupError'); - PyExc_StandardError := getProcAddr(lib, 'PyExc_StandardError'); - - PyExc_AssertionError := getProcAddr(lib, 'PyExc_AssertionError'); - PyExc_EnvironmentError := getProcAddr(lib, 'PyExc_EnvironmentError'); - PyExc_IndentationError := getProcAddr(lib, 'PyExc_IndentationError'); - PyExc_MemoryErrorInst := getProcAddr(lib, 'PyExc_MemoryErrorInst'); - PyExc_NotImplementedError := getProcAddr(lib, 'PyExc_NotImplementedError'); - PyExc_OSError := getProcAddr(lib, 'PyExc_OSError'); - PyExc_TabError := getProcAddr(lib, 'PyExc_TabError'); - PyExc_UnboundLocalError := getProcAddr(lib, 'PyExc_UnboundLocalError'); - PyExc_UnicodeError := getProcAddr(lib, 'PyExc_UnicodeError'); - - PyExc_Warning := getProcAddr(lib, 'PyExc_Warning'); - PyExc_DeprecationWarning := getProcAddr(lib, 'PyExc_DeprecationWarning'); - PyExc_RuntimeWarning := getProcAddr(lib, 'PyExc_RuntimeWarning'); - PyExc_SyntaxWarning := getProcAddr(lib, 'PyExc_SyntaxWarning'); - PyExc_UserWarning := getProcAddr(lib, 'PyExc_UserWarning'); - - PyExc_OverflowWarning := getProcAddr(lib, 'PyExc_OverflowWarning'); - PyExc_ReferenceError := getProcAddr(lib, 'PyExc_ReferenceError'); - PyExc_StopIteration := getProcAddr(lib, 'PyExc_StopIteration'); - - PyExc_FutureWarning := getProcAddr(lib, 'PyExc_FutureWarning'); - PyExc_PendingDeprecationWarning:= getProcAddr(lib, 'PyExc_PendingDeprecationWarning'); - PyExc_UnicodeDecodeError := getProcAddr(lib, 'PyExc_UnicodeDecodeError'); - PyExc_UnicodeEncodeError := getProcAddr(lib, 'PyExc_UnicodeEncodeError'); - PyExc_UnicodeTranslateError:= getProcAddr(lib, 'PyExc_UnicodeTranslateError'); - - PyType_Type := getProcAddr(lib, 'PyType_Type'); - PyCFunction_Type := getProcAddr(lib, 'PyCFunction_Type'); - PyCObject_Type := getProcAddr(lib, 'PyCObject_Type'); - PyClass_Type := getProcAddr(lib, 'PyClass_Type'); - PyCode_Type := getProcAddr(lib, 'PyCode_Type'); - PyComplex_Type := getProcAddr(lib, 'PyComplex_Type'); - PyDict_Type := getProcAddr(lib, 'PyDict_Type'); - PyFile_Type := getProcAddr(lib, 'PyFile_Type'); - PyFloat_Type := getProcAddr(lib, 'PyFloat_Type'); - PyFrame_Type := getProcAddr(lib, 'PyFrame_Type'); - PyFunction_Type := getProcAddr(lib, 'PyFunction_Type'); - PyInstance_Type := getProcAddr(lib, 'PyInstance_Type'); - PyInt_Type := getProcAddr(lib, 'PyInt_Type'); - PyList_Type := getProcAddr(lib, 'PyList_Type'); - PyLong_Type := getProcAddr(lib, 'PyLong_Type'); - PyMethod_Type := getProcAddr(lib, 'PyMethod_Type'); - PyModule_Type := getProcAddr(lib, 'PyModule_Type'); - PyObject_Type := getProcAddr(lib, 'PyObject_Type'); - PyRange_Type := getProcAddr(lib, 'PyRange_Type'); - PySlice_Type := getProcAddr(lib, 'PySlice_Type'); - PyString_Type := getProcAddr(lib, 'PyString_Type'); - PyTuple_Type := getProcAddr(lib, 'PyTuple_Type'); - - PyUnicode_Type := getProcAddr(lib, 'PyUnicode_Type'); - - PyBaseObject_Type := getProcAddr(lib, 'PyBaseObject_Type'); - PyBuffer_Type := getProcAddr(lib, 'PyBuffer_Type'); - PyCallIter_Type := getProcAddr(lib, 'PyCallIter_Type'); - PyCell_Type := getProcAddr(lib, 'PyCell_Type'); - PyClassMethod_Type := getProcAddr(lib, 'PyClassMethod_Type'); - PyProperty_Type := getProcAddr(lib, 'PyProperty_Type'); - PySeqIter_Type := getProcAddr(lib, 'PySeqIter_Type'); - PyStaticMethod_Type := getProcAddr(lib, 'PyStaticMethod_Type'); - PySuper_Type := getProcAddr(lib, 'PySuper_Type'); - PySymtableEntry_Type := getProcAddr(lib, 'PySymtableEntry_Type'); - PyTraceBack_Type := getProcAddr(lib, 'PyTraceBack_Type'); - PyWrapperDescr_Type := getProcAddr(lib, 'PyWrapperDescr_Type'); - - PyBaseString_Type := getProcAddr(lib, 'PyBaseString_Type'); - PyBool_Type := getProcAddr(lib, 'PyBool_Type'); - PyEnum_Type := getProcAddr(lib, 'PyEnum_Type'); - - - //PyArg_GetObject := getProcAddr(lib, 'PyArg_GetObject'); - //PyArg_GetLong := getProcAddr(lib, 'PyArg_GetLong'); - //PyArg_GetShort := getProcAddr(lib, 'PyArg_GetShort'); - //PyArg_GetFloat := getProcAddr(lib, 'PyArg_GetFloat'); - //PyArg_GetString := getProcAddr(lib, 'PyArg_GetString'); - //PyArgs_VaParse := getProcAddr(lib, 'PyArgs_VaParse'); - //Py_VaBuildValue := getProcAddr(lib, 'Py_VaBuildValue'); - //PyBuiltin_Init := getProcAddr(lib, 'PyBuiltin_Init'); - PyComplex_FromCComplex := getProcAddr(lib, 'PyComplex_FromCComplex'); - PyComplex_FromDoubles := getProcAddr(lib, 'PyComplex_FromDoubles'); - PyComplex_RealAsDouble := getProcAddr(lib, 'PyComplex_RealAsDouble'); - PyComplex_ImagAsDouble := getProcAddr(lib, 'PyComplex_ImagAsDouble'); - PyComplex_AsCComplex := getProcAddr(lib, 'PyComplex_AsCComplex'); - PyCFunction_GetFunction := getProcAddr(lib, 'PyCFunction_GetFunction'); - PyCFunction_GetSelf := getProcAddr(lib, 'PyCFunction_GetSelf'); - PyCallable_Check := getProcAddr(lib, 'PyCallable_Check'); - PyCObject_FromVoidPtr := getProcAddr(lib, 'PyCObject_FromVoidPtr'); - PyCObject_AsVoidPtr := getProcAddr(lib, 'PyCObject_AsVoidPtr'); - PyClass_New := getProcAddr(lib, 'PyClass_New'); - PyClass_IsSubclass := getProcAddr(lib, 'PyClass_IsSubclass'); - PyDict_GetItem := getProcAddr(lib, 'PyDict_GetItem'); - PyDict_SetItem := getProcAddr(lib, 'PyDict_SetItem'); - PyDict_DelItem := getProcAddr(lib, 'PyDict_DelItem'); - PyDict_Clear := getProcAddr(lib, 'PyDict_Clear'); - PyDict_Next := getProcAddr(lib, 'PyDict_Next'); - PyDict_Keys := getProcAddr(lib, 'PyDict_Keys'); - PyDict_Values := getProcAddr(lib, 'PyDict_Values'); - PyDict_Items := getProcAddr(lib, 'PyDict_Items'); - PyDict_Size := getProcAddr(lib, 'PyDict_Size'); - PyDict_DelItemString := getProcAddr(lib, 'PyDict_DelItemString'); - PyDictProxy_New := getProcAddr(lib, 'PyDictProxy_New'); - Py_InitModule4 := getProcAddr(lib, 'Py_InitModule4'); - PyErr_Print := getProcAddr(lib, 'PyErr_Print'); - PyErr_SetNone := getProcAddr(lib, 'PyErr_SetNone'); - PyErr_SetObject := getProcAddr(lib, 'PyErr_SetObject'); - PyErr_Restore := getProcAddr(lib, 'PyErr_Restore'); - PyErr_BadArgument := getProcAddr(lib, 'PyErr_BadArgument'); - PyErr_NoMemory := getProcAddr(lib, 'PyErr_NoMemory'); - PyErr_SetFromErrno := getProcAddr(lib, 'PyErr_SetFromErrno'); - PyErr_BadInternalCall := getProcAddr(lib, 'PyErr_BadInternalCall'); - PyErr_CheckSignals := getProcAddr(lib, 'PyErr_CheckSignals'); - PyErr_Occurred := getProcAddr(lib, 'PyErr_Occurred'); - PyErr_Clear := getProcAddr(lib, 'PyErr_Clear'); - PyErr_Fetch := getProcAddr(lib, 'PyErr_Fetch'); - PyErr_SetString := getProcAddr(lib, 'PyErr_SetString'); - PyEval_GetBuiltins := getProcAddr(lib, 'PyEval_GetBuiltins'); - PyImport_GetModuleDict := getProcAddr(lib, 'PyImport_GetModuleDict'); - PyInt_FromLong := getProcAddr(lib, 'PyInt_FromLong'); - PyArg_ParseTuple := getProcAddr(lib, 'PyArg_ParseTuple'); - PyArg_Parse := getProcAddr(lib, 'PyArg_Parse'); - Py_BuildValue := getProcAddr(lib, 'Py_BuildValue'); - Py_Initialize := getProcAddr(lib, 'Py_Initialize'); - PyDict_New := getProcAddr(lib, 'PyDict_New'); - PyDict_SetItemString := getProcAddr(lib, 'PyDict_SetItemString'); - PyModule_GetDict := getProcAddr(lib, 'PyModule_GetDict'); - PyObject_Str := getProcAddr(lib, 'PyObject_Str'); - PyRun_String := getProcAddr(lib, 'PyRun_String'); - PyRun_SimpleString := getProcAddr(lib, 'PyRun_SimpleString'); - PyDict_GetItemString := getProcAddr(lib, 'PyDict_GetItemString'); - PyString_AsString := getProcAddr(lib, 'PyString_AsString'); - PyString_FromString := getProcAddr(lib, 'PyString_FromString'); - PySys_SetArgv := getProcAddr(lib, 'PySys_SetArgv'); - Py_Exit := getProcAddr(lib, 'Py_Exit'); - - PyCFunction_New :=getProcAddr(lib, 'PyCFunction_New'); - PyEval_CallObject :=getProcAddr(lib, 'PyEval_CallObject'); - PyEval_CallObjectWithKeywords:=getProcAddr(lib, 'PyEval_CallObjectWithKeywords'); - PyEval_GetFrame :=getProcAddr(lib, 'PyEval_GetFrame'); - PyEval_GetGlobals :=getProcAddr(lib, 'PyEval_GetGlobals'); - PyEval_GetLocals :=getProcAddr(lib, 'PyEval_GetLocals'); - //PyEval_GetOwner :=getProcAddr(lib, 'PyEval_GetOwner'); - PyEval_GetRestricted :=getProcAddr(lib, 'PyEval_GetRestricted'); - PyEval_InitThreads :=getProcAddr(lib, 'PyEval_InitThreads'); - PyEval_RestoreThread :=getProcAddr(lib, 'PyEval_RestoreThread'); - PyEval_SaveThread :=getProcAddr(lib, 'PyEval_SaveThread'); - PyFile_FromString :=getProcAddr(lib, 'PyFile_FromString'); - PyFile_GetLine :=getProcAddr(lib, 'PyFile_GetLine'); - PyFile_Name :=getProcAddr(lib, 'PyFile_Name'); - PyFile_SetBufSize :=getProcAddr(lib, 'PyFile_SetBufSize'); - PyFile_SoftSpace :=getProcAddr(lib, 'PyFile_SoftSpace'); - PyFile_WriteObject :=getProcAddr(lib, 'PyFile_WriteObject'); - PyFile_WriteString :=getProcAddr(lib, 'PyFile_WriteString'); - PyFloat_AsDouble :=getProcAddr(lib, 'PyFloat_AsDouble'); - PyFloat_FromDouble :=getProcAddr(lib, 'PyFloat_FromDouble'); - PyFunction_GetCode :=getProcAddr(lib, 'PyFunction_GetCode'); - PyFunction_GetGlobals :=getProcAddr(lib, 'PyFunction_GetGlobals'); - PyFunction_New :=getProcAddr(lib, 'PyFunction_New'); - PyImport_AddModule :=getProcAddr(lib, 'PyImport_AddModule'); - PyImport_Cleanup :=getProcAddr(lib, 'PyImport_Cleanup'); - PyImport_GetMagicNumber :=getProcAddr(lib, 'PyImport_GetMagicNumber'); - PyImport_ImportFrozenModule:=getProcAddr(lib, 'PyImport_ImportFrozenModule'); - PyImport_ImportModule :=getProcAddr(lib, 'PyImport_ImportModule'); - PyImport_Import :=getProcAddr(lib, 'PyImport_Import'); - //@PyImport_Init :=getProcAddr(lib, 'PyImport_Init'); - PyImport_ReloadModule :=getProcAddr(lib, 'PyImport_ReloadModule'); - PyInstance_New :=getProcAddr(lib, 'PyInstance_New'); - PyInt_AsLong :=getProcAddr(lib, 'PyInt_AsLong'); - PyList_Append :=getProcAddr(lib, 'PyList_Append'); - PyList_AsTuple :=getProcAddr(lib, 'PyList_AsTuple'); - PyList_GetItem :=getProcAddr(lib, 'PyList_GetItem'); - PyList_GetSlice :=getProcAddr(lib, 'PyList_GetSlice'); - PyList_Insert :=getProcAddr(lib, 'PyList_Insert'); - PyList_New :=getProcAddr(lib, 'PyList_New'); - PyList_Reverse :=getProcAddr(lib, 'PyList_Reverse'); - PyList_SetItem :=getProcAddr(lib, 'PyList_SetItem'); - PyList_SetSlice :=getProcAddr(lib, 'PyList_SetSlice'); - PyList_Size :=getProcAddr(lib, 'PyList_Size'); - PyList_Sort :=getProcAddr(lib, 'PyList_Sort'); - PyLong_AsDouble :=getProcAddr(lib, 'PyLong_AsDouble'); - PyLong_AsLong :=getProcAddr(lib, 'PyLong_AsLong'); - PyLong_FromDouble :=getProcAddr(lib, 'PyLong_FromDouble'); - PyLong_FromLong :=getProcAddr(lib, 'PyLong_FromLong'); - PyLong_FromString :=getProcAddr(lib, 'PyLong_FromString'); - PyLong_FromString :=getProcAddr(lib, 'PyLong_FromString'); - PyLong_FromUnsignedLong :=getProcAddr(lib, 'PyLong_FromUnsignedLong'); - PyLong_AsUnsignedLong :=getProcAddr(lib, 'PyLong_AsUnsignedLong'); - PyLong_FromUnicode :=getProcAddr(lib, 'PyLong_FromUnicode'); - PyLong_FromLongLong :=getProcAddr(lib, 'PyLong_FromLongLong'); - PyLong_AsLongLong :=getProcAddr(lib, 'PyLong_AsLongLong'); - - PyMapping_Check :=getProcAddr(lib, 'PyMapping_Check'); - PyMapping_GetItemString :=getProcAddr(lib, 'PyMapping_GetItemString'); - PyMapping_HasKey :=getProcAddr(lib, 'PyMapping_HasKey'); - PyMapping_HasKeyString :=getProcAddr(lib, 'PyMapping_HasKeyString'); - PyMapping_Length :=getProcAddr(lib, 'PyMapping_Length'); - PyMapping_SetItemString :=getProcAddr(lib, 'PyMapping_SetItemString'); - PyMethod_Class :=getProcAddr(lib, 'PyMethod_Class'); - PyMethod_Function :=getProcAddr(lib, 'PyMethod_Function'); - PyMethod_New :=getProcAddr(lib, 'PyMethod_New'); - PyMethod_Self :=getProcAddr(lib, 'PyMethod_Self'); - PyModule_GetName :=getProcAddr(lib, 'PyModule_GetName'); - PyModule_New :=getProcAddr(lib, 'PyModule_New'); - PyNumber_Absolute :=getProcAddr(lib, 'PyNumber_Absolute'); - PyNumber_Add :=getProcAddr(lib, 'PyNumber_Add'); - PyNumber_And :=getProcAddr(lib, 'PyNumber_And'); - PyNumber_Check :=getProcAddr(lib, 'PyNumber_Check'); - PyNumber_Coerce :=getProcAddr(lib, 'PyNumber_Coerce'); - PyNumber_Divide :=getProcAddr(lib, 'PyNumber_Divide'); - - PyNumber_FloorDivide :=getProcAddr(lib, 'PyNumber_FloorDivide'); - PyNumber_TrueDivide :=getProcAddr(lib, 'PyNumber_TrueDivide'); - PyNumber_Divmod :=getProcAddr(lib, 'PyNumber_Divmod'); - PyNumber_Float :=getProcAddr(lib, 'PyNumber_Float'); - PyNumber_Int :=getProcAddr(lib, 'PyNumber_Int'); - PyNumber_Invert :=getProcAddr(lib, 'PyNumber_Invert'); - PyNumber_Long :=getProcAddr(lib, 'PyNumber_Long'); - PyNumber_Lshift :=getProcAddr(lib, 'PyNumber_Lshift'); - PyNumber_Multiply :=getProcAddr(lib, 'PyNumber_Multiply'); - PyNumber_Negative :=getProcAddr(lib, 'PyNumber_Negative'); - PyNumber_Or :=getProcAddr(lib, 'PyNumber_Or'); - PyNumber_Positive :=getProcAddr(lib, 'PyNumber_Positive'); - PyNumber_Power :=getProcAddr(lib, 'PyNumber_Power'); - PyNumber_Remainder :=getProcAddr(lib, 'PyNumber_Remainder'); - PyNumber_Rshift :=getProcAddr(lib, 'PyNumber_Rshift'); - PyNumber_Subtract :=getProcAddr(lib, 'PyNumber_Subtract'); - PyNumber_Xor :=getProcAddr(lib, 'PyNumber_Xor'); - PyOS_InitInterrupts :=getProcAddr(lib, 'PyOS_InitInterrupts'); - PyOS_InterruptOccurred :=getProcAddr(lib, 'PyOS_InterruptOccurred'); - PyObject_CallObject :=getProcAddr(lib, 'PyObject_CallObject'); - PyObject_Compare :=getProcAddr(lib, 'PyObject_Compare'); - PyObject_GetAttr :=getProcAddr(lib, 'PyObject_GetAttr'); - PyObject_GetAttrString :=getProcAddr(lib, 'PyObject_GetAttrString'); - PyObject_GetItem :=getProcAddr(lib, 'PyObject_GetItem'); - PyObject_DelItem :=getProcAddr(lib, 'PyObject_DelItem'); - PyObject_HasAttrString :=getProcAddr(lib, 'PyObject_HasAttrString'); - PyObject_Hash :=getProcAddr(lib, 'PyObject_Hash'); - PyObject_IsTrue :=getProcAddr(lib, 'PyObject_IsTrue'); - PyObject_Length :=getProcAddr(lib, 'PyObject_Length'); - PyObject_Repr :=getProcAddr(lib, 'PyObject_Repr'); - PyObject_SetAttr :=getProcAddr(lib, 'PyObject_SetAttr'); - PyObject_SetAttrString :=getProcAddr(lib, 'PyObject_SetAttrString'); - PyObject_SetItem :=getProcAddr(lib, 'PyObject_SetItem'); - - PyObject_Init :=getProcAddr(lib, 'PyObject_Init'); - PyObject_InitVar :=getProcAddr(lib, 'PyObject_InitVar'); - PyObject_New :=getProcAddr(lib, '_PyObject_New'); - PyObject_NewVar :=getProcAddr(lib, '_PyObject_NewVar'); - PyObject_Free :=getProcAddr(lib, 'PyObject_Free'); - - PyObject_IsInstance :=getProcAddr(lib, 'PyObject_IsInstance'); - PyObject_IsSubclass :=getProcAddr(lib, 'PyObject_IsSubclass'); - - PyObject_GenericGetAttr :=getProcAddr(lib, 'PyObject_GenericGetAttr'); - PyObject_GenericSetAttr :=getProcAddr(lib, 'PyObject_GenericSetAttr'); - - PyObject_GC_Malloc :=getProcAddr(lib, '_PyObject_GC_Malloc'); - PyObject_GC_New :=getProcAddr(lib, '_PyObject_GC_New'); - PyObject_GC_NewVar :=getProcAddr(lib, '_PyObject_GC_NewVar'); - PyObject_GC_Resize :=getProcAddr(lib, '_PyObject_GC_Resize'); - PyObject_GC_Del :=getProcAddr(lib, 'PyObject_GC_Del'); - PyObject_GC_Track :=getProcAddr(lib, 'PyObject_GC_Track'); - PyObject_GC_UnTrack :=getProcAddr(lib, 'PyObject_GC_UnTrack'); - - PyRange_New :=getProcAddr(lib, 'PyRange_New'); - PySequence_Check :=getProcAddr(lib, 'PySequence_Check'); - PySequence_Concat :=getProcAddr(lib, 'PySequence_Concat'); - PySequence_Count :=getProcAddr(lib, 'PySequence_Count'); - PySequence_GetItem :=getProcAddr(lib, 'PySequence_GetItem'); - PySequence_GetSlice :=getProcAddr(lib, 'PySequence_GetSlice'); - PySequence_In :=getProcAddr(lib, 'PySequence_In'); - PySequence_Index :=getProcAddr(lib, 'PySequence_Index'); - PySequence_Length :=getProcAddr(lib, 'PySequence_Length'); - PySequence_Repeat :=getProcAddr(lib, 'PySequence_Repeat'); - PySequence_SetItem :=getProcAddr(lib, 'PySequence_SetItem'); - PySequence_SetSlice :=getProcAddr(lib, 'PySequence_SetSlice'); - PySequence_DelSlice :=getProcAddr(lib, 'PySequence_DelSlice'); - PySequence_Tuple :=getProcAddr(lib, 'PySequence_Tuple'); - PySequence_Contains :=getProcAddr(lib, 'PySequence_Contains'); - PySlice_GetIndices :=getProcAddr(lib, 'PySlice_GetIndices'); - PySlice_GetIndicesEx :=getProcAddr(lib, 'PySlice_GetIndicesEx'); - PySlice_New :=getProcAddr(lib, 'PySlice_New'); - PyString_Concat :=getProcAddr(lib, 'PyString_Concat'); - PyString_ConcatAndDel :=getProcAddr(lib, 'PyString_ConcatAndDel'); - PyString_Format :=getProcAddr(lib, 'PyString_Format'); - PyString_FromStringAndSize:=getProcAddr(lib, 'PyString_FromStringAndSize'); - PyString_Size :=getProcAddr(lib, 'PyString_Size'); - PyString_DecodeEscape :=getProcAddr(lib, 'PyString_DecodeEscape'); - PyString_Repr :=getProcAddr(lib, 'PyString_Repr'); - PySys_GetObject :=getProcAddr(lib, 'PySys_GetObject'); - //PySys_Init :=getProcAddr(lib, 'PySys_Init'); - PySys_SetObject :=getProcAddr(lib, 'PySys_SetObject'); - PySys_SetPath :=getProcAddr(lib, 'PySys_SetPath'); - //PyTraceBack_Fetch :=getProcAddr(lib, 'PyTraceBack_Fetch'); - PyTraceBack_Here :=getProcAddr(lib, 'PyTraceBack_Here'); - PyTraceBack_Print :=getProcAddr(lib, 'PyTraceBack_Print'); - //PyTraceBack_Store :=getProcAddr(lib, 'PyTraceBack_Store'); - PyTuple_GetItem :=getProcAddr(lib, 'PyTuple_GetItem'); - PyTuple_GetSlice :=getProcAddr(lib, 'PyTuple_GetSlice'); - PyTuple_New :=getProcAddr(lib, 'PyTuple_New'); - PyTuple_SetItem :=getProcAddr(lib, 'PyTuple_SetItem'); - PyTuple_Size :=getProcAddr(lib, 'PyTuple_Size'); - - PyType_IsSubtype :=getProcAddr(lib, 'PyType_IsSubtype'); - PyType_GenericAlloc :=getProcAddr(lib, 'PyType_GenericAlloc'); - PyType_GenericNew :=getProcAddr(lib, 'PyType_GenericNew'); - PyType_Ready :=getProcAddr(lib, 'PyType_Ready'); - - PyUnicode_FromWideChar :=getProcAddr(lib, 'PyUnicodeUCS2_FromWideChar'); - PyUnicode_AsWideChar :=getProcAddr(lib, 'PyUnicodeUCS2_AsWideChar'); - PyUnicode_FromOrdinal :=getProcAddr(lib, 'PyUnicodeUCS2_FromOrdinal'); - - PyWeakref_GetObject :=getProcAddr(lib, 'PyWeakref_GetObject'); - PyWeakref_NewProxy :=getProcAddr(lib, 'PyWeakref_NewProxy'); - PyWeakref_NewRef :=getProcAddr(lib, 'PyWeakref_NewRef'); - PyWrapper_New :=getProcAddr(lib, 'PyWrapper_New'); - - PyBool_FromLong :=getProcAddr(lib, 'PyBool_FromLong'); - - Py_AtExit :=getProcAddr(lib, 'Py_AtExit'); - //Py_Cleanup :=getProcAddr(lib, 'Py_Cleanup'); - Py_CompileString :=getProcAddr(lib, 'Py_CompileString'); - Py_FatalError :=getProcAddr(lib, 'Py_FatalError'); - Py_FindMethod :=getProcAddr(lib, 'Py_FindMethod'); - Py_FindMethodInChain :=getProcAddr(lib, 'Py_FindMethodInChain'); - Py_FlushLine :=getProcAddr(lib, 'Py_FlushLine'); - Py_Finalize :=getProcAddr(lib, 'Py_Finalize'); - PyCode_Addr2Line := getProcAddr(lib, 'PyCode_Addr2Line'); - PyClass_IsSubclass :=getProcAddr(lib, 'PyClass_IsSubclass'); - PyErr_ExceptionMatches :=getProcAddr(lib, 'PyErr_ExceptionMatches'); - PyErr_GivenExceptionMatches:=getProcAddr(lib, 'PyErr_GivenExceptionMatches'); - PyEval_EvalCode :=getProcAddr(lib, 'PyEval_EvalCode'); - Py_GetVersion :=getProcAddr(lib, 'Py_GetVersion'); - Py_GetCopyright :=getProcAddr(lib, 'Py_GetCopyright'); - Py_GetExecPrefix :=getProcAddr(lib, 'Py_GetExecPrefix'); - Py_GetPath :=getProcAddr(lib, 'Py_GetPath'); - Py_GetPrefix :=getProcAddr(lib, 'Py_GetPrefix'); - Py_GetProgramName :=getProcAddr(lib, 'Py_GetProgramName'); - PyParser_SimpleParseString :=getProcAddr(lib, 'PyParser_SimpleParseString'); - PyNode_Free :=getProcAddr(lib, 'PyNode_Free'); - PyErr_NewException :=getProcAddr(lib, 'PyErr_NewException'); -/// jah 29-sep-2000 : updated for python 2.0 -/// replaced Py_Malloc with PyMem_Malloc -///--- @Py_Malloc := Import ('Py_Malloc'); -///+++ @Py_Malloc := Import ('PyMem_Malloc'); - Py_Malloc := getProcAddr(lib, 'PyMem_Malloc'); - PyMem_Malloc := getProcAddr(lib, 'PyMem_Malloc'); - PyObject_CallMethod := getProcAddr(lib, 'PyObject_CallMethod'); - Py_SetProgramName := getProcAddr(lib, 'Py_SetProgramName'); - Py_IsInitialized := getProcAddr(lib, 'Py_IsInitialized'); - Py_GetProgramFullPath := getProcAddr(lib, 'Py_GetProgramFullPath'); - DLL_Py_GetBuildInfo := getProcAddr(lib, 'Py_GetBuildInfo'); - Py_NewInterpreter := getProcAddr(lib, 'Py_NewInterpreter'); - Py_EndInterpreter := getProcAddr(lib, 'Py_EndInterpreter'); - PyEval_AcquireLock := getProcAddr(lib, 'PyEval_AcquireLock'); - PyEval_ReleaseLock := getProcAddr(lib, 'PyEval_ReleaseLock'); - PyEval_AcquireThread := getProcAddr(lib, 'PyEval_AcquireThread'); - PyEval_ReleaseThread := getProcAddr(lib, 'PyEval_ReleaseThread'); - PyInterpreterState_New := getProcAddr(lib, 'PyInterpreterState_New'); - PyInterpreterState_Clear := getProcAddr(lib, 'PyInterpreterState_Clear'); - PyInterpreterState_Delete:= getProcAddr(lib, 'PyInterpreterState_Delete'); - PyThreadState_New := getProcAddr(lib, 'PyThreadState_New'); - PyThreadState_Clear := getProcAddr(lib, 'PyThreadState_Clear'); - PyThreadState_Delete := getProcAddr(lib, 'PyThreadState_Delete'); - PyThreadState_Get := getProcAddr(lib, 'PyThreadState_Get'); - PyThreadState_Swap := getProcAddr(lib, 'PyThreadState_Swap'); -end; - -var - lib: TLibHandle; -initialization - lib := loadLibrary(dllName); - if lib <> NilLibHandle then init(lib); -end. diff --git a/lib/base/gtk/atk.nim b/lib/base/gtk/atk.nim index 84017bf03..8004eccfc 100644 --- a/lib/base/gtk/atk.nim +++ b/lib/base/gtk/atk.nim @@ -55,7 +55,7 @@ type ATK_LAYER_INVALID, ATK_LAYER_BACKGROUND, ATK_LAYER_CANVAS, ATK_LAYER_WIDGET, ATK_LAYER_MDI, ATK_LAYER_POPUP, ATK_LAYER_OVERLAY PAtkPropertyValues* = ptr TAtkPropertyValues - TAtkPropertyValues* {.final.} = object + TAtkPropertyValues* {.final, pure.} = object property_name*: cstring old_value*: TGValue new_value*: TGValue @@ -378,7 +378,7 @@ type TAtkAttributeSet* = TGSList PAtkAttribute* = ptr TAtkAttribute - TAtkAttribute* {.final.} = object + TAtkAttribute* {.final, pure.} = object name*: cstring value*: cstring @@ -452,7 +452,7 @@ type TAtkEventListenerInitProc* = proc () TAtkEventListenerInit* = proc (para1: TAtkEventListenerInitProc){.cdecl.} PAtkKeyEventStruct* = ptr TAtkKeyEventStruct - TAtkKeyEventStruct* {.final.} = object + TAtkKeyEventStruct* {.final, pure.} = object `type`*: gint state*: guint keyval*: guint diff --git a/lib/base/gtk/gdk2.nim b/lib/base/gtk/gdk2.nim index 497f5619f..66838ab99 100644 --- a/lib/base/gtk/gdk2.nim +++ b/lib/base/gtk/gdk2.nim @@ -31,7 +31,7 @@ type TGdkVisualClass* = object of TGObjectClass PGdkColor* = ptr TGdkColor - TGdkColor* {.final.} = object + TGdkColor* {.final, pure.} = object pixel*: guint32 red*: guint16 green*: guint16 @@ -51,7 +51,7 @@ type TGdkFontType* = enum GDK_FONT_FONT, GDK_FONT_FONTSET PGdkFont* = ptr TGdkFont - TGdkFont* {.final.} = object + TGdkFont* {.final, pure.} = object `type`*: TGdkFontType ascent*: gint descent*: gint @@ -78,7 +78,7 @@ type PGdkGCValuesMask* = ptr TGdkGCValuesMask TGdkGCValuesMask* = int32 PGdkGCValues* = ptr TGdkGCValues - TGdkGCValues* {.final.} = object + TGdkGCValues* {.final, pure.} = object foreground*: TGdkColor background*: TGdkColor font*: PGdkFont @@ -124,7 +124,7 @@ type TGdkInputCondition* = int32 PGdkStatus* = ptr TGdkStatus TGdkStatus* = int32 - TGdkPoint* {.final.} = object + TGdkPoint* {.final, pure.} = object x*: gint y*: gint @@ -134,14 +134,14 @@ type PGdkWChar* = ptr TGdkWChar TGdkWChar* = guint32 PGdkSegment* = ptr TGdkSegment - TGdkSegment* {.final.} = object + TGdkSegment* {.final, pure.} = object x1*: gint y1*: gint x2*: gint y2*: gint PGdkRectangle* = ptr TGdkRectangle - TGdkRectangle* {.final.} = object + TGdkRectangle* {.final, pure.} = object x*: gint y*: gint width*: gint @@ -189,7 +189,7 @@ type PGdkCursorType* = ptr TGdkCursorType TGdkCursorType* = gint PGdkCursor* = ptr TGdkCursor - TGdkCursor* {.final.} = object + TGdkCursor* {.final, pure.} = object `type`*: TGdkCursorType ref_count*: guint @@ -219,14 +219,14 @@ type PGdkRegionBox* = ptr TGdkRegionBox TGdkRegionBox* = TGdkSegment PGdkRegion* = ptr TGdkRegion - TGdkRegion* {.final.} = object + TGdkRegion* {.final, pure.} = object size*: int32 numRects*: int32 rects*: PGdkRegionBox extents*: TGdkRegionBox PPOINTBLOCK* = ptr TPOINTBLOCK - TPOINTBLOCK* {.final.} = object + TPOINTBLOCK* {.final, pure.} = object pts*: array[0..(NUMPTSTOBUFFER) - 1, TGdkPoint] next*: PPOINTBLOCK @@ -335,13 +335,13 @@ type GDK_SETTING_ACTION_NEW, GDK_SETTING_ACTION_CHANGED, GDK_SETTING_ACTION_DELETED PGdkEventAny* = ptr TGdkEventAny - TGdkEventAny* {.final.} = object + TGdkEventAny* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 PGdkEventExpose* = ptr TGdkEventExpose - TGdkEventExpose* {.final.} = object + TGdkEventExpose* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -350,20 +350,20 @@ type count*: gint PGdkEventNoExpose* = ptr TGdkEventNoExpose - TGdkEventNoExpose* {.final.} = object + TGdkEventNoExpose* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 PGdkEventVisibility* = ptr TGdkEventVisibility - TGdkEventVisibility* {.final.} = object + TGdkEventVisibility* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 state*: TGdkVisibilityState PGdkEventMotion* = ptr TGdkEventMotion - TGdkEventMotion* {.final.} = object + TGdkEventMotion* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -378,7 +378,7 @@ type y_root*: gdouble PGdkEventButton* = ptr TGdkEventButton - TGdkEventButton* {.final.} = object + TGdkEventButton* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -393,7 +393,7 @@ type y_root*: gdouble PGdkEventScroll* = ptr TGdkEventScroll - TGdkEventScroll* {.final.} = object + TGdkEventScroll* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -407,7 +407,7 @@ type y_root*: gdouble PGdkEventKey* = ptr TGdkEventKey - TGdkEventKey* {.final.} = object + TGdkEventKey* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -420,7 +420,7 @@ type group*: guint8 PGdkEventCrossing* = ptr TGdkEventCrossing - TGdkEventCrossing* {.final.} = object + TGdkEventCrossing* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -436,14 +436,14 @@ type state*: guint PGdkEventFocus* = ptr TGdkEventFocus - TGdkEventFocus* {.final.} = object + TGdkEventFocus* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 `in`*: gint16 PGdkEventConfigure* = ptr TGdkEventConfigure - TGdkEventConfigure* {.final.} = object + TGdkEventConfigure* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -453,7 +453,7 @@ type height*: gint PGdkEventProperty* = ptr TGdkEventProperty - TGdkEventProperty* {.final.} = object + TGdkEventProperty* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -463,7 +463,7 @@ type TGdkNativeWindow* = pointer PGdkEventSelection* = ptr TGdkEventSelection - TGdkEventSelection* {.final.} = object + TGdkEventSelection* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -474,7 +474,7 @@ type requestor*: TGdkNativeWindow PGdkEventProximity* = ptr TGdkEventProximity - TGdkEventProximity* {.final.} = object + TGdkEventProximity* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -482,11 +482,11 @@ type device*: PGdkDevice PmatDUMMY* = ptr TmatDUMMY - TmatDUMMY* {.final.} = object + TmatDUMMY* {.final, pure.} = object b*: array[0..19, char] PGdkEventClient* = ptr TGdkEventClient - TGdkEventClient* {.final.} = object + TGdkEventClient* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -495,7 +495,7 @@ type b*: array[0..19, char] PGdkEventSetting* = ptr TGdkEventSetting - TGdkEventSetting* {.final.} = object + TGdkEventSetting* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -503,7 +503,7 @@ type name*: cstring PGdkEventWindowState* = ptr TGdkEventWindowState - TGdkEventWindowState* {.final.} = object + TGdkEventWindowState* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -511,7 +511,7 @@ type new_window_state*: TGdkWindowState PGdkEventDND* = ptr TGdkEventDND - TGdkEventDND* {.final.} = object + TGdkEventDND* {.final, pure.} = object `type`*: TGdkEventType window*: PGdkWindow send_event*: gint8 @@ -520,7 +520,7 @@ type x_root*: gshort y_root*: gshort - TGdkEvent* {.final.} = object + TGdkEvent* {.final, pure.} = object data*: array[0..255, char] # union of # `type`: TGdkEventType # any: TGdkEventAny @@ -584,12 +584,12 @@ type PGdkAxisUse* = ptr TGdkAxisUse TGdkAxisUse* = int32 PGdkDeviceKey* = ptr TGdkDeviceKey - TGdkDeviceKey* {.final.} = object + TGdkDeviceKey* {.final, pure.} = object keyval*: guint modifiers*: TGdkModifierType PGdkDeviceAxis* = ptr TGdkDeviceAxis - TGdkDeviceAxis* {.final.} = object + TGdkDeviceAxis* {.final, pure.} = object use*: TGdkAxisUse min*: gdouble max*: gdouble @@ -604,12 +604,12 @@ type num_keys*: gint keys*: PGdkDeviceKey - TGdkTimeCoord* {.final.} = object + TGdkTimeCoord* {.final, pure.} = object time*: guint32 axes*: array[0..(GDK_MAX_TIMECOORD_AXES) - 1, gdouble] PGdkKeymapKey* = ptr TGdkKeymapKey - TGdkKeymapKey* {.final.} = object + TGdkKeymapKey* {.final, pure.} = object keycode*: guint group*: gint level*: gint @@ -623,12 +623,12 @@ type direction_changed*: proc (keymap: PGdkKeymap){.cdecl.} PGdkPangoAttrStipple* = ptr TGdkPangoAttrStipple - TGdkPangoAttrStipple* {.final.} = object + TGdkPangoAttrStipple* {.final, pure.} = object attr*: TPangoAttribute stipple*: PGdkBitmap PGdkPangoAttrEmbossed* = ptr TGdkPangoAttrEmbossed - TGdkPangoAttrEmbossed* {.final.} = object + TGdkPangoAttrEmbossed* {.final, pure.} = object attr*: TPangoAttribute embossed*: gboolean @@ -652,7 +652,7 @@ type GDK_OVERLAP_RECTANGLE_PART TGdkSpanFunc* = proc (span: PGdkSpan, data: gpointer){.cdecl.} PGdkRgbCmap* = ptr TGdkRgbCmap - TGdkRgbCmap* {.final.} = object + TGdkRgbCmap* {.final, pure.} = object colors*: array[0..255, guint32] n_colors*: gint info_list*: PGSList @@ -697,7 +697,7 @@ type TGdkInputFunction* = proc (data: gpointer, source: gint, condition: TGdkInputCondition){.cdecl.} TGdkDestroyNotify* = proc (data: gpointer){.cdecl.} - TGdkSpan* {.final.} = object + TGdkSpan* {.final, pure.} = object x*: gint y*: gint width*: gint @@ -730,7 +730,7 @@ type GDK_WINDOW_EDGE_SOUTH_WEST, GDK_WINDOW_EDGE_SOUTH, GDK_WINDOW_EDGE_SOUTH_EAST PGdkWindowAttr* = ptr TGdkWindowAttr - TGdkWindowAttr* {.final.} = object + TGdkWindowAttr* {.final, pure.} = object title*: cstring event_mask*: gint x*: gint @@ -747,7 +747,7 @@ type override_redirect*: gboolean PGdkGeometry* = ptr TGdkGeometry - TGdkGeometry* {.final.} = object + TGdkGeometry* {.final, pure.} = object min_width*: gint min_height*: gint max_width*: gint @@ -761,7 +761,7 @@ type win_gravity*: TGdkGravity PGdkPointerHooks* = ptr TGdkPointerHooks - TGdkPointerHooks* {.final.} = object + TGdkPointerHooks* {.final, pure.} = object get_pointer*: proc (window: PGdkWindow, x: Pgint, y: Pgint, mask: PGdkModifierType): PGdkWindow{.cdecl.} window_at_pointer*: proc (screen: PGdkScreen, win_x: Pgint, win_y: Pgint): PGdkWindow{. diff --git a/lib/base/gtk/gdk2pixbuf.nim b/lib/base/gtk/gdk2pixbuf.nim index bcf9690e8..8ef3ac0f9 100644 --- a/lib/base/gtk/gdk2pixbuf.nim +++ b/lib/base/gtk/gdk2pixbuf.nim @@ -187,12 +187,12 @@ proc gdk_pixbuf_get_option*(pixbuf: PGdkPixbuf, key: cstring): cstring{.cdecl, dynlib: gdkpixbuflib, importc: "gdk_pixbuf_get_option".} type PGdkPixbufLoader* = ptr TGdkPixbufLoader - TGdkPixbufLoader* {.final.} = object + TGdkPixbufLoader* {.final, pure.} = object parent_instance*: TGObject priv*: gpointer PGdkPixbufLoaderClass* = ptr TGdkPixbufLoaderClass - TGdkPixbufLoaderClass* {.final.} = object + TGdkPixbufLoaderClass* {.final, pure.} = object parent_class*: TGObjectClass area_prepared*: proc (loader: PGdkPixbufLoader){.cdecl.} area_updated*: proc (loader: PGdkPixbufLoader, x: int32, y: int32, diff --git a/lib/base/gtk/gtk2.nim b/lib/base/gtk/gtk2.nim index 81e09f85d..22bbd3c6c 100644 --- a/lib/base/gtk/gtk2.nim +++ b/lib/base/gtk/gtk2.nim @@ -155,17 +155,17 @@ type TGtkSignalFunc* = proc (para1: TGtkSignalFuncProc){.cdecl.} PGtkSignalMarshaller* = ptr TGtkSignalMarshaller TGtkSignalMarshaller* = TGSignalCMarshaller - TGtkArgSignalData* {.final.} = object + TGtkArgSignalData* {.final, pure.} = object f*: TGtkSignalFunc d*: gpointer - TGtkArg* {.final.} = object + TGtkArg* {.final, pure.} = object `type`*: TGtkType name*: cstring d*: gdouble # was a union type PGtkTypeInfo* = ptr TGtkTypeInfo - TGtkTypeInfo* {.final.} = object + TGtkTypeInfo* {.final, pure.} = object type_name*: cstring object_size*: guint class_size*: guint @@ -188,7 +188,7 @@ type TGtkAllocation* = TGdkRectangle TGtkCallback* = proc (widget: PGtkWidget, data: gpointer){.cdecl.} PGtkRequisition* = ptr TGtkRequisition - TGtkRequisition* {.final.} = object + TGtkRequisition* {.final, pure.} = object width*: gint height*: gint @@ -323,7 +323,7 @@ type gtk_reserved8*: proc (){.cdecl.} PGtkWidgetAuxInfo* = ptr TGtkWidgetAuxInfo - TGtkWidgetAuxInfo* {.final.} = object + TGtkWidgetAuxInfo* {.final, pure.} = object x*: gint y*: gint width*: gint @@ -331,7 +331,7 @@ type flag0*: guint16 PGtkWidgetShapeInfo* = ptr TGtkWidgetShapeInfo - TGtkWidgetShapeInfo* {.final.} = object + TGtkWidgetShapeInfo* {.final, pure.} = object offset_x*: gint16 offset_y*: gint16 shape_mask*: PGdkBitmap @@ -370,12 +370,12 @@ type gtk_reserved4: proc (){.cdecl.} PGtkAccelKey* = ptr TGtkAccelKey - TGtkAccelKey* {.final.} = object + TGtkAccelKey* {.final, pure.} = object accel_key*: guint accel_mods*: TGdkModifierType flag0*: guint16 - TGtkAccelGroupEntry* {.final.} = object + TGtkAccelGroupEntry* {.final, pure.} = object key*: TGtkAccelKey closure*: PGClosure accel_path_quark*: TGQuark @@ -595,7 +595,7 @@ type PGtkBindingSignal* = ptr TGtkBindingSignal PGtkBindingArg* = ptr TGtkBindingArg PGtkBindingSet* = ptr TGtkBindingSet - TGtkBindingSet* {.final.} = object + TGtkBindingSet* {.final, pure.} = object set_name*: cstring priority*: gint widget_path_pspecs*: PGSList @@ -605,7 +605,7 @@ type current*: PGtkBindingEntry flag0*: guint16 - TGtkBindingEntry* {.final.} = object + TGtkBindingEntry* {.final, pure.} = object keyval*: guint modifiers*: TGdkModifierType binding_set*: PGtkBindingSet @@ -614,13 +614,13 @@ type hash_next*: PGtkBindingEntry signals*: PGtkBindingSignal - TGtkBindingSignal* {.final.} = object + TGtkBindingSignal* {.final, pure.} = object next*: PGtkBindingSignal signal_name*: cstring n_args*: guint args*: PGtkBindingArg - TGtkBindingArg* {.final.} = object + TGtkBindingArg* {.final, pure.} = object arg_type*: TGtkType d*: gdouble @@ -634,7 +634,7 @@ type TGtkBoxClass* = object of TGtkContainerClass PGtkBoxChild* = ptr TGtkBoxChild - TGtkBoxChild* {.final.} = object + TGtkBoxChild* {.final, pure.} = object widget*: PGtkWidget padding*: guint16 flag0*: guint16 @@ -906,12 +906,12 @@ type TGtkCListCompareFunc* = proc (clist: PGtkCList, ptr1: gconstpointer, ptr2: gconstpointer): gint{.cdecl.} PGtkCListCellInfo* = ptr TGtkCListCellInfo - TGtkCListCellInfo* {.final.} = object + TGtkCListCellInfo* {.final, pure.} = object row*: gint column*: gint PGtkCListDestInfo* = ptr TGtkCListDestInfo - TGtkCListDestInfo* {.final.} = object + TGtkCListDestInfo* {.final, pure.} = object cell*: TGtkCListCellInfo insert_pos*: TGtkCListDragPos @@ -1014,7 +1014,7 @@ type PGPtrArray = pointer PGArray = pointer - TGtkCListColumn* {.final.} = object + TGtkCListColumn* {.final, pure.} = object title*: cstring area*: TGdkRectangle button*: PGtkWidget @@ -1025,7 +1025,7 @@ type justification*: TGtkJustification flag0*: guint16 - TGtkCListRow* {.final.} = object + TGtkCListRow* {.final, pure.} = object cell*: PGtkCell state*: TGtkStateType foreground*: TGdkColor @@ -1036,7 +1036,7 @@ type flag0*: guint16 PGtkCellText* = ptr TGtkCellText - TGtkCellText* {.final.} = object + TGtkCellText* {.final, pure.} = object `type`*: TGtkCellType vertical*: gint16 horizontal*: gint16 @@ -1044,7 +1044,7 @@ type text*: cstring PGtkCellPixmap* = ptr TGtkCellPixmap - TGtkCellPixmap* {.final.} = object + TGtkCellPixmap* {.final, pure.} = object `type`*: TGtkCellType vertical*: gint16 horizontal*: gint16 @@ -1053,7 +1053,7 @@ type mask*: PGdkBitmap PGtkCellPixText* = ptr TGtkCellPixText - TGtkCellPixText* {.final.} = object + TGtkCellPixText* {.final, pure.} = object `type`*: TGtkCellType vertical*: gint16 horizontal*: gint16 @@ -1064,14 +1064,14 @@ type mask*: PGdkBitmap PGtkCellWidget* = ptr TGtkCellWidget - TGtkCellWidget* {.final.} = object + TGtkCellWidget* {.final, pure.} = object `type`*: TGtkCellType vertical*: gint16 horizontal*: gint16 style*: PGtkStyle widget*: PGtkWidget - TGtkCell* {.final.} = object + TGtkCell* {.final, pure.} = object `type`*: TGtkCellType vertical*: gint16 horizontal*: gint16 @@ -1212,7 +1212,7 @@ type action: TGtkCTreeExpansionType){.cdecl.} PGtkCTreeRow* = ptr TGtkCTreeRow - TGtkCTreeRow* {.final.} = object + TGtkCTreeRow* {.final, pure.} = object row*: TGtkCListRow parent*: PGtkCTreeNode sibling*: PGtkCTreeNode @@ -1224,7 +1224,7 @@ type level*: guint16 GtkCTreeRow_flag0*: guint16 - TGtkCTreeNode* {.final.} = object + TGtkCTreeNode* {.final, pure.} = object list*: TGList PGtkDrawingArea* = ptr TGtkDrawingArea @@ -1479,7 +1479,7 @@ type TGtkFixedClass* = object of TGtkContainerClass PGtkFixedChild* = ptr TGtkFixedChild - TGtkFixedChild* {.final.} = object + TGtkFixedChild* {.final, pure.} = object widget*: PGtkWidget x*: gint y*: gint @@ -1632,7 +1632,7 @@ type gtk_reserved363: proc (){.cdecl.} gtk_reserved364: proc (){.cdecl.} - TGtkRulerMetric* {.final.} = object + TGtkRulerMetric* {.final, pure.} = object metric_name*: cstring abbrev*: cstring pixels_per_unit*: gdouble @@ -1657,7 +1657,7 @@ type TGtkSettingsClass* = object of TGObjectClass PGtkSettingsValue* = ptr TGtkSettingsValue - TGtkSettingsValue* {.final.} = object + TGtkSettingsValue* {.final, pure.} = object origin*: cstring value*: TGValue @@ -1708,7 +1708,7 @@ type GTK_RC_TOKEN_IM_MODULE_FILE, GTK_RC_TOKEN_STOCK, GTK_RC_TOKEN_LTR, GTK_RC_TOKEN_RTL, GTK_RC_TOKEN_LAST PGtkRcProperty* = ptr TGtkRcProperty - TGtkRcProperty* {.final.} = object + TGtkRcProperty* {.final, pure.} = object type_name*: TGQuark property_name*: TGQuark origin*: cstring @@ -1877,7 +1877,7 @@ type gtk_reserved3812: proc (){.cdecl.} PGtkBorder* = ptr TGtkBorder - TGtkBorder* {.final.} = object + TGtkBorder* {.final, pure.} = object left*: gint right*: gint top*: gint @@ -1978,27 +1978,27 @@ type PGtkIconSet* = pointer PGtkImagePixmapData* = ptr TGtkImagePixmapData - TGtkImagePixmapData* {.final.} = object + TGtkImagePixmapData* {.final, pure.} = object pixmap*: PGdkPixmap PGtkImageImageData* = ptr TGtkImageImageData - TGtkImageImageData* {.final.} = object + TGtkImageImageData* {.final, pure.} = object image*: PGdkImage PGtkImagePixbufData* = ptr TGtkImagePixbufData - TGtkImagePixbufData* {.final.} = object + TGtkImagePixbufData* {.final, pure.} = object pixbuf*: PGdkPixbuf PGtkImageStockData* = ptr TGtkImageStockData - TGtkImageStockData* {.final.} = object + TGtkImageStockData* {.final, pure.} = object stock_id*: cstring PGtkImageIconSetData* = ptr TGtkImageIconSetData - TGtkImageIconSetData* {.final.} = object + TGtkImageIconSetData* {.final, pure.} = object icon_set*: PGtkIconSet PGtkImageAnimationData* = ptr TGtkImageAnimationData - TGtkImageAnimationData* {.final.} = object + TGtkImageAnimationData* {.final, pure.} = object anim*: PGdkPixbufAnimation iter*: PGdkPixbufAnimationIter frame_timeout*: guint @@ -2111,7 +2111,7 @@ type gtk_reserved474: proc (){.cdecl.} PGtkItemFactoryEntry* = ptr TGtkItemFactoryEntry - TGtkItemFactoryEntry* {.final.} = object + TGtkItemFactoryEntry* {.final, pure.} = object path*: cstring accelerator*: cstring callback*: TGtkItemFactoryCallback @@ -2120,7 +2120,7 @@ type extra_data*: gconstpointer PGtkItemFactoryItem* = ptr TGtkItemFactoryItem - TGtkItemFactoryItem* {.final.} = object + TGtkItemFactoryItem* {.final, pure.} = object path*: cstring widgets*: PGSList @@ -2173,7 +2173,7 @@ type cdecl.} PGtkTreeModelFlags* = ptr TGtkTreeModelFlags TGtkTreeModelFlags* = int32 - TGtkTreeIter* {.final.} = object + TGtkTreeIter* {.final, pure.} = object stamp*: gint user_data*: gpointer user_data2*: gpointer @@ -2435,12 +2435,12 @@ type GtkPreview_flag0*: guint16 PGtkPreviewInfo* = ptr TGtkPreviewInfo - TGtkPreviewInfo* {.final.} = object + TGtkPreviewInfo* {.final, pure.} = object lookup*: Pguchar gamma*: gdouble PGtkDitherInfo* = ptr TGtkDitherInfo - TGtkDitherInfo* {.final.} = object + TGtkDitherInfo* {.final, pure.} = object c*: array[0..3, guchar] PGtkPreviewClass* = ptr TGtkPreviewClass @@ -2533,7 +2533,7 @@ type gtk_reserved603: proc (){.cdecl.} gtk_reserved604: proc (){.cdecl.} - TGtkSelectionData* {.final.} = object + TGtkSelectionData* {.final, pure.} = object selection*: TGdkAtom target*: TGdkAtom thetype*: TGdkAtom @@ -2543,18 +2543,18 @@ type display*: PGdkDisplay PGtkTargetEntry* = ptr TGtkTargetEntry - TGtkTargetEntry* {.final.} = object + TGtkTargetEntry* {.final, pure.} = object target*: cstring flags*: guint info*: guint PGtkTargetList* = ptr TGtkTargetList - TGtkTargetList* {.final.} = object + TGtkTargetList* {.final, pure.} = object list*: PGList ref_count*: guint PGtkTargetPair* = ptr TGtkTargetPair - TGtkTargetPair* {.final.} = object + TGtkTargetPair* {.final, pure.} = object target*: TGdkAtom flags*: guint info*: guint @@ -2635,7 +2635,7 @@ type gtk_reserved634: proc (){.cdecl.} PGtkStockItem* = ptr TGtkStockItem - TGtkStockItem* {.final.} = object + TGtkStockItem* {.final, pure.} = object stock_id*: cstring label*: cstring modifier*: TGdkModifierType @@ -2681,7 +2681,7 @@ type TGtkTableClass* = object of TGtkContainerClass PGtkTableChild* = ptr TGtkTableChild - TGtkTableChild* {.final.} = object + TGtkTableChild* {.final, pure.} = object widget*: PGtkWidget left_attach*: guint16 right_attach*: guint16 @@ -2691,7 +2691,7 @@ type ypadding*: guint16 GtkTableChild_flag0*: guint16 - TGtkTableRowCol* {.final.} = object + TGtkTableRowCol* {.final, pure.} = object requisition*: guint16 allocation*: guint16 spacing*: guint16 @@ -2710,7 +2710,7 @@ type PGtkTextFont* = pointer PGtkPropertyMark* = ptr TGtkPropertyMark - TGtkPropertyMark* {.final.} = object + TGtkPropertyMark* {.final, pure.} = object `property`*: PGList offset*: guint index*: guint @@ -2764,7 +2764,7 @@ type PGtkTextSearchFlags* = ptr TGtkTextSearchFlags TGtkTextSearchFlags* = int32 PGtkTextIter* = ptr TGtkTextIter - TGtkTextIter* {.final.} = object + TGtkTextIter* {.final, pure.} = object dummy1*: gpointer dummy2*: gpointer dummy3*: gint @@ -2802,7 +2802,7 @@ type gtk_reserved664: proc (){.cdecl.} PGtkTextAppearance* = ptr TGtkTextAppearance - TGtkTextAppearance* {.final.} = object + TGtkTextAppearance* {.final, pure.} = object bg_color*: TGdkColor fg_color*: TGdkColor bg_stipple*: PGdkBitmap @@ -2811,7 +2811,7 @@ type padding1*: gpointer flag0*: guint16 - TGtkTextAttributes* {.final.} = object + TGtkTextAttributes* {.final, pure.} = object refcount*: guint appearance*: TGtkTextAppearance justification*: TGtkJustification @@ -2860,7 +2860,7 @@ type gtk_reserved4: proc (){.cdecl.} PGtkTextMarkBody* = ptr TGtkTextMarkBody - TGtkTextMarkBody* {.final.} = object + TGtkTextMarkBody* {.final, pure.} = object obj*: PGtkTextMark name*: cstring tree*: PGtkTextBTree @@ -2879,11 +2879,11 @@ type gtk_reserved4: proc (){.cdecl.} PGtkTextPixbuf* = ptr TGtkTextPixbuf - TGtkTextPixbuf* {.final.} = object + TGtkTextPixbuf* {.final, pure.} = object pixbuf*: PGdkPixbuf PGtkTextChildBody* = ptr TGtkTextChildBody - TGtkTextChildBody* {.final.} = object + TGtkTextChildBody* {.final, pure.} = object obj*: PGtkTextChildAnchor widgets*: PGSList tree*: PGtkTextBTree @@ -2892,17 +2892,17 @@ type PGtkTextLineSegment* = ptr TGtkTextLineSegment PGtkTextLineSegmentClass* = ptr TGtkTextLineSegmentClass PGtkTextTagInfo* = ptr TGtkTextTagInfo - TGtkTextTagInfo* {.final.} = object + TGtkTextTagInfo* {.final, pure.} = object tag*: PGtkTextTag tag_root*: PGtkTextBTreeNode toggle_count*: gint PGtkTextToggleBody* = ptr TGtkTextToggleBody - TGtkTextToggleBody* {.final.} = object + TGtkTextToggleBody* {.final, pure.} = object info*: PGtkTextTagInfo inNodeCounts*: gboolean - TGtkTextLineSegment* {.final.} = object + TGtkTextLineSegment* {.final, pure.} = object `type`*: PGtkTextLineSegmentClass next*: PGtkTextLineSegment char_count*: int32 @@ -2919,7 +2919,7 @@ type line: PGtkTextLine){.cdecl.} TGtkTextSegCheckFunc* = proc (seg: PGtkTextLineSegment, line: PGtkTextLine){. cdecl.} - TGtkTextLineSegmentClass* {.final.} = object + TGtkTextLineSegmentClass* {.final, pure.} = object name*: cstring leftGravity*: gboolean splitFunc*: TGtkTextSegSplitFunc @@ -2929,13 +2929,13 @@ type checkFunc*: TGtkTextSegCheckFunc PGtkTextLineData* = ptr TGtkTextLineData - TGtkTextLineData* {.final.} = object + TGtkTextLineData* {.final, pure.} = object view_id*: gpointer next*: PGtkTextLineData height*: gint flag0*: int32 - TGtkTextLine* {.final.} = object + TGtkTextLine* {.final, pure.} = object parent*: PGtkTextBTreeNode next*: PGtkTextLine segments*: PGtkTextLineSegment @@ -3020,18 +3020,18 @@ type gtk_reserved4: proc (){.cdecl.} PGtkTextAttrAppearance* = ptr TGtkTextAttrAppearance - TGtkTextAttrAppearance* {.final.} = object + TGtkTextAttrAppearance* {.final, pure.} = object attr*: TPangoAttribute appearance*: TGtkTextAppearance PGtkTextCursorDisplay* = ptr TGtkTextCursorDisplay - TGtkTextCursorDisplay* {.final.} = object + TGtkTextCursorDisplay* {.final, pure.} = object x*: gint y*: gint height*: gint flag0*: guint16 - TGtkTextLineDisplay* {.final.} = object + TGtkTextLineDisplay* {.final, pure.} = object layout*: PPangoLayout cursors*: PGSList shaped_objects*: PGSList @@ -3152,7 +3152,7 @@ type PGtkTooltips* = ptr TGtkTooltips PGtkTooltipsData* = ptr TGtkTooltipsData - TGtkTooltipsData* {.final.} = object + TGtkTooltipsData* {.final, pure.} = object tooltips*: PGtkTooltips widget*: PGtkWidget tip_text*: cstring @@ -3184,7 +3184,7 @@ type TGtkToolbarSpaceStyle* = enum GTK_TOOLBAR_SPACE_EMPTY, GTK_TOOLBAR_SPACE_LINE PGtkToolbarChild* = ptr TGtkToolbarChild - TGtkToolbarChild* {.final.} = object + TGtkToolbarChild* {.final, pure.} = object `type`*: TGtkToolbarChildType widget*: PGtkWidget icon*: PGtkWidget @@ -3365,13 +3365,13 @@ type PGtkRBNode* = ptr TGtkRBNode TGtkRBTreeTraverseFunc* = proc (tree: PGtkRBTree, node: PGtkRBNode, data: gpointer){.cdecl.} - TGtkRBTree* {.final.} = object + TGtkRBTree* {.final, pure.} = object root*: PGtkRBNode `nil`*: PGtkRBNode parent_tree*: PGtkRBTree parent_node*: PGtkRBNode - TGtkRBNode* {.final.} = object + TGtkRBNode* {.final, pure.} = object flag0*: guint16 left*: PGtkRBNode right*: PGtkRBNode @@ -3386,14 +3386,14 @@ type TGtkTreeViewSearchDialogPositionFunc* = proc (tree_view: PGtkTreeView, search_dialog: PGtkWidget){.cdecl.} PGtkTreeViewColumnReorder* = ptr TGtkTreeViewColumnReorder - TGtkTreeViewColumnReorder* {.final.} = object + TGtkTreeViewColumnReorder* {.final, pure.} = object left_align*: gint right_align*: gint left_column*: PGtkTreeViewColumn right_column*: PGtkTreeViewColumn PGtkTreeViewPrivate* = ptr TGtkTreeViewPrivate - TGtkTreeViewPrivate* {.final.} = object + TGtkTreeViewPrivate* {.final, pure.} = object model*: PGtkTreeModel flags*: guint tree*: PGtkRBTree @@ -4236,7 +4236,7 @@ proc GTK_IS_WINDOW_GROUP_CLASS*(klass: pointer): bool proc GTK_WINDOW_GROUP_GET_CLASS*(obj: pointer): PGtkWindowGroupClass proc gtk_window_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_window_get_type".} -proc gtk_window_new*(thetype: TGtkWindowType): PGtkWidget{.cdecl, +proc gtk_window_new*(thetype: TGtkWindowType): PGtkWindow {.cdecl, dynlib: gtklib, importc: "gtk_window_new".} proc gtk_window_set_title*(window: PGtkWindow, title: cstring){.cdecl, dynlib: gtklib, importc: "gtk_window_set_title".} @@ -4389,6 +4389,8 @@ proc gtk_window_group_add_window*(window_group: PGtkWindowGroup, proc gtk_window_group_remove_window*(window_group: PGtkWindowGroup, window: PGtkWindow){.cdecl, dynlib: gtklib, importc: "gtk_window_group_remove_window".} +proc gtk_window_set_default_icon_name*(name: cstring) {. + cdecl, dynlib: gtklib, importc.} proc gtk_window_internal_set_focus*(window: PGtkWindow, focus: PGtkWidget){. cdecl, dynlib: gtklib, importc: "_gtk_window_internal_set_focus".} proc gtk_window_remove_embedded_xid*(window: PGtkWindow, xid: guint){.cdecl, @@ -4437,9 +4439,9 @@ proc use_markup*(a: var TGtkLabel): guint proc set_use_markup*(a: var TGtkLabel, `use_markup`: guint) proc gtk_label_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_label_get_type".} -proc gtk_label_new*(str: cstring): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_label_new*(str: cstring): PGtkLabel {.cdecl, dynlib: gtklib, importc: "gtk_label_new".} -proc gtk_label_new_with_mnemonic*(str: cstring): PGtkWidget{.cdecl, +proc gtk_label_new_with_mnemonic*(str: cstring): PGtkLabel {.cdecl, dynlib: gtklib, importc: "gtk_label_new_with_mnemonic".} proc gtk_label_set_text*(`label`: PGtkLabel, str: cstring){.cdecl, dynlib: gtklib, importc: "gtk_label_set_text".} @@ -4511,7 +4513,7 @@ proc latin1_to_char*(a: var TGtkAccelLabelClass): guint proc set_latin1_to_char*(a: var TGtkAccelLabelClass, `latin1_to_char`: guint) proc gtk_accel_label_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_accel_label_get_type".} -proc gtk_accel_label_new*(`string`: cstring): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_accel_label_new*(`string`: cstring): PGtkAccelLabel {.cdecl, dynlib: gtklib, importc: "gtk_accel_label_new".} proc gtk_accel_label_get_accel_widget*(accel_label: PGtkAccelLabel): PGtkWidget{. cdecl, dynlib: gtklib, importc: "gtk_accel_label_get_accel_widget".} @@ -4579,7 +4581,7 @@ proc gtk_adjustment_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_adjustment_get_type".} proc gtk_adjustment_new*(value: gdouble, lower: gdouble, upper: gdouble, step_increment: gdouble, page_increment: gdouble, - page_size: gdouble): PGtkObject{.cdecl, dynlib: gtklib, + page_size: gdouble): PGtkAdjustment {.cdecl, dynlib: gtklib, importc: "gtk_adjustment_new".} proc gtk_adjustment_changed*(adjustment: PGtkAdjustment){.cdecl, dynlib: gtklib, importc: "gtk_adjustment_changed".} @@ -4601,7 +4603,7 @@ proc GTK_ALIGNMENT_GET_CLASS*(obj: pointer): PGtkAlignmentClass proc gtk_alignment_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_alignment_get_type".} proc gtk_alignment_new*(xalign: gfloat, yalign: gfloat, xscale: gfloat, - yscale: gfloat): PGtkWidget{.cdecl, dynlib: gtklib, + yscale: gfloat): PGtkAlignment {.cdecl, dynlib: gtklib, importc: "gtk_alignment_new".} proc gtk_alignment_set*(alignment: PGtkAlignment, xalign: gfloat, yalign: gfloat, xscale: gfloat, yscale: gfloat){.cdecl, @@ -4614,7 +4616,7 @@ proc GTK_IS_FRAME_CLASS*(klass: pointer): bool proc GTK_FRAME_GET_CLASS*(obj: pointer): PGtkFrameClass proc gtk_frame_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_frame_get_type".} -proc gtk_frame_new*(`label`: cstring): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_frame_new*(`label`: cstring): PGtkFrame {.cdecl, dynlib: gtklib, importc: "gtk_frame_new".} proc gtk_frame_set_label*(frame: PGtkFrame, `label`: cstring){.cdecl, dynlib: gtklib, importc: "gtk_frame_set_label".} @@ -4642,7 +4644,7 @@ proc GTK_ASPECT_FRAME_GET_CLASS*(obj: pointer): PGtkAspectFrameClass proc gtk_aspect_frame_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_aspect_frame_get_type".} proc gtk_aspect_frame_new*(`label`: cstring, xalign: gfloat, yalign: gfloat, - ratio: gfloat, obey_child: gboolean): PGtkWidget{. + ratio: gfloat, obey_child: gboolean): PGtkAspectFrame {. cdecl, dynlib: gtklib, importc: "gtk_aspect_frame_new".} proc gtk_aspect_frame_set*(aspect_frame: PGtkAspectFrame, xalign: gfloat, yalign: gfloat, ratio: gfloat, obey_child: gboolean){. @@ -4655,7 +4657,7 @@ proc GTK_IS_ARROW_CLASS*(klass: pointer): bool proc GTK_ARROW_GET_CLASS*(obj: pointer): PGtkArrowClass proc gtk_arrow_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_arrow_get_type".} -proc gtk_arrow_new*(arrow_type: TGtkArrowType, shadow_type: TGtkShadowType): PGtkWidget{. +proc gtk_arrow_new*(arrow_type: TGtkArrowType, shadow_type: TGtkShadowType): PGtkArrow{. cdecl, dynlib: gtklib, importc: "gtk_arrow_new".} proc gtk_arrow_set*(arrow: PGtkArrow, arrow_type: TGtkArrowType, shadow_type: TGtkShadowType){.cdecl, dynlib: gtklib, @@ -4831,13 +4833,13 @@ proc depress_on_activate*(a: var TGtkButton): guint proc set_depress_on_activate*(a: var TGtkButton, `depress_on_activate`: guint) proc gtk_button_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_button_get_type".} -proc gtk_button_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_button_new*(): PGtkButton {.cdecl, dynlib: gtklib, importc: "gtk_button_new".} -proc gtk_button_new_with_label*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_button_new_with_label*(`label`: cstring): PGtkButton {.cdecl, dynlib: gtklib, importc: "gtk_button_new_with_label".} -proc gtk_button_new_from_stock*(stock_id: cstring): PGtkWidget{.cdecl, +proc gtk_button_new_from_stock*(stock_id: cstring): PGtkButton {.cdecl, dynlib: gtklib, importc: "gtk_button_new_from_stock".} -proc gtk_button_new_with_mnemonic*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_button_new_with_mnemonic*(`label`: cstring): PGtkButton {.cdecl, dynlib: gtklib, importc: "gtk_button_new_with_mnemonic".} proc gtk_button_pressed*(button: PGtkButton){.cdecl, dynlib: gtklib, importc: "gtk_button_pressed".} @@ -4871,6 +4873,11 @@ proc gtk_button_paint*(button: PGtkButton, area: PGdkRectangle, state_type: TGtkStateType, shadow_type: TGtkShadowType, main_detail: cstring, default_detail: cstring){.cdecl, dynlib: gtklib, importc: "_gtk_button_paint".} +proc gtk_button_set_image*(button: PGtkButton, image: PGtkWidget) {.cdecl, + dynlib: gtklib, importc.} +proc gtk_button_get_image*(button: PGtkButton): PGtkWidget {.cdecl, + dynlib: gtklib, importc.} + const GTK_CALENDAR_SHOW_HEADING* = 1 shl 0 GTK_CALENDAR_SHOW_DAY_NAMES* = 1 shl 1 @@ -4886,7 +4893,7 @@ proc GTK_IS_CALENDAR_CLASS*(klass: pointer): bool proc GTK_CALENDAR_GET_CLASS*(obj: pointer): PGtkCalendarClass proc gtk_calendar_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_calendar_get_type".} -proc gtk_calendar_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_calendar_new*(): PGtkCalendar {.cdecl, dynlib: gtklib, importc: "gtk_calendar_new".} proc gtk_calendar_select_month*(calendar: PGtkCalendar, month: guint, year: guint): gboolean{.cdecl, dynlib: gtklib, @@ -5139,11 +5146,11 @@ proc hide_on_activate*(a: var TGtkMenuItemClass): guint proc set_hide_on_activate*(a: var TGtkMenuItemClass, `hide_on_activate`: guint) proc gtk_menu_item_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_menu_item_get_type".} -proc gtk_menu_item_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_menu_item_new*(): PGtkMenuItem {.cdecl, dynlib: gtklib, importc: "gtk_menu_item_new".} -proc gtk_menu_item_new_with_label*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_menu_item_new_with_label*(`label`: cstring): PGtkMenuItem {.cdecl, dynlib: gtklib, importc: "gtk_menu_item_new_with_label".} -proc gtk_menu_item_new_with_mnemonic*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_menu_item_new_with_mnemonic*(`label`: cstring): PGtkMenuItem {.cdecl, dynlib: gtklib, importc: "gtk_menu_item_new_with_mnemonic".} proc gtk_menu_item_set_submenu*(menu_item: PGtkMenuItem, submenu: PGtkWidget){. cdecl, dynlib: gtklib, importc: "gtk_menu_item_set_submenu".} @@ -5197,11 +5204,11 @@ proc inconsistent*(a: var TGtkToggleButton): guint proc set_inconsistent*(a: var TGtkToggleButton, `inconsistent`: guint) proc gtk_toggle_button_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_toggle_button_get_type".} -proc gtk_toggle_button_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_toggle_button_new*(): PGtkToggleButton {.cdecl, dynlib: gtklib, importc: "gtk_toggle_button_new".} -proc gtk_toggle_button_new_with_label*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_toggle_button_new_with_label*(`label`: cstring): PGtkToggleButton {.cdecl, dynlib: gtklib, importc: "gtk_toggle_button_new_with_label".} -proc gtk_toggle_button_new_with_mnemonic*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_toggle_button_new_with_mnemonic*(`label`: cstring): PGtkToggleButton {.cdecl, dynlib: gtklib, importc: "gtk_toggle_button_new_with_mnemonic".} proc gtk_toggle_button_set_mode*(toggle_button: PGtkToggleButton, draw_indicator: gboolean){.cdecl, @@ -5228,11 +5235,11 @@ proc GTK_IS_CHECK_BUTTON_CLASS*(klass: pointer): bool proc GTK_CHECK_BUTTON_GET_CLASS*(obj: pointer): PGtkCheckButtonClass proc gtk_check_button_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_check_button_get_type".} -proc gtk_check_button_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_check_button_new*(): PGtkCheckButton{.cdecl, dynlib: gtklib, importc: "gtk_check_button_new".} -proc gtk_check_button_new_with_label*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_check_button_new_with_label*(`label`: cstring): PGtkCheckButton{.cdecl, dynlib: gtklib, importc: "gtk_check_button_new_with_label".} -proc gtk_check_button_new_with_mnemonic*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_check_button_new_with_mnemonic*(`label`: cstring): PGtkCheckButton {.cdecl, dynlib: gtklib, importc: "gtk_check_button_new_with_mnemonic".} proc gtk_check_button_get_props*(check_button: PGtkCheckButton, indicator_size: Pgint, @@ -5391,7 +5398,7 @@ proc selectable*(a: var TGtkCListRow): guint proc set_selectable*(a: var TGtkCListRow, `selectable`: guint) proc gtk_clist_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_clist_get_type".} -proc gtk_clist_new*(columns: gint): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_clist_new*(columns: gint): PGtkCList {.cdecl, dynlib: gtklib, importc: "gtk_clist_new".} proc gtk_clist_set_hadjustment*(clist: PGtkCList, adjustment: PGtkAdjustment){. cdecl, dynlib: gtklib, importc: "gtk_clist_set_hadjustment".} @@ -5572,7 +5579,7 @@ proc GTK_IS_DIALOG_CLASS*(klass: pointer): bool proc GTK_DIALOG_GET_CLASS*(obj: pointer): PGtkDialogClass proc gtk_dialog_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_dialog_get_type".} -proc gtk_dialog_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_dialog_new*(): PGtkDialog {.cdecl, dynlib: gtklib, importc: "gtk_dialog_new".} proc gtk_dialog_add_action_widget*(dialog: PGtkDialog, child: PGtkWidget, response_id: gint){.cdecl, dynlib: gtklib, @@ -5593,6 +5600,9 @@ proc gtk_dialog_response*(dialog: PGtkDialog, response_id: gint){.cdecl, dynlib: gtklib, importc: "gtk_dialog_response".} proc gtk_dialog_run*(dialog: PGtkDialog): gint{.cdecl, dynlib: gtklib, importc: "gtk_dialog_run".} +proc gtk_show_about_dialog*(parent: PGtkWindow, firstPropertyName: cstring) {. + cdecl, dynlib: gtklib, importc: "gtk_show_about_dialog", varargs.} + proc GTK_TYPE_VBOX*(): GType proc GTK_VBOX*(obj: pointer): PGtkVBox proc GTK_VBOX_CLASS*(klass: pointer): PGtkVBoxClass @@ -5601,7 +5611,7 @@ proc GTK_IS_VBOX_CLASS*(klass: pointer): bool proc GTK_VBOX_GET_CLASS*(obj: pointer): PGtkVBoxClass proc gtk_vbox_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_vbox_get_type".} -proc gtk_vbox_new*(homogeneous: gboolean, spacing: gint): PGtkWidget{.cdecl, +proc gtk_vbox_new*(homogeneous: gboolean, spacing: gint): PGtkVBox {.cdecl, dynlib: gtklib, importc: "gtk_vbox_new".} proc GTK_TYPE_COLOR_SELECTION*(): GType proc GTK_COLOR_SELECTION*(obj: pointer): PGtkColorSelection @@ -5611,7 +5621,7 @@ proc GTK_IS_COLOR_SELECTION_CLASS*(klass: pointer): bool proc GTK_COLOR_SELECTION_GET_CLASS*(obj: pointer): PGtkColorSelectionClass proc gtk_color_selection_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_color_selection_get_type".} -proc gtk_color_selection_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_color_selection_new*(): PGtkColorSelection {.cdecl, dynlib: gtklib, importc: "gtk_color_selection_new".} proc gtk_color_selection_get_has_opacity_control*(colorsel: PGtkColorSelection): gboolean{. cdecl, dynlib: gtklib, @@ -5664,7 +5674,7 @@ proc GTK_IS_COLOR_SELECTION_DIALOG_CLASS*(klass: pointer): bool proc GTK_COLOR_SELECTION_DIALOG_GET_CLASS*(obj: pointer): PGtkColorSelectionDialogClass proc gtk_color_selection_dialog_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_color_selection_dialog_get_type".} -proc gtk_color_selection_dialog_new*(title: cstring): PGtkWidget{.cdecl, +proc gtk_color_selection_dialog_new*(title: cstring): PGtkColorSelectionDialog {.cdecl, dynlib: gtklib, importc: "gtk_color_selection_dialog_new".} proc GTK_TYPE_HBOX*(): GType proc GTK_HBOX*(obj: pointer): PGtkHBox @@ -5674,7 +5684,7 @@ proc GTK_IS_HBOX_CLASS*(klass: pointer): bool proc GTK_HBOX_GET_CLASS*(obj: pointer): PGtkHBoxClass proc gtk_hbox_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_hbox_get_type".} -proc gtk_hbox_new*(homogeneous: gboolean, spacing: gint): PGtkWidget{.cdecl, +proc gtk_hbox_new*(homogeneous: gboolean, spacing: gint): PGtkHBox {.cdecl, dynlib: gtklib, importc: "gtk_hbox_new".} const bm_TGtkCombo_value_in_list* = 0x00000001'i16 @@ -5706,7 +5716,7 @@ proc use_arrows_always*(a: var TGtkCombo): guint proc set_use_arrows_always*(a: var TGtkCombo, `use_arrows_always`: guint) proc gtk_combo_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_combo_get_type".} -proc gtk_combo_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_combo_new*(): PGtkCombo {.cdecl, dynlib: gtklib, importc: "gtk_combo_new".} proc gtk_combo_set_value_in_list*(combo: PGtkCombo, val: gboolean, ok_if_empty: gboolean){.cdecl, dynlib: gtklib, @@ -5760,7 +5770,7 @@ proc expanded*(a: var TGtkCTreeRow): guint proc set_expanded*(a: var TGtkCTreeRow, `expanded`: guint) proc gtk_ctree_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_ctree_get_type".} -proc gtk_ctree_new*(columns: gint, tree_column: gint): PGtkWidget{.cdecl, +proc gtk_ctree_new*(columns: gint, tree_column: gint): PGtkCTree {.cdecl, dynlib: gtklib, importc: "gtk_ctree_new".} proc gtk_ctree_insert_node*(ctree: PGtkCTree, parent: PGtkCTreeNode, sibling: PGtkCTreeNode, text: openarray[cstring], @@ -5947,7 +5957,7 @@ proc GTK_IS_DRAWING_AREA_CLASS*(klass: pointer): bool proc GTK_DRAWING_AREA_GET_CLASS*(obj: pointer): PGtkDrawingAreaClass proc gtk_drawing_area_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_drawing_area_get_type".} -proc gtk_drawing_area_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_drawing_area_new*(): PGtkDrawingArea {.cdecl, dynlib: gtklib, importc: "gtk_drawing_area_new".} proc GTK_TYPE_CURVE*(): GType proc GTK_CURVE*(obj: pointer): PGtkCurve @@ -5957,7 +5967,7 @@ proc GTK_IS_CURVE_CLASS*(klass: pointer): bool proc GTK_CURVE_GET_CLASS*(obj: pointer): PGtkCurveClass proc gtk_curve_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_curve_get_type".} -proc gtk_curve_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_curve_new*(): PGtkCurve {.cdecl, dynlib: gtklib, importc: "gtk_curve_new".} proc gtk_curve_reset*(curve: PGtkCurve){.cdecl, dynlib: gtklib, importc: "gtk_curve_reset".} @@ -6222,7 +6232,7 @@ proc lower_arrow_prelight*(a: var TGtkMenu): guint proc set_lower_arrow_prelight*(a: var TGtkMenu, `lower_arrow_prelight`: guint) proc gtk_menu_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_menu_get_type".} -proc gtk_menu_new*(): PGtkWidget{.cdecl, dynlib: gtklib, importc: "gtk_menu_new".} +proc gtk_menu_new*(): PGtkMenu {.cdecl, dynlib: gtklib, importc: "gtk_menu_new".} proc gtk_menu_popup*(menu: PGtkMenu, parent_menu_shell: PGtkWidget, parent_menu_item: PGtkWidget, func_: TGtkMenuPositionFunc, data: gpointer, button: guint, activate_time: guint32){. @@ -6323,7 +6333,7 @@ proc mouse_cursor_obscured*(a: var TGtkEntry): guint proc set_mouse_cursor_obscured*(a: var TGtkEntry, `mouse_cursor_obscured`: guint) proc gtk_entry_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_entry_get_type".} -proc gtk_entry_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_entry_new*(): PGtkEntry {.cdecl, dynlib: gtklib, importc: "gtk_entry_new".} proc gtk_entry_set_visibility*(entry: PGtkEntry, visible: gboolean){.cdecl, dynlib: gtklib, importc: "gtk_entry_set_visibility".} @@ -6536,8 +6546,8 @@ proc GTK_IS_EVENT_BOX_CLASS*(klass: pointer): bool proc GTK_EVENT_BOX_GET_CLASS*(obj: pointer): PGtkEventBoxClass proc gtk_event_box_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_event_box_get_type".} -proc gtk_event_box_new*(): PGtkWidget{.cdecl, dynlib: gtklib, - importc: "gtk_event_box_new".} +proc gtk_event_box_new*(): PGtkEventBox {.cdecl, dynlib: gtklib, + importc: "gtk_event_box_new".} const FNM_PATHNAME* = 1 shl 0 FNM_NOESCAPE* = 1 shl 1 @@ -6561,7 +6571,7 @@ proc GTK_IS_FILE_SELECTION_CLASS*(klass: pointer): bool proc GTK_FILE_SELECTION_GET_CLASS*(obj: pointer): PGtkFileSelectionClass proc gtk_file_selection_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_file_selection_get_type".} -proc gtk_file_selection_new*(title: cstring): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_file_selection_new*(title: cstring): PGtkFileSelection {.cdecl, dynlib: gtklib, importc: "gtk_file_selection_new".} proc gtk_file_selection_set_filename*(filesel: PGtkFileSelection, filename: cstring){.cdecl, dynlib: gtklib, @@ -6588,7 +6598,7 @@ proc GTK_IS_FIXED_CLASS*(klass: pointer): bool proc GTK_FIXED_GET_CLASS*(obj: pointer): PGtkFixedClass proc gtk_fixed_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_fixed_get_type".} -proc gtk_fixed_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_fixed_new*(): PGtkFixed {.cdecl, dynlib: gtklib, importc: "gtk_fixed_new".} proc gtk_fixed_put*(fixed: PGtkFixed, widget: PGtkWidget, x: gint, y: gint){. cdecl, dynlib: gtklib, importc: "gtk_fixed_put".} @@ -6612,7 +6622,7 @@ proc GTK_IS_FONT_SELECTION_DIALOG_CLASS*(klass: pointer): bool proc GTK_FONT_SELECTION_DIALOG_GET_CLASS*(obj: pointer): PGtkFontSelectionDialogClass proc gtk_font_selection_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_font_selection_get_type".} -proc gtk_font_selection_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_font_selection_new*(): PGtkFontSelection{.cdecl, dynlib: gtklib, importc: "gtk_font_selection_new".} proc gtk_font_selection_get_font_name*(fontsel: PGtkFontSelection): cstring{. cdecl, dynlib: gtklib, importc: "gtk_font_selection_get_font_name".} @@ -6626,7 +6636,7 @@ proc gtk_font_selection_set_preview_text*(fontsel: PGtkFontSelection, importc: "gtk_font_selection_set_preview_text".} proc gtk_font_selection_dialog_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_font_selection_dialog_get_type".} -proc gtk_font_selection_dialog_new*(title: cstring): PGtkWidget{.cdecl, +proc gtk_font_selection_dialog_new*(title: cstring): PGtkFontSelectionDialog{.cdecl, dynlib: gtklib, importc: "gtk_font_selection_dialog_new".} proc gtk_font_selection_dialog_get_font_name*(fsd: PGtkFontSelectionDialog): cstring{. cdecl, dynlib: gtklib, importc: "gtk_font_selection_dialog_get_font_name".} @@ -6645,7 +6655,7 @@ proc GTK_IS_GAMMA_CURVE_CLASS*(klass: pointer): bool proc GTK_GAMMA_CURVE_GET_CLASS*(obj: pointer): PGtkGammaCurveClass proc gtk_gamma_curve_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_gamma_curve_get_type".} -proc gtk_gamma_curve_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_gamma_curve_new*(): PGtkGammaCurve{.cdecl, dynlib: gtklib, importc: "gtk_gamma_curve_new".} proc gtk_gc_get*(depth: gint, colormap: PGdkColormap, values: PGdkGCValues, values_mask: TGdkGCValuesMask): PGdkGC{.cdecl, dynlib: gtklib, @@ -6686,7 +6696,7 @@ proc snap_edge*(a: var TGtkHandleBox): gint proc set_snap_edge*(a: var TGtkHandleBox, `snap_edge`: gint) proc gtk_handle_box_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_handle_box_get_type".} -proc gtk_handle_box_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_handle_box_new*(): PGtkHandleBox{.cdecl, dynlib: gtklib, importc: "gtk_handle_box_new".} proc gtk_handle_box_set_shadow_type*(handle_box: PGtkHandleBox, thetype: TGtkShadowType){.cdecl, @@ -6774,7 +6784,7 @@ proc GTK_IS_HBUTTON_BOX_CLASS*(klass: pointer): bool proc GTK_HBUTTON_BOX_GET_CLASS*(obj: pointer): PGtkHButtonBoxClass proc gtk_hbutton_box_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_hbutton_box_get_type".} -proc gtk_hbutton_box_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_hbutton_box_new*(): PGtkHButtonBox{.cdecl, dynlib: gtklib, importc: "gtk_hbutton_box_new".} proc GTK_TYPE_HPANED*(): GType proc GTK_HPANED*(obj: pointer): PGtkHPaned @@ -6784,7 +6794,7 @@ proc GTK_IS_HPANED_CLASS*(klass: pointer): bool proc GTK_HPANED_GET_CLASS*(obj: pointer): PGtkHPanedClass proc gtk_hpaned_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_hpaned_get_type".} -proc gtk_hpaned_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_hpaned_new*(): PGtkHPaned{.cdecl, dynlib: gtklib, importc: "gtk_hpaned_new".} proc GTK_TYPE_RULER*(): GType proc GTK_RULER*(obj: pointer): PGtkRuler @@ -6816,7 +6826,7 @@ proc GTK_IS_HRULER_CLASS*(klass: pointer): bool proc GTK_HRULER_GET_CLASS*(obj: pointer): PGtkHRulerClass proc gtk_hruler_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_hruler_get_type".} -proc gtk_hruler_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_hruler_new*(): PGtkHRuler{.cdecl, dynlib: gtklib, importc: "gtk_hruler_new".} proc GTK_TYPE_SETTINGS*(): GType proc GTK_SETTINGS*(obj: pointer): PGtkSettings @@ -7212,9 +7222,9 @@ proc GTK_IS_HSCALE_CLASS*(klass: pointer): bool proc GTK_HSCALE_GET_CLASS*(obj: pointer): PGtkHScaleClass proc gtk_hscale_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_hscale_get_type".} -proc gtk_hscale_new*(adjustment: PGtkAdjustment): PGtkWidget{.cdecl, +proc gtk_hscale_new*(adjustment: PGtkAdjustment): PGtkHScale{.cdecl, dynlib: gtklib, importc: "gtk_hscale_new".} -proc gtk_hscale_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkWidget{. +proc gtk_hscale_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkHScale{. cdecl, dynlib: gtklib, importc: "gtk_hscale_new_with_range".} proc GTK_TYPE_SCROLLBAR*(): GType proc GTK_SCROLLBAR*(obj: pointer): PGtkScrollbar @@ -7232,7 +7242,7 @@ proc GTK_IS_HSCROLLBAR_CLASS*(klass: pointer): bool proc GTK_HSCROLLBAR_GET_CLASS*(obj: pointer): PGtkHScrollbarClass proc gtk_hscrollbar_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_hscrollbar_get_type".} -proc gtk_hscrollbar_new*(adjustment: PGtkAdjustment): PGtkWidget{.cdecl, +proc gtk_hscrollbar_new*(adjustment: PGtkAdjustment): PGtkHScrollbar{.cdecl, dynlib: gtklib, importc: "gtk_hscrollbar_new".} proc GTK_TYPE_SEPARATOR*(): GType proc GTK_SEPARATOR*(obj: pointer): PGtkSeparator @@ -7250,7 +7260,7 @@ proc GTK_IS_HSEPARATOR_CLASS*(klass: pointer): bool proc GTK_HSEPARATOR_GET_CLASS*(obj: pointer): PGtkHSeparatorClass proc gtk_hseparator_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_hseparator_get_type".} -proc gtk_hseparator_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_hseparator_new*(): PGtkHSeparator{.cdecl, dynlib: gtklib, importc: "gtk_hseparator_new".} proc GTK_TYPE_ICON_FACTORY*(): GType proc GTK_ICON_FACTORY*(anObject: pointer): PGtkIconFactory @@ -7363,21 +7373,21 @@ proc GTK_IS_IMAGE_CLASS*(klass: pointer): bool proc GTK_IMAGE_GET_CLASS*(obj: pointer): PGtkImageClass proc gtk_image_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_image_get_type".} -proc gtk_image_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_image_new*(): PGtkImage{.cdecl, dynlib: gtklib, importc: "gtk_image_new".} -proc gtk_image_new_from_pixmap*(pixmap: PGdkPixmap, mask: PGdkBitmap): PGtkWidget{. +proc gtk_image_new_from_pixmap*(pixmap: PGdkPixmap, mask: PGdkBitmap): PGtkImage{. cdecl, dynlib: gtklib, importc: "gtk_image_new_from_pixmap".} -proc gtk_image_new_from_image*(image: PGdkImage, mask: PGdkBitmap): PGtkWidget{. +proc gtk_image_new_from_image*(image: PGdkImage, mask: PGdkBitmap): PGtkImage{. cdecl, dynlib: gtklib, importc: "gtk_image_new_from_image".} -proc gtk_image_new_from_file*(filename: cstring): PGtkWidget{.cdecl, +proc gtk_image_new_from_file*(filename: cstring): PGtkImage{.cdecl, dynlib: gtklib, importc: "gtk_image_new_from_file".} -proc gtk_image_new_from_pixbuf*(pixbuf: PGdkPixbuf): PGtkWidget{.cdecl, +proc gtk_image_new_from_pixbuf*(pixbuf: PGdkPixbuf): PGtkImage{.cdecl, dynlib: gtklib, importc: "gtk_image_new_from_pixbuf".} -proc gtk_image_new_from_stock*(stock_id: cstring, size: TGtkIconSize): PGtkWidget{. +proc gtk_image_new_from_stock*(stock_id: cstring, size: TGtkIconSize): PGtkImage{. cdecl, dynlib: gtklib, importc: "gtk_image_new_from_stock".} -proc gtk_image_new_from_icon_set*(icon_set: PGtkIconSet, size: TGtkIconSize): PGtkWidget{. +proc gtk_image_new_from_icon_set*(icon_set: PGtkIconSet, size: TGtkIconSize): PGtkImage{. cdecl, dynlib: gtklib, importc: "gtk_image_new_from_icon_set".} -proc gtk_image_new_from_animation*(animation: PGdkPixbufAnimation): PGtkWidget{. +proc gtk_image_new_from_animation*(animation: PGdkPixbufAnimation): PGtkImage{. cdecl, dynlib: gtklib, importc: "gtk_image_new_from_animation".} proc gtk_image_set_from_pixmap*(image: PGtkImage, pixmap: PGdkPixmap, mask: PGdkBitmap){.cdecl, dynlib: gtklib, @@ -7415,14 +7425,14 @@ proc GTK_IS_IMAGE_MENU_ITEM_CLASS*(klass: pointer): bool proc GTK_IMAGE_MENU_ITEM_GET_CLASS*(obj: pointer): PGtkImageMenuItemClass proc gtk_image_menu_item_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_image_menu_item_get_type".} -proc gtk_image_menu_item_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_image_menu_item_new*(): PGtkImageMenuItem{.cdecl, dynlib: gtklib, importc: "gtk_image_menu_item_new".} -proc gtk_image_menu_item_new_with_label*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_image_menu_item_new_with_label*(`label`: cstring): PGtkImageMenuItem{.cdecl, dynlib: gtklib, importc: "gtk_image_menu_item_new_with_label".} -proc gtk_image_menu_item_new_with_mnemonic*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_image_menu_item_new_with_mnemonic*(`label`: cstring): PGtkImageMenuItem{.cdecl, dynlib: gtklib, importc: "gtk_image_menu_item_new_with_mnemonic".} proc gtk_image_menu_item_new_from_stock*(stock_id: cstring, - accel_group: PGtkAccelGroup): PGtkWidget{.cdecl, dynlib: gtklib, + accel_group: PGtkAccelGroup): PGtkImageMenuItem{.cdecl, dynlib: gtklib, importc: "gtk_image_menu_item_new_from_stock".} proc gtk_image_menu_item_set_image*(image_menu_item: PGtkImageMenuItem, image: PGtkWidget){.cdecl, dynlib: gtklib, @@ -7470,7 +7480,7 @@ proc GTK_IS_INPUT_DIALOG_CLASS*(klass: pointer): bool proc GTK_INPUT_DIALOG_GET_CLASS*(obj: pointer): PGtkInputDialogClass proc gtk_input_dialog_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_input_dialog_get_type".} -proc gtk_input_dialog_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_input_dialog_new*(): PGtkInputDialog{.cdecl, dynlib: gtklib, importc: "gtk_input_dialog_new".} proc GTK_TYPE_INVISIBLE*(): GType proc GTK_INVISIBLE*(obj: pointer): PGtkInvisible @@ -7480,9 +7490,9 @@ proc GTK_IS_INVISIBLE_CLASS*(klass: pointer): bool proc GTK_INVISIBLE_GET_CLASS*(obj: pointer): PGtkInvisibleClass proc gtk_invisible_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_invisible_get_type".} -proc gtk_invisible_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_invisible_new*(): PGtkInvisible{.cdecl, dynlib: gtklib, importc: "gtk_invisible_new".} -proc gtk_invisible_new_for_screen*(screen: PGdkScreen): PGtkWidget{.cdecl, +proc gtk_invisible_new_for_screen*(screen: PGdkScreen): PGtkInvisible{.cdecl, dynlib: gtklib, importc: "gtk_invisible_new_for_screen".} proc gtk_invisible_set_screen*(invisible: PGtkInvisible, screen: PGdkScreen){. cdecl, dynlib: gtklib, importc: "gtk_invisible_set_screen".} @@ -7561,7 +7571,7 @@ proc GTK_IS_LAYOUT_CLASS*(klass: pointer): bool proc GTK_LAYOUT_GET_CLASS*(obj: pointer): PGtkLayoutClass proc gtk_layout_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_layout_get_type".} -proc gtk_layout_new*(hadjustment: PGtkAdjustment, vadjustment: PGtkAdjustment): PGtkWidget{. +proc gtk_layout_new*(hadjustment: PGtkAdjustment, vadjustment: PGtkAdjustment): PGtkLayout{. cdecl, dynlib: gtklib, importc: "gtk_layout_new".} proc gtk_layout_put*(layout: PGtkLayout, child_widget: PGtkWidget, x: gint, y: gint){.cdecl, dynlib: gtklib, importc: "gtk_layout_put".} @@ -7602,7 +7612,7 @@ proc add_mode*(a: var TGtkList): guint proc set_add_mode*(a: var TGtkList, `add_mode`: guint) proc gtk_list_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_list_get_type".} -proc gtk_list_new*(): PGtkWidget{.cdecl, dynlib: gtklib, importc: "gtk_list_new".} +proc gtk_list_new*(): PGtkList{.cdecl, dynlib: gtklib, importc: "gtk_list_new".} proc gtk_list_insert_items*(list: PGtkList, items: PGList, position: gint){. cdecl, dynlib: gtklib, importc: "gtk_list_insert_items".} proc gtk_list_append_items*(list: PGtkList, items: PGList){.cdecl, @@ -7994,7 +8004,7 @@ proc GTK_IS_MENU_BAR_CLASS*(klass: pointer): bool proc GTK_MENU_BAR_GET_CLASS*(obj: pointer): PGtkMenuBarClass proc gtk_menu_bar_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_menu_bar_get_type".} -proc gtk_menu_bar_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_menu_bar_new*(): PGtkMenuBar{.cdecl, dynlib: gtklib, importc: "gtk_menu_bar_new".} proc gtk_menu_bar_cycle_focus*(menubar: PGtkMenuBar, dir: TGtkDirectionType){. cdecl, dynlib: gtklib, importc: "_gtk_menu_bar_cycle_focus".} @@ -8064,7 +8074,7 @@ proc focus_out*(a: var TGtkNotebook): guint proc set_focus_out*(a: var TGtkNotebook, `focus_out`: guint) proc gtk_notebook_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_notebook_get_type".} -proc gtk_notebook_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_notebook_new*(): PGtkNotebook{.cdecl, dynlib: gtklib, importc: "gtk_notebook_new".} proc gtk_notebook_append_page*(notebook: PGtkNotebook, child: PGtkWidget, tab_label: PGtkWidget): gint{.cdecl, @@ -8091,6 +8101,8 @@ proc gtk_notebook_remove_page*(notebook: PGtkNotebook, page_num: gint){.cdecl, dynlib: gtklib, importc: "gtk_notebook_remove_page".} proc gtk_notebook_get_current_page*(notebook: PGtkNotebook): gint{.cdecl, dynlib: gtklib, importc: "gtk_notebook_get_current_page".} +proc gtk_notebook_get_n_pages*(notebook: PGtkNotebook): gint {.cdecl, + dynlib: gtklib, importc.} proc gtk_notebook_get_nth_page*(notebook: PGtkNotebook, page_num: gint): PGtkWidget{. cdecl, dynlib: gtklib, importc: "gtk_notebook_get_nth_page".} proc gtk_notebook_page_num*(notebook: PGtkNotebook, child: PGtkWidget): gint{. @@ -8186,7 +8198,7 @@ proc GTK_IS_OPTION_MENU_CLASS*(klass: pointer): bool proc GTK_OPTION_MENU_GET_CLASS*(obj: pointer): PGtkOptionMenuClass proc gtk_option_menu_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_option_menu_get_type".} -proc gtk_option_menu_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_option_menu_new*(): PGtkOptionMenu{.cdecl, dynlib: gtklib, importc: "gtk_option_menu_new".} proc gtk_option_menu_get_menu*(option_menu: PGtkOptionMenu): PGtkWidget{.cdecl, dynlib: gtklib, importc: "gtk_option_menu_get_menu".} @@ -8212,7 +8224,7 @@ proc build_insensitive*(a: var TGtkPixmap): guint proc set_build_insensitive*(a: var TGtkPixmap, `build_insensitive`: guint) proc gtk_pixmap_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_pixmap_get_type".} -proc gtk_pixmap_new*(pixmap: PGdkPixmap, mask: PGdkBitmap): PGtkWidget{.cdecl, +proc gtk_pixmap_new*(pixmap: PGdkPixmap, mask: PGdkBitmap): PGtkPixmap{.cdecl, dynlib: gtklib, importc: "gtk_pixmap_new".} proc gtk_pixmap_set*(pixmap: PGtkPixmap, val: PGdkPixmap, mask: PGdkBitmap){. cdecl, dynlib: gtklib, importc: "gtk_pixmap_set".} @@ -8238,7 +8250,7 @@ proc gtk_plug_get_type*(): TGtkType{.cdecl, dynlib: gtklib, proc gtk_plug_construct_for_display*(plug: PGtkPlug, display: PGdkDisplay, socket_id: TGdkNativeWindow){.cdecl, dynlib: gtklib, importc: "gtk_plug_construct_for_display".} -proc gtk_plug_new_for_display*(display: PGdkDisplay, socket_id: TGdkNativeWindow): PGtkWidget{. +proc gtk_plug_new_for_display*(display: PGdkDisplay, socket_id: TGdkNativeWindow): PGtkPlug{. cdecl, dynlib: gtklib, importc: "gtk_plug_new_for_display".} proc gtk_plug_get_id*(plug: PGtkPlug): TGdkNativeWindow{.cdecl, dynlib: gtklib, importc: "gtk_plug_get_id".} @@ -8265,7 +8277,7 @@ proc set_expand*(a: var TGtkPreview, `expand`: guint) proc gtk_preview_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_preview_get_type".} proc gtk_preview_uninit*(){.cdecl, dynlib: gtklib, importc: "gtk_preview_uninit".} -proc gtk_preview_new*(thetype: TGtkPreviewClass): PGtkWidget{.cdecl, +proc gtk_preview_new*(thetype: TGtkPreviewClass): PGtkPreview{.cdecl, dynlib: gtklib, importc: "gtk_preview_new".} proc gtk_preview_size*(preview: PGtkPreview, width: gint, height: gint){.cdecl, dynlib: gtklib, importc: "gtk_preview_size".} @@ -8320,7 +8332,7 @@ proc activity_dir*(a: var TGtkProgressBar): guint proc set_activity_dir*(a: var TGtkProgressBar, `activity_dir`: guint) proc gtk_progress_bar_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_progress_bar_get_type".} -proc gtk_progress_bar_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_progress_bar_new*(): PGtkProgressBar{.cdecl, dynlib: gtklib, importc: "gtk_progress_bar_new".} proc gtk_progress_bar_pulse*(pbar: PGtkProgressBar){.cdecl, dynlib: gtklib, importc: "gtk_progress_bar_pulse".} @@ -8349,18 +8361,18 @@ proc GTK_IS_RADIO_BUTTON_CLASS*(klass: pointer): bool proc GTK_RADIO_BUTTON_GET_CLASS*(obj: pointer): PGtkRadioButtonClass proc gtk_radio_button_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_get_type".} -proc gtk_radio_button_new*(group: PGSList): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_radio_button_new*(group: PGSList): PGtkRadioButton{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_new".} -proc gtk_radio_button_new_from_widget*(group: PGtkRadioButton): PGtkWidget{. +proc gtk_radio_button_new_from_widget*(group: PGtkRadioButton): PGtkRadioButton{. cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_from_widget".} -proc gtk_radio_button_new_with_label*(group: PGSList, `label`: cstring): PGtkWidget{. +proc gtk_radio_button_new_with_label*(group: PGSList, `label`: cstring): PGtkRadioButton{. cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_label".} proc gtk_radio_button_new_with_label_from_widget*(group: PGtkRadioButton, - `label`: cstring): PGtkWidget{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_label_from_widget".} -proc gtk_radio_button_new_with_mnemonic*(group: PGSList, `label`: cstring): PGtkWidget{. + `label`: cstring): PGtkRadioButton{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_label_from_widget".} +proc gtk_radio_button_new_with_mnemonic*(group: PGSList, `label`: cstring): PGtkRadioButton{. cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_mnemonic".} proc gtk_radio_button_new_with_mnemonic_from_widget*(group: PGtkRadioButton, - `label`: cstring): PGtkWidget{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_mnemonic_from_widget".} + `label`: cstring): PGtkRadioButton{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_new_with_mnemonic_from_widget".} proc gtk_radio_button_get_group*(radio_button: PGtkRadioButton): PGSList{.cdecl, dynlib: gtklib, importc: "gtk_radio_button_get_group".} proc gtk_radio_button_set_group*(radio_button: PGtkRadioButton, group: PGSList){. @@ -8373,11 +8385,11 @@ proc GTK_IS_RADIO_MENU_ITEM_CLASS*(klass: pointer): bool proc GTK_RADIO_MENU_ITEM_GET_CLASS*(obj: pointer): PGtkRadioMenuItemClass proc gtk_radio_menu_item_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_radio_menu_item_get_type".} -proc gtk_radio_menu_item_new*(group: PGSList): PGtkWidget{.cdecl, +proc gtk_radio_menu_item_new*(group: PGSList): PGtkRadioMenuItem{.cdecl, dynlib: gtklib, importc: "gtk_radio_menu_item_new".} -proc gtk_radio_menu_item_new_with_label*(group: PGSList, `label`: cstring): PGtkWidget{. +proc gtk_radio_menu_item_new_with_label*(group: PGSList, `label`: cstring): PGtkRadioMenuItem{. cdecl, dynlib: gtklib, importc: "gtk_radio_menu_item_new_with_label".} -proc gtk_radio_menu_item_new_with_mnemonic*(group: PGSList, `label`: cstring): PGtkWidget{. +proc gtk_radio_menu_item_new_with_mnemonic*(group: PGSList, `label`: cstring): PGtkRadioMenuItem{. cdecl, dynlib: gtklib, importc: "gtk_radio_menu_item_new_with_mnemonic".} proc gtk_radio_menu_item_get_group*(radio_menu_item: PGtkRadioMenuItem): PGSList{. cdecl, dynlib: gtklib, importc: "gtk_radio_menu_item_get_group".} @@ -8423,7 +8435,7 @@ proc set_focus_out*(a: var TGtkScrolledWindow, `focus_out`: guint) proc gtk_scrolled_window_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_scrolled_window_get_type".} proc gtk_scrolled_window_new*(hadjustment: PGtkAdjustment, - vadjustment: PGtkAdjustment): PGtkWidget{.cdecl, + vadjustment: PGtkAdjustment): PGtkScrolledWindow{.cdecl, dynlib: gtklib, importc: "gtk_scrolled_window_new".} proc gtk_scrolled_window_set_hadjustment*(scrolled_window: PGtkScrolledWindow, hadjustment: PGtkAdjustment){.cdecl, dynlib: gtklib, importc: "gtk_scrolled_window_set_hadjustment".} @@ -8525,7 +8537,7 @@ proc GTK_IS_SEPARATOR_MENU_ITEM_CLASS*(klass: pointer): bool proc GTK_SEPARATOR_MENU_ITEM_GET_CLASS*(obj: pointer): PGtkSeparatorMenuItemClass proc gtk_separator_menu_item_get_type*(): GType{.cdecl, dynlib: gtklib, importc: "gtk_separator_menu_item_get_type".} -proc gtk_separator_menu_item_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_separator_menu_item_new*(): PGtkSeparatorMenuItem{.cdecl, dynlib: gtklib, importc: "gtk_separator_menu_item_new".} const bm_TGtkSizeGroup_have_width* = 0x00000001'i16 @@ -8589,7 +8601,7 @@ proc need_map*(a: var TGtkSocket): guint proc set_need_map*(a: var TGtkSocket, `need_map`: guint) proc is_mapped*(a: var TGtkSocket): guint proc set_is_mapped*(a: var TGtkSocket, `is_mapped`: guint) -proc gtk_socket_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_socket_new*(): PGtkSocket {.cdecl, dynlib: gtklib, importc: "gtk_socket_new".} proc gtk_socket_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_socket_get_type".} @@ -8649,9 +8661,9 @@ proc gtk_spin_button_configure*(spin_button: PGtkSpinButton, digits: guint){.cdecl, dynlib: gtklib, importc: "gtk_spin_button_configure".} proc gtk_spin_button_new*(adjustment: PGtkAdjustment, climb_rate: gdouble, - digits: guint): PGtkWidget{.cdecl, dynlib: gtklib, + digits: guint): PGtkSpinButton{.cdecl, dynlib: gtklib, importc: "gtk_spin_button_new".} -proc gtk_spin_button_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkWidget{. +proc gtk_spin_button_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkSpinButton{. cdecl, dynlib: gtklib, importc: "gtk_spin_button_new_with_range".} proc gtk_spin_button_set_adjustment*(spin_button: PGtkSpinButton, adjustment: PGtkAdjustment){.cdecl, @@ -8724,6 +8736,7 @@ const GTK_STOCK_COPY* = "gtk-copy" GTK_STOCK_CUT* = "gtk-cut" GTK_STOCK_DELETE* = "gtk-delete" + GTK_STOCK_EDIT* = "gtk-edit" GTK_STOCK_EXECUTE* = "gtk-execute" GTK_STOCK_FIND* = "gtk-find" GTK_STOCK_FIND_AND_REPLACE* = "gtk-find-and-replace" @@ -8812,7 +8825,7 @@ proc has_resize_grip*(a: var TGtkStatusbar): guint proc set_has_resize_grip*(a: var TGtkStatusbar, `has_resize_grip`: guint) proc gtk_statusbar_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_statusbar_get_type".} -proc gtk_statusbar_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_statusbar_new*(): PGtkStatusbar{.cdecl, dynlib: gtklib, importc: "gtk_statusbar_new".} proc gtk_statusbar_get_context_id*(statusbar: PGtkStatusbar, context_description: cstring): guint{.cdecl, @@ -8888,7 +8901,7 @@ proc empty*(a: var TGtkTableRowCol): guint proc set_empty*(a: var TGtkTableRowCol, `empty`: guint) proc gtk_table_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_table_get_type".} -proc gtk_table_new*(rows: guint, columns: guint, homogeneous: gboolean): PGtkWidget{. +proc gtk_table_new*(rows: guint, columns: guint, homogeneous: gboolean): PGtkTable{. cdecl, dynlib: gtklib, importc: "gtk_table_new".} proc gtk_table_resize*(table: PGtkTable, rows: guint, columns: guint){.cdecl, dynlib: gtklib, importc: "gtk_table_resize".} @@ -8936,7 +8949,7 @@ proc torn_off*(a: var TGtkTearoffMenuItem): guint proc set_torn_off*(a: var TGtkTearoffMenuItem, `torn_off`: guint) proc gtk_tearoff_menu_item_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_tearoff_menu_item_get_type".} -proc gtk_tearoff_menu_item_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_tearoff_menu_item_new*(): PGtkTearoffMenuItem{.cdecl, dynlib: gtklib, importc: "gtk_tearoff_menu_item_new".} const bm_TGtkText_line_wrap* = 0x00000001'i16 @@ -8960,7 +8973,7 @@ proc use_wchar*(a: PGtkText): gboolean proc set_use_wchar*(a: PGtkText, `use_wchar`: gboolean) proc gtk_text_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_text_get_type".} -proc gtk_text_new*(hadj: PGtkAdjustment, vadj: PGtkAdjustment): PGtkWidget{. +proc gtk_text_new*(hadj: PGtkAdjustment, vadj: PGtkAdjustment): PGtkText{. cdecl, dynlib: gtklib, importc: "gtk_text_new".} proc gtk_text_set_editable*(text: PGtkText, editable: gboolean){.cdecl, dynlib: gtklib, importc: "gtk_text_set_editable".} @@ -10056,9 +10069,9 @@ proc set_mouse_cursor_obscured*(a: var TGtkTextView, `mouse_cursor_obscured`: guint) proc gtk_text_view_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_text_view_get_type".} -proc gtk_text_view_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_text_view_new*(): PGtkTextView{.cdecl, dynlib: gtklib, importc: "gtk_text_view_new".} -proc gtk_text_view_new_with_buffer*(buffer: PGtkTextBuffer): PGtkWidget{.cdecl, +proc gtk_text_view_new_with_buffer*(buffer: PGtkTextBuffer): PGtkTextView{.cdecl, dynlib: gtklib, importc: "gtk_text_view_new_with_buffer".} proc gtk_text_view_set_buffer*(text_view: PGtkTextView, buffer: PGtkTextBuffer){. cdecl, dynlib: gtklib, importc: "gtk_text_view_set_buffer".} @@ -10210,7 +10223,7 @@ proc in_query*(a: var TGtkTipsQuery): guint proc set_in_query*(a: var TGtkTipsQuery, `in_query`: guint) proc gtk_tips_query_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_tips_query_get_type".} -proc gtk_tips_query_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_tips_query_new*(): PGtkTipsQuery{.cdecl, dynlib: gtklib, importc: "gtk_tips_query_new".} proc gtk_tips_query_start_query*(tips_query: PGtkTipsQuery){.cdecl, dynlib: gtklib, importc: "gtk_tips_query_start_query".} @@ -10280,7 +10293,7 @@ proc icon_size_set*(a: var TGtkToolbar): guint proc set_icon_size_set*(a: var TGtkToolbar, `icon_size_set`: guint) proc gtk_toolbar_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_toolbar_get_type".} -proc gtk_toolbar_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_toolbar_new*(): PGtkToolbar{.cdecl, dynlib: gtklib, importc: "gtk_toolbar_new".} proc gtk_toolbar_append_item*(toolbar: PGtkToolbar, text: cstring, tooltip_text: cstring, @@ -10394,7 +10407,7 @@ proc view_line*(a: var TGtkTree): guint proc set_view_line*(a: var TGtkTree, `view_line`: guint) proc gtk_tree_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_tree_get_type".} -proc gtk_tree_new*(): PGtkWidget{.cdecl, dynlib: gtklib, importc: "gtk_tree_new".} +proc gtk_tree_new*(): PGtkTree{.cdecl, dynlib: gtklib, importc: "gtk_tree_new".} proc gtk_tree_append*(tree: PGtkTree, tree_item: PGtkWidget){.cdecl, dynlib: gtklib, importc: "gtk_tree_append".} proc gtk_tree_prepend*(tree: PGtkTree, tree_item: PGtkWidget){.cdecl, @@ -10466,9 +10479,9 @@ proc expanded*(a: var TGtkTreeItem): guint proc set_expanded*(a: var TGtkTreeItem, `expanded`: guint) proc gtk_tree_item_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_tree_item_get_type".} -proc gtk_tree_item_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_tree_item_new*(): PGtkTreeItem{.cdecl, dynlib: gtklib, importc: "gtk_tree_item_new".} -proc gtk_tree_item_new_with_label*(`label`: cstring): PGtkWidget{.cdecl, +proc gtk_tree_item_new_with_label*(`label`: cstring): PGtkTreeItem{.cdecl, dynlib: gtklib, importc: "gtk_tree_item_new_with_label".} proc gtk_tree_item_set_subtree*(tree_item: PGtkTreeItem, subtree: PGtkWidget){. cdecl, dynlib: gtklib, importc: "gtk_tree_item_set_subtree".} @@ -10973,9 +10986,9 @@ proc GTK_IS_TREE_VIEW_CLASS*(klass: pointer): bool proc GTK_TREE_VIEW_GET_CLASS*(obj: pointer): PGtkTreeViewClass proc gtk_tree_view_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_tree_view_get_type".} -proc gtk_tree_view_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_tree_view_new*(): PGtkTreeView{.cdecl, dynlib: gtklib, importc: "gtk_tree_view_new".} -proc gtk_tree_view_new_with_model*(model: PGtkTreeModel): PGtkWidget{.cdecl, +proc gtk_tree_view_new_with_model*(model: PGtkTreeModel): PGtkTreeView{.cdecl, dynlib: gtklib, importc: "gtk_tree_view_new_with_model".} proc gtk_tree_view_get_model*(tree_view: PGtkTreeView): PGtkTreeModel{.cdecl, dynlib: gtklib, importc: "gtk_tree_view_get_model".} @@ -11137,7 +11150,7 @@ proc GTK_IS_VBUTTON_BOX_CLASS*(klass: pointer): bool proc GTK_VBUTTON_BOX_GET_CLASS*(obj: pointer): PGtkVButtonBoxClass proc gtk_vbutton_box_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_vbutton_box_get_type".} -proc gtk_vbutton_box_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_vbutton_box_new*(): PGtkVButtonBox{.cdecl, dynlib: gtklib, importc: "gtk_vbutton_box_new".} proc GTK_TYPE_VIEWPORT*(): GType proc GTK_VIEWPORT*(obj: pointer): PGtkViewport @@ -11147,7 +11160,7 @@ proc GTK_IS_VIEWPORT_CLASS*(klass: pointer): bool proc GTK_VIEWPORT_GET_CLASS*(obj: pointer): PGtkViewportClass proc gtk_viewport_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_viewport_get_type".} -proc gtk_viewport_new*(hadjustment: PGtkAdjustment, vadjustment: PGtkAdjustment): PGtkWidget{. +proc gtk_viewport_new*(hadjustment: PGtkAdjustment, vadjustment: PGtkAdjustment): PGtkViewport{. cdecl, dynlib: gtklib, importc: "gtk_viewport_new".} proc gtk_viewport_get_hadjustment*(viewport: PGtkViewport): PGtkAdjustment{. cdecl, dynlib: gtklib, importc: "gtk_viewport_get_hadjustment".} @@ -11172,7 +11185,7 @@ proc GTK_IS_VPANED_CLASS*(klass: pointer): bool proc GTK_VPANED_GET_CLASS*(obj: pointer): PGtkVPanedClass proc gtk_vpaned_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_vpaned_get_type".} -proc gtk_vpaned_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_vpaned_new*(): PGtkVPaned{.cdecl, dynlib: gtklib, importc: "gtk_vpaned_new".} proc GTK_TYPE_VRULER*(): GType proc GTK_VRULER*(obj: pointer): PGtkVRuler @@ -11182,7 +11195,7 @@ proc GTK_IS_VRULER_CLASS*(klass: pointer): bool proc GTK_VRULER_GET_CLASS*(obj: pointer): PGtkVRulerClass proc gtk_vruler_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_vruler_get_type".} -proc gtk_vruler_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_vruler_new*(): PGtkVRuler{.cdecl, dynlib: gtklib, importc: "gtk_vruler_new".} proc GTK_TYPE_VSCALE*(): GType proc GTK_VSCALE*(obj: pointer): PGtkVScale @@ -11192,9 +11205,9 @@ proc GTK_IS_VSCALE_CLASS*(klass: pointer): bool proc GTK_VSCALE_GET_CLASS*(obj: pointer): PGtkVScaleClass proc gtk_vscale_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_vscale_get_type".} -proc gtk_vscale_new*(adjustment: PGtkAdjustment): PGtkWidget{.cdecl, +proc gtk_vscale_new*(adjustment: PGtkAdjustment): PGtkVScale{.cdecl, dynlib: gtklib, importc: "gtk_vscale_new".} -proc gtk_vscale_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkWidget{. +proc gtk_vscale_new_with_range*(min: gdouble, max: gdouble, step: gdouble): PGtkVScale{. cdecl, dynlib: gtklib, importc: "gtk_vscale_new_with_range".} proc GTK_TYPE_VSCROLLBAR*(): GType proc GTK_VSCROLLBAR*(obj: pointer): PGtkVScrollbar @@ -11204,7 +11217,7 @@ proc GTK_IS_VSCROLLBAR_CLASS*(klass: pointer): bool proc GTK_VSCROLLBAR_GET_CLASS*(obj: pointer): PGtkVScrollbarClass proc gtk_vscrollbar_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_vscrollbar_get_type".} -proc gtk_vscrollbar_new*(adjustment: PGtkAdjustment): PGtkWidget{.cdecl, +proc gtk_vscrollbar_new*(adjustment: PGtkAdjustment): PGtkVScrollbar{.cdecl, dynlib: gtklib, importc: "gtk_vscrollbar_new".} proc GTK_TYPE_VSEPARATOR*(): GType proc GTK_VSEPARATOR*(obj: pointer): PGtkVSeparator @@ -11214,7 +11227,7 @@ proc GTK_IS_VSEPARATOR_CLASS*(klass: pointer): bool proc GTK_VSEPARATOR_GET_CLASS*(obj: pointer): PGtkVSeparatorClass proc gtk_vseparator_get_type*(): TGtkType{.cdecl, dynlib: gtklib, importc: "gtk_vseparator_get_type".} -proc gtk_vseparator_new*(): PGtkWidget{.cdecl, dynlib: gtklib, +proc gtk_vseparator_new*(): PGtkVSeparator{.cdecl, dynlib: gtklib, importc: "gtk_vseparator_new".} proc GTK_TYPE_OBJECT*(): GType = result = gtk_object_get_type() @@ -16902,7 +16915,7 @@ proc gtk_binding_entry_add_signal*(binding_set: PGtkBindingSet, keyval: guint, modifiers: TGdkModifierType, signal_name: cstring, n_args: guint){.varargs, importc, cdecl, dynlib: gtklib.} -proc gtk_clist_new_with_titles*(columns: gint): PGtkWidget{.varargs, cdecl, +proc gtk_clist_new_with_titles*(columns: gint): PGtkCList{.varargs, cdecl, importc, dynlib: gtklib.} proc gtk_clist_prepend*(clist: PGtkCList): gint{.importc, varargs, cdecl, dynlib: gtklib.} proc gtk_clist_append*(clist: PGtkCList): gint{.importc, varargs, cdecl, dynlib: gtklib.} @@ -16929,7 +16942,7 @@ proc gtk_container_child_get_valist*(container: PGtkContainer, child: PGtkWidget, first_property_name: cstring){.varargs, importc, cdecl, dynlib: gtklib.} -proc gtk_ctree_new_with_titles*(columns: gint, tree_column: gint): PGtkWidget{. +proc gtk_ctree_new_with_titles*(columns: gint, tree_column: gint): PGtkCTree{. importc, varargs, cdecl, dynlib: gtklib.} proc gtk_curve_get_vector*(curve: PGtkCurve, veclen: int32){.varargs, cdecl, importc, dynlib: gtklib.} @@ -16939,7 +16952,7 @@ proc gtk_dialog_add_buttons*(dialog: PGtkDialog, first_button_text: cstring){. varargs, cdecl, importc, dynlib: gtklib.} proc gtk_dialog_new_with_buttons*(title: cstring, parent: PGtkWindow, flags: TGtkDialogFlags, - first_button_text: cstring): PGtkWidget{. + first_button_text: cstring): PGtkDialog{. varargs, cdecl, importc, dynlib: gtklib.} proc gtk_list_store_new*(n_columns: gint): PGtkListStore{.varargs, cdecl, importc, dynlib: gtklib.} @@ -16949,7 +16962,7 @@ proc gtk_list_store_set_valist*(list_store: PGtkListStore, iter: PGtkTreeIter){. varargs, cdecl, importc, dynlib: gtklib.} proc gtk_message_dialog_new*(parent: PGtkWindow, flags: TGtkDialogFlags, thetype: TGtkMessageType, buttons: TGtkButtonsType, - message_format: cstring): PGtkWidget{.varargs, + message_format: cstring): PGtkMessageDialog{.varargs, cdecl, importc, dynlib: gtklib.} proc gtk_signal_new*(name: cstring, signal_flags: TGtkSignalRunType, object_type: TGtkType, function_offset: guint, @@ -17014,11 +17027,11 @@ proc gtk_widget_style_get*(widget: PGtkWidget, first_property_name: cstring){. varargs, cdecl, importc, dynlib: gtklib.} proc gtk_file_chooser_dialog_new*(title: cstring, parent: PGtkWindow, action: TGtkFileChooserAction, - first_button_text: cstring): PGtkWidget{.cdecl, + first_button_text: cstring): PGtkDialog {.cdecl, varargs, dynlib: gtklib, importc: "gtk_file_chooser_dialog_new".} proc gtk_file_chooser_dialog_new_with_backend*(title: cstring, parent: PGtkWindow, action: TGtkFileChooserAction, backend: cstring, - first_button_text: cstring): PGtkWidget{.varargs, cdecl, dynlib: gtklib, + first_button_text: cstring): PGtkDialog {.varargs, cdecl, dynlib: gtklib, importc: "gtk_file_chooser_dialog_new_with_backend".} proc gtk_object_ref*(anObject: PGtkObject): PGtkObject{.cdecl,importc, dynlib: gtklib.} proc gtk_object_unref*(anObject: PGtkObject){.cdecl, importc, dynlib: gtklib.} @@ -17075,7 +17088,7 @@ type GTK_FILE_FILTER_FILENAME = 1 shl 0, GTK_FILE_FILTER_URI = 1 shl 1, GTK_FILE_FILTER_DISPLAY_NAME = 1 shl 2, GTK_FILE_FILTER_MIME_TYPE = 1 shl 3 PGtkFileFilterInfo* = ref TGtkFileFilterInfo - TGtkFileFilterInfo* {.final.} = object + TGtkFileFilterInfo* {.final, pure.} = object contains*: TGtkFileFilterFlags filename*: cstring uri*: cstring diff --git a/lib/base/gtk/gtkhtml.nim b/lib/base/gtk/gtkhtml.nim index ca1ce883d..17d3ac56c 100644 --- a/lib/base/gtk/gtkhtml.nim +++ b/lib/base/gtk/gtkhtml.nim @@ -68,12 +68,12 @@ type exc: PDomException): PDomString{.cdecl.} PDomDocument* = ptr TDomDocument - TDomDocument* {.final.} = object + TDomDocument* {.final, pure.} = object parent*: PDomNode iterators*: PGSList PDomDocumentClass* = ptr TDomDocumentClass - TDomDocumentClass* {.final.} = object + TDomDocumentClass* {.final, pure.} = object parent_class*: PDomNodeClass PHtmlFocusIterator* = ptr THtmlFocusIterator diff --git a/lib/base/gtk/pango.nim b/lib/base/gtk/pango.nim index 363d02cd6..363650f1f 100644 --- a/lib/base/gtk/pango.nim +++ b/lib/base/gtk/pango.nim @@ -47,7 +47,7 @@ type PPangoGlyph* = ptr TPangoGlyph TPangoGlyph* = guint32 PPangoRectangle* = ptr TPangoRectangle - TPangoRectangle* {.final.} = object + TPangoRectangle* {.final, pure.} = object x*: int32 y*: int32 width*: int32 @@ -58,7 +58,7 @@ type PANGO_DIRECTION_LTR, PANGO_DIRECTION_RTL, PANGO_DIRECTION_TTB_LTR, PANGO_DIRECTION_TTB_RTL PPangoColor* = ptr TPangoColor - TPangoColor* {.final.} = object + TPangoColor* {.final, pure.} = object red*: guint16 green*: guint16 blue*: guint16 @@ -69,12 +69,12 @@ type TPangoUnderline* = int32 PPangoAttribute* = ptr TPangoAttribute PPangoAttrClass* = ptr TPangoAttrClass - TPangoAttribute* {.final.} = object + TPangoAttribute* {.final, pure.} = object klass*: PPangoAttrClass start_index*: int end_index*: int - TPangoAttrClass* {.final.} = object + TPangoAttrClass* {.final, pure.} = object `type`*: TPangoAttrType copy*: proc (attr: PPangoAttribute): PPangoAttribute{.cdecl.} destroy*: proc (attr: PPangoAttribute){.cdecl.} @@ -82,43 +82,43 @@ type cdecl.} PPangoAttrString* = ptr TPangoAttrString - TPangoAttrString* {.final.} = object + TPangoAttrString* {.final, pure.} = object attr*: TPangoAttribute value*: cstring PPangoAttrLanguage* = ptr TPangoAttrLanguage - TPangoAttrLanguage* {.final.} = object + TPangoAttrLanguage* {.final, pure.} = object attr*: TPangoAttribute value*: PPangoLanguage PPangoAttrInt* = ptr TPangoAttrInt - TPangoAttrInt* {.final.} = object + TPangoAttrInt* {.final, pure.} = object attr*: TPangoAttribute value*: int32 PPangoAttrFloat* = ptr TPangoAttrFloat - TPangoAttrFloat* {.final.} = object + TPangoAttrFloat* {.final, pure.} = object attr*: TPangoAttribute value*: gdouble PPangoAttrColor* = ptr TPangoAttrColor - TPangoAttrColor* {.final.} = object + TPangoAttrColor* {.final, pure.} = object attr*: TPangoAttribute color*: TPangoColor PPangoAttrShape* = ptr TPangoAttrShape - TPangoAttrShape* {.final.} = object + TPangoAttrShape* {.final, pure.} = object attr*: TPangoAttribute ink_rect*: TPangoRectangle logical_rect*: TPangoRectangle PPangoAttrFontDesc* = ptr TPangoAttrFontDesc - TPangoAttrFontDesc* {.final.} = object + TPangoAttrFontDesc* {.final, pure.} = object attr*: TPangoAttribute desc*: PPangoFontDescription PPangoLogAttr* = ptr TPangoLogAttr - TPangoLogAttr* {.final.} = object + TPangoLogAttr* {.final, pure.} = object flag0*: guint16 PPangoCoverageLevel* = ptr TPangoCoverageLevel @@ -126,25 +126,25 @@ type PANGO_COVERAGE_NONE, PANGO_COVERAGE_FALLBACK, PANGO_COVERAGE_APPROXIMATE, PANGO_COVERAGE_EXACT PPangoBlockInfo* = ptr TPangoBlockInfo - TPangoBlockInfo* {.final.} = object + TPangoBlockInfo* {.final, pure.} = object data*: Pguchar level*: TPangoCoverageLevel PPangoCoverage* = ptr TPangoCoverage - TPangoCoverage* {.final.} = object + TPangoCoverage* {.final, pure.} = object ref_count*: int n_blocks*: int32 data_size*: int32 blocks*: PPangoBlockInfo PPangoEngineRange* = ptr TPangoEngineRange - TPangoEngineRange* {.final.} = object + TPangoEngineRange* {.final, pure.} = object start*: int32 theEnd*: int32 langs*: cstring PPangoEngineInfo* = ptr TPangoEngineInfo - TPangoEngineInfo* {.final.} = object + TPangoEngineInfo* {.final, pure.} = object id*: cstring engine_type*: cstring render_type*: cstring @@ -152,7 +152,7 @@ type n_ranges*: gint PPangoEngine* = ptr TPangoEngine - TPangoEngine* {.final.} = object + TPangoEngine* {.final, pure.} = object id*: cstring `type`*: cstring length*: gint @@ -162,7 +162,7 @@ type attrs: PPangoLogAttr, attrs_len: int32){. cdecl.} PPangoEngineLang* = ptr TPangoEngineLang - TPangoEngineLang* {.final.} = object + TPangoEngineLang* {.final, pure.} = object engine*: TPangoEngine script_break*: TPangoEngineLangScriptBreak @@ -173,7 +173,7 @@ type language: PPangoLanguage): PPangoCoverage{. cdecl.} PPangoEngineShape* = ptr TPangoEngineShape - TPangoEngineShape* {.final.} = object + TPangoEngineShape* {.final, pure.} = object engine*: TPangoEngine script_shape*: TPangoEngineShapeScript get_coverage*: TPangoEngineShapeGetCoverage @@ -191,28 +191,28 @@ type PPangoGlyphUnit* = ptr TPangoGlyphUnit TPangoGlyphUnit* = gint32 PPangoGlyphGeometry* = ptr TPangoGlyphGeometry - TPangoGlyphGeometry* {.final.} = object + TPangoGlyphGeometry* {.final, pure.} = object width*: TPangoGlyphUnit x_offset*: TPangoGlyphUnit y_offset*: TPangoGlyphUnit PPangoGlyphVisAttr* = ptr TPangoGlyphVisAttr - TPangoGlyphVisAttr* {.final.} = object + TPangoGlyphVisAttr* {.final, pure.} = object flag0*: int16 PPangoGlyphInfo* = ptr TPangoGlyphInfo - TPangoGlyphInfo* {.final.} = object + TPangoGlyphInfo* {.final, pure.} = object glyph*: TPangoGlyph geometry*: TPangoGlyphGeometry attr*: TPangoGlyphVisAttr - TPangoGlyphString* {.final.} = object + TPangoGlyphString* {.final, pure.} = object num_glyphs*: gint glyphs*: PPangoGlyphInfo log_clusters*: Pgint space*: gint - TPangoAnalysis* {.final.} = object + TPangoAnalysis* {.final, pure.} = object shape_engine*: PPangoEngineShape lang_engine*: PPangoEngineLang font*: PPangoFont @@ -220,7 +220,7 @@ type language*: PPangoLanguage extra_attrs*: PGSList - TPangoItem* {.final.} = object + TPangoItem* {.final, pure.} = object offset*: gint length*: gint num_chars*: gint @@ -233,14 +233,14 @@ type TPangoWrapMode* = enum PANGO_WRAP_WORD, PANGO_WRAP_CHAR PPangoLayoutLine* = ptr TPangoLayoutLine - TPangoLayoutLine* {.final.} = object + TPangoLayoutLine* {.final, pure.} = object layout*: PPangoLayout start_index*: gint length*: gint runs*: PGSList PPangoLayoutRun* = ptr TPangoLayoutRun - TPangoLayoutRun* {.final.} = object + TPangoLayoutRun* {.final, pure.} = object item*: PPangoItem glyphs*: PPangoGlyphString diff --git a/lib/base/x11/xcms.nim b/lib/base/x11/xcms.nim index ab535ffc3..57aad6ae0 100644 --- a/lib/base/x11/xcms.nim +++ b/lib/base/x11/xcms.nim @@ -350,31 +350,31 @@ proc XcmsVisualOfCCC*(para1: TXcmsCCC): PVisual{.cdecl, dynlib: libX11, importc. # implementation proc XcmsUndefinedFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x00000000) + result = 0x00000000'i32 proc XcmsCIEXYZFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x00000001) + result = 0x00000001'i32 proc XcmsCIEuvYFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x00000002) + result = 0x00000002'i32 proc XcmsCIExyYFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x00000003) + result = 0x00000003'i32 proc XcmsCIELabFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x00000004) + result = 0x00000004'i32 proc XcmsCIELuvFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x00000005) + result = 0x00000005'i32 proc XcmsTekHVCFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x00000006) + result = 0x00000006'i32 proc XcmsRGBFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x80000000) + result = 0x80000000'i32 proc XcmsRGBiFormat(): TXcmsColorFormat = - result = TXcmsColorFormat(0x80000001) + result = 0x80000001'i32 when defined(MACROS): proc DisplayOfCCC(ccc: int32): int32 = diff --git a/lib/base/x11/xi.nim b/lib/base/x11/xi.nim index 194b0eff4..d1b9f7846 100644 --- a/lib/base/x11/xi.nim +++ b/lib/base/x11/xi.nim @@ -219,7 +219,7 @@ const DvLed* = int(1) shl 4 DvLedMode* = int(1) shl 5 DvKey* = int(1) shl 6 - DvAutoRepeatMode* = int(1) shl 7 + DvAutoRepeatMode* = 1 shl 7 const DvString* = int(1) shl 0 diff --git a/lib/cycle.h b/lib/cycle.h new file mode 100644 index 000000000..4d714ba3f --- /dev/null +++ b/lib/cycle.h @@ -0,0 +1,514 @@ +/* + * Copyright (c) 2003, 2007 Matteo Frigo + * Copyright (c) 2003, 2007 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS 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. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + + +/* machine-dependent cycle counters code. Needs to be inlined. */ + +/***************************************************************************/ +/* To use the cycle counters in your code, simply #include "cycle.h" (this + file), and then use the functions/macros: + + ticks getticks(void); + + ticks is an opaque typedef defined below, representing the current time. + You extract the elapsed time between two calls to gettick() via: + + double elapsed(ticks t1, ticks t0); + + which returns a double-precision variable in arbitrary units. You + are not expected to convert this into human units like seconds; it + is intended only for *comparisons* of time intervals. + + (In order to use some of the OS-dependent timer routines like + Solaris' gethrtime, you need to paste the autoconf snippet below + into your configure.ac file and #include "config.h" before cycle.h, + or define the relevant macros manually if you are not using autoconf.) +*/ + +/***************************************************************************/ +/* This file uses macros like HAVE_GETHRTIME that are assumed to be + defined according to whether the corresponding function/type/header + is available on your system. The necessary macros are most + conveniently defined if you are using GNU autoconf, via the tests: + + dnl --------------------------------------------------------------------- + + AC_C_INLINE + AC_HEADER_TIME + AC_CHECK_HEADERS([sys/time.h c_asm.h intrinsics.h mach/mach_time.h]) + + AC_CHECK_TYPE([hrtime_t],[AC_DEFINE(HAVE_HRTIME_T, 1, [Define to 1 if hrtime_t is defined in <sys/time.h>])],,[#if HAVE_SYS_TIME_H +#include <sys/time.h> +#endif]) + + AC_CHECK_FUNCS([gethrtime read_real_time time_base_to_time clock_gettime mach_absolute_time]) + + dnl Cray UNICOS _rtc() (real-time clock) intrinsic + AC_MSG_CHECKING([for _rtc intrinsic]) + rtc_ok=yes + AC_TRY_LINK([#ifdef HAVE_INTRINSICS_H +#include <intrinsics.h> +#endif], [_rtc()], [AC_DEFINE(HAVE__RTC,1,[Define if you have the UNICOS _rtc() intrinsic.])], [rtc_ok=no]) + AC_MSG_RESULT($rtc_ok) + + dnl --------------------------------------------------------------------- +*/ + +/***************************************************************************/ + +#if TIME_WITH_SYS_TIME +# include <sys/time.h> +# include <time.h> +#else +# if HAVE_SYS_TIME_H +# include <sys/time.h> +# else +# include <time.h> +# endif +#endif + +#define INLINE_ELAPSED(INL) static INL double elapsed(ticks t1, ticks t0) \ +{ \ + return (double)t1 - (double)t0; \ +} + +/*----------------------------------------------------------------*/ +/* Solaris */ +#if defined(HAVE_GETHRTIME) && defined(HAVE_HRTIME_T) && !defined(HAVE_TICK_COUNTER) +typedef hrtime_t ticks; + +#define getticks gethrtime + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* AIX v. 4+ routines to read the real-time clock or time-base register */ +#if defined(HAVE_READ_REAL_TIME) && defined(HAVE_TIME_BASE_TO_TIME) && !defined(HAVE_TICK_COUNTER) +typedef timebasestruct_t ticks; + +static __inline ticks getticks(void) +{ + ticks t; + read_real_time(&t, TIMEBASE_SZ); + return t; +} + +static __inline double elapsed(ticks t1, ticks t0) /* time in nanoseconds */ +{ + time_base_to_time(&t1, TIMEBASE_SZ); + time_base_to_time(&t0, TIMEBASE_SZ); + return (((double)t1.tb_high - (double)t0.tb_high) * 1.0e9 + + ((double)t1.tb_low - (double)t0.tb_low)); +} + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* + * PowerPC ``cycle'' counter using the time base register. + */ +#if ((((defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))) || (defined(__MWERKS__) && defined(macintosh)))) || (defined(__IBM_GCC_ASM) && (defined(__powerpc__) || defined(__ppc__)))) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; + +static __inline__ ticks getticks(void) +{ + unsigned int tbl, tbu0, tbu1; + + do { + __asm__ __volatile__ ("mftbu %0" : "=r"(tbu0)); + __asm__ __volatile__ ("mftb %0" : "=r"(tbl)); + __asm__ __volatile__ ("mftbu %0" : "=r"(tbu1)); + } while (tbu0 != tbu1); + + return (((unsigned long long)tbu0) << 32) | tbl; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/* MacOS/Mach (Darwin) time-base register interface (unlike UpTime, + from Carbon, requires no additional libraries to be linked). */ +#if defined(HAVE_MACH_ABSOLUTE_TIME) && defined(HAVE_MACH_MACH_TIME_H) && !defined(HAVE_TICK_COUNTER) +#include <mach/mach_time.h> +typedef uint64_t ticks; +#define getticks mach_absolute_time +INLINE_ELAPSED(__inline__) +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* + * Pentium cycle counter + */ +#if (defined(__GNUC__) || defined(__ICC)) && defined(__i386__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; + +static __inline__ ticks getticks(void) +{ + ticks ret; + + __asm__ __volatile__("rdtsc": "=A" (ret)); + /* no input, nothing else clobbered */ + return ret; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#define TIME_MIN 5000.0 /* unreliable pentium IV cycle counter */ +#endif + +/* Visual C++ -- thanks to Morten Nissov for his help with this */ +#if _MSC_VER >= 1200 && _M_IX86 >= 500 && !defined(HAVE_TICK_COUNTER) +#include <windows.h> +typedef LARGE_INTEGER ticks; +#define RDTSC __asm __emit 0fh __asm __emit 031h /* hack for VC++ 5.0 */ + +static __inline ticks getticks(void) +{ + ticks retval; + + __asm { + RDTSC + mov retval.HighPart, edx + mov retval.LowPart, eax + } + return retval; +} + +static __inline double elapsed(ticks t1, ticks t0) +{ + return (double)t1.QuadPart - (double)t0.QuadPart; +} + +#define HAVE_TICK_COUNTER +#define TIME_MIN 5000.0 /* unreliable pentium IV cycle counter */ +#endif + +/*----------------------------------------------------------------*/ +/* + * X86-64 cycle counter + */ +#if (defined(__GNUC__) || defined(__ICC) || defined(__SUNPRO_C)) && defined(__x86_64__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; + +static __inline__ ticks getticks(void) +{ + unsigned a, d; + asm volatile("rdtsc" : "=a" (a), "=d" (d)); + return ((ticks)a) | (((ticks)d) << 32); +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/* PGI compiler, courtesy Cristiano Calonaci, Andrea Tarsi, & Roberto Gori. + NOTE: this code will fail to link unless you use the -Masmkeyword compiler + option (grrr). */ +#if defined(__PGI) && defined(__x86_64__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; +static ticks getticks(void) +{ + asm(" rdtsc; shl $0x20,%rdx; mov %eax,%eax; or %rdx,%rax; "); +} +INLINE_ELAPSED(__inline__) +#define HAVE_TICK_COUNTER +#endif + +/* Visual C++, courtesy of Dirk Michaelis */ +#if _MSC_VER >= 1400 && (defined(_M_AMD64) || defined(_M_X64)) && !defined(HAVE_TICK_COUNTER) + +#include <intrin.h> +#pragma intrinsic(__rdtsc) +typedef unsigned __int64 ticks; +#define getticks __rdtsc +INLINE_ELAPSED(__inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* + * IA64 cycle counter + */ + +/* intel's icc/ecc compiler */ +#if (defined(__EDG_VERSION) || defined(__ECC)) && defined(__ia64__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long ticks; +#include <ia64intrin.h> + +static __inline__ ticks getticks(void) +{ + return __getReg(_IA64_REG_AR_ITC); +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/* gcc */ +#if defined(__GNUC__) && defined(__ia64__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long ticks; + +static __inline__ ticks getticks(void) +{ + ticks ret; + + __asm__ __volatile__ ("mov %0=ar.itc" : "=r"(ret)); + return ret; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/* HP/UX IA64 compiler, courtesy Teresa L. Johnson: */ +#if defined(__hpux) && defined(__ia64) && !defined(HAVE_TICK_COUNTER) +#include <machine/sys/inline.h> +typedef unsigned long ticks; + +static inline ticks getticks(void) +{ + ticks ret; + + ret = _Asm_mov_from_ar (_AREG_ITC); + return ret; +} + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/* Microsoft Visual C++ */ +#if defined(_MSC_VER) && defined(_M_IA64) && !defined(HAVE_TICK_COUNTER) +typedef unsigned __int64 ticks; + +# ifdef __cplusplus +extern "C" +# endif +ticks __getReg(int whichReg); +#pragma intrinsic(__getReg) + +static __inline ticks getticks(void) +{ + volatile ticks temp; + temp = __getReg(3116); + return temp; +} + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* + * PA-RISC cycle counter + */ +#if defined(__hppa__) || defined(__hppa) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long ticks; + +# ifdef __GNUC__ +static __inline__ ticks getticks(void) +{ + ticks ret; + + __asm__ __volatile__("mfctl 16, %0": "=r" (ret)); + /* no input, nothing else clobbered */ + return ret; +} +# else +# include <machine/inline.h> +static inline unsigned long getticks(void) +{ + register ticks ret; + _MFCTL(16, ret); + return ret; +} +# endif + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* S390, courtesy of James Treacy */ +#if defined(__GNUC__) && defined(__s390__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; + +static __inline__ ticks getticks(void) +{ + ticks cycles; + __asm__("stck 0(%0)" : : "a" (&(cycles)) : "memory", "cc"); + return cycles; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif +/*----------------------------------------------------------------*/ +#if defined(__GNUC__) && defined(__alpha__) && !defined(HAVE_TICK_COUNTER) +/* + * The 32-bit cycle counter on alpha overflows pretty quickly, + * unfortunately. A 1GHz machine overflows in 4 seconds. + */ +typedef unsigned int ticks; + +static __inline__ ticks getticks(void) +{ + unsigned long cc; + __asm__ __volatile__ ("rpcc %0" : "=r"(cc)); + return (cc & 0xFFFFFFFF); +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +#if defined(__GNUC__) && defined(__sparc_v9__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long ticks; + +static __inline__ ticks getticks(void) +{ + ticks ret; + __asm__ __volatile__("rd %%tick, %0" : "=r" (ret)); + return ret; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +#if (defined(__DECC) || defined(__DECCXX)) && defined(__alpha) && defined(HAVE_C_ASM_H) && !defined(HAVE_TICK_COUNTER) +# include <c_asm.h> +typedef unsigned int ticks; + +static __inline ticks getticks(void) +{ + unsigned long cc; + cc = asm("rpcc %v0"); + return (cc & 0xFFFFFFFF); +} + +INLINE_ELAPSED(__inline) + +#define HAVE_TICK_COUNTER +#endif +/*----------------------------------------------------------------*/ +/* SGI/Irix */ +#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_SGI_CYCLE) && !defined(HAVE_TICK_COUNTER) +typedef struct timespec ticks; + +static inline ticks getticks(void) +{ + struct timespec t; + clock_gettime(CLOCK_SGI_CYCLE, &t); + return t; +} + +static inline double elapsed(ticks t1, ticks t0) +{ + return ((double)t1.tv_sec - (double)t0.tv_sec) * 1.0E9 + + ((double)t1.tv_nsec - (double)t0.tv_nsec); +} +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* Cray UNICOS _rtc() intrinsic function */ +#if defined(HAVE__RTC) && !defined(HAVE_TICK_COUNTER) +#ifdef HAVE_INTRINSICS_H +# include <intrinsics.h> +#endif + +typedef long long ticks; + +#define getticks _rtc + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* MIPS ZBus */ +#if HAVE_MIPS_ZBUS_TIMER +#if defined(__mips__) && !defined(HAVE_TICK_COUNTER) +#include <sys/mman.h> +#include <unistd.h> +#include <fcntl.h> + +typedef uint64_t ticks; + +static inline ticks getticks(void) +{ + static uint64_t* addr = 0; + + if (addr == 0) + { + uint32_t rq_addr = 0x10030000; + int fd; + int pgsize; + + pgsize = getpagesize(); + fd = open ("/dev/mem", O_RDONLY | O_SYNC, 0); + if (fd < 0) { + perror("open"); + return NULL; + } + addr = mmap(0, pgsize, PROT_READ, MAP_SHARED, fd, rq_addr); + close(fd); + if (addr == (uint64_t *)-1) { + perror("mmap"); + return NULL; + } + } + + return *addr; +} + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif +#endif /* HAVE_MIPS_ZBUS_TIMER */ + diff --git a/lib/gc.nim b/lib/gc.nim index 680256a93..344aa33f3 100644 --- a/lib/gc.nim +++ b/lib/gc.nim @@ -54,19 +54,6 @@ proc getTotalMem(): int = return tlsfMax() # --------------------------------------------------------------------------- -# After several attempts, we now use a novel approach for cycle detection: -# increments/decrements of the reference counters are enqued into a buffer -# and not immediately performed. The reason is that increments may introduce -# new garbage cycles. The cycle detector only scans the changed subgraph. This -# provides superior performance. Of course only cells that may be part of -# a cycle are considered. However, reallocation does not work with this scheme! -# Because the queue may contain references to the old cell. -# The queue is thread-local storage, so that no synchronization is needed for -# reference counting. - -# With this scheme, the entire heap is never searched and there is no need for -# the AT. - const debugGC = false # we wish to debug the GC... logGC = false @@ -89,7 +76,7 @@ const # this seems to be a good value const - MemAlignment = sizeof(pointer)*2 # minimal memory block that can be allocated + MemAlignment = 8 # BUGFIX: on AMD64, dlmalloc aligns at 8 byte boundary BitsPerUnit = sizeof(int)*8 # a "unit" is a word, i.e. 4 bytes # on a 32 bit system; I do not use the term "word" because under 32-bit @@ -255,8 +242,14 @@ proc inOperator(s: TCellSeq, c: PCell): bool {.inline.} = proc add(s: var TCellSeq, c: PCell) {.inline.} = if s.len >= s.cap: s.cap = s.cap * 3 div 2 - s.d = cast[PCellArray](tlsf_realloc(s.d, s.cap * sizeof(PCell))) - if s.d == nil: raiseOutOfMem() + var d = cast[PCellArray](tlsf_malloc(s.cap * sizeof(PCell))) + if d == nil: raiseOutOfMem() + copyMem(d, s.d, s.len * sizeof(PCell)) + tlsf_free(s.d) + s.d = d + # BUGFIX: realloc failes on AMD64, sigh... + #s.d = cast[PCellArray](tlsf_realloc(s.d, s.cap * sizeof(PCell))) + #if s.d == nil: raiseOutOfMem() s.d[s.len] = c inc(s.len) @@ -383,7 +376,7 @@ iterator elements(t: TCellSet): PCell {.inline.} = # --------------- end of Cellset routines ------------------------------------- -when logGC or traceGC: +when debugGC: proc writeCell(msg: CString, c: PCell) = var kind = -1 if c.typ != nil: kind = ord(c.typ.kind) @@ -707,7 +700,6 @@ proc collectCycles(gch: var TGcHeap) = var tabSize = 0 for c in elements(gch.cycleRoots): inc(tabSize) - assert(c.typ != nil) forallChildren(c, waCycleDecRef) gch.cycleTableSize = max(gch.cycleTableSize, tabSize) diff --git a/lib/macros.nim b/lib/macros.nim index 809531c4c..b307c00cb 100644 --- a/lib/macros.nim +++ b/lib/macros.nim @@ -30,59 +30,59 @@ # if key[-4:] == "Flag": continue # cog.out(toEnum(key, val)) #]]] -type - TNimrodTypeKind* = enum - ntyNone, ntyBool, ntyChar, ntyEmpty, - ntyArrayConstr, ntyNil, ntyGeneric, ntyGenericInst, - ntyGenericParam, ntyEnum, ntyAnyEnum, ntyArray, - ntyObject, ntyTuple, ntySet, ntyRange, - ntyPtr, ntyRef, ntyVar, ntySequence, - ntyProc, ntyPointer, ntyOpenArray, ntyString, - ntyCString, ntyForward, ntyInt, ntyInt8, - ntyInt16, ntyInt32, ntyInt64, ntyFloat, - ntyFloat32, ntyFloat64, ntyFloat128 - TNimTypeKinds* = set[TNimrodTypeKind] - TNimrodSymKind* = enum - nskUnknownSym, nskConditional, nskDynLib, nskParam, - nskTypeParam, nskTemp, nskType, nskConst, - nskVar, nskProc, nskIterator, nskConverter, - nskMacro, nskTemplate, nskField, nskEnumField, - nskForVar, nskModule, nskLabel, nskStub - TNimSymKinds* = set[TNimrodSymKind] - TNimrodNodeKind* = enum - nnkNone, nnkEmpty, nnkIdent, nnkSym, - nnkType, nnkCharLit, nnkIntLit, nnkInt8Lit, - nnkInt16Lit, nnkInt32Lit, nnkInt64Lit, nnkFloatLit, - nnkFloat32Lit, nnkFloat64Lit, nnkStrLit, nnkRStrLit, - nnkTripleStrLit, nnkMetaNode, nnkNilLit, nnkDotCall, - nnkCommand, nnkCall, nnkGenericCall, nnkExplicitTypeListCall, - nnkExprEqExpr, nnkExprColonExpr, nnkIdentDefs, nnkInfix, - nnkPrefix, nnkPostfix, nnkPar, nnkCurly, - nnkBracket, nnkBracketExpr, nnkPragmaExpr, nnkRange, - nnkDotExpr, nnkCheckedFieldExpr, nnkDerefExpr, nnkIfExpr, - nnkElifExpr, nnkElseExpr, nnkLambda, nnkAccQuoted, - nnkHeaderQuoted, nnkTableConstr, nnkQualified, nnkHiddenStdConv, - nnkHiddenSubConv, nnkHiddenCallConv, nnkConv, nnkCast, - nnkAddr, nnkHiddenAddr, nnkHiddenDeref, nnkObjDownConv, - nnkObjUpConv, nnkChckRangeF, nnkChckRange64, nnkChckRange, - nnkStringToCString, nnkCStringToString, nnkPassAsOpenArray, nnkAsgn, - nnkDefaultTypeParam, nnkGenericParams, nnkFormalParams, nnkOfInherit, - nnkModule, nnkProcDef, nnkConverterDef, nnkMacroDef, - nnkTemplateDef, nnkIteratorDef, nnkOfBranch, nnkElifBranch, - nnkExceptBranch, nnkElse, nnkMacroStmt, nnkAsmStmt, - nnkPragma, nnkIfStmt, nnkWhenStmt, nnkForStmt, - nnkWhileStmt, nnkCaseStmt, nnkVarSection, nnkConstSection, - nnkConstDef, nnkTypeSection, nnkTypeDef, nnkYieldStmt, - nnkTryStmt, nnkFinally, nnkRaiseStmt, nnkReturnStmt, - nnkBreakStmt, nnkContinueStmt, nnkBlockStmt, nnkDiscardStmt, - nnkStmtList, nnkImportStmt, nnkFromStmt, nnkImportAs, - nnkIncludeStmt, nnkAccessStmt, nnkCommentStmt, nnkStmtListExpr, - nnkBlockExpr, nnkStmtListType, nnkBlockType, nnkVm, - nnkTypeOfExpr, nnkObjectTy, nnkTupleTy, nnkRecList, - nnkRecCase, nnkRecWhen, nnkRefTy, nnkPtrTy, - nnkVarTy, nnkProcTy, nnkEnumTy, nnkEnumFieldDef, - nnkReturnToken - TNimNodeKinds* = set[TNimrodNodeKind] +type + TNimrodNodeKind* = enum + nnkNone, nnkEmpty, nnkIdent, nnkSym, + nnkType, nnkCharLit, nnkIntLit, nnkInt8Lit, + nnkInt16Lit, nnkInt32Lit, nnkInt64Lit, nnkFloatLit, + nnkFloat32Lit, nnkFloat64Lit, nnkStrLit, nnkRStrLit, + nnkTripleStrLit, nnkMetaNode, nnkNilLit, nnkDotCall, + nnkCommand, nnkCall, nnkGenericCall, nnkExplicitTypeListCall, + nnkExprEqExpr, nnkExprColonExpr, nnkIdentDefs, nnkInfix, + nnkPrefix, nnkPostfix, nnkPar, nnkCurly, + nnkBracket, nnkBracketExpr, nnkPragmaExpr, nnkRange, + nnkDotExpr, nnkCheckedFieldExpr, nnkDerefExpr, nnkIfExpr, + nnkElifExpr, nnkElseExpr, nnkLambda, nnkAccQuoted, + nnkHeaderQuoted, nnkTableConstr, nnkQualified, nnkHiddenStdConv, + nnkHiddenSubConv, nnkHiddenCallConv, nnkConv, nnkCast, + nnkAddr, nnkHiddenAddr, nnkHiddenDeref, nnkObjDownConv, + nnkObjUpConv, nnkChckRangeF, nnkChckRange64, nnkChckRange, + nnkStringToCString, nnkCStringToString, nnkPassAsOpenArray, nnkAsgn, + nnkDefaultTypeParam, nnkGenericParams, nnkFormalParams, nnkOfInherit, + nnkModule, nnkProcDef, nnkConverterDef, nnkMacroDef, + nnkTemplateDef, nnkIteratorDef, nnkOfBranch, nnkElifBranch, + nnkExceptBranch, nnkElse, nnkMacroStmt, nnkAsmStmt, + nnkPragma, nnkIfStmt, nnkWhenStmt, nnkForStmt, + nnkWhileStmt, nnkCaseStmt, nnkVarSection, nnkConstSection, + nnkConstDef, nnkTypeSection, nnkTypeDef, nnkYieldStmt, + nnkTryStmt, nnkFinally, nnkRaiseStmt, nnkReturnStmt, + nnkBreakStmt, nnkContinueStmt, nnkBlockStmt, nnkDiscardStmt, + nnkStmtList, nnkImportStmt, nnkFromStmt, nnkImportAs, + nnkIncludeStmt, nnkAccessStmt, nnkCommentStmt, nnkStmtListExpr, + nnkBlockExpr, nnkStmtListType, nnkBlockType, nnkVm, + nnkTypeOfExpr, nnkObjectTy, nnkTupleTy, nnkRecList, + nnkRecCase, nnkRecWhen, nnkRefTy, nnkPtrTy, + nnkVarTy, nnkProcTy, nnkEnumTy, nnkEnumFieldDef, + nnkReturnToken + TNimNodeKinds* = set[TNimrodNodeKind] + TNimrodTypeKind* = enum + ntyNone, ntyBool, ntyChar, ntyEmpty, + ntyArrayConstr, ntyNil, ntyGeneric, ntyGenericInst, + ntyGenericParam, ntyEnum, ntyAnyEnum, ntyArray, + ntyObject, ntyTuple, ntySet, ntyRange, + ntyPtr, ntyRef, ntyVar, ntySequence, + ntyProc, ntyPointer, ntyOpenArray, ntyString, + ntyCString, ntyForward, ntyInt, ntyInt8, + ntyInt16, ntyInt32, ntyInt64, ntyFloat, + ntyFloat32, ntyFloat64, ntyFloat128 + TNimTypeKinds* = set[TNimrodTypeKind] + TNimrodSymKind* = enum + nskUnknownSym, nskConditional, nskDynLib, nskParam, + nskTypeParam, nskTemp, nskType, nskConst, + nskVar, nskProc, nskIterator, nskConverter, + nskMacro, nskTemplate, nskField, nskEnumField, + nskForVar, nskModule, nskLabel, nskStub + TNimSymKinds* = set[TNimrodSymKind] #[[[end]]] type diff --git a/lib/os.nim b/lib/os.nim index 8ec781000..fa53fa3e2 100644 --- a/lib/os.nim +++ b/lib/os.nim @@ -1062,14 +1062,14 @@ proc cmpPaths(pathA, pathB: string): int = result = cmpIgnoreCase(pathA, pathB) proc extractDir(path: string): string = - if path[path.len-1] in {dirSep, altSep}: + if path.len == 0 or path[path.len-1] in {dirSep, altSep}: result = path else: var tail: string splitPath(path, result, tail) proc extractFilename(path: string): string = - if path[path.len-1] in {dirSep, altSep}: + if path.len == 0 or path[path.len-1] in {dirSep, altSep}: result = "" else: var head: string diff --git a/lib/osproc.nim b/lib/osproc.nim new file mode 100644 index 000000000..2282e802d --- /dev/null +++ b/lib/osproc.nim @@ -0,0 +1,395 @@ +# +# +# Nimrod's Runtime Library +# (c) Copyright 2008 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +## This module implements an advanced facility for executing OS processes. +## On Windows this module is currently broken. Please help! + +import + os, strtabs, streams + +when defined(windows): + import windows + +type + TProcess = object of TObject + when defined(windows): + FProcessHandle: Thandle + FThreadHandle: Thandle + inputHandle, outputHandle, errorHandle: TFileHandle + else: + inputHandle, outputHandle, errorHandle: TFileHandle + id: cint + exitCode: cint + + PProcess* = ref TProcess ## represents an operating system process + + TProcessOption* = enum ## options that can be passed `startProcess` + poNone, ## none option + poUseShell, ## use the shell to execute the command; NOTE: This + ## often creates a security whole! + poStdErrToStdOut ## merge stdout and stderr to the stdout stream + +proc executeProcess*(command: string, + options: set[TProcessOption] = {poStdErrToStdOut, + poUseShell}): string + ## A convience procedure that executes ``command`` with ``startProcess`` + ## and returns its output as a string. + +proc startProcess*(command: string, + workingDir: string = "", + args: openarray[string] = [], + env: PStringTable = nil, + options: set[TProcessOption] = {poStdErrToStdOut}): PProcess + ## Starts a process. `Command` is the executable file, `workingDir` is the + ## process's working directory. If ``workingDir == ""`` the current directory + ## is used. `args` are the command line arguments that are passed to the + ## process. On many operating systems, the first command line argument is the + ## name of the executable. `args` should not contain this argument! + ## `startProcess` takes care of that. `env` is the environment that will be + ## passed to the process. If ``env == nil`` the environment is inherited of + ## the parent process. `options` are additional flags that may be passed + ## to `startProcess`. See the documentation of ``TProcessOption`` for the + ## meaning of these flags. + ## Return value: The newly created process object. Nil is never returned, + ## but ``EOS`` is raised in case of an error. + +when true: + nil +else: + proc startGUIProcess*(command: string, + workingDir: string = "", + args: openarray[string] = [], + env: PStringTable = nil, + x = -1, + y = -1, + width = -1, + height = -1): PProcess + +proc suspend*(p: PProcess) + ## Suspends the process `p`. + +proc resume*(p: PProcess) + ## Resumes the process `p`. + +proc terminate*(p: PProcess) + ## Terminates the process `p`. + +proc running*(p: PProcess): bool + ## Returns true iff the process `p` is still running. Returns immediately. + +proc processID*(p: PProcess): int = + ## returns `p`'s process ID. + return p.id + +proc waitForExit*(p: PProcess): int + ## waits for the process to finish and returns `p`'s error code. + +proc inputStream*(p: PProcess): PStream + ## returns ``p``'s input stream for writing to + +proc outputStream*(p: PProcess): PStream + ## returns ``p``'s output stream for reading from + +proc errorStream*(p: PProcess): PStream + ## returns ``p``'s output stream for reading from + +proc executeProcess*(command: string, + options: set[TProcessOption] = {poStdErrToStdOut, + poUseShell}): string = + var c = parseCmdLine(command) + var a: seq[string] = @[] # slicing is not yet implemented :-( + for i in 1 .. c.len-1: add(a, c[i]) + var p = startProcess(command=c[0], args=a, options=options) + var outp = outputStream(p) + result = "" + while running(p) or not outp.atEnd(outp): + result.add(outp.readLine()) + result.add("\n") + +when false: + proc deallocCStringArray(a: cstringArray) = + var i = 0 + while a[i] != nil: + dealloc(a[i]) + inc(i) + dealloc(a) + +when defined(Windows): + # We need to implement a handle stream for Windows: + type + PFileHandleStream = ref TFileHandleStream + TFileHandleStream = object of TStream + handle: THandle + atTheEnd: bool + + proc hsClose(s: PFileHandleStream) = nil # nothing to do here + proc hsAtEnd(s: PFileHandleStream): bool = return true + + proc hsReadData(s: PFileHandleStream, buffer: pointer, bufLen: int): int = + var br: int32 + var a = windows.ReadFile(s.handle, buffer, bufLen, br, nil) + if a == 0: OSError() + result = br + #atEnd = bytesRead < bufLen + + proc hsWriteData(s: PFileHandleStream, buffer: pointer, bufLen: int) = + var bytesWritten: int32 + var a = windows.writeFile(s.handle, buffer, bufLen, bytesWritten, nil) + if a == 0: OSError() + + proc newFileHandleStream(handle: THandle): PFileHandleStream = + new(result) + result.handle = handle + result.close = hsClose + result.atEnd = hsAtEnd + result.readData = hsReadData + result.writeData = hsWriteData + + proc buildCommandLine(a: string, args: openarray[string]): cstring = + var L = a.len + for i in 0..high(args): inc(L, args[i].len+1) + result = cast[cstring](alloc0(L+1)) + copyMem(result, cstring(a), a.len) + L = a.len + for i in 0..high(args): + result[L] = ' ' + inc(L) + copyMem(addr(result[L]), cstring(args[i]), args[i].len) + inc(L, args[i].len) + + proc buildEnv(env: PStringTable): cstring = + var L = 0 + for key, val in pairs(env): inc(L, key.len + val.len + 2) + result = cast[cstring](alloc0(L+2)) + L = 0 + for key, val in pairs(env): + var x = key & "=" & val + copyMem(addr(result[L]), cstring(x), x.len+1) # copy \0 + inc(L, x.len+1) + + #proc open_osfhandle(osh: THandle, mode: int): int {. + # importc: "_open_osfhandle", header: "<fcntl.h>".} + + #var + # O_WRONLY {.importc: "_O_WRONLY", header: "<fcntl.h>".}: int + # O_RDONLY {.importc: "_O_RDONLY", header: "<fcntl.h>".}: int + + proc CreatePipeHandles(Inhandle, OutHandle: ptr THandle) = + var piInheritablePipe: TSecurityAttributes + piInheritablePipe.nlength = SizeOF(TSecurityAttributes) + piInheritablePipe.lpSecurityDescriptor = Nil + piInheritablePipe.Binherithandle = 1 + if CreatePipe(Inhandle, Outhandle, addr(piInheritablePipe), 0) == 0'i32: + OSError() + + proc startProcess*(command: string, + workingDir: string = "", + args: openarray[string] = [], + env: PStringTable = nil, + options: set[TProcessOption] = {poStdErrToStdOut}): PProcess = + new(result) + var + SI: TStartupInfo + ProcInfo: TProcessInformation + success: int + hi, ho, he: THandle + SI.cb = SizeOf(SI) + SI.dwFlags = STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES + CreatePipeHandles(addr(SI.hStdInput), addr(HI)) + CreatePipeHandles(addr(HO), addr(Si.hStdOutput)) + #SI.hStdInput = GetStdHandle(STD_INPUT_HANDLE()) + #SI.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE()) + if poStdErrToStdOut in options: + SI.hStdError = SI.hStdOutput + HE = HO + else: + CreatePipeHandles(addr(HE), addr(Si.hStdError)) + #SI.hStdError = GetStdHandle(STD_ERROR_HANDLE()) + #result.inputHandle = open_osfhandle(HI, O_WRONLY) + #if result.inputHandle == -1'i32: OSError() + result.inputHandle = hi + result.outputHandle = ho + result.errorHandle = he + #result.outputHandle = open_osfhandle(HO, O_RDONLY) + #if result.outputHandle == -1'i32: OSError() + #result.errorHandle = open_osfhandle(HE, O_RDONLY) + #if result.errorHandle == -1'i32: OSError() + var cmdl = buildCommandLine(command, args) + var wd: cstring = nil + if len(workingDir) > 0: wd = workingDir + if env == nil: + success = Windows.CreateProcess(nil, + cmdl, nil, nil, 0, + NORMAL_PRIORITY_CLASS, nil, wd, + addr(SI), addr(ProcInfo)) + else: + var e = buildEnv(env) + success = Windows.CreateProcess(nil, + cmdl, nil, nil, 0, + NORMAL_PRIORITY_CLASS, e, wd, + addr(SI), addr(ProcInfo)) + dealloc(e) + dealloc(cmdl) + if success == 0: + OSError() + result.FProcessHandle = procInfo.hProcess + result.FThreadHandle = procInfo.hThread + result.id = procInfo.dwProcessID + + proc suspend(p: PProcess) = + discard SuspendThread(p.FThreadHandle) + + proc resume(p: PProcess) = + discard ResumeThread(p.FThreadHandle) + + proc running(p: PProcess): bool = + var x = waitForSingleObject(p.FThreadHandle, 50) + return x == WAIT_TIMEOUT + + proc terminate(p: PProcess) = + if running(p): + discard TerminateProcess(p.FProcessHandle, 0) + + proc waitForExit(p: PProcess): int = + discard WaitForSingleObject(p.FThreadHandle, Infinite) + var res: dword + discard GetExitCodeProcess(p.FProcessHandle, res) + result = res + discard CloseHandle(p.FThreadHandle) + discard CloseHandle(p.FProcessHandle) + + proc inputStream(p: PProcess): PStream = + result = newFileHandleStream(p.inputHandle) + + proc outputStream(p: PProcess): PStream = + result = newFileHandleStream(p.outputHandle) + + proc errorStream(p: PProcess): PStream = + result = newFileHandleStream(p.errorHandle) + +else: + import posix + + const + readIdx = 0 + writeIdx = 1 + + proc addCmdArgs(command: string, args: openarray[string]): string = + result = command + for i in 0 .. high(args): + add(result, " ") + add(result, args[i]) + + proc toCStringArray(b, a: openarray[string]): cstringArray = + result = cast[cstringArray](alloc0((a.len + b.len + 1) * sizeof(cstring))) + for i in 0..high(b): + result[i] = cast[cstring](alloc(b[i].len+1)) + copyMem(result[i], cstring(b[i]), b[i].len+1) + for i in 0..high(a): + result[i+b.len] = cast[cstring](alloc(a[i].len+1)) + copyMem(result[i+b.len], cstring(a[i]), a[i].len+1) + + proc ToCStringArray(t: PStringTable): cstringArray = + result = cast[cstringArray](alloc0((t.len + 1) * sizeof(cstring))) + var i = 0 + for key, val in pairs(t): + var x = key & "=" & val + result[i] = cast[cstring](alloc(x.len+1)) + copyMem(result[i], addr(x[0]), x.len+1) + inc(i) + + proc startProcess*(command: string, + workingDir: string = "", + args: openarray[string] = [], + env: PStringTable = nil, + options: set[TProcessOption] = {poStdErrToStdOut}): PProcess = + new(result) + var + p_stdin, p_stdout, p_stderr: array [0..1, cint] + if pipe(p_stdin) != 0'i32 or pipe(p_stdout) != 0'i32: + OSError("failed to create a pipe") + var Pid = fork() + if Pid < 0: + OSError("failed to fork process") + + if pid == 0: + ## child process: + discard close(p_stdin[writeIdx]) + discard dup2(p_stdin[readIdx], readIdx) + discard close(p_stdout[readIdx]) + discard dup2(p_stdout[writeIdx], writeIdx) + if poStdErrToStdOut in options: + discard dup2(p_stdout[writeIdx], 2) + else: + if pipe(p_stderr) != 0'i32: OSError("failed to create a pipe") + discard close(p_stderr[readIdx]) + discard dup2(p_stderr[writeIdx], 2) + + if workingDir.len > 0: + os.setCurrentDir(workingDir) + if poUseShell notin options: + var a = toCStringArray([extractFilename(command)], args) + if env == nil: + discard execv(command, a) + else: + discard execve(command, a, ToCStringArray(env)) + else: + var x = addCmdArgs(command, args) + var a = toCStringArray(["sh", "-c"], [x]) + if env == nil: + discard execv("/bin/sh", a) + else: + discard execve("/bin/sh", a, ToCStringArray(env)) + # too risky to raise an exception here: + echo("execve call failed: " & $strerror(errno)) + quit(1) + # Parent process. Copy process information. + result.id = pid + + result.inputHandle = p_stdin[writeIdx] + result.outputHandle = p_stdout[readIdx] + if poStdErrToStdOut in options: + result.errorHandle = result.outputHandle + else: + result.errorHandle = p_stderr[readIdx] + discard close(p_stderr[writeIdx]) + discard close(p_stdin[readIdx]) + discard close(p_stdout[writeIdx]) + + proc suspend(p: PProcess) = + discard kill(p.id, SIGSTOP) + + proc resume(p: PProcess) = + discard kill(p.id, SIGCONT) + + proc running(p: PProcess): bool = + result = waitPid(p.id, p.exitCode, WNOHANG) == int(p.id) + + proc terminate(p: PProcess) = + if kill(p.id, SIGTERM) == 0'i32: + if running(p): discard kill(p.id, SIGKILL) + + proc waitForExit(p: PProcess): int = + if waitPid(p.id, p.exitCode, 0) == int(p.id): + result = p.exitCode + + proc inputStream(p: PProcess): PStream = + var f: TFile + if not openFile(f, p.inputHandle, fmWrite): OSError() + result = newFileStream(f) + + proc outputStream(p: PProcess): PStream = + var f: TFile + if not openFile(f, p.outputHandle, fmRead): OSError() + result = newFileStream(f) + + proc errorStream(p: PProcess): PStream = + var f: TFile + if not openFile(f, p.errorHandle, fmRead): OSError() + result = newFileStream(f) diff --git a/lib/profiler.nim b/lib/profiler.nim new file mode 100644 index 000000000..97c7dcfeb --- /dev/null +++ b/lib/profiler.nim @@ -0,0 +1,61 @@ +# +# +# Nimrod's Runtime Library +# (c) Copyright 2008 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +# This file implements the Nimrod profiler. The profiler needs support by the +# code generator. + +type + TProfileData {.compilerproc, final.} = object + procname: cstring + total: float + +var + profileData {.compilerproc.}: array [0..64*1024-1, TProfileData] + +proc sortProfile(a: var array[0..64*1024-1, TProfileData], N: int) = + # we use shellsort here; fast enough and simple + var h = 1 + while true: + h = 3 * h + 1 + if h > N: break + while true: + h = h div 3 + for i in countup(h, N - 1): + var v = a[i] + var j = i + while a[j-h].total <= v.total: + a[j] = a[j-h] + j = j-h + if j < h: break + a[j] = v + if h == 1: break + +proc writeProfile() {.noconv.} = + const filename = "profile_results" + var i = 0 + var f: TFile + var j = 1 + while openFile(f, filename & $j & ".txt"): + closeFile(f) + inc(j) + if openFile(f, filename & $j & ".txt", fmWrite): + var N = 0 + # we have to compute the actual length of the array: + while profileData[N].procname != nil: inc(N) + sortProfile(profileData, N) + writeln(f, "total running time of each proc" & + " (interpret these numbers relatively)") + while profileData[i].procname != nil: + write(f, profileData[i].procname) + write(f, ": ") + writeln(f, profileData[i].total) + inc(i) + closeFile(f) + +addQuitProc(writeProfile) diff --git a/lib/streams.nim b/lib/streams.nim new file mode 100644 index 000000000..f09b91625 --- /dev/null +++ b/lib/streams.nim @@ -0,0 +1,244 @@ +# +# +# Nimrod's Runtime Library +# (c) Copyright 2008 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +## This module provides a stream interface and two implementations thereof: +## the `PFileStream` and the `PStringStream` which implement the stream +## interface for Nimrod file objects (`TFile`) and strings. Other modules +## may provide other implementations for this standard stream interface. + +proc newEIO(msg: string): ref EIO = + new(result) + result.msg = msg + +type + PStream* = ref TStream + TStream* = object of TObject ## Stream interface that supports + ## writing or reading. + close*: proc (s: PStream) + atEnd*: proc (s: PStream): bool + setPosition*: proc (s: PStream, pos: int) + getPosition*: proc (s: PStream): int + readData*: proc (s: PStream, buffer: pointer, bufLen: int): int + writeData*: proc (s: PStream, buffer: pointer, bufLen: int) + +proc write*[T](s: PStream, x: T) = + ## generic write procedure. Writes `x` to the stream `s`. Implementation: + ## + ## .. code-block:: Nimrod + ## + ## s.writeData(s, addr(x), sizeof(x)) + var x = x + s.writeData(s, addr(x), sizeof(x)) + +proc write*(s: PStream, x: string) = + ## writes the string `x` to the the stream `s`. No length field or + ## terminating zero is written. + s.writeData(s, cstring(x), x.len) + +proc read[T](s: PStream, result: var T) = + ## generic write procedure. Reads `result` from the stream `s`. + if s.readData(s, addr(result), sizeof(T)) != sizeof(T): + raise newEIO("cannot read from stream") + +proc readChar*(s: PStream): char = + ## reads a char from the stream `s`. Raises `EIO` if an error occured. + read(s, result) + +proc readBool*(s: PStream): bool = + ## reads a bool from the stream `s`. Raises `EIO` if an error occured. + read(s, result) + +proc readInt8*(s: PStream): int8 = + ## reads an int8 from the stream `s`. Raises `EIO` if an error occured. + read(s, result) + +proc readInt16*(s: PStream): int16 = + ## reads an int16 from the stream `s`. Raises `EIO` if an error occured. + read(s, result) + +proc readInt32*(s: PStream): int32 = + ## reads an int32 from the stream `s`. Raises `EIO` if an error occured. + read(s, result) + +proc readInt64*(s: PStream): int64 = + ## reads an int64 from the stream `s`. Raises `EIO` if an error occured. + read(s, result) + +proc readFloat32*(s: PStream): float32 = + ## reads a float32 from the stream `s`. Raises `EIO` if an error occured. + read(s, result) + +proc readFloat64*(s: PStream): float64 = + ## reads a float64 from the stream `s`. Raises `EIO` if an error occured. + read(s, result) + +proc readStr*(s: PStream, length: int): string = + ## reads a string of length `length` from the stream `s`. Raises `EIO` if + ## an error occured. + result = newString(length) + var L = s.readData(s, addr(result[0]), length) + if L != length: setLen(result, L) + +proc readLine*(s: PStream): string = + ## Reads a line from a stream `s`. Note: This is not very efficient. Raises + ## `EIO` if an error occured. + result = "" + while not s.atEnd(s): + var c = readChar(s) + if c == '\c': + c = readChar(s) + break + elif c == '\L': break + result.add(c) + +type + PStringStream* = ref TStringStream ## a stream that encapsulates a string + TStringStream* = object of TStream + data: string + pos: int + +proc ssAtEnd(s: PStringStream): bool = + return s.pos >= s.data.len + +proc ssSetPosition(s: PStringStream, pos: int) = + s.pos = min(pos, s.data.len-1) + +proc ssGetPosition(s: PStringStream): int = + return s.pos + +proc ssReadData(s: PStringStream, buffer: pointer, bufLen: int): int = + result = min(bufLen, s.data.len - s.pos) + if result > 0: + copyMem(buffer, addr(s.data[s.pos]), result) + inc(s.pos, result) + +proc ssWriteData(s: PStringStream, buffer: pointer, bufLen: int) = + if bufLen > 0: + setLen(s.data, s.data.len + bufLen) + copyMem(addr(s.data[s.pos]), buffer, bufLen) + inc(s.pos, bufLen) + +proc ssClose(s: PStringStream) = + s.data = nil + +proc newStringStream*(s: string = ""): PStringStream = + ## creates a new stream from the string `s`. + new(result) + result.data = s + result.pos = 0 + result.close = ssClose + result.atEnd = ssAtEnd + result.setPosition = ssSetPosition + result.getPosition = ssGetPosition + result.readData = ssReadData + result.writeData = ssWriteData + +type + PFileStream* = ref TFileStream ## a stream that encapsulates a `TFile` + TFileStream* = object of TStream + f: TFile + +proc fsClose(s: PFileStream) = closeFile(s.f) +proc fsAtEnd(s: PFileStream): bool = return EndOfFile(s.f) +proc fsSetPosition(s: PFileStream, pos: int) = setFilePos(s.f, pos) +proc fsGetPosition(s: PFileStream): int = return int(getFilePos(s.f)) + +proc fsReadData(s: PFileStream, buffer: pointer, bufLen: int): int = + result = readBuffer(s.f, buffer, bufLen) + +proc fsWriteData(s: PFileStream, buffer: pointer, bufLen: int) = + if writeBuffer(s.f, buffer, bufLen) != bufLen: + raise newEIO("cannot write to stream") + +proc newFileStream*(f: TFile): PFileStream = + ## creates a new stream from the file `f`. + new(result) + result.f = f + result.close = fsClose + result.atEnd = fsAtEnd + result.setPosition = fsSetPosition + result.getPosition = fsGetPosition + result.readData = fsReadData + result.writeData = fsWriteData + +proc newFileStream*(filename: string, mode: TFileMode): PFileStream = + ## creates a new stream from the file named `filename` with the mode `mode`. + ## If the file cannot be opened, nil is returned. + var f: TFile + if OpenFile(f, filename, mode): result = newFileStream(f) + + +when true: + nil +else: + type + TFileHandle* = cint ## Operating system file handle + PFileHandleStream* = ref TFileHandleStream + TFileHandleStream* = object of TStream + handle*: TFileHandle + pos: int + + proc newEOS(msg: string): ref EOS = + new(result) + result.msg = msg + + proc hsGetPosition(s: PFileHandleStream): int = + return s.pos + + when defined(windows): + # do not import windows as this increases compile times: + nil + else: + import posix + + proc hsSetPosition(s: PFileHandleStream, pos: int) = + discard lseek(s.handle, pos, SEEK_SET) + + proc hsClose(s: PFileHandleStream) = discard close(s.handle) + proc hsAtEnd(s: PFileHandleStream): bool = + var pos = hsGetPosition(s) + var theEnd = lseek(s.handle, 0, SEEK_END) + result = pos >= theEnd + hsSetPosition(s, pos) # set position back + + proc hsReadData(s: PFileHandleStream, buffer: pointer, bufLen: int): int = + result = posix.read(s.handle, buffer, bufLen) + inc(s.pos, result) + + proc hsWriteData(s: PFileHandleStream, buffer: pointer, bufLen: int) = + if posix.write(s.handle, buffer, bufLen) != bufLen: + raise newEIO("cannot write to stream") + inc(s.pos, bufLen) + + proc newFileHandleStream*(handle: TFileHandle): PFileHandleStream = + new(result) + result.handle = handle + result.pos = 0 + result.close = hsClose + result.atEnd = hsAtEnd + result.setPosition = hsSetPosition + result.getPosition = hsGetPosition + result.readData = hsReadData + result.writeData = hsWriteData + + proc newFileHandleStream*(filename: string, + mode: TFileMode): PFileHandleStream = + when defined(windows): + nil + else: + var flags: cint + case mode + of fmRead: flags = posix.O_RDONLY + of fmWrite: flags = O_WRONLY or int(O_CREAT) + of fmReadWrite: flags = O_RDWR or int(O_CREAT) + of fmReadWriteExisting: flags = O_RDWR + of fmAppend: flags = O_WRONLY or int(O_CREAT) or O_APPEND + var handle = open(filename, flags) + if handle < 0: raise newEOS("posix.open() call failed") + result = newFileHandleStream(handle) diff --git a/lib/sysio.nim b/lib/sysio.nim index 8887effa8..c178ff559 100644 --- a/lib/sysio.nim +++ b/lib/sysio.nim @@ -53,6 +53,16 @@ proc readLine(f: TFile): string = result = "" rawReadLine(f, result) +proc write(f: TFile, s: string) = fputs(s, f) +proc write(f: TFile, i: int) = fprintf(f, "%ld", i) +proc write(f: TFile, b: bool) = + if b: write(f, "true") + else: write(f, "false") +proc write(f: TFile, r: float) = fprintf(f, "%g", r) +proc write(f: TFile, c: Char) = putc(c, f) +proc write(f: TFile, a: openArray[string]) = + for x in items(a): write(f, x) + proc readFile(filename: string): string = var f: TFile try: @@ -68,16 +78,6 @@ proc readFile(filename: string): string = except EIO: result = nil -proc write(f: TFile, s: string) = fputs(s, f) -proc write(f: TFile, i: int) = fprintf(f, "%ld", i) -proc write(f: TFile, b: bool) = - if b: write(f, "true") - else: write(f, "false") -proc write(f: TFile, r: float) = fprintf(f, "%g", r) -proc write(f: TFile, c: Char) = putc(c, f) -proc write(f: TFile, a: openArray[string]) = - for x in items(a): write(f, x) - proc EndOfFile(f: TFile): bool = # do not blame me; blame the ANSI C standard this is so brain-damaged var diff --git a/lib/target.h b/lib/target.h new file mode 100644 index 000000000..1afd62aef --- /dev/null +++ b/lib/target.h @@ -0,0 +1,12 @@ +#ifndef _TARGET_H_ +#define _TARGET_H_ + +#include <pthread.h> + +#define TLSF_MLOCK_T pthread_mutex_t +#define TLSF_CREATE_LOCK(l) pthread_mutex_init (l, NULL) +#define TLSF_DESTROY_LOCK(l) pthread_mutex_destroy(l) +#define TLSF_ACQUIRE_LOCK(l) pthread_mutex_lock(l) +#define TLSF_RELEASE_LOCK(l) pthread_mutex_unlock(l) + +#endif diff --git a/lib/tlsf.c b/lib/tlsf.c new file mode 100644 index 000000000..767299ed6 --- /dev/null +++ b/lib/tlsf.c @@ -0,0 +1,1005 @@ +/* + * Two Levels Segregate Fit memory allocator (TLSF) + * Version 2.4.3 + * + * Written by Miguel Masmano Tello <mimastel@doctor.upv.es> + * + * Thanks to Ismael Ripoll for his suggestions and reviews + * + * Copyright (C) 2008, 2007, 2006, 2005, 2004 + * + * This code is released using a dual license strategy: GPL/LGPL + * You can choose the licence that better fits your requirements. + * + * Released under the terms of the GNU General Public License Version 2.0 + * Released under the terms of the GNU Lesser General Public License Version 2.1 + * + */ + +/* + * Code contributions: + * + * (Jul 28 2007) Herman ten Brugge <hermantenbrugge@home.nl>: + * + * - Add 64 bit support. It now runs on x86_64 and solaris64. + * - I also tested this on vxworks/32and solaris/32 and i386/32 processors. + * - Remove assembly code. I could not measure any performance difference + * on my core2 processor. This also makes the code more portable. + * - Moved defines/typedefs from tlsf.h to tlsf.c + * - Changed MIN_BLOCK_SIZE to sizeof (free_ptr_t) and BHDR_OVERHEAD to + * (sizeof (bhdr_t) - MIN_BLOCK_SIZE). This does not change the fact + * that the minumum size is still sizeof + * (bhdr_t). + * - Changed all C++ comment style to C style. (// -> /.* ... *./) + * - Used ls_bit instead of ffs and ms_bit instead of fls. I did this to + * avoid confusion with the standard ffs function which returns + * different values. + * - Created set_bit/clear_bit fuctions because they are not present + * on x86_64. + * - Added locking support + extra file target.h to show how to use it. + * - Added get_used_size function (REMOVED in 2.4) + * - Added rtl_realloc and rtl_calloc function + * - Implemented realloc clever support. + * - Added some test code in the example directory. + * + * + * (Oct 23 2006) Adam Scislowicz: + * + * - Support for ARMv5 implemented + * + */ + +/************************************************************************/ + +#define USE_SBRK (1) +#define USE_MMAP (1) +#define TLSF_STATISTIC (1) + +#include <stdio.h> +#include <string.h> + +#ifndef TLSF_USE_LOCKS +#define TLSF_USE_LOCKS (0) +#endif + +#ifndef TLSF_STATISTIC +#define TLSF_STATISTIC (0) +#endif + +#ifndef USE_MMAP +#define USE_MMAP (0) +#endif + +#ifndef USE_SBRK +#define USE_SBRK (0) +#endif + + +#if TLSF_USE_LOCKS +#include "target.h" +#else +#define TLSF_CREATE_LOCK(_unused_) do {} while(0) +#define TLSF_DESTROY_LOCK(_unused_) do {} while(0) +#define TLSF_ACQUIRE_LOCK(_unused_) do {} while(0) +#define TLSF_RELEASE_LOCK(_unused_) do {} while(0) +#endif + +#if TLSF_STATISTIC +#define TLSF_ADD_SIZE(tlsf, b) do { \ + tlsf->used_size += (b->size & BLOCK_SIZE) + BHDR_OVERHEAD; \ + if (tlsf->used_size > tlsf->max_size) \ + tlsf->max_size = tlsf->used_size; \ + } while(0) + +#define TLSF_REMOVE_SIZE(tlsf, b) do { \ + tlsf->used_size -= (b->size & BLOCK_SIZE) + BHDR_OVERHEAD; \ + } while(0) +#else +#define TLSF_ADD_SIZE(tlsf, b) do{}while(0) +#define TLSF_REMOVE_SIZE(tlsf, b) do{}while(0) +#endif + +#if USE_MMAP || USE_SBRK +#include <unistd.h> +#endif + +#if USE_MMAP +#include <sys/mman.h> +#endif + +#include "tlsf.h" + +#if !defined(__GNUC__) +#ifndef __inline__ +#define __inline__ +#endif +#endif + +/* The debug functions only can be used when _DEBUG_TLSF_ is set. */ +#ifndef _DEBUG_TLSF_ +#define _DEBUG_TLSF_ (0) +#endif + +/*************************************************************************/ +/* Definition of the structures used by TLSF */ + + +/* Some IMPORTANT TLSF parameters */ +/* Unlike the preview TLSF versions, now they are statics */ +#define BLOCK_ALIGN (sizeof(void *) * 2) + +#define MAX_FLI (30) +#define MAX_LOG2_SLI (5) +#define MAX_SLI (1 << MAX_LOG2_SLI) /* MAX_SLI = 2^MAX_LOG2_SLI */ + +#define FLI_OFFSET (6) /* tlsf structure just will manage blocks bigger */ +/* than 128 bytes */ +#define SMALL_BLOCK (128) +#define REAL_FLI (MAX_FLI - FLI_OFFSET) +#define MIN_BLOCK_SIZE (sizeof (free_ptr_t)) +#define BHDR_OVERHEAD (sizeof (bhdr_t) - MIN_BLOCK_SIZE) +#define TLSF_SIGNATURE (0x2A59FA59) + +#define PTR_MASK (sizeof(void *) - 1) +#define BLOCK_SIZE (0xFFFFFFFF - PTR_MASK) + +#define GET_NEXT_BLOCK(_addr, _r) ((bhdr_t *) ((char *) (_addr) + (_r))) +#define MEM_ALIGN ((BLOCK_ALIGN) - 1) +#define ROUNDUP_SIZE(_r) (((_r) + MEM_ALIGN) & ~MEM_ALIGN) +#define ROUNDDOWN_SIZE(_r) ((_r) & ~MEM_ALIGN) +#define ROUNDUP(_x, _v) ((((~(_x)) + 1) & ((_v)-1)) + (_x)) + +#define BLOCK_STATE (0x1) +#define PREV_STATE (0x2) + +/* bit 0 of the block size */ +#define FREE_BLOCK (0x1) +#define USED_BLOCK (0x0) + +/* bit 1 of the block size */ +#define PREV_FREE (0x2) +#define PREV_USED (0x0) + + +#define DEFAULT_AREA_SIZE (1024*10) + +#ifdef USE_MMAP +#define PAGE_SIZE (getpagesize()) +#endif + +#define PRINT_MSG(fmt, args...) printf(fmt, ## args) +#define ERROR_MSG(fmt, args...) printf(fmt, ## args) + +typedef unsigned int u32_t; /* NOTE: Make sure that this type is 4 bytes long on your computer */ +typedef unsigned char u8_t; /* NOTE: Make sure that this type is 1 byte on your computer */ + +typedef struct free_ptr_struct { + struct bhdr_struct *prev; + struct bhdr_struct *next; +} free_ptr_t; + +typedef struct bhdr_struct { + /* This pointer is just valid if the first bit of size is set */ + struct bhdr_struct *prev_hdr; + /* The size is stored in bytes */ + size_t size; /* bit 0 indicates whether the block is used and */ + /* bit 1 allows to know whether the previous block is free */ + union { + struct free_ptr_struct free_ptr; + u8_t buffer[1]; /*sizeof(struct free_ptr_struct)]; */ + } ptr; +} bhdr_t; + +/* This structure is embedded at the beginning of each area, giving us + * enough information to cope with a set of areas */ + +typedef struct area_info_struct { + bhdr_t *end; + struct area_info_struct *next; +} area_info_t; + +typedef struct TLSF_struct { + /* the TLSF's structure signature */ + u32_t tlsf_signature; + +#if TLSF_USE_LOCKS + TLSF_MLOCK_T lock; +#endif + +#if TLSF_STATISTIC + /* These can not be calculated outside tlsf because we + * do not know the sizes when freeing/reallocing memory. */ + size_t used_size; + size_t max_size; +#endif + + /* A linked list holding all the existing areas */ + area_info_t *area_head; + + /* the first-level bitmap */ + /* This array should have a size of REAL_FLI bits */ + u32_t fl_bitmap; + + /* the second-level bitmap */ + u32_t sl_bitmap[REAL_FLI]; + + bhdr_t *matrix[REAL_FLI][MAX_SLI]; +} tlsf_t; + + +/******************************************************************/ +/************** Helping functions **************************/ +/******************************************************************/ +static __inline__ void set_bit(int nr, u32_t * addr); +static __inline__ void clear_bit(int nr, u32_t * addr); +static __inline__ int ls_bit(int x); +static __inline__ int ms_bit(int x); +static __inline__ void MAPPING_SEARCH(size_t * _r, int *_fl, int *_sl); +static __inline__ void MAPPING_INSERT(size_t _r, int *_fl, int *_sl); +static __inline__ bhdr_t *FIND_SUITABLE_BLOCK(tlsf_t * _tlsf, int *_fl, int *_sl); +static __inline__ bhdr_t *process_area(void *area, size_t size); +#if USE_SBRK || USE_MMAP +static __inline__ void *get_new_area(size_t * size); +#endif + +static const int table[] = { + -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, + 4, 4, + 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, + 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, + 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, + 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, + 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, + 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, + 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, + 7, 7, 7, 7, 7, 7, 7 +}; + +static __inline__ int ls_bit(int i) +{ + unsigned int a; + unsigned int x = i & -i; + + a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24); + return table[x >> a] + a; +} + +static __inline__ int ms_bit(int i) +{ + unsigned int a; + unsigned int x = (unsigned int) i; + + a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24); + return table[x >> a] + a; +} + +static __inline__ void set_bit(int nr, u32_t * addr) +{ + addr[nr >> 5] |= 1 << (nr & 0x1f); +} + +static __inline__ void clear_bit(int nr, u32_t * addr) +{ + addr[nr >> 5] &= ~(1 << (nr & 0x1f)); +} + +static __inline__ void MAPPING_SEARCH(size_t * _r, int *_fl, int *_sl) +{ + int _t; + + if (*_r < SMALL_BLOCK) { + *_fl = 0; + *_sl = *_r / (SMALL_BLOCK / MAX_SLI); + } else { + _t = (1 << (ms_bit(*_r) - MAX_LOG2_SLI)) - 1; + *_r = *_r + _t; + *_fl = ms_bit(*_r); + *_sl = (*_r >> (*_fl - MAX_LOG2_SLI)) - MAX_SLI; + *_fl -= FLI_OFFSET; + /*if ((*_fl -= FLI_OFFSET) < 0) // FL wil be always >0! + *_fl = *_sl = 0; + */ + *_r &= ~_t; + } +} + +static __inline__ void MAPPING_INSERT(size_t _r, int *_fl, int *_sl) +{ + if (_r < SMALL_BLOCK) { + *_fl = 0; + *_sl = _r / (SMALL_BLOCK / MAX_SLI); + } else { + *_fl = ms_bit(_r); + *_sl = (_r >> (*_fl - MAX_LOG2_SLI)) - MAX_SLI; + *_fl -= FLI_OFFSET; + } +} + + +static __inline__ bhdr_t *FIND_SUITABLE_BLOCK(tlsf_t * _tlsf, int *_fl, int *_sl) +{ + u32_t _tmp = _tlsf->sl_bitmap[*_fl] & (~0 << *_sl); + bhdr_t *_b = NULL; + + if (_tmp) { + *_sl = ls_bit(_tmp); + _b = _tlsf->matrix[*_fl][*_sl]; + } else { + *_fl = ls_bit(_tlsf->fl_bitmap & (~0 << (*_fl + 1))); + if (*_fl > 0) { /* likely */ + *_sl = ls_bit(_tlsf->sl_bitmap[*_fl]); + _b = _tlsf->matrix[*_fl][*_sl]; + } + } + return _b; +} + + +#define EXTRACT_BLOCK_HDR(_b, _tlsf, _fl, _sl) do { \ + _tlsf -> matrix [_fl] [_sl] = _b -> ptr.free_ptr.next; \ + if (_tlsf -> matrix[_fl][_sl]) \ + _tlsf -> matrix[_fl][_sl] -> ptr.free_ptr.prev = NULL; \ + else { \ + clear_bit (_sl, &_tlsf -> sl_bitmap [_fl]); \ + if (!_tlsf -> sl_bitmap [_fl]) \ + clear_bit (_fl, &_tlsf -> fl_bitmap); \ + } \ + _b -> ptr.free_ptr.prev = NULL; \ + _b -> ptr.free_ptr.next = NULL; \ + }while(0) + + +#define EXTRACT_BLOCK(_b, _tlsf, _fl, _sl) do { \ + if (_b -> ptr.free_ptr.next) \ + _b -> ptr.free_ptr.next -> ptr.free_ptr.prev = _b -> ptr.free_ptr.prev; \ + if (_b -> ptr.free_ptr.prev) \ + _b -> ptr.free_ptr.prev -> ptr.free_ptr.next = _b -> ptr.free_ptr.next; \ + if (_tlsf -> matrix [_fl][_sl] == _b) { \ + _tlsf -> matrix [_fl][_sl] = _b -> ptr.free_ptr.next; \ + if (!_tlsf -> matrix [_fl][_sl]) { \ + clear_bit (_sl, &_tlsf -> sl_bitmap[_fl]); \ + if (!_tlsf -> sl_bitmap [_fl]) \ + clear_bit (_fl, &_tlsf -> fl_bitmap); \ + } \ + } \ + _b -> ptr.free_ptr.prev = NULL; \ + _b -> ptr.free_ptr.next = NULL; \ + } while(0) + +#define INSERT_BLOCK(_b, _tlsf, _fl, _sl) do { \ + _b -> ptr.free_ptr.prev = NULL; \ + _b -> ptr.free_ptr.next = _tlsf -> matrix [_fl][_sl]; \ + if (_tlsf -> matrix [_fl][_sl]) \ + _tlsf -> matrix [_fl][_sl] -> ptr.free_ptr.prev = _b; \ + _tlsf -> matrix [_fl][_sl] = _b; \ + set_bit (_sl, &_tlsf -> sl_bitmap [_fl]); \ + set_bit (_fl, &_tlsf -> fl_bitmap); \ + } while(0) + +#ifndef MAP_ANONYMOUS +# ifdef MAP_ANON +# define MAP_ANONYMOUS MAP_ANON +# else +# define MAP_ANONYMOUS 0x20 +# endif +#endif + +#if USE_SBRK || USE_MMAP +static __inline__ void *get_new_area(size_t * size) +{ + void *area; + +#if USE_SBRK + area = (void *)sbrk(0); + if (((void *)sbrk(*size)) != ((void *) -1)) + return area; +#endif + +#if USE_MMAP + *size = ROUNDUP(*size, PAGE_SIZE); + if ((area = mmap(0, *size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)) != MAP_FAILED) + return area; +#endif + return ((void *) ~0); +} +#endif + +static __inline__ bhdr_t *process_area(void *area, size_t size) +{ + bhdr_t *b, *lb, *ib; + area_info_t *ai; + + ib = (bhdr_t *) area; + ib->size = + (sizeof(area_info_t) < + MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(sizeof(area_info_t)) | USED_BLOCK | PREV_USED; + b = (bhdr_t *) GET_NEXT_BLOCK(ib->ptr.buffer, ib->size & BLOCK_SIZE); + b->size = ROUNDDOWN_SIZE(size - 3 * BHDR_OVERHEAD - (ib->size & BLOCK_SIZE)) | USED_BLOCK | PREV_USED; + b->ptr.free_ptr.prev = b->ptr.free_ptr.next = 0; + lb = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); + lb->prev_hdr = b; + lb->size = 0 | USED_BLOCK | PREV_FREE; + ai = (area_info_t *) ib->ptr.buffer; + ai->next = 0; + ai->end = lb; + return ib; +} + +/******************************************************************/ +/******************** Begin of the allocator code *****************/ +/******************************************************************/ + +static char *mp = NULL; /* Default memory pool. */ + +/******************************************************************/ +size_t init_memory_pool(size_t mem_pool_size, void *mem_pool) +{ +/******************************************************************/ + tlsf_t *tlsf; + bhdr_t *b, *ib; + + if (!mem_pool || !mem_pool_size || mem_pool_size < sizeof(tlsf_t) + BHDR_OVERHEAD * 8) { + ERROR_MSG("init_memory_pool (): memory_pool invalid\n"); + return -1; + } + + if (((unsigned long) mem_pool & PTR_MASK)) { + ERROR_MSG("init_memory_pool (): mem_pool must be aligned to a word\n"); + return -1; + } + tlsf = (tlsf_t *) mem_pool; + /* Check if already initialised */ + if (tlsf->tlsf_signature == TLSF_SIGNATURE) { + mp = mem_pool; + b = GET_NEXT_BLOCK(mp, ROUNDUP_SIZE(sizeof(tlsf_t))); + return b->size & BLOCK_SIZE; + } + + mp = mem_pool; + + /* Zeroing the memory pool */ + memset(mem_pool, 0, sizeof(tlsf_t)); + + tlsf->tlsf_signature = TLSF_SIGNATURE; + + TLSF_CREATE_LOCK(&tlsf->lock); + + ib = process_area(GET_NEXT_BLOCK + (mem_pool, ROUNDUP_SIZE(sizeof(tlsf_t))), ROUNDDOWN_SIZE(mem_pool_size - sizeof(tlsf_t))); + b = GET_NEXT_BLOCK(ib->ptr.buffer, ib->size & BLOCK_SIZE); + free_ex(b->ptr.buffer, tlsf); + tlsf->area_head = (area_info_t *) ib->ptr.buffer; + +#if TLSF_STATISTIC + tlsf->used_size = mem_pool_size - (b->size & BLOCK_SIZE); + tlsf->max_size = tlsf->used_size; +#endif + + return (b->size & BLOCK_SIZE); +} + +/******************************************************************/ +size_t add_new_area(void *area, size_t area_size, void *mem_pool) +{ +/******************************************************************/ + tlsf_t *tlsf = (tlsf_t *) mem_pool; + area_info_t *ptr, *ptr_prev, *ai; + bhdr_t *ib0, *b0, *lb0, *ib1, *b1, *lb1, *next_b; + + memset(area, 0, area_size); + ptr = tlsf->area_head; + ptr_prev = 0; + + ib0 = process_area(area, area_size); + b0 = GET_NEXT_BLOCK(ib0->ptr.buffer, ib0->size & BLOCK_SIZE); + lb0 = GET_NEXT_BLOCK(b0->ptr.buffer, b0->size & BLOCK_SIZE); + + /* Before inserting the new area, we have to merge this area with the + already existing ones */ + + while (ptr) { + ib1 = (bhdr_t *) ((char *) ptr - BHDR_OVERHEAD); + b1 = GET_NEXT_BLOCK(ib1->ptr.buffer, ib1->size & BLOCK_SIZE); + lb1 = ptr->end; + + /* Merging the new area with the next physically contigous one */ + if ((unsigned long) ib1 == (unsigned long) lb0 + BHDR_OVERHEAD) { + if (tlsf->area_head == ptr) { + tlsf->area_head = ptr->next; + ptr = ptr->next; + } else { + ptr_prev->next = ptr->next; + ptr = ptr->next; + } + + b0->size = + ROUNDDOWN_SIZE((b0->size & BLOCK_SIZE) + + (ib1->size & BLOCK_SIZE) + 2 * BHDR_OVERHEAD) | USED_BLOCK | PREV_USED; + + b1->prev_hdr = b0; + lb0 = lb1; + + continue; + } + + /* Merging the new area with the previous physically contigous + one */ + if ((unsigned long) lb1->ptr.buffer == (unsigned long) ib0) { + if (tlsf->area_head == ptr) { + tlsf->area_head = ptr->next; + ptr = ptr->next; + } else { + ptr_prev->next = ptr->next; + ptr = ptr->next; + } + + lb1->size = + ROUNDDOWN_SIZE((b0->size & BLOCK_SIZE) + + (ib0->size & BLOCK_SIZE) + 2 * BHDR_OVERHEAD) | USED_BLOCK | (lb1->size & PREV_STATE); + next_b = GET_NEXT_BLOCK(lb1->ptr.buffer, lb1->size & BLOCK_SIZE); + next_b->prev_hdr = lb1; + b0 = lb1; + ib0 = ib1; + + continue; + } + ptr_prev = ptr; + ptr = ptr->next; + } + + /* Inserting the area in the list of linked areas */ + ai = (area_info_t *) ib0->ptr.buffer; + ai->next = tlsf->area_head; + ai->end = lb0; + tlsf->area_head = ai; + free_ex(b0->ptr.buffer, mem_pool); + return (b0->size & BLOCK_SIZE); +} + + +/******************************************************************/ +size_t get_used_size(void *mem_pool) +{ +/******************************************************************/ +#if TLSF_STATISTIC + return ((tlsf_t *) mem_pool)->used_size; +#else + return 0; +#endif +} + +/******************************************************************/ +size_t get_max_size(void *mem_pool) +{ +/******************************************************************/ +#if TLSF_STATISTIC + return ((tlsf_t *) mem_pool)->max_size; +#else + return 0; +#endif +} + +/******************************************************************/ +void destroy_memory_pool(void *mem_pool) +{ +/******************************************************************/ + tlsf_t *tlsf = (tlsf_t *) mem_pool; + + tlsf->tlsf_signature = 0; + + TLSF_DESTROY_LOCK(&tlsf->lock); + +} + + +/******************************************************************/ +void *tlsf_malloc(size_t size) +{ +/******************************************************************/ + void *ret; + +#if USE_MMAP || USE_SBRK + if (!mp) { + size_t area_size; + void *area; + + area_size = sizeof(tlsf_t) + BHDR_OVERHEAD * 8; /* Just a safety constant */ + area_size = (area_size > DEFAULT_AREA_SIZE) ? area_size : DEFAULT_AREA_SIZE; + area = get_new_area(&area_size); + if (area == ((void *) ~0)) + return NULL; /* Not enough system memory */ + init_memory_pool(area_size, area); + } +#endif + + TLSF_ACQUIRE_LOCK(&((tlsf_t *)mp)->lock); + + ret = malloc_ex(size, mp); + + TLSF_RELEASE_LOCK(&((tlsf_t *)mp)->lock); + + return ret; +} + +/******************************************************************/ +void tlsf_free(void *ptr) +{ +/******************************************************************/ + + TLSF_ACQUIRE_LOCK(&((tlsf_t *)mp)->lock); + + free_ex(ptr, mp); + + TLSF_RELEASE_LOCK(&((tlsf_t *)mp)->lock); + +} + +/******************************************************************/ +void *tlsf_realloc(void *ptr, size_t size) +{ +/******************************************************************/ + void *ret; + +#if USE_MMAP || USE_SBRK + if (!mp) { + return tlsf_malloc(size); + } +#endif + + TLSF_ACQUIRE_LOCK(&((tlsf_t *)mp)->lock); + + ret = realloc_ex(ptr, size, mp); + + TLSF_RELEASE_LOCK(&((tlsf_t *)mp)->lock); + + return ret; +} + +/******************************************************************/ +void *tlsf_calloc(size_t nelem, size_t elem_size) +{ +/******************************************************************/ + void *ret; + + TLSF_ACQUIRE_LOCK(&((tlsf_t *)mp)->lock); + + ret = calloc_ex(nelem, elem_size, mp); + + TLSF_RELEASE_LOCK(&((tlsf_t *)mp)->lock); + + return ret; +} + +/******************************************************************/ +void *malloc_ex(size_t size, void *mem_pool) +{ +/******************************************************************/ + tlsf_t *tlsf = (tlsf_t *) mem_pool; + bhdr_t *b, *b2, *next_b; + int fl, sl; + size_t tmp_size; + + size = (size < MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(size); + + /* Rounding up the requested size and calculating fl and sl */ + MAPPING_SEARCH(&size, &fl, &sl); + + /* Searching a free block, recall that this function changes the values of fl and sl, + so they are not longer valid when the function fails */ + b = FIND_SUITABLE_BLOCK(tlsf, &fl, &sl); +#if USE_MMAP || USE_SBRK + if (!b) { + size_t area_size; + void *area; + /* Growing the pool size when needed */ + area_size = size + BHDR_OVERHEAD * 8; /* size plus enough room for the requered headers. */ + area_size = (area_size > DEFAULT_AREA_SIZE) ? area_size : DEFAULT_AREA_SIZE; + area = get_new_area(&area_size); /* Call sbrk or mmap */ + if (area == ((void *) ~0)) + return NULL; /* Not enough system memory */ + add_new_area(area, area_size, mem_pool); + /* Rounding up the requested size and calculating fl and sl */ + MAPPING_SEARCH(&size, &fl, &sl); + /* Searching a free block */ + b = FIND_SUITABLE_BLOCK(tlsf, &fl, &sl); + } +#endif + if (!b) + return NULL; /* Not found */ + + EXTRACT_BLOCK_HDR(b, tlsf, fl, sl); + + /*-- found: */ + next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); + /* Should the block be split? */ + tmp_size = (b->size & BLOCK_SIZE) - size; + if (tmp_size >= sizeof(bhdr_t)) { + tmp_size -= BHDR_OVERHEAD; + b2 = GET_NEXT_BLOCK(b->ptr.buffer, size); + b2->size = tmp_size | FREE_BLOCK | PREV_USED; + next_b->prev_hdr = b2; + MAPPING_INSERT(tmp_size, &fl, &sl); + INSERT_BLOCK(b2, tlsf, fl, sl); + + b->size = size | (b->size & PREV_STATE); + } else { + next_b->size &= (~PREV_FREE); + b->size &= (~FREE_BLOCK); /* Now it's used */ + } + + TLSF_ADD_SIZE(tlsf, b); + + return (void *) b->ptr.buffer; +} + +extern void free_ex(void *ptr, void *mem_pool) { + tlsf_t *tlsf = (tlsf_t *) mem_pool; + bhdr_t *b, *tmp_b; + int fl = 0, sl = 0; + + if (!ptr) { + return; + } + b = (bhdr_t *) ((char *) ptr - BHDR_OVERHEAD); + b->size |= FREE_BLOCK; + + TLSF_REMOVE_SIZE(tlsf, b); + + b->ptr.free_ptr.prev = NULL; + b->ptr.free_ptr.next = NULL; + tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); + if (tmp_b->size & FREE_BLOCK) { + MAPPING_INSERT(tmp_b->size & BLOCK_SIZE, &fl, &sl); + EXTRACT_BLOCK(tmp_b, tlsf, fl, sl); + b->size += (tmp_b->size & BLOCK_SIZE) + BHDR_OVERHEAD; + } + if (b->size & PREV_FREE) { + tmp_b = b->prev_hdr; + MAPPING_INSERT(tmp_b->size & BLOCK_SIZE, &fl, &sl); + EXTRACT_BLOCK(tmp_b, tlsf, fl, sl); + tmp_b->size += (b->size & BLOCK_SIZE) + BHDR_OVERHEAD; + b = tmp_b; + } + MAPPING_INSERT(b->size & BLOCK_SIZE, &fl, &sl); + INSERT_BLOCK(b, tlsf, fl, sl); + + tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); + tmp_b->size |= PREV_FREE; + tmp_b->prev_hdr = b; +} + +/******************************************************************/ +void *realloc_ex(void *ptr, size_t new_size, void *mem_pool) +{ +/******************************************************************/ + tlsf_t *tlsf = (tlsf_t *) mem_pool; + void *ptr_aux; + unsigned int cpsize; + bhdr_t *b, *tmp_b, *next_b; + int fl, sl; + size_t tmp_size; + + if (!ptr) { + if (new_size) + return (void *) malloc_ex(new_size, mem_pool); + if (!new_size) + return NULL; + } else if (!new_size) { + free_ex(ptr, mem_pool); + return NULL; + } + + b = (bhdr_t *) ((char *) ptr - BHDR_OVERHEAD); + next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); + new_size = (new_size < MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(new_size); + tmp_size = (b->size & BLOCK_SIZE); + if (new_size <= tmp_size) { + TLSF_REMOVE_SIZE(tlsf, b); + if (next_b->size & FREE_BLOCK) { + MAPPING_INSERT(next_b->size & BLOCK_SIZE, &fl, &sl); + EXTRACT_BLOCK(next_b, tlsf, fl, sl); + tmp_size += (next_b->size & BLOCK_SIZE) + BHDR_OVERHEAD; + next_b = GET_NEXT_BLOCK(next_b->ptr.buffer, next_b->size & BLOCK_SIZE); + /* We allways reenter this free block because tmp_size will + be greater then sizeof (bhdr_t) */ + } + tmp_size -= new_size; + if (tmp_size >= sizeof(bhdr_t)) { + tmp_size -= BHDR_OVERHEAD; + tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, new_size); + tmp_b->size = tmp_size | FREE_BLOCK | PREV_USED; + next_b->prev_hdr = tmp_b; + next_b->size |= PREV_FREE; + MAPPING_INSERT(tmp_size, &fl, &sl); + INSERT_BLOCK(tmp_b, tlsf, fl, sl); + b->size = new_size | (b->size & PREV_STATE); + } + TLSF_ADD_SIZE(tlsf, b); + return (void *) b->ptr.buffer; + } + if ((next_b->size & FREE_BLOCK)) { + if (new_size <= (tmp_size + (next_b->size & BLOCK_SIZE))) { + TLSF_REMOVE_SIZE(tlsf, b); + MAPPING_INSERT(next_b->size & BLOCK_SIZE, &fl, &sl); + EXTRACT_BLOCK(next_b, tlsf, fl, sl); + b->size += (next_b->size & BLOCK_SIZE) + BHDR_OVERHEAD; + next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE); + next_b->prev_hdr = b; + next_b->size &= ~PREV_FREE; + tmp_size = (b->size & BLOCK_SIZE) - new_size; + if (tmp_size >= sizeof(bhdr_t)) { + tmp_size -= BHDR_OVERHEAD; + tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, new_size); + tmp_b->size = tmp_size | FREE_BLOCK | PREV_USED; + next_b->prev_hdr = tmp_b; + next_b->size |= PREV_FREE; + MAPPING_INSERT(tmp_size, &fl, &sl); + INSERT_BLOCK(tmp_b, tlsf, fl, sl); + b->size = new_size | (b->size & PREV_STATE); + } + TLSF_ADD_SIZE(tlsf, b); + return (void *) b->ptr.buffer; + } + } + + ptr_aux = malloc_ex(new_size, mem_pool); + + cpsize = ((b->size & BLOCK_SIZE) > new_size) ? new_size : (b->size & BLOCK_SIZE); + + memcpy(ptr_aux, ptr, cpsize); + + free_ex(ptr, mem_pool); + return ptr_aux; +} + + +/******************************************************************/ +void *calloc_ex(size_t nelem, size_t elem_size, void *mem_pool) +{ +/******************************************************************/ + void *ptr; + + if (nelem <= 0 || elem_size <= 0) + return NULL; + + if (!(ptr = malloc_ex(nelem * elem_size, mem_pool))) + return NULL; + memset(ptr, 0, nelem * elem_size); + + return ptr; +} + +/* for Nimrod: */ +size_t TLSF_GET_USED_SIZE(void) { return (((tlsf_t *)mp)->used_size); } +size_t TLSF_GET_MAX_SIZE(void) { return (((tlsf_t *)mp)->max_size); } + + +#if _DEBUG_TLSF_ + +/*************** DEBUG FUNCTIONS **************/ + +/* The following functions have been designed to ease the debugging of */ +/* the TLSF structure. For non-developing purposes, it may be they */ +/* haven't too much worth. To enable them, _DEBUG_TLSF_ must be set. */ + +extern void dump_memory_region(unsigned char *mem_ptr, unsigned int size); +extern void print_block(bhdr_t * b); +extern void print_tlsf(tlsf_t * tlsf); +void print_all_blocks(tlsf_t * tlsf); + +void dump_memory_region(unsigned char *mem_ptr, unsigned int size) +{ + + unsigned long begin = (unsigned long) mem_ptr; + unsigned long end = (unsigned long) mem_ptr + size; + int column = 0; + + begin >>= 2; + begin <<= 2; + + end >>= 2; + end++; + end <<= 2; + + PRINT_MSG("\nMemory region dumped: 0x%lx - 0x%lx\n\n", begin, end); + + column = 0; + PRINT_MSG("0x%lx ", begin); + + while (begin < end) { + if (((unsigned char *) begin)[0] == 0) + PRINT_MSG("00"); + else + PRINT_MSG("%02x", ((unsigned char *) begin)[0]); + if (((unsigned char *) begin)[1] == 0) + PRINT_MSG("00 "); + else + PRINT_MSG("%02x ", ((unsigned char *) begin)[1]); + begin += 2; + column++; + if (column == 8) { + PRINT_MSG("\n0x%lx ", begin); + column = 0; + } + + } + PRINT_MSG("\n\n"); +} + +void print_block(bhdr_t * b) +{ + if (!b) + return; + PRINT_MSG(">> [%p] (", b); + if ((b->size & BLOCK_SIZE)) + PRINT_MSG("%lu bytes, ", (unsigned long) (b->size & BLOCK_SIZE)); + else + PRINT_MSG("sentinel, "); + if ((b->size & BLOCK_STATE) == FREE_BLOCK) + PRINT_MSG("free [%p, %p], ", b->ptr.free_ptr.prev, b->ptr.free_ptr.next); + else + PRINT_MSG("used, "); + if ((b->size & PREV_STATE) == PREV_FREE) + PRINT_MSG("prev. free [%p])\n", b->prev_hdr); + else + PRINT_MSG("prev used)\n"); +} + +void print_tlsf(tlsf_t * tlsf) +{ + bhdr_t *next; + int i, j; + + PRINT_MSG("\nTLSF at %p\n", tlsf); + + PRINT_MSG("FL bitmap: 0x%x\n\n", (unsigned) tlsf->fl_bitmap); + + for (i = 0; i < REAL_FLI; i++) { + if (tlsf->sl_bitmap[i]) + PRINT_MSG("SL bitmap 0x%x\n", (unsigned) tlsf->sl_bitmap[i]); + for (j = 0; j < MAX_SLI; j++) { + next = tlsf->matrix[i][j]; + if (next) + PRINT_MSG("-> [%d][%d]\n", i, j); + while (next) { + print_block(next); + next = next->ptr.free_ptr.next; + } + } + } +} + +void print_all_blocks(tlsf_t * tlsf) +{ + area_info_t *ai; + bhdr_t *next; + PRINT_MSG("\nTLSF at %p\nALL BLOCKS\n\n", tlsf); + ai = tlsf->area_head; + while (ai) { + next = (bhdr_t *) ((char *) ai - BHDR_OVERHEAD); + while (next) { + print_block(next); + if ((next->size & BLOCK_SIZE)) + next = GET_NEXT_BLOCK(next->ptr.buffer, next->size & BLOCK_SIZE); + else + next = NULL; + } + ai = ai->next; + } +} + +#endif diff --git a/lib/tlsf.h b/lib/tlsf.h new file mode 100644 index 000000000..7c8e2ad66 --- /dev/null +++ b/lib/tlsf.h @@ -0,0 +1,39 @@ +/* + * Two Levels Segregate Fit memory allocator (TLSF) + * Version 2.4.3 + * + * Written by Miguel Masmano Tello <mimastel@doctor.upv.es> + * + * Thanks to Ismael Ripoll for his suggestions and reviews + * + * Copyright (C) 2008, 2007, 2006, 2005, 2004 + * + * This code is released using a dual license strategy: GPL/LGPL + * You can choose the licence that better fits your requirements. + * + * Released under the terms of the GNU General Public License Version 2.0 + * Released under the terms of the GNU Lesser General Public License Version 2.1 + * + */ + +#ifndef _TLSF_H_ +#define _TLSF_H_ + +#include <sys/types.h> + +extern size_t init_memory_pool(size_t, void *); +extern size_t get_used_size(void *); +extern size_t get_max_size(void *); +extern void destroy_memory_pool(void *); +extern size_t add_new_area(void *, size_t, void *); +extern void *malloc_ex(size_t, void *); +extern void free_ex(void *, void *); +extern void *realloc_ex(void *, size_t, void *); +extern void *calloc_ex(size_t, size_t, void *); + +extern void *tlsf_malloc(size_t size); +extern void tlsf_free(void *ptr); +extern void *tlsf_realloc(void *ptr, size_t size); +extern void *tlsf_calloc(size_t nelem, size_t elem_size); + +#endif diff --git a/lib/ucmaps/8859-1.txt b/lib/ucmaps/8859-1.txt new file mode 100644 index 000000000..473ecabc1 --- /dev/null +++ b/lib/ucmaps/8859-1.txt @@ -0,0 +1,303 @@ +# +# Name: ISO/IEC 8859-1:1998 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler <kenw@sybase.com> +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-1:1998 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-1 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-1 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# +# Updated versions of this file may be found in: +# <ftp://ftp.unicode.org/Public/MAPPINGS/> +# +# Any comments or problems, contact <errata@unicode.org> +# Please note that <errata@unicode.org> is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # <control> +0x81 0x0081 # <control> +0x82 0x0082 # <control> +0x83 0x0083 # <control> +0x84 0x0084 # <control> +0x85 0x0085 # <control> +0x86 0x0086 # <control> +0x87 0x0087 # <control> +0x88 0x0088 # <control> +0x89 0x0089 # <control> +0x8A 0x008A # <control> +0x8B 0x008B # <control> +0x8C 0x008C # <control> +0x8D 0x008D # <control> +0x8E 0x008E # <control> +0x8F 0x008F # <control> +0x90 0x0090 # <control> +0x91 0x0091 # <control> +0x92 0x0092 # <control> +0x93 0x0093 # <control> +0x94 0x0094 # <control> +0x95 0x0095 # <control> +0x96 0x0096 # <control> +0x97 0x0097 # <control> +0x98 0x0098 # <control> +0x99 0x0099 # <control> +0x9A 0x009A # <control> +0x9B 0x009B # <control> +0x9C 0x009C # <control> +0x9D 0x009D # <control> +0x9E 0x009E # <control> +0x9F 0x009F # <control> +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x00A1 # INVERTED EXCLAMATION MARK +0xA2 0x00A2 # CENT SIGN +0xA3 0x00A3 # POUND SIGN +0xA4 0x00A4 # CURRENCY SIGN +0xA5 0x00A5 # YEN SIGN +0xA6 0x00A6 # BROKEN BAR +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x00A9 # COPYRIGHT SIGN +0xAA 0x00AA # FEMININE ORDINAL INDICATOR +0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC # NOT SIGN +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x00AE # REGISTERED SIGN +0xAF 0x00AF # MACRON +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x00B1 # PLUS-MINUS SIGN +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x00B4 # ACUTE ACCENT +0xB5 0x00B5 # MICRO SIGN +0xB6 0x00B6 # PILCROW SIGN +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x00B8 # CEDILLA +0xB9 0x00B9 # SUPERSCRIPT ONE +0xBA 0x00BA # MASCULINE ORDINAL INDICATOR +0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC # VULGAR FRACTION ONE QUARTER +0xBD 0x00BD # VULGAR FRACTION ONE HALF +0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS +0xBF 0x00BF # INVERTED QUESTION MARK +0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 # LATIN CAPITAL LETTER AE +0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x00D0 # LATIN CAPITAL LETTER ETH (Icelandic) +0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE +0xDE 0x00DE # LATIN CAPITAL LETTER THORN (Icelandic) +0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German) +0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 # LATIN SMALL LETTER AE +0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x00F0 # LATIN SMALL LETTER ETH (Icelandic) +0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE +0xFE 0x00FE # LATIN SMALL LETTER THORN (Icelandic) +0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/lib/ucmaps/8859-10.txt b/lib/ucmaps/8859-10.txt new file mode 100644 index 000000000..374a42b1a --- /dev/null +++ b/lib/ucmaps/8859-10.txt @@ -0,0 +1,303 @@ +# +# Name: ISO/IEC 8859-10:1998 to Unicode +# Unicode version: 3.0 +# Table version: 1.1 +# Table format: Format A +# Date: 1999 October 11 +# Authors: Ken Whistler <kenw@sybase.com> +# +# Copyright (c) 1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-10:1998 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-10 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-10 order. +# +# Version history +# 1.0 version new. +# 1.1 corrected mistake in mapping of 0xA4 +# +# Updated versions of this file may be found in: +# <ftp://ftp.unicode.org/Public/MAPPINGS/> +# +# Any comments or problems, contact <errata@unicode.org> +# Please note that <errata@unicode.org> is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # <control> +0x81 0x0081 # <control> +0x82 0x0082 # <control> +0x83 0x0083 # <control> +0x84 0x0084 # <control> +0x85 0x0085 # <control> +0x86 0x0086 # <control> +0x87 0x0087 # <control> +0x88 0x0088 # <control> +0x89 0x0089 # <control> +0x8A 0x008A # <control> +0x8B 0x008B # <control> +0x8C 0x008C # <control> +0x8D 0x008D # <control> +0x8E 0x008E # <control> +0x8F 0x008F # <control> +0x90 0x0090 # <control> +0x91 0x0091 # <control> +0x92 0x0092 # <control> +0x93 0x0093 # <control> +0x94 0x0094 # <control> +0x95 0x0095 # <control> +0x96 0x0096 # <control> +0x97 0x0097 # <control> +0x98 0x0098 # <control> +0x99 0x0099 # <control> +0x9A 0x009A # <control> +0x9B 0x009B # <control> +0x9C 0x009C # <control> +0x9D 0x009D # <control> +0x9E 0x009E # <control> +0x9F 0x009F # <control> +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK +0xA2 0x0112 # LATIN CAPITAL LETTER E WITH MACRON +0xA3 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA +0xA4 0x012A # LATIN CAPITAL LETTER I WITH MACRON +0xA5 0x0128 # LATIN CAPITAL LETTER I WITH TILDE +0xA6 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA +0xA7 0x00A7 # SECTION SIGN +0xA8 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA +0xA9 0x0110 # LATIN CAPITAL LETTER D WITH STROKE +0xAA 0x0160 # LATIN CAPITAL LETTER S WITH CARON +0xAB 0x0166 # LATIN CAPITAL LETTER T WITH STROKE +0xAC 0x017D # LATIN CAPITAL LETTER Z WITH CARON +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x016A # LATIN CAPITAL LETTER U WITH MACRON +0xAF 0x014A # LATIN CAPITAL LETTER ENG +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK +0xB2 0x0113 # LATIN SMALL LETTER E WITH MACRON +0xB3 0x0123 # LATIN SMALL LETTER G WITH CEDILLA +0xB4 0x012B # LATIN SMALL LETTER I WITH MACRON +0xB5 0x0129 # LATIN SMALL LETTER I WITH TILDE +0xB6 0x0137 # LATIN SMALL LETTER K WITH CEDILLA +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x013C # LATIN SMALL LETTER L WITH CEDILLA +0xB9 0x0111 # LATIN SMALL LETTER D WITH STROKE +0xBA 0x0161 # LATIN SMALL LETTER S WITH CARON +0xBB 0x0167 # LATIN SMALL LETTER T WITH STROKE +0xBC 0x017E # LATIN SMALL LETTER Z WITH CARON +0xBD 0x2015 # HORIZONTAL BAR +0xBE 0x016B # LATIN SMALL LETTER U WITH MACRON +0xBF 0x014B # LATIN SMALL LETTER ENG +0xC0 0x0100 # LATIN CAPITAL LETTER A WITH MACRON +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 # LATIN CAPITAL LETTER AE +0xC7 0x012E # LATIN CAPITAL LETTER I WITH OGONEK +0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x00D0 # LATIN CAPITAL LETTER ETH (Icelandic) +0xD1 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA +0xD2 0x014C # LATIN CAPITAL LETTER O WITH MACRON +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x0168 # LATIN CAPITAL LETTER U WITH TILDE +0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE +0xDE 0x00DE # LATIN CAPITAL LETTER THORN (Icelandic) +0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German) +0xE0 0x0101 # LATIN SMALL LETTER A WITH MACRON +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 # LATIN SMALL LETTER AE +0xE7 0x012F # LATIN SMALL LETTER I WITH OGONEK +0xE8 0x010D # LATIN SMALL LETTER C WITH CARON +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x00F0 # LATIN SMALL LETTER ETH (Icelandic) +0xF1 0x0146 # LATIN SMALL LETTER N WITH CEDILLA +0xF2 0x014D # LATIN SMALL LETTER O WITH MACRON +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x0169 # LATIN SMALL LETTER U WITH TILDE +0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0xF9 0x0173 # LATIN SMALL LETTER U WITH OGONEK +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE +0xFE 0x00FE # LATIN SMALL LETTER THORN (Icelandic) +0xFF 0x0138 # LATIN SMALL LETTER KRA diff --git a/lib/ucmaps/8859-13.txt b/lib/ucmaps/8859-13.txt new file mode 100644 index 000000000..cd11b53fd --- /dev/null +++ b/lib/ucmaps/8859-13.txt @@ -0,0 +1,299 @@ +# +# Name: ISO/IEC 8859-13:1998 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler <kenw@sybase.com> +# +# Copyright (c) 1998 - 1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-13:1998 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-13 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-13 order. +# +# Updated versions of this file may be found in: +# <ftp://ftp.unicode.org/Public/MAPPINGS/> +# +# Any comments or problems, contact <errata@unicode.org> +# Please note that <errata@unicode.org> is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # <control> +0x81 0x0081 # <control> +0x82 0x0082 # <control> +0x83 0x0083 # <control> +0x84 0x0084 # <control> +0x85 0x0085 # <control> +0x86 0x0086 # <control> +0x87 0x0087 # <control> +0x88 0x0088 # <control> +0x89 0x0089 # <control> +0x8A 0x008A # <control> +0x8B 0x008B # <control> +0x8C 0x008C # <control> +0x8D 0x008D # <control> +0x8E 0x008E # <control> +0x8F 0x008F # <control> +0x90 0x0090 # <control> +0x91 0x0091 # <control> +0x92 0x0092 # <control> +0x93 0x0093 # <control> +0x94 0x0094 # <control> +0x95 0x0095 # <control> +0x96 0x0096 # <control> +0x97 0x0097 # <control> +0x98 0x0098 # <control> +0x99 0x0099 # <control> +0x9A 0x009A # <control> +0x9B 0x009B # <control> +0x9C 0x009C # <control> +0x9D 0x009D # <control> +0x9E 0x009E # <control> +0x9F 0x009F # <control> +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x201D # RIGHT DOUBLE QUOTATION MARK +0xA2 0x00A2 # CENT SIGN +0xA3 0x00A3 # POUND SIGN +0xA4 0x00A4 # CURRENCY SIGN +0xA5 0x201E # DOUBLE LOW-9 QUOTATION MARK +0xA6 0x00A6 # BROKEN BAR +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0xA9 0x00A9 # COPYRIGHT SIGN +0xAA 0x0156 # LATIN CAPITAL LETTER R WITH CEDILLA +0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC # NOT SIGN +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x00AE # REGISTERED SIGN +0xAF 0x00C6 # LATIN CAPITAL LETTER AE +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x00B1 # PLUS-MINUS SIGN +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x201C # LEFT DOUBLE QUOTATION MARK +0xB5 0x00B5 # MICRO SIGN +0xB6 0x00B6 # PILCROW SIGN +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0xB9 0x00B9 # SUPERSCRIPT ONE +0xBA 0x0157 # LATIN SMALL LETTER R WITH CEDILLA +0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC # VULGAR FRACTION ONE QUARTER +0xBD 0x00BD # VULGAR FRACTION ONE HALF +0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS +0xBF 0x00E6 # LATIN SMALL LETTER AE +0xC0 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK +0xC1 0x012E # LATIN CAPITAL LETTER I WITH OGONEK +0xC2 0x0100 # LATIN CAPITAL LETTER A WITH MACRON +0xC3 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK +0xC7 0x0112 # LATIN CAPITAL LETTER E WITH MACRON +0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE +0xCB 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE +0xCC 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA +0xCD 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA +0xCE 0x012A # LATIN CAPITAL LETTER I WITH MACRON +0xCF 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA +0xD0 0x0160 # LATIN CAPITAL LETTER S WITH CARON +0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE +0xD2 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x014C # LATIN CAPITAL LETTER O WITH MACRON +0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK +0xD9 0x0141 # LATIN CAPITAL LETTER L WITH STROKE +0xDA 0x015A # LATIN CAPITAL LETTER S WITH ACUTE +0xDB 0x016A # LATIN CAPITAL LETTER U WITH MACRON +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xDE 0x017D # LATIN CAPITAL LETTER Z WITH CARON +0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German) +0xE0 0x0105 # LATIN SMALL LETTER A WITH OGONEK +0xE1 0x012F # LATIN SMALL LETTER I WITH OGONEK +0xE2 0x0101 # LATIN SMALL LETTER A WITH MACRON +0xE3 0x0107 # LATIN SMALL LETTER C WITH ACUTE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x0119 # LATIN SMALL LETTER E WITH OGONEK +0xE7 0x0113 # LATIN SMALL LETTER E WITH MACRON +0xE8 0x010D # LATIN SMALL LETTER C WITH CARON +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x017A # LATIN SMALL LETTER Z WITH ACUTE +0xEB 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE +0xEC 0x0123 # LATIN SMALL LETTER G WITH CEDILLA +0xED 0x0137 # LATIN SMALL LETTER K WITH CEDILLA +0xEE 0x012B # LATIN SMALL LETTER I WITH MACRON +0xEF 0x013C # LATIN SMALL LETTER L WITH CEDILLA +0xF0 0x0161 # LATIN SMALL LETTER S WITH CARON +0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE +0xF2 0x0146 # LATIN SMALL LETTER N WITH CEDILLA +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x014D # LATIN SMALL LETTER O WITH MACRON +0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x0173 # LATIN SMALL LETTER U WITH OGONEK +0xF9 0x0142 # LATIN SMALL LETTER L WITH STROKE +0xFA 0x015B # LATIN SMALL LETTER S WITH ACUTE +0xFB 0x016B # LATIN SMALL LETTER U WITH MACRON +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE +0xFE 0x017E # LATIN SMALL LETTER Z WITH CARON +0xFF 0x2019 # RIGHT SINGLE QUOTATION MARK diff --git a/lib/ucmaps/8859-14.txt b/lib/ucmaps/8859-14.txt new file mode 100644 index 000000000..36038f413 --- /dev/null +++ b/lib/ucmaps/8859-14.txt @@ -0,0 +1,301 @@ +# +# Name: ISO/IEC 8859-14:1998 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Markus Kuhn <mkuhn@acm.org> +# Ken Whistler <kenw@sybase.com> +# +# Copyright (c) 1998 - 1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-14:1998 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-14 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-14 order. +# +# Updated versions of this file may be found in: +# <ftp://ftp.unicode.org/Public/MAPPINGS/> +# +# Any comments or problems, contact <errata@unicode.org> +# Please note that <errata@unicode.org> is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # <control> +0x81 0x0081 # <control> +0x82 0x0082 # <control> +0x83 0x0083 # <control> +0x84 0x0084 # <control> +0x85 0x0085 # <control> +0x86 0x0086 # <control> +0x87 0x0087 # <control> +0x88 0x0088 # <control> +0x89 0x0089 # <control> +0x8A 0x008A # <control> +0x8B 0x008B # <control> +0x8C 0x008C # <control> +0x8D 0x008D # <control> +0x8E 0x008E # <control> +0x8F 0x008F # <control> +0x90 0x0090 # <control> +0x91 0x0091 # <control> +0x92 0x0092 # <control> +0x93 0x0093 # <control> +0x94 0x0094 # <control> +0x95 0x0095 # <control> +0x96 0x0096 # <control> +0x97 0x0097 # <control> +0x98 0x0098 # <control> +0x99 0x0099 # <control> +0x9A 0x009A # <control> +0x9B 0x009B # <control> +0x9C 0x009C # <control> +0x9D 0x009D # <control> +0x9E 0x009E # <control> +0x9F 0x009F # <control> +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE +0xA2 0x1E03 # LATIN SMALL LETTER B WITH DOT ABOVE +0xA3 0x00A3 # POUND SIGN +0xA4 0x010A # LATIN CAPITAL LETTER C WITH DOT ABOVE +0xA5 0x010B # LATIN SMALL LETTER C WITH DOT ABOVE +0xA6 0x1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE +0xA7 0x00A7 # SECTION SIGN +0xA8 0x1E80 # LATIN CAPITAL LETTER W WITH GRAVE +0xA9 0x00A9 # COPYRIGHT SIGN +0xAA 0x1E82 # LATIN CAPITAL LETTER W WITH ACUTE +0xAB 0x1E0B # LATIN SMALL LETTER D WITH DOT ABOVE +0xAC 0x1EF2 # LATIN CAPITAL LETTER Y WITH GRAVE +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x00AE # REGISTERED SIGN +0xAF 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS +0xB0 0x1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE +0xB1 0x1E1F # LATIN SMALL LETTER F WITH DOT ABOVE +0xB2 0x0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE +0xB3 0x0121 # LATIN SMALL LETTER G WITH DOT ABOVE +0xB4 0x1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE +0xB5 0x1E41 # LATIN SMALL LETTER M WITH DOT ABOVE +0xB6 0x00B6 # PILCROW SIGN +0xB7 0x1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE +0xB8 0x1E81 # LATIN SMALL LETTER W WITH GRAVE +0xB9 0x1E57 # LATIN SMALL LETTER P WITH DOT ABOVE +0xBA 0x1E83 # LATIN SMALL LETTER W WITH ACUTE +0xBB 0x1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE +0xBC 0x1EF3 # LATIN SMALL LETTER Y WITH GRAVE +0xBD 0x1E84 # LATIN CAPITAL LETTER W WITH DIAERESIS +0xBE 0x1E85 # LATIN SMALL LETTER W WITH DIAERESIS +0xBF 0x1E61 # LATIN SMALL LETTER S WITH DOT ABOVE +0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 # LATIN CAPITAL LETTER AE +0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE +0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE +0xDE 0x0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0xDF 0x00DF # LATIN SMALL LETTER SHARP S +0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 # LATIN SMALL LETTER AE +0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX +0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x1E6B # LATIN SMALL LETTER T WITH DOT ABOVE +0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE +0xFE 0x0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX +0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS + diff --git a/lib/ucmaps/8859-15.txt b/lib/ucmaps/8859-15.txt new file mode 100644 index 000000000..1e319707d --- /dev/null +++ b/lib/ucmaps/8859-15.txt @@ -0,0 +1,303 @@ +# +# Name: ISO/IEC 8859-15:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Markus Kuhn <mkuhn@acm.org> +# Ken Whistler <kenw@sybase.com> +# +# Copyright (c) 1998 - 1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-15:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-15 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-15 order. +# +# Version history +# +# Updated versions of this file may be found in: +# <ftp://ftp.unicode.org/Public/MAPPINGS/> +# +# Any comments or problems, contact <errata@unicode.org> +# Please note that <errata@unicode.org> is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # <control> +0x81 0x0081 # <control> +0x82 0x0082 # <control> +0x83 0x0083 # <control> +0x84 0x0084 # <control> +0x85 0x0085 # <control> +0x86 0x0086 # <control> +0x87 0x0087 # <control> +0x88 0x0088 # <control> +0x89 0x0089 # <control> +0x8A 0x008A # <control> +0x8B 0x008B # <control> +0x8C 0x008C # <control> +0x8D 0x008D # <control> +0x8E 0x008E # <control> +0x8F 0x008F # <control> +0x90 0x0090 # <control> +0x91 0x0091 # <control> +0x92 0x0092 # <control> +0x93 0x0093 # <control> +0x94 0x0094 # <control> +0x95 0x0095 # <control> +0x96 0x0096 # <control> +0x97 0x0097 # <control> +0x98 0x0098 # <control> +0x99 0x0099 # <control> +0x9A 0x009A # <control> +0x9B 0x009B # <control> +0x9C 0x009C # <control> +0x9D 0x009D # <control> +0x9E 0x009E # <control> +0x9F 0x009F # <control> +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x00A1 # INVERTED EXCLAMATION MARK +0xA2 0x00A2 # CENT SIGN +0xA3 0x00A3 # POUND SIGN +0xA4 0x20AC # EURO SIGN +0xA5 0x00A5 # YEN SIGN +0xA6 0x0160 # LATIN CAPITAL LETTER S WITH CARON +0xA7 0x00A7 # SECTION SIGN +0xA8 0x0161 # LATIN SMALL LETTER S WITH CARON +0xA9 0x00A9 # COPYRIGHT SIGN +0xAA 0x00AA # FEMININE ORDINAL INDICATOR +0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC # NOT SIGN +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x00AE # REGISTERED SIGN +0xAF 0x00AF # MACRON +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x00B1 # PLUS-MINUS SIGN +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x017D # LATIN CAPITAL LETTER Z WITH CARON +0xB5 0x00B5 # MICRO SIGN +0xB6 0x00B6 # PILCROW SIGN +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x017E # LATIN SMALL LETTER Z WITH CARON +0xB9 0x00B9 # SUPERSCRIPT ONE +0xBA 0x00BA # MASCULINE ORDINAL INDICATOR +0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x0152 # LATIN CAPITAL LIGATURE OE +0xBD 0x0153 # LATIN SMALL LIGATURE OE +0xBE 0x0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS +0xBF 0x00BF # INVERTED QUESTION MARK +0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 # LATIN CAPITAL LETTER AE +0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x00D0 # LATIN CAPITAL LETTER ETH +0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE +0xDE 0x00DE # LATIN CAPITAL LETTER THORN +0xDF 0x00DF # LATIN SMALL LETTER SHARP S +0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 # LATIN SMALL LETTER AE +0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x00F0 # LATIN SMALL LETTER ETH +0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE +0xFE 0x00FE # LATIN SMALL LETTER THORN +0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS + diff --git a/lib/ucmaps/8859-2.txt b/lib/ucmaps/8859-2.txt new file mode 100644 index 000000000..e45df25eb --- /dev/null +++ b/lib/ucmaps/8859-2.txt @@ -0,0 +1,303 @@ +# +# Name: ISO 8859-2:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler <kenw@sybase.com> +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-2:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-2 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-2 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# +# Updated versions of this file may be found in: +# <ftp://ftp.unicode.org/Public/MAPPINGS/> +# +# Any comments or problems, contact <errata@unicode.org> +# Please note that <errata@unicode.org> is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # <control> +0x81 0x0081 # <control> +0x82 0x0082 # <control> +0x83 0x0083 # <control> +0x84 0x0084 # <control> +0x85 0x0085 # <control> +0x86 0x0086 # <control> +0x87 0x0087 # <control> +0x88 0x0088 # <control> +0x89 0x0089 # <control> +0x8A 0x008A # <control> +0x8B 0x008B # <control> +0x8C 0x008C # <control> +0x8D 0x008D # <control> +0x8E 0x008E # <control> +0x8F 0x008F # <control> +0x90 0x0090 # <control> +0x91 0x0091 # <control> +0x92 0x0092 # <control> +0x93 0x0093 # <control> +0x94 0x0094 # <control> +0x95 0x0095 # <control> +0x96 0x0096 # <control> +0x97 0x0097 # <control> +0x98 0x0098 # <control> +0x99 0x0099 # <control> +0x9A 0x009A # <control> +0x9B 0x009B # <control> +0x9C 0x009C # <control> +0x9D 0x009D # <control> +0x9E 0x009E # <control> +0x9F 0x009F # <control> +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK +0xA2 0x02D8 # BREVE +0xA3 0x0141 # LATIN CAPITAL LETTER L WITH STROKE +0xA4 0x00A4 # CURRENCY SIGN +0xA5 0x013D # LATIN CAPITAL LETTER L WITH CARON +0xA6 0x015A # LATIN CAPITAL LETTER S WITH ACUTE +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x0160 # LATIN CAPITAL LETTER S WITH CARON +0xAA 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA +0xAB 0x0164 # LATIN CAPITAL LETTER T WITH CARON +0xAC 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x017D # LATIN CAPITAL LETTER Z WITH CARON +0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK +0xB2 0x02DB # OGONEK +0xB3 0x0142 # LATIN SMALL LETTER L WITH STROKE +0xB4 0x00B4 # ACUTE ACCENT +0xB5 0x013E # LATIN SMALL LETTER L WITH CARON +0xB6 0x015B # LATIN SMALL LETTER S WITH ACUTE +0xB7 0x02C7 # CARON +0xB8 0x00B8 # CEDILLA +0xB9 0x0161 # LATIN SMALL LETTER S WITH CARON +0xBA 0x015F # LATIN SMALL LETTER S WITH CEDILLA +0xBB 0x0165 # LATIN SMALL LETTER T WITH CARON +0xBC 0x017A # LATIN SMALL LETTER Z WITH ACUTE +0xBD 0x02DD # DOUBLE ACUTE ACCENT +0xBE 0x017E # LATIN SMALL LETTER Z WITH CARON +0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE +0xC0 0x0154 # LATIN CAPITAL LETTER R WITH ACUTE +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x0102 # LATIN CAPITAL LETTER A WITH BREVE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x0139 # LATIN CAPITAL LETTER L WITH ACUTE +0xC6 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE +0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x011A # LATIN CAPITAL LETTER E WITH CARON +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x010E # LATIN CAPITAL LETTER D WITH CARON +0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE +0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE +0xD2 0x0147 # LATIN CAPITAL LETTER N WITH CARON +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x0158 # LATIN CAPITAL LETTER R WITH CARON +0xD9 0x016E # LATIN CAPITAL LETTER U WITH RING ABOVE +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE +0xDE 0x0162 # LATIN CAPITAL LETTER T WITH CEDILLA +0xDF 0x00DF # LATIN SMALL LETTER SHARP S +0xE0 0x0155 # LATIN SMALL LETTER R WITH ACUTE +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x0103 # LATIN SMALL LETTER A WITH BREVE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x013A # LATIN SMALL LETTER L WITH ACUTE +0xE6 0x0107 # LATIN SMALL LETTER C WITH ACUTE +0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x010D # LATIN SMALL LETTER C WITH CARON +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x011B # LATIN SMALL LETTER E WITH CARON +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x010F # LATIN SMALL LETTER D WITH CARON +0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE +0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE +0xF2 0x0148 # LATIN SMALL LETTER N WITH CARON +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x0159 # LATIN SMALL LETTER R WITH CARON +0xF9 0x016F # LATIN SMALL LETTER U WITH RING ABOVE +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE +0xFE 0x0163 # LATIN SMALL LETTER T WITH CEDILLA +0xFF 0x02D9 # DOT ABOVE diff --git a/lib/ucmaps/8859-3.txt b/lib/ucmaps/8859-3.txt new file mode 100644 index 000000000..9b6ac69dd --- /dev/null +++ b/lib/ucmaps/8859-3.txt @@ -0,0 +1,296 @@ +# +# Name: ISO/IEC 8859-3:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler <kenw@sybase.com> +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-3:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-3 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-3 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# +# Updated versions of this file may be found in: +# <ftp://ftp.unicode.org/Public/MAPPINGS/> +# +# Any comments or problems, contact <errata@unicode.org> +# Please note that <errata@unicode.org> is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # <control> +0x81 0x0081 # <control> +0x82 0x0082 # <control> +0x83 0x0083 # <control> +0x84 0x0084 # <control> +0x85 0x0085 # <control> +0x86 0x0086 # <control> +0x87 0x0087 # <control> +0x88 0x0088 # <control> +0x89 0x0089 # <control> +0x8A 0x008A # <control> +0x8B 0x008B # <control> +0x8C 0x008C # <control> +0x8D 0x008D # <control> +0x8E 0x008E # <control> +0x8F 0x008F # <control> +0x90 0x0090 # <control> +0x91 0x0091 # <control> +0x92 0x0092 # <control> +0x93 0x0093 # <control> +0x94 0x0094 # <control> +0x95 0x0095 # <control> +0x96 0x0096 # <control> +0x97 0x0097 # <control> +0x98 0x0098 # <control> +0x99 0x0099 # <control> +0x9A 0x009A # <control> +0x9B 0x009B # <control> +0x9C 0x009C # <control> +0x9D 0x009D # <control> +0x9E 0x009E # <control> +0x9F 0x009F # <control> +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x0126 # LATIN CAPITAL LETTER H WITH STROKE +0xA2 0x02D8 # BREVE +0xA3 0x00A3 # POUND SIGN +0xA4 0x00A4 # CURRENCY SIGN +0xA6 0x0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE +0xAA 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA +0xAB 0x011E # LATIN CAPITAL LETTER G WITH BREVE +0xAC 0x0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0xAD 0x00AD # SOFT HYPHEN +0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x0127 # LATIN SMALL LETTER H WITH STROKE +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x00B4 # ACUTE ACCENT +0xB5 0x00B5 # MICRO SIGN +0xB6 0x0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x00B8 # CEDILLA +0xB9 0x0131 # LATIN SMALL LETTER DOTLESS I +0xBA 0x015F # LATIN SMALL LETTER S WITH CEDILLA +0xBB 0x011F # LATIN SMALL LETTER G WITH BREVE +0xBC 0x0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX +0xBD 0x00BD # VULGAR FRACTION ONE HALF +0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE +0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x010A # LATIN CAPITAL LETTER C WITH DOT ABOVE +0xC6 0x0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX +0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX +0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x016C # LATIN CAPITAL LETTER U WITH BREVE +0xDE 0x015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX +0xDF 0x00DF # LATIN SMALL LETTER SHARP S +0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x010B # LATIN SMALL LETTER C WITH DOT ABOVE +0xE6 0x0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX +0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS +0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x0121 # LATIN SMALL LETTER G WITH DOT ABOVE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x011D # LATIN SMALL LETTER G WITH CIRCUMFLEX +0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x016D # LATIN SMALL LETTER U WITH BREVE +0xFE 0x015D # LATIN SMALL LETTER S WITH CIRCUMFLEX +0xFF 0x02D9 # DOT ABOVE diff --git a/lib/ucmaps/8859-4.txt b/lib/ucmaps/8859-4.txt new file mode 100644 index 000000000..662e698ab --- /dev/null +++ b/lib/ucmaps/8859-4.txt @@ -0,0 +1,303 @@ +# +# Name: ISO/IEC 8859-4:1998 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler <kenw@sybase.com> +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-4:1998 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-4 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-4 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# +# Updated versions of this file may be found in: +# <ftp://ftp.unicode.org/Public/MAPPINGS/> +# +# Any comments or problems, contact <errata@unicode.org> +# Please note that <errata@unicode.org> is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # <control> +0x81 0x0081 # <control> +0x82 0x0082 # <control> +0x83 0x0083 # <control> +0x84 0x0084 # <control> +0x85 0x0085 # <control> +0x86 0x0086 # <control> +0x87 0x0087 # <control> +0x88 0x0088 # <control> +0x89 0x0089 # <control> +0x8A 0x008A # <control> +0x8B 0x008B # <control> +0x8C 0x008C # <control> +0x8D 0x008D # <control> +0x8E 0x008E # <control> +0x8F 0x008F # <control> +0x90 0x0090 # <control> +0x91 0x0091 # <control> +0x92 0x0092 # <control> +0x93 0x0093 # <control> +0x94 0x0094 # <control> +0x95 0x0095 # <control> +0x96 0x0096 # <control> +0x97 0x0097 # <control> +0x98 0x0098 # <control> +0x99 0x0099 # <control> +0x9A 0x009A # <control> +0x9B 0x009B # <control> +0x9C 0x009C # <control> +0x9D 0x009D # <control> +0x9E 0x009E # <control> +0x9F 0x009F # <control> +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK +0xA2 0x0138 # LATIN SMALL LETTER KRA +0xA3 0x0156 # LATIN CAPITAL LETTER R WITH CEDILLA +0xA4 0x00A4 # CURRENCY SIGN +0xA5 0x0128 # LATIN CAPITAL LETTER I WITH TILDE +0xA6 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x0160 # LATIN CAPITAL LETTER S WITH CARON +0xAA 0x0112 # LATIN CAPITAL LETTER E WITH MACRON +0xAB 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA +0xAC 0x0166 # LATIN CAPITAL LETTER T WITH STROKE +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x017D # LATIN CAPITAL LETTER Z WITH CARON +0xAF 0x00AF # MACRON +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK +0xB2 0x02DB # OGONEK +0xB3 0x0157 # LATIN SMALL LETTER R WITH CEDILLA +0xB4 0x00B4 # ACUTE ACCENT +0xB5 0x0129 # LATIN SMALL LETTER I WITH TILDE +0xB6 0x013C # LATIN SMALL LETTER L WITH CEDILLA +0xB7 0x02C7 # CARON +0xB8 0x00B8 # CEDILLA +0xB9 0x0161 # LATIN SMALL LETTER S WITH CARON +0xBA 0x0113 # LATIN SMALL LETTER E WITH MACRON +0xBB 0x0123 # LATIN SMALL LETTER G WITH CEDILLA +0xBC 0x0167 # LATIN SMALL LETTER T WITH STROKE +0xBD 0x014A # LATIN CAPITAL LETTER ENG +0xBE 0x017E # LATIN SMALL LETTER Z WITH CARON +0xBF 0x014B # LATIN SMALL LETTER ENG +0xC0 0x0100 # LATIN CAPITAL LETTER A WITH MACRON +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 # LATIN CAPITAL LETTER AE +0xC7 0x012E # LATIN CAPITAL LETTER I WITH OGONEK +0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x012A # LATIN CAPITAL LETTER I WITH MACRON +0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE +0xD1 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA +0xD2 0x014C # LATIN CAPITAL LETTER O WITH MACRON +0xD3 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x0168 # LATIN CAPITAL LETTER U WITH TILDE +0xDE 0x016A # LATIN CAPITAL LETTER U WITH MACRON +0xDF 0x00DF # LATIN SMALL LETTER SHARP S +0xE0 0x0101 # LATIN SMALL LETTER A WITH MACRON +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 # LATIN SMALL LETTER AE +0xE7 0x012F # LATIN SMALL LETTER I WITH OGONEK +0xE8 0x010D # LATIN SMALL LETTER C WITH CARON +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x012B # LATIN SMALL LETTER I WITH MACRON +0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE +0xF1 0x0146 # LATIN SMALL LETTER N WITH CEDILLA +0xF2 0x014D # LATIN SMALL LETTER O WITH MACRON +0xF3 0x0137 # LATIN SMALL LETTER K WITH CEDILLA +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0xF9 0x0173 # LATIN SMALL LETTER U WITH OGONEK +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x0169 # LATIN SMALL LETTER U WITH TILDE +0xFE 0x016B # LATIN SMALL LETTER U WITH MACRON +0xFF 0x02D9 # DOT ABOVE diff --git a/lib/ucmaps/8859-5.txt b/lib/ucmaps/8859-5.txt new file mode 100644 index 000000000..a7ed1ce2a --- /dev/null +++ b/lib/ucmaps/8859-5.txt @@ -0,0 +1,303 @@ +# +# Name: ISO 8859-5:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler <kenw@sybase.com> +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-5:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-5 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-5 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# +# Updated versions of this file may be found in: +# <ftp://ftp.unicode.org/Public/MAPPINGS/> +# +# Any comments or problems, contact <errata@unicode.org> +# Please note that <errata@unicode.org> is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # <control> +0x81 0x0081 # <control> +0x82 0x0082 # <control> +0x83 0x0083 # <control> +0x84 0x0084 # <control> +0x85 0x0085 # <control> +0x86 0x0086 # <control> +0x87 0x0087 # <control> +0x88 0x0088 # <control> +0x89 0x0089 # <control> +0x8A 0x008A # <control> +0x8B 0x008B # <control> +0x8C 0x008C # <control> +0x8D 0x008D # <control> +0x8E 0x008E # <control> +0x8F 0x008F # <control> +0x90 0x0090 # <control> +0x91 0x0091 # <control> +0x92 0x0092 # <control> +0x93 0x0093 # <control> +0x94 0x0094 # <control> +0x95 0x0095 # <control> +0x96 0x0096 # <control> +0x97 0x0097 # <control> +0x98 0x0098 # <control> +0x99 0x0099 # <control> +0x9A 0x009A # <control> +0x9B 0x009B # <control> +0x9C 0x009C # <control> +0x9D 0x009D # <control> +0x9E 0x009E # <control> +0x9F 0x009F # <control> +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x0401 # CYRILLIC CAPITAL LETTER IO +0xA2 0x0402 # CYRILLIC CAPITAL LETTER DJE +0xA3 0x0403 # CYRILLIC CAPITAL LETTER GJE +0xA4 0x0404 # CYRILLIC CAPITAL LETTER UKRAINIAN IE +0xA5 0x0405 # CYRILLIC CAPITAL LETTER DZE +0xA6 0x0406 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0xA7 0x0407 # CYRILLIC CAPITAL LETTER YI +0xA8 0x0408 # CYRILLIC CAPITAL LETTER JE +0xA9 0x0409 # CYRILLIC CAPITAL LETTER LJE +0xAA 0x040A # CYRILLIC CAPITAL LETTER NJE +0xAB 0x040B # CYRILLIC CAPITAL LETTER TSHE +0xAC 0x040C # CYRILLIC CAPITAL LETTER KJE +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x040E # CYRILLIC CAPITAL LETTER SHORT U +0xAF 0x040F # CYRILLIC CAPITAL LETTER DZHE +0xB0 0x0410 # CYRILLIC CAPITAL LETTER A +0xB1 0x0411 # CYRILLIC CAPITAL LETTER BE +0xB2 0x0412 # CYRILLIC CAPITAL LETTER VE +0xB3 0x0413 # CYRILLIC CAPITAL LETTER GHE +0xB4 0x0414 # CYRILLIC CAPITAL LETTER DE +0xB5 0x0415 # CYRILLIC CAPITAL LETTER IE +0xB6 0x0416 # CYRILLIC CAPITAL LETTER ZHE +0xB7 0x0417 # CYRILLIC CAPITAL LETTER ZE +0xB8 0x0418 # CYRILLIC CAPITAL LETTER I +0xB9 0x0419 # CYRILLIC CAPITAL LETTER SHORT I +0xBA 0x041A # CYRILLIC CAPITAL LETTER KA +0xBB 0x041B # CYRILLIC CAPITAL LETTER EL +0xBC 0x041C # CYRILLIC CAPITAL LETTER EM +0xBD 0x041D # CYRILLIC CAPITAL LETTER EN +0xBE 0x041E # CYRILLIC CAPITAL LETTER O +0xBF 0x041F # CYRILLIC CAPITAL LETTER PE +0xC0 0x0420 # CYRILLIC CAPITAL LETTER ER +0xC1 0x0421 # CYRILLIC CAPITAL LETTER ES +0xC2 0x0422 # CYRILLIC CAPITAL LETTER TE +0xC3 0x0423 # CYRILLIC CAPITAL LETTER U +0xC4 0x0424 # CYRILLIC CAPITAL LETTER EF +0xC5 0x0425 # CYRILLIC CAPITAL LETTER HA +0xC6 0x0426 # CYRILLIC CAPITAL LETTER TSE +0xC7 0x0427 # CYRILLIC CAPITAL LETTER CHE +0xC8 0x0428 # CYRILLIC CAPITAL LETTER SHA +0xC9 0x0429 # CYRILLIC CAPITAL LETTER SHCHA +0xCA 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN +0xCB 0x042B # CYRILLIC CAPITAL LETTER YERU +0xCC 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN +0xCD 0x042D # CYRILLIC CAPITAL LETTER E +0xCE 0x042E # CYRILLIC CAPITAL LETTER YU +0xCF 0x042F # CYRILLIC CAPITAL LETTER YA +0xD0 0x0430 # CYRILLIC SMALL LETTER A +0xD1 0x0431 # CYRILLIC SMALL LETTER BE +0xD2 0x0432 # CYRILLIC SMALL LETTER VE +0xD3 0x0433 # CYRILLIC SMALL LETTER GHE +0xD4 0x0434 # CYRILLIC SMALL LETTER DE +0xD5 0x0435 # CYRILLIC SMALL LETTER IE +0xD6 0x0436 # CYRILLIC SMALL LETTER ZHE +0xD7 0x0437 # CYRILLIC SMALL LETTER ZE +0xD8 0x0438 # CYRILLIC SMALL LETTER I +0xD9 0x0439 # CYRILLIC SMALL LETTER SHORT I +0xDA 0x043A # CYRILLIC SMALL LETTER KA +0xDB 0x043B # CYRILLIC SMALL LETTER EL +0xDC 0x043C # CYRILLIC SMALL LETTER EM +0xDD 0x043D # CYRILLIC SMALL LETTER EN +0xDE 0x043E # CYRILLIC SMALL LETTER O +0xDF 0x043F # CYRILLIC SMALL LETTER PE +0xE0 0x0440 # CYRILLIC SMALL LETTER ER +0xE1 0x0441 # CYRILLIC SMALL LETTER ES +0xE2 0x0442 # CYRILLIC SMALL LETTER TE +0xE3 0x0443 # CYRILLIC SMALL LETTER U +0xE4 0x0444 # CYRILLIC SMALL LETTER EF +0xE5 0x0445 # CYRILLIC SMALL LETTER HA +0xE6 0x0446 # CYRILLIC SMALL LETTER TSE +0xE7 0x0447 # CYRILLIC SMALL LETTER CHE +0xE8 0x0448 # CYRILLIC SMALL LETTER SHA +0xE9 0x0449 # CYRILLIC SMALL LETTER SHCHA +0xEA 0x044A # CYRILLIC SMALL LETTER HARD SIGN +0xEB 0x044B # CYRILLIC SMALL LETTER YERU +0xEC 0x044C # CYRILLIC SMALL LETTER SOFT SIGN +0xED 0x044D # CYRILLIC SMALL LETTER E +0xEE 0x044E # CYRILLIC SMALL LETTER YU +0xEF 0x044F # CYRILLIC SMALL LETTER YA +0xF0 0x2116 # NUMERO SIGN +0xF1 0x0451 # CYRILLIC SMALL LETTER IO +0xF2 0x0452 # CYRILLIC SMALL LETTER DJE +0xF3 0x0453 # CYRILLIC SMALL LETTER GJE +0xF4 0x0454 # CYRILLIC SMALL LETTER UKRAINIAN IE +0xF5 0x0455 # CYRILLIC SMALL LETTER DZE +0xF6 0x0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0xF7 0x0457 # CYRILLIC SMALL LETTER YI +0xF8 0x0458 # CYRILLIC SMALL LETTER JE +0xF9 0x0459 # CYRILLIC SMALL LETTER LJE +0xFA 0x045A # CYRILLIC SMALL LETTER NJE +0xFB 0x045B # CYRILLIC SMALL LETTER TSHE +0xFC 0x045C # CYRILLIC SMALL LETTER KJE +0xFD 0x00A7 # SECTION SIGN +0xFE 0x045E # CYRILLIC SMALL LETTER SHORT U +0xFF 0x045F # CYRILLIC SMALL LETTER DZHE diff --git a/lib/ucmaps/8859-6.txt b/lib/ucmaps/8859-6.txt new file mode 100644 index 000000000..69ac7f589 --- /dev/null +++ b/lib/ucmaps/8859-6.txt @@ -0,0 +1,260 @@ +# +# Name: ISO 8859-6:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler <kenw@sybase.com> +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-6:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-6 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-6 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# 0x30..0x39 remapped to the ASCII digits (U+0030..U+0039) instead +# of the Arabic digits (U+0660..U+0669). +# +# Updated versions of this file may be found in: +# <ftp://ftp.unicode.org/Public/MAPPINGS/> +# +# Any comments or problems, contact <errata@unicode.org> +# Please note that <errata@unicode.org> is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # <control> +0x81 0x0081 # <control> +0x82 0x0082 # <control> +0x83 0x0083 # <control> +0x84 0x0084 # <control> +0x85 0x0085 # <control> +0x86 0x0086 # <control> +0x87 0x0087 # <control> +0x88 0x0088 # <control> +0x89 0x0089 # <control> +0x8A 0x008A # <control> +0x8B 0x008B # <control> +0x8C 0x008C # <control> +0x8D 0x008D # <control> +0x8E 0x008E # <control> +0x8F 0x008F # <control> +0x90 0x0090 # <control> +0x91 0x0091 # <control> +0x92 0x0092 # <control> +0x93 0x0093 # <control> +0x94 0x0094 # <control> +0x95 0x0095 # <control> +0x96 0x0096 # <control> +0x97 0x0097 # <control> +0x98 0x0098 # <control> +0x99 0x0099 # <control> +0x9A 0x009A # <control> +0x9B 0x009B # <control> +0x9C 0x009C # <control> +0x9D 0x009D # <control> +0x9E 0x009E # <control> +0x9F 0x009F # <control> +0xA0 0x00A0 # NO-BREAK SPACE +0xA4 0x00A4 # CURRENCY SIGN +0xAC 0x060C # ARABIC COMMA +0xAD 0x00AD # SOFT HYPHEN +0xBB 0x061B # ARABIC SEMICOLON +0xBF 0x061F # ARABIC QUESTION MARK +0xC1 0x0621 # ARABIC LETTER HAMZA +0xC2 0x0622 # ARABIC LETTER ALEF WITH MADDA ABOVE +0xC3 0x0623 # ARABIC LETTER ALEF WITH HAMZA ABOVE +0xC4 0x0624 # ARABIC LETTER WAW WITH HAMZA ABOVE +0xC5 0x0625 # ARABIC LETTER ALEF WITH HAMZA BELOW +0xC6 0x0626 # ARABIC LETTER YEH WITH HAMZA ABOVE +0xC7 0x0627 # ARABIC LETTER ALEF +0xC8 0x0628 # ARABIC LETTER BEH +0xC9 0x0629 # ARABIC LETTER TEH MARBUTA +0xCA 0x062A # ARABIC LETTER TEH +0xCB 0x062B # ARABIC LETTER THEH +0xCC 0x062C # ARABIC LETTER JEEM +0xCD 0x062D # ARABIC LETTER HAH +0xCE 0x062E # ARABIC LETTER KHAH +0xCF 0x062F # ARABIC LETTER DAL +0xD0 0x0630 # ARABIC LETTER THAL +0xD1 0x0631 # ARABIC LETTER REH +0xD2 0x0632 # ARABIC LETTER ZAIN +0xD3 0x0633 # ARABIC LETTER SEEN +0xD4 0x0634 # ARABIC LETTER SHEEN +0xD5 0x0635 # ARABIC LETTER SAD +0xD6 0x0636 # ARABIC LETTER DAD +0xD7 0x0637 # ARABIC LETTER TAH +0xD8 0x0638 # ARABIC LETTER ZAH +0xD9 0x0639 # ARABIC LETTER AIN +0xDA 0x063A # ARABIC LETTER GHAIN +0xE0 0x0640 # ARABIC TATWEEL +0xE1 0x0641 # ARABIC LETTER FEH +0xE2 0x0642 # ARABIC LETTER QAF +0xE3 0x0643 # ARABIC LETTER KAF +0xE4 0x0644 # ARABIC LETTER LAM +0xE5 0x0645 # ARABIC LETTER MEEM +0xE6 0x0646 # ARABIC LETTER NOON +0xE7 0x0647 # ARABIC LETTER HEH +0xE8 0x0648 # ARABIC LETTER WAW +0xE9 0x0649 # ARABIC LETTER ALEF MAKSURA +0xEA 0x064A # ARABIC LETTER YEH +0xEB 0x064B # ARABIC FATHATAN +0xEC 0x064C # ARABIC DAMMATAN +0xED 0x064D # ARABIC KASRATAN +0xEE 0x064E # ARABIC FATHA +0xEF 0x064F # ARABIC DAMMA +0xF0 0x0650 # ARABIC KASRA +0xF1 0x0651 # ARABIC SHADDA +0xF2 0x0652 # ARABIC SUKUN diff --git a/lib/ucmaps/8859-7.txt b/lib/ucmaps/8859-7.txt new file mode 100644 index 000000000..52c42d08a --- /dev/null +++ b/lib/ucmaps/8859-7.txt @@ -0,0 +1,302 @@ +# +# Name: ISO 8859-7:1987 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler <kenw@sybase.com> +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO 8859-7:1987 characters map into Unicode. +# +# ISO 8859-7:1987 is equivalent to ISO-IR-126, ELOT 928, +# and ECMA 118. +# +# Format: Three tab-separated columns +# Column #1 is the ISO 8859-7 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO 8859-7 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# Remap 0xA1 to U+2018 (instead of 0x02BD) to match text of 8859-7 +# Remap 0xA2 to U+2019 (instead of 0x02BC) to match text of 8859-7 +# +# Updated versions of this file may be found in: +# <ftp://ftp.unicode.org/Public/MAPPINGS/> +# +# Any comments or problems, contact <errata@unicode.org> +# Please note that <errata@unicode.org> is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # <control> +0x81 0x0081 # <control> +0x82 0x0082 # <control> +0x83 0x0083 # <control> +0x84 0x0084 # <control> +0x85 0x0085 # <control> +0x86 0x0086 # <control> +0x87 0x0087 # <control> +0x88 0x0088 # <control> +0x89 0x0089 # <control> +0x8A 0x008A # <control> +0x8B 0x008B # <control> +0x8C 0x008C # <control> +0x8D 0x008D # <control> +0x8E 0x008E # <control> +0x8F 0x008F # <control> +0x90 0x0090 # <control> +0x91 0x0091 # <control> +0x92 0x0092 # <control> +0x93 0x0093 # <control> +0x94 0x0094 # <control> +0x95 0x0095 # <control> +0x96 0x0096 # <control> +0x97 0x0097 # <control> +0x98 0x0098 # <control> +0x99 0x0099 # <control> +0x9A 0x009A # <control> +0x9B 0x009B # <control> +0x9C 0x009C # <control> +0x9D 0x009D # <control> +0x9E 0x009E # <control> +0x9F 0x009F # <control> +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x2018 # LEFT SINGLE QUOTATION MARK +0xA2 0x2019 # RIGHT SINGLE QUOTATION MARK +0xA3 0x00A3 # POUND SIGN +0xA6 0x00A6 # BROKEN BAR +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x00A9 # COPYRIGHT SIGN +0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC # NOT SIGN +0xAD 0x00AD # SOFT HYPHEN +0xAF 0x2015 # HORIZONTAL BAR +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x00B1 # PLUS-MINUS SIGN +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x0384 # GREEK TONOS +0xB5 0x0385 # GREEK DIALYTIKA TONOS +0xB6 0x0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS +0xB9 0x0389 # GREEK CAPITAL LETTER ETA WITH TONOS +0xBA 0x038A # GREEK CAPITAL LETTER IOTA WITH TONOS +0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x038C # GREEK CAPITAL LETTER OMICRON WITH TONOS +0xBD 0x00BD # VULGAR FRACTION ONE HALF +0xBE 0x038E # GREEK CAPITAL LETTER UPSILON WITH TONOS +0xBF 0x038F # GREEK CAPITAL LETTER OMEGA WITH TONOS +0xC0 0x0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0xC1 0x0391 # GREEK CAPITAL LETTER ALPHA +0xC2 0x0392 # GREEK CAPITAL LETTER BETA +0xC3 0x0393 # GREEK CAPITAL LETTER GAMMA +0xC4 0x0394 # GREEK CAPITAL LETTER DELTA +0xC5 0x0395 # GREEK CAPITAL LETTER EPSILON +0xC6 0x0396 # GREEK CAPITAL LETTER ZETA +0xC7 0x0397 # GREEK CAPITAL LETTER ETA +0xC8 0x0398 # GREEK CAPITAL LETTER THETA +0xC9 0x0399 # GREEK CAPITAL LETTER IOTA +0xCA 0x039A # GREEK CAPITAL LETTER KAPPA +0xCB 0x039B # GREEK CAPITAL LETTER LAMDA +0xCC 0x039C # GREEK CAPITAL LETTER MU +0xCD 0x039D # GREEK CAPITAL LETTER NU +0xCE 0x039E # GREEK CAPITAL LETTER XI +0xCF 0x039F # GREEK CAPITAL LETTER OMICRON +0xD0 0x03A0 # GREEK CAPITAL LETTER PI +0xD1 0x03A1 # GREEK CAPITAL LETTER RHO +0xD3 0x03A3 # GREEK CAPITAL LETTER SIGMA +0xD4 0x03A4 # GREEK CAPITAL LETTER TAU +0xD5 0x03A5 # GREEK CAPITAL LETTER UPSILON +0xD6 0x03A6 # GREEK CAPITAL LETTER PHI +0xD7 0x03A7 # GREEK CAPITAL LETTER CHI +0xD8 0x03A8 # GREEK CAPITAL LETTER PSI +0xD9 0x03A9 # GREEK CAPITAL LETTER OMEGA +0xDA 0x03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +0xDB 0x03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +0xDC 0x03AC # GREEK SMALL LETTER ALPHA WITH TONOS +0xDD 0x03AD # GREEK SMALL LETTER EPSILON WITH TONOS +0xDE 0x03AE # GREEK SMALL LETTER ETA WITH TONOS +0xDF 0x03AF # GREEK SMALL LETTER IOTA WITH TONOS +0xE0 0x03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +0xE1 0x03B1 # GREEK SMALL LETTER ALPHA +0xE2 0x03B2 # GREEK SMALL LETTER BETA +0xE3 0x03B3 # GREEK SMALL LETTER GAMMA +0xE4 0x03B4 # GREEK SMALL LETTER DELTA +0xE5 0x03B5 # GREEK SMALL LETTER EPSILON +0xE6 0x03B6 # GREEK SMALL LETTER ZETA +0xE7 0x03B7 # GREEK SMALL LETTER ETA +0xE8 0x03B8 # GREEK SMALL LETTER THETA +0xE9 0x03B9 # GREEK SMALL LETTER IOTA +0xEA 0x03BA # GREEK SMALL LETTER KAPPA +0xEB 0x03BB # GREEK SMALL LETTER LAMDA +0xEC 0x03BC # GREEK SMALL LETTER MU +0xED 0x03BD # GREEK SMALL LETTER NU +0xEE 0x03BE # GREEK SMALL LETTER XI +0xEF 0x03BF # GREEK SMALL LETTER OMICRON +0xF0 0x03C0 # GREEK SMALL LETTER PI +0xF1 0x03C1 # GREEK SMALL LETTER RHO +0xF2 0x03C2 # GREEK SMALL LETTER FINAL SIGMA +0xF3 0x03C3 # GREEK SMALL LETTER SIGMA +0xF4 0x03C4 # GREEK SMALL LETTER TAU +0xF5 0x03C5 # GREEK SMALL LETTER UPSILON +0xF6 0x03C6 # GREEK SMALL LETTER PHI +0xF7 0x03C7 # GREEK SMALL LETTER CHI +0xF8 0x03C8 # GREEK SMALL LETTER PSI +0xF9 0x03C9 # GREEK SMALL LETTER OMEGA +0xFA 0x03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA +0xFB 0x03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA +0xFC 0x03CC # GREEK SMALL LETTER OMICRON WITH TONOS +0xFD 0x03CD # GREEK SMALL LETTER UPSILON WITH TONOS +0xFE 0x03CE # GREEK SMALL LETTER OMEGA WITH TONOS diff --git a/lib/ucmaps/8859-8.txt b/lib/ucmaps/8859-8.txt new file mode 100644 index 000000000..bc8da4c7f --- /dev/null +++ b/lib/ucmaps/8859-8.txt @@ -0,0 +1,270 @@ +# +# Name: ISO/IEC 8859-8:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.1 +# Table format: Format A +# Date: 2000-Jan-03 +# Authors: Ken Whistler <kenw@sybase.com> +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-8:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-8 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-8 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# 1.1 version updates to the published 8859-8:1999, correcting +# the mapping of 0xAF and adding mappings for LRM and RLM. +# +# Updated versions of this file may be found in: +# <ftp://ftp.unicode.org/Public/MAPPINGS/> +# +# Any comments or problems, contact <errata@unicode.org> +# Please note that <errata@unicode.org> is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # <control> +0x81 0x0081 # <control> +0x82 0x0082 # <control> +0x83 0x0083 # <control> +0x84 0x0084 # <control> +0x85 0x0085 # <control> +0x86 0x0086 # <control> +0x87 0x0087 # <control> +0x88 0x0088 # <control> +0x89 0x0089 # <control> +0x8A 0x008A # <control> +0x8B 0x008B # <control> +0x8C 0x008C # <control> +0x8D 0x008D # <control> +0x8E 0x008E # <control> +0x8F 0x008F # <control> +0x90 0x0090 # <control> +0x91 0x0091 # <control> +0x92 0x0092 # <control> +0x93 0x0093 # <control> +0x94 0x0094 # <control> +0x95 0x0095 # <control> +0x96 0x0096 # <control> +0x97 0x0097 # <control> +0x98 0x0098 # <control> +0x99 0x0099 # <control> +0x9A 0x009A # <control> +0x9B 0x009B # <control> +0x9C 0x009C # <control> +0x9D 0x009D # <control> +0x9E 0x009E # <control> +0x9F 0x009F # <control> +0xA0 0x00A0 # NO-BREAK SPACE +0xA2 0x00A2 # CENT SIGN +0xA3 0x00A3 # POUND SIGN +0xA4 0x00A4 # CURRENCY SIGN +0xA5 0x00A5 # YEN SIGN +0xA6 0x00A6 # BROKEN BAR +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x00A9 # COPYRIGHT SIGN +0xAA 0x00D7 # MULTIPLICATION SIGN +0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC # NOT SIGN +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x00AE # REGISTERED SIGN +0xAF 0x00AF # MACRON +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x00B1 # PLUS-MINUS SIGN +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x00B4 # ACUTE ACCENT +0xB5 0x00B5 # MICRO SIGN +0xB6 0x00B6 # PILCROW SIGN +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x00B8 # CEDILLA +0xB9 0x00B9 # SUPERSCRIPT ONE +0xBA 0x00F7 # DIVISION SIGN +0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC # VULGAR FRACTION ONE QUARTER +0xBD 0x00BD # VULGAR FRACTION ONE HALF +0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS +0xDF 0x2017 # DOUBLE LOW LINE +0xE0 0x05D0 # HEBREW LETTER ALEF +0xE1 0x05D1 # HEBREW LETTER BET +0xE2 0x05D2 # HEBREW LETTER GIMEL +0xE3 0x05D3 # HEBREW LETTER DALET +0xE4 0x05D4 # HEBREW LETTER HE +0xE5 0x05D5 # HEBREW LETTER VAV +0xE6 0x05D6 # HEBREW LETTER ZAYIN +0xE7 0x05D7 # HEBREW LETTER HET +0xE8 0x05D8 # HEBREW LETTER TET +0xE9 0x05D9 # HEBREW LETTER YOD +0xEA 0x05DA # HEBREW LETTER FINAL KAF +0xEB 0x05DB # HEBREW LETTER KAF +0xEC 0x05DC # HEBREW LETTER LAMED +0xED 0x05DD # HEBREW LETTER FINAL MEM +0xEE 0x05DE # HEBREW LETTER MEM +0xEF 0x05DF # HEBREW LETTER FINAL NUN +0xF0 0x05E0 # HEBREW LETTER NUN +0xF1 0x05E1 # HEBREW LETTER SAMEKH +0xF2 0x05E2 # HEBREW LETTER AYIN +0xF3 0x05E3 # HEBREW LETTER FINAL PE +0xF4 0x05E4 # HEBREW LETTER PE +0xF5 0x05E5 # HEBREW LETTER FINAL TSADI +0xF6 0x05E6 # HEBREW LETTER TSADI +0xF7 0x05E7 # HEBREW LETTER QOF +0xF8 0x05E8 # HEBREW LETTER RESH +0xF9 0x05E9 # HEBREW LETTER SHIN +0xFA 0x05EA # HEBREW LETTER TAV +0xFD 0x200E # LEFT-TO-RIGHT MARK +0xFE 0x200F # RIGHT-TO-LEFT MARK + diff --git a/lib/ucmaps/8859-9.txt b/lib/ucmaps/8859-9.txt new file mode 100644 index 000000000..22901f107 --- /dev/null +++ b/lib/ucmaps/8859-9.txt @@ -0,0 +1,307 @@ +# +# Name: ISO/IEC 8859-9:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler <kenw@sybase.com> +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on magnetic media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-9:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-9 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-9 order. +# +# ISO/IEC 8859-9 is also equivalent to ISO-IR-148. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# +# Updated versions of this file may be found in: +# <ftp://ftp.unicode.org/Public/MAPPINGS/> +# +# Any comments or problems, contact <errata@unicode.org> +# Please note that <errata@unicode.org> is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # <control> +0x81 0x0081 # <control> +0x82 0x0082 # <control> +0x83 0x0083 # <control> +0x84 0x0084 # <control> +0x85 0x0085 # <control> +0x86 0x0086 # <control> +0x87 0x0087 # <control> +0x88 0x0088 # <control> +0x89 0x0089 # <control> +0x8A 0x008A # <control> +0x8B 0x008B # <control> +0x8C 0x008C # <control> +0x8D 0x008D # <control> +0x8E 0x008E # <control> +0x8F 0x008F # <control> +0x90 0x0090 # <control> +0x91 0x0091 # <control> +0x92 0x0092 # <control> +0x93 0x0093 # <control> +0x94 0x0094 # <control> +0x95 0x0095 # <control> +0x96 0x0096 # <control> +0x97 0x0097 # <control> +0x98 0x0098 # <control> +0x99 0x0099 # <control> +0x9A 0x009A # <control> +0x9B 0x009B # <control> +0x9C 0x009C # <control> +0x9D 0x009D # <control> +0x9E 0x009E # <control> +0x9F 0x009F # <control> +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x00A1 # INVERTED EXCLAMATION MARK +0xA2 0x00A2 # CENT SIGN +0xA3 0x00A3 # POUND SIGN +0xA4 0x00A4 # CURRENCY SIGN +0xA5 0x00A5 # YEN SIGN +0xA6 0x00A6 # BROKEN BAR +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x00A9 # COPYRIGHT SIGN +0xAA 0x00AA # FEMININE ORDINAL INDICATOR +0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC # NOT SIGN +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x00AE # REGISTERED SIGN +0xAF 0x00AF # MACRON +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x00B1 # PLUS-MINUS SIGN +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x00B4 # ACUTE ACCENT +0xB5 0x00B5 # MICRO SIGN +0xB6 0x00B6 # PILCROW SIGN +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x00B8 # CEDILLA +0xB9 0x00B9 # SUPERSCRIPT ONE +0xBA 0x00BA # MASCULINE ORDINAL INDICATOR +0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC # VULGAR FRACTION ONE QUARTER +0xBD 0x00BD # VULGAR FRACTION ONE HALF +0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS +0xBF 0x00BF # INVERTED QUESTION MARK +0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 # LATIN CAPITAL LETTER AE +0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x011E # LATIN CAPITAL LETTER G WITH BREVE +0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE +0xDE 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA +0xDF 0x00DF # LATIN SMALL LETTER SHARP S +0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 # LATIN SMALL LETTER AE +0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x011F # LATIN SMALL LETTER G WITH BREVE +0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x0131 # LATIN SMALL LETTER DOTLESS I +0xFE 0x015F # LATIN SMALL LETTER S WITH CEDILLA +0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS + + diff --git a/lib/ucmaps/cp1250.txt b/lib/ucmaps/cp1250.txt new file mode 100644 index 000000000..081d7763b --- /dev/null +++ b/lib/ucmaps/cp1250.txt @@ -0,0 +1,274 @@ +# +# Name: cp1250 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1250 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1250 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 #UNDEFINED +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 #UNDEFINED +0x89 0x2030 #PER MILLE SIGN +0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x015A #LATIN CAPITAL LETTER S WITH ACUTE +0x8D 0x0164 #LATIN CAPITAL LETTER T WITH CARON +0x8E 0x017D #LATIN CAPITAL LETTER Z WITH CARON +0x8F 0x0179 #LATIN CAPITAL LETTER Z WITH ACUTE +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 #UNDEFINED +0x99 0x2122 #TRADE MARK SIGN +0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x015B #LATIN SMALL LETTER S WITH ACUTE +0x9D 0x0165 #LATIN SMALL LETTER T WITH CARON +0x9E 0x017E #LATIN SMALL LETTER Z WITH CARON +0x9F 0x017A #LATIN SMALL LETTER Z WITH ACUTE +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x02C7 #CARON +0xA2 0x02D8 #BREVE +0xA3 0x0141 #LATIN CAPITAL LETTER L WITH STROKE +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x0104 #LATIN CAPITAL LETTER A WITH OGONEK +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x015E #LATIN CAPITAL LETTER S WITH CEDILLA +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x017B #LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x02DB #OGONEK +0xB3 0x0142 #LATIN SMALL LETTER L WITH STROKE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x0105 #LATIN SMALL LETTER A WITH OGONEK +0xBA 0x015F #LATIN SMALL LETTER S WITH CEDILLA +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x013D #LATIN CAPITAL LETTER L WITH CARON +0xBD 0x02DD #DOUBLE ACUTE ACCENT +0xBE 0x013E #LATIN SMALL LETTER L WITH CARON +0xBF 0x017C #LATIN SMALL LETTER Z WITH DOT ABOVE +0xC0 0x0154 #LATIN CAPITAL LETTER R WITH ACUTE +0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x0102 #LATIN CAPITAL LETTER A WITH BREVE +0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x0139 #LATIN CAPITAL LETTER L WITH ACUTE +0xC6 0x0106 #LATIN CAPITAL LETTER C WITH ACUTE +0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x010C #LATIN CAPITAL LETTER C WITH CARON +0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x0118 #LATIN CAPITAL LETTER E WITH OGONEK +0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x011A #LATIN CAPITAL LETTER E WITH CARON +0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x010E #LATIN CAPITAL LETTER D WITH CARON +0xD0 0x0110 #LATIN CAPITAL LETTER D WITH STROKE +0xD1 0x0143 #LATIN CAPITAL LETTER N WITH ACUTE +0xD2 0x0147 #LATIN CAPITAL LETTER N WITH CARON +0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x0150 #LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x0158 #LATIN CAPITAL LETTER R WITH CARON +0xD9 0x016E #LATIN CAPITAL LETTER U WITH RING ABOVE +0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x0170 #LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x00DD #LATIN CAPITAL LETTER Y WITH ACUTE +0xDE 0x0162 #LATIN CAPITAL LETTER T WITH CEDILLA +0xDF 0x00DF #LATIN SMALL LETTER SHARP S +0xE0 0x0155 #LATIN SMALL LETTER R WITH ACUTE +0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x0103 #LATIN SMALL LETTER A WITH BREVE +0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x013A #LATIN SMALL LETTER L WITH ACUTE +0xE6 0x0107 #LATIN SMALL LETTER C WITH ACUTE +0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x010D #LATIN SMALL LETTER C WITH CARON +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x0119 #LATIN SMALL LETTER E WITH OGONEK +0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x011B #LATIN SMALL LETTER E WITH CARON +0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x010F #LATIN SMALL LETTER D WITH CARON +0xF0 0x0111 #LATIN SMALL LETTER D WITH STROKE +0xF1 0x0144 #LATIN SMALL LETTER N WITH ACUTE +0xF2 0x0148 #LATIN SMALL LETTER N WITH CARON +0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x0151 #LATIN SMALL LETTER O WITH DOUBLE ACUTE +0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x0159 #LATIN SMALL LETTER R WITH CARON +0xF9 0x016F #LATIN SMALL LETTER U WITH RING ABOVE +0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE +0xFB 0x0171 #LATIN SMALL LETTER U WITH DOUBLE ACUTE +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x00FD #LATIN SMALL LETTER Y WITH ACUTE +0xFE 0x0163 #LATIN SMALL LETTER T WITH CEDILLA +0xFF 0x02D9 #DOT ABOVE diff --git a/lib/ucmaps/cp1251.txt b/lib/ucmaps/cp1251.txt new file mode 100644 index 000000000..37eadbdbc --- /dev/null +++ b/lib/ucmaps/cp1251.txt @@ -0,0 +1,274 @@ +# +# Name: cp1251 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1251 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1251 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x0402 #CYRILLIC CAPITAL LETTER DJE +0x81 0x0403 #CYRILLIC CAPITAL LETTER GJE +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0453 #CYRILLIC SMALL LETTER GJE +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x20AC #EURO SIGN +0x89 0x2030 #PER MILLE SIGN +0x8A 0x0409 #CYRILLIC CAPITAL LETTER LJE +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x040A #CYRILLIC CAPITAL LETTER NJE +0x8D 0x040C #CYRILLIC CAPITAL LETTER KJE +0x8E 0x040B #CYRILLIC CAPITAL LETTER TSHE +0x8F 0x040F #CYRILLIC CAPITAL LETTER DZHE +0x90 0x0452 #CYRILLIC SMALL LETTER DJE +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 #UNDEFINED +0x99 0x2122 #TRADE MARK SIGN +0x9A 0x0459 #CYRILLIC SMALL LETTER LJE +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x045A #CYRILLIC SMALL LETTER NJE +0x9D 0x045C #CYRILLIC SMALL LETTER KJE +0x9E 0x045B #CYRILLIC SMALL LETTER TSHE +0x9F 0x045F #CYRILLIC SMALL LETTER DZHE +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x040E #CYRILLIC CAPITAL LETTER SHORT U +0xA2 0x045E #CYRILLIC SMALL LETTER SHORT U +0xA3 0x0408 #CYRILLIC CAPITAL LETTER JE +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x0490 #CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x0401 #CYRILLIC CAPITAL LETTER IO +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x0404 #CYRILLIC CAPITAL LETTER UKRAINIAN IE +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x0407 #CYRILLIC CAPITAL LETTER YI +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x0406 #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0xB3 0x0456 #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0xB4 0x0491 #CYRILLIC SMALL LETTER GHE WITH UPTURN +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x0451 #CYRILLIC SMALL LETTER IO +0xB9 0x2116 #NUMERO SIGN +0xBA 0x0454 #CYRILLIC SMALL LETTER UKRAINIAN IE +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x0458 #CYRILLIC SMALL LETTER JE +0xBD 0x0405 #CYRILLIC CAPITAL LETTER DZE +0xBE 0x0455 #CYRILLIC SMALL LETTER DZE +0xBF 0x0457 #CYRILLIC SMALL LETTER YI +0xC0 0x0410 #CYRILLIC CAPITAL LETTER A +0xC1 0x0411 #CYRILLIC CAPITAL LETTER BE +0xC2 0x0412 #CYRILLIC CAPITAL LETTER VE +0xC3 0x0413 #CYRILLIC CAPITAL LETTER GHE +0xC4 0x0414 #CYRILLIC CAPITAL LETTER DE +0xC5 0x0415 #CYRILLIC CAPITAL LETTER IE +0xC6 0x0416 #CYRILLIC CAPITAL LETTER ZHE +0xC7 0x0417 #CYRILLIC CAPITAL LETTER ZE +0xC8 0x0418 #CYRILLIC CAPITAL LETTER I +0xC9 0x0419 #CYRILLIC CAPITAL LETTER SHORT I +0xCA 0x041A #CYRILLIC CAPITAL LETTER KA +0xCB 0x041B #CYRILLIC CAPITAL LETTER EL +0xCC 0x041C #CYRILLIC CAPITAL LETTER EM +0xCD 0x041D #CYRILLIC CAPITAL LETTER EN +0xCE 0x041E #CYRILLIC CAPITAL LETTER O +0xCF 0x041F #CYRILLIC CAPITAL LETTER PE +0xD0 0x0420 #CYRILLIC CAPITAL LETTER ER +0xD1 0x0421 #CYRILLIC CAPITAL LETTER ES +0xD2 0x0422 #CYRILLIC CAPITAL LETTER TE +0xD3 0x0423 #CYRILLIC CAPITAL LETTER U +0xD4 0x0424 #CYRILLIC CAPITAL LETTER EF +0xD5 0x0425 #CYRILLIC CAPITAL LETTER HA +0xD6 0x0426 #CYRILLIC CAPITAL LETTER TSE +0xD7 0x0427 #CYRILLIC CAPITAL LETTER CHE +0xD8 0x0428 #CYRILLIC CAPITAL LETTER SHA +0xD9 0x0429 #CYRILLIC CAPITAL LETTER SHCHA +0xDA 0x042A #CYRILLIC CAPITAL LETTER HARD SIGN +0xDB 0x042B #CYRILLIC CAPITAL LETTER YERU +0xDC 0x042C #CYRILLIC CAPITAL LETTER SOFT SIGN +0xDD 0x042D #CYRILLIC CAPITAL LETTER E +0xDE 0x042E #CYRILLIC CAPITAL LETTER YU +0xDF 0x042F #CYRILLIC CAPITAL LETTER YA +0xE0 0x0430 #CYRILLIC SMALL LETTER A +0xE1 0x0431 #CYRILLIC SMALL LETTER BE +0xE2 0x0432 #CYRILLIC SMALL LETTER VE +0xE3 0x0433 #CYRILLIC SMALL LETTER GHE +0xE4 0x0434 #CYRILLIC SMALL LETTER DE +0xE5 0x0435 #CYRILLIC SMALL LETTER IE +0xE6 0x0436 #CYRILLIC SMALL LETTER ZHE +0xE7 0x0437 #CYRILLIC SMALL LETTER ZE +0xE8 0x0438 #CYRILLIC SMALL LETTER I +0xE9 0x0439 #CYRILLIC SMALL LETTER SHORT I +0xEA 0x043A #CYRILLIC SMALL LETTER KA +0xEB 0x043B #CYRILLIC SMALL LETTER EL +0xEC 0x043C #CYRILLIC SMALL LETTER EM +0xED 0x043D #CYRILLIC SMALL LETTER EN +0xEE 0x043E #CYRILLIC SMALL LETTER O +0xEF 0x043F #CYRILLIC SMALL LETTER PE +0xF0 0x0440 #CYRILLIC SMALL LETTER ER +0xF1 0x0441 #CYRILLIC SMALL LETTER ES +0xF2 0x0442 #CYRILLIC SMALL LETTER TE +0xF3 0x0443 #CYRILLIC SMALL LETTER U +0xF4 0x0444 #CYRILLIC SMALL LETTER EF +0xF5 0x0445 #CYRILLIC SMALL LETTER HA +0xF6 0x0446 #CYRILLIC SMALL LETTER TSE +0xF7 0x0447 #CYRILLIC SMALL LETTER CHE +0xF8 0x0448 #CYRILLIC SMALL LETTER SHA +0xF9 0x0449 #CYRILLIC SMALL LETTER SHCHA +0xFA 0x044A #CYRILLIC SMALL LETTER HARD SIGN +0xFB 0x044B #CYRILLIC SMALL LETTER YERU +0xFC 0x044C #CYRILLIC SMALL LETTER SOFT SIGN +0xFD 0x044D #CYRILLIC SMALL LETTER E +0xFE 0x044E #CYRILLIC SMALL LETTER YU +0xFF 0x044F #CYRILLIC SMALL LETTER YA diff --git a/lib/ucmaps/cp1252.txt b/lib/ucmaps/cp1252.txt new file mode 100644 index 000000000..2ca4486eb --- /dev/null +++ b/lib/ucmaps/cp1252.txt @@ -0,0 +1,274 @@ +# +# Name: cp1252 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1252 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1252 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT +0x89 0x2030 #PER MILLE SIGN +0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x0152 #LATIN CAPITAL LIGATURE OE +0x8D #UNDEFINED +0x8E 0x017D #LATIN CAPITAL LETTER Z WITH CARON +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 0x02DC #SMALL TILDE +0x99 0x2122 #TRADE MARK SIGN +0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x0153 #LATIN SMALL LIGATURE OE +0x9D #UNDEFINED +0x9E 0x017E #LATIN SMALL LETTER Z WITH CARON +0x9F 0x0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x00A1 #INVERTED EXCLAMATION MARK +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x00AA #FEMININE ORDINAL INDICATOR +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00AF #MACRON +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x00BA #MASCULINE ORDINAL INDICATOR +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x00BF #INVERTED QUESTION MARK +0xC0 0x00C0 #LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 #LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 #LATIN CAPITAL LETTER AE +0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 #LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC #LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF #LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x00D0 #LATIN CAPITAL LETTER ETH +0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 #LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 #LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 #LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x00DD #LATIN CAPITAL LETTER Y WITH ACUTE +0xDE 0x00DE #LATIN CAPITAL LETTER THORN +0xDF 0x00DF #LATIN SMALL LETTER SHARP S +0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 #LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 #LATIN SMALL LETTER AE +0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC #LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x00F0 #LATIN SMALL LETTER ETH +0xF1 0x00F1 #LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 #LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 #LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x00F8 #LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x00FD #LATIN SMALL LETTER Y WITH ACUTE +0xFE 0x00FE #LATIN SMALL LETTER THORN +0xFF 0x00FF #LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/lib/ucmaps/cp1253.txt b/lib/ucmaps/cp1253.txt new file mode 100644 index 000000000..2ba51a0c8 --- /dev/null +++ b/lib/ucmaps/cp1253.txt @@ -0,0 +1,274 @@ +# +# Name: cp1253 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1253 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1253 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 #UNDEFINED +0x89 0x2030 #PER MILLE SIGN +0x8A #UNDEFINED +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C #UNDEFINED +0x8D #UNDEFINED +0x8E #UNDEFINED +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 #UNDEFINED +0x99 0x2122 #TRADE MARK SIGN +0x9A #UNDEFINED +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C #UNDEFINED +0x9D #UNDEFINED +0x9E #UNDEFINED +0x9F #UNDEFINED +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x0385 #GREEK DIALYTIKA TONOS +0xA2 0x0386 #GREEK CAPITAL LETTER ALPHA WITH TONOS +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA #UNDEFINED +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x2015 #HORIZONTAL BAR +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x0384 #GREEK TONOS +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x0388 #GREEK CAPITAL LETTER EPSILON WITH TONOS +0xB9 0x0389 #GREEK CAPITAL LETTER ETA WITH TONOS +0xBA 0x038A #GREEK CAPITAL LETTER IOTA WITH TONOS +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x038C #GREEK CAPITAL LETTER OMICRON WITH TONOS +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x038E #GREEK CAPITAL LETTER UPSILON WITH TONOS +0xBF 0x038F #GREEK CAPITAL LETTER OMEGA WITH TONOS +0xC0 0x0390 #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0xC1 0x0391 #GREEK CAPITAL LETTER ALPHA +0xC2 0x0392 #GREEK CAPITAL LETTER BETA +0xC3 0x0393 #GREEK CAPITAL LETTER GAMMA +0xC4 0x0394 #GREEK CAPITAL LETTER DELTA +0xC5 0x0395 #GREEK CAPITAL LETTER EPSILON +0xC6 0x0396 #GREEK CAPITAL LETTER ZETA +0xC7 0x0397 #GREEK CAPITAL LETTER ETA +0xC8 0x0398 #GREEK CAPITAL LETTER THETA +0xC9 0x0399 #GREEK CAPITAL LETTER IOTA +0xCA 0x039A #GREEK CAPITAL LETTER KAPPA +0xCB 0x039B #GREEK CAPITAL LETTER LAMDA +0xCC 0x039C #GREEK CAPITAL LETTER MU +0xCD 0x039D #GREEK CAPITAL LETTER NU +0xCE 0x039E #GREEK CAPITAL LETTER XI +0xCF 0x039F #GREEK CAPITAL LETTER OMICRON +0xD0 0x03A0 #GREEK CAPITAL LETTER PI +0xD1 0x03A1 #GREEK CAPITAL LETTER RHO +0xD2 #UNDEFINED +0xD3 0x03A3 #GREEK CAPITAL LETTER SIGMA +0xD4 0x03A4 #GREEK CAPITAL LETTER TAU +0xD5 0x03A5 #GREEK CAPITAL LETTER UPSILON +0xD6 0x03A6 #GREEK CAPITAL LETTER PHI +0xD7 0x03A7 #GREEK CAPITAL LETTER CHI +0xD8 0x03A8 #GREEK CAPITAL LETTER PSI +0xD9 0x03A9 #GREEK CAPITAL LETTER OMEGA +0xDA 0x03AA #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +0xDB 0x03AB #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +0xDC 0x03AC #GREEK SMALL LETTER ALPHA WITH TONOS +0xDD 0x03AD #GREEK SMALL LETTER EPSILON WITH TONOS +0xDE 0x03AE #GREEK SMALL LETTER ETA WITH TONOS +0xDF 0x03AF #GREEK SMALL LETTER IOTA WITH TONOS +0xE0 0x03B0 #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +0xE1 0x03B1 #GREEK SMALL LETTER ALPHA +0xE2 0x03B2 #GREEK SMALL LETTER BETA +0xE3 0x03B3 #GREEK SMALL LETTER GAMMA +0xE4 0x03B4 #GREEK SMALL LETTER DELTA +0xE5 0x03B5 #GREEK SMALL LETTER EPSILON +0xE6 0x03B6 #GREEK SMALL LETTER ZETA +0xE7 0x03B7 #GREEK SMALL LETTER ETA +0xE8 0x03B8 #GREEK SMALL LETTER THETA +0xE9 0x03B9 #GREEK SMALL LETTER IOTA +0xEA 0x03BA #GREEK SMALL LETTER KAPPA +0xEB 0x03BB #GREEK SMALL LETTER LAMDA +0xEC 0x03BC #GREEK SMALL LETTER MU +0xED 0x03BD #GREEK SMALL LETTER NU +0xEE 0x03BE #GREEK SMALL LETTER XI +0xEF 0x03BF #GREEK SMALL LETTER OMICRON +0xF0 0x03C0 #GREEK SMALL LETTER PI +0xF1 0x03C1 #GREEK SMALL LETTER RHO +0xF2 0x03C2 #GREEK SMALL LETTER FINAL SIGMA +0xF3 0x03C3 #GREEK SMALL LETTER SIGMA +0xF4 0x03C4 #GREEK SMALL LETTER TAU +0xF5 0x03C5 #GREEK SMALL LETTER UPSILON +0xF6 0x03C6 #GREEK SMALL LETTER PHI +0xF7 0x03C7 #GREEK SMALL LETTER CHI +0xF8 0x03C8 #GREEK SMALL LETTER PSI +0xF9 0x03C9 #GREEK SMALL LETTER OMEGA +0xFA 0x03CA #GREEK SMALL LETTER IOTA WITH DIALYTIKA +0xFB 0x03CB #GREEK SMALL LETTER UPSILON WITH DIALYTIKA +0xFC 0x03CC #GREEK SMALL LETTER OMICRON WITH TONOS +0xFD 0x03CD #GREEK SMALL LETTER UPSILON WITH TONOS +0xFE 0x03CE #GREEK SMALL LETTER OMEGA WITH TONOS +0xFF #UNDEFINED diff --git a/lib/ucmaps/cp1254.txt b/lib/ucmaps/cp1254.txt new file mode 100644 index 000000000..ca1a1ebdb --- /dev/null +++ b/lib/ucmaps/cp1254.txt @@ -0,0 +1,274 @@ +# +# Name: cp1254 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1254 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1254 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT +0x89 0x2030 #PER MILLE SIGN +0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x0152 #LATIN CAPITAL LIGATURE OE +0x8D #UNDEFINED +0x8E #UNDEFINED +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 0x02DC #SMALL TILDE +0x99 0x2122 #TRADE MARK SIGN +0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x0153 #LATIN SMALL LIGATURE OE +0x9D #UNDEFINED +0x9E #UNDEFINED +0x9F 0x0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x00A1 #INVERTED EXCLAMATION MARK +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x00AA #FEMININE ORDINAL INDICATOR +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00AF #MACRON +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x00BA #MASCULINE ORDINAL INDICATOR +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x00BF #INVERTED QUESTION MARK +0xC0 0x00C0 #LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 #LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 #LATIN CAPITAL LETTER AE +0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 #LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC #LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF #LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x011E #LATIN CAPITAL LETTER G WITH BREVE +0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 #LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 #LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 #LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x0130 #LATIN CAPITAL LETTER I WITH DOT ABOVE +0xDE 0x015E #LATIN CAPITAL LETTER S WITH CEDILLA +0xDF 0x00DF #LATIN SMALL LETTER SHARP S +0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 #LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 #LATIN SMALL LETTER AE +0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC #LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x011F #LATIN SMALL LETTER G WITH BREVE +0xF1 0x00F1 #LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 #LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 #LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x00F8 #LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x0131 #LATIN SMALL LETTER DOTLESS I +0xFE 0x015F #LATIN SMALL LETTER S WITH CEDILLA +0xFF 0x00FF #LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/lib/ucmaps/cp1255.txt b/lib/ucmaps/cp1255.txt new file mode 100644 index 000000000..341517f11 --- /dev/null +++ b/lib/ucmaps/cp1255.txt @@ -0,0 +1,274 @@ +# +# Name: cp1255 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 1/7/2000 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1255 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1255 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT +0x89 0x2030 #PER MILLE SIGN +0x8A #UNDEFINED +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C #UNDEFINED +0x8D #UNDEFINED +0x8E #UNDEFINED +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 0x02DC #SMALL TILDE +0x99 0x2122 #TRADE MARK SIGN +0x9A #UNDEFINED +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C #UNDEFINED +0x9D #UNDEFINED +0x9E #UNDEFINED +0x9F #UNDEFINED +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x00A1 #INVERTED EXCLAMATION MARK +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x20AA #NEW SHEQEL SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x00D7 #MULTIPLICATION SIGN +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00AF #MACRON +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x00F7 #DIVISION SIGN +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x00BF #INVERTED QUESTION MARK +0xC0 0x05B0 #HEBREW POINT SHEVA +0xC1 0x05B1 #HEBREW POINT HATAF SEGOL +0xC2 0x05B2 #HEBREW POINT HATAF PATAH +0xC3 0x05B3 #HEBREW POINT HATAF QAMATS +0xC4 0x05B4 #HEBREW POINT HIRIQ +0xC5 0x05B5 #HEBREW POINT TSERE +0xC6 0x05B6 #HEBREW POINT SEGOL +0xC7 0x05B7 #HEBREW POINT PATAH +0xC8 0x05B8 #HEBREW POINT QAMATS +0xC9 0x05B9 #HEBREW POINT HOLAM +0xCA #UNDEFINED +0xCB 0x05BB #HEBREW POINT QUBUTS +0xCC 0x05BC #HEBREW POINT DAGESH OR MAPIQ +0xCD 0x05BD #HEBREW POINT METEG +0xCE 0x05BE #HEBREW PUNCTUATION MAQAF +0xCF 0x05BF #HEBREW POINT RAFE +0xD0 0x05C0 #HEBREW PUNCTUATION PASEQ +0xD1 0x05C1 #HEBREW POINT SHIN DOT +0xD2 0x05C2 #HEBREW POINT SIN DOT +0xD3 0x05C3 #HEBREW PUNCTUATION SOF PASUQ +0xD4 0x05F0 #HEBREW LIGATURE YIDDISH DOUBLE VAV +0xD5 0x05F1 #HEBREW LIGATURE YIDDISH VAV YOD +0xD6 0x05F2 #HEBREW LIGATURE YIDDISH DOUBLE YOD +0xD7 0x05F3 #HEBREW PUNCTUATION GERESH +0xD8 0x05F4 #HEBREW PUNCTUATION GERSHAYIM +0xD9 #UNDEFINED +0xDA #UNDEFINED +0xDB #UNDEFINED +0xDC #UNDEFINED +0xDD #UNDEFINED +0xDE #UNDEFINED +0xDF #UNDEFINED +0xE0 0x05D0 #HEBREW LETTER ALEF +0xE1 0x05D1 #HEBREW LETTER BET +0xE2 0x05D2 #HEBREW LETTER GIMEL +0xE3 0x05D3 #HEBREW LETTER DALET +0xE4 0x05D4 #HEBREW LETTER HE +0xE5 0x05D5 #HEBREW LETTER VAV +0xE6 0x05D6 #HEBREW LETTER ZAYIN +0xE7 0x05D7 #HEBREW LETTER HET +0xE8 0x05D8 #HEBREW LETTER TET +0xE9 0x05D9 #HEBREW LETTER YOD +0xEA 0x05DA #HEBREW LETTER FINAL KAF +0xEB 0x05DB #HEBREW LETTER KAF +0xEC 0x05DC #HEBREW LETTER LAMED +0xED 0x05DD #HEBREW LETTER FINAL MEM +0xEE 0x05DE #HEBREW LETTER MEM +0xEF 0x05DF #HEBREW LETTER FINAL NUN +0xF0 0x05E0 #HEBREW LETTER NUN +0xF1 0x05E1 #HEBREW LETTER SAMEKH +0xF2 0x05E2 #HEBREW LETTER AYIN +0xF3 0x05E3 #HEBREW LETTER FINAL PE +0xF4 0x05E4 #HEBREW LETTER PE +0xF5 0x05E5 #HEBREW LETTER FINAL TSADI +0xF6 0x05E6 #HEBREW LETTER TSADI +0xF7 0x05E7 #HEBREW LETTER QOF +0xF8 0x05E8 #HEBREW LETTER RESH +0xF9 0x05E9 #HEBREW LETTER SHIN +0xFA 0x05EA #HEBREW LETTER TAV +0xFB #UNDEFINED +0xFC #UNDEFINED +0xFD 0x200E #LEFT-TO-RIGHT MARK +0xFE 0x200F #RIGHT-TO-LEFT MARK +0xFF #UNDEFINED diff --git a/lib/ucmaps/cp1256.txt b/lib/ucmaps/cp1256.txt new file mode 100644 index 000000000..0edd081b9 --- /dev/null +++ b/lib/ucmaps/cp1256.txt @@ -0,0 +1,274 @@ +# +# Name: cp1256 to Unicode table +# Unicode version: 2.1 +# Table version: 2.01 +# Table format: Format A +# Date: 01/5/99 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1256 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1256 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 0x067E #ARABIC LETTER PEH +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT +0x89 0x2030 #PER MILLE SIGN +0x8A 0x0679 #ARABIC LETTER TTEH +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x0152 #LATIN CAPITAL LIGATURE OE +0x8D 0x0686 #ARABIC LETTER TCHEH +0x8E 0x0698 #ARABIC LETTER JEH +0x8F 0x0688 #ARABIC LETTER DDAL +0x90 0x06AF #ARABIC LETTER GAF +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 0x06A9 #ARABIC LETTER KEHEH +0x99 0x2122 #TRADE MARK SIGN +0x9A 0x0691 #ARABIC LETTER RREH +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x0153 #LATIN SMALL LIGATURE OE +0x9D 0x200C #ZERO WIDTH NON-JOINER +0x9E 0x200D #ZERO WIDTH JOINER +0x9F 0x06BA #ARABIC LETTER NOON GHUNNA +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x060C #ARABIC COMMA +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x06BE #ARABIC LETTER HEH DOACHASHMEE +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00AF #MACRON +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x061B #ARABIC SEMICOLON +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x061F #ARABIC QUESTION MARK +0xC0 0x06C1 #ARABIC LETTER HEH GOAL +0xC1 0x0621 #ARABIC LETTER HAMZA +0xC2 0x0622 #ARABIC LETTER ALEF WITH MADDA ABOVE +0xC3 0x0623 #ARABIC LETTER ALEF WITH HAMZA ABOVE +0xC4 0x0624 #ARABIC LETTER WAW WITH HAMZA ABOVE +0xC5 0x0625 #ARABIC LETTER ALEF WITH HAMZA BELOW +0xC6 0x0626 #ARABIC LETTER YEH WITH HAMZA ABOVE +0xC7 0x0627 #ARABIC LETTER ALEF +0xC8 0x0628 #ARABIC LETTER BEH +0xC9 0x0629 #ARABIC LETTER TEH MARBUTA +0xCA 0x062A #ARABIC LETTER TEH +0xCB 0x062B #ARABIC LETTER THEH +0xCC 0x062C #ARABIC LETTER JEEM +0xCD 0x062D #ARABIC LETTER HAH +0xCE 0x062E #ARABIC LETTER KHAH +0xCF 0x062F #ARABIC LETTER DAL +0xD0 0x0630 #ARABIC LETTER THAL +0xD1 0x0631 #ARABIC LETTER REH +0xD2 0x0632 #ARABIC LETTER ZAIN +0xD3 0x0633 #ARABIC LETTER SEEN +0xD4 0x0634 #ARABIC LETTER SHEEN +0xD5 0x0635 #ARABIC LETTER SAD +0xD6 0x0636 #ARABIC LETTER DAD +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x0637 #ARABIC LETTER TAH +0xD9 0x0638 #ARABIC LETTER ZAH +0xDA 0x0639 #ARABIC LETTER AIN +0xDB 0x063A #ARABIC LETTER GHAIN +0xDC 0x0640 #ARABIC TATWEEL +0xDD 0x0641 #ARABIC LETTER FEH +0xDE 0x0642 #ARABIC LETTER QAF +0xDF 0x0643 #ARABIC LETTER KAF +0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE +0xE1 0x0644 #ARABIC LETTER LAM +0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x0645 #ARABIC LETTER MEEM +0xE4 0x0646 #ARABIC LETTER NOON +0xE5 0x0647 #ARABIC LETTER HEH +0xE6 0x0648 #ARABIC LETTER WAW +0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x0649 #ARABIC LETTER ALEF MAKSURA +0xED 0x064A #ARABIC LETTER YEH +0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x064B #ARABIC FATHATAN +0xF1 0x064C #ARABIC DAMMATAN +0xF2 0x064D #ARABIC KASRATAN +0xF3 0x064E #ARABIC FATHA +0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x064F #ARABIC DAMMA +0xF6 0x0650 #ARABIC KASRA +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x0651 #ARABIC SHADDA +0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE +0xFA 0x0652 #ARABIC SUKUN +0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x200E #LEFT-TO-RIGHT MARK +0xFE 0x200F #RIGHT-TO-LEFT MARK +0xFF 0x06D2 #ARABIC LETTER YEH BARREE diff --git a/lib/ucmaps/cp1257.txt b/lib/ucmaps/cp1257.txt new file mode 100644 index 000000000..97979d931 --- /dev/null +++ b/lib/ucmaps/cp1257.txt @@ -0,0 +1,274 @@ +# +# Name: cp1257 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1257 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1257 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 #UNDEFINED +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 #UNDEFINED +0x89 0x2030 #PER MILLE SIGN +0x8A #UNDEFINED +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C #UNDEFINED +0x8D 0x00A8 #DIAERESIS +0x8E 0x02C7 #CARON +0x8F 0x00B8 #CEDILLA +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 #UNDEFINED +0x99 0x2122 #TRADE MARK SIGN +0x9A #UNDEFINED +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C #UNDEFINED +0x9D 0x00AF #MACRON +0x9E 0x02DB #OGONEK +0x9F #UNDEFINED +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 #UNDEFINED +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 #UNDEFINED +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x0156 #LATIN CAPITAL LETTER R WITH CEDILLA +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00C6 #LATIN CAPITAL LETTER AE +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00F8 #LATIN SMALL LETTER O WITH STROKE +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x0157 #LATIN SMALL LETTER R WITH CEDILLA +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x00E6 #LATIN SMALL LETTER AE +0xC0 0x0104 #LATIN CAPITAL LETTER A WITH OGONEK +0xC1 0x012E #LATIN CAPITAL LETTER I WITH OGONEK +0xC2 0x0100 #LATIN CAPITAL LETTER A WITH MACRON +0xC3 0x0106 #LATIN CAPITAL LETTER C WITH ACUTE +0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x0118 #LATIN CAPITAL LETTER E WITH OGONEK +0xC7 0x0112 #LATIN CAPITAL LETTER E WITH MACRON +0xC8 0x010C #LATIN CAPITAL LETTER C WITH CARON +0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x0179 #LATIN CAPITAL LETTER Z WITH ACUTE +0xCB 0x0116 #LATIN CAPITAL LETTER E WITH DOT ABOVE +0xCC 0x0122 #LATIN CAPITAL LETTER G WITH CEDILLA +0xCD 0x0136 #LATIN CAPITAL LETTER K WITH CEDILLA +0xCE 0x012A #LATIN CAPITAL LETTER I WITH MACRON +0xCF 0x013B #LATIN CAPITAL LETTER L WITH CEDILLA +0xD0 0x0160 #LATIN CAPITAL LETTER S WITH CARON +0xD1 0x0143 #LATIN CAPITAL LETTER N WITH ACUTE +0xD2 0x0145 #LATIN CAPITAL LETTER N WITH CEDILLA +0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x014C #LATIN CAPITAL LETTER O WITH MACRON +0xD5 0x00D5 #LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x0172 #LATIN CAPITAL LETTER U WITH OGONEK +0xD9 0x0141 #LATIN CAPITAL LETTER L WITH STROKE +0xDA 0x015A #LATIN CAPITAL LETTER S WITH ACUTE +0xDB 0x016A #LATIN CAPITAL LETTER U WITH MACRON +0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x017B #LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xDE 0x017D #LATIN CAPITAL LETTER Z WITH CARON +0xDF 0x00DF #LATIN SMALL LETTER SHARP S +0xE0 0x0105 #LATIN SMALL LETTER A WITH OGONEK +0xE1 0x012F #LATIN SMALL LETTER I WITH OGONEK +0xE2 0x0101 #LATIN SMALL LETTER A WITH MACRON +0xE3 0x0107 #LATIN SMALL LETTER C WITH ACUTE +0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x0119 #LATIN SMALL LETTER E WITH OGONEK +0xE7 0x0113 #LATIN SMALL LETTER E WITH MACRON +0xE8 0x010D #LATIN SMALL LETTER C WITH CARON +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x017A #LATIN SMALL LETTER Z WITH ACUTE +0xEB 0x0117 #LATIN SMALL LETTER E WITH DOT ABOVE +0xEC 0x0123 #LATIN SMALL LETTER G WITH CEDILLA +0xED 0x0137 #LATIN SMALL LETTER K WITH CEDILLA +0xEE 0x012B #LATIN SMALL LETTER I WITH MACRON +0xEF 0x013C #LATIN SMALL LETTER L WITH CEDILLA +0xF0 0x0161 #LATIN SMALL LETTER S WITH CARON +0xF1 0x0144 #LATIN SMALL LETTER N WITH ACUTE +0xF2 0x0146 #LATIN SMALL LETTER N WITH CEDILLA +0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE +0xF4 0x014D #LATIN SMALL LETTER O WITH MACRON +0xF5 0x00F5 #LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x0173 #LATIN SMALL LETTER U WITH OGONEK +0xF9 0x0142 #LATIN SMALL LETTER L WITH STROKE +0xFA 0x015B #LATIN SMALL LETTER S WITH ACUTE +0xFB 0x016B #LATIN SMALL LETTER U WITH MACRON +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x017C #LATIN SMALL LETTER Z WITH DOT ABOVE +0xFE 0x017E #LATIN SMALL LETTER Z WITH CARON +0xFF 0x02D9 #DOT ABOVE diff --git a/lib/ucmaps/cp1258.txt b/lib/ucmaps/cp1258.txt new file mode 100644 index 000000000..392310a8c --- /dev/null +++ b/lib/ucmaps/cp1258.txt @@ -0,0 +1,274 @@ +# +# Name: cp1258 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp1258 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp1258 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 0x201A #SINGLE LOW-9 QUOTATION MARK +0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK +0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 0x2020 #DAGGER +0x87 0x2021 #DOUBLE DAGGER +0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT +0x89 0x2030 #PER MILLE SIGN +0x8A #UNDEFINED +0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x8C 0x0152 #LATIN CAPITAL LIGATURE OE +0x8D #UNDEFINED +0x8E #UNDEFINED +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 0x02DC #SMALL TILDE +0x99 0x2122 #TRADE MARK SIGN +0x9A #UNDEFINED +0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x9C 0x0153 #LATIN SMALL LIGATURE OE +0x9D #UNDEFINED +0x9E #UNDEFINED +0x9F 0x0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x00A1 #INVERTED EXCLAMATION MARK +0xA2 0x00A2 #CENT SIGN +0xA3 0x00A3 #POUND SIGN +0xA4 0x00A4 #CURRENCY SIGN +0xA5 0x00A5 #YEN SIGN +0xA6 0x00A6 #BROKEN BAR +0xA7 0x00A7 #SECTION SIGN +0xA8 0x00A8 #DIAERESIS +0xA9 0x00A9 #COPYRIGHT SIGN +0xAA 0x00AA #FEMININE ORDINAL INDICATOR +0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC #NOT SIGN +0xAD 0x00AD #SOFT HYPHEN +0xAE 0x00AE #REGISTERED SIGN +0xAF 0x00AF #MACRON +0xB0 0x00B0 #DEGREE SIGN +0xB1 0x00B1 #PLUS-MINUS SIGN +0xB2 0x00B2 #SUPERSCRIPT TWO +0xB3 0x00B3 #SUPERSCRIPT THREE +0xB4 0x00B4 #ACUTE ACCENT +0xB5 0x00B5 #MICRO SIGN +0xB6 0x00B6 #PILCROW SIGN +0xB7 0x00B7 #MIDDLE DOT +0xB8 0x00B8 #CEDILLA +0xB9 0x00B9 #SUPERSCRIPT ONE +0xBA 0x00BA #MASCULINE ORDINAL INDICATOR +0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC #VULGAR FRACTION ONE QUARTER +0xBD 0x00BD #VULGAR FRACTION ONE HALF +0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS +0xBF 0x00BF #INVERTED QUESTION MARK +0xC0 0x00C0 #LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x0102 #LATIN CAPITAL LETTER A WITH BREVE +0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 #LATIN CAPITAL LETTER AE +0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 #LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x0300 #COMBINING GRAVE ACCENT +0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF #LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x0110 #LATIN CAPITAL LETTER D WITH STROKE +0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x0309 #COMBINING HOOK ABOVE +0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x01A0 #LATIN CAPITAL LETTER O WITH HORN +0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 #MULTIPLICATION SIGN +0xD8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 #LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x01AF #LATIN CAPITAL LETTER U WITH HORN +0xDE 0x0303 #COMBINING TILDE +0xDF 0x00DF #LATIN SMALL LETTER SHARP S +0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x0103 #LATIN SMALL LETTER A WITH BREVE +0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 #LATIN SMALL LETTER AE +0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x0301 #COMBINING ACUTE ACCENT +0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x0111 #LATIN SMALL LETTER D WITH STROKE +0xF1 0x00F1 #LATIN SMALL LETTER N WITH TILDE +0xF2 0x0323 #COMBINING DOT BELOW +0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x01A1 #LATIN SMALL LETTER O WITH HORN +0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 #DIVISION SIGN +0xF8 0x00F8 #LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x01B0 #LATIN SMALL LETTER U WITH HORN +0xFE 0x20AB #DONG SIGN +0xFF 0x00FF #LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/lib/ucmaps/cp437.txt b/lib/ucmaps/cp437.txt new file mode 100644 index 000000000..ae38e17ab --- /dev/null +++ b/lib/ucmaps/cp437.txt @@ -0,0 +1,273 @@ +# +# Name: cp437_DOSLatinUS to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell <loribr@microsoft.com> +# K.D. Chang <a-kchang@microsoft.com> +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp437_DOSLatinUS code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp437_DOSLatinUS order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0x84 0x00e4 #LATIN SMALL LETTER A WITH DIAERESIS +0x85 0x00e0 #LATIN SMALL LETTER A WITH GRAVE +0x86 0x00e5 #LATIN SMALL LETTER A WITH RING ABOVE +0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA +0x88 0x00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX +0x89 0x00eb #LATIN SMALL LETTER E WITH DIAERESIS +0x8a 0x00e8 #LATIN SMALL LETTER E WITH GRAVE +0x8b 0x00ef #LATIN SMALL LETTER I WITH DIAERESIS +0x8c 0x00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX +0x8d 0x00ec #LATIN SMALL LETTER I WITH GRAVE +0x8e 0x00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0x8f 0x00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x00e6 #LATIN SMALL LIGATURE AE +0x92 0x00c6 #LATIN CAPITAL LIGATURE AE +0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0x94 0x00f6 #LATIN SMALL LETTER O WITH DIAERESIS +0x95 0x00f2 #LATIN SMALL LETTER O WITH GRAVE +0x96 0x00fb #LATIN SMALL LETTER U WITH CIRCUMFLEX +0x97 0x00f9 #LATIN SMALL LETTER U WITH GRAVE +0x98 0x00ff #LATIN SMALL LETTER Y WITH DIAERESIS +0x99 0x00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x00a2 #CENT SIGN +0x9c 0x00a3 #POUND SIGN +0x9d 0x00a5 #YEN SIGN +0x9e 0x20a7 #PESETA SIGN +0x9f 0x0192 #LATIN SMALL LETTER F WITH HOOK +0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE +0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x00f1 #LATIN SMALL LETTER N WITH TILDE +0xa5 0x00d1 #LATIN CAPITAL LETTER N WITH TILDE +0xa6 0x00aa #FEMININE ORDINAL INDICATOR +0xa7 0x00ba #MASCULINE ORDINAL INDICATOR +0xa8 0x00bf #INVERTED QUESTION MARK +0xa9 0x2310 #REVERSED NOT SIGN +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x00a1 #INVERTED EXCLAMATION MARK +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x03b1 #GREEK SMALL LETTER ALPHA +0xe1 0x00df #LATIN SMALL LETTER SHARP S +0xe2 0x0393 #GREEK CAPITAL LETTER GAMMA +0xe3 0x03c0 #GREEK SMALL LETTER PI +0xe4 0x03a3 #GREEK CAPITAL LETTER SIGMA +0xe5 0x03c3 #GREEK SMALL LETTER SIGMA +0xe6 0x00b5 #MICRO SIGN +0xe7 0x03c4 #GREEK SMALL LETTER TAU +0xe8 0x03a6 #GREEK CAPITAL LETTER PHI +0xe9 0x0398 #GREEK CAPITAL LETTER THETA +0xea 0x03a9 #GREEK CAPITAL LETTER OMEGA +0xeb 0x03b4 #GREEK SMALL LETTER DELTA +0xec 0x221e #INFINITY +0xed 0x03c6 #GREEK SMALL LETTER PHI +0xee 0x03b5 #GREEK SMALL LETTER EPSILON +0xef 0x2229 #INTERSECTION +0xf0 0x2261 #IDENTICAL TO +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x2265 #GREATER-THAN OR EQUAL TO +0xf3 0x2264 #LESS-THAN OR EQUAL TO +0xf4 0x2320 #TOP HALF INTEGRAL +0xf5 0x2321 #BOTTOM HALF INTEGRAL +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x2248 #ALMOST EQUAL TO +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x221a #SQUARE ROOT +0xfc 0x207f #SUPERSCRIPT LATIN SMALL LETTER N +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE diff --git a/lib/ucmaps/cp737.txt b/lib/ucmaps/cp737.txt new file mode 100644 index 000000000..0fc572fc3 --- /dev/null +++ b/lib/ucmaps/cp737.txt @@ -0,0 +1,273 @@ +# +# Name: cp737_DOSGreek to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell <loribr@microsoft.com> +# K.D. Chang <a-kchang@microsoft.com> +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp737_DOSGreek code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp737_DOSGreek order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x0391 #GREEK CAPITAL LETTER ALPHA +0x81 0x0392 #GREEK CAPITAL LETTER BETA +0x82 0x0393 #GREEK CAPITAL LETTER GAMMA +0x83 0x0394 #GREEK CAPITAL LETTER DELTA +0x84 0x0395 #GREEK CAPITAL LETTER EPSILON +0x85 0x0396 #GREEK CAPITAL LETTER ZETA +0x86 0x0397 #GREEK CAPITAL LETTER ETA +0x87 0x0398 #GREEK CAPITAL LETTER THETA +0x88 0x0399 #GREEK CAPITAL LETTER IOTA +0x89 0x039a #GREEK CAPITAL LETTER KAPPA +0x8a 0x039b #GREEK CAPITAL LETTER LAMDA +0x8b 0x039c #GREEK CAPITAL LETTER MU +0x8c 0x039d #GREEK CAPITAL LETTER NU +0x8d 0x039e #GREEK CAPITAL LETTER XI +0x8e 0x039f #GREEK CAPITAL LETTER OMICRON +0x8f 0x03a0 #GREEK CAPITAL LETTER PI +0x90 0x03a1 #GREEK CAPITAL LETTER RHO +0x91 0x03a3 #GREEK CAPITAL LETTER SIGMA +0x92 0x03a4 #GREEK CAPITAL LETTER TAU +0x93 0x03a5 #GREEK CAPITAL LETTER UPSILON +0x94 0x03a6 #GREEK CAPITAL LETTER PHI +0x95 0x03a7 #GREEK CAPITAL LETTER CHI +0x96 0x03a8 #GREEK CAPITAL LETTER PSI +0x97 0x03a9 #GREEK CAPITAL LETTER OMEGA +0x98 0x03b1 #GREEK SMALL LETTER ALPHA +0x99 0x03b2 #GREEK SMALL LETTER BETA +0x9a 0x03b3 #GREEK SMALL LETTER GAMMA +0x9b 0x03b4 #GREEK SMALL LETTER DELTA +0x9c 0x03b5 #GREEK SMALL LETTER EPSILON +0x9d 0x03b6 #GREEK SMALL LETTER ZETA +0x9e 0x03b7 #GREEK SMALL LETTER ETA +0x9f 0x03b8 #GREEK SMALL LETTER THETA +0xa0 0x03b9 #GREEK SMALL LETTER IOTA +0xa1 0x03ba #GREEK SMALL LETTER KAPPA +0xa2 0x03bb #GREEK SMALL LETTER LAMDA +0xa3 0x03bc #GREEK SMALL LETTER MU +0xa4 0x03bd #GREEK SMALL LETTER NU +0xa5 0x03be #GREEK SMALL LETTER XI +0xa6 0x03bf #GREEK SMALL LETTER OMICRON +0xa7 0x03c0 #GREEK SMALL LETTER PI +0xa8 0x03c1 #GREEK SMALL LETTER RHO +0xa9 0x03c3 #GREEK SMALL LETTER SIGMA +0xaa 0x03c2 #GREEK SMALL LETTER FINAL SIGMA +0xab 0x03c4 #GREEK SMALL LETTER TAU +0xac 0x03c5 #GREEK SMALL LETTER UPSILON +0xad 0x03c6 #GREEK SMALL LETTER PHI +0xae 0x03c7 #GREEK SMALL LETTER CHI +0xaf 0x03c8 #GREEK SMALL LETTER PSI +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x03c9 #GREEK SMALL LETTER OMEGA +0xe1 0x03ac #GREEK SMALL LETTER ALPHA WITH TONOS +0xe2 0x03ad #GREEK SMALL LETTER EPSILON WITH TONOS +0xe3 0x03ae #GREEK SMALL LETTER ETA WITH TONOS +0xe4 0x03ca #GREEK SMALL LETTER IOTA WITH DIALYTIKA +0xe5 0x03af #GREEK SMALL LETTER IOTA WITH TONOS +0xe6 0x03cc #GREEK SMALL LETTER OMICRON WITH TONOS +0xe7 0x03cd #GREEK SMALL LETTER UPSILON WITH TONOS +0xe8 0x03cb #GREEK SMALL LETTER UPSILON WITH DIALYTIKA +0xe9 0x03ce #GREEK SMALL LETTER OMEGA WITH TONOS +0xea 0x0386 #GREEK CAPITAL LETTER ALPHA WITH TONOS +0xeb 0x0388 #GREEK CAPITAL LETTER EPSILON WITH TONOS +0xec 0x0389 #GREEK CAPITAL LETTER ETA WITH TONOS +0xed 0x038a #GREEK CAPITAL LETTER IOTA WITH TONOS +0xee 0x038c #GREEK CAPITAL LETTER OMICRON WITH TONOS +0xef 0x038e #GREEK CAPITAL LETTER UPSILON WITH TONOS +0xf0 0x038f #GREEK CAPITAL LETTER OMEGA WITH TONOS +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x2265 #GREATER-THAN OR EQUAL TO +0xf3 0x2264 #LESS-THAN OR EQUAL TO +0xf4 0x03aa #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +0xf5 0x03ab #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x2248 #ALMOST EQUAL TO +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x221a #SQUARE ROOT +0xfc 0x207f #SUPERSCRIPT LATIN SMALL LETTER N +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE diff --git a/lib/ucmaps/cp775.txt b/lib/ucmaps/cp775.txt new file mode 100644 index 000000000..1ad4e4e58 --- /dev/null +++ b/lib/ucmaps/cp775.txt @@ -0,0 +1,274 @@ +# +# Name: cp775_DOSBaltRim to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell <loribr@microsoft.com> +# K.D. Chang <a-kchang@microsoft.com> +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp775_DOSBaltRim code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp775_DOSBaltRim order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x0106 #LATIN CAPITAL LETTER C WITH ACUTE +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x0101 #LATIN SMALL LETTER A WITH MACRON +0x84 0x00e4 #LATIN SMALL LETTER A WITH DIAERESIS +0x85 0x0123 #LATIN SMALL LETTER G WITH CEDILLA +0x86 0x00e5 #LATIN SMALL LETTER A WITH RING ABOVE +0x87 0x0107 #LATIN SMALL LETTER C WITH ACUTE +0x88 0x0142 #LATIN SMALL LETTER L WITH STROKE +0x89 0x0113 #LATIN SMALL LETTER E WITH MACRON +0x8a 0x0156 #LATIN CAPITAL LETTER R WITH CEDILLA +0x8b 0x0157 #LATIN SMALL LETTER R WITH CEDILLA +0x8c 0x012b #LATIN SMALL LETTER I WITH MACRON +0x8d 0x0179 #LATIN CAPITAL LETTER Z WITH ACUTE +0x8e 0x00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0x8f 0x00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x00e6 #LATIN SMALL LIGATURE AE +0x92 0x00c6 #LATIN CAPITAL LIGATURE AE +0x93 0x014d #LATIN SMALL LETTER O WITH MACRON +0x94 0x00f6 #LATIN SMALL LETTER O WITH DIAERESIS +0x95 0x0122 #LATIN CAPITAL LETTER G WITH CEDILLA +0x96 0x00a2 #CENT SIGN +0x97 0x015a #LATIN CAPITAL LETTER S WITH ACUTE +0x98 0x015b #LATIN SMALL LETTER S WITH ACUTE +0x99 0x00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x00f8 #LATIN SMALL LETTER O WITH STROKE +0x9c 0x00a3 #POUND SIGN +0x9d 0x00d8 #LATIN CAPITAL LETTER O WITH STROKE +0x9e 0x00d7 #MULTIPLICATION SIGN +0x9f 0x00a4 #CURRENCY SIGN +0xa0 0x0100 #LATIN CAPITAL LETTER A WITH MACRON +0xa1 0x012a #LATIN CAPITAL LETTER I WITH MACRON +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x017b #LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xa4 0x017c #LATIN SMALL LETTER Z WITH DOT ABOVE +0xa5 0x017a #LATIN SMALL LETTER Z WITH ACUTE +0xa6 0x201d #RIGHT DOUBLE QUOTATION MARK +0xa7 0x00a6 #BROKEN BAR +0xa8 0x00a9 #COPYRIGHT SIGN +0xa9 0x00ae #REGISTERED SIGN +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x0141 #LATIN CAPITAL LETTER L WITH STROKE +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x0104 #LATIN CAPITAL LETTER A WITH OGONEK +0xb6 0x010c #LATIN CAPITAL LETTER C WITH CARON +0xb7 0x0118 #LATIN CAPITAL LETTER E WITH OGONEK +0xb8 0x0116 #LATIN CAPITAL LETTER E WITH DOT ABOVE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x012e #LATIN CAPITAL LETTER I WITH OGONEK +0xbe 0x0160 #LATIN CAPITAL LETTER S WITH CARON +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x0172 #LATIN CAPITAL LETTER U WITH OGONEK +0xc7 0x016a #LATIN CAPITAL LETTER U WITH MACRON +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x017d #LATIN CAPITAL LETTER Z WITH CARON +0xd0 0x0105 #LATIN SMALL LETTER A WITH OGONEK +0xd1 0x010d #LATIN SMALL LETTER C WITH CARON +0xd2 0x0119 #LATIN SMALL LETTER E WITH OGONEK +0xd3 0x0117 #LATIN SMALL LETTER E WITH DOT ABOVE +0xd4 0x012f #LATIN SMALL LETTER I WITH OGONEK +0xd5 0x0161 #LATIN SMALL LETTER S WITH CARON +0xd6 0x0173 #LATIN SMALL LETTER U WITH OGONEK +0xd7 0x016b #LATIN SMALL LETTER U WITH MACRON +0xd8 0x017e #LATIN SMALL LETTER Z WITH CARON +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x00d3 #LATIN CAPITAL LETTER O WITH ACUTE +0xe1 0x00df #LATIN SMALL LETTER SHARP S (GERMAN) +0xe2 0x014c #LATIN CAPITAL LETTER O WITH MACRON +0xe3 0x0143 #LATIN CAPITAL LETTER N WITH ACUTE +0xe4 0x00f5 #LATIN SMALL LETTER O WITH TILDE +0xe5 0x00d5 #LATIN CAPITAL LETTER O WITH TILDE +0xe6 0x00b5 #MICRO SIGN +0xe7 0x0144 #LATIN SMALL LETTER N WITH ACUTE +0xe8 0x0136 #LATIN CAPITAL LETTER K WITH CEDILLA +0xe9 0x0137 #LATIN SMALL LETTER K WITH CEDILLA +0xea 0x013b #LATIN CAPITAL LETTER L WITH CEDILLA +0xeb 0x013c #LATIN SMALL LETTER L WITH CEDILLA +0xec 0x0146 #LATIN SMALL LETTER N WITH CEDILLA +0xed 0x0112 #LATIN CAPITAL LETTER E WITH MACRON +0xee 0x0145 #LATIN CAPITAL LETTER N WITH CEDILLA +0xef 0x2019 #RIGHT SINGLE QUOTATION MARK +0xf0 0x00ad #SOFT HYPHEN +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x201c #LEFT DOUBLE QUOTATION MARK +0xf3 0x00be #VULGAR FRACTION THREE QUARTERS +0xf4 0x00b6 #PILCROW SIGN +0xf5 0x00a7 #SECTION SIGN +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x201e #DOUBLE LOW-9 QUOTATION MARK +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x00b9 #SUPERSCRIPT ONE +0xfc 0x00b3 #SUPERSCRIPT THREE +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp850.txt b/lib/ucmaps/cp850.txt new file mode 100644 index 000000000..590b1afe5 --- /dev/null +++ b/lib/ucmaps/cp850.txt @@ -0,0 +1,273 @@ +# +# Name: cp850_DOSLatin1 to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell <loribr@microsoft.com> +# K.D. Chang <a-kchang@microsoft.com> +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp850_DOSLatin1 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp850_DOSLatin1 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0x84 0x00e4 #LATIN SMALL LETTER A WITH DIAERESIS +0x85 0x00e0 #LATIN SMALL LETTER A WITH GRAVE +0x86 0x00e5 #LATIN SMALL LETTER A WITH RING ABOVE +0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA +0x88 0x00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX +0x89 0x00eb #LATIN SMALL LETTER E WITH DIAERESIS +0x8a 0x00e8 #LATIN SMALL LETTER E WITH GRAVE +0x8b 0x00ef #LATIN SMALL LETTER I WITH DIAERESIS +0x8c 0x00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX +0x8d 0x00ec #LATIN SMALL LETTER I WITH GRAVE +0x8e 0x00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0x8f 0x00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x00e6 #LATIN SMALL LIGATURE AE +0x92 0x00c6 #LATIN CAPITAL LIGATURE AE +0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0x94 0x00f6 #LATIN SMALL LETTER O WITH DIAERESIS +0x95 0x00f2 #LATIN SMALL LETTER O WITH GRAVE +0x96 0x00fb #LATIN SMALL LETTER U WITH CIRCUMFLEX +0x97 0x00f9 #LATIN SMALL LETTER U WITH GRAVE +0x98 0x00ff #LATIN SMALL LETTER Y WITH DIAERESIS +0x99 0x00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x00f8 #LATIN SMALL LETTER O WITH STROKE +0x9c 0x00a3 #POUND SIGN +0x9d 0x00d8 #LATIN CAPITAL LETTER O WITH STROKE +0x9e 0x00d7 #MULTIPLICATION SIGN +0x9f 0x0192 #LATIN SMALL LETTER F WITH HOOK +0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE +0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x00f1 #LATIN SMALL LETTER N WITH TILDE +0xa5 0x00d1 #LATIN CAPITAL LETTER N WITH TILDE +0xa6 0x00aa #FEMININE ORDINAL INDICATOR +0xa7 0x00ba #MASCULINE ORDINAL INDICATOR +0xa8 0x00bf #INVERTED QUESTION MARK +0xa9 0x00ae #REGISTERED SIGN +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x00a1 #INVERTED EXCLAMATION MARK +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x00c1 #LATIN CAPITAL LETTER A WITH ACUTE +0xb6 0x00c2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xb7 0x00c0 #LATIN CAPITAL LETTER A WITH GRAVE +0xb8 0x00a9 #COPYRIGHT SIGN +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x00a2 #CENT SIGN +0xbe 0x00a5 #YEN SIGN +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x00e3 #LATIN SMALL LETTER A WITH TILDE +0xc7 0x00c3 #LATIN CAPITAL LETTER A WITH TILDE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x00a4 #CURRENCY SIGN +0xd0 0x00f0 #LATIN SMALL LETTER ETH +0xd1 0x00d0 #LATIN CAPITAL LETTER ETH +0xd2 0x00ca #LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xd3 0x00cb #LATIN CAPITAL LETTER E WITH DIAERESIS +0xd4 0x00c8 #LATIN CAPITAL LETTER E WITH GRAVE +0xd5 0x0131 #LATIN SMALL LETTER DOTLESS I +0xd6 0x00cd #LATIN CAPITAL LETTER I WITH ACUTE +0xd7 0x00ce #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xd8 0x00cf #LATIN CAPITAL LETTER I WITH DIAERESIS +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x00a6 #BROKEN BAR +0xde 0x00cc #LATIN CAPITAL LETTER I WITH GRAVE +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x00d3 #LATIN CAPITAL LETTER O WITH ACUTE +0xe1 0x00df #LATIN SMALL LETTER SHARP S +0xe2 0x00d4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xe3 0x00d2 #LATIN CAPITAL LETTER O WITH GRAVE +0xe4 0x00f5 #LATIN SMALL LETTER O WITH TILDE +0xe5 0x00d5 #LATIN CAPITAL LETTER O WITH TILDE +0xe6 0x00b5 #MICRO SIGN +0xe7 0x00fe #LATIN SMALL LETTER THORN +0xe8 0x00de #LATIN CAPITAL LETTER THORN +0xe9 0x00da #LATIN CAPITAL LETTER U WITH ACUTE +0xea 0x00db #LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xeb 0x00d9 #LATIN CAPITAL LETTER U WITH GRAVE +0xec 0x00fd #LATIN SMALL LETTER Y WITH ACUTE +0xed 0x00dd #LATIN CAPITAL LETTER Y WITH ACUTE +0xee 0x00af #MACRON +0xef 0x00b4 #ACUTE ACCENT +0xf0 0x00ad #SOFT HYPHEN +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x2017 #DOUBLE LOW LINE +0xf3 0x00be #VULGAR FRACTION THREE QUARTERS +0xf4 0x00b6 #PILCROW SIGN +0xf5 0x00a7 #SECTION SIGN +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x00b8 #CEDILLA +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x00a8 #DIAERESIS +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x00b9 #SUPERSCRIPT ONE +0xfc 0x00b3 #SUPERSCRIPT THREE +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE diff --git a/lib/ucmaps/cp852.txt b/lib/ucmaps/cp852.txt new file mode 100644 index 000000000..2f2dabaeb --- /dev/null +++ b/lib/ucmaps/cp852.txt @@ -0,0 +1,273 @@ +# +# Name: cp852_DOSLatin2 to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell <loribr@microsoft.com> +# K.D. Chang <a-kchang@microsoft.com> +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp852_DOSLatin2 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp852_DOSLatin2 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0x84 0x00e4 #LATIN SMALL LETTER A WITH DIAERESIS +0x85 0x016f #LATIN SMALL LETTER U WITH RING ABOVE +0x86 0x0107 #LATIN SMALL LETTER C WITH ACUTE +0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA +0x88 0x0142 #LATIN SMALL LETTER L WITH STROKE +0x89 0x00eb #LATIN SMALL LETTER E WITH DIAERESIS +0x8a 0x0150 #LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0x8b 0x0151 #LATIN SMALL LETTER O WITH DOUBLE ACUTE +0x8c 0x00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX +0x8d 0x0179 #LATIN CAPITAL LETTER Z WITH ACUTE +0x8e 0x00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0x8f 0x0106 #LATIN CAPITAL LETTER C WITH ACUTE +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x0139 #LATIN CAPITAL LETTER L WITH ACUTE +0x92 0x013a #LATIN SMALL LETTER L WITH ACUTE +0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0x94 0x00f6 #LATIN SMALL LETTER O WITH DIAERESIS +0x95 0x013d #LATIN CAPITAL LETTER L WITH CARON +0x96 0x013e #LATIN SMALL LETTER L WITH CARON +0x97 0x015a #LATIN CAPITAL LETTER S WITH ACUTE +0x98 0x015b #LATIN SMALL LETTER S WITH ACUTE +0x99 0x00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x0164 #LATIN CAPITAL LETTER T WITH CARON +0x9c 0x0165 #LATIN SMALL LETTER T WITH CARON +0x9d 0x0141 #LATIN CAPITAL LETTER L WITH STROKE +0x9e 0x00d7 #MULTIPLICATION SIGN +0x9f 0x010d #LATIN SMALL LETTER C WITH CARON +0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE +0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x0104 #LATIN CAPITAL LETTER A WITH OGONEK +0xa5 0x0105 #LATIN SMALL LETTER A WITH OGONEK +0xa6 0x017d #LATIN CAPITAL LETTER Z WITH CARON +0xa7 0x017e #LATIN SMALL LETTER Z WITH CARON +0xa8 0x0118 #LATIN CAPITAL LETTER E WITH OGONEK +0xa9 0x0119 #LATIN SMALL LETTER E WITH OGONEK +0xaa 0x00ac #NOT SIGN +0xab 0x017a #LATIN SMALL LETTER Z WITH ACUTE +0xac 0x010c #LATIN CAPITAL LETTER C WITH CARON +0xad 0x015f #LATIN SMALL LETTER S WITH CEDILLA +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x00c1 #LATIN CAPITAL LETTER A WITH ACUTE +0xb6 0x00c2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xb7 0x011a #LATIN CAPITAL LETTER E WITH CARON +0xb8 0x015e #LATIN CAPITAL LETTER S WITH CEDILLA +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x017b #LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xbe 0x017c #LATIN SMALL LETTER Z WITH DOT ABOVE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x0102 #LATIN CAPITAL LETTER A WITH BREVE +0xc7 0x0103 #LATIN SMALL LETTER A WITH BREVE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x00a4 #CURRENCY SIGN +0xd0 0x0111 #LATIN SMALL LETTER D WITH STROKE +0xd1 0x0110 #LATIN CAPITAL LETTER D WITH STROKE +0xd2 0x010e #LATIN CAPITAL LETTER D WITH CARON +0xd3 0x00cb #LATIN CAPITAL LETTER E WITH DIAERESIS +0xd4 0x010f #LATIN SMALL LETTER D WITH CARON +0xd5 0x0147 #LATIN CAPITAL LETTER N WITH CARON +0xd6 0x00cd #LATIN CAPITAL LETTER I WITH ACUTE +0xd7 0x00ce #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xd8 0x011b #LATIN SMALL LETTER E WITH CARON +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x0162 #LATIN CAPITAL LETTER T WITH CEDILLA +0xde 0x016e #LATIN CAPITAL LETTER U WITH RING ABOVE +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x00d3 #LATIN CAPITAL LETTER O WITH ACUTE +0xe1 0x00df #LATIN SMALL LETTER SHARP S +0xe2 0x00d4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xe3 0x0143 #LATIN CAPITAL LETTER N WITH ACUTE +0xe4 0x0144 #LATIN SMALL LETTER N WITH ACUTE +0xe5 0x0148 #LATIN SMALL LETTER N WITH CARON +0xe6 0x0160 #LATIN CAPITAL LETTER S WITH CARON +0xe7 0x0161 #LATIN SMALL LETTER S WITH CARON +0xe8 0x0154 #LATIN CAPITAL LETTER R WITH ACUTE +0xe9 0x00da #LATIN CAPITAL LETTER U WITH ACUTE +0xea 0x0155 #LATIN SMALL LETTER R WITH ACUTE +0xeb 0x0170 #LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0xec 0x00fd #LATIN SMALL LETTER Y WITH ACUTE +0xed 0x00dd #LATIN CAPITAL LETTER Y WITH ACUTE +0xee 0x0163 #LATIN SMALL LETTER T WITH CEDILLA +0xef 0x00b4 #ACUTE ACCENT +0xf0 0x00ad #SOFT HYPHEN +0xf1 0x02dd #DOUBLE ACUTE ACCENT +0xf2 0x02db #OGONEK +0xf3 0x02c7 #CARON +0xf4 0x02d8 #BREVE +0xf5 0x00a7 #SECTION SIGN +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x00b8 #CEDILLA +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x00a8 #DIAERESIS +0xfa 0x02d9 #DOT ABOVE +0xfb 0x0171 #LATIN SMALL LETTER U WITH DOUBLE ACUTE +0xfc 0x0158 #LATIN CAPITAL LETTER R WITH CARON +0xfd 0x0159 #LATIN SMALL LETTER R WITH CARON +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE diff --git a/lib/ucmaps/cp855.txt b/lib/ucmaps/cp855.txt new file mode 100644 index 000000000..d43daf039 --- /dev/null +++ b/lib/ucmaps/cp855.txt @@ -0,0 +1,274 @@ +# +# Name: cp855_DOSCyrillic to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell <loribr@microsoft.com> +# K.D. Chang <a-kchang@microsoft.com> +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp855_DOSCyrillic code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp855_DOSCyrillic order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x0452 #CYRILLIC SMALL LETTER DJE +0x81 0x0402 #CYRILLIC CAPITAL LETTER DJE +0x82 0x0453 #CYRILLIC SMALL LETTER GJE +0x83 0x0403 #CYRILLIC CAPITAL LETTER GJE +0x84 0x0451 #CYRILLIC SMALL LETTER IO +0x85 0x0401 #CYRILLIC CAPITAL LETTER IO +0x86 0x0454 #CYRILLIC SMALL LETTER UKRAINIAN IE +0x87 0x0404 #CYRILLIC CAPITAL LETTER UKRAINIAN IE +0x88 0x0455 #CYRILLIC SMALL LETTER DZE +0x89 0x0405 #CYRILLIC CAPITAL LETTER DZE +0x8a 0x0456 #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0x8b 0x0406 #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0x8c 0x0457 #CYRILLIC SMALL LETTER YI +0x8d 0x0407 #CYRILLIC CAPITAL LETTER YI +0x8e 0x0458 #CYRILLIC SMALL LETTER JE +0x8f 0x0408 #CYRILLIC CAPITAL LETTER JE +0x90 0x0459 #CYRILLIC SMALL LETTER LJE +0x91 0x0409 #CYRILLIC CAPITAL LETTER LJE +0x92 0x045a #CYRILLIC SMALL LETTER NJE +0x93 0x040a #CYRILLIC CAPITAL LETTER NJE +0x94 0x045b #CYRILLIC SMALL LETTER TSHE +0x95 0x040b #CYRILLIC CAPITAL LETTER TSHE +0x96 0x045c #CYRILLIC SMALL LETTER KJE +0x97 0x040c #CYRILLIC CAPITAL LETTER KJE +0x98 0x045e #CYRILLIC SMALL LETTER SHORT U +0x99 0x040e #CYRILLIC CAPITAL LETTER SHORT U +0x9a 0x045f #CYRILLIC SMALL LETTER DZHE +0x9b 0x040f #CYRILLIC CAPITAL LETTER DZHE +0x9c 0x044e #CYRILLIC SMALL LETTER YU +0x9d 0x042e #CYRILLIC CAPITAL LETTER YU +0x9e 0x044a #CYRILLIC SMALL LETTER HARD SIGN +0x9f 0x042a #CYRILLIC CAPITAL LETTER HARD SIGN +0xa0 0x0430 #CYRILLIC SMALL LETTER A +0xa1 0x0410 #CYRILLIC CAPITAL LETTER A +0xa2 0x0431 #CYRILLIC SMALL LETTER BE +0xa3 0x0411 #CYRILLIC CAPITAL LETTER BE +0xa4 0x0446 #CYRILLIC SMALL LETTER TSE +0xa5 0x0426 #CYRILLIC CAPITAL LETTER TSE +0xa6 0x0434 #CYRILLIC SMALL LETTER DE +0xa7 0x0414 #CYRILLIC CAPITAL LETTER DE +0xa8 0x0435 #CYRILLIC SMALL LETTER IE +0xa9 0x0415 #CYRILLIC CAPITAL LETTER IE +0xaa 0x0444 #CYRILLIC SMALL LETTER EF +0xab 0x0424 #CYRILLIC CAPITAL LETTER EF +0xac 0x0433 #CYRILLIC SMALL LETTER GHE +0xad 0x0413 #CYRILLIC CAPITAL LETTER GHE +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x0445 #CYRILLIC SMALL LETTER HA +0xb6 0x0425 #CYRILLIC CAPITAL LETTER HA +0xb7 0x0438 #CYRILLIC SMALL LETTER I +0xb8 0x0418 #CYRILLIC CAPITAL LETTER I +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x0439 #CYRILLIC SMALL LETTER SHORT I +0xbe 0x0419 #CYRILLIC CAPITAL LETTER SHORT I +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x043a #CYRILLIC SMALL LETTER KA +0xc7 0x041a #CYRILLIC CAPITAL LETTER KA +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x00a4 #CURRENCY SIGN +0xd0 0x043b #CYRILLIC SMALL LETTER EL +0xd1 0x041b #CYRILLIC CAPITAL LETTER EL +0xd2 0x043c #CYRILLIC SMALL LETTER EM +0xd3 0x041c #CYRILLIC CAPITAL LETTER EM +0xd4 0x043d #CYRILLIC SMALL LETTER EN +0xd5 0x041d #CYRILLIC CAPITAL LETTER EN +0xd6 0x043e #CYRILLIC SMALL LETTER O +0xd7 0x041e #CYRILLIC CAPITAL LETTER O +0xd8 0x043f #CYRILLIC SMALL LETTER PE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x041f #CYRILLIC CAPITAL LETTER PE +0xde 0x044f #CYRILLIC SMALL LETTER YA +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x042f #CYRILLIC CAPITAL LETTER YA +0xe1 0x0440 #CYRILLIC SMALL LETTER ER +0xe2 0x0420 #CYRILLIC CAPITAL LETTER ER +0xe3 0x0441 #CYRILLIC SMALL LETTER ES +0xe4 0x0421 #CYRILLIC CAPITAL LETTER ES +0xe5 0x0442 #CYRILLIC SMALL LETTER TE +0xe6 0x0422 #CYRILLIC CAPITAL LETTER TE +0xe7 0x0443 #CYRILLIC SMALL LETTER U +0xe8 0x0423 #CYRILLIC CAPITAL LETTER U +0xe9 0x0436 #CYRILLIC SMALL LETTER ZHE +0xea 0x0416 #CYRILLIC CAPITAL LETTER ZHE +0xeb 0x0432 #CYRILLIC SMALL LETTER VE +0xec 0x0412 #CYRILLIC CAPITAL LETTER VE +0xed 0x044c #CYRILLIC SMALL LETTER SOFT SIGN +0xee 0x042c #CYRILLIC CAPITAL LETTER SOFT SIGN +0xef 0x2116 #NUMERO SIGN +0xf0 0x00ad #SOFT HYPHEN +0xf1 0x044b #CYRILLIC SMALL LETTER YERU +0xf2 0x042b #CYRILLIC CAPITAL LETTER YERU +0xf3 0x0437 #CYRILLIC SMALL LETTER ZE +0xf4 0x0417 #CYRILLIC CAPITAL LETTER ZE +0xf5 0x0448 #CYRILLIC SMALL LETTER SHA +0xf6 0x0428 #CYRILLIC CAPITAL LETTER SHA +0xf7 0x044d #CYRILLIC SMALL LETTER E +0xf8 0x042d #CYRILLIC CAPITAL LETTER E +0xf9 0x0449 #CYRILLIC SMALL LETTER SHCHA +0xfa 0x0429 #CYRILLIC CAPITAL LETTER SHCHA +0xfb 0x0447 #CYRILLIC SMALL LETTER CHE +0xfc 0x0427 #CYRILLIC CAPITAL LETTER CHE +0xfd 0x00a7 #SECTION SIGN +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp856.txt b/lib/ucmaps/cp856.txt new file mode 100644 index 000000000..3a6000bcb --- /dev/null +++ b/lib/ucmaps/cp856.txt @@ -0,0 +1,303 @@ +# +# Name: cp856_Hebrew_PC to Unicode table +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler (kenw@sybase.com) +# +# Copyright (c) 1998 - 1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# CP424 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the cp856_Hebrew_PC code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp856_Hebrew_PC order +# +# Version history +# 1.0 version new. +# +# Updated versions of this file may be found in: +# <ftp://ftp.unicode.org/Public/MAPPINGS/> +# +# Any comments or problems, contact <errata@unicode.org> +# Please note that <errata@unicode.org> is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x05D0 #HEBREW LETTER ALEF +0x81 0x05D1 #HEBREW LETTER BET +0x82 0x05D2 #HEBREW LETTER GIMEL +0x83 0x05D3 #HEBREW LETTER DALET +0x84 0x05D4 #HEBREW LETTER HE +0x85 0x05D5 #HEBREW LETTER VAV +0x86 0x05D6 #HEBREW LETTER ZAYIN +0x87 0x05D7 #HEBREW LETTER HET +0x88 0x05D8 #HEBREW LETTER TET +0x89 0x05D9 #HEBREW LETTER YOD +0x8A 0x05DA #HEBREW LETTER FINAL KAF +0x8B 0x05DB #HEBREW LETTER KAF +0x8C 0x05DC #HEBREW LETTER LAMED +0x8D 0x05DD #HEBREW LETTER FINAL MEM +0x8E 0x05DE #HEBREW LETTER MEM +0x8F 0x05DF #HEBREW LETTER FINAL NUN +0x90 0x05E0 #HEBREW LETTER NUN +0x91 0x05E1 #HEBREW LETTER SAMEKH +0x92 0x05E2 #HEBREW LETTER AYIN +0x93 0x05E3 #HEBREW LETTER FINAL PE +0x94 0x05E4 #HEBREW LETTER PE +0x95 0x05E5 #HEBREW LETTER FINAL TSADI +0x96 0x05E6 #HEBREW LETTER TSADI +0x97 0x05E7 #HEBREW LETTER QOF +0x98 0x05E8 #HEBREW LETTER RESH +0x99 0x05E9 #HEBREW LETTER SHIN +0x9A 0x05EA #HEBREW LETTER TAV +0x9B #UNDEFINED +0x9C 0x00A3 #POUND SIGN +0x9D #UNDEFINED +0x9E 0x00D7 #MULTIPLICATION SIGN +0x9F #UNDEFINED +0xA0 #UNDEFINED +0xA1 #UNDEFINED +0xA2 #UNDEFINED +0xA3 #UNDEFINED +0xA4 #UNDEFINED +0xA5 #UNDEFINED +0xA6 #UNDEFINED +0xA7 #UNDEFINED +0xA8 #UNDEFINED +0xA9 0x00AE #REGISTERED SIGN +0xAA 0x00AC #NOT SIGN +0xAB 0x00BD #VULGAR FRACTION ONE HALF +0xAC 0x00BC #VULGAR FRACTION ONE QUARTER +0xAD #UNDEFINED +0xAE 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAF 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xB0 0x2591 #LIGHT SHADE +0xB1 0x2592 #MEDIUM SHADE +0xB2 0x2593 #DARK SHADE +0xB3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xB4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xB5 #UNDEFINED +0xB6 #UNDEFINED +0xB7 #UNDEFINED +0xB8 0x00A9 #COPYRIGHT SIGN +0xB9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xBA 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xBB 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xBC 0x255D #BOX DRAWINGS DOUBLE UP AND LEFT +0xBD 0x00A2 #CENT SIGN +0xBE 0x00A5 #YEN SIGN +0xBF 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xC0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xC1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xC2 0x252C #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xC3 0x251C #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xC4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xC5 0x253C #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xC6 #UNDEFINED +0xC7 #UNDEFINED +0xC8 0x255A #BOX DRAWINGS DOUBLE UP AND RIGHT +0xC9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xCA 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xCB 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xCC 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xCD 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xCE 0x256C #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xCF 0x00A4 #CURRENCY SIGN +0xD0 #UNDEFINED +0xD1 #UNDEFINED +0xD2 #UNDEFINED +0xD3 #UNDEFINEDS +0xD4 #UNDEFINED +0xD5 #UNDEFINED +0xD6 #UNDEFINEDE +0xD7 #UNDEFINED +0xD8 #UNDEFINED +0xD9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xDA 0x250C #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xDB 0x2588 #FULL BLOCK +0xDC 0x2584 #LOWER HALF BLOCK +0xDD 0x00A6 #BROKEN BAR +0xDE #UNDEFINED +0xDF 0x2580 #UPPER HALF BLOCK +0xE0 #UNDEFINED +0xE1 #UNDEFINED +0xE2 #UNDEFINED +0xE3 #UNDEFINED +0xE4 #UNDEFINED +0xE5 #UNDEFINED +0xE6 0x00B5 #MICRO SIGN +0xE7 #UNDEFINED +0xE8 #UNDEFINED +0xE9 #UNDEFINED +0xEA #UNDEFINED +0xEB #UNDEFINED +0xEC #UNDEFINED +0xED #UNDEFINED +0xEE 0x00AF #MACRON +0xEF 0x00B4 #ACUTE ACCENT +0xF0 0x00AD #SOFT HYPHEN +0xF1 0x00B1 #PLUS-MINUS SIGN +0xF2 0x2017 #DOUBLE LOW LINE +0xF3 0x00BE #VULGAR FRACTION THREE QUARTERS +0xF4 0x00B6 #PILCROW SIGN +0xF5 0x00A7 #SECTION SIGN +0xF6 0x00F7 #DIVISION SIGN +0xF7 0x00B8 #CEDILLA +0xF8 0x00B0 #DEGREE SIGN +0xF9 0x00A8 #DIAERESIS +0xFA 0x00B7 #MIDDLE DOT +0xFB 0x00B9 #SUPERSCRIPT ONE +0xFC 0x00B3 #SUPERSCRIPT THREE +0xFD 0x00B2 #SUPERSCRIPT TWO +0xFE 0x25A0 #BLACK SQUARE +0xFF 0x00A0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp857.txt b/lib/ucmaps/cp857.txt new file mode 100644 index 000000000..305938396 --- /dev/null +++ b/lib/ucmaps/cp857.txt @@ -0,0 +1,274 @@ +# +# Name: cp857_DOSTurkish to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell <loribr@microsoft.com> +# K.D. Chang <a-kchang@microsoft.com> +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp857_DOSTurkish code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp857_DOSTurkish order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0x84 0x00e4 #LATIN SMALL LETTER A WITH DIAERESIS +0x85 0x00e0 #LATIN SMALL LETTER A WITH GRAVE +0x86 0x00e5 #LATIN SMALL LETTER A WITH RING ABOVE +0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA +0x88 0x00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX +0x89 0x00eb #LATIN SMALL LETTER E WITH DIAERESIS +0x8a 0x00e8 #LATIN SMALL LETTER E WITH GRAVE +0x8b 0x00ef #LATIN SMALL LETTER I WITH DIAERESIS +0x8c 0x00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX +0x8d 0x0131 #LATIN SMALL LETTER DOTLESS I +0x8e 0x00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0x8f 0x00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x00e6 #LATIN SMALL LIGATURE AE +0x92 0x00c6 #LATIN CAPITAL LIGATURE AE +0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0x94 0x00f6 #LATIN SMALL LETTER O WITH DIAERESIS +0x95 0x00f2 #LATIN SMALL LETTER O WITH GRAVE +0x96 0x00fb #LATIN SMALL LETTER U WITH CIRCUMFLEX +0x97 0x00f9 #LATIN SMALL LETTER U WITH GRAVE +0x98 0x0130 #LATIN CAPITAL LETTER I WITH DOT ABOVE +0x99 0x00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x00f8 #LATIN SMALL LETTER O WITH STROKE +0x9c 0x00a3 #POUND SIGN +0x9d 0x00d8 #LATIN CAPITAL LETTER O WITH STROKE +0x9e 0x015e #LATIN CAPITAL LETTER S WITH CEDILLA +0x9f 0x015f #LATIN SMALL LETTER S WITH CEDILLA +0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE +0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x00f1 #LATIN SMALL LETTER N WITH TILDE +0xa5 0x00d1 #LATIN CAPITAL LETTER N WITH TILDE +0xa6 0x011e #LATIN CAPITAL LETTER G WITH BREVE +0xa7 0x011f #LATIN SMALL LETTER G WITH BREVE +0xa8 0x00bf #INVERTED QUESTION MARK +0xa9 0x00ae #REGISTERED SIGN +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x00a1 #INVERTED EXCLAMATION MARK +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x00c1 #LATIN CAPITAL LETTER A WITH ACUTE +0xb6 0x00c2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xb7 0x00c0 #LATIN CAPITAL LETTER A WITH GRAVE +0xb8 0x00a9 #COPYRIGHT SIGN +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x00a2 #CENT SIGN +0xbe 0x00a5 #YEN SIGN +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x00e3 #LATIN SMALL LETTER A WITH TILDE +0xc7 0x00c3 #LATIN CAPITAL LETTER A WITH TILDE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x00a4 #CURRENCY SIGN +0xd0 0x00ba #MASCULINE ORDINAL INDICATOR +0xd1 0x00aa #FEMININE ORDINAL INDICATOR +0xd2 0x00ca #LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xd3 0x00cb #LATIN CAPITAL LETTER E WITH DIAERESIS +0xd4 0x00c8 #LATIN CAPITAL LETTER E WITH GRAVE +0xd5 #UNDEFINED +0xd6 0x00cd #LATIN CAPITAL LETTER I WITH ACUTE +0xd7 0x00ce #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xd8 0x00cf #LATIN CAPITAL LETTER I WITH DIAERESIS +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x00a6 #BROKEN BAR +0xde 0x00cc #LATIN CAPITAL LETTER I WITH GRAVE +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x00d3 #LATIN CAPITAL LETTER O WITH ACUTE +0xe1 0x00df #LATIN SMALL LETTER SHARP S +0xe2 0x00d4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xe3 0x00d2 #LATIN CAPITAL LETTER O WITH GRAVE +0xe4 0x00f5 #LATIN SMALL LETTER O WITH TILDE +0xe5 0x00d5 #LATIN CAPITAL LETTER O WITH TILDE +0xe6 0x00b5 #MICRO SIGN +0xe7 #UNDEFINED +0xe8 0x00d7 #MULTIPLICATION SIGN +0xe9 0x00da #LATIN CAPITAL LETTER U WITH ACUTE +0xea 0x00db #LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xeb 0x00d9 #LATIN CAPITAL LETTER U WITH GRAVE +0xec 0x00ec #LATIN SMALL LETTER I WITH GRAVE +0xed 0x00ff #LATIN SMALL LETTER Y WITH DIAERESIS +0xee 0x00af #MACRON +0xef 0x00b4 #ACUTE ACCENT +0xf0 0x00ad #SOFT HYPHEN +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 #UNDEFINED +0xf3 0x00be #VULGAR FRACTION THREE QUARTERS +0xf4 0x00b6 #PILCROW SIGN +0xf5 0x00a7 #SECTION SIGN +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x00b8 #CEDILLA +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x00a8 #DIAERESIS +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x00b9 #SUPERSCRIPT ONE +0xfc 0x00b3 #SUPERSCRIPT THREE +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp860.txt b/lib/ucmaps/cp860.txt new file mode 100644 index 000000000..d7f2cb737 --- /dev/null +++ b/lib/ucmaps/cp860.txt @@ -0,0 +1,274 @@ +# +# Name: cp860_DOSPortuguese to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell <loribr@microsoft.com> +# K.D. Chang <a-kchang@microsoft.com> +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp860_DOSPortuguese code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp860_DOSPortuguese order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0x84 0x00e3 #LATIN SMALL LETTER A WITH TILDE +0x85 0x00e0 #LATIN SMALL LETTER A WITH GRAVE +0x86 0x00c1 #LATIN CAPITAL LETTER A WITH ACUTE +0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA +0x88 0x00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX +0x89 0x00ca #LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0x8a 0x00e8 #LATIN SMALL LETTER E WITH GRAVE +0x8b 0x00cd #LATIN CAPITAL LETTER I WITH ACUTE +0x8c 0x00d4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0x8d 0x00ec #LATIN SMALL LETTER I WITH GRAVE +0x8e 0x00c3 #LATIN CAPITAL LETTER A WITH TILDE +0x8f 0x00c2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x00c0 #LATIN CAPITAL LETTER A WITH GRAVE +0x92 0x00c8 #LATIN CAPITAL LETTER E WITH GRAVE +0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0x94 0x00f5 #LATIN SMALL LETTER O WITH TILDE +0x95 0x00f2 #LATIN SMALL LETTER O WITH GRAVE +0x96 0x00da #LATIN CAPITAL LETTER U WITH ACUTE +0x97 0x00f9 #LATIN SMALL LETTER U WITH GRAVE +0x98 0x00cc #LATIN CAPITAL LETTER I WITH GRAVE +0x99 0x00d5 #LATIN CAPITAL LETTER O WITH TILDE +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x00a2 #CENT SIGN +0x9c 0x00a3 #POUND SIGN +0x9d 0x00d9 #LATIN CAPITAL LETTER U WITH GRAVE +0x9e 0x20a7 #PESETA SIGN +0x9f 0x00d3 #LATIN CAPITAL LETTER O WITH ACUTE +0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE +0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x00f1 #LATIN SMALL LETTER N WITH TILDE +0xa5 0x00d1 #LATIN CAPITAL LETTER N WITH TILDE +0xa6 0x00aa #FEMININE ORDINAL INDICATOR +0xa7 0x00ba #MASCULINE ORDINAL INDICATOR +0xa8 0x00bf #INVERTED QUESTION MARK +0xa9 0x00d2 #LATIN CAPITAL LETTER O WITH GRAVE +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x00a1 #INVERTED EXCLAMATION MARK +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x03b1 #GREEK SMALL LETTER ALPHA +0xe1 0x00df #LATIN SMALL LETTER SHARP S +0xe2 0x0393 #GREEK CAPITAL LETTER GAMMA +0xe3 0x03c0 #GREEK SMALL LETTER PI +0xe4 0x03a3 #GREEK CAPITAL LETTER SIGMA +0xe5 0x03c3 #GREEK SMALL LETTER SIGMA +0xe6 0x00b5 #MICRO SIGN +0xe7 0x03c4 #GREEK SMALL LETTER TAU +0xe8 0x03a6 #GREEK CAPITAL LETTER PHI +0xe9 0x0398 #GREEK CAPITAL LETTER THETA +0xea 0x03a9 #GREEK CAPITAL LETTER OMEGA +0xeb 0x03b4 #GREEK SMALL LETTER DELTA +0xec 0x221e #INFINITY +0xed 0x03c6 #GREEK SMALL LETTER PHI +0xee 0x03b5 #GREEK SMALL LETTER EPSILON +0xef 0x2229 #INTERSECTION +0xf0 0x2261 #IDENTICAL TO +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x2265 #GREATER-THAN OR EQUAL TO +0xf3 0x2264 #LESS-THAN OR EQUAL TO +0xf4 0x2320 #TOP HALF INTEGRAL +0xf5 0x2321 #BOTTOM HALF INTEGRAL +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x2248 #ALMOST EQUAL TO +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x221a #SQUARE ROOT +0xfc 0x207f #SUPERSCRIPT LATIN SMALL LETTER N +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp861.txt b/lib/ucmaps/cp861.txt new file mode 100644 index 000000000..fe0f02bb5 --- /dev/null +++ b/lib/ucmaps/cp861.txt @@ -0,0 +1,274 @@ +# +# Name: cp861_DOSIcelandic to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell <loribr@microsoft.com> +# K.D. Chang <a-kchang@microsoft.com> +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp861_DOSIcelandic code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp861_DOSIcelandic order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0x84 0x00e4 #LATIN SMALL LETTER A WITH DIAERESIS +0x85 0x00e0 #LATIN SMALL LETTER A WITH GRAVE +0x86 0x00e5 #LATIN SMALL LETTER A WITH RING ABOVE +0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA +0x88 0x00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX +0x89 0x00eb #LATIN SMALL LETTER E WITH DIAERESIS +0x8a 0x00e8 #LATIN SMALL LETTER E WITH GRAVE +0x8b 0x00d0 #LATIN CAPITAL LETTER ETH +0x8c 0x00f0 #LATIN SMALL LETTER ETH +0x8d 0x00de #LATIN CAPITAL LETTER THORN +0x8e 0x00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0x8f 0x00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x00e6 #LATIN SMALL LIGATURE AE +0x92 0x00c6 #LATIN CAPITAL LIGATURE AE +0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0x94 0x00f6 #LATIN SMALL LETTER O WITH DIAERESIS +0x95 0x00fe #LATIN SMALL LETTER THORN +0x96 0x00fb #LATIN SMALL LETTER U WITH CIRCUMFLEX +0x97 0x00dd #LATIN CAPITAL LETTER Y WITH ACUTE +0x98 0x00fd #LATIN SMALL LETTER Y WITH ACUTE +0x99 0x00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x00f8 #LATIN SMALL LETTER O WITH STROKE +0x9c 0x00a3 #POUND SIGN +0x9d 0x00d8 #LATIN CAPITAL LETTER O WITH STROKE +0x9e 0x20a7 #PESETA SIGN +0x9f 0x0192 #LATIN SMALL LETTER F WITH HOOK +0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE +0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x00c1 #LATIN CAPITAL LETTER A WITH ACUTE +0xa5 0x00cd #LATIN CAPITAL LETTER I WITH ACUTE +0xa6 0x00d3 #LATIN CAPITAL LETTER O WITH ACUTE +0xa7 0x00da #LATIN CAPITAL LETTER U WITH ACUTE +0xa8 0x00bf #INVERTED QUESTION MARK +0xa9 0x2310 #REVERSED NOT SIGN +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x00a1 #INVERTED EXCLAMATION MARK +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x03b1 #GREEK SMALL LETTER ALPHA +0xe1 0x00df #LATIN SMALL LETTER SHARP S +0xe2 0x0393 #GREEK CAPITAL LETTER GAMMA +0xe3 0x03c0 #GREEK SMALL LETTER PI +0xe4 0x03a3 #GREEK CAPITAL LETTER SIGMA +0xe5 0x03c3 #GREEK SMALL LETTER SIGMA +0xe6 0x00b5 #MICRO SIGN +0xe7 0x03c4 #GREEK SMALL LETTER TAU +0xe8 0x03a6 #GREEK CAPITAL LETTER PHI +0xe9 0x0398 #GREEK CAPITAL LETTER THETA +0xea 0x03a9 #GREEK CAPITAL LETTER OMEGA +0xeb 0x03b4 #GREEK SMALL LETTER DELTA +0xec 0x221e #INFINITY +0xed 0x03c6 #GREEK SMALL LETTER PHI +0xee 0x03b5 #GREEK SMALL LETTER EPSILON +0xef 0x2229 #INTERSECTION +0xf0 0x2261 #IDENTICAL TO +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x2265 #GREATER-THAN OR EQUAL TO +0xf3 0x2264 #LESS-THAN OR EQUAL TO +0xf4 0x2320 #TOP HALF INTEGRAL +0xf5 0x2321 #BOTTOM HALF INTEGRAL +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x2248 #ALMOST EQUAL TO +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x221a #SQUARE ROOT +0xfc 0x207f #SUPERSCRIPT LATIN SMALL LETTER N +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp862.txt b/lib/ucmaps/cp862.txt new file mode 100644 index 000000000..963110518 --- /dev/null +++ b/lib/ucmaps/cp862.txt @@ -0,0 +1,274 @@ +# +# Name: cp862_DOSHebrew to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell <loribr@microsoft.com> +# K.D. Chang <a-kchang@microsoft.com> +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp862_DOSHebrew code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp862_DOSHebrew order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x05d0 #HEBREW LETTER ALEF +0x81 0x05d1 #HEBREW LETTER BET +0x82 0x05d2 #HEBREW LETTER GIMEL +0x83 0x05d3 #HEBREW LETTER DALET +0x84 0x05d4 #HEBREW LETTER HE +0x85 0x05d5 #HEBREW LETTER VAV +0x86 0x05d6 #HEBREW LETTER ZAYIN +0x87 0x05d7 #HEBREW LETTER HET +0x88 0x05d8 #HEBREW LETTER TET +0x89 0x05d9 #HEBREW LETTER YOD +0x8a 0x05da #HEBREW LETTER FINAL KAF +0x8b 0x05db #HEBREW LETTER KAF +0x8c 0x05dc #HEBREW LETTER LAMED +0x8d 0x05dd #HEBREW LETTER FINAL MEM +0x8e 0x05de #HEBREW LETTER MEM +0x8f 0x05df #HEBREW LETTER FINAL NUN +0x90 0x05e0 #HEBREW LETTER NUN +0x91 0x05e1 #HEBREW LETTER SAMEKH +0x92 0x05e2 #HEBREW LETTER AYIN +0x93 0x05e3 #HEBREW LETTER FINAL PE +0x94 0x05e4 #HEBREW LETTER PE +0x95 0x05e5 #HEBREW LETTER FINAL TSADI +0x96 0x05e6 #HEBREW LETTER TSADI +0x97 0x05e7 #HEBREW LETTER QOF +0x98 0x05e8 #HEBREW LETTER RESH +0x99 0x05e9 #HEBREW LETTER SHIN +0x9a 0x05ea #HEBREW LETTER TAV +0x9b 0x00a2 #CENT SIGN +0x9c 0x00a3 #POUND SIGN +0x9d 0x00a5 #YEN SIGN +0x9e 0x20a7 #PESETA SIGN +0x9f 0x0192 #LATIN SMALL LETTER F WITH HOOK +0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE +0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x00f1 #LATIN SMALL LETTER N WITH TILDE +0xa5 0x00d1 #LATIN CAPITAL LETTER N WITH TILDE +0xa6 0x00aa #FEMININE ORDINAL INDICATOR +0xa7 0x00ba #MASCULINE ORDINAL INDICATOR +0xa8 0x00bf #INVERTED QUESTION MARK +0xa9 0x2310 #REVERSED NOT SIGN +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x00a1 #INVERTED EXCLAMATION MARK +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x03b1 #GREEK SMALL LETTER ALPHA +0xe1 0x00df #LATIN SMALL LETTER SHARP S (GERMAN) +0xe2 0x0393 #GREEK CAPITAL LETTER GAMMA +0xe3 0x03c0 #GREEK SMALL LETTER PI +0xe4 0x03a3 #GREEK CAPITAL LETTER SIGMA +0xe5 0x03c3 #GREEK SMALL LETTER SIGMA +0xe6 0x00b5 #MICRO SIGN +0xe7 0x03c4 #GREEK SMALL LETTER TAU +0xe8 0x03a6 #GREEK CAPITAL LETTER PHI +0xe9 0x0398 #GREEK CAPITAL LETTER THETA +0xea 0x03a9 #GREEK CAPITAL LETTER OMEGA +0xeb 0x03b4 #GREEK SMALL LETTER DELTA +0xec 0x221e #INFINITY +0xed 0x03c6 #GREEK SMALL LETTER PHI +0xee 0x03b5 #GREEK SMALL LETTER EPSILON +0xef 0x2229 #INTERSECTION +0xf0 0x2261 #IDENTICAL TO +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x2265 #GREATER-THAN OR EQUAL TO +0xf3 0x2264 #LESS-THAN OR EQUAL TO +0xf4 0x2320 #TOP HALF INTEGRAL +0xf5 0x2321 #BOTTOM HALF INTEGRAL +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x2248 #ALMOST EQUAL TO +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x221a #SQUARE ROOT +0xfc 0x207f #SUPERSCRIPT LATIN SMALL LETTER N +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp863.txt b/lib/ucmaps/cp863.txt new file mode 100644 index 000000000..cc4eae186 --- /dev/null +++ b/lib/ucmaps/cp863.txt @@ -0,0 +1,274 @@ +# +# Name: cp863_DOSCanadaF to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell <loribr@microsoft.com> +# K.D. Chang <a-kchang@microsoft.com> +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp863_DOSCanadaF code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp863_DOSCanadaF order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0x84 0x00c2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0x85 0x00e0 #LATIN SMALL LETTER A WITH GRAVE +0x86 0x00b6 #PILCROW SIGN +0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA +0x88 0x00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX +0x89 0x00eb #LATIN SMALL LETTER E WITH DIAERESIS +0x8a 0x00e8 #LATIN SMALL LETTER E WITH GRAVE +0x8b 0x00ef #LATIN SMALL LETTER I WITH DIAERESIS +0x8c 0x00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX +0x8d 0x2017 #DOUBLE LOW LINE +0x8e 0x00c0 #LATIN CAPITAL LETTER A WITH GRAVE +0x8f 0x00a7 #SECTION SIGN +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x00c8 #LATIN CAPITAL LETTER E WITH GRAVE +0x92 0x00ca #LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0x94 0x00cb #LATIN CAPITAL LETTER E WITH DIAERESIS +0x95 0x00cf #LATIN CAPITAL LETTER I WITH DIAERESIS +0x96 0x00fb #LATIN SMALL LETTER U WITH CIRCUMFLEX +0x97 0x00f9 #LATIN SMALL LETTER U WITH GRAVE +0x98 0x00a4 #CURRENCY SIGN +0x99 0x00d4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x00a2 #CENT SIGN +0x9c 0x00a3 #POUND SIGN +0x9d 0x00d9 #LATIN CAPITAL LETTER U WITH GRAVE +0x9e 0x00db #LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0x9f 0x0192 #LATIN SMALL LETTER F WITH HOOK +0xa0 0x00a6 #BROKEN BAR +0xa1 0x00b4 #ACUTE ACCENT +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x00a8 #DIAERESIS +0xa5 0x00b8 #CEDILLA +0xa6 0x00b3 #SUPERSCRIPT THREE +0xa7 0x00af #MACRON +0xa8 0x00ce #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xa9 0x2310 #REVERSED NOT SIGN +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x00be #VULGAR FRACTION THREE QUARTERS +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x03b1 #GREEK SMALL LETTER ALPHA +0xe1 0x00df #LATIN SMALL LETTER SHARP S +0xe2 0x0393 #GREEK CAPITAL LETTER GAMMA +0xe3 0x03c0 #GREEK SMALL LETTER PI +0xe4 0x03a3 #GREEK CAPITAL LETTER SIGMA +0xe5 0x03c3 #GREEK SMALL LETTER SIGMA +0xe6 0x00b5 #MICRO SIGN +0xe7 0x03c4 #GREEK SMALL LETTER TAU +0xe8 0x03a6 #GREEK CAPITAL LETTER PHI +0xe9 0x0398 #GREEK CAPITAL LETTER THETA +0xea 0x03a9 #GREEK CAPITAL LETTER OMEGA +0xeb 0x03b4 #GREEK SMALL LETTER DELTA +0xec 0x221e #INFINITY +0xed 0x03c6 #GREEK SMALL LETTER PHI +0xee 0x03b5 #GREEK SMALL LETTER EPSILON +0xef 0x2229 #INTERSECTION +0xf0 0x2261 #IDENTICAL TO +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x2265 #GREATER-THAN OR EQUAL TO +0xf3 0x2264 #LESS-THAN OR EQUAL TO +0xf4 0x2320 #TOP HALF INTEGRAL +0xf5 0x2321 #BOTTOM HALF INTEGRAL +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x2248 #ALMOST EQUAL TO +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x221a #SQUARE ROOT +0xfc 0x207f #SUPERSCRIPT LATIN SMALL LETTER N +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp864.txt b/lib/ucmaps/cp864.txt new file mode 100644 index 000000000..7aa055fba --- /dev/null +++ b/lib/ucmaps/cp864.txt @@ -0,0 +1,274 @@ +# +# Name: cp864_DOSArabic to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell <loribr@microsoft.com> +# K.D. Chang <a-kchang@microsoft.com> +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp864_DOSArabic code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp864_DOSArabic order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x066a #ARABIC PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00b0 #DEGREE SIGN +0x81 0x00b7 #MIDDLE DOT +0x82 0x2219 #BULLET OPERATOR +0x83 0x221a #SQUARE ROOT +0x84 0x2592 #MEDIUM SHADE +0x85 0x2500 #FORMS LIGHT HORIZONTAL +0x86 0x2502 #FORMS LIGHT VERTICAL +0x87 0x253c #FORMS LIGHT VERTICAL AND HORIZONTAL +0x88 0x2524 #FORMS LIGHT VERTICAL AND LEFT +0x89 0x252c #FORMS LIGHT DOWN AND HORIZONTAL +0x8a 0x251c #FORMS LIGHT VERTICAL AND RIGHT +0x8b 0x2534 #FORMS LIGHT UP AND HORIZONTAL +0x8c 0x2510 #FORMS LIGHT DOWN AND LEFT +0x8d 0x250c #FORMS LIGHT DOWN AND RIGHT +0x8e 0x2514 #FORMS LIGHT UP AND RIGHT +0x8f 0x2518 #FORMS LIGHT UP AND LEFT +0x90 0x03b2 #GREEK SMALL BETA +0x91 0x221e #INFINITY +0x92 0x03c6 #GREEK SMALL PHI +0x93 0x00b1 #PLUS-OR-MINUS SIGN +0x94 0x00bd #FRACTION 1/2 +0x95 0x00bc #FRACTION 1/4 +0x96 0x2248 #ALMOST EQUAL TO +0x97 0x00ab #LEFT POINTING GUILLEMET +0x98 0x00bb #RIGHT POINTING GUILLEMET +0x99 0xfef7 #ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM +0x9a 0xfef8 #ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM +0x9b #UNDEFINED +0x9c #UNDEFINED +0x9d 0xfefb #ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM +0x9e 0xfefc #ARABIC LIGATURE LAM WITH ALEF FINAL FORM +0x9f #UNDEFINED +0xa0 0x00a0 #NON-BREAKING SPACE +0xa1 0x00ad #SOFT HYPHEN +0xa2 0xfe82 #ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM +0xa3 0x00a3 #POUND SIGN +0xa4 0x00a4 #CURRENCY SIGN +0xa5 0xfe84 #ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM +0xa6 #UNDEFINED +0xa7 #UNDEFINED +0xa8 0xfe8e #ARABIC LETTER ALEF FINAL FORM +0xa9 0xfe8f #ARABIC LETTER BEH ISOLATED FORM +0xaa 0xfe95 #ARABIC LETTER TEH ISOLATED FORM +0xab 0xfe99 #ARABIC LETTER THEH ISOLATED FORM +0xac 0x060c #ARABIC COMMA +0xad 0xfe9d #ARABIC LETTER JEEM ISOLATED FORM +0xae 0xfea1 #ARABIC LETTER HAH ISOLATED FORM +0xaf 0xfea5 #ARABIC LETTER KHAH ISOLATED FORM +0xb0 0x0660 #ARABIC-INDIC DIGIT ZERO +0xb1 0x0661 #ARABIC-INDIC DIGIT ONE +0xb2 0x0662 #ARABIC-INDIC DIGIT TWO +0xb3 0x0663 #ARABIC-INDIC DIGIT THREE +0xb4 0x0664 #ARABIC-INDIC DIGIT FOUR +0xb5 0x0665 #ARABIC-INDIC DIGIT FIVE +0xb6 0x0666 #ARABIC-INDIC DIGIT SIX +0xb7 0x0667 #ARABIC-INDIC DIGIT SEVEN +0xb8 0x0668 #ARABIC-INDIC DIGIT EIGHT +0xb9 0x0669 #ARABIC-INDIC DIGIT NINE +0xba 0xfed1 #ARABIC LETTER FEH ISOLATED FORM +0xbb 0x061b #ARABIC SEMICOLON +0xbc 0xfeb1 #ARABIC LETTER SEEN ISOLATED FORM +0xbd 0xfeb5 #ARABIC LETTER SHEEN ISOLATED FORM +0xbe 0xfeb9 #ARABIC LETTER SAD ISOLATED FORM +0xbf 0x061f #ARABIC QUESTION MARK +0xc0 0x00a2 #CENT SIGN +0xc1 0xfe80 #ARABIC LETTER HAMZA ISOLATED FORM +0xc2 0xfe81 #ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM +0xc3 0xfe83 #ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM +0xc4 0xfe85 #ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM +0xc5 0xfeca #ARABIC LETTER AIN FINAL FORM +0xc6 0xfe8b #ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM +0xc7 0xfe8d #ARABIC LETTER ALEF ISOLATED FORM +0xc8 0xfe91 #ARABIC LETTER BEH INITIAL FORM +0xc9 0xfe93 #ARABIC LETTER TEH MARBUTA ISOLATED FORM +0xca 0xfe97 #ARABIC LETTER TEH INITIAL FORM +0xcb 0xfe9b #ARABIC LETTER THEH INITIAL FORM +0xcc 0xfe9f #ARABIC LETTER JEEM INITIAL FORM +0xcd 0xfea3 #ARABIC LETTER HAH INITIAL FORM +0xce 0xfea7 #ARABIC LETTER KHAH INITIAL FORM +0xcf 0xfea9 #ARABIC LETTER DAL ISOLATED FORM +0xd0 0xfeab #ARABIC LETTER THAL ISOLATED FORM +0xd1 0xfead #ARABIC LETTER REH ISOLATED FORM +0xd2 0xfeaf #ARABIC LETTER ZAIN ISOLATED FORM +0xd3 0xfeb3 #ARABIC LETTER SEEN INITIAL FORM +0xd4 0xfeb7 #ARABIC LETTER SHEEN INITIAL FORM +0xd5 0xfebb #ARABIC LETTER SAD INITIAL FORM +0xd6 0xfebf #ARABIC LETTER DAD INITIAL FORM +0xd7 0xfec1 #ARABIC LETTER TAH ISOLATED FORM +0xd8 0xfec5 #ARABIC LETTER ZAH ISOLATED FORM +0xd9 0xfecb #ARABIC LETTER AIN INITIAL FORM +0xda 0xfecf #ARABIC LETTER GHAIN INITIAL FORM +0xdb 0x00a6 #BROKEN VERTICAL BAR +0xdc 0x00ac #NOT SIGN +0xdd 0x00f7 #DIVISION SIGN +0xde 0x00d7 #MULTIPLICATION SIGN +0xdf 0xfec9 #ARABIC LETTER AIN ISOLATED FORM +0xe0 0x0640 #ARABIC TATWEEL +0xe1 0xfed3 #ARABIC LETTER FEH INITIAL FORM +0xe2 0xfed7 #ARABIC LETTER QAF INITIAL FORM +0xe3 0xfedb #ARABIC LETTER KAF INITIAL FORM +0xe4 0xfedf #ARABIC LETTER LAM INITIAL FORM +0xe5 0xfee3 #ARABIC LETTER MEEM INITIAL FORM +0xe6 0xfee7 #ARABIC LETTER NOON INITIAL FORM +0xe7 0xfeeb #ARABIC LETTER HEH INITIAL FORM +0xe8 0xfeed #ARABIC LETTER WAW ISOLATED FORM +0xe9 0xfeef #ARABIC LETTER ALEF MAKSURA ISOLATED FORM +0xea 0xfef3 #ARABIC LETTER YEH INITIAL FORM +0xeb 0xfebd #ARABIC LETTER DAD ISOLATED FORM +0xec 0xfecc #ARABIC LETTER AIN MEDIAL FORM +0xed 0xfece #ARABIC LETTER GHAIN FINAL FORM +0xee 0xfecd #ARABIC LETTER GHAIN ISOLATED FORM +0xef 0xfee1 #ARABIC LETTER MEEM ISOLATED FORM +0xf0 0xfe7d #ARABIC SHADDA MEDIAL FORM +0xf1 0x0651 #ARABIC SHADDAH +0xf2 0xfee5 #ARABIC LETTER NOON ISOLATED FORM +0xf3 0xfee9 #ARABIC LETTER HEH ISOLATED FORM +0xf4 0xfeec #ARABIC LETTER HEH MEDIAL FORM +0xf5 0xfef0 #ARABIC LETTER ALEF MAKSURA FINAL FORM +0xf6 0xfef2 #ARABIC LETTER YEH FINAL FORM +0xf7 0xfed0 #ARABIC LETTER GHAIN MEDIAL FORM +0xf8 0xfed5 #ARABIC LETTER QAF ISOLATED FORM +0xf9 0xfef5 #ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM +0xfa 0xfef6 #ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM +0xfb 0xfedd #ARABIC LETTER LAM ISOLATED FORM +0xfc 0xfed9 #ARABIC LETTER KAF ISOLATED FORM +0xfd 0xfef1 #ARABIC LETTER YEH ISOLATED FORM +0xfe 0x25a0 #BLACK SQUARE +0xff #UNDEFINED + diff --git a/lib/ucmaps/cp865.txt b/lib/ucmaps/cp865.txt new file mode 100644 index 000000000..67705f46a --- /dev/null +++ b/lib/ucmaps/cp865.txt @@ -0,0 +1,274 @@ +# +# Name: cp865_DOSNordic to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell <loribr@microsoft.com> +# K.D. Chang <a-kchang@microsoft.com> +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp865_DOSNordic code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp865_DOSNordic order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x00c7 #LATIN CAPITAL LETTER C WITH CEDILLA +0x81 0x00fc #LATIN SMALL LETTER U WITH DIAERESIS +0x82 0x00e9 #LATIN SMALL LETTER E WITH ACUTE +0x83 0x00e2 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0x84 0x00e4 #LATIN SMALL LETTER A WITH DIAERESIS +0x85 0x00e0 #LATIN SMALL LETTER A WITH GRAVE +0x86 0x00e5 #LATIN SMALL LETTER A WITH RING ABOVE +0x87 0x00e7 #LATIN SMALL LETTER C WITH CEDILLA +0x88 0x00ea #LATIN SMALL LETTER E WITH CIRCUMFLEX +0x89 0x00eb #LATIN SMALL LETTER E WITH DIAERESIS +0x8a 0x00e8 #LATIN SMALL LETTER E WITH GRAVE +0x8b 0x00ef #LATIN SMALL LETTER I WITH DIAERESIS +0x8c 0x00ee #LATIN SMALL LETTER I WITH CIRCUMFLEX +0x8d 0x00ec #LATIN SMALL LETTER I WITH GRAVE +0x8e 0x00c4 #LATIN CAPITAL LETTER A WITH DIAERESIS +0x8f 0x00c5 #LATIN CAPITAL LETTER A WITH RING ABOVE +0x90 0x00c9 #LATIN CAPITAL LETTER E WITH ACUTE +0x91 0x00e6 #LATIN SMALL LIGATURE AE +0x92 0x00c6 #LATIN CAPITAL LIGATURE AE +0x93 0x00f4 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0x94 0x00f6 #LATIN SMALL LETTER O WITH DIAERESIS +0x95 0x00f2 #LATIN SMALL LETTER O WITH GRAVE +0x96 0x00fb #LATIN SMALL LETTER U WITH CIRCUMFLEX +0x97 0x00f9 #LATIN SMALL LETTER U WITH GRAVE +0x98 0x00ff #LATIN SMALL LETTER Y WITH DIAERESIS +0x99 0x00d6 #LATIN CAPITAL LETTER O WITH DIAERESIS +0x9a 0x00dc #LATIN CAPITAL LETTER U WITH DIAERESIS +0x9b 0x00f8 #LATIN SMALL LETTER O WITH STROKE +0x9c 0x00a3 #POUND SIGN +0x9d 0x00d8 #LATIN CAPITAL LETTER O WITH STROKE +0x9e 0x20a7 #PESETA SIGN +0x9f 0x0192 #LATIN SMALL LETTER F WITH HOOK +0xa0 0x00e1 #LATIN SMALL LETTER A WITH ACUTE +0xa1 0x00ed #LATIN SMALL LETTER I WITH ACUTE +0xa2 0x00f3 #LATIN SMALL LETTER O WITH ACUTE +0xa3 0x00fa #LATIN SMALL LETTER U WITH ACUTE +0xa4 0x00f1 #LATIN SMALL LETTER N WITH TILDE +0xa5 0x00d1 #LATIN CAPITAL LETTER N WITH TILDE +0xa6 0x00aa #FEMININE ORDINAL INDICATOR +0xa7 0x00ba #MASCULINE ORDINAL INDICATOR +0xa8 0x00bf #INVERTED QUESTION MARK +0xa9 0x2310 #REVERSED NOT SIGN +0xaa 0x00ac #NOT SIGN +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x00bc #VULGAR FRACTION ONE QUARTER +0xad 0x00a1 #INVERTED EXCLAMATION MARK +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00a4 #CURRENCY SIGN +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x03b1 #GREEK SMALL LETTER ALPHA +0xe1 0x00df #LATIN SMALL LETTER SHARP S +0xe2 0x0393 #GREEK CAPITAL LETTER GAMMA +0xe3 0x03c0 #GREEK SMALL LETTER PI +0xe4 0x03a3 #GREEK CAPITAL LETTER SIGMA +0xe5 0x03c3 #GREEK SMALL LETTER SIGMA +0xe6 0x00b5 #MICRO SIGN +0xe7 0x03c4 #GREEK SMALL LETTER TAU +0xe8 0x03a6 #GREEK CAPITAL LETTER PHI +0xe9 0x0398 #GREEK CAPITAL LETTER THETA +0xea 0x03a9 #GREEK CAPITAL LETTER OMEGA +0xeb 0x03b4 #GREEK SMALL LETTER DELTA +0xec 0x221e #INFINITY +0xed 0x03c6 #GREEK SMALL LETTER PHI +0xee 0x03b5 #GREEK SMALL LETTER EPSILON +0xef 0x2229 #INTERSECTION +0xf0 0x2261 #IDENTICAL TO +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x2265 #GREATER-THAN OR EQUAL TO +0xf3 0x2264 #LESS-THAN OR EQUAL TO +0xf4 0x2320 #TOP HALF INTEGRAL +0xf5 0x2321 #BOTTOM HALF INTEGRAL +0xf6 0x00f7 #DIVISION SIGN +0xf7 0x2248 #ALMOST EQUAL TO +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x221a #SQUARE ROOT +0xfc 0x207f #SUPERSCRIPT LATIN SMALL LETTER N +0xfd 0x00b2 #SUPERSCRIPT TWO +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp866.txt b/lib/ucmaps/cp866.txt new file mode 100644 index 000000000..880fb70e3 --- /dev/null +++ b/lib/ucmaps/cp866.txt @@ -0,0 +1,274 @@ +# +# Name: cp866_DOSCyrillicRussian to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell <loribr@microsoft.com> +# K.D. Chang <a-kchang@microsoft.com> +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp866_DOSCyrillicRussian code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp866_DOSCyrillicRussian order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 0x0410 #CYRILLIC CAPITAL LETTER A +0x81 0x0411 #CYRILLIC CAPITAL LETTER BE +0x82 0x0412 #CYRILLIC CAPITAL LETTER VE +0x83 0x0413 #CYRILLIC CAPITAL LETTER GHE +0x84 0x0414 #CYRILLIC CAPITAL LETTER DE +0x85 0x0415 #CYRILLIC CAPITAL LETTER IE +0x86 0x0416 #CYRILLIC CAPITAL LETTER ZHE +0x87 0x0417 #CYRILLIC CAPITAL LETTER ZE +0x88 0x0418 #CYRILLIC CAPITAL LETTER I +0x89 0x0419 #CYRILLIC CAPITAL LETTER SHORT I +0x8a 0x041a #CYRILLIC CAPITAL LETTER KA +0x8b 0x041b #CYRILLIC CAPITAL LETTER EL +0x8c 0x041c #CYRILLIC CAPITAL LETTER EM +0x8d 0x041d #CYRILLIC CAPITAL LETTER EN +0x8e 0x041e #CYRILLIC CAPITAL LETTER O +0x8f 0x041f #CYRILLIC CAPITAL LETTER PE +0x90 0x0420 #CYRILLIC CAPITAL LETTER ER +0x91 0x0421 #CYRILLIC CAPITAL LETTER ES +0x92 0x0422 #CYRILLIC CAPITAL LETTER TE +0x93 0x0423 #CYRILLIC CAPITAL LETTER U +0x94 0x0424 #CYRILLIC CAPITAL LETTER EF +0x95 0x0425 #CYRILLIC CAPITAL LETTER HA +0x96 0x0426 #CYRILLIC CAPITAL LETTER TSE +0x97 0x0427 #CYRILLIC CAPITAL LETTER CHE +0x98 0x0428 #CYRILLIC CAPITAL LETTER SHA +0x99 0x0429 #CYRILLIC CAPITAL LETTER SHCHA +0x9a 0x042a #CYRILLIC CAPITAL LETTER HARD SIGN +0x9b 0x042b #CYRILLIC CAPITAL LETTER YERU +0x9c 0x042c #CYRILLIC CAPITAL LETTER SOFT SIGN +0x9d 0x042d #CYRILLIC CAPITAL LETTER E +0x9e 0x042e #CYRILLIC CAPITAL LETTER YU +0x9f 0x042f #CYRILLIC CAPITAL LETTER YA +0xa0 0x0430 #CYRILLIC SMALL LETTER A +0xa1 0x0431 #CYRILLIC SMALL LETTER BE +0xa2 0x0432 #CYRILLIC SMALL LETTER VE +0xa3 0x0433 #CYRILLIC SMALL LETTER GHE +0xa4 0x0434 #CYRILLIC SMALL LETTER DE +0xa5 0x0435 #CYRILLIC SMALL LETTER IE +0xa6 0x0436 #CYRILLIC SMALL LETTER ZHE +0xa7 0x0437 #CYRILLIC SMALL LETTER ZE +0xa8 0x0438 #CYRILLIC SMALL LETTER I +0xa9 0x0439 #CYRILLIC SMALL LETTER SHORT I +0xaa 0x043a #CYRILLIC SMALL LETTER KA +0xab 0x043b #CYRILLIC SMALL LETTER EL +0xac 0x043c #CYRILLIC SMALL LETTER EM +0xad 0x043d #CYRILLIC SMALL LETTER EN +0xae 0x043e #CYRILLIC SMALL LETTER O +0xaf 0x043f #CYRILLIC SMALL LETTER PE +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x2561 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +0xb6 0x2562 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +0xb7 0x2556 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +0xb8 0x2555 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x255c #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +0xbe 0x255b #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x255e #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +0xc7 0x255f #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x2567 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +0xd0 0x2568 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +0xd1 0x2564 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +0xd2 0x2565 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +0xd3 0x2559 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +0xd4 0x2558 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +0xd5 0x2552 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +0xd6 0x2553 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +0xd7 0x256b #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +0xd8 0x256a #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x258c #LEFT HALF BLOCK +0xde 0x2590 #RIGHT HALF BLOCK +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x0440 #CYRILLIC SMALL LETTER ER +0xe1 0x0441 #CYRILLIC SMALL LETTER ES +0xe2 0x0442 #CYRILLIC SMALL LETTER TE +0xe3 0x0443 #CYRILLIC SMALL LETTER U +0xe4 0x0444 #CYRILLIC SMALL LETTER EF +0xe5 0x0445 #CYRILLIC SMALL LETTER HA +0xe6 0x0446 #CYRILLIC SMALL LETTER TSE +0xe7 0x0447 #CYRILLIC SMALL LETTER CHE +0xe8 0x0448 #CYRILLIC SMALL LETTER SHA +0xe9 0x0449 #CYRILLIC SMALL LETTER SHCHA +0xea 0x044a #CYRILLIC SMALL LETTER HARD SIGN +0xeb 0x044b #CYRILLIC SMALL LETTER YERU +0xec 0x044c #CYRILLIC SMALL LETTER SOFT SIGN +0xed 0x044d #CYRILLIC SMALL LETTER E +0xee 0x044e #CYRILLIC SMALL LETTER YU +0xef 0x044f #CYRILLIC SMALL LETTER YA +0xf0 0x0401 #CYRILLIC CAPITAL LETTER IO +0xf1 0x0451 #CYRILLIC SMALL LETTER IO +0xf2 0x0404 #CYRILLIC CAPITAL LETTER UKRAINIAN IE +0xf3 0x0454 #CYRILLIC SMALL LETTER UKRAINIAN IE +0xf4 0x0407 #CYRILLIC CAPITAL LETTER YI +0xf5 0x0457 #CYRILLIC SMALL LETTER YI +0xf6 0x040e #CYRILLIC CAPITAL LETTER SHORT U +0xf7 0x045e #CYRILLIC SMALL LETTER SHORT U +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x2219 #BULLET OPERATOR +0xfa 0x00b7 #MIDDLE DOT +0xfb 0x221a #SQUARE ROOT +0xfc 0x2116 #NUMERO SIGN +0xfd 0x00a4 #CURRENCY SIGN +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp869.txt b/lib/ucmaps/cp869.txt new file mode 100644 index 000000000..4c77ffd6c --- /dev/null +++ b/lib/ucmaps/cp869.txt @@ -0,0 +1,274 @@ +# +# Name: cp869_DOSGreek2 to Unicode table +# Unicode version: 2.0 +# Table version: 2.00 +# Table format: Format A +# Date: 04/24/96 +# Authors: Lori Brownell <loribr@microsoft.com> +# K.D. Chang <a-kchang@microsoft.com> +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp869_DOSGreek2 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp869_DOSGreek2 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0a 0x000a #LINE FEED +0x0b 0x000b #VERTICAL TABULATION +0x0c 0x000c #FORM FEED +0x0d 0x000d #CARRIAGE RETURN +0x0e 0x000e #SHIFT OUT +0x0f 0x000f #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1a 0x001a #SUBSTITUTE +0x1b 0x001b #ESCAPE +0x1c 0x001c #FILE SEPARATOR +0x1d 0x001d #GROUP SEPARATOR +0x1e 0x001e #RECORD SEPARATOR +0x1f 0x001f #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2a 0x002a #ASTERISK +0x2b 0x002b #PLUS SIGN +0x2c 0x002c #COMMA +0x2d 0x002d #HYPHEN-MINUS +0x2e 0x002e #FULL STOP +0x2f 0x002f #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3a 0x003a #COLON +0x3b 0x003b #SEMICOLON +0x3c 0x003c #LESS-THAN SIGN +0x3d 0x003d #EQUALS SIGN +0x3e 0x003e #GREATER-THAN SIGN +0x3f 0x003f #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4a 0x004a #LATIN CAPITAL LETTER J +0x4b 0x004b #LATIN CAPITAL LETTER K +0x4c 0x004c #LATIN CAPITAL LETTER L +0x4d 0x004d #LATIN CAPITAL LETTER M +0x4e 0x004e #LATIN CAPITAL LETTER N +0x4f 0x004f #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5a 0x005a #LATIN CAPITAL LETTER Z +0x5b 0x005b #LEFT SQUARE BRACKET +0x5c 0x005c #REVERSE SOLIDUS +0x5d 0x005d #RIGHT SQUARE BRACKET +0x5e 0x005e #CIRCUMFLEX ACCENT +0x5f 0x005f #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6a 0x006a #LATIN SMALL LETTER J +0x6b 0x006b #LATIN SMALL LETTER K +0x6c 0x006c #LATIN SMALL LETTER L +0x6d 0x006d #LATIN SMALL LETTER M +0x6e 0x006e #LATIN SMALL LETTER N +0x6f 0x006f #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7a 0x007a #LATIN SMALL LETTER Z +0x7b 0x007b #LEFT CURLY BRACKET +0x7c 0x007c #VERTICAL LINE +0x7d 0x007d #RIGHT CURLY BRACKET +0x7e 0x007e #TILDE +0x7f 0x007f #DELETE +0x80 #UNDEFINED +0x81 #UNDEFINED +0x82 #UNDEFINED +0x83 #UNDEFINED +0x84 #UNDEFINED +0x85 #UNDEFINED +0x86 0x0386 #GREEK CAPITAL LETTER ALPHA WITH TONOS +0x87 #UNDEFINED +0x88 0x00b7 #MIDDLE DOT +0x89 0x00ac #NOT SIGN +0x8a 0x00a6 #BROKEN BAR +0x8b 0x2018 #LEFT SINGLE QUOTATION MARK +0x8c 0x2019 #RIGHT SINGLE QUOTATION MARK +0x8d 0x0388 #GREEK CAPITAL LETTER EPSILON WITH TONOS +0x8e 0x2015 #HORIZONTAL BAR +0x8f 0x0389 #GREEK CAPITAL LETTER ETA WITH TONOS +0x90 0x038a #GREEK CAPITAL LETTER IOTA WITH TONOS +0x91 0x03aa #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +0x92 0x038c #GREEK CAPITAL LETTER OMICRON WITH TONOS +0x93 #UNDEFINED +0x94 #UNDEFINED +0x95 0x038e #GREEK CAPITAL LETTER UPSILON WITH TONOS +0x96 0x03ab #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +0x97 0x00a9 #COPYRIGHT SIGN +0x98 0x038f #GREEK CAPITAL LETTER OMEGA WITH TONOS +0x99 0x00b2 #SUPERSCRIPT TWO +0x9a 0x00b3 #SUPERSCRIPT THREE +0x9b 0x03ac #GREEK SMALL LETTER ALPHA WITH TONOS +0x9c 0x00a3 #POUND SIGN +0x9d 0x03ad #GREEK SMALL LETTER EPSILON WITH TONOS +0x9e 0x03ae #GREEK SMALL LETTER ETA WITH TONOS +0x9f 0x03af #GREEK SMALL LETTER IOTA WITH TONOS +0xa0 0x03ca #GREEK SMALL LETTER IOTA WITH DIALYTIKA +0xa1 0x0390 #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0xa2 0x03cc #GREEK SMALL LETTER OMICRON WITH TONOS +0xa3 0x03cd #GREEK SMALL LETTER UPSILON WITH TONOS +0xa4 0x0391 #GREEK CAPITAL LETTER ALPHA +0xa5 0x0392 #GREEK CAPITAL LETTER BETA +0xa6 0x0393 #GREEK CAPITAL LETTER GAMMA +0xa7 0x0394 #GREEK CAPITAL LETTER DELTA +0xa8 0x0395 #GREEK CAPITAL LETTER EPSILON +0xa9 0x0396 #GREEK CAPITAL LETTER ZETA +0xaa 0x0397 #GREEK CAPITAL LETTER ETA +0xab 0x00bd #VULGAR FRACTION ONE HALF +0xac 0x0398 #GREEK CAPITAL LETTER THETA +0xad 0x0399 #GREEK CAPITAL LETTER IOTA +0xae 0x00ab #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xaf 0x00bb #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xb0 0x2591 #LIGHT SHADE +0xb1 0x2592 #MEDIUM SHADE +0xb2 0x2593 #DARK SHADE +0xb3 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0xb4 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0xb5 0x039a #GREEK CAPITAL LETTER KAPPA +0xb6 0x039b #GREEK CAPITAL LETTER LAMDA +0xb7 0x039c #GREEK CAPITAL LETTER MU +0xb8 0x039d #GREEK CAPITAL LETTER NU +0xb9 0x2563 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT +0xba 0x2551 #BOX DRAWINGS DOUBLE VERTICAL +0xbb 0x2557 #BOX DRAWINGS DOUBLE DOWN AND LEFT +0xbc 0x255d #BOX DRAWINGS DOUBLE UP AND LEFT +0xbd 0x039e #GREEK CAPITAL LETTER XI +0xbe 0x039f #GREEK CAPITAL LETTER OMICRON +0xbf 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0xc0 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0xc1 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0xc2 0x252c #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0xc3 0x251c #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0xc4 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0xc5 0x253c #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0xc6 0x03a0 #GREEK CAPITAL LETTER PI +0xc7 0x03a1 #GREEK CAPITAL LETTER RHO +0xc8 0x255a #BOX DRAWINGS DOUBLE UP AND RIGHT +0xc9 0x2554 #BOX DRAWINGS DOUBLE DOWN AND RIGHT +0xca 0x2569 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0xcb 0x2566 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +0xcc 0x2560 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +0xcd 0x2550 #BOX DRAWINGS DOUBLE HORIZONTAL +0xce 0x256c #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0xcf 0x03a3 #GREEK CAPITAL LETTER SIGMA +0xd0 0x03a4 #GREEK CAPITAL LETTER TAU +0xd1 0x03a5 #GREEK CAPITAL LETTER UPSILON +0xd2 0x03a6 #GREEK CAPITAL LETTER PHI +0xd3 0x03a7 #GREEK CAPITAL LETTER CHI +0xd4 0x03a8 #GREEK CAPITAL LETTER PSI +0xd5 0x03a9 #GREEK CAPITAL LETTER OMEGA +0xd6 0x03b1 #GREEK SMALL LETTER ALPHA +0xd7 0x03b2 #GREEK SMALL LETTER BETA +0xd8 0x03b3 #GREEK SMALL LETTER GAMMA +0xd9 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0xda 0x250c #BOX DRAWINGS LIGHT DOWN AND RIGHT +0xdb 0x2588 #FULL BLOCK +0xdc 0x2584 #LOWER HALF BLOCK +0xdd 0x03b4 #GREEK SMALL LETTER DELTA +0xde 0x03b5 #GREEK SMALL LETTER EPSILON +0xdf 0x2580 #UPPER HALF BLOCK +0xe0 0x03b6 #GREEK SMALL LETTER ZETA +0xe1 0x03b7 #GREEK SMALL LETTER ETA +0xe2 0x03b8 #GREEK SMALL LETTER THETA +0xe3 0x03b9 #GREEK SMALL LETTER IOTA +0xe4 0x03ba #GREEK SMALL LETTER KAPPA +0xe5 0x03bb #GREEK SMALL LETTER LAMDA +0xe6 0x03bc #GREEK SMALL LETTER MU +0xe7 0x03bd #GREEK SMALL LETTER NU +0xe8 0x03be #GREEK SMALL LETTER XI +0xe9 0x03bf #GREEK SMALL LETTER OMICRON +0xea 0x03c0 #GREEK SMALL LETTER PI +0xeb 0x03c1 #GREEK SMALL LETTER RHO +0xec 0x03c3 #GREEK SMALL LETTER SIGMA +0xed 0x03c2 #GREEK SMALL LETTER FINAL SIGMA +0xee 0x03c4 #GREEK SMALL LETTER TAU +0xef 0x0384 #GREEK TONOS +0xf0 0x00ad #SOFT HYPHEN +0xf1 0x00b1 #PLUS-MINUS SIGN +0xf2 0x03c5 #GREEK SMALL LETTER UPSILON +0xf3 0x03c6 #GREEK SMALL LETTER PHI +0xf4 0x03c7 #GREEK SMALL LETTER CHI +0xf5 0x00a7 #SECTION SIGN +0xf6 0x03c8 #GREEK SMALL LETTER PSI +0xf7 0x0385 #GREEK DIALYTIKA TONOS +0xf8 0x00b0 #DEGREE SIGN +0xf9 0x00a8 #DIAERESIS +0xfa 0x03c9 #GREEK SMALL LETTER OMEGA +0xfb 0x03cb #GREEK SMALL LETTER UPSILON WITH DIALYTIKA +0xfc 0x03b0 #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +0xfd 0x03ce #GREEK SMALL LETTER OMEGA WITH TONOS +0xfe 0x25a0 #BLACK SQUARE +0xff 0x00a0 #NO-BREAK SPACE + diff --git a/lib/ucmaps/cp874.txt b/lib/ucmaps/cp874.txt new file mode 100644 index 000000000..1eb71dfe1 --- /dev/null +++ b/lib/ucmaps/cp874.txt @@ -0,0 +1,274 @@ +# +# Name: cp874 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 02/28/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp874 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp874 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 0x20AC #EURO SIGN +0x81 #UNDEFINED +0x82 #UNDEFINED +0x83 #UNDEFINED +0x84 #UNDEFINED +0x85 0x2026 #HORIZONTAL ELLIPSIS +0x86 #UNDEFINED +0x87 #UNDEFINED +0x88 #UNDEFINED +0x89 #UNDEFINED +0x8A #UNDEFINED +0x8B #UNDEFINED +0x8C #UNDEFINED +0x8D #UNDEFINED +0x8E #UNDEFINED +0x8F #UNDEFINED +0x90 #UNDEFINED +0x91 0x2018 #LEFT SINGLE QUOTATION MARK +0x92 0x2019 #RIGHT SINGLE QUOTATION MARK +0x93 0x201C #LEFT DOUBLE QUOTATION MARK +0x94 0x201D #RIGHT DOUBLE QUOTATION MARK +0x95 0x2022 #BULLET +0x96 0x2013 #EN DASH +0x97 0x2014 #EM DASH +0x98 #UNDEFINED +0x99 #UNDEFINED +0x9A #UNDEFINED +0x9B #UNDEFINED +0x9C #UNDEFINED +0x9D #UNDEFINED +0x9E #UNDEFINED +0x9F #UNDEFINED +0xA0 0x00A0 #NO-BREAK SPACE +0xA1 0x0E01 #THAI CHARACTER KO KAI +0xA2 0x0E02 #THAI CHARACTER KHO KHAI +0xA3 0x0E03 #THAI CHARACTER KHO KHUAT +0xA4 0x0E04 #THAI CHARACTER KHO KHWAI +0xA5 0x0E05 #THAI CHARACTER KHO KHON +0xA6 0x0E06 #THAI CHARACTER KHO RAKHANG +0xA7 0x0E07 #THAI CHARACTER NGO NGU +0xA8 0x0E08 #THAI CHARACTER CHO CHAN +0xA9 0x0E09 #THAI CHARACTER CHO CHING +0xAA 0x0E0A #THAI CHARACTER CHO CHANG +0xAB 0x0E0B #THAI CHARACTER SO SO +0xAC 0x0E0C #THAI CHARACTER CHO CHOE +0xAD 0x0E0D #THAI CHARACTER YO YING +0xAE 0x0E0E #THAI CHARACTER DO CHADA +0xAF 0x0E0F #THAI CHARACTER TO PATAK +0xB0 0x0E10 #THAI CHARACTER THO THAN +0xB1 0x0E11 #THAI CHARACTER THO NANGMONTHO +0xB2 0x0E12 #THAI CHARACTER THO PHUTHAO +0xB3 0x0E13 #THAI CHARACTER NO NEN +0xB4 0x0E14 #THAI CHARACTER DO DEK +0xB5 0x0E15 #THAI CHARACTER TO TAO +0xB6 0x0E16 #THAI CHARACTER THO THUNG +0xB7 0x0E17 #THAI CHARACTER THO THAHAN +0xB8 0x0E18 #THAI CHARACTER THO THONG +0xB9 0x0E19 #THAI CHARACTER NO NU +0xBA 0x0E1A #THAI CHARACTER BO BAIMAI +0xBB 0x0E1B #THAI CHARACTER PO PLA +0xBC 0x0E1C #THAI CHARACTER PHO PHUNG +0xBD 0x0E1D #THAI CHARACTER FO FA +0xBE 0x0E1E #THAI CHARACTER PHO PHAN +0xBF 0x0E1F #THAI CHARACTER FO FAN +0xC0 0x0E20 #THAI CHARACTER PHO SAMPHAO +0xC1 0x0E21 #THAI CHARACTER MO MA +0xC2 0x0E22 #THAI CHARACTER YO YAK +0xC3 0x0E23 #THAI CHARACTER RO RUA +0xC4 0x0E24 #THAI CHARACTER RU +0xC5 0x0E25 #THAI CHARACTER LO LING +0xC6 0x0E26 #THAI CHARACTER LU +0xC7 0x0E27 #THAI CHARACTER WO WAEN +0xC8 0x0E28 #THAI CHARACTER SO SALA +0xC9 0x0E29 #THAI CHARACTER SO RUSI +0xCA 0x0E2A #THAI CHARACTER SO SUA +0xCB 0x0E2B #THAI CHARACTER HO HIP +0xCC 0x0E2C #THAI CHARACTER LO CHULA +0xCD 0x0E2D #THAI CHARACTER O ANG +0xCE 0x0E2E #THAI CHARACTER HO NOKHUK +0xCF 0x0E2F #THAI CHARACTER PAIYANNOI +0xD0 0x0E30 #THAI CHARACTER SARA A +0xD1 0x0E31 #THAI CHARACTER MAI HAN-AKAT +0xD2 0x0E32 #THAI CHARACTER SARA AA +0xD3 0x0E33 #THAI CHARACTER SARA AM +0xD4 0x0E34 #THAI CHARACTER SARA I +0xD5 0x0E35 #THAI CHARACTER SARA II +0xD6 0x0E36 #THAI CHARACTER SARA UE +0xD7 0x0E37 #THAI CHARACTER SARA UEE +0xD8 0x0E38 #THAI CHARACTER SARA U +0xD9 0x0E39 #THAI CHARACTER SARA UU +0xDA 0x0E3A #THAI CHARACTER PHINTHU +0xDB #UNDEFINED +0xDC #UNDEFINED +0xDD #UNDEFINED +0xDE #UNDEFINED +0xDF 0x0E3F #THAI CURRENCY SYMBOL BAHT +0xE0 0x0E40 #THAI CHARACTER SARA E +0xE1 0x0E41 #THAI CHARACTER SARA AE +0xE2 0x0E42 #THAI CHARACTER SARA O +0xE3 0x0E43 #THAI CHARACTER SARA AI MAIMUAN +0xE4 0x0E44 #THAI CHARACTER SARA AI MAIMALAI +0xE5 0x0E45 #THAI CHARACTER LAKKHANGYAO +0xE6 0x0E46 #THAI CHARACTER MAIYAMOK +0xE7 0x0E47 #THAI CHARACTER MAITAIKHU +0xE8 0x0E48 #THAI CHARACTER MAI EK +0xE9 0x0E49 #THAI CHARACTER MAI THO +0xEA 0x0E4A #THAI CHARACTER MAI TRI +0xEB 0x0E4B #THAI CHARACTER MAI CHATTAWA +0xEC 0x0E4C #THAI CHARACTER THANTHAKHAT +0xED 0x0E4D #THAI CHARACTER NIKHAHIT +0xEE 0x0E4E #THAI CHARACTER YAMAKKAN +0xEF 0x0E4F #THAI CHARACTER FONGMAN +0xF0 0x0E50 #THAI DIGIT ZERO +0xF1 0x0E51 #THAI DIGIT ONE +0xF2 0x0E52 #THAI DIGIT TWO +0xF3 0x0E53 #THAI DIGIT THREE +0xF4 0x0E54 #THAI DIGIT FOUR +0xF5 0x0E55 #THAI DIGIT FIVE +0xF6 0x0E56 #THAI DIGIT SIX +0xF7 0x0E57 #THAI DIGIT SEVEN +0xF8 0x0E58 #THAI DIGIT EIGHT +0xF9 0x0E59 #THAI DIGIT NINE +0xFA 0x0E5A #THAI CHARACTER ANGKHANKHU +0xFB 0x0E5B #THAI CHARACTER KHOMUT +0xFC #UNDEFINED +0xFD #UNDEFINED +0xFE #UNDEFINED +0xFF #UNDEFINED diff --git a/lib/ucmaps/cp932.txt b/lib/ucmaps/cp932.txt new file mode 100644 index 000000000..36bfdbfab --- /dev/null +++ b/lib/ucmaps/cp932.txt @@ -0,0 +1,7998 @@ +# +# Name: cp932 to Unicode table +# Unicode version: 2.0 +# Table version: 2.01 +# Table format: Format A +# Date: 04/15/98 +# +# Contact: cpxlate@microsoft.com +# +# General notes: none +# +# Format: Three tab-separated columns +# Column #1 is the cp932 code (in hex) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 is the Unicode name (follows a comment sign, '#') +# +# The entries are in cp932 order +# +0x00 0x0000 #NULL +0x01 0x0001 #START OF HEADING +0x02 0x0002 #START OF TEXT +0x03 0x0003 #END OF TEXT +0x04 0x0004 #END OF TRANSMISSION +0x05 0x0005 #ENQUIRY +0x06 0x0006 #ACKNOWLEDGE +0x07 0x0007 #BELL +0x08 0x0008 #BACKSPACE +0x09 0x0009 #HORIZONTAL TABULATION +0x0A 0x000A #LINE FEED +0x0B 0x000B #VERTICAL TABULATION +0x0C 0x000C #FORM FEED +0x0D 0x000D #CARRIAGE RETURN +0x0E 0x000E #SHIFT OUT +0x0F 0x000F #SHIFT IN +0x10 0x0010 #DATA LINK ESCAPE +0x11 0x0011 #DEVICE CONTROL ONE +0x12 0x0012 #DEVICE CONTROL TWO +0x13 0x0013 #DEVICE CONTROL THREE +0x14 0x0014 #DEVICE CONTROL FOUR +0x15 0x0015 #NEGATIVE ACKNOWLEDGE +0x16 0x0016 #SYNCHRONOUS IDLE +0x17 0x0017 #END OF TRANSMISSION BLOCK +0x18 0x0018 #CANCEL +0x19 0x0019 #END OF MEDIUM +0x1A 0x001A #SUBSTITUTE +0x1B 0x001B #ESCAPE +0x1C 0x001C #FILE SEPARATOR +0x1D 0x001D #GROUP SEPARATOR +0x1E 0x001E #RECORD SEPARATOR +0x1F 0x001F #UNIT SEPARATOR +0x20 0x0020 #SPACE +0x21 0x0021 #EXCLAMATION MARK +0x22 0x0022 #QUOTATION MARK +0x23 0x0023 #NUMBER SIGN +0x24 0x0024 #DOLLAR SIGN +0x25 0x0025 #PERCENT SIGN +0x26 0x0026 #AMPERSAND +0x27 0x0027 #APOSTROPHE +0x28 0x0028 #LEFT PARENTHESIS +0x29 0x0029 #RIGHT PARENTHESIS +0x2A 0x002A #ASTERISK +0x2B 0x002B #PLUS SIGN +0x2C 0x002C #COMMA +0x2D 0x002D #HYPHEN-MINUS +0x2E 0x002E #FULL STOP +0x2F 0x002F #SOLIDUS +0x30 0x0030 #DIGIT ZERO +0x31 0x0031 #DIGIT ONE +0x32 0x0032 #DIGIT TWO +0x33 0x0033 #DIGIT THREE +0x34 0x0034 #DIGIT FOUR +0x35 0x0035 #DIGIT FIVE +0x36 0x0036 #DIGIT SIX +0x37 0x0037 #DIGIT SEVEN +0x38 0x0038 #DIGIT EIGHT +0x39 0x0039 #DIGIT NINE +0x3A 0x003A #COLON +0x3B 0x003B #SEMICOLON +0x3C 0x003C #LESS-THAN SIGN +0x3D 0x003D #EQUALS SIGN +0x3E 0x003E #GREATER-THAN SIGN +0x3F 0x003F #QUESTION MARK +0x40 0x0040 #COMMERCIAL AT +0x41 0x0041 #LATIN CAPITAL LETTER A +0x42 0x0042 #LATIN CAPITAL LETTER B +0x43 0x0043 #LATIN CAPITAL LETTER C +0x44 0x0044 #LATIN CAPITAL LETTER D +0x45 0x0045 #LATIN CAPITAL LETTER E +0x46 0x0046 #LATIN CAPITAL LETTER F +0x47 0x0047 #LATIN CAPITAL LETTER G +0x48 0x0048 #LATIN CAPITAL LETTER H +0x49 0x0049 #LATIN CAPITAL LETTER I +0x4A 0x004A #LATIN CAPITAL LETTER J +0x4B 0x004B #LATIN CAPITAL LETTER K +0x4C 0x004C #LATIN CAPITAL LETTER L +0x4D 0x004D #LATIN CAPITAL LETTER M +0x4E 0x004E #LATIN CAPITAL LETTER N +0x4F 0x004F #LATIN CAPITAL LETTER O +0x50 0x0050 #LATIN CAPITAL LETTER P +0x51 0x0051 #LATIN CAPITAL LETTER Q +0x52 0x0052 #LATIN CAPITAL LETTER R +0x53 0x0053 #LATIN CAPITAL LETTER S +0x54 0x0054 #LATIN CAPITAL LETTER T +0x55 0x0055 #LATIN CAPITAL LETTER U +0x56 0x0056 #LATIN CAPITAL LETTER V +0x57 0x0057 #LATIN CAPITAL LETTER W +0x58 0x0058 #LATIN CAPITAL LETTER X +0x59 0x0059 #LATIN CAPITAL LETTER Y +0x5A 0x005A #LATIN CAPITAL LETTER Z +0x5B 0x005B #LEFT SQUARE BRACKET +0x5C 0x005C #REVERSE SOLIDUS +0x5D 0x005D #RIGHT SQUARE BRACKET +0x5E 0x005E #CIRCUMFLEX ACCENT +0x5F 0x005F #LOW LINE +0x60 0x0060 #GRAVE ACCENT +0x61 0x0061 #LATIN SMALL LETTER A +0x62 0x0062 #LATIN SMALL LETTER B +0x63 0x0063 #LATIN SMALL LETTER C +0x64 0x0064 #LATIN SMALL LETTER D +0x65 0x0065 #LATIN SMALL LETTER E +0x66 0x0066 #LATIN SMALL LETTER F +0x67 0x0067 #LATIN SMALL LETTER G +0x68 0x0068 #LATIN SMALL LETTER H +0x69 0x0069 #LATIN SMALL LETTER I +0x6A 0x006A #LATIN SMALL LETTER J +0x6B 0x006B #LATIN SMALL LETTER K +0x6C 0x006C #LATIN SMALL LETTER L +0x6D 0x006D #LATIN SMALL LETTER M +0x6E 0x006E #LATIN SMALL LETTER N +0x6F 0x006F #LATIN SMALL LETTER O +0x70 0x0070 #LATIN SMALL LETTER P +0x71 0x0071 #LATIN SMALL LETTER Q +0x72 0x0072 #LATIN SMALL LETTER R +0x73 0x0073 #LATIN SMALL LETTER S +0x74 0x0074 #LATIN SMALL LETTER T +0x75 0x0075 #LATIN SMALL LETTER U +0x76 0x0076 #LATIN SMALL LETTER V +0x77 0x0077 #LATIN SMALL LETTER W +0x78 0x0078 #LATIN SMALL LETTER X +0x79 0x0079 #LATIN SMALL LETTER Y +0x7A 0x007A #LATIN SMALL LETTER Z +0x7B 0x007B #LEFT CURLY BRACKET +0x7C 0x007C #VERTICAL LINE +0x7D 0x007D #RIGHT CURLY BRACKET +0x7E 0x007E #TILDE +0x7F 0x007F #DELETE +0x80 #UNDEFINED +0x81 #DBCS LEAD BYTE +0x82 #DBCS LEAD BYTE +0x83 #DBCS LEAD BYTE +0x84 #DBCS LEAD BYTE +0x85 #DBCS LEAD BYTE +0x86 #DBCS LEAD BYTE +0x87 #DBCS LEAD BYTE +0x88 #DBCS LEAD BYTE +0x89 #DBCS LEAD BYTE +0x8A #DBCS LEAD BYTE +0x8B #DBCS LEAD BYTE +0x8C #DBCS LEAD BYTE +0x8D #DBCS LEAD BYTE +0x8E #DBCS LEAD BYTE +0x8F #DBCS LEAD BYTE +0x90 #DBCS LEAD BYTE +0x91 #DBCS LEAD BYTE +0x92 #DBCS LEAD BYTE +0x93 #DBCS LEAD BYTE +0x94 #DBCS LEAD BYTE +0x95 #DBCS LEAD BYTE +0x96 #DBCS LEAD BYTE +0x97 #DBCS LEAD BYTE +0x98 #DBCS LEAD BYTE +0x99 #DBCS LEAD BYTE +0x9A #DBCS LEAD BYTE +0x9B #DBCS LEAD BYTE +0x9C #DBCS LEAD BYTE +0x9D #DBCS LEAD BYTE +0x9E #DBCS LEAD BYTE +0x9F #DBCS LEAD BYTE +0xA0 #UNDEFINED +0xA1 0xFF61 #HALFWIDTH IDEOGRAPHIC FULL STOP +0xA2 0xFF62 #HALFWIDTH LEFT CORNER BRACKET +0xA3 0xFF63 #HALFWIDTH RIGHT CORNER BRACKET +0xA4 0xFF64 #HALFWIDTH IDEOGRAPHIC COMMA +0xA5 0xFF65 #HALFWIDTH KATAKANA MIDDLE DOT +0xA6 0xFF66 #HALFWIDTH KATAKANA LETTER WO +0xA7 0xFF67 #HALFWIDTH KATAKANA LETTER SMALL A +0xA8 0xFF68 #HALFWIDTH KATAKANA LETTER SMALL I +0xA9 0xFF69 #HALFWIDTH KATAKANA LETTER SMALL U +0xAA 0xFF6A #HALFWIDTH KATAKANA LETTER SMALL E +0xAB 0xFF6B #HALFWIDTH KATAKANA LETTER SMALL O +0xAC 0xFF6C #HALFWIDTH KATAKANA LETTER SMALL YA +0xAD 0xFF6D #HALFWIDTH KATAKANA LETTER SMALL YU +0xAE 0xFF6E #HALFWIDTH KATAKANA LETTER SMALL YO +0xAF 0xFF6F #HALFWIDTH KATAKANA LETTER SMALL TU +0xB0 0xFF70 #HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +0xB1 0xFF71 #HALFWIDTH KATAKANA LETTER A +0xB2 0xFF72 #HALFWIDTH KATAKANA LETTER I +0xB3 0xFF73 #HALFWIDTH KATAKANA LETTER U +0xB4 0xFF74 #HALFWIDTH KATAKANA LETTER E +0xB5 0xFF75 #HALFWIDTH KATAKANA LETTER O +0xB6 0xFF76 #HALFWIDTH KATAKANA LETTER KA +0xB7 0xFF77 #HALFWIDTH KATAKANA LETTER KI +0xB8 0xFF78 #HALFWIDTH KATAKANA LETTER KU +0xB9 0xFF79 #HALFWIDTH KATAKANA LETTER KE +0xBA 0xFF7A #HALFWIDTH KATAKANA LETTER KO +0xBB 0xFF7B #HALFWIDTH KATAKANA LETTER SA +0xBC 0xFF7C #HALFWIDTH KATAKANA LETTER SI +0xBD 0xFF7D #HALFWIDTH KATAKANA LETTER SU +0xBE 0xFF7E #HALFWIDTH KATAKANA LETTER SE +0xBF 0xFF7F #HALFWIDTH KATAKANA LETTER SO +0xC0 0xFF80 #HALFWIDTH KATAKANA LETTER TA +0xC1 0xFF81 #HALFWIDTH KATAKANA LETTER TI +0xC2 0xFF82 #HALFWIDTH KATAKANA LETTER TU +0xC3 0xFF83 #HALFWIDTH KATAKANA LETTER TE +0xC4 0xFF84 #HALFWIDTH KATAKANA LETTER TO +0xC5 0xFF85 #HALFWIDTH KATAKANA LETTER NA +0xC6 0xFF86 #HALFWIDTH KATAKANA LETTER NI +0xC7 0xFF87 #HALFWIDTH KATAKANA LETTER NU +0xC8 0xFF88 #HALFWIDTH KATAKANA LETTER NE +0xC9 0xFF89 #HALFWIDTH KATAKANA LETTER NO +0xCA 0xFF8A #HALFWIDTH KATAKANA LETTER HA +0xCB 0xFF8B #HALFWIDTH KATAKANA LETTER HI +0xCC 0xFF8C #HALFWIDTH KATAKANA LETTER HU +0xCD 0xFF8D #HALFWIDTH KATAKANA LETTER HE +0xCE 0xFF8E #HALFWIDTH KATAKANA LETTER HO +0xCF 0xFF8F #HALFWIDTH KATAKANA LETTER MA +0xD0 0xFF90 #HALFWIDTH KATAKANA LETTER MI +0xD1 0xFF91 #HALFWIDTH KATAKANA LETTER MU +0xD2 0xFF92 #HALFWIDTH KATAKANA LETTER ME +0xD3 0xFF93 #HALFWIDTH KATAKANA LETTER MO +0xD4 0xFF94 #HALFWIDTH KATAKANA LETTER YA +0xD5 0xFF95 #HALFWIDTH KATAKANA LETTER YU +0xD6 0xFF96 #HALFWIDTH KATAKANA LETTER YO +0xD7 0xFF97 #HALFWIDTH KATAKANA LETTER RA +0xD8 0xFF98 #HALFWIDTH KATAKANA LETTER RI +0xD9 0xFF99 #HALFWIDTH KATAKANA LETTER RU +0xDA 0xFF9A #HALFWIDTH KATAKANA LETTER RE +0xDB 0xFF9B #HALFWIDTH KATAKANA LETTER RO +0xDC 0xFF9C #HALFWIDTH KATAKANA LETTER WA +0xDD 0xFF9D #HALFWIDTH KATAKANA LETTER N +0xDE 0xFF9E #HALFWIDTH KATAKANA VOICED SOUND MARK +0xDF 0xFF9F #HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +0xE0 #DBCS LEAD BYTE +0xE1 #DBCS LEAD BYTE +0xE2 #DBCS LEAD BYTE +0xE3 #DBCS LEAD BYTE +0xE4 #DBCS LEAD BYTE +0xE5 #DBCS LEAD BYTE +0xE6 #DBCS LEAD BYTE +0xE7 #DBCS LEAD BYTE +0xE8 #DBCS LEAD BYTE +0xE9 #DBCS LEAD BYTE +0xEA #DBCS LEAD BYTE +0xEB #DBCS LEAD BYTE +0xEC #DBCS LEAD BYTE +0xED #DBCS LEAD BYTE +0xEE #DBCS LEAD BYTE +0xEF #DBCS LEAD BYTE +0xF0 #DBCS LEAD BYTE +0xF1 #DBCS LEAD BYTE +0xF2 #DBCS LEAD BYTE +0xF3 #DBCS LEAD BYTE +0xF4 #DBCS LEAD BYTE +0xF5 #DBCS LEAD BYTE +0xF6 #DBCS LEAD BYTE +0xF7 #DBCS LEAD BYTE +0xF8 #DBCS LEAD BYTE +0xF9 #DBCS LEAD BYTE +0xFA #DBCS LEAD BYTE +0xFB #DBCS LEAD BYTE +0xFC #DBCS LEAD BYTE +0xFD #UNDEFINED +0xFE #UNDEFINED +0xFF #UNDEFINED +0x8140 0x3000 #IDEOGRAPHIC SPACE +0x8141 0x3001 #IDEOGRAPHIC COMMA +0x8142 0x3002 #IDEOGRAPHIC FULL STOP +0x8143 0xFF0C #FULLWIDTH COMMA +0x8144 0xFF0E #FULLWIDTH FULL STOP +0x8145 0x30FB #KATAKANA MIDDLE DOT +0x8146 0xFF1A #FULLWIDTH COLON +0x8147 0xFF1B #FULLWIDTH SEMICOLON +0x8148 0xFF1F #FULLWIDTH QUESTION MARK +0x8149 0xFF01 #FULLWIDTH EXCLAMATION MARK +0x814A 0x309B #KATAKANA-HIRAGANA VOICED SOUND MARK +0x814B 0x309C #KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +0x814C 0x00B4 #ACUTE ACCENT +0x814D 0xFF40 #FULLWIDTH GRAVE ACCENT +0x814E 0x00A8 #DIAERESIS +0x814F 0xFF3E #FULLWIDTH CIRCUMFLEX ACCENT +0x8150 0xFFE3 #FULLWIDTH MACRON +0x8151 0xFF3F #FULLWIDTH LOW LINE +0x8152 0x30FD #KATAKANA ITERATION MARK +0x8153 0x30FE #KATAKANA VOICED ITERATION MARK +0x8154 0x309D #HIRAGANA ITERATION MARK +0x8155 0x309E #HIRAGANA VOICED ITERATION MARK +0x8156 0x3003 #DITTO MARK +0x8157 0x4EDD #CJK UNIFIED IDEOGRAPH +0x8158 0x3005 #IDEOGRAPHIC ITERATION MARK +0x8159 0x3006 #IDEOGRAPHIC CLOSING MARK +0x815A 0x3007 #IDEOGRAPHIC NUMBER ZERO +0x815B 0x30FC #KATAKANA-HIRAGANA PROLONGED SOUND MARK +0x815C 0x2015 #HORIZONTAL BAR +0x815D 0x2010 #HYPHEN +0x815E 0xFF0F #FULLWIDTH SOLIDUS +0x815F 0xFF3C #FULLWIDTH REVERSE SOLIDUS +0x8160 0xFF5E #FULLWIDTH TILDE +0x8161 0x2225 #PARALLEL TO +0x8162 0xFF5C #FULLWIDTH VERTICAL LINE +0x8163 0x2026 #HORIZONTAL ELLIPSIS +0x8164 0x2025 #TWO DOT LEADER +0x8165 0x2018 #LEFT SINGLE QUOTATION MARK +0x8166 0x2019 #RIGHT SINGLE QUOTATION MARK +0x8167 0x201C #LEFT DOUBLE QUOTATION MARK +0x8168 0x201D #RIGHT DOUBLE QUOTATION MARK +0x8169 0xFF08 #FULLWIDTH LEFT PARENTHESIS +0x816A 0xFF09 #FULLWIDTH RIGHT PARENTHESIS +0x816B 0x3014 #LEFT TORTOISE SHELL BRACKET +0x816C 0x3015 #RIGHT TORTOISE SHELL BRACKET +0x816D 0xFF3B #FULLWIDTH LEFT SQUARE BRACKET +0x816E 0xFF3D #FULLWIDTH RIGHT SQUARE BRACKET +0x816F 0xFF5B #FULLWIDTH LEFT CURLY BRACKET +0x8170 0xFF5D #FULLWIDTH RIGHT CURLY BRACKET +0x8171 0x3008 #LEFT ANGLE BRACKET +0x8172 0x3009 #RIGHT ANGLE BRACKET +0x8173 0x300A #LEFT DOUBLE ANGLE BRACKET +0x8174 0x300B #RIGHT DOUBLE ANGLE BRACKET +0x8175 0x300C #LEFT CORNER BRACKET +0x8176 0x300D #RIGHT CORNER BRACKET +0x8177 0x300E #LEFT WHITE CORNER BRACKET +0x8178 0x300F #RIGHT WHITE CORNER BRACKET +0x8179 0x3010 #LEFT BLACK LENTICULAR BRACKET +0x817A 0x3011 #RIGHT BLACK LENTICULAR BRACKET +0x817B 0xFF0B #FULLWIDTH PLUS SIGN +0x817C 0xFF0D #FULLWIDTH HYPHEN-MINUS +0x817D 0x00B1 #PLUS-MINUS SIGN +0x817E 0x00D7 #MULTIPLICATION SIGN +0x8180 0x00F7 #DIVISION SIGN +0x8181 0xFF1D #FULLWIDTH EQUALS SIGN +0x8182 0x2260 #NOT EQUAL TO +0x8183 0xFF1C #FULLWIDTH LESS-THAN SIGN +0x8184 0xFF1E #FULLWIDTH GREATER-THAN SIGN +0x8185 0x2266 #LESS-THAN OVER EQUAL TO +0x8186 0x2267 #GREATER-THAN OVER EQUAL TO +0x8187 0x221E #INFINITY +0x8188 0x2234 #THEREFORE +0x8189 0x2642 #MALE SIGN +0x818A 0x2640 #FEMALE SIGN +0x818B 0x00B0 #DEGREE SIGN +0x818C 0x2032 #PRIME +0x818D 0x2033 #DOUBLE PRIME +0x818E 0x2103 #DEGREE CELSIUS +0x818F 0xFFE5 #FULLWIDTH YEN SIGN +0x8190 0xFF04 #FULLWIDTH DOLLAR SIGN +0x8191 0xFFE0 #FULLWIDTH CENT SIGN +0x8192 0xFFE1 #FULLWIDTH POUND SIGN +0x8193 0xFF05 #FULLWIDTH PERCENT SIGN +0x8194 0xFF03 #FULLWIDTH NUMBER SIGN +0x8195 0xFF06 #FULLWIDTH AMPERSAND +0x8196 0xFF0A #FULLWIDTH ASTERISK +0x8197 0xFF20 #FULLWIDTH COMMERCIAL AT +0x8198 0x00A7 #SECTION SIGN +0x8199 0x2606 #WHITE STAR +0x819A 0x2605 #BLACK STAR +0x819B 0x25CB #WHITE CIRCLE +0x819C 0x25CF #BLACK CIRCLE +0x819D 0x25CE #BULLSEYE +0x819E 0x25C7 #WHITE DIAMOND +0x819F 0x25C6 #BLACK DIAMOND +0x81A0 0x25A1 #WHITE SQUARE +0x81A1 0x25A0 #BLACK SQUARE +0x81A2 0x25B3 #WHITE UP-POINTING TRIANGLE +0x81A3 0x25B2 #BLACK UP-POINTING TRIANGLE +0x81A4 0x25BD #WHITE DOWN-POINTING TRIANGLE +0x81A5 0x25BC #BLACK DOWN-POINTING TRIANGLE +0x81A6 0x203B #REFERENCE MARK +0x81A7 0x3012 #POSTAL MARK +0x81A8 0x2192 #RIGHTWARDS ARROW +0x81A9 0x2190 #LEFTWARDS ARROW +0x81AA 0x2191 #UPWARDS ARROW +0x81AB 0x2193 #DOWNWARDS ARROW +0x81AC 0x3013 #GETA MARK +0x81B8 0x2208 #ELEMENT OF +0x81B9 0x220B #CONTAINS AS MEMBER +0x81BA 0x2286 #SUBSET OF OR EQUAL TO +0x81BB 0x2287 #SUPERSET OF OR EQUAL TO +0x81BC 0x2282 #SUBSET OF +0x81BD 0x2283 #SUPERSET OF +0x81BE 0x222A #UNION +0x81BF 0x2229 #INTERSECTION +0x81C8 0x2227 #LOGICAL AND +0x81C9 0x2228 #LOGICAL OR +0x81CA 0xFFE2 #FULLWIDTH NOT SIGN +0x81CB 0x21D2 #RIGHTWARDS DOUBLE ARROW +0x81CC 0x21D4 #LEFT RIGHT DOUBLE ARROW +0x81CD 0x2200 #FOR ALL +0x81CE 0x2203 #THERE EXISTS +0x81DA 0x2220 #ANGLE +0x81DB 0x22A5 #UP TACK +0x81DC 0x2312 #ARC +0x81DD 0x2202 #PARTIAL DIFFERENTIAL +0x81DE 0x2207 #NABLA +0x81DF 0x2261 #IDENTICAL TO +0x81E0 0x2252 #APPROXIMATELY EQUAL TO OR THE IMAGE OF +0x81E1 0x226A #MUCH LESS-THAN +0x81E2 0x226B #MUCH GREATER-THAN +0x81E3 0x221A #SQUARE ROOT +0x81E4 0x223D #REVERSED TILDE +0x81E5 0x221D #PROPORTIONAL TO +0x81E6 0x2235 #BECAUSE +0x81E7 0x222B #INTEGRAL +0x81E8 0x222C #DOUBLE INTEGRAL +0x81F0 0x212B #ANGSTROM SIGN +0x81F1 0x2030 #PER MILLE SIGN +0x81F2 0x266F #MUSIC SHARP SIGN +0x81F3 0x266D #MUSIC FLAT SIGN +0x81F4 0x266A #EIGHTH NOTE +0x81F5 0x2020 #DAGGER +0x81F6 0x2021 #DOUBLE DAGGER +0x81F7 0x00B6 #PILCROW SIGN +0x81FC 0x25EF #LARGE CIRCLE +0x824F 0xFF10 #FULLWIDTH DIGIT ZERO +0x8250 0xFF11 #FULLWIDTH DIGIT ONE +0x8251 0xFF12 #FULLWIDTH DIGIT TWO +0x8252 0xFF13 #FULLWIDTH DIGIT THREE +0x8253 0xFF14 #FULLWIDTH DIGIT FOUR +0x8254 0xFF15 #FULLWIDTH DIGIT FIVE +0x8255 0xFF16 #FULLWIDTH DIGIT SIX +0x8256 0xFF17 #FULLWIDTH DIGIT SEVEN +0x8257 0xFF18 #FULLWIDTH DIGIT EIGHT +0x8258 0xFF19 #FULLWIDTH DIGIT NINE +0x8260 0xFF21 #FULLWIDTH LATIN CAPITAL LETTER A +0x8261 0xFF22 #FULLWIDTH LATIN CAPITAL LETTER B +0x8262 0xFF23 #FULLWIDTH LATIN CAPITAL LETTER C +0x8263 0xFF24 #FULLWIDTH LATIN CAPITAL LETTER D +0x8264 0xFF25 #FULLWIDTH LATIN CAPITAL LETTER E +0x8265 0xFF26 #FULLWIDTH LATIN CAPITAL LETTER F +0x8266 0xFF27 #FULLWIDTH LATIN CAPITAL LETTER G +0x8267 0xFF28 #FULLWIDTH LATIN CAPITAL LETTER H +0x8268 0xFF29 #FULLWIDTH LATIN CAPITAL LETTER I +0x8269 0xFF2A #FULLWIDTH LATIN CAPITAL LETTER J +0x826A 0xFF2B #FULLWIDTH LATIN CAPITAL LETTER K +0x826B 0xFF2C #FULLWIDTH LATIN CAPITAL LETTER L +0x826C 0xFF2D #FULLWIDTH LATIN CAPITAL LETTER M +0x826D 0xFF2E #FULLWIDTH LATIN CAPITAL LETTER N +0x826E 0xFF2F #FULLWIDTH LATIN CAPITAL LETTER O +0x826F 0xFF30 #FULLWIDTH LATIN CAPITAL LETTER P +0x8270 0xFF31 #FULLWIDTH LATIN CAPITAL LETTER Q +0x8271 0xFF32 #FULLWIDTH LATIN CAPITAL LETTER R +0x8272 0xFF33 #FULLWIDTH LATIN CAPITAL LETTER S +0x8273 0xFF34 #FULLWIDTH LATIN CAPITAL LETTER T +0x8274 0xFF35 #FULLWIDTH LATIN CAPITAL LETTER U +0x8275 0xFF36 #FULLWIDTH LATIN CAPITAL LETTER V +0x8276 0xFF37 #FULLWIDTH LATIN CAPITAL LETTER W +0x8277 0xFF38 #FULLWIDTH LATIN CAPITAL LETTER X +0x8278 0xFF39 #FULLWIDTH LATIN CAPITAL LETTER Y +0x8279 0xFF3A #FULLWIDTH LATIN CAPITAL LETTER Z +0x8281 0xFF41 #FULLWIDTH LATIN SMALL LETTER A +0x8282 0xFF42 #FULLWIDTH LATIN SMALL LETTER B +0x8283 0xFF43 #FULLWIDTH LATIN SMALL LETTER C +0x8284 0xFF44 #FULLWIDTH LATIN SMALL LETTER D +0x8285 0xFF45 #FULLWIDTH LATIN SMALL LETTER E +0x8286 0xFF46 #FULLWIDTH LATIN SMALL LETTER F +0x8287 0xFF47 #FULLWIDTH LATIN SMALL LETTER G +0x8288 0xFF48 #FULLWIDTH LATIN SMALL LETTER H +0x8289 0xFF49 #FULLWIDTH LATIN SMALL LETTER I +0x828A 0xFF4A #FULLWIDTH LATIN SMALL LETTER J +0x828B 0xFF4B #FULLWIDTH LATIN SMALL LETTER K +0x828C 0xFF4C #FULLWIDTH LATIN SMALL LETTER L +0x828D 0xFF4D #FULLWIDTH LATIN SMALL LETTER M +0x828E 0xFF4E #FULLWIDTH LATIN SMALL LETTER N +0x828F 0xFF4F #FULLWIDTH LATIN SMALL LETTER O +0x8290 0xFF50 #FULLWIDTH LATIN SMALL LETTER P +0x8291 0xFF51 #FULLWIDTH LATIN SMALL LETTER Q +0x8292 0xFF52 #FULLWIDTH LATIN SMALL LETTER R +0x8293 0xFF53 #FULLWIDTH LATIN SMALL LETTER S +0x8294 0xFF54 #FULLWIDTH LATIN SMALL LETTER T +0x8295 0xFF55 #FULLWIDTH LATIN SMALL LETTER U +0x8296 0xFF56 #FULLWIDTH LATIN SMALL LETTER V +0x8297 0xFF57 #FULLWIDTH LATIN SMALL LETTER W +0x8298 0xFF58 #FULLWIDTH LATIN SMALL LETTER X +0x8299 0xFF59 #FULLWIDTH LATIN SMALL LETTER Y +0x829A 0xFF5A #FULLWIDTH LATIN SMALL LETTER Z +0x829F 0x3041 #HIRAGANA LETTER SMALL A +0x82A0 0x3042 #HIRAGANA LETTER A +0x82A1 0x3043 #HIRAGANA LETTER SMALL I +0x82A2 0x3044 #HIRAGANA LETTER I +0x82A3 0x3045 #HIRAGANA LETTER SMALL U +0x82A4 0x3046 #HIRAGANA LETTER U +0x82A5 0x3047 #HIRAGANA LETTER SMALL E +0x82A6 0x3048 #HIRAGANA LETTER E +0x82A7 0x3049 #HIRAGANA LETTER SMALL O +0x82A8 0x304A #HIRAGANA LETTER O +0x82A9 0x304B #HIRAGANA LETTER KA +0x82AA 0x304C #HIRAGANA LETTER GA +0x82AB 0x304D #HIRAGANA LETTER KI +0x82AC 0x304E #HIRAGANA LETTER GI +0x82AD 0x304F #HIRAGANA LETTER KU +0x82AE 0x3050 #HIRAGANA LETTER GU +0x82AF 0x3051 #HIRAGANA LETTER KE +0x82B0 0x3052 #HIRAGANA LETTER GE +0x82B1 0x3053 #HIRAGANA LETTER KO +0x82B2 0x3054 #HIRAGANA LETTER GO +0x82B3 0x3055 #HIRAGANA LETTER SA +0x82B4 0x3056 #HIRAGANA LETTER ZA +0x82B5 0x3057 #HIRAGANA LETTER SI +0x82B6 0x3058 #HIRAGANA LETTER ZI +0x82B7 0x3059 #HIRAGANA LETTER SU +0x82B8 0x305A #HIRAGANA LETTER ZU +0x82B9 0x305B #HIRAGANA LETTER SE +0x82BA 0x305C #HIRAGANA LETTER ZE +0x82BB 0x305D #HIRAGANA LETTER SO +0x82BC 0x305E #HIRAGANA LETTER ZO +0x82BD 0x305F #HIRAGANA LETTER TA +0x82BE 0x3060 #HIRAGANA LETTER DA +0x82BF 0x3061 #HIRAGANA LETTER TI +0x82C0 0x3062 #HIRAGANA LETTER DI +0x82C1 0x3063 #HIRAGANA LETTER SMALL TU +0x82C2 0x3064 #HIRAGANA LETTER TU +0x82C3 0x3065 #HIRAGANA LETTER DU +0x82C4 0x3066 #HIRAGANA LETTER TE +0x82C5 0x3067 #HIRAGANA LETTER DE +0x82C6 0x3068 #HIRAGANA LETTER TO +0x82C7 0x3069 #HIRAGANA LETTER DO +0x82C8 0x306A #HIRAGANA LETTER NA +0x82C9 0x306B #HIRAGANA LETTER NI +0x82CA 0x306C #HIRAGANA LETTER NU +0x82CB 0x306D #HIRAGANA LETTER NE +0x82CC 0x306E #HIRAGANA LETTER NO +0x82CD 0x306F #HIRAGANA LETTER HA +0x82CE 0x3070 #HIRAGANA LETTER BA +0x82CF 0x3071 #HIRAGANA LETTER PA +0x82D0 0x3072 #HIRAGANA LETTER HI +0x82D1 0x3073 #HIRAGANA LETTER BI +0x82D2 0x3074 #HIRAGANA LETTER PI +0x82D3 0x3075 #HIRAGANA LETTER HU +0x82D4 0x3076 #HIRAGANA LETTER BU +0x82D5 0x3077 #HIRAGANA LETTER PU +0x82D6 0x3078 #HIRAGANA LETTER HE +0x82D7 0x3079 #HIRAGANA LETTER BE +0x82D8 0x307A #HIRAGANA LETTER PE +0x82D9 0x307B #HIRAGANA LETTER HO +0x82DA 0x307C #HIRAGANA LETTER BO +0x82DB 0x307D #HIRAGANA LETTER PO +0x82DC 0x307E #HIRAGANA LETTER MA +0x82DD 0x307F #HIRAGANA LETTER MI +0x82DE 0x3080 #HIRAGANA LETTER MU +0x82DF 0x3081 #HIRAGANA LETTER ME +0x82E0 0x3082 #HIRAGANA LETTER MO +0x82E1 0x3083 #HIRAGANA LETTER SMALL YA +0x82E2 0x3084 #HIRAGANA LETTER YA +0x82E3 0x3085 #HIRAGANA LETTER SMALL YU +0x82E4 0x3086 #HIRAGANA LETTER YU +0x82E5 0x3087 #HIRAGANA LETTER SMALL YO +0x82E6 0x3088 #HIRAGANA LETTER YO +0x82E7 0x3089 #HIRAGANA LETTER RA +0x82E8 0x308A #HIRAGANA LETTER RI +0x82E9 0x308B #HIRAGANA LETTER RU +0x82EA 0x308C #HIRAGANA LETTER RE +0x82EB 0x308D #HIRAGANA LETTER RO +0x82EC 0x308E #HIRAGANA LETTER SMALL WA +0x82ED 0x308F #HIRAGANA LETTER WA +0x82EE 0x3090 #HIRAGANA LETTER WI +0x82EF 0x3091 #HIRAGANA LETTER WE +0x82F0 0x3092 #HIRAGANA LETTER WO +0x82F1 0x3093 #HIRAGANA LETTER N +0x8340 0x30A1 #KATAKANA LETTER SMALL A +0x8341 0x30A2 #KATAKANA LETTER A +0x8342 0x30A3 #KATAKANA LETTER SMALL I +0x8343 0x30A4 #KATAKANA LETTER I +0x8344 0x30A5 #KATAKANA LETTER SMALL U +0x8345 0x30A6 #KATAKANA LETTER U +0x8346 0x30A7 #KATAKANA LETTER SMALL E +0x8347 0x30A8 #KATAKANA LETTER E +0x8348 0x30A9 #KATAKANA LETTER SMALL O +0x8349 0x30AA #KATAKANA LETTER O +0x834A 0x30AB #KATAKANA LETTER KA +0x834B 0x30AC #KATAKANA LETTER GA +0x834C 0x30AD #KATAKANA LETTER KI +0x834D 0x30AE #KATAKANA LETTER GI +0x834E 0x30AF #KATAKANA LETTER KU +0x834F 0x30B0 #KATAKANA LETTER GU +0x8350 0x30B1 #KATAKANA LETTER KE +0x8351 0x30B2 #KATAKANA LETTER GE +0x8352 0x30B3 #KATAKANA LETTER KO +0x8353 0x30B4 #KATAKANA LETTER GO +0x8354 0x30B5 #KATAKANA LETTER SA +0x8355 0x30B6 #KATAKANA LETTER ZA +0x8356 0x30B7 #KATAKANA LETTER SI +0x8357 0x30B8 #KATAKANA LETTER ZI +0x8358 0x30B9 #KATAKANA LETTER SU +0x8359 0x30BA #KATAKANA LETTER ZU +0x835A 0x30BB #KATAKANA LETTER SE +0x835B 0x30BC #KATAKANA LETTER ZE +0x835C 0x30BD #KATAKANA LETTER SO +0x835D 0x30BE #KATAKANA LETTER ZO +0x835E 0x30BF #KATAKANA LETTER TA +0x835F 0x30C0 #KATAKANA LETTER DA +0x8360 0x30C1 #KATAKANA LETTER TI +0x8361 0x30C2 #KATAKANA LETTER DI +0x8362 0x30C3 #KATAKANA LETTER SMALL TU +0x8363 0x30C4 #KATAKANA LETTER TU +0x8364 0x30C5 #KATAKANA LETTER DU +0x8365 0x30C6 #KATAKANA LETTER TE +0x8366 0x30C7 #KATAKANA LETTER DE +0x8367 0x30C8 #KATAKANA LETTER TO +0x8368 0x30C9 #KATAKANA LETTER DO +0x8369 0x30CA #KATAKANA LETTER NA +0x836A 0x30CB #KATAKANA LETTER NI +0x836B 0x30CC #KATAKANA LETTER NU +0x836C 0x30CD #KATAKANA LETTER NE +0x836D 0x30CE #KATAKANA LETTER NO +0x836E 0x30CF #KATAKANA LETTER HA +0x836F 0x30D0 #KATAKANA LETTER BA +0x8370 0x30D1 #KATAKANA LETTER PA +0x8371 0x30D2 #KATAKANA LETTER HI +0x8372 0x30D3 #KATAKANA LETTER BI +0x8373 0x30D4 #KATAKANA LETTER PI +0x8374 0x30D5 #KATAKANA LETTER HU +0x8375 0x30D6 #KATAKANA LETTER BU +0x8376 0x30D7 #KATAKANA LETTER PU +0x8377 0x30D8 #KATAKANA LETTER HE +0x8378 0x30D9 #KATAKANA LETTER BE +0x8379 0x30DA #KATAKANA LETTER PE +0x837A 0x30DB #KATAKANA LETTER HO +0x837B 0x30DC #KATAKANA LETTER BO +0x837C 0x30DD #KATAKANA LETTER PO +0x837D 0x30DE #KATAKANA LETTER MA +0x837E 0x30DF #KATAKANA LETTER MI +0x8380 0x30E0 #KATAKANA LETTER MU +0x8381 0x30E1 #KATAKANA LETTER ME +0x8382 0x30E2 #KATAKANA LETTER MO +0x8383 0x30E3 #KATAKANA LETTER SMALL YA +0x8384 0x30E4 #KATAKANA LETTER YA +0x8385 0x30E5 #KATAKANA LETTER SMALL YU +0x8386 0x30E6 #KATAKANA LETTER YU +0x8387 0x30E7 #KATAKANA LETTER SMALL YO +0x8388 0x30E8 #KATAKANA LETTER YO +0x8389 0x30E9 #KATAKANA LETTER RA +0x838A 0x30EA #KATAKANA LETTER RI +0x838B 0x30EB #KATAKANA LETTER RU +0x838C 0x30EC #KATAKANA LETTER RE +0x838D 0x30ED #KATAKANA LETTER RO +0x838E 0x30EE #KATAKANA LETTER SMALL WA +0x838F 0x30EF #KATAKANA LETTER WA +0x8390 0x30F0 #KATAKANA LETTER WI +0x8391 0x30F1 #KATAKANA LETTER WE +0x8392 0x30F2 #KATAKANA LETTER WO +0x8393 0x30F3 #KATAKANA LETTER N +0x8394 0x30F4 #KATAKANA LETTER VU +0x8395 0x30F5 #KATAKANA LETTER SMALL KA +0x8396 0x30F6 #KATAKANA LETTER SMALL KE +0x839F 0x0391 #GREEK CAPITAL LETTER ALPHA +0x83A0 0x0392 #GREEK CAPITAL LETTER BETA +0x83A1 0x0393 #GREEK CAPITAL LETTER GAMMA +0x83A2 0x0394 #GREEK CAPITAL LETTER DELTA +0x83A3 0x0395 #GREEK CAPITAL LETTER EPSILON +0x83A4 0x0396 #GREEK CAPITAL LETTER ZETA +0x83A5 0x0397 #GREEK CAPITAL LETTER ETA +0x83A6 0x0398 #GREEK CAPITAL LETTER THETA +0x83A7 0x0399 #GREEK CAPITAL LETTER IOTA +0x83A8 0x039A #GREEK CAPITAL LETTER KAPPA +0x83A9 0x039B #GREEK CAPITAL LETTER LAMDA +0x83AA 0x039C #GREEK CAPITAL LETTER MU +0x83AB 0x039D #GREEK CAPITAL LETTER NU +0x83AC 0x039E #GREEK CAPITAL LETTER XI +0x83AD 0x039F #GREEK CAPITAL LETTER OMICRON +0x83AE 0x03A0 #GREEK CAPITAL LETTER PI +0x83AF 0x03A1 #GREEK CAPITAL LETTER RHO +0x83B0 0x03A3 #GREEK CAPITAL LETTER SIGMA +0x83B1 0x03A4 #GREEK CAPITAL LETTER TAU +0x83B2 0x03A5 #GREEK CAPITAL LETTER UPSILON +0x83B3 0x03A6 #GREEK CAPITAL LETTER PHI +0x83B4 0x03A7 #GREEK CAPITAL LETTER CHI +0x83B5 0x03A8 #GREEK CAPITAL LETTER PSI +0x83B6 0x03A9 #GREEK CAPITAL LETTER OMEGA +0x83BF 0x03B1 #GREEK SMALL LETTER ALPHA +0x83C0 0x03B2 #GREEK SMALL LETTER BETA +0x83C1 0x03B3 #GREEK SMALL LETTER GAMMA +0x83C2 0x03B4 #GREEK SMALL LETTER DELTA +0x83C3 0x03B5 #GREEK SMALL LETTER EPSILON +0x83C4 0x03B6 #GREEK SMALL LETTER ZETA +0x83C5 0x03B7 #GREEK SMALL LETTER ETA +0x83C6 0x03B8 #GREEK SMALL LETTER THETA +0x83C7 0x03B9 #GREEK SMALL LETTER IOTA +0x83C8 0x03BA #GREEK SMALL LETTER KAPPA +0x83C9 0x03BB #GREEK SMALL LETTER LAMDA +0x83CA 0x03BC #GREEK SMALL LETTER MU +0x83CB 0x03BD #GREEK SMALL LETTER NU +0x83CC 0x03BE #GREEK SMALL LETTER XI +0x83CD 0x03BF #GREEK SMALL LETTER OMICRON +0x83CE 0x03C0 #GREEK SMALL LETTER PI +0x83CF 0x03C1 #GREEK SMALL LETTER RHO +0x83D0 0x03C3 #GREEK SMALL LETTER SIGMA +0x83D1 0x03C4 #GREEK SMALL LETTER TAU +0x83D2 0x03C5 #GREEK SMALL LETTER UPSILON +0x83D3 0x03C6 #GREEK SMALL LETTER PHI +0x83D4 0x03C7 #GREEK SMALL LETTER CHI +0x83D5 0x03C8 #GREEK SMALL LETTER PSI +0x83D6 0x03C9 #GREEK SMALL LETTER OMEGA +0x8440 0x0410 #CYRILLIC CAPITAL LETTER A +0x8441 0x0411 #CYRILLIC CAPITAL LETTER BE +0x8442 0x0412 #CYRILLIC CAPITAL LETTER VE +0x8443 0x0413 #CYRILLIC CAPITAL LETTER GHE +0x8444 0x0414 #CYRILLIC CAPITAL LETTER DE +0x8445 0x0415 #CYRILLIC CAPITAL LETTER IE +0x8446 0x0401 #CYRILLIC CAPITAL LETTER IO +0x8447 0x0416 #CYRILLIC CAPITAL LETTER ZHE +0x8448 0x0417 #CYRILLIC CAPITAL LETTER ZE +0x8449 0x0418 #CYRILLIC CAPITAL LETTER I +0x844A 0x0419 #CYRILLIC CAPITAL LETTER SHORT I +0x844B 0x041A #CYRILLIC CAPITAL LETTER KA +0x844C 0x041B #CYRILLIC CAPITAL LETTER EL +0x844D 0x041C #CYRILLIC CAPITAL LETTER EM +0x844E 0x041D #CYRILLIC CAPITAL LETTER EN +0x844F 0x041E #CYRILLIC CAPITAL LETTER O +0x8450 0x041F #CYRILLIC CAPITAL LETTER PE +0x8451 0x0420 #CYRILLIC CAPITAL LETTER ER +0x8452 0x0421 #CYRILLIC CAPITAL LETTER ES +0x8453 0x0422 #CYRILLIC CAPITAL LETTER TE +0x8454 0x0423 #CYRILLIC CAPITAL LETTER U +0x8455 0x0424 #CYRILLIC CAPITAL LETTER EF +0x8456 0x0425 #CYRILLIC CAPITAL LETTER HA +0x8457 0x0426 #CYRILLIC CAPITAL LETTER TSE +0x8458 0x0427 #CYRILLIC CAPITAL LETTER CHE +0x8459 0x0428 #CYRILLIC CAPITAL LETTER SHA +0x845A 0x0429 #CYRILLIC CAPITAL LETTER SHCHA +0x845B 0x042A #CYRILLIC CAPITAL LETTER HARD SIGN +0x845C 0x042B #CYRILLIC CAPITAL LETTER YERU +0x845D 0x042C #CYRILLIC CAPITAL LETTER SOFT SIGN +0x845E 0x042D #CYRILLIC CAPITAL LETTER E +0x845F 0x042E #CYRILLIC CAPITAL LETTER YU +0x8460 0x042F #CYRILLIC CAPITAL LETTER YA +0x8470 0x0430 #CYRILLIC SMALL LETTER A +0x8471 0x0431 #CYRILLIC SMALL LETTER BE +0x8472 0x0432 #CYRILLIC SMALL LETTER VE +0x8473 0x0433 #CYRILLIC SMALL LETTER GHE +0x8474 0x0434 #CYRILLIC SMALL LETTER DE +0x8475 0x0435 #CYRILLIC SMALL LETTER IE +0x8476 0x0451 #CYRILLIC SMALL LETTER IO +0x8477 0x0436 #CYRILLIC SMALL LETTER ZHE +0x8478 0x0437 #CYRILLIC SMALL LETTER ZE +0x8479 0x0438 #CYRILLIC SMALL LETTER I +0x847A 0x0439 #CYRILLIC SMALL LETTER SHORT I +0x847B 0x043A #CYRILLIC SMALL LETTER KA +0x847C 0x043B #CYRILLIC SMALL LETTER EL +0x847D 0x043C #CYRILLIC SMALL LETTER EM +0x847E 0x043D #CYRILLIC SMALL LETTER EN +0x8480 0x043E #CYRILLIC SMALL LETTER O +0x8481 0x043F #CYRILLIC SMALL LETTER PE +0x8482 0x0440 #CYRILLIC SMALL LETTER ER +0x8483 0x0441 #CYRILLIC SMALL LETTER ES +0x8484 0x0442 #CYRILLIC SMALL LETTER TE +0x8485 0x0443 #CYRILLIC SMALL LETTER U +0x8486 0x0444 #CYRILLIC SMALL LETTER EF +0x8487 0x0445 #CYRILLIC SMALL LETTER HA +0x8488 0x0446 #CYRILLIC SMALL LETTER TSE +0x8489 0x0447 #CYRILLIC SMALL LETTER CHE +0x848A 0x0448 #CYRILLIC SMALL LETTER SHA +0x848B 0x0449 #CYRILLIC SMALL LETTER SHCHA +0x848C 0x044A #CYRILLIC SMALL LETTER HARD SIGN +0x848D 0x044B #CYRILLIC SMALL LETTER YERU +0x848E 0x044C #CYRILLIC SMALL LETTER SOFT SIGN +0x848F 0x044D #CYRILLIC SMALL LETTER E +0x8490 0x044E #CYRILLIC SMALL LETTER YU +0x8491 0x044F #CYRILLIC SMALL LETTER YA +0x849F 0x2500 #BOX DRAWINGS LIGHT HORIZONTAL +0x84A0 0x2502 #BOX DRAWINGS LIGHT VERTICAL +0x84A1 0x250C #BOX DRAWINGS LIGHT DOWN AND RIGHT +0x84A2 0x2510 #BOX DRAWINGS LIGHT DOWN AND LEFT +0x84A3 0x2518 #BOX DRAWINGS LIGHT UP AND LEFT +0x84A4 0x2514 #BOX DRAWINGS LIGHT UP AND RIGHT +0x84A5 0x251C #BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0x84A6 0x252C #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0x84A7 0x2524 #BOX DRAWINGS LIGHT VERTICAL AND LEFT +0x84A8 0x2534 #BOX DRAWINGS LIGHT UP AND HORIZONTAL +0x84A9 0x253C #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0x84AA 0x2501 #BOX DRAWINGS HEAVY HORIZONTAL +0x84AB 0x2503 #BOX DRAWINGS HEAVY VERTICAL +0x84AC 0x250F #BOX DRAWINGS HEAVY DOWN AND RIGHT +0x84AD 0x2513 #BOX DRAWINGS HEAVY DOWN AND LEFT +0x84AE 0x251B #BOX DRAWINGS HEAVY UP AND LEFT +0x84AF 0x2517 #BOX DRAWINGS HEAVY UP AND RIGHT +0x84B0 0x2523 #BOX DRAWINGS HEAVY VERTICAL AND RIGHT +0x84B1 0x2533 #BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +0x84B2 0x252B #BOX DRAWINGS HEAVY VERTICAL AND LEFT +0x84B3 0x253B #BOX DRAWINGS HEAVY UP AND HORIZONTAL +0x84B4 0x254B #BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +0x84B5 0x2520 #BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +0x84B6 0x252F #BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +0x84B7 0x2528 #BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +0x84B8 0x2537 #BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +0x84B9 0x253F #BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +0x84BA 0x251D #BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +0x84BB 0x2530 #BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +0x84BC 0x2525 #BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +0x84BD 0x2538 #BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +0x84BE 0x2542 #BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +0x8740 0x2460 #CIRCLED DIGIT ONE +0x8741 0x2461 #CIRCLED DIGIT TWO +0x8742 0x2462 #CIRCLED DIGIT THREE +0x8743 0x2463 #CIRCLED DIGIT FOUR +0x8744 0x2464 #CIRCLED DIGIT FIVE +0x8745 0x2465 #CIRCLED DIGIT SIX +0x8746 0x2466 #CIRCLED DIGIT SEVEN +0x8747 0x2467 #CIRCLED DIGIT EIGHT +0x8748 0x2468 #CIRCLED DIGIT NINE +0x8749 0x2469 #CIRCLED NUMBER TEN +0x874A 0x246A #CIRCLED NUMBER ELEVEN +0x874B 0x246B #CIRCLED NUMBER TWELVE +0x874C 0x246C #CIRCLED NUMBER THIRTEEN +0x874D 0x246D #CIRCLED NUMBER FOURTEEN +0x874E 0x246E #CIRCLED NUMBER FIFTEEN +0x874F 0x246F #CIRCLED NUMBER SIXTEEN +0x8750 0x2470 #CIRCLED NUMBER SEVENTEEN +0x8751 0x2471 #CIRCLED NUMBER EIGHTEEN +0x8752 0x2472 #CIRCLED NUMBER NINETEEN +0x8753 0x2473 #CIRCLED NUMBER TWENTY +0x8754 0x2160 #ROMAN NUMERAL ONE +0x8755 0x2161 #ROMAN NUMERAL TWO +0x8756 0x2162 #ROMAN NUMERAL THREE +0x8757 0x2163 #ROMAN NUMERAL FOUR +0x8758 0x2164 #ROMAN NUMERAL FIVE +0x8759 0x2165 #ROMAN NUMERAL SIX +0x875A 0x2166 #ROMAN NUMERAL SEVEN +0x875B 0x2167 #ROMAN NUMERAL EIGHT +0x875C 0x2168 #ROMAN NUMERAL NINE +0x875D 0x2169 #ROMAN NUMERAL TEN +0x875F 0x3349 #SQUARE MIRI +0x8760 0x3314 #SQUARE KIRO +0x8761 0x3322 #SQUARE SENTI +0x8762 0x334D #SQUARE MEETORU +0x8763 0x3318 #SQUARE GURAMU +0x8764 0x3327 #SQUARE TON +0x8765 0x3303 #SQUARE AARU +0x8766 0x3336 #SQUARE HEKUTAARU +0x8767 0x3351 #SQUARE RITTORU +0x8768 0x3357 #SQUARE WATTO +0x8769 0x330D #SQUARE KARORII +0x876A 0x3326 #SQUARE DORU +0x876B 0x3323 #SQUARE SENTO +0x876C 0x332B #SQUARE PAASENTO +0x876D 0x334A #SQUARE MIRIBAARU +0x876E 0x333B #SQUARE PEEZI +0x876F 0x339C #SQUARE MM +0x8770 0x339D #SQUARE CM +0x8771 0x339E #SQUARE KM +0x8772 0x338E #SQUARE MG +0x8773 0x338F #SQUARE KG +0x8774 0x33C4 #SQUARE CC +0x8775 0x33A1 #SQUARE M SQUARED +0x877E 0x337B #SQUARE ERA NAME HEISEI +0x8780 0x301D #REVERSED DOUBLE PRIME QUOTATION MARK +0x8781 0x301F #LOW DOUBLE PRIME QUOTATION MARK +0x8782 0x2116 #NUMERO SIGN +0x8783 0x33CD #SQUARE KK +0x8784 0x2121 #TELEPHONE SIGN +0x8785 0x32A4 #CIRCLED IDEOGRAPH HIGH +0x8786 0x32A5 #CIRCLED IDEOGRAPH CENTRE +0x8787 0x32A6 #CIRCLED IDEOGRAPH LOW +0x8788 0x32A7 #CIRCLED IDEOGRAPH LEFT +0x8789 0x32A8 #CIRCLED IDEOGRAPH RIGHT +0x878A 0x3231 #PARENTHESIZED IDEOGRAPH STOCK +0x878B 0x3232 #PARENTHESIZED IDEOGRAPH HAVE +0x878C 0x3239 #PARENTHESIZED IDEOGRAPH REPRESENT +0x878D 0x337E #SQUARE ERA NAME MEIZI +0x878E 0x337D #SQUARE ERA NAME TAISYOU +0x878F 0x337C #SQUARE ERA NAME SYOUWA +0x8790 0x2252 #APPROXIMATELY EQUAL TO OR THE IMAGE OF +0x8791 0x2261 #IDENTICAL TO +0x8792 0x222B #INTEGRAL +0x8793 0x222E #CONTOUR INTEGRAL +0x8794 0x2211 #N-ARY SUMMATION +0x8795 0x221A #SQUARE ROOT +0x8796 0x22A5 #UP TACK +0x8797 0x2220 #ANGLE +0x8798 0x221F #RIGHT ANGLE +0x8799 0x22BF #RIGHT TRIANGLE +0x879A 0x2235 #BECAUSE +0x879B 0x2229 #INTERSECTION +0x879C 0x222A #UNION +0x889F 0x4E9C #CJK UNIFIED IDEOGRAPH +0x88A0 0x5516 #CJK UNIFIED IDEOGRAPH +0x88A1 0x5A03 #CJK UNIFIED IDEOGRAPH +0x88A2 0x963F #CJK UNIFIED IDEOGRAPH +0x88A3 0x54C0 #CJK UNIFIED IDEOGRAPH +0x88A4 0x611B #CJK UNIFIED IDEOGRAPH +0x88A5 0x6328 #CJK UNIFIED IDEOGRAPH +0x88A6 0x59F6 #CJK UNIFIED IDEOGRAPH +0x88A7 0x9022 #CJK UNIFIED IDEOGRAPH +0x88A8 0x8475 #CJK UNIFIED IDEOGRAPH +0x88A9 0x831C #CJK UNIFIED IDEOGRAPH +0x88AA 0x7A50 #CJK UNIFIED IDEOGRAPH +0x88AB 0x60AA #CJK UNIFIED IDEOGRAPH +0x88AC 0x63E1 #CJK UNIFIED IDEOGRAPH +0x88AD 0x6E25 #CJK UNIFIED IDEOGRAPH +0x88AE 0x65ED #CJK UNIFIED IDEOGRAPH +0x88AF 0x8466 #CJK UNIFIED IDEOGRAPH +0x88B0 0x82A6 #CJK UNIFIED IDEOGRAPH +0x88B1 0x9BF5 #CJK UNIFIED IDEOGRAPH +0x88B2 0x6893 #CJK UNIFIED IDEOGRAPH +0x88B3 0x5727 #CJK UNIFIED IDEOGRAPH +0x88B4 0x65A1 #CJK UNIFIED IDEOGRAPH +0x88B5 0x6271 #CJK UNIFIED IDEOGRAPH +0x88B6 0x5B9B #CJK UNIFIED IDEOGRAPH +0x88B7 0x59D0 #CJK UNIFIED IDEOGRAPH +0x88B8 0x867B #CJK UNIFIED IDEOGRAPH +0x88B9 0x98F4 #CJK UNIFIED IDEOGRAPH +0x88BA 0x7D62 #CJK UNIFIED IDEOGRAPH +0x88BB 0x7DBE #CJK UNIFIED IDEOGRAPH +0x88BC 0x9B8E #CJK UNIFIED IDEOGRAPH +0x88BD 0x6216 #CJK UNIFIED IDEOGRAPH +0x88BE 0x7C9F #CJK UNIFIED IDEOGRAPH +0x88BF 0x88B7 #CJK UNIFIED IDEOGRAPH +0x88C0 0x5B89 #CJK UNIFIED IDEOGRAPH +0x88C1 0x5EB5 #CJK UNIFIED IDEOGRAPH +0x88C2 0x6309 #CJK UNIFIED IDEOGRAPH +0x88C3 0x6697 #CJK UNIFIED IDEOGRAPH +0x88C4 0x6848 #CJK UNIFIED IDEOGRAPH +0x88C5 0x95C7 #CJK UNIFIED IDEOGRAPH +0x88C6 0x978D #CJK UNIFIED IDEOGRAPH +0x88C7 0x674F #CJK UNIFIED IDEOGRAPH +0x88C8 0x4EE5 #CJK UNIFIED IDEOGRAPH +0x88C9 0x4F0A #CJK UNIFIED IDEOGRAPH +0x88CA 0x4F4D #CJK UNIFIED IDEOGRAPH +0x88CB 0x4F9D #CJK UNIFIED IDEOGRAPH +0x88CC 0x5049 #CJK UNIFIED IDEOGRAPH +0x88CD 0x56F2 #CJK UNIFIED IDEOGRAPH +0x88CE 0x5937 #CJK UNIFIED IDEOGRAPH +0x88CF 0x59D4 #CJK UNIFIED IDEOGRAPH +0x88D0 0x5A01 #CJK UNIFIED IDEOGRAPH +0x88D1 0x5C09 #CJK UNIFIED IDEOGRAPH +0x88D2 0x60DF #CJK UNIFIED IDEOGRAPH +0x88D3 0x610F #CJK UNIFIED IDEOGRAPH +0x88D4 0x6170 #CJK UNIFIED IDEOGRAPH +0x88D5 0x6613 #CJK UNIFIED IDEOGRAPH +0x88D6 0x6905 #CJK UNIFIED IDEOGRAPH +0x88D7 0x70BA #CJK UNIFIED IDEOGRAPH +0x88D8 0x754F #CJK UNIFIED IDEOGRAPH +0x88D9 0x7570 #CJK UNIFIED IDEOGRAPH +0x88DA 0x79FB #CJK UNIFIED IDEOGRAPH +0x88DB 0x7DAD #CJK UNIFIED IDEOGRAPH +0x88DC 0x7DEF #CJK UNIFIED IDEOGRAPH +0x88DD 0x80C3 #CJK UNIFIED IDEOGRAPH +0x88DE 0x840E #CJK UNIFIED IDEOGRAPH +0x88DF 0x8863 #CJK UNIFIED IDEOGRAPH +0x88E0 0x8B02 #CJK UNIFIED IDEOGRAPH +0x88E1 0x9055 #CJK UNIFIED IDEOGRAPH +0x88E2 0x907A #CJK UNIFIED IDEOGRAPH +0x88E3 0x533B #CJK UNIFIED IDEOGRAPH +0x88E4 0x4E95 #CJK UNIFIED IDEOGRAPH +0x88E5 0x4EA5 #CJK UNIFIED IDEOGRAPH +0x88E6 0x57DF #CJK UNIFIED IDEOGRAPH +0x88E7 0x80B2 #CJK UNIFIED IDEOGRAPH +0x88E8 0x90C1 #CJK UNIFIED IDEOGRAPH +0x88E9 0x78EF #CJK UNIFIED IDEOGRAPH +0x88EA 0x4E00 #CJK UNIFIED IDEOGRAPH +0x88EB 0x58F1 #CJK UNIFIED IDEOGRAPH +0x88EC 0x6EA2 #CJK UNIFIED IDEOGRAPH +0x88ED 0x9038 #CJK UNIFIED IDEOGRAPH +0x88EE 0x7A32 #CJK UNIFIED IDEOGRAPH +0x88EF 0x8328 #CJK UNIFIED IDEOGRAPH +0x88F0 0x828B #CJK UNIFIED IDEOGRAPH +0x88F1 0x9C2F #CJK UNIFIED IDEOGRAPH +0x88F2 0x5141 #CJK UNIFIED IDEOGRAPH +0x88F3 0x5370 #CJK UNIFIED IDEOGRAPH +0x88F4 0x54BD #CJK UNIFIED IDEOGRAPH +0x88F5 0x54E1 #CJK UNIFIED IDEOGRAPH +0x88F6 0x56E0 #CJK UNIFIED IDEOGRAPH +0x88F7 0x59FB #CJK UNIFIED IDEOGRAPH +0x88F8 0x5F15 #CJK UNIFIED IDEOGRAPH +0x88F9 0x98F2 #CJK UNIFIED IDEOGRAPH +0x88FA 0x6DEB #CJK UNIFIED IDEOGRAPH +0x88FB 0x80E4 #CJK UNIFIED IDEOGRAPH +0x88FC 0x852D #CJK UNIFIED IDEOGRAPH +0x8940 0x9662 #CJK UNIFIED IDEOGRAPH +0x8941 0x9670 #CJK UNIFIED IDEOGRAPH +0x8942 0x96A0 #CJK UNIFIED IDEOGRAPH +0x8943 0x97FB #CJK UNIFIED IDEOGRAPH +0x8944 0x540B #CJK UNIFIED IDEOGRAPH +0x8945 0x53F3 #CJK UNIFIED IDEOGRAPH +0x8946 0x5B87 #CJK UNIFIED IDEOGRAPH +0x8947 0x70CF #CJK UNIFIED IDEOGRAPH +0x8948 0x7FBD #CJK UNIFIED IDEOGRAPH +0x8949 0x8FC2 #CJK UNIFIED IDEOGRAPH +0x894A 0x96E8 #CJK UNIFIED IDEOGRAPH +0x894B 0x536F #CJK UNIFIED IDEOGRAPH +0x894C 0x9D5C #CJK UNIFIED IDEOGRAPH +0x894D 0x7ABA #CJK UNIFIED IDEOGRAPH +0x894E 0x4E11 #CJK UNIFIED IDEOGRAPH +0x894F 0x7893 #CJK UNIFIED IDEOGRAPH +0x8950 0x81FC #CJK UNIFIED IDEOGRAPH +0x8951 0x6E26 #CJK UNIFIED IDEOGRAPH +0x8952 0x5618 #CJK UNIFIED IDEOGRAPH +0x8953 0x5504 #CJK UNIFIED IDEOGRAPH +0x8954 0x6B1D #CJK UNIFIED IDEOGRAPH +0x8955 0x851A #CJK UNIFIED IDEOGRAPH +0x8956 0x9C3B #CJK UNIFIED IDEOGRAPH +0x8957 0x59E5 #CJK UNIFIED IDEOGRAPH +0x8958 0x53A9 #CJK UNIFIED IDEOGRAPH +0x8959 0x6D66 #CJK UNIFIED IDEOGRAPH +0x895A 0x74DC #CJK UNIFIED IDEOGRAPH +0x895B 0x958F #CJK UNIFIED IDEOGRAPH +0x895C 0x5642 #CJK UNIFIED IDEOGRAPH +0x895D 0x4E91 #CJK UNIFIED IDEOGRAPH +0x895E 0x904B #CJK UNIFIED IDEOGRAPH +0x895F 0x96F2 #CJK UNIFIED IDEOGRAPH +0x8960 0x834F #CJK UNIFIED IDEOGRAPH +0x8961 0x990C #CJK UNIFIED IDEOGRAPH +0x8962 0x53E1 #CJK UNIFIED IDEOGRAPH +0x8963 0x55B6 #CJK UNIFIED IDEOGRAPH +0x8964 0x5B30 #CJK UNIFIED IDEOGRAPH +0x8965 0x5F71 #CJK UNIFIED IDEOGRAPH +0x8966 0x6620 #CJK UNIFIED IDEOGRAPH +0x8967 0x66F3 #CJK UNIFIED IDEOGRAPH +0x8968 0x6804 #CJK UNIFIED IDEOGRAPH +0x8969 0x6C38 #CJK UNIFIED IDEOGRAPH +0x896A 0x6CF3 #CJK UNIFIED IDEOGRAPH +0x896B 0x6D29 #CJK UNIFIED IDEOGRAPH +0x896C 0x745B #CJK UNIFIED IDEOGRAPH +0x896D 0x76C8 #CJK UNIFIED IDEOGRAPH +0x896E 0x7A4E #CJK UNIFIED IDEOGRAPH +0x896F 0x9834 #CJK UNIFIED IDEOGRAPH +0x8970 0x82F1 #CJK UNIFIED IDEOGRAPH +0x8971 0x885B #CJK UNIFIED IDEOGRAPH +0x8972 0x8A60 #CJK UNIFIED IDEOGRAPH +0x8973 0x92ED #CJK UNIFIED IDEOGRAPH +0x8974 0x6DB2 #CJK UNIFIED IDEOGRAPH +0x8975 0x75AB #CJK UNIFIED IDEOGRAPH +0x8976 0x76CA #CJK UNIFIED IDEOGRAPH +0x8977 0x99C5 #CJK UNIFIED IDEOGRAPH +0x8978 0x60A6 #CJK UNIFIED IDEOGRAPH +0x8979 0x8B01 #CJK UNIFIED IDEOGRAPH +0x897A 0x8D8A #CJK UNIFIED IDEOGRAPH +0x897B 0x95B2 #CJK UNIFIED IDEOGRAPH +0x897C 0x698E #CJK UNIFIED IDEOGRAPH +0x897D 0x53AD #CJK UNIFIED IDEOGRAPH +0x897E 0x5186 #CJK UNIFIED IDEOGRAPH +0x8980 0x5712 #CJK UNIFIED IDEOGRAPH +0x8981 0x5830 #CJK UNIFIED IDEOGRAPH +0x8982 0x5944 #CJK UNIFIED IDEOGRAPH +0x8983 0x5BB4 #CJK UNIFIED IDEOGRAPH +0x8984 0x5EF6 #CJK UNIFIED IDEOGRAPH +0x8985 0x6028 #CJK UNIFIED IDEOGRAPH +0x8986 0x63A9 #CJK UNIFIED IDEOGRAPH +0x8987 0x63F4 #CJK UNIFIED IDEOGRAPH +0x8988 0x6CBF #CJK UNIFIED IDEOGRAPH +0x8989 0x6F14 #CJK UNIFIED IDEOGRAPH +0x898A 0x708E #CJK UNIFIED IDEOGRAPH +0x898B 0x7114 #CJK UNIFIED IDEOGRAPH +0x898C 0x7159 #CJK UNIFIED IDEOGRAPH +0x898D 0x71D5 #CJK UNIFIED IDEOGRAPH +0x898E 0x733F #CJK UNIFIED IDEOGRAPH +0x898F 0x7E01 #CJK UNIFIED IDEOGRAPH +0x8990 0x8276 #CJK UNIFIED IDEOGRAPH +0x8991 0x82D1 #CJK UNIFIED IDEOGRAPH +0x8992 0x8597 #CJK UNIFIED IDEOGRAPH +0x8993 0x9060 #CJK UNIFIED IDEOGRAPH +0x8994 0x925B #CJK UNIFIED IDEOGRAPH +0x8995 0x9D1B #CJK UNIFIED IDEOGRAPH +0x8996 0x5869 #CJK UNIFIED IDEOGRAPH +0x8997 0x65BC #CJK UNIFIED IDEOGRAPH +0x8998 0x6C5A #CJK UNIFIED IDEOGRAPH +0x8999 0x7525 #CJK UNIFIED IDEOGRAPH +0x899A 0x51F9 #CJK UNIFIED IDEOGRAPH +0x899B 0x592E #CJK UNIFIED IDEOGRAPH +0x899C 0x5965 #CJK UNIFIED IDEOGRAPH +0x899D 0x5F80 #CJK UNIFIED IDEOGRAPH +0x899E 0x5FDC #CJK UNIFIED IDEOGRAPH +0x899F 0x62BC #CJK UNIFIED IDEOGRAPH +0x89A0 0x65FA #CJK UNIFIED IDEOGRAPH +0x89A1 0x6A2A #CJK UNIFIED IDEOGRAPH +0x89A2 0x6B27 #CJK UNIFIED IDEOGRAPH +0x89A3 0x6BB4 #CJK UNIFIED IDEOGRAPH +0x89A4 0x738B #CJK UNIFIED IDEOGRAPH +0x89A5 0x7FC1 #CJK UNIFIED IDEOGRAPH +0x89A6 0x8956 #CJK UNIFIED IDEOGRAPH +0x89A7 0x9D2C #CJK UNIFIED IDEOGRAPH +0x89A8 0x9D0E #CJK UNIFIED IDEOGRAPH +0x89A9 0x9EC4 #CJK UNIFIED IDEOGRAPH +0x89AA 0x5CA1 #CJK UNIFIED IDEOGRAPH +0x89AB 0x6C96 #CJK UNIFIED IDEOGRAPH +0x89AC 0x837B #CJK UNIFIED IDEOGRAPH +0x89AD 0x5104 #CJK UNIFIED IDEOGRAPH +0x89AE 0x5C4B #CJK UNIFIED IDEOGRAPH +0x89AF 0x61B6 #CJK UNIFIED IDEOGRAPH +0x89B0 0x81C6 #CJK UNIFIED IDEOGRAPH +0x89B1 0x6876 #CJK UNIFIED IDEOGRAPH +0x89B2 0x7261 #CJK UNIFIED IDEOGRAPH +0x89B3 0x4E59 #CJK UNIFIED IDEOGRAPH +0x89B4 0x4FFA #CJK UNIFIED IDEOGRAPH +0x89B5 0x5378 #CJK UNIFIED IDEOGRAPH +0x89B6 0x6069 #CJK UNIFIED IDEOGRAPH +0x89B7 0x6E29 #CJK UNIFIED IDEOGRAPH +0x89B8 0x7A4F #CJK UNIFIED IDEOGRAPH +0x89B9 0x97F3 #CJK UNIFIED IDEOGRAPH +0x89BA 0x4E0B #CJK UNIFIED IDEOGRAPH +0x89BB 0x5316 #CJK UNIFIED IDEOGRAPH +0x89BC 0x4EEE #CJK UNIFIED IDEOGRAPH +0x89BD 0x4F55 #CJK UNIFIED IDEOGRAPH +0x89BE 0x4F3D #CJK UNIFIED IDEOGRAPH +0x89BF 0x4FA1 #CJK UNIFIED IDEOGRAPH +0x89C0 0x4F73 #CJK UNIFIED IDEOGRAPH +0x89C1 0x52A0 #CJK UNIFIED IDEOGRAPH +0x89C2 0x53EF #CJK UNIFIED IDEOGRAPH +0x89C3 0x5609 #CJK UNIFIED IDEOGRAPH +0x89C4 0x590F #CJK UNIFIED IDEOGRAPH +0x89C5 0x5AC1 #CJK UNIFIED IDEOGRAPH +0x89C6 0x5BB6 #CJK UNIFIED IDEOGRAPH +0x89C7 0x5BE1 #CJK UNIFIED IDEOGRAPH +0x89C8 0x79D1 #CJK UNIFIED IDEOGRAPH +0x89C9 0x6687 #CJK UNIFIED IDEOGRAPH +0x89CA 0x679C #CJK UNIFIED IDEOGRAPH +0x89CB 0x67B6 #CJK UNIFIED IDEOGRAPH +0x89CC 0x6B4C #CJK UNIFIED IDEOGRAPH +0x89CD 0x6CB3 #CJK UNIFIED IDEOGRAPH +0x89CE 0x706B #CJK UNIFIED IDEOGRAPH +0x89CF 0x73C2 #CJK UNIFIED IDEOGRAPH +0x89D0 0x798D #CJK UNIFIED IDEOGRAPH +0x89D1 0x79BE #CJK UNIFIED IDEOGRAPH +0x89D2 0x7A3C #CJK UNIFIED IDEOGRAPH +0x89D3 0x7B87 #CJK UNIFIED IDEOGRAPH +0x89D4 0x82B1 #CJK UNIFIED IDEOGRAPH +0x89D5 0x82DB #CJK UNIFIED IDEOGRAPH +0x89D6 0x8304 #CJK UNIFIED IDEOGRAPH +0x89D7 0x8377 #CJK UNIFIED IDEOGRAPH +0x89D8 0x83EF #CJK UNIFIED IDEOGRAPH +0x89D9 0x83D3 #CJK UNIFIED IDEOGRAPH +0x89DA 0x8766 #CJK UNIFIED IDEOGRAPH +0x89DB 0x8AB2 #CJK UNIFIED IDEOGRAPH +0x89DC 0x5629 #CJK UNIFIED IDEOGRAPH +0x89DD 0x8CA8 #CJK UNIFIED IDEOGRAPH +0x89DE 0x8FE6 #CJK UNIFIED IDEOGRAPH +0x89DF 0x904E #CJK UNIFIED IDEOGRAPH +0x89E0 0x971E #CJK UNIFIED IDEOGRAPH +0x89E1 0x868A #CJK UNIFIED IDEOGRAPH +0x89E2 0x4FC4 #CJK UNIFIED IDEOGRAPH +0x89E3 0x5CE8 #CJK UNIFIED IDEOGRAPH +0x89E4 0x6211 #CJK UNIFIED IDEOGRAPH +0x89E5 0x7259 #CJK UNIFIED IDEOGRAPH +0x89E6 0x753B #CJK UNIFIED IDEOGRAPH +0x89E7 0x81E5 #CJK UNIFIED IDEOGRAPH +0x89E8 0x82BD #CJK UNIFIED IDEOGRAPH +0x89E9 0x86FE #CJK UNIFIED IDEOGRAPH +0x89EA 0x8CC0 #CJK UNIFIED IDEOGRAPH +0x89EB 0x96C5 #CJK UNIFIED IDEOGRAPH +0x89EC 0x9913 #CJK UNIFIED IDEOGRAPH +0x89ED 0x99D5 #CJK UNIFIED IDEOGRAPH +0x89EE 0x4ECB #CJK UNIFIED IDEOGRAPH +0x89EF 0x4F1A #CJK UNIFIED IDEOGRAPH +0x89F0 0x89E3 #CJK UNIFIED IDEOGRAPH +0x89F1 0x56DE #CJK UNIFIED IDEOGRAPH +0x89F2 0x584A #CJK UNIFIED IDEOGRAPH +0x89F3 0x58CA #CJK UNIFIED IDEOGRAPH +0x89F4 0x5EFB #CJK UNIFIED IDEOGRAPH +0x89F5 0x5FEB #CJK UNIFIED IDEOGRAPH +0x89F6 0x602A #CJK UNIFIED IDEOGRAPH +0x89F7 0x6094 #CJK UNIFIED IDEOGRAPH +0x89F8 0x6062 #CJK UNIFIED IDEOGRAPH +0x89F9 0x61D0 #CJK UNIFIED IDEOGRAPH +0x89FA 0x6212 #CJK UNIFIED IDEOGRAPH +0x89FB 0x62D0 #CJK UNIFIED IDEOGRAPH +0x89FC 0x6539 #CJK UNIFIED IDEOGRAPH +0x8A40 0x9B41 #CJK UNIFIED IDEOGRAPH +0x8A41 0x6666 #CJK UNIFIED IDEOGRAPH +0x8A42 0x68B0 #CJK UNIFIED IDEOGRAPH +0x8A43 0x6D77 #CJK UNIFIED IDEOGRAPH +0x8A44 0x7070 #CJK UNIFIED IDEOGRAPH +0x8A45 0x754C #CJK UNIFIED IDEOGRAPH +0x8A46 0x7686 #CJK UNIFIED IDEOGRAPH +0x8A47 0x7D75 #CJK UNIFIED IDEOGRAPH +0x8A48 0x82A5 #CJK UNIFIED IDEOGRAPH +0x8A49 0x87F9 #CJK UNIFIED IDEOGRAPH +0x8A4A 0x958B #CJK UNIFIED IDEOGRAPH +0x8A4B 0x968E #CJK UNIFIED IDEOGRAPH +0x8A4C 0x8C9D #CJK UNIFIED IDEOGRAPH +0x8A4D 0x51F1 #CJK UNIFIED IDEOGRAPH +0x8A4E 0x52BE #CJK UNIFIED IDEOGRAPH +0x8A4F 0x5916 #CJK UNIFIED IDEOGRAPH +0x8A50 0x54B3 #CJK UNIFIED IDEOGRAPH +0x8A51 0x5BB3 #CJK UNIFIED IDEOGRAPH +0x8A52 0x5D16 #CJK UNIFIED IDEOGRAPH +0x8A53 0x6168 #CJK UNIFIED IDEOGRAPH +0x8A54 0x6982 #CJK UNIFIED IDEOGRAPH +0x8A55 0x6DAF #CJK UNIFIED IDEOGRAPH +0x8A56 0x788D #CJK UNIFIED IDEOGRAPH +0x8A57 0x84CB #CJK UNIFIED IDEOGRAPH +0x8A58 0x8857 #CJK UNIFIED IDEOGRAPH +0x8A59 0x8A72 #CJK UNIFIED IDEOGRAPH +0x8A5A 0x93A7 #CJK UNIFIED IDEOGRAPH +0x8A5B 0x9AB8 #CJK UNIFIED IDEOGRAPH +0x8A5C 0x6D6C #CJK UNIFIED IDEOGRAPH +0x8A5D 0x99A8 #CJK UNIFIED IDEOGRAPH +0x8A5E 0x86D9 #CJK UNIFIED IDEOGRAPH +0x8A5F 0x57A3 #CJK UNIFIED IDEOGRAPH +0x8A60 0x67FF #CJK UNIFIED IDEOGRAPH +0x8A61 0x86CE #CJK UNIFIED IDEOGRAPH +0x8A62 0x920E #CJK UNIFIED IDEOGRAPH +0x8A63 0x5283 #CJK UNIFIED IDEOGRAPH +0x8A64 0x5687 #CJK UNIFIED IDEOGRAPH +0x8A65 0x5404 #CJK UNIFIED IDEOGRAPH +0x8A66 0x5ED3 #CJK UNIFIED IDEOGRAPH +0x8A67 0x62E1 #CJK UNIFIED IDEOGRAPH +0x8A68 0x64B9 #CJK UNIFIED IDEOGRAPH +0x8A69 0x683C #CJK UNIFIED IDEOGRAPH +0x8A6A 0x6838 #CJK UNIFIED IDEOGRAPH +0x8A6B 0x6BBB #CJK UNIFIED IDEOGRAPH +0x8A6C 0x7372 #CJK UNIFIED IDEOGRAPH +0x8A6D 0x78BA #CJK UNIFIED IDEOGRAPH +0x8A6E 0x7A6B #CJK UNIFIED IDEOGRAPH +0x8A6F 0x899A #CJK UNIFIED IDEOGRAPH +0x8A70 0x89D2 #CJK UNIFIED IDEOGRAPH +0x8A71 0x8D6B #CJK UNIFIED IDEOGRAPH +0x8A72 0x8F03 #CJK UNIFIED IDEOGRAPH +0x8A73 0x90ED #CJK UNIFIED IDEOGRAPH +0x8A74 0x95A3 #CJK UNIFIED IDEOGRAPH +0x8A75 0x9694 #CJK UNIFIED IDEOGRAPH +0x8A76 0x9769 #CJK UNIFIED IDEOGRAPH +0x8A77 0x5B66 #CJK UNIFIED IDEOGRAPH +0x8A78 0x5CB3 #CJK UNIFIED IDEOGRAPH +0x8A79 0x697D #CJK UNIFIED IDEOGRAPH +0x8A7A 0x984D #CJK UNIFIED IDEOGRAPH +0x8A7B 0x984E #CJK UNIFIED IDEOGRAPH +0x8A7C 0x639B #CJK UNIFIED IDEOGRAPH +0x8A7D 0x7B20 #CJK UNIFIED IDEOGRAPH +0x8A7E 0x6A2B #CJK UNIFIED IDEOGRAPH +0x8A80 0x6A7F #CJK UNIFIED IDEOGRAPH +0x8A81 0x68B6 #CJK UNIFIED IDEOGRAPH +0x8A82 0x9C0D #CJK UNIFIED IDEOGRAPH +0x8A83 0x6F5F #CJK UNIFIED IDEOGRAPH +0x8A84 0x5272 #CJK UNIFIED IDEOGRAPH +0x8A85 0x559D #CJK UNIFIED IDEOGRAPH +0x8A86 0x6070 #CJK UNIFIED IDEOGRAPH +0x8A87 0x62EC #CJK UNIFIED IDEOGRAPH +0x8A88 0x6D3B #CJK UNIFIED IDEOGRAPH +0x8A89 0x6E07 #CJK UNIFIED IDEOGRAPH +0x8A8A 0x6ED1 #CJK UNIFIED IDEOGRAPH +0x8A8B 0x845B #CJK UNIFIED IDEOGRAPH +0x8A8C 0x8910 #CJK UNIFIED IDEOGRAPH +0x8A8D 0x8F44 #CJK UNIFIED IDEOGRAPH +0x8A8E 0x4E14 #CJK UNIFIED IDEOGRAPH +0x8A8F 0x9C39 #CJK UNIFIED IDEOGRAPH +0x8A90 0x53F6 #CJK UNIFIED IDEOGRAPH +0x8A91 0x691B #CJK UNIFIED IDEOGRAPH +0x8A92 0x6A3A #CJK UNIFIED IDEOGRAPH +0x8A93 0x9784 #CJK UNIFIED IDEOGRAPH +0x8A94 0x682A #CJK UNIFIED IDEOGRAPH +0x8A95 0x515C #CJK UNIFIED IDEOGRAPH +0x8A96 0x7AC3 #CJK UNIFIED IDEOGRAPH +0x8A97 0x84B2 #CJK UNIFIED IDEOGRAPH +0x8A98 0x91DC #CJK UNIFIED IDEOGRAPH +0x8A99 0x938C #CJK UNIFIED IDEOGRAPH +0x8A9A 0x565B #CJK UNIFIED IDEOGRAPH +0x8A9B 0x9D28 #CJK UNIFIED IDEOGRAPH +0x8A9C 0x6822 #CJK UNIFIED IDEOGRAPH +0x8A9D 0x8305 #CJK UNIFIED IDEOGRAPH +0x8A9E 0x8431 #CJK UNIFIED IDEOGRAPH +0x8A9F 0x7CA5 #CJK UNIFIED IDEOGRAPH +0x8AA0 0x5208 #CJK UNIFIED IDEOGRAPH +0x8AA1 0x82C5 #CJK UNIFIED IDEOGRAPH +0x8AA2 0x74E6 #CJK UNIFIED IDEOGRAPH +0x8AA3 0x4E7E #CJK UNIFIED IDEOGRAPH +0x8AA4 0x4F83 #CJK UNIFIED IDEOGRAPH +0x8AA5 0x51A0 #CJK UNIFIED IDEOGRAPH +0x8AA6 0x5BD2 #CJK UNIFIED IDEOGRAPH +0x8AA7 0x520A #CJK UNIFIED IDEOGRAPH +0x8AA8 0x52D8 #CJK UNIFIED IDEOGRAPH +0x8AA9 0x52E7 #CJK UNIFIED IDEOGRAPH +0x8AAA 0x5DFB #CJK UNIFIED IDEOGRAPH +0x8AAB 0x559A #CJK UNIFIED IDEOGRAPH +0x8AAC 0x582A #CJK UNIFIED IDEOGRAPH +0x8AAD 0x59E6 #CJK UNIFIED IDEOGRAPH +0x8AAE 0x5B8C #CJK UNIFIED IDEOGRAPH +0x8AAF 0x5B98 #CJK UNIFIED IDEOGRAPH +0x8AB0 0x5BDB #CJK UNIFIED IDEOGRAPH +0x8AB1 0x5E72 #CJK UNIFIED IDEOGRAPH +0x8AB2 0x5E79 #CJK UNIFIED IDEOGRAPH +0x8AB3 0x60A3 #CJK UNIFIED IDEOGRAPH +0x8AB4 0x611F #CJK UNIFIED IDEOGRAPH +0x8AB5 0x6163 #CJK UNIFIED IDEOGRAPH +0x8AB6 0x61BE #CJK UNIFIED IDEOGRAPH +0x8AB7 0x63DB #CJK UNIFIED IDEOGRAPH +0x8AB8 0x6562 #CJK UNIFIED IDEOGRAPH +0x8AB9 0x67D1 #CJK UNIFIED IDEOGRAPH +0x8ABA 0x6853 #CJK UNIFIED IDEOGRAPH +0x8ABB 0x68FA #CJK UNIFIED IDEOGRAPH +0x8ABC 0x6B3E #CJK UNIFIED IDEOGRAPH +0x8ABD 0x6B53 #CJK UNIFIED IDEOGRAPH +0x8ABE 0x6C57 #CJK UNIFIED IDEOGRAPH +0x8ABF 0x6F22 #CJK UNIFIED IDEOGRAPH +0x8AC0 0x6F97 #CJK UNIFIED IDEOGRAPH +0x8AC1 0x6F45 #CJK UNIFIED IDEOGRAPH +0x8AC2 0x74B0 #CJK UNIFIED IDEOGRAPH +0x8AC3 0x7518 #CJK UNIFIED IDEOGRAPH +0x8AC4 0x76E3 #CJK UNIFIED IDEOGRAPH +0x8AC5 0x770B #CJK UNIFIED IDEOGRAPH +0x8AC6 0x7AFF #CJK UNIFIED IDEOGRAPH +0x8AC7 0x7BA1 #CJK UNIFIED IDEOGRAPH +0x8AC8 0x7C21 #CJK UNIFIED IDEOGRAPH +0x8AC9 0x7DE9 #CJK UNIFIED IDEOGRAPH +0x8ACA 0x7F36 #CJK UNIFIED IDEOGRAPH +0x8ACB 0x7FF0 #CJK UNIFIED IDEOGRAPH +0x8ACC 0x809D #CJK UNIFIED IDEOGRAPH +0x8ACD 0x8266 #CJK UNIFIED IDEOGRAPH +0x8ACE 0x839E #CJK UNIFIED IDEOGRAPH +0x8ACF 0x89B3 #CJK UNIFIED IDEOGRAPH +0x8AD0 0x8ACC #CJK UNIFIED IDEOGRAPH +0x8AD1 0x8CAB #CJK UNIFIED IDEOGRAPH +0x8AD2 0x9084 #CJK UNIFIED IDEOGRAPH +0x8AD3 0x9451 #CJK UNIFIED IDEOGRAPH +0x8AD4 0x9593 #CJK UNIFIED IDEOGRAPH +0x8AD5 0x9591 #CJK UNIFIED IDEOGRAPH +0x8AD6 0x95A2 #CJK UNIFIED IDEOGRAPH +0x8AD7 0x9665 #CJK UNIFIED IDEOGRAPH +0x8AD8 0x97D3 #CJK UNIFIED IDEOGRAPH +0x8AD9 0x9928 #CJK UNIFIED IDEOGRAPH +0x8ADA 0x8218 #CJK UNIFIED IDEOGRAPH +0x8ADB 0x4E38 #CJK UNIFIED IDEOGRAPH +0x8ADC 0x542B #CJK UNIFIED IDEOGRAPH +0x8ADD 0x5CB8 #CJK UNIFIED IDEOGRAPH +0x8ADE 0x5DCC #CJK UNIFIED IDEOGRAPH +0x8ADF 0x73A9 #CJK UNIFIED IDEOGRAPH +0x8AE0 0x764C #CJK UNIFIED IDEOGRAPH +0x8AE1 0x773C #CJK UNIFIED IDEOGRAPH +0x8AE2 0x5CA9 #CJK UNIFIED IDEOGRAPH +0x8AE3 0x7FEB #CJK UNIFIED IDEOGRAPH +0x8AE4 0x8D0B #CJK UNIFIED IDEOGRAPH +0x8AE5 0x96C1 #CJK UNIFIED IDEOGRAPH +0x8AE6 0x9811 #CJK UNIFIED IDEOGRAPH +0x8AE7 0x9854 #CJK UNIFIED IDEOGRAPH +0x8AE8 0x9858 #CJK UNIFIED IDEOGRAPH +0x8AE9 0x4F01 #CJK UNIFIED IDEOGRAPH +0x8AEA 0x4F0E #CJK UNIFIED IDEOGRAPH +0x8AEB 0x5371 #CJK UNIFIED IDEOGRAPH +0x8AEC 0x559C #CJK UNIFIED IDEOGRAPH +0x8AED 0x5668 #CJK UNIFIED IDEOGRAPH +0x8AEE 0x57FA #CJK UNIFIED IDEOGRAPH +0x8AEF 0x5947 #CJK UNIFIED IDEOGRAPH +0x8AF0 0x5B09 #CJK UNIFIED IDEOGRAPH +0x8AF1 0x5BC4 #CJK UNIFIED IDEOGRAPH +0x8AF2 0x5C90 #CJK UNIFIED IDEOGRAPH +0x8AF3 0x5E0C #CJK UNIFIED IDEOGRAPH +0x8AF4 0x5E7E #CJK UNIFIED IDEOGRAPH +0x8AF5 0x5FCC #CJK UNIFIED IDEOGRAPH +0x8AF6 0x63EE #CJK UNIFIED IDEOGRAPH +0x8AF7 0x673A #CJK UNIFIED IDEOGRAPH +0x8AF8 0x65D7 #CJK UNIFIED IDEOGRAPH +0x8AF9 0x65E2 #CJK UNIFIED IDEOGRAPH +0x8AFA 0x671F #CJK UNIFIED IDEOGRAPH +0x8AFB 0x68CB #CJK UNIFIED IDEOGRAPH +0x8AFC 0x68C4 #CJK UNIFIED IDEOGRAPH +0x8B40 0x6A5F #CJK UNIFIED IDEOGRAPH +0x8B41 0x5E30 #CJK UNIFIED IDEOGRAPH +0x8B42 0x6BC5 #CJK UNIFIED IDEOGRAPH +0x8B43 0x6C17 #CJK UNIFIED IDEOGRAPH +0x8B44 0x6C7D #CJK UNIFIED IDEOGRAPH +0x8B45 0x757F #CJK UNIFIED IDEOGRAPH +0x8B46 0x7948 #CJK UNIFIED IDEOGRAPH +0x8B47 0x5B63 #CJK UNIFIED IDEOGRAPH +0x8B48 0x7A00 #CJK UNIFIED IDEOGRAPH +0x8B49 0x7D00 #CJK UNIFIED IDEOGRAPH +0x8B4A 0x5FBD #CJK UNIFIED IDEOGRAPH +0x8B4B 0x898F #CJK UNIFIED IDEOGRAPH +0x8B4C 0x8A18 #CJK UNIFIED IDEOGRAPH +0x8B4D 0x8CB4 #CJK UNIFIED IDEOGRAPH +0x8B4E 0x8D77 #CJK UNIFIED IDEOGRAPH +0x8B4F 0x8ECC #CJK UNIFIED IDEOGRAPH +0x8B50 0x8F1D #CJK UNIFIED IDEOGRAPH +0x8B51 0x98E2 #CJK UNIFIED IDEOGRAPH +0x8B52 0x9A0E #CJK UNIFIED IDEOGRAPH +0x8B53 0x9B3C #CJK UNIFIED IDEOGRAPH +0x8B54 0x4E80 #CJK UNIFIED IDEOGRAPH +0x8B55 0x507D #CJK UNIFIED IDEOGRAPH +0x8B56 0x5100 #CJK UNIFIED IDEOGRAPH +0x8B57 0x5993 #CJK UNIFIED IDEOGRAPH +0x8B58 0x5B9C #CJK UNIFIED IDEOGRAPH +0x8B59 0x622F #CJK UNIFIED IDEOGRAPH +0x8B5A 0x6280 #CJK UNIFIED IDEOGRAPH +0x8B5B 0x64EC #CJK UNIFIED IDEOGRAPH +0x8B5C 0x6B3A #CJK UNIFIED IDEOGRAPH +0x8B5D 0x72A0 #CJK UNIFIED IDEOGRAPH +0x8B5E 0x7591 #CJK UNIFIED IDEOGRAPH +0x8B5F 0x7947 #CJK UNIFIED IDEOGRAPH +0x8B60 0x7FA9 #CJK UNIFIED IDEOGRAPH +0x8B61 0x87FB #CJK UNIFIED IDEOGRAPH +0x8B62 0x8ABC #CJK UNIFIED IDEOGRAPH +0x8B63 0x8B70 #CJK UNIFIED IDEOGRAPH +0x8B64 0x63AC #CJK UNIFIED IDEOGRAPH +0x8B65 0x83CA #CJK UNIFIED IDEOGRAPH +0x8B66 0x97A0 #CJK UNIFIED IDEOGRAPH +0x8B67 0x5409 #CJK UNIFIED IDEOGRAPH +0x8B68 0x5403 #CJK UNIFIED IDEOGRAPH +0x8B69 0x55AB #CJK UNIFIED IDEOGRAPH +0x8B6A 0x6854 #CJK UNIFIED IDEOGRAPH +0x8B6B 0x6A58 #CJK UNIFIED IDEOGRAPH +0x8B6C 0x8A70 #CJK UNIFIED IDEOGRAPH +0x8B6D 0x7827 #CJK UNIFIED IDEOGRAPH +0x8B6E 0x6775 #CJK UNIFIED IDEOGRAPH +0x8B6F 0x9ECD #CJK UNIFIED IDEOGRAPH +0x8B70 0x5374 #CJK UNIFIED IDEOGRAPH +0x8B71 0x5BA2 #CJK UNIFIED IDEOGRAPH +0x8B72 0x811A #CJK UNIFIED IDEOGRAPH +0x8B73 0x8650 #CJK UNIFIED IDEOGRAPH +0x8B74 0x9006 #CJK UNIFIED IDEOGRAPH +0x8B75 0x4E18 #CJK UNIFIED IDEOGRAPH +0x8B76 0x4E45 #CJK UNIFIED IDEOGRAPH +0x8B77 0x4EC7 #CJK UNIFIED IDEOGRAPH +0x8B78 0x4F11 #CJK UNIFIED IDEOGRAPH +0x8B79 0x53CA #CJK UNIFIED IDEOGRAPH +0x8B7A 0x5438 #CJK UNIFIED IDEOGRAPH +0x8B7B 0x5BAE #CJK UNIFIED IDEOGRAPH +0x8B7C 0x5F13 #CJK UNIFIED IDEOGRAPH +0x8B7D 0x6025 #CJK UNIFIED IDEOGRAPH +0x8B7E 0x6551 #CJK UNIFIED IDEOGRAPH +0x8B80 0x673D #CJK UNIFIED IDEOGRAPH +0x8B81 0x6C42 #CJK UNIFIED IDEOGRAPH +0x8B82 0x6C72 #CJK UNIFIED IDEOGRAPH +0x8B83 0x6CE3 #CJK UNIFIED IDEOGRAPH +0x8B84 0x7078 #CJK UNIFIED IDEOGRAPH +0x8B85 0x7403 #CJK UNIFIED IDEOGRAPH +0x8B86 0x7A76 #CJK UNIFIED IDEOGRAPH +0x8B87 0x7AAE #CJK UNIFIED IDEOGRAPH +0x8B88 0x7B08 #CJK UNIFIED IDEOGRAPH +0x8B89 0x7D1A #CJK UNIFIED IDEOGRAPH +0x8B8A 0x7CFE #CJK UNIFIED IDEOGRAPH +0x8B8B 0x7D66 #CJK UNIFIED IDEOGRAPH +0x8B8C 0x65E7 #CJK UNIFIED IDEOGRAPH +0x8B8D 0x725B #CJK UNIFIED IDEOGRAPH +0x8B8E 0x53BB #CJK UNIFIED IDEOGRAPH +0x8B8F 0x5C45 #CJK UNIFIED IDEOGRAPH +0x8B90 0x5DE8 #CJK UNIFIED IDEOGRAPH +0x8B91 0x62D2 #CJK UNIFIED IDEOGRAPH +0x8B92 0x62E0 #CJK UNIFIED IDEOGRAPH +0x8B93 0x6319 #CJK UNIFIED IDEOGRAPH +0x8B94 0x6E20 #CJK UNIFIED IDEOGRAPH +0x8B95 0x865A #CJK UNIFIED IDEOGRAPH +0x8B96 0x8A31 #CJK UNIFIED IDEOGRAPH +0x8B97 0x8DDD #CJK UNIFIED IDEOGRAPH +0x8B98 0x92F8 #CJK UNIFIED IDEOGRAPH +0x8B99 0x6F01 #CJK UNIFIED IDEOGRAPH +0x8B9A 0x79A6 #CJK UNIFIED IDEOGRAPH +0x8B9B 0x9B5A #CJK UNIFIED IDEOGRAPH +0x8B9C 0x4EA8 #CJK UNIFIED IDEOGRAPH +0x8B9D 0x4EAB #CJK UNIFIED IDEOGRAPH +0x8B9E 0x4EAC #CJK UNIFIED IDEOGRAPH +0x8B9F 0x4F9B #CJK UNIFIED IDEOGRAPH +0x8BA0 0x4FA0 #CJK UNIFIED IDEOGRAPH +0x8BA1 0x50D1 #CJK UNIFIED IDEOGRAPH +0x8BA2 0x5147 #CJK UNIFIED IDEOGRAPH +0x8BA3 0x7AF6 #CJK UNIFIED IDEOGRAPH +0x8BA4 0x5171 #CJK UNIFIED IDEOGRAPH +0x8BA5 0x51F6 #CJK UNIFIED IDEOGRAPH +0x8BA6 0x5354 #CJK UNIFIED IDEOGRAPH +0x8BA7 0x5321 #CJK UNIFIED IDEOGRAPH +0x8BA8 0x537F #CJK UNIFIED IDEOGRAPH +0x8BA9 0x53EB #CJK UNIFIED IDEOGRAPH +0x8BAA 0x55AC #CJK UNIFIED IDEOGRAPH +0x8BAB 0x5883 #CJK UNIFIED IDEOGRAPH +0x8BAC 0x5CE1 #CJK UNIFIED IDEOGRAPH +0x8BAD 0x5F37 #CJK UNIFIED IDEOGRAPH +0x8BAE 0x5F4A #CJK UNIFIED IDEOGRAPH +0x8BAF 0x602F #CJK UNIFIED IDEOGRAPH +0x8BB0 0x6050 #CJK UNIFIED IDEOGRAPH +0x8BB1 0x606D #CJK UNIFIED IDEOGRAPH +0x8BB2 0x631F #CJK UNIFIED IDEOGRAPH +0x8BB3 0x6559 #CJK UNIFIED IDEOGRAPH +0x8BB4 0x6A4B #CJK UNIFIED IDEOGRAPH +0x8BB5 0x6CC1 #CJK UNIFIED IDEOGRAPH +0x8BB6 0x72C2 #CJK UNIFIED IDEOGRAPH +0x8BB7 0x72ED #CJK UNIFIED IDEOGRAPH +0x8BB8 0x77EF #CJK UNIFIED IDEOGRAPH +0x8BB9 0x80F8 #CJK UNIFIED IDEOGRAPH +0x8BBA 0x8105 #CJK UNIFIED IDEOGRAPH +0x8BBB 0x8208 #CJK UNIFIED IDEOGRAPH +0x8BBC 0x854E #CJK UNIFIED IDEOGRAPH +0x8BBD 0x90F7 #CJK UNIFIED IDEOGRAPH +0x8BBE 0x93E1 #CJK UNIFIED IDEOGRAPH +0x8BBF 0x97FF #CJK UNIFIED IDEOGRAPH +0x8BC0 0x9957 #CJK UNIFIED IDEOGRAPH +0x8BC1 0x9A5A #CJK UNIFIED IDEOGRAPH +0x8BC2 0x4EF0 #CJK UNIFIED IDEOGRAPH +0x8BC3 0x51DD #CJK UNIFIED IDEOGRAPH +0x8BC4 0x5C2D #CJK UNIFIED IDEOGRAPH +0x8BC5 0x6681 #CJK UNIFIED IDEOGRAPH +0x8BC6 0x696D #CJK UNIFIED IDEOGRAPH +0x8BC7 0x5C40 #CJK UNIFIED IDEOGRAPH +0x8BC8 0x66F2 #CJK UNIFIED IDEOGRAPH +0x8BC9 0x6975 #CJK UNIFIED IDEOGRAPH +0x8BCA 0x7389 #CJK UNIFIED IDEOGRAPH +0x8BCB 0x6850 #CJK UNIFIED IDEOGRAPH +0x8BCC 0x7C81 #CJK UNIFIED IDEOGRAPH +0x8BCD 0x50C5 #CJK UNIFIED IDEOGRAPH +0x8BCE 0x52E4 #CJK UNIFIED IDEOGRAPH +0x8BCF 0x5747 #CJK UNIFIED IDEOGRAPH +0x8BD0 0x5DFE #CJK UNIFIED IDEOGRAPH +0x8BD1 0x9326 #CJK UNIFIED IDEOGRAPH +0x8BD2 0x65A4 #CJK UNIFIED IDEOGRAPH +0x8BD3 0x6B23 #CJK UNIFIED IDEOGRAPH +0x8BD4 0x6B3D #CJK UNIFIED IDEOGRAPH +0x8BD5 0x7434 #CJK UNIFIED IDEOGRAPH +0x8BD6 0x7981 #CJK UNIFIED IDEOGRAPH +0x8BD7 0x79BD #CJK UNIFIED IDEOGRAPH +0x8BD8 0x7B4B #CJK UNIFIED IDEOGRAPH +0x8BD9 0x7DCA #CJK UNIFIED IDEOGRAPH +0x8BDA 0x82B9 #CJK UNIFIED IDEOGRAPH +0x8BDB 0x83CC #CJK UNIFIED IDEOGRAPH +0x8BDC 0x887F #CJK UNIFIED IDEOGRAPH +0x8BDD 0x895F #CJK UNIFIED IDEOGRAPH +0x8BDE 0x8B39 #CJK UNIFIED IDEOGRAPH +0x8BDF 0x8FD1 #CJK UNIFIED IDEOGRAPH +0x8BE0 0x91D1 #CJK UNIFIED IDEOGRAPH +0x8BE1 0x541F #CJK UNIFIED IDEOGRAPH +0x8BE2 0x9280 #CJK UNIFIED IDEOGRAPH +0x8BE3 0x4E5D #CJK UNIFIED IDEOGRAPH +0x8BE4 0x5036 #CJK UNIFIED IDEOGRAPH +0x8BE5 0x53E5 #CJK UNIFIED IDEOGRAPH +0x8BE6 0x533A #CJK UNIFIED IDEOGRAPH +0x8BE7 0x72D7 #CJK UNIFIED IDEOGRAPH +0x8BE8 0x7396 #CJK UNIFIED IDEOGRAPH +0x8BE9 0x77E9 #CJK UNIFIED IDEOGRAPH +0x8BEA 0x82E6 #CJK UNIFIED IDEOGRAPH +0x8BEB 0x8EAF #CJK UNIFIED IDEOGRAPH +0x8BEC 0x99C6 #CJK UNIFIED IDEOGRAPH +0x8BED 0x99C8 #CJK UNIFIED IDEOGRAPH +0x8BEE 0x99D2 #CJK UNIFIED IDEOGRAPH +0x8BEF 0x5177 #CJK UNIFIED IDEOGRAPH +0x8BF0 0x611A #CJK UNIFIED IDEOGRAPH +0x8BF1 0x865E #CJK UNIFIED IDEOGRAPH +0x8BF2 0x55B0 #CJK UNIFIED IDEOGRAPH +0x8BF3 0x7A7A #CJK UNIFIED IDEOGRAPH +0x8BF4 0x5076 #CJK UNIFIED IDEOGRAPH +0x8BF5 0x5BD3 #CJK UNIFIED IDEOGRAPH +0x8BF6 0x9047 #CJK UNIFIED IDEOGRAPH +0x8BF7 0x9685 #CJK UNIFIED IDEOGRAPH +0x8BF8 0x4E32 #CJK UNIFIED IDEOGRAPH +0x8BF9 0x6ADB #CJK UNIFIED IDEOGRAPH +0x8BFA 0x91E7 #CJK UNIFIED IDEOGRAPH +0x8BFB 0x5C51 #CJK UNIFIED IDEOGRAPH +0x8BFC 0x5C48 #CJK UNIFIED IDEOGRAPH +0x8C40 0x6398 #CJK UNIFIED IDEOGRAPH +0x8C41 0x7A9F #CJK UNIFIED IDEOGRAPH +0x8C42 0x6C93 #CJK UNIFIED IDEOGRAPH +0x8C43 0x9774 #CJK UNIFIED IDEOGRAPH +0x8C44 0x8F61 #CJK UNIFIED IDEOGRAPH +0x8C45 0x7AAA #CJK UNIFIED IDEOGRAPH +0x8C46 0x718A #CJK UNIFIED IDEOGRAPH +0x8C47 0x9688 #CJK UNIFIED IDEOGRAPH +0x8C48 0x7C82 #CJK UNIFIED IDEOGRAPH +0x8C49 0x6817 #CJK UNIFIED IDEOGRAPH +0x8C4A 0x7E70 #CJK UNIFIED IDEOGRAPH +0x8C4B 0x6851 #CJK UNIFIED IDEOGRAPH +0x8C4C 0x936C #CJK UNIFIED IDEOGRAPH +0x8C4D 0x52F2 #CJK UNIFIED IDEOGRAPH +0x8C4E 0x541B #CJK UNIFIED IDEOGRAPH +0x8C4F 0x85AB #CJK UNIFIED IDEOGRAPH +0x8C50 0x8A13 #CJK UNIFIED IDEOGRAPH +0x8C51 0x7FA4 #CJK UNIFIED IDEOGRAPH +0x8C52 0x8ECD #CJK UNIFIED IDEOGRAPH +0x8C53 0x90E1 #CJK UNIFIED IDEOGRAPH +0x8C54 0x5366 #CJK UNIFIED IDEOGRAPH +0x8C55 0x8888 #CJK UNIFIED IDEOGRAPH +0x8C56 0x7941 #CJK UNIFIED IDEOGRAPH +0x8C57 0x4FC2 #CJK UNIFIED IDEOGRAPH +0x8C58 0x50BE #CJK UNIFIED IDEOGRAPH +0x8C59 0x5211 #CJK UNIFIED IDEOGRAPH +0x8C5A 0x5144 #CJK UNIFIED IDEOGRAPH +0x8C5B 0x5553 #CJK UNIFIED IDEOGRAPH +0x8C5C 0x572D #CJK UNIFIED IDEOGRAPH +0x8C5D 0x73EA #CJK UNIFIED IDEOGRAPH +0x8C5E 0x578B #CJK UNIFIED IDEOGRAPH +0x8C5F 0x5951 #CJK UNIFIED IDEOGRAPH +0x8C60 0x5F62 #CJK UNIFIED IDEOGRAPH +0x8C61 0x5F84 #CJK UNIFIED IDEOGRAPH +0x8C62 0x6075 #CJK UNIFIED IDEOGRAPH +0x8C63 0x6176 #CJK UNIFIED IDEOGRAPH +0x8C64 0x6167 #CJK UNIFIED IDEOGRAPH +0x8C65 0x61A9 #CJK UNIFIED IDEOGRAPH +0x8C66 0x63B2 #CJK UNIFIED IDEOGRAPH +0x8C67 0x643A #CJK UNIFIED IDEOGRAPH +0x8C68 0x656C #CJK UNIFIED IDEOGRAPH +0x8C69 0x666F #CJK UNIFIED IDEOGRAPH +0x8C6A 0x6842 #CJK UNIFIED IDEOGRAPH +0x8C6B 0x6E13 #CJK UNIFIED IDEOGRAPH +0x8C6C 0x7566 #CJK UNIFIED IDEOGRAPH +0x8C6D 0x7A3D #CJK UNIFIED IDEOGRAPH +0x8C6E 0x7CFB #CJK UNIFIED IDEOGRAPH +0x8C6F 0x7D4C #CJK UNIFIED IDEOGRAPH +0x8C70 0x7D99 #CJK UNIFIED IDEOGRAPH +0x8C71 0x7E4B #CJK UNIFIED IDEOGRAPH +0x8C72 0x7F6B #CJK UNIFIED IDEOGRAPH +0x8C73 0x830E #CJK UNIFIED IDEOGRAPH +0x8C74 0x834A #CJK UNIFIED IDEOGRAPH +0x8C75 0x86CD #CJK UNIFIED IDEOGRAPH +0x8C76 0x8A08 #CJK UNIFIED IDEOGRAPH +0x8C77 0x8A63 #CJK UNIFIED IDEOGRAPH +0x8C78 0x8B66 #CJK UNIFIED IDEOGRAPH +0x8C79 0x8EFD #CJK UNIFIED IDEOGRAPH +0x8C7A 0x981A #CJK UNIFIED IDEOGRAPH +0x8C7B 0x9D8F #CJK UNIFIED IDEOGRAPH +0x8C7C 0x82B8 #CJK UNIFIED IDEOGRAPH +0x8C7D 0x8FCE #CJK UNIFIED IDEOGRAPH +0x8C7E 0x9BE8 #CJK UNIFIED IDEOGRAPH +0x8C80 0x5287 #CJK UNIFIED IDEOGRAPH +0x8C81 0x621F #CJK UNIFIED IDEOGRAPH +0x8C82 0x6483 #CJK UNIFIED IDEOGRAPH +0x8C83 0x6FC0 #CJK UNIFIED IDEOGRAPH +0x8C84 0x9699 #CJK UNIFIED IDEOGRAPH +0x8C85 0x6841 #CJK UNIFIED IDEOGRAPH +0x8C86 0x5091 #CJK UNIFIED IDEOGRAPH +0x8C87 0x6B20 #CJK UNIFIED IDEOGRAPH +0x8C88 0x6C7A #CJK UNIFIED IDEOGRAPH +0x8C89 0x6F54 #CJK UNIFIED IDEOGRAPH +0x8C8A 0x7A74 #CJK UNIFIED IDEOGRAPH +0x8C8B 0x7D50 #CJK UNIFIED IDEOGRAPH +0x8C8C 0x8840 #CJK UNIFIED IDEOGRAPH +0x8C8D 0x8A23 #CJK UNIFIED IDEOGRAPH +0x8C8E 0x6708 #CJK UNIFIED IDEOGRAPH +0x8C8F 0x4EF6 #CJK UNIFIED IDEOGRAPH +0x8C90 0x5039 #CJK UNIFIED IDEOGRAPH +0x8C91 0x5026 #CJK UNIFIED IDEOGRAPH +0x8C92 0x5065 #CJK UNIFIED IDEOGRAPH +0x8C93 0x517C #CJK UNIFIED IDEOGRAPH +0x8C94 0x5238 #CJK UNIFIED IDEOGRAPH +0x8C95 0x5263 #CJK UNIFIED IDEOGRAPH +0x8C96 0x55A7 #CJK UNIFIED IDEOGRAPH +0x8C97 0x570F #CJK UNIFIED IDEOGRAPH +0x8C98 0x5805 #CJK UNIFIED IDEOGRAPH +0x8C99 0x5ACC #CJK UNIFIED IDEOGRAPH +0x8C9A 0x5EFA #CJK UNIFIED IDEOGRAPH +0x8C9B 0x61B2 #CJK UNIFIED IDEOGRAPH +0x8C9C 0x61F8 #CJK UNIFIED IDEOGRAPH +0x8C9D 0x62F3 #CJK UNIFIED IDEOGRAPH +0x8C9E 0x6372 #CJK UNIFIED IDEOGRAPH +0x8C9F 0x691C #CJK UNIFIED IDEOGRAPH +0x8CA0 0x6A29 #CJK UNIFIED IDEOGRAPH +0x8CA1 0x727D #CJK UNIFIED IDEOGRAPH +0x8CA2 0x72AC #CJK UNIFIED IDEOGRAPH +0x8CA3 0x732E #CJK UNIFIED IDEOGRAPH +0x8CA4 0x7814 #CJK UNIFIED IDEOGRAPH +0x8CA5 0x786F #CJK UNIFIED IDEOGRAPH +0x8CA6 0x7D79 #CJK UNIFIED IDEOGRAPH +0x8CA7 0x770C #CJK UNIFIED IDEOGRAPH +0x8CA8 0x80A9 #CJK UNIFIED IDEOGRAPH +0x8CA9 0x898B #CJK UNIFIED IDEOGRAPH +0x8CAA 0x8B19 #CJK UNIFIED IDEOGRAPH +0x8CAB 0x8CE2 #CJK UNIFIED IDEOGRAPH +0x8CAC 0x8ED2 #CJK UNIFIED IDEOGRAPH +0x8CAD 0x9063 #CJK UNIFIED IDEOGRAPH +0x8CAE 0x9375 #CJK UNIFIED IDEOGRAPH +0x8CAF 0x967A #CJK UNIFIED IDEOGRAPH +0x8CB0 0x9855 #CJK UNIFIED IDEOGRAPH +0x8CB1 0x9A13 #CJK UNIFIED IDEOGRAPH +0x8CB2 0x9E78 #CJK UNIFIED IDEOGRAPH +0x8CB3 0x5143 #CJK UNIFIED IDEOGRAPH +0x8CB4 0x539F #CJK UNIFIED IDEOGRAPH +0x8CB5 0x53B3 #CJK UNIFIED IDEOGRAPH +0x8CB6 0x5E7B #CJK UNIFIED IDEOGRAPH +0x8CB7 0x5F26 #CJK UNIFIED IDEOGRAPH +0x8CB8 0x6E1B #CJK UNIFIED IDEOGRAPH +0x8CB9 0x6E90 #CJK UNIFIED IDEOGRAPH +0x8CBA 0x7384 #CJK UNIFIED IDEOGRAPH +0x8CBB 0x73FE #CJK UNIFIED IDEOGRAPH +0x8CBC 0x7D43 #CJK UNIFIED IDEOGRAPH +0x8CBD 0x8237 #CJK UNIFIED IDEOGRAPH +0x8CBE 0x8A00 #CJK UNIFIED IDEOGRAPH +0x8CBF 0x8AFA #CJK UNIFIED IDEOGRAPH +0x8CC0 0x9650 #CJK UNIFIED IDEOGRAPH +0x8CC1 0x4E4E #CJK UNIFIED IDEOGRAPH +0x8CC2 0x500B #CJK UNIFIED IDEOGRAPH +0x8CC3 0x53E4 #CJK UNIFIED IDEOGRAPH +0x8CC4 0x547C #CJK UNIFIED IDEOGRAPH +0x8CC5 0x56FA #CJK UNIFIED IDEOGRAPH +0x8CC6 0x59D1 #CJK UNIFIED IDEOGRAPH +0x8CC7 0x5B64 #CJK UNIFIED IDEOGRAPH +0x8CC8 0x5DF1 #CJK UNIFIED IDEOGRAPH +0x8CC9 0x5EAB #CJK UNIFIED IDEOGRAPH +0x8CCA 0x5F27 #CJK UNIFIED IDEOGRAPH +0x8CCB 0x6238 #CJK UNIFIED IDEOGRAPH +0x8CCC 0x6545 #CJK UNIFIED IDEOGRAPH +0x8CCD 0x67AF #CJK UNIFIED IDEOGRAPH +0x8CCE 0x6E56 #CJK UNIFIED IDEOGRAPH +0x8CCF 0x72D0 #CJK UNIFIED IDEOGRAPH +0x8CD0 0x7CCA #CJK UNIFIED IDEOGRAPH +0x8CD1 0x88B4 #CJK UNIFIED IDEOGRAPH +0x8CD2 0x80A1 #CJK UNIFIED IDEOGRAPH +0x8CD3 0x80E1 #CJK UNIFIED IDEOGRAPH +0x8CD4 0x83F0 #CJK UNIFIED IDEOGRAPH +0x8CD5 0x864E #CJK UNIFIED IDEOGRAPH +0x8CD6 0x8A87 #CJK UNIFIED IDEOGRAPH +0x8CD7 0x8DE8 #CJK UNIFIED IDEOGRAPH +0x8CD8 0x9237 #CJK UNIFIED IDEOGRAPH +0x8CD9 0x96C7 #CJK UNIFIED IDEOGRAPH +0x8CDA 0x9867 #CJK UNIFIED IDEOGRAPH +0x8CDB 0x9F13 #CJK UNIFIED IDEOGRAPH +0x8CDC 0x4E94 #CJK UNIFIED IDEOGRAPH +0x8CDD 0x4E92 #CJK UNIFIED IDEOGRAPH +0x8CDE 0x4F0D #CJK UNIFIED IDEOGRAPH +0x8CDF 0x5348 #CJK UNIFIED IDEOGRAPH +0x8CE0 0x5449 #CJK UNIFIED IDEOGRAPH +0x8CE1 0x543E #CJK UNIFIED IDEOGRAPH +0x8CE2 0x5A2F #CJK UNIFIED IDEOGRAPH +0x8CE3 0x5F8C #CJK UNIFIED IDEOGRAPH +0x8CE4 0x5FA1 #CJK UNIFIED IDEOGRAPH +0x8CE5 0x609F #CJK UNIFIED IDEOGRAPH +0x8CE6 0x68A7 #CJK UNIFIED IDEOGRAPH +0x8CE7 0x6A8E #CJK UNIFIED IDEOGRAPH +0x8CE8 0x745A #CJK UNIFIED IDEOGRAPH +0x8CE9 0x7881 #CJK UNIFIED IDEOGRAPH +0x8CEA 0x8A9E #CJK UNIFIED IDEOGRAPH +0x8CEB 0x8AA4 #CJK UNIFIED IDEOGRAPH +0x8CEC 0x8B77 #CJK UNIFIED IDEOGRAPH +0x8CED 0x9190 #CJK UNIFIED IDEOGRAPH +0x8CEE 0x4E5E #CJK UNIFIED IDEOGRAPH +0x8CEF 0x9BC9 #CJK UNIFIED IDEOGRAPH +0x8CF0 0x4EA4 #CJK UNIFIED IDEOGRAPH +0x8CF1 0x4F7C #CJK UNIFIED IDEOGRAPH +0x8CF2 0x4FAF #CJK UNIFIED IDEOGRAPH +0x8CF3 0x5019 #CJK UNIFIED IDEOGRAPH +0x8CF4 0x5016 #CJK UNIFIED IDEOGRAPH +0x8CF5 0x5149 #CJK UNIFIED IDEOGRAPH +0x8CF6 0x516C #CJK UNIFIED IDEOGRAPH +0x8CF7 0x529F #CJK UNIFIED IDEOGRAPH +0x8CF8 0x52B9 #CJK UNIFIED IDEOGRAPH +0x8CF9 0x52FE #CJK UNIFIED IDEOGRAPH +0x8CFA 0x539A #CJK UNIFIED IDEOGRAPH +0x8CFB 0x53E3 #CJK UNIFIED IDEOGRAPH +0x8CFC 0x5411 #CJK UNIFIED IDEOGRAPH +0x8D40 0x540E #CJK UNIFIED IDEOGRAPH +0x8D41 0x5589 #CJK UNIFIED IDEOGRAPH +0x8D42 0x5751 #CJK UNIFIED IDEOGRAPH +0x8D43 0x57A2 #CJK UNIFIED IDEOGRAPH +0x8D44 0x597D #CJK UNIFIED IDEOGRAPH +0x8D45 0x5B54 #CJK UNIFIED IDEOGRAPH +0x8D46 0x5B5D #CJK UNIFIED IDEOGRAPH +0x8D47 0x5B8F #CJK UNIFIED IDEOGRAPH +0x8D48 0x5DE5 #CJK UNIFIED IDEOGRAPH +0x8D49 0x5DE7 #CJK UNIFIED IDEOGRAPH +0x8D4A 0x5DF7 #CJK UNIFIED IDEOGRAPH +0x8D4B 0x5E78 #CJK UNIFIED IDEOGRAPH +0x8D4C 0x5E83 #CJK UNIFIED IDEOGRAPH +0x8D4D 0x5E9A #CJK UNIFIED IDEOGRAPH +0x8D4E 0x5EB7 #CJK UNIFIED IDEOGRAPH +0x8D4F 0x5F18 #CJK UNIFIED IDEOGRAPH +0x8D50 0x6052 #CJK UNIFIED IDEOGRAPH +0x8D51 0x614C #CJK UNIFIED IDEOGRAPH +0x8D52 0x6297 #CJK UNIFIED IDEOGRAPH +0x8D53 0x62D8 #CJK UNIFIED IDEOGRAPH +0x8D54 0x63A7 #CJK UNIFIED IDEOGRAPH +0x8D55 0x653B #CJK UNIFIED IDEOGRAPH +0x8D56 0x6602 #CJK UNIFIED IDEOGRAPH +0x8D57 0x6643 #CJK UNIFIED IDEOGRAPH +0x8D58 0x66F4 #CJK UNIFIED IDEOGRAPH +0x8D59 0x676D #CJK UNIFIED IDEOGRAPH +0x8D5A 0x6821 #CJK UNIFIED IDEOGRAPH +0x8D5B 0x6897 #CJK UNIFIED IDEOGRAPH +0x8D5C 0x69CB #CJK UNIFIED IDEOGRAPH +0x8D5D 0x6C5F #CJK UNIFIED IDEOGRAPH +0x8D5E 0x6D2A #CJK UNIFIED IDEOGRAPH +0x8D5F 0x6D69 #CJK UNIFIED IDEOGRAPH +0x8D60 0x6E2F #CJK UNIFIED IDEOGRAPH +0x8D61 0x6E9D #CJK UNIFIED IDEOGRAPH +0x8D62 0x7532 #CJK UNIFIED IDEOGRAPH +0x8D63 0x7687 #CJK UNIFIED IDEOGRAPH +0x8D64 0x786C #CJK UNIFIED IDEOGRAPH +0x8D65 0x7A3F #CJK UNIFIED IDEOGRAPH +0x8D66 0x7CE0 #CJK UNIFIED IDEOGRAPH +0x8D67 0x7D05 #CJK UNIFIED IDEOGRAPH +0x8D68 0x7D18 #CJK UNIFIED IDEOGRAPH +0x8D69 0x7D5E #CJK UNIFIED IDEOGRAPH +0x8D6A 0x7DB1 #CJK UNIFIED IDEOGRAPH +0x8D6B 0x8015 #CJK UNIFIED IDEOGRAPH +0x8D6C 0x8003 #CJK UNIFIED IDEOGRAPH +0x8D6D 0x80AF #CJK UNIFIED IDEOGRAPH +0x8D6E 0x80B1 #CJK UNIFIED IDEOGRAPH +0x8D6F 0x8154 #CJK UNIFIED IDEOGRAPH +0x8D70 0x818F #CJK UNIFIED IDEOGRAPH +0x8D71 0x822A #CJK UNIFIED IDEOGRAPH +0x8D72 0x8352 #CJK UNIFIED IDEOGRAPH +0x8D73 0x884C #CJK UNIFIED IDEOGRAPH +0x8D74 0x8861 #CJK UNIFIED IDEOGRAPH +0x8D75 0x8B1B #CJK UNIFIED IDEOGRAPH +0x8D76 0x8CA2 #CJK UNIFIED IDEOGRAPH +0x8D77 0x8CFC #CJK UNIFIED IDEOGRAPH +0x8D78 0x90CA #CJK UNIFIED IDEOGRAPH +0x8D79 0x9175 #CJK UNIFIED IDEOGRAPH +0x8D7A 0x9271 #CJK UNIFIED IDEOGRAPH +0x8D7B 0x783F #CJK UNIFIED IDEOGRAPH +0x8D7C 0x92FC #CJK UNIFIED IDEOGRAPH +0x8D7D 0x95A4 #CJK UNIFIED IDEOGRAPH +0x8D7E 0x964D #CJK UNIFIED IDEOGRAPH +0x8D80 0x9805 #CJK UNIFIED IDEOGRAPH +0x8D81 0x9999 #CJK UNIFIED IDEOGRAPH +0x8D82 0x9AD8 #CJK UNIFIED IDEOGRAPH +0x8D83 0x9D3B #CJK UNIFIED IDEOGRAPH +0x8D84 0x525B #CJK UNIFIED IDEOGRAPH +0x8D85 0x52AB #CJK UNIFIED IDEOGRAPH +0x8D86 0x53F7 #CJK UNIFIED IDEOGRAPH +0x8D87 0x5408 #CJK UNIFIED IDEOGRAPH +0x8D88 0x58D5 #CJK UNIFIED IDEOGRAPH +0x8D89 0x62F7 #CJK UNIFIED IDEOGRAPH +0x8D8A 0x6FE0 #CJK UNIFIED IDEOGRAPH +0x8D8B 0x8C6A #CJK UNIFIED IDEOGRAPH +0x8D8C 0x8F5F #CJK UNIFIED IDEOGRAPH +0x8D8D 0x9EB9 #CJK UNIFIED IDEOGRAPH +0x8D8E 0x514B #CJK UNIFIED IDEOGRAPH +0x8D8F 0x523B #CJK UNIFIED IDEOGRAPH +0x8D90 0x544A #CJK UNIFIED IDEOGRAPH +0x8D91 0x56FD #CJK UNIFIED IDEOGRAPH +0x8D92 0x7A40 #CJK UNIFIED IDEOGRAPH +0x8D93 0x9177 #CJK UNIFIED IDEOGRAPH +0x8D94 0x9D60 #CJK UNIFIED IDEOGRAPH +0x8D95 0x9ED2 #CJK UNIFIED IDEOGRAPH +0x8D96 0x7344 #CJK UNIFIED IDEOGRAPH +0x8D97 0x6F09 #CJK UNIFIED IDEOGRAPH +0x8D98 0x8170 #CJK UNIFIED IDEOGRAPH +0x8D99 0x7511 #CJK UNIFIED IDEOGRAPH +0x8D9A 0x5FFD #CJK UNIFIED IDEOGRAPH +0x8D9B 0x60DA #CJK UNIFIED IDEOGRAPH +0x8D9C 0x9AA8 #CJK UNIFIED IDEOGRAPH +0x8D9D 0x72DB #CJK UNIFIED IDEOGRAPH +0x8D9E 0x8FBC #CJK UNIFIED IDEOGRAPH +0x8D9F 0x6B64 #CJK UNIFIED IDEOGRAPH +0x8DA0 0x9803 #CJK UNIFIED IDEOGRAPH +0x8DA1 0x4ECA #CJK UNIFIED IDEOGRAPH +0x8DA2 0x56F0 #CJK UNIFIED IDEOGRAPH +0x8DA3 0x5764 #CJK UNIFIED IDEOGRAPH +0x8DA4 0x58BE #CJK UNIFIED IDEOGRAPH +0x8DA5 0x5A5A #CJK UNIFIED IDEOGRAPH +0x8DA6 0x6068 #CJK UNIFIED IDEOGRAPH +0x8DA7 0x61C7 #CJK UNIFIED IDEOGRAPH +0x8DA8 0x660F #CJK UNIFIED IDEOGRAPH +0x8DA9 0x6606 #CJK UNIFIED IDEOGRAPH +0x8DAA 0x6839 #CJK UNIFIED IDEOGRAPH +0x8DAB 0x68B1 #CJK UNIFIED IDEOGRAPH +0x8DAC 0x6DF7 #CJK UNIFIED IDEOGRAPH +0x8DAD 0x75D5 #CJK UNIFIED IDEOGRAPH +0x8DAE 0x7D3A #CJK UNIFIED IDEOGRAPH +0x8DAF 0x826E #CJK UNIFIED IDEOGRAPH +0x8DB0 0x9B42 #CJK UNIFIED IDEOGRAPH +0x8DB1 0x4E9B #CJK UNIFIED IDEOGRAPH +0x8DB2 0x4F50 #CJK UNIFIED IDEOGRAPH +0x8DB3 0x53C9 #CJK UNIFIED IDEOGRAPH +0x8DB4 0x5506 #CJK UNIFIED IDEOGRAPH +0x8DB5 0x5D6F #CJK UNIFIED IDEOGRAPH +0x8DB6 0x5DE6 #CJK UNIFIED IDEOGRAPH +0x8DB7 0x5DEE #CJK UNIFIED IDEOGRAPH +0x8DB8 0x67FB #CJK UNIFIED IDEOGRAPH +0x8DB9 0x6C99 #CJK UNIFIED IDEOGRAPH +0x8DBA 0x7473 #CJK UNIFIED IDEOGRAPH +0x8DBB 0x7802 #CJK UNIFIED IDEOGRAPH +0x8DBC 0x8A50 #CJK UNIFIED IDEOGRAPH +0x8DBD 0x9396 #CJK UNIFIED IDEOGRAPH +0x8DBE 0x88DF #CJK UNIFIED IDEOGRAPH +0x8DBF 0x5750 #CJK UNIFIED IDEOGRAPH +0x8DC0 0x5EA7 #CJK UNIFIED IDEOGRAPH +0x8DC1 0x632B #CJK UNIFIED IDEOGRAPH +0x8DC2 0x50B5 #CJK UNIFIED IDEOGRAPH +0x8DC3 0x50AC #CJK UNIFIED IDEOGRAPH +0x8DC4 0x518D #CJK UNIFIED IDEOGRAPH +0x8DC5 0x6700 #CJK UNIFIED IDEOGRAPH +0x8DC6 0x54C9 #CJK UNIFIED IDEOGRAPH +0x8DC7 0x585E #CJK UNIFIED IDEOGRAPH +0x8DC8 0x59BB #CJK UNIFIED IDEOGRAPH +0x8DC9 0x5BB0 #CJK UNIFIED IDEOGRAPH +0x8DCA 0x5F69 #CJK UNIFIED IDEOGRAPH +0x8DCB 0x624D #CJK UNIFIED IDEOGRAPH +0x8DCC 0x63A1 #CJK UNIFIED IDEOGRAPH +0x8DCD 0x683D #CJK UNIFIED IDEOGRAPH +0x8DCE 0x6B73 #CJK UNIFIED IDEOGRAPH +0x8DCF 0x6E08 #CJK UNIFIED IDEOGRAPH +0x8DD0 0x707D #CJK UNIFIED IDEOGRAPH +0x8DD1 0x91C7 #CJK UNIFIED IDEOGRAPH +0x8DD2 0x7280 #CJK UNIFIED IDEOGRAPH +0x8DD3 0x7815 #CJK UNIFIED IDEOGRAPH +0x8DD4 0x7826 #CJK UNIFIED IDEOGRAPH +0x8DD5 0x796D #CJK UNIFIED IDEOGRAPH +0x8DD6 0x658E #CJK UNIFIED IDEOGRAPH +0x8DD7 0x7D30 #CJK UNIFIED IDEOGRAPH +0x8DD8 0x83DC #CJK UNIFIED IDEOGRAPH +0x8DD9 0x88C1 #CJK UNIFIED IDEOGRAPH +0x8DDA 0x8F09 #CJK UNIFIED IDEOGRAPH +0x8DDB 0x969B #CJK UNIFIED IDEOGRAPH +0x8DDC 0x5264 #CJK UNIFIED IDEOGRAPH +0x8DDD 0x5728 #CJK UNIFIED IDEOGRAPH +0x8DDE 0x6750 #CJK UNIFIED IDEOGRAPH +0x8DDF 0x7F6A #CJK UNIFIED IDEOGRAPH +0x8DE0 0x8CA1 #CJK UNIFIED IDEOGRAPH +0x8DE1 0x51B4 #CJK UNIFIED IDEOGRAPH +0x8DE2 0x5742 #CJK UNIFIED IDEOGRAPH +0x8DE3 0x962A #CJK UNIFIED IDEOGRAPH +0x8DE4 0x583A #CJK UNIFIED IDEOGRAPH +0x8DE5 0x698A #CJK UNIFIED IDEOGRAPH +0x8DE6 0x80B4 #CJK UNIFIED IDEOGRAPH +0x8DE7 0x54B2 #CJK UNIFIED IDEOGRAPH +0x8DE8 0x5D0E #CJK UNIFIED IDEOGRAPH +0x8DE9 0x57FC #CJK UNIFIED IDEOGRAPH +0x8DEA 0x7895 #CJK UNIFIED IDEOGRAPH +0x8DEB 0x9DFA #CJK UNIFIED IDEOGRAPH +0x8DEC 0x4F5C #CJK UNIFIED IDEOGRAPH +0x8DED 0x524A #CJK UNIFIED IDEOGRAPH +0x8DEE 0x548B #CJK UNIFIED IDEOGRAPH +0x8DEF 0x643E #CJK UNIFIED IDEOGRAPH +0x8DF0 0x6628 #CJK UNIFIED IDEOGRAPH +0x8DF1 0x6714 #CJK UNIFIED IDEOGRAPH +0x8DF2 0x67F5 #CJK UNIFIED IDEOGRAPH +0x8DF3 0x7A84 #CJK UNIFIED IDEOGRAPH +0x8DF4 0x7B56 #CJK UNIFIED IDEOGRAPH +0x8DF5 0x7D22 #CJK UNIFIED IDEOGRAPH +0x8DF6 0x932F #CJK UNIFIED IDEOGRAPH +0x8DF7 0x685C #CJK UNIFIED IDEOGRAPH +0x8DF8 0x9BAD #CJK UNIFIED IDEOGRAPH +0x8DF9 0x7B39 #CJK UNIFIED IDEOGRAPH +0x8DFA 0x5319 #CJK UNIFIED IDEOGRAPH +0x8DFB 0x518A #CJK UNIFIED IDEOGRAPH +0x8DFC 0x5237 #CJK UNIFIED IDEOGRAPH +0x8E40 0x5BDF #CJK UNIFIED IDEOGRAPH +0x8E41 0x62F6 #CJK UNIFIED IDEOGRAPH +0x8E42 0x64AE #CJK UNIFIED IDEOGRAPH +0x8E43 0x64E6 #CJK UNIFIED IDEOGRAPH +0x8E44 0x672D #CJK UNIFIED IDEOGRAPH +0x8E45 0x6BBA #CJK UNIFIED IDEOGRAPH +0x8E46 0x85A9 #CJK UNIFIED IDEOGRAPH +0x8E47 0x96D1 #CJK UNIFIED IDEOGRAPH +0x8E48 0x7690 #CJK UNIFIED IDEOGRAPH +0x8E49 0x9BD6 #CJK UNIFIED IDEOGRAPH +0x8E4A 0x634C #CJK UNIFIED IDEOGRAPH +0x8E4B 0x9306 #CJK UNIFIED IDEOGRAPH +0x8E4C 0x9BAB #CJK UNIFIED IDEOGRAPH +0x8E4D 0x76BF #CJK UNIFIED IDEOGRAPH +0x8E4E 0x6652 #CJK UNIFIED IDEOGRAPH +0x8E4F 0x4E09 #CJK UNIFIED IDEOGRAPH +0x8E50 0x5098 #CJK UNIFIED IDEOGRAPH +0x8E51 0x53C2 #CJK UNIFIED IDEOGRAPH +0x8E52 0x5C71 #CJK UNIFIED IDEOGRAPH +0x8E53 0x60E8 #CJK UNIFIED IDEOGRAPH +0x8E54 0x6492 #CJK UNIFIED IDEOGRAPH +0x8E55 0x6563 #CJK UNIFIED IDEOGRAPH +0x8E56 0x685F #CJK UNIFIED IDEOGRAPH +0x8E57 0x71E6 #CJK UNIFIED IDEOGRAPH +0x8E58 0x73CA #CJK UNIFIED IDEOGRAPH +0x8E59 0x7523 #CJK UNIFIED IDEOGRAPH +0x8E5A 0x7B97 #CJK UNIFIED IDEOGRAPH +0x8E5B 0x7E82 #CJK UNIFIED IDEOGRAPH +0x8E5C 0x8695 #CJK UNIFIED IDEOGRAPH +0x8E5D 0x8B83 #CJK UNIFIED IDEOGRAPH +0x8E5E 0x8CDB #CJK UNIFIED IDEOGRAPH +0x8E5F 0x9178 #CJK UNIFIED IDEOGRAPH +0x8E60 0x9910 #CJK UNIFIED IDEOGRAPH +0x8E61 0x65AC #CJK UNIFIED IDEOGRAPH +0x8E62 0x66AB #CJK UNIFIED IDEOGRAPH +0x8E63 0x6B8B #CJK UNIFIED IDEOGRAPH +0x8E64 0x4ED5 #CJK UNIFIED IDEOGRAPH +0x8E65 0x4ED4 #CJK UNIFIED IDEOGRAPH +0x8E66 0x4F3A #CJK UNIFIED IDEOGRAPH +0x8E67 0x4F7F #CJK UNIFIED IDEOGRAPH +0x8E68 0x523A #CJK UNIFIED IDEOGRAPH +0x8E69 0x53F8 #CJK UNIFIED IDEOGRAPH +0x8E6A 0x53F2 #CJK UNIFIED IDEOGRAPH +0x8E6B 0x55E3 #CJK UNIFIED IDEOGRAPH +0x8E6C 0x56DB #CJK UNIFIED IDEOGRAPH +0x8E6D 0x58EB #CJK UNIFIED IDEOGRAPH +0x8E6E 0x59CB #CJK UNIFIED IDEOGRAPH +0x8E6F 0x59C9 #CJK UNIFIED IDEOGRAPH +0x8E70 0x59FF #CJK UNIFIED IDEOGRAPH +0x8E71 0x5B50 #CJK UNIFIED IDEOGRAPH +0x8E72 0x5C4D #CJK UNIFIED IDEOGRAPH +0x8E73 0x5E02 #CJK UNIFIED IDEOGRAPH +0x8E74 0x5E2B #CJK UNIFIED IDEOGRAPH +0x8E75 0x5FD7 #CJK UNIFIED IDEOGRAPH +0x8E76 0x601D #CJK UNIFIED IDEOGRAPH +0x8E77 0x6307 #CJK UNIFIED IDEOGRAPH +0x8E78 0x652F #CJK UNIFIED IDEOGRAPH +0x8E79 0x5B5C #CJK UNIFIED IDEOGRAPH +0x8E7A 0x65AF #CJK UNIFIED IDEOGRAPH +0x8E7B 0x65BD #CJK UNIFIED IDEOGRAPH +0x8E7C 0x65E8 #CJK UNIFIED IDEOGRAPH +0x8E7D 0x679D #CJK UNIFIED IDEOGRAPH +0x8E7E 0x6B62 #CJK UNIFIED IDEOGRAPH +0x8E80 0x6B7B #CJK UNIFIED IDEOGRAPH +0x8E81 0x6C0F #CJK UNIFIED IDEOGRAPH +0x8E82 0x7345 #CJK UNIFIED IDEOGRAPH +0x8E83 0x7949 #CJK UNIFIED IDEOGRAPH +0x8E84 0x79C1 #CJK UNIFIED IDEOGRAPH +0x8E85 0x7CF8 #CJK UNIFIED IDEOGRAPH +0x8E86 0x7D19 #CJK UNIFIED IDEOGRAPH +0x8E87 0x7D2B #CJK UNIFIED IDEOGRAPH +0x8E88 0x80A2 #CJK UNIFIED IDEOGRAPH +0x8E89 0x8102 #CJK UNIFIED IDEOGRAPH +0x8E8A 0x81F3 #CJK UNIFIED IDEOGRAPH +0x8E8B 0x8996 #CJK UNIFIED IDEOGRAPH +0x8E8C 0x8A5E #CJK UNIFIED IDEOGRAPH +0x8E8D 0x8A69 #CJK UNIFIED IDEOGRAPH +0x8E8E 0x8A66 #CJK UNIFIED IDEOGRAPH +0x8E8F 0x8A8C #CJK UNIFIED IDEOGRAPH +0x8E90 0x8AEE #CJK UNIFIED IDEOGRAPH +0x8E91 0x8CC7 #CJK UNIFIED IDEOGRAPH +0x8E92 0x8CDC #CJK UNIFIED IDEOGRAPH +0x8E93 0x96CC #CJK UNIFIED IDEOGRAPH +0x8E94 0x98FC #CJK UNIFIED IDEOGRAPH +0x8E95 0x6B6F #CJK UNIFIED IDEOGRAPH +0x8E96 0x4E8B #CJK UNIFIED IDEOGRAPH +0x8E97 0x4F3C #CJK UNIFIED IDEOGRAPH +0x8E98 0x4F8D #CJK UNIFIED IDEOGRAPH +0x8E99 0x5150 #CJK UNIFIED IDEOGRAPH +0x8E9A 0x5B57 #CJK UNIFIED IDEOGRAPH +0x8E9B 0x5BFA #CJK UNIFIED IDEOGRAPH +0x8E9C 0x6148 #CJK UNIFIED IDEOGRAPH +0x8E9D 0x6301 #CJK UNIFIED IDEOGRAPH +0x8E9E 0x6642 #CJK UNIFIED IDEOGRAPH +0x8E9F 0x6B21 #CJK UNIFIED IDEOGRAPH +0x8EA0 0x6ECB #CJK UNIFIED IDEOGRAPH +0x8EA1 0x6CBB #CJK UNIFIED IDEOGRAPH +0x8EA2 0x723E #CJK UNIFIED IDEOGRAPH +0x8EA3 0x74BD #CJK UNIFIED IDEOGRAPH +0x8EA4 0x75D4 #CJK UNIFIED IDEOGRAPH +0x8EA5 0x78C1 #CJK UNIFIED IDEOGRAPH +0x8EA6 0x793A #CJK UNIFIED IDEOGRAPH +0x8EA7 0x800C #CJK UNIFIED IDEOGRAPH +0x8EA8 0x8033 #CJK UNIFIED IDEOGRAPH +0x8EA9 0x81EA #CJK UNIFIED IDEOGRAPH +0x8EAA 0x8494 #CJK UNIFIED IDEOGRAPH +0x8EAB 0x8F9E #CJK UNIFIED IDEOGRAPH +0x8EAC 0x6C50 #CJK UNIFIED IDEOGRAPH +0x8EAD 0x9E7F #CJK UNIFIED IDEOGRAPH +0x8EAE 0x5F0F #CJK UNIFIED IDEOGRAPH +0x8EAF 0x8B58 #CJK UNIFIED IDEOGRAPH +0x8EB0 0x9D2B #CJK UNIFIED IDEOGRAPH +0x8EB1 0x7AFA #CJK UNIFIED IDEOGRAPH +0x8EB2 0x8EF8 #CJK UNIFIED IDEOGRAPH +0x8EB3 0x5B8D #CJK UNIFIED IDEOGRAPH +0x8EB4 0x96EB #CJK UNIFIED IDEOGRAPH +0x8EB5 0x4E03 #CJK UNIFIED IDEOGRAPH +0x8EB6 0x53F1 #CJK UNIFIED IDEOGRAPH +0x8EB7 0x57F7 #CJK UNIFIED IDEOGRAPH +0x8EB8 0x5931 #CJK UNIFIED IDEOGRAPH +0x8EB9 0x5AC9 #CJK UNIFIED IDEOGRAPH +0x8EBA 0x5BA4 #CJK UNIFIED IDEOGRAPH +0x8EBB 0x6089 #CJK UNIFIED IDEOGRAPH +0x8EBC 0x6E7F #CJK UNIFIED IDEOGRAPH +0x8EBD 0x6F06 #CJK UNIFIED IDEOGRAPH +0x8EBE 0x75BE #CJK UNIFIED IDEOGRAPH +0x8EBF 0x8CEA #CJK UNIFIED IDEOGRAPH +0x8EC0 0x5B9F #CJK UNIFIED IDEOGRAPH +0x8EC1 0x8500 #CJK UNIFIED IDEOGRAPH +0x8EC2 0x7BE0 #CJK UNIFIED IDEOGRAPH +0x8EC3 0x5072 #CJK UNIFIED IDEOGRAPH +0x8EC4 0x67F4 #CJK UNIFIED IDEOGRAPH +0x8EC5 0x829D #CJK UNIFIED IDEOGRAPH +0x8EC6 0x5C61 #CJK UNIFIED IDEOGRAPH +0x8EC7 0x854A #CJK UNIFIED IDEOGRAPH +0x8EC8 0x7E1E #CJK UNIFIED IDEOGRAPH +0x8EC9 0x820E #CJK UNIFIED IDEOGRAPH +0x8ECA 0x5199 #CJK UNIFIED IDEOGRAPH +0x8ECB 0x5C04 #CJK UNIFIED IDEOGRAPH +0x8ECC 0x6368 #CJK UNIFIED IDEOGRAPH +0x8ECD 0x8D66 #CJK UNIFIED IDEOGRAPH +0x8ECE 0x659C #CJK UNIFIED IDEOGRAPH +0x8ECF 0x716E #CJK UNIFIED IDEOGRAPH +0x8ED0 0x793E #CJK UNIFIED IDEOGRAPH +0x8ED1 0x7D17 #CJK UNIFIED IDEOGRAPH +0x8ED2 0x8005 #CJK UNIFIED IDEOGRAPH +0x8ED3 0x8B1D #CJK UNIFIED IDEOGRAPH +0x8ED4 0x8ECA #CJK UNIFIED IDEOGRAPH +0x8ED5 0x906E #CJK UNIFIED IDEOGRAPH +0x8ED6 0x86C7 #CJK UNIFIED IDEOGRAPH +0x8ED7 0x90AA #CJK UNIFIED IDEOGRAPH +0x8ED8 0x501F #CJK UNIFIED IDEOGRAPH +0x8ED9 0x52FA #CJK UNIFIED IDEOGRAPH +0x8EDA 0x5C3A #CJK UNIFIED IDEOGRAPH +0x8EDB 0x6753 #CJK UNIFIED IDEOGRAPH +0x8EDC 0x707C #CJK UNIFIED IDEOGRAPH +0x8EDD 0x7235 #CJK UNIFIED IDEOGRAPH +0x8EDE 0x914C #CJK UNIFIED IDEOGRAPH +0x8EDF 0x91C8 #CJK UNIFIED IDEOGRAPH +0x8EE0 0x932B #CJK UNIFIED IDEOGRAPH +0x8EE1 0x82E5 #CJK UNIFIED IDEOGRAPH +0x8EE2 0x5BC2 #CJK UNIFIED IDEOGRAPH +0x8EE3 0x5F31 #CJK UNIFIED IDEOGRAPH +0x8EE4 0x60F9 #CJK UNIFIED IDEOGRAPH +0x8EE5 0x4E3B #CJK UNIFIED IDEOGRAPH +0x8EE6 0x53D6 #CJK UNIFIED IDEOGRAPH +0x8EE7 0x5B88 #CJK UNIFIED IDEOGRAPH +0x8EE8 0x624B #CJK UNIFIED IDEOGRAPH +0x8EE9 0x6731 #CJK UNIFIED IDEOGRAPH +0x8EEA 0x6B8A #CJK UNIFIED IDEOGRAPH +0x8EEB 0x72E9 #CJK UNIFIED IDEOGRAPH +0x8EEC 0x73E0 #CJK UNIFIED IDEOGRAPH +0x8EED 0x7A2E #CJK UNIFIED IDEOGRAPH +0x8EEE 0x816B #CJK UNIFIED IDEOGRAPH +0x8EEF 0x8DA3 #CJK UNIFIED IDEOGRAPH +0x8EF0 0x9152 #CJK UNIFIED IDEOGRAPH +0x8EF1 0x9996 #CJK UNIFIED IDEOGRAPH +0x8EF2 0x5112 #CJK UNIFIED IDEOGRAPH +0x8EF3 0x53D7 #CJK UNIFIED IDEOGRAPH +0x8EF4 0x546A #CJK UNIFIED IDEOGRAPH +0x8EF5 0x5BFF #CJK UNIFIED IDEOGRAPH +0x8EF6 0x6388 #CJK UNIFIED IDEOGRAPH +0x8EF7 0x6A39 #CJK UNIFIED IDEOGRAPH +0x8EF8 0x7DAC #CJK UNIFIED IDEOGRAPH +0x8EF9 0x9700 #CJK UNIFIED IDEOGRAPH +0x8EFA 0x56DA #CJK UNIFIED IDEOGRAPH +0x8EFB 0x53CE #CJK UNIFIED IDEOGRAPH +0x8EFC 0x5468 #CJK UNIFIED IDEOGRAPH +0x8F40 0x5B97 #CJK UNIFIED IDEOGRAPH +0x8F41 0x5C31 #CJK UNIFIED IDEOGRAPH +0x8F42 0x5DDE #CJK UNIFIED IDEOGRAPH +0x8F43 0x4FEE #CJK UNIFIED IDEOGRAPH +0x8F44 0x6101 #CJK UNIFIED IDEOGRAPH +0x8F45 0x62FE #CJK UNIFIED IDEOGRAPH +0x8F46 0x6D32 #CJK UNIFIED IDEOGRAPH +0x8F47 0x79C0 #CJK UNIFIED IDEOGRAPH +0x8F48 0x79CB #CJK UNIFIED IDEOGRAPH +0x8F49 0x7D42 #CJK UNIFIED IDEOGRAPH +0x8F4A 0x7E4D #CJK UNIFIED IDEOGRAPH +0x8F4B 0x7FD2 #CJK UNIFIED IDEOGRAPH +0x8F4C 0x81ED #CJK UNIFIED IDEOGRAPH +0x8F4D 0x821F #CJK UNIFIED IDEOGRAPH +0x8F4E 0x8490 #CJK UNIFIED IDEOGRAPH +0x8F4F 0x8846 #CJK UNIFIED IDEOGRAPH +0x8F50 0x8972 #CJK UNIFIED IDEOGRAPH +0x8F51 0x8B90 #CJK UNIFIED IDEOGRAPH +0x8F52 0x8E74 #CJK UNIFIED IDEOGRAPH +0x8F53 0x8F2F #CJK UNIFIED IDEOGRAPH +0x8F54 0x9031 #CJK UNIFIED IDEOGRAPH +0x8F55 0x914B #CJK UNIFIED IDEOGRAPH +0x8F56 0x916C #CJK UNIFIED IDEOGRAPH +0x8F57 0x96C6 #CJK UNIFIED IDEOGRAPH +0x8F58 0x919C #CJK UNIFIED IDEOGRAPH +0x8F59 0x4EC0 #CJK UNIFIED IDEOGRAPH +0x8F5A 0x4F4F #CJK UNIFIED IDEOGRAPH +0x8F5B 0x5145 #CJK UNIFIED IDEOGRAPH +0x8F5C 0x5341 #CJK UNIFIED IDEOGRAPH +0x8F5D 0x5F93 #CJK UNIFIED IDEOGRAPH +0x8F5E 0x620E #CJK UNIFIED IDEOGRAPH +0x8F5F 0x67D4 #CJK UNIFIED IDEOGRAPH +0x8F60 0x6C41 #CJK UNIFIED IDEOGRAPH +0x8F61 0x6E0B #CJK UNIFIED IDEOGRAPH +0x8F62 0x7363 #CJK UNIFIED IDEOGRAPH +0x8F63 0x7E26 #CJK UNIFIED IDEOGRAPH +0x8F64 0x91CD #CJK UNIFIED IDEOGRAPH +0x8F65 0x9283 #CJK UNIFIED IDEOGRAPH +0x8F66 0x53D4 #CJK UNIFIED IDEOGRAPH +0x8F67 0x5919 #CJK UNIFIED IDEOGRAPH +0x8F68 0x5BBF #CJK UNIFIED IDEOGRAPH +0x8F69 0x6DD1 #CJK UNIFIED IDEOGRAPH +0x8F6A 0x795D #CJK UNIFIED IDEOGRAPH +0x8F6B 0x7E2E #CJK UNIFIED IDEOGRAPH +0x8F6C 0x7C9B #CJK UNIFIED IDEOGRAPH +0x8F6D 0x587E #CJK UNIFIED IDEOGRAPH +0x8F6E 0x719F #CJK UNIFIED IDEOGRAPH +0x8F6F 0x51FA #CJK UNIFIED IDEOGRAPH +0x8F70 0x8853 #CJK UNIFIED IDEOGRAPH +0x8F71 0x8FF0 #CJK UNIFIED IDEOGRAPH +0x8F72 0x4FCA #CJK UNIFIED IDEOGRAPH +0x8F73 0x5CFB #CJK UNIFIED IDEOGRAPH +0x8F74 0x6625 #CJK UNIFIED IDEOGRAPH +0x8F75 0x77AC #CJK UNIFIED IDEOGRAPH +0x8F76 0x7AE3 #CJK UNIFIED IDEOGRAPH +0x8F77 0x821C #CJK UNIFIED IDEOGRAPH +0x8F78 0x99FF #CJK UNIFIED IDEOGRAPH +0x8F79 0x51C6 #CJK UNIFIED IDEOGRAPH +0x8F7A 0x5FAA #CJK UNIFIED IDEOGRAPH +0x8F7B 0x65EC #CJK UNIFIED IDEOGRAPH +0x8F7C 0x696F #CJK UNIFIED IDEOGRAPH +0x8F7D 0x6B89 #CJK UNIFIED IDEOGRAPH +0x8F7E 0x6DF3 #CJK UNIFIED IDEOGRAPH +0x8F80 0x6E96 #CJK UNIFIED IDEOGRAPH +0x8F81 0x6F64 #CJK UNIFIED IDEOGRAPH +0x8F82 0x76FE #CJK UNIFIED IDEOGRAPH +0x8F83 0x7D14 #CJK UNIFIED IDEOGRAPH +0x8F84 0x5DE1 #CJK UNIFIED IDEOGRAPH +0x8F85 0x9075 #CJK UNIFIED IDEOGRAPH +0x8F86 0x9187 #CJK UNIFIED IDEOGRAPH +0x8F87 0x9806 #CJK UNIFIED IDEOGRAPH +0x8F88 0x51E6 #CJK UNIFIED IDEOGRAPH +0x8F89 0x521D #CJK UNIFIED IDEOGRAPH +0x8F8A 0x6240 #CJK UNIFIED IDEOGRAPH +0x8F8B 0x6691 #CJK UNIFIED IDEOGRAPH +0x8F8C 0x66D9 #CJK UNIFIED IDEOGRAPH +0x8F8D 0x6E1A #CJK UNIFIED IDEOGRAPH +0x8F8E 0x5EB6 #CJK UNIFIED IDEOGRAPH +0x8F8F 0x7DD2 #CJK UNIFIED IDEOGRAPH +0x8F90 0x7F72 #CJK UNIFIED IDEOGRAPH +0x8F91 0x66F8 #CJK UNIFIED IDEOGRAPH +0x8F92 0x85AF #CJK UNIFIED IDEOGRAPH +0x8F93 0x85F7 #CJK UNIFIED IDEOGRAPH +0x8F94 0x8AF8 #CJK UNIFIED IDEOGRAPH +0x8F95 0x52A9 #CJK UNIFIED IDEOGRAPH +0x8F96 0x53D9 #CJK UNIFIED IDEOGRAPH +0x8F97 0x5973 #CJK UNIFIED IDEOGRAPH +0x8F98 0x5E8F #CJK UNIFIED IDEOGRAPH +0x8F99 0x5F90 #CJK UNIFIED IDEOGRAPH +0x8F9A 0x6055 #CJK UNIFIED IDEOGRAPH +0x8F9B 0x92E4 #CJK UNIFIED IDEOGRAPH +0x8F9C 0x9664 #CJK UNIFIED IDEOGRAPH +0x8F9D 0x50B7 #CJK UNIFIED IDEOGRAPH +0x8F9E 0x511F #CJK UNIFIED IDEOGRAPH +0x8F9F 0x52DD #CJK UNIFIED IDEOGRAPH +0x8FA0 0x5320 #CJK UNIFIED IDEOGRAPH +0x8FA1 0x5347 #CJK UNIFIED IDEOGRAPH +0x8FA2 0x53EC #CJK UNIFIED IDEOGRAPH +0x8FA3 0x54E8 #CJK UNIFIED IDEOGRAPH +0x8FA4 0x5546 #CJK UNIFIED IDEOGRAPH +0x8FA5 0x5531 #CJK UNIFIED IDEOGRAPH +0x8FA6 0x5617 #CJK UNIFIED IDEOGRAPH +0x8FA7 0x5968 #CJK UNIFIED IDEOGRAPH +0x8FA8 0x59BE #CJK UNIFIED IDEOGRAPH +0x8FA9 0x5A3C #CJK UNIFIED IDEOGRAPH +0x8FAA 0x5BB5 #CJK UNIFIED IDEOGRAPH +0x8FAB 0x5C06 #CJK UNIFIED IDEOGRAPH +0x8FAC 0x5C0F #CJK UNIFIED IDEOGRAPH +0x8FAD 0x5C11 #CJK UNIFIED IDEOGRAPH +0x8FAE 0x5C1A #CJK UNIFIED IDEOGRAPH +0x8FAF 0x5E84 #CJK UNIFIED IDEOGRAPH +0x8FB0 0x5E8A #CJK UNIFIED IDEOGRAPH +0x8FB1 0x5EE0 #CJK UNIFIED IDEOGRAPH +0x8FB2 0x5F70 #CJK UNIFIED IDEOGRAPH +0x8FB3 0x627F #CJK UNIFIED IDEOGRAPH +0x8FB4 0x6284 #CJK UNIFIED IDEOGRAPH +0x8FB5 0x62DB #CJK UNIFIED IDEOGRAPH +0x8FB6 0x638C #CJK UNIFIED IDEOGRAPH +0x8FB7 0x6377 #CJK UNIFIED IDEOGRAPH +0x8FB8 0x6607 #CJK UNIFIED IDEOGRAPH +0x8FB9 0x660C #CJK UNIFIED IDEOGRAPH +0x8FBA 0x662D #CJK UNIFIED IDEOGRAPH +0x8FBB 0x6676 #CJK UNIFIED IDEOGRAPH +0x8FBC 0x677E #CJK UNIFIED IDEOGRAPH +0x8FBD 0x68A2 #CJK UNIFIED IDEOGRAPH +0x8FBE 0x6A1F #CJK UNIFIED IDEOGRAPH +0x8FBF 0x6A35 #CJK UNIFIED IDEOGRAPH +0x8FC0 0x6CBC #CJK UNIFIED IDEOGRAPH +0x8FC1 0x6D88 #CJK UNIFIED IDEOGRAPH +0x8FC2 0x6E09 #CJK UNIFIED IDEOGRAPH +0x8FC3 0x6E58 #CJK UNIFIED IDEOGRAPH +0x8FC4 0x713C #CJK UNIFIED IDEOGRAPH +0x8FC5 0x7126 #CJK UNIFIED IDEOGRAPH +0x8FC6 0x7167 #CJK UNIFIED IDEOGRAPH +0x8FC7 0x75C7 #CJK UNIFIED IDEOGRAPH +0x8FC8 0x7701 #CJK UNIFIED IDEOGRAPH +0x8FC9 0x785D #CJK UNIFIED IDEOGRAPH +0x8FCA 0x7901 #CJK UNIFIED IDEOGRAPH +0x8FCB 0x7965 #CJK UNIFIED IDEOGRAPH +0x8FCC 0x79F0 #CJK UNIFIED IDEOGRAPH +0x8FCD 0x7AE0 #CJK UNIFIED IDEOGRAPH +0x8FCE 0x7B11 #CJK UNIFIED IDEOGRAPH +0x8FCF 0x7CA7 #CJK UNIFIED IDEOGRAPH +0x8FD0 0x7D39 #CJK UNIFIED IDEOGRAPH +0x8FD1 0x8096 #CJK UNIFIED IDEOGRAPH +0x8FD2 0x83D6 #CJK UNIFIED IDEOGRAPH +0x8FD3 0x848B #CJK UNIFIED IDEOGRAPH +0x8FD4 0x8549 #CJK UNIFIED IDEOGRAPH +0x8FD5 0x885D #CJK UNIFIED IDEOGRAPH +0x8FD6 0x88F3 #CJK UNIFIED IDEOGRAPH +0x8FD7 0x8A1F #CJK UNIFIED IDEOGRAPH +0x8FD8 0x8A3C #CJK UNIFIED IDEOGRAPH +0x8FD9 0x8A54 #CJK UNIFIED IDEOGRAPH +0x8FDA 0x8A73 #CJK UNIFIED IDEOGRAPH +0x8FDB 0x8C61 #CJK UNIFIED IDEOGRAPH +0x8FDC 0x8CDE #CJK UNIFIED IDEOGRAPH +0x8FDD 0x91A4 #CJK UNIFIED IDEOGRAPH +0x8FDE 0x9266 #CJK UNIFIED IDEOGRAPH +0x8FDF 0x937E #CJK UNIFIED IDEOGRAPH +0x8FE0 0x9418 #CJK UNIFIED IDEOGRAPH +0x8FE1 0x969C #CJK UNIFIED IDEOGRAPH +0x8FE2 0x9798 #CJK UNIFIED IDEOGRAPH +0x8FE3 0x4E0A #CJK UNIFIED IDEOGRAPH +0x8FE4 0x4E08 #CJK UNIFIED IDEOGRAPH +0x8FE5 0x4E1E #CJK UNIFIED IDEOGRAPH +0x8FE6 0x4E57 #CJK UNIFIED IDEOGRAPH +0x8FE7 0x5197 #CJK UNIFIED IDEOGRAPH +0x8FE8 0x5270 #CJK UNIFIED IDEOGRAPH +0x8FE9 0x57CE #CJK UNIFIED IDEOGRAPH +0x8FEA 0x5834 #CJK UNIFIED IDEOGRAPH +0x8FEB 0x58CC #CJK UNIFIED IDEOGRAPH +0x8FEC 0x5B22 #CJK UNIFIED IDEOGRAPH +0x8FED 0x5E38 #CJK UNIFIED IDEOGRAPH +0x8FEE 0x60C5 #CJK UNIFIED IDEOGRAPH +0x8FEF 0x64FE #CJK UNIFIED IDEOGRAPH +0x8FF0 0x6761 #CJK UNIFIED IDEOGRAPH +0x8FF1 0x6756 #CJK UNIFIED IDEOGRAPH +0x8FF2 0x6D44 #CJK UNIFIED IDEOGRAPH +0x8FF3 0x72B6 #CJK UNIFIED IDEOGRAPH +0x8FF4 0x7573 #CJK UNIFIED IDEOGRAPH +0x8FF5 0x7A63 #CJK UNIFIED IDEOGRAPH +0x8FF6 0x84B8 #CJK UNIFIED IDEOGRAPH +0x8FF7 0x8B72 #CJK UNIFIED IDEOGRAPH +0x8FF8 0x91B8 #CJK UNIFIED IDEOGRAPH +0x8FF9 0x9320 #CJK UNIFIED IDEOGRAPH +0x8FFA 0x5631 #CJK UNIFIED IDEOGRAPH +0x8FFB 0x57F4 #CJK UNIFIED IDEOGRAPH +0x8FFC 0x98FE #CJK UNIFIED IDEOGRAPH +0x9040 0x62ED #CJK UNIFIED IDEOGRAPH +0x9041 0x690D #CJK UNIFIED IDEOGRAPH +0x9042 0x6B96 #CJK UNIFIED IDEOGRAPH +0x9043 0x71ED #CJK UNIFIED IDEOGRAPH +0x9044 0x7E54 #CJK UNIFIED IDEOGRAPH +0x9045 0x8077 #CJK UNIFIED IDEOGRAPH +0x9046 0x8272 #CJK UNIFIED IDEOGRAPH +0x9047 0x89E6 #CJK UNIFIED IDEOGRAPH +0x9048 0x98DF #CJK UNIFIED IDEOGRAPH +0x9049 0x8755 #CJK UNIFIED IDEOGRAPH +0x904A 0x8FB1 #CJK UNIFIED IDEOGRAPH +0x904B 0x5C3B #CJK UNIFIED IDEOGRAPH +0x904C 0x4F38 #CJK UNIFIED IDEOGRAPH +0x904D 0x4FE1 #CJK UNIFIED IDEOGRAPH +0x904E 0x4FB5 #CJK UNIFIED IDEOGRAPH +0x904F 0x5507 #CJK UNIFIED IDEOGRAPH +0x9050 0x5A20 #CJK UNIFIED IDEOGRAPH +0x9051 0x5BDD #CJK UNIFIED IDEOGRAPH +0x9052 0x5BE9 #CJK UNIFIED IDEOGRAPH +0x9053 0x5FC3 #CJK UNIFIED IDEOGRAPH +0x9054 0x614E #CJK UNIFIED IDEOGRAPH +0x9055 0x632F #CJK UNIFIED IDEOGRAPH +0x9056 0x65B0 #CJK UNIFIED IDEOGRAPH +0x9057 0x664B #CJK UNIFIED IDEOGRAPH +0x9058 0x68EE #CJK UNIFIED IDEOGRAPH +0x9059 0x699B #CJK UNIFIED IDEOGRAPH +0x905A 0x6D78 #CJK UNIFIED IDEOGRAPH +0x905B 0x6DF1 #CJK UNIFIED IDEOGRAPH +0x905C 0x7533 #CJK UNIFIED IDEOGRAPH +0x905D 0x75B9 #CJK UNIFIED IDEOGRAPH +0x905E 0x771F #CJK UNIFIED IDEOGRAPH +0x905F 0x795E #CJK UNIFIED IDEOGRAPH +0x9060 0x79E6 #CJK UNIFIED IDEOGRAPH +0x9061 0x7D33 #CJK UNIFIED IDEOGRAPH +0x9062 0x81E3 #CJK UNIFIED IDEOGRAPH +0x9063 0x82AF #CJK UNIFIED IDEOGRAPH +0x9064 0x85AA #CJK UNIFIED IDEOGRAPH +0x9065 0x89AA #CJK UNIFIED IDEOGRAPH +0x9066 0x8A3A #CJK UNIFIED IDEOGRAPH +0x9067 0x8EAB #CJK UNIFIED IDEOGRAPH +0x9068 0x8F9B #CJK UNIFIED IDEOGRAPH +0x9069 0x9032 #CJK UNIFIED IDEOGRAPH +0x906A 0x91DD #CJK UNIFIED IDEOGRAPH +0x906B 0x9707 #CJK UNIFIED IDEOGRAPH +0x906C 0x4EBA #CJK UNIFIED IDEOGRAPH +0x906D 0x4EC1 #CJK UNIFIED IDEOGRAPH +0x906E 0x5203 #CJK UNIFIED IDEOGRAPH +0x906F 0x5875 #CJK UNIFIED IDEOGRAPH +0x9070 0x58EC #CJK UNIFIED IDEOGRAPH +0x9071 0x5C0B #CJK UNIFIED IDEOGRAPH +0x9072 0x751A #CJK UNIFIED IDEOGRAPH +0x9073 0x5C3D #CJK UNIFIED IDEOGRAPH +0x9074 0x814E #CJK UNIFIED IDEOGRAPH +0x9075 0x8A0A #CJK UNIFIED IDEOGRAPH +0x9076 0x8FC5 #CJK UNIFIED IDEOGRAPH +0x9077 0x9663 #CJK UNIFIED IDEOGRAPH +0x9078 0x976D #CJK UNIFIED IDEOGRAPH +0x9079 0x7B25 #CJK UNIFIED IDEOGRAPH +0x907A 0x8ACF #CJK UNIFIED IDEOGRAPH +0x907B 0x9808 #CJK UNIFIED IDEOGRAPH +0x907C 0x9162 #CJK UNIFIED IDEOGRAPH +0x907D 0x56F3 #CJK UNIFIED IDEOGRAPH +0x907E 0x53A8 #CJK UNIFIED IDEOGRAPH +0x9080 0x9017 #CJK UNIFIED IDEOGRAPH +0x9081 0x5439 #CJK UNIFIED IDEOGRAPH +0x9082 0x5782 #CJK UNIFIED IDEOGRAPH +0x9083 0x5E25 #CJK UNIFIED IDEOGRAPH +0x9084 0x63A8 #CJK UNIFIED IDEOGRAPH +0x9085 0x6C34 #CJK UNIFIED IDEOGRAPH +0x9086 0x708A #CJK UNIFIED IDEOGRAPH +0x9087 0x7761 #CJK UNIFIED IDEOGRAPH +0x9088 0x7C8B #CJK UNIFIED IDEOGRAPH +0x9089 0x7FE0 #CJK UNIFIED IDEOGRAPH +0x908A 0x8870 #CJK UNIFIED IDEOGRAPH +0x908B 0x9042 #CJK UNIFIED IDEOGRAPH +0x908C 0x9154 #CJK UNIFIED IDEOGRAPH +0x908D 0x9310 #CJK UNIFIED IDEOGRAPH +0x908E 0x9318 #CJK UNIFIED IDEOGRAPH +0x908F 0x968F #CJK UNIFIED IDEOGRAPH +0x9090 0x745E #CJK UNIFIED IDEOGRAPH +0x9091 0x9AC4 #CJK UNIFIED IDEOGRAPH +0x9092 0x5D07 #CJK UNIFIED IDEOGRAPH +0x9093 0x5D69 #CJK UNIFIED IDEOGRAPH +0x9094 0x6570 #CJK UNIFIED IDEOGRAPH +0x9095 0x67A2 #CJK UNIFIED IDEOGRAPH +0x9096 0x8DA8 #CJK UNIFIED IDEOGRAPH +0x9097 0x96DB #CJK UNIFIED IDEOGRAPH +0x9098 0x636E #CJK UNIFIED IDEOGRAPH +0x9099 0x6749 #CJK UNIFIED IDEOGRAPH +0x909A 0x6919 #CJK UNIFIED IDEOGRAPH +0x909B 0x83C5 #CJK UNIFIED IDEOGRAPH +0x909C 0x9817 #CJK UNIFIED IDEOGRAPH +0x909D 0x96C0 #CJK UNIFIED IDEOGRAPH +0x909E 0x88FE #CJK UNIFIED IDEOGRAPH +0x909F 0x6F84 #CJK UNIFIED IDEOGRAPH +0x90A0 0x647A #CJK UNIFIED IDEOGRAPH +0x90A1 0x5BF8 #CJK UNIFIED IDEOGRAPH +0x90A2 0x4E16 #CJK UNIFIED IDEOGRAPH +0x90A3 0x702C #CJK UNIFIED IDEOGRAPH +0x90A4 0x755D #CJK UNIFIED IDEOGRAPH +0x90A5 0x662F #CJK UNIFIED IDEOGRAPH +0x90A6 0x51C4 #CJK UNIFIED IDEOGRAPH +0x90A7 0x5236 #CJK UNIFIED IDEOGRAPH +0x90A8 0x52E2 #CJK UNIFIED IDEOGRAPH +0x90A9 0x59D3 #CJK UNIFIED IDEOGRAPH +0x90AA 0x5F81 #CJK UNIFIED IDEOGRAPH +0x90AB 0x6027 #CJK UNIFIED IDEOGRAPH +0x90AC 0x6210 #CJK UNIFIED IDEOGRAPH +0x90AD 0x653F #CJK UNIFIED IDEOGRAPH +0x90AE 0x6574 #CJK UNIFIED IDEOGRAPH +0x90AF 0x661F #CJK UNIFIED IDEOGRAPH +0x90B0 0x6674 #CJK UNIFIED IDEOGRAPH +0x90B1 0x68F2 #CJK UNIFIED IDEOGRAPH +0x90B2 0x6816 #CJK UNIFIED IDEOGRAPH +0x90B3 0x6B63 #CJK UNIFIED IDEOGRAPH +0x90B4 0x6E05 #CJK UNIFIED IDEOGRAPH +0x90B5 0x7272 #CJK UNIFIED IDEOGRAPH +0x90B6 0x751F #CJK UNIFIED IDEOGRAPH +0x90B7 0x76DB #CJK UNIFIED IDEOGRAPH +0x90B8 0x7CBE #CJK UNIFIED IDEOGRAPH +0x90B9 0x8056 #CJK UNIFIED IDEOGRAPH +0x90BA 0x58F0 #CJK UNIFIED IDEOGRAPH +0x90BB 0x88FD #CJK UNIFIED IDEOGRAPH +0x90BC 0x897F #CJK UNIFIED IDEOGRAPH +0x90BD 0x8AA0 #CJK UNIFIED IDEOGRAPH +0x90BE 0x8A93 #CJK UNIFIED IDEOGRAPH +0x90BF 0x8ACB #CJK UNIFIED IDEOGRAPH +0x90C0 0x901D #CJK UNIFIED IDEOGRAPH +0x90C1 0x9192 #CJK UNIFIED IDEOGRAPH +0x90C2 0x9752 #CJK UNIFIED IDEOGRAPH +0x90C3 0x9759 #CJK UNIFIED IDEOGRAPH +0x90C4 0x6589 #CJK UNIFIED IDEOGRAPH +0x90C5 0x7A0E #CJK UNIFIED IDEOGRAPH +0x90C6 0x8106 #CJK UNIFIED IDEOGRAPH +0x90C7 0x96BB #CJK UNIFIED IDEOGRAPH +0x90C8 0x5E2D #CJK UNIFIED IDEOGRAPH +0x90C9 0x60DC #CJK UNIFIED IDEOGRAPH +0x90CA 0x621A #CJK UNIFIED IDEOGRAPH +0x90CB 0x65A5 #CJK UNIFIED IDEOGRAPH +0x90CC 0x6614 #CJK UNIFIED IDEOGRAPH +0x90CD 0x6790 #CJK UNIFIED IDEOGRAPH +0x90CE 0x77F3 #CJK UNIFIED IDEOGRAPH +0x90CF 0x7A4D #CJK UNIFIED IDEOGRAPH +0x90D0 0x7C4D #CJK UNIFIED IDEOGRAPH +0x90D1 0x7E3E #CJK UNIFIED IDEOGRAPH +0x90D2 0x810A #CJK UNIFIED IDEOGRAPH +0x90D3 0x8CAC #CJK UNIFIED IDEOGRAPH +0x90D4 0x8D64 #CJK UNIFIED IDEOGRAPH +0x90D5 0x8DE1 #CJK UNIFIED IDEOGRAPH +0x90D6 0x8E5F #CJK UNIFIED IDEOGRAPH +0x90D7 0x78A9 #CJK UNIFIED IDEOGRAPH +0x90D8 0x5207 #CJK UNIFIED IDEOGRAPH +0x90D9 0x62D9 #CJK UNIFIED IDEOGRAPH +0x90DA 0x63A5 #CJK UNIFIED IDEOGRAPH +0x90DB 0x6442 #CJK UNIFIED IDEOGRAPH +0x90DC 0x6298 #CJK UNIFIED IDEOGRAPH +0x90DD 0x8A2D #CJK UNIFIED IDEOGRAPH +0x90DE 0x7A83 #CJK UNIFIED IDEOGRAPH +0x90DF 0x7BC0 #CJK UNIFIED IDEOGRAPH +0x90E0 0x8AAC #CJK UNIFIED IDEOGRAPH +0x90E1 0x96EA #CJK UNIFIED IDEOGRAPH +0x90E2 0x7D76 #CJK UNIFIED IDEOGRAPH +0x90E3 0x820C #CJK UNIFIED IDEOGRAPH +0x90E4 0x8749 #CJK UNIFIED IDEOGRAPH +0x90E5 0x4ED9 #CJK UNIFIED IDEOGRAPH +0x90E6 0x5148 #CJK UNIFIED IDEOGRAPH +0x90E7 0x5343 #CJK UNIFIED IDEOGRAPH +0x90E8 0x5360 #CJK UNIFIED IDEOGRAPH +0x90E9 0x5BA3 #CJK UNIFIED IDEOGRAPH +0x90EA 0x5C02 #CJK UNIFIED IDEOGRAPH +0x90EB 0x5C16 #CJK UNIFIED IDEOGRAPH +0x90EC 0x5DDD #CJK UNIFIED IDEOGRAPH +0x90ED 0x6226 #CJK UNIFIED IDEOGRAPH +0x90EE 0x6247 #CJK UNIFIED IDEOGRAPH +0x90EF 0x64B0 #CJK UNIFIED IDEOGRAPH +0x90F0 0x6813 #CJK UNIFIED IDEOGRAPH +0x90F1 0x6834 #CJK UNIFIED IDEOGRAPH +0x90F2 0x6CC9 #CJK UNIFIED IDEOGRAPH +0x90F3 0x6D45 #CJK UNIFIED IDEOGRAPH +0x90F4 0x6D17 #CJK UNIFIED IDEOGRAPH +0x90F5 0x67D3 #CJK UNIFIED IDEOGRAPH +0x90F6 0x6F5C #CJK UNIFIED IDEOGRAPH +0x90F7 0x714E #CJK UNIFIED IDEOGRAPH +0x90F8 0x717D #CJK UNIFIED IDEOGRAPH +0x90F9 0x65CB #CJK UNIFIED IDEOGRAPH +0x90FA 0x7A7F #CJK UNIFIED IDEOGRAPH +0x90FB 0x7BAD #CJK UNIFIED IDEOGRAPH +0x90FC 0x7DDA #CJK UNIFIED IDEOGRAPH +0x9140 0x7E4A #CJK UNIFIED IDEOGRAPH +0x9141 0x7FA8 #CJK UNIFIED IDEOGRAPH +0x9142 0x817A #CJK UNIFIED IDEOGRAPH +0x9143 0x821B #CJK UNIFIED IDEOGRAPH +0x9144 0x8239 #CJK UNIFIED IDEOGRAPH +0x9145 0x85A6 #CJK UNIFIED IDEOGRAPH +0x9146 0x8A6E #CJK UNIFIED IDEOGRAPH +0x9147 0x8CCE #CJK UNIFIED IDEOGRAPH +0x9148 0x8DF5 #CJK UNIFIED IDEOGRAPH +0x9149 0x9078 #CJK UNIFIED IDEOGRAPH +0x914A 0x9077 #CJK UNIFIED IDEOGRAPH +0x914B 0x92AD #CJK UNIFIED IDEOGRAPH +0x914C 0x9291 #CJK UNIFIED IDEOGRAPH +0x914D 0x9583 #CJK UNIFIED IDEOGRAPH +0x914E 0x9BAE #CJK UNIFIED IDEOGRAPH +0x914F 0x524D #CJK UNIFIED IDEOGRAPH +0x9150 0x5584 #CJK UNIFIED IDEOGRAPH +0x9151 0x6F38 #CJK UNIFIED IDEOGRAPH +0x9152 0x7136 #CJK UNIFIED IDEOGRAPH +0x9153 0x5168 #CJK UNIFIED IDEOGRAPH +0x9154 0x7985 #CJK UNIFIED IDEOGRAPH +0x9155 0x7E55 #CJK UNIFIED IDEOGRAPH +0x9156 0x81B3 #CJK UNIFIED IDEOGRAPH +0x9157 0x7CCE #CJK UNIFIED IDEOGRAPH +0x9158 0x564C #CJK UNIFIED IDEOGRAPH +0x9159 0x5851 #CJK UNIFIED IDEOGRAPH +0x915A 0x5CA8 #CJK UNIFIED IDEOGRAPH +0x915B 0x63AA #CJK UNIFIED IDEOGRAPH +0x915C 0x66FE #CJK UNIFIED IDEOGRAPH +0x915D 0x66FD #CJK UNIFIED IDEOGRAPH +0x915E 0x695A #CJK UNIFIED IDEOGRAPH +0x915F 0x72D9 #CJK UNIFIED IDEOGRAPH +0x9160 0x758F #CJK UNIFIED IDEOGRAPH +0x9161 0x758E #CJK UNIFIED IDEOGRAPH +0x9162 0x790E #CJK UNIFIED IDEOGRAPH +0x9163 0x7956 #CJK UNIFIED IDEOGRAPH +0x9164 0x79DF #CJK UNIFIED IDEOGRAPH +0x9165 0x7C97 #CJK UNIFIED IDEOGRAPH +0x9166 0x7D20 #CJK UNIFIED IDEOGRAPH +0x9167 0x7D44 #CJK UNIFIED IDEOGRAPH +0x9168 0x8607 #CJK UNIFIED IDEOGRAPH +0x9169 0x8A34 #CJK UNIFIED IDEOGRAPH +0x916A 0x963B #CJK UNIFIED IDEOGRAPH +0x916B 0x9061 #CJK UNIFIED IDEOGRAPH +0x916C 0x9F20 #CJK UNIFIED IDEOGRAPH +0x916D 0x50E7 #CJK UNIFIED IDEOGRAPH +0x916E 0x5275 #CJK UNIFIED IDEOGRAPH +0x916F 0x53CC #CJK UNIFIED IDEOGRAPH +0x9170 0x53E2 #CJK UNIFIED IDEOGRAPH +0x9171 0x5009 #CJK UNIFIED IDEOGRAPH +0x9172 0x55AA #CJK UNIFIED IDEOGRAPH +0x9173 0x58EE #CJK UNIFIED IDEOGRAPH +0x9174 0x594F #CJK UNIFIED IDEOGRAPH +0x9175 0x723D #CJK UNIFIED IDEOGRAPH +0x9176 0x5B8B #CJK UNIFIED IDEOGRAPH +0x9177 0x5C64 #CJK UNIFIED IDEOGRAPH +0x9178 0x531D #CJK UNIFIED IDEOGRAPH +0x9179 0x60E3 #CJK UNIFIED IDEOGRAPH +0x917A 0x60F3 #CJK UNIFIED IDEOGRAPH +0x917B 0x635C #CJK UNIFIED IDEOGRAPH +0x917C 0x6383 #CJK UNIFIED IDEOGRAPH +0x917D 0x633F #CJK UNIFIED IDEOGRAPH +0x917E 0x63BB #CJK UNIFIED IDEOGRAPH +0x9180 0x64CD #CJK UNIFIED IDEOGRAPH +0x9181 0x65E9 #CJK UNIFIED IDEOGRAPH +0x9182 0x66F9 #CJK UNIFIED IDEOGRAPH +0x9183 0x5DE3 #CJK UNIFIED IDEOGRAPH +0x9184 0x69CD #CJK UNIFIED IDEOGRAPH +0x9185 0x69FD #CJK UNIFIED IDEOGRAPH +0x9186 0x6F15 #CJK UNIFIED IDEOGRAPH +0x9187 0x71E5 #CJK UNIFIED IDEOGRAPH +0x9188 0x4E89 #CJK UNIFIED IDEOGRAPH +0x9189 0x75E9 #CJK UNIFIED IDEOGRAPH +0x918A 0x76F8 #CJK UNIFIED IDEOGRAPH +0x918B 0x7A93 #CJK UNIFIED IDEOGRAPH +0x918C 0x7CDF #CJK UNIFIED IDEOGRAPH +0x918D 0x7DCF #CJK UNIFIED IDEOGRAPH +0x918E 0x7D9C #CJK UNIFIED IDEOGRAPH +0x918F 0x8061 #CJK UNIFIED IDEOGRAPH +0x9190 0x8349 #CJK UNIFIED IDEOGRAPH +0x9191 0x8358 #CJK UNIFIED IDEOGRAPH +0x9192 0x846C #CJK UNIFIED IDEOGRAPH +0x9193 0x84BC #CJK UNIFIED IDEOGRAPH +0x9194 0x85FB #CJK UNIFIED IDEOGRAPH +0x9195 0x88C5 #CJK UNIFIED IDEOGRAPH +0x9196 0x8D70 #CJK UNIFIED IDEOGRAPH +0x9197 0x9001 #CJK UNIFIED IDEOGRAPH +0x9198 0x906D #CJK UNIFIED IDEOGRAPH +0x9199 0x9397 #CJK UNIFIED IDEOGRAPH +0x919A 0x971C #CJK UNIFIED IDEOGRAPH +0x919B 0x9A12 #CJK UNIFIED IDEOGRAPH +0x919C 0x50CF #CJK UNIFIED IDEOGRAPH +0x919D 0x5897 #CJK UNIFIED IDEOGRAPH +0x919E 0x618E #CJK UNIFIED IDEOGRAPH +0x919F 0x81D3 #CJK UNIFIED IDEOGRAPH +0x91A0 0x8535 #CJK UNIFIED IDEOGRAPH +0x91A1 0x8D08 #CJK UNIFIED IDEOGRAPH +0x91A2 0x9020 #CJK UNIFIED IDEOGRAPH +0x91A3 0x4FC3 #CJK UNIFIED IDEOGRAPH +0x91A4 0x5074 #CJK UNIFIED IDEOGRAPH +0x91A5 0x5247 #CJK UNIFIED IDEOGRAPH +0x91A6 0x5373 #CJK UNIFIED IDEOGRAPH +0x91A7 0x606F #CJK UNIFIED IDEOGRAPH +0x91A8 0x6349 #CJK UNIFIED IDEOGRAPH +0x91A9 0x675F #CJK UNIFIED IDEOGRAPH +0x91AA 0x6E2C #CJK UNIFIED IDEOGRAPH +0x91AB 0x8DB3 #CJK UNIFIED IDEOGRAPH +0x91AC 0x901F #CJK UNIFIED IDEOGRAPH +0x91AD 0x4FD7 #CJK UNIFIED IDEOGRAPH +0x91AE 0x5C5E #CJK UNIFIED IDEOGRAPH +0x91AF 0x8CCA #CJK UNIFIED IDEOGRAPH +0x91B0 0x65CF #CJK UNIFIED IDEOGRAPH +0x91B1 0x7D9A #CJK UNIFIED IDEOGRAPH +0x91B2 0x5352 #CJK UNIFIED IDEOGRAPH +0x91B3 0x8896 #CJK UNIFIED IDEOGRAPH +0x91B4 0x5176 #CJK UNIFIED IDEOGRAPH +0x91B5 0x63C3 #CJK UNIFIED IDEOGRAPH +0x91B6 0x5B58 #CJK UNIFIED IDEOGRAPH +0x91B7 0x5B6B #CJK UNIFIED IDEOGRAPH +0x91B8 0x5C0A #CJK UNIFIED IDEOGRAPH +0x91B9 0x640D #CJK UNIFIED IDEOGRAPH +0x91BA 0x6751 #CJK UNIFIED IDEOGRAPH +0x91BB 0x905C #CJK UNIFIED IDEOGRAPH +0x91BC 0x4ED6 #CJK UNIFIED IDEOGRAPH +0x91BD 0x591A #CJK UNIFIED IDEOGRAPH +0x91BE 0x592A #CJK UNIFIED IDEOGRAPH +0x91BF 0x6C70 #CJK UNIFIED IDEOGRAPH +0x91C0 0x8A51 #CJK UNIFIED IDEOGRAPH +0x91C1 0x553E #CJK UNIFIED IDEOGRAPH +0x91C2 0x5815 #CJK UNIFIED IDEOGRAPH +0x91C3 0x59A5 #CJK UNIFIED IDEOGRAPH +0x91C4 0x60F0 #CJK UNIFIED IDEOGRAPH +0x91C5 0x6253 #CJK UNIFIED IDEOGRAPH +0x91C6 0x67C1 #CJK UNIFIED IDEOGRAPH +0x91C7 0x8235 #CJK UNIFIED IDEOGRAPH +0x91C8 0x6955 #CJK UNIFIED IDEOGRAPH +0x91C9 0x9640 #CJK UNIFIED IDEOGRAPH +0x91CA 0x99C4 #CJK UNIFIED IDEOGRAPH +0x91CB 0x9A28 #CJK UNIFIED IDEOGRAPH +0x91CC 0x4F53 #CJK UNIFIED IDEOGRAPH +0x91CD 0x5806 #CJK UNIFIED IDEOGRAPH +0x91CE 0x5BFE #CJK UNIFIED IDEOGRAPH +0x91CF 0x8010 #CJK UNIFIED IDEOGRAPH +0x91D0 0x5CB1 #CJK UNIFIED IDEOGRAPH +0x91D1 0x5E2F #CJK UNIFIED IDEOGRAPH +0x91D2 0x5F85 #CJK UNIFIED IDEOGRAPH +0x91D3 0x6020 #CJK UNIFIED IDEOGRAPH +0x91D4 0x614B #CJK UNIFIED IDEOGRAPH +0x91D5 0x6234 #CJK UNIFIED IDEOGRAPH +0x91D6 0x66FF #CJK UNIFIED IDEOGRAPH +0x91D7 0x6CF0 #CJK UNIFIED IDEOGRAPH +0x91D8 0x6EDE #CJK UNIFIED IDEOGRAPH +0x91D9 0x80CE #CJK UNIFIED IDEOGRAPH +0x91DA 0x817F #CJK UNIFIED IDEOGRAPH +0x91DB 0x82D4 #CJK UNIFIED IDEOGRAPH +0x91DC 0x888B #CJK UNIFIED IDEOGRAPH +0x91DD 0x8CB8 #CJK UNIFIED IDEOGRAPH +0x91DE 0x9000 #CJK UNIFIED IDEOGRAPH +0x91DF 0x902E #CJK UNIFIED IDEOGRAPH +0x91E0 0x968A #CJK UNIFIED IDEOGRAPH +0x91E1 0x9EDB #CJK UNIFIED IDEOGRAPH +0x91E2 0x9BDB #CJK UNIFIED IDEOGRAPH +0x91E3 0x4EE3 #CJK UNIFIED IDEOGRAPH +0x91E4 0x53F0 #CJK UNIFIED IDEOGRAPH +0x91E5 0x5927 #CJK UNIFIED IDEOGRAPH +0x91E6 0x7B2C #CJK UNIFIED IDEOGRAPH +0x91E7 0x918D #CJK UNIFIED IDEOGRAPH +0x91E8 0x984C #CJK UNIFIED IDEOGRAPH +0x91E9 0x9DF9 #CJK UNIFIED IDEOGRAPH +0x91EA 0x6EDD #CJK UNIFIED IDEOGRAPH +0x91EB 0x7027 #CJK UNIFIED IDEOGRAPH +0x91EC 0x5353 #CJK UNIFIED IDEOGRAPH +0x91ED 0x5544 #CJK UNIFIED IDEOGRAPH +0x91EE 0x5B85 #CJK UNIFIED IDEOGRAPH +0x91EF 0x6258 #CJK UNIFIED IDEOGRAPH +0x91F0 0x629E #CJK UNIFIED IDEOGRAPH +0x91F1 0x62D3 #CJK UNIFIED IDEOGRAPH +0x91F2 0x6CA2 #CJK UNIFIED IDEOGRAPH +0x91F3 0x6FEF #CJK UNIFIED IDEOGRAPH +0x91F4 0x7422 #CJK UNIFIED IDEOGRAPH +0x91F5 0x8A17 #CJK UNIFIED IDEOGRAPH +0x91F6 0x9438 #CJK UNIFIED IDEOGRAPH +0x91F7 0x6FC1 #CJK UNIFIED IDEOGRAPH +0x91F8 0x8AFE #CJK UNIFIED IDEOGRAPH +0x91F9 0x8338 #CJK UNIFIED IDEOGRAPH +0x91FA 0x51E7 #CJK UNIFIED IDEOGRAPH +0x91FB 0x86F8 #CJK UNIFIED IDEOGRAPH +0x91FC 0x53EA #CJK UNIFIED IDEOGRAPH +0x9240 0x53E9 #CJK UNIFIED IDEOGRAPH +0x9241 0x4F46 #CJK UNIFIED IDEOGRAPH +0x9242 0x9054 #CJK UNIFIED IDEOGRAPH +0x9243 0x8FB0 #CJK UNIFIED IDEOGRAPH +0x9244 0x596A #CJK UNIFIED IDEOGRAPH +0x9245 0x8131 #CJK UNIFIED IDEOGRAPH +0x9246 0x5DFD #CJK UNIFIED IDEOGRAPH +0x9247 0x7AEA #CJK UNIFIED IDEOGRAPH +0x9248 0x8FBF #CJK UNIFIED IDEOGRAPH +0x9249 0x68DA #CJK UNIFIED IDEOGRAPH +0x924A 0x8C37 #CJK UNIFIED IDEOGRAPH +0x924B 0x72F8 #CJK UNIFIED IDEOGRAPH +0x924C 0x9C48 #CJK UNIFIED IDEOGRAPH +0x924D 0x6A3D #CJK UNIFIED IDEOGRAPH +0x924E 0x8AB0 #CJK UNIFIED IDEOGRAPH +0x924F 0x4E39 #CJK UNIFIED IDEOGRAPH +0x9250 0x5358 #CJK UNIFIED IDEOGRAPH +0x9251 0x5606 #CJK UNIFIED IDEOGRAPH +0x9252 0x5766 #CJK UNIFIED IDEOGRAPH +0x9253 0x62C5 #CJK UNIFIED IDEOGRAPH +0x9254 0x63A2 #CJK UNIFIED IDEOGRAPH +0x9255 0x65E6 #CJK UNIFIED IDEOGRAPH +0x9256 0x6B4E #CJK UNIFIED IDEOGRAPH +0x9257 0x6DE1 #CJK UNIFIED IDEOGRAPH +0x9258 0x6E5B #CJK UNIFIED IDEOGRAPH +0x9259 0x70AD #CJK UNIFIED IDEOGRAPH +0x925A 0x77ED #CJK UNIFIED IDEOGRAPH +0x925B 0x7AEF #CJK UNIFIED IDEOGRAPH +0x925C 0x7BAA #CJK UNIFIED IDEOGRAPH +0x925D 0x7DBB #CJK UNIFIED IDEOGRAPH +0x925E 0x803D #CJK UNIFIED IDEOGRAPH +0x925F 0x80C6 #CJK UNIFIED IDEOGRAPH +0x9260 0x86CB #CJK UNIFIED IDEOGRAPH +0x9261 0x8A95 #CJK UNIFIED IDEOGRAPH +0x9262 0x935B #CJK UNIFIED IDEOGRAPH +0x9263 0x56E3 #CJK UNIFIED IDEOGRAPH +0x9264 0x58C7 #CJK UNIFIED IDEOGRAPH +0x9265 0x5F3E #CJK UNIFIED IDEOGRAPH +0x9266 0x65AD #CJK UNIFIED IDEOGRAPH +0x9267 0x6696 #CJK UNIFIED IDEOGRAPH +0x9268 0x6A80 #CJK UNIFIED IDEOGRAPH +0x9269 0x6BB5 #CJK UNIFIED IDEOGRAPH +0x926A 0x7537 #CJK UNIFIED IDEOGRAPH +0x926B 0x8AC7 #CJK UNIFIED IDEOGRAPH +0x926C 0x5024 #CJK UNIFIED IDEOGRAPH +0x926D 0x77E5 #CJK UNIFIED IDEOGRAPH +0x926E 0x5730 #CJK UNIFIED IDEOGRAPH +0x926F 0x5F1B #CJK UNIFIED IDEOGRAPH +0x9270 0x6065 #CJK UNIFIED IDEOGRAPH +0x9271 0x667A #CJK UNIFIED IDEOGRAPH +0x9272 0x6C60 #CJK UNIFIED IDEOGRAPH +0x9273 0x75F4 #CJK UNIFIED IDEOGRAPH +0x9274 0x7A1A #CJK UNIFIED IDEOGRAPH +0x9275 0x7F6E #CJK UNIFIED IDEOGRAPH +0x9276 0x81F4 #CJK UNIFIED IDEOGRAPH +0x9277 0x8718 #CJK UNIFIED IDEOGRAPH +0x9278 0x9045 #CJK UNIFIED IDEOGRAPH +0x9279 0x99B3 #CJK UNIFIED IDEOGRAPH +0x927A 0x7BC9 #CJK UNIFIED IDEOGRAPH +0x927B 0x755C #CJK UNIFIED IDEOGRAPH +0x927C 0x7AF9 #CJK UNIFIED IDEOGRAPH +0x927D 0x7B51 #CJK UNIFIED IDEOGRAPH +0x927E 0x84C4 #CJK UNIFIED IDEOGRAPH +0x9280 0x9010 #CJK UNIFIED IDEOGRAPH +0x9281 0x79E9 #CJK UNIFIED IDEOGRAPH +0x9282 0x7A92 #CJK UNIFIED IDEOGRAPH +0x9283 0x8336 #CJK UNIFIED IDEOGRAPH +0x9284 0x5AE1 #CJK UNIFIED IDEOGRAPH +0x9285 0x7740 #CJK UNIFIED IDEOGRAPH +0x9286 0x4E2D #CJK UNIFIED IDEOGRAPH +0x9287 0x4EF2 #CJK UNIFIED IDEOGRAPH +0x9288 0x5B99 #CJK UNIFIED IDEOGRAPH +0x9289 0x5FE0 #CJK UNIFIED IDEOGRAPH +0x928A 0x62BD #CJK UNIFIED IDEOGRAPH +0x928B 0x663C #CJK UNIFIED IDEOGRAPH +0x928C 0x67F1 #CJK UNIFIED IDEOGRAPH +0x928D 0x6CE8 #CJK UNIFIED IDEOGRAPH +0x928E 0x866B #CJK UNIFIED IDEOGRAPH +0x928F 0x8877 #CJK UNIFIED IDEOGRAPH +0x9290 0x8A3B #CJK UNIFIED IDEOGRAPH +0x9291 0x914E #CJK UNIFIED IDEOGRAPH +0x9292 0x92F3 #CJK UNIFIED IDEOGRAPH +0x9293 0x99D0 #CJK UNIFIED IDEOGRAPH +0x9294 0x6A17 #CJK UNIFIED IDEOGRAPH +0x9295 0x7026 #CJK UNIFIED IDEOGRAPH +0x9296 0x732A #CJK UNIFIED IDEOGRAPH +0x9297 0x82E7 #CJK UNIFIED IDEOGRAPH +0x9298 0x8457 #CJK UNIFIED IDEOGRAPH +0x9299 0x8CAF #CJK UNIFIED IDEOGRAPH +0x929A 0x4E01 #CJK UNIFIED IDEOGRAPH +0x929B 0x5146 #CJK UNIFIED IDEOGRAPH +0x929C 0x51CB #CJK UNIFIED IDEOGRAPH +0x929D 0x558B #CJK UNIFIED IDEOGRAPH +0x929E 0x5BF5 #CJK UNIFIED IDEOGRAPH +0x929F 0x5E16 #CJK UNIFIED IDEOGRAPH +0x92A0 0x5E33 #CJK UNIFIED IDEOGRAPH +0x92A1 0x5E81 #CJK UNIFIED IDEOGRAPH +0x92A2 0x5F14 #CJK UNIFIED IDEOGRAPH +0x92A3 0x5F35 #CJK UNIFIED IDEOGRAPH +0x92A4 0x5F6B #CJK UNIFIED IDEOGRAPH +0x92A5 0x5FB4 #CJK UNIFIED IDEOGRAPH +0x92A6 0x61F2 #CJK UNIFIED IDEOGRAPH +0x92A7 0x6311 #CJK UNIFIED IDEOGRAPH +0x92A8 0x66A2 #CJK UNIFIED IDEOGRAPH +0x92A9 0x671D #CJK UNIFIED IDEOGRAPH +0x92AA 0x6F6E #CJK UNIFIED IDEOGRAPH +0x92AB 0x7252 #CJK UNIFIED IDEOGRAPH +0x92AC 0x753A #CJK UNIFIED IDEOGRAPH +0x92AD 0x773A #CJK UNIFIED IDEOGRAPH +0x92AE 0x8074 #CJK UNIFIED IDEOGRAPH +0x92AF 0x8139 #CJK UNIFIED IDEOGRAPH +0x92B0 0x8178 #CJK UNIFIED IDEOGRAPH +0x92B1 0x8776 #CJK UNIFIED IDEOGRAPH +0x92B2 0x8ABF #CJK UNIFIED IDEOGRAPH +0x92B3 0x8ADC #CJK UNIFIED IDEOGRAPH +0x92B4 0x8D85 #CJK UNIFIED IDEOGRAPH +0x92B5 0x8DF3 #CJK UNIFIED IDEOGRAPH +0x92B6 0x929A #CJK UNIFIED IDEOGRAPH +0x92B7 0x9577 #CJK UNIFIED IDEOGRAPH +0x92B8 0x9802 #CJK UNIFIED IDEOGRAPH +0x92B9 0x9CE5 #CJK UNIFIED IDEOGRAPH +0x92BA 0x52C5 #CJK UNIFIED IDEOGRAPH +0x92BB 0x6357 #CJK UNIFIED IDEOGRAPH +0x92BC 0x76F4 #CJK UNIFIED IDEOGRAPH +0x92BD 0x6715 #CJK UNIFIED IDEOGRAPH +0x92BE 0x6C88 #CJK UNIFIED IDEOGRAPH +0x92BF 0x73CD #CJK UNIFIED IDEOGRAPH +0x92C0 0x8CC3 #CJK UNIFIED IDEOGRAPH +0x92C1 0x93AE #CJK UNIFIED IDEOGRAPH +0x92C2 0x9673 #CJK UNIFIED IDEOGRAPH +0x92C3 0x6D25 #CJK UNIFIED IDEOGRAPH +0x92C4 0x589C #CJK UNIFIED IDEOGRAPH +0x92C5 0x690E #CJK UNIFIED IDEOGRAPH +0x92C6 0x69CC #CJK UNIFIED IDEOGRAPH +0x92C7 0x8FFD #CJK UNIFIED IDEOGRAPH +0x92C8 0x939A #CJK UNIFIED IDEOGRAPH +0x92C9 0x75DB #CJK UNIFIED IDEOGRAPH +0x92CA 0x901A #CJK UNIFIED IDEOGRAPH +0x92CB 0x585A #CJK UNIFIED IDEOGRAPH +0x92CC 0x6802 #CJK UNIFIED IDEOGRAPH +0x92CD 0x63B4 #CJK UNIFIED IDEOGRAPH +0x92CE 0x69FB #CJK UNIFIED IDEOGRAPH +0x92CF 0x4F43 #CJK UNIFIED IDEOGRAPH +0x92D0 0x6F2C #CJK UNIFIED IDEOGRAPH +0x92D1 0x67D8 #CJK UNIFIED IDEOGRAPH +0x92D2 0x8FBB #CJK UNIFIED IDEOGRAPH +0x92D3 0x8526 #CJK UNIFIED IDEOGRAPH +0x92D4 0x7DB4 #CJK UNIFIED IDEOGRAPH +0x92D5 0x9354 #CJK UNIFIED IDEOGRAPH +0x92D6 0x693F #CJK UNIFIED IDEOGRAPH +0x92D7 0x6F70 #CJK UNIFIED IDEOGRAPH +0x92D8 0x576A #CJK UNIFIED IDEOGRAPH +0x92D9 0x58F7 #CJK UNIFIED IDEOGRAPH +0x92DA 0x5B2C #CJK UNIFIED IDEOGRAPH +0x92DB 0x7D2C #CJK UNIFIED IDEOGRAPH +0x92DC 0x722A #CJK UNIFIED IDEOGRAPH +0x92DD 0x540A #CJK UNIFIED IDEOGRAPH +0x92DE 0x91E3 #CJK UNIFIED IDEOGRAPH +0x92DF 0x9DB4 #CJK UNIFIED IDEOGRAPH +0x92E0 0x4EAD #CJK UNIFIED IDEOGRAPH +0x92E1 0x4F4E #CJK UNIFIED IDEOGRAPH +0x92E2 0x505C #CJK UNIFIED IDEOGRAPH +0x92E3 0x5075 #CJK UNIFIED IDEOGRAPH +0x92E4 0x5243 #CJK UNIFIED IDEOGRAPH +0x92E5 0x8C9E #CJK UNIFIED IDEOGRAPH +0x92E6 0x5448 #CJK UNIFIED IDEOGRAPH +0x92E7 0x5824 #CJK UNIFIED IDEOGRAPH +0x92E8 0x5B9A #CJK UNIFIED IDEOGRAPH +0x92E9 0x5E1D #CJK UNIFIED IDEOGRAPH +0x92EA 0x5E95 #CJK UNIFIED IDEOGRAPH +0x92EB 0x5EAD #CJK UNIFIED IDEOGRAPH +0x92EC 0x5EF7 #CJK UNIFIED IDEOGRAPH +0x92ED 0x5F1F #CJK UNIFIED IDEOGRAPH +0x92EE 0x608C #CJK UNIFIED IDEOGRAPH +0x92EF 0x62B5 #CJK UNIFIED IDEOGRAPH +0x92F0 0x633A #CJK UNIFIED IDEOGRAPH +0x92F1 0x63D0 #CJK UNIFIED IDEOGRAPH +0x92F2 0x68AF #CJK UNIFIED IDEOGRAPH +0x92F3 0x6C40 #CJK UNIFIED IDEOGRAPH +0x92F4 0x7887 #CJK UNIFIED IDEOGRAPH +0x92F5 0x798E #CJK UNIFIED IDEOGRAPH +0x92F6 0x7A0B #CJK UNIFIED IDEOGRAPH +0x92F7 0x7DE0 #CJK UNIFIED IDEOGRAPH +0x92F8 0x8247 #CJK UNIFIED IDEOGRAPH +0x92F9 0x8A02 #CJK UNIFIED IDEOGRAPH +0x92FA 0x8AE6 #CJK UNIFIED IDEOGRAPH +0x92FB 0x8E44 #CJK UNIFIED IDEOGRAPH +0x92FC 0x9013 #CJK UNIFIED IDEOGRAPH +0x9340 0x90B8 #CJK UNIFIED IDEOGRAPH +0x9341 0x912D #CJK UNIFIED IDEOGRAPH +0x9342 0x91D8 #CJK UNIFIED IDEOGRAPH +0x9343 0x9F0E #CJK UNIFIED IDEOGRAPH +0x9344 0x6CE5 #CJK UNIFIED IDEOGRAPH +0x9345 0x6458 #CJK UNIFIED IDEOGRAPH +0x9346 0x64E2 #CJK UNIFIED IDEOGRAPH +0x9347 0x6575 #CJK UNIFIED IDEOGRAPH +0x9348 0x6EF4 #CJK UNIFIED IDEOGRAPH +0x9349 0x7684 #CJK UNIFIED IDEOGRAPH +0x934A 0x7B1B #CJK UNIFIED IDEOGRAPH +0x934B 0x9069 #CJK UNIFIED IDEOGRAPH +0x934C 0x93D1 #CJK UNIFIED IDEOGRAPH +0x934D 0x6EBA #CJK UNIFIED IDEOGRAPH +0x934E 0x54F2 #CJK UNIFIED IDEOGRAPH +0x934F 0x5FB9 #CJK UNIFIED IDEOGRAPH +0x9350 0x64A4 #CJK UNIFIED IDEOGRAPH +0x9351 0x8F4D #CJK UNIFIED IDEOGRAPH +0x9352 0x8FED #CJK UNIFIED IDEOGRAPH +0x9353 0x9244 #CJK UNIFIED IDEOGRAPH +0x9354 0x5178 #CJK UNIFIED IDEOGRAPH +0x9355 0x586B #CJK UNIFIED IDEOGRAPH +0x9356 0x5929 #CJK UNIFIED IDEOGRAPH +0x9357 0x5C55 #CJK UNIFIED IDEOGRAPH +0x9358 0x5E97 #CJK UNIFIED IDEOGRAPH +0x9359 0x6DFB #CJK UNIFIED IDEOGRAPH +0x935A 0x7E8F #CJK UNIFIED IDEOGRAPH +0x935B 0x751C #CJK UNIFIED IDEOGRAPH +0x935C 0x8CBC #CJK UNIFIED IDEOGRAPH +0x935D 0x8EE2 #CJK UNIFIED IDEOGRAPH +0x935E 0x985B #CJK UNIFIED IDEOGRAPH +0x935F 0x70B9 #CJK UNIFIED IDEOGRAPH +0x9360 0x4F1D #CJK UNIFIED IDEOGRAPH +0x9361 0x6BBF #CJK UNIFIED IDEOGRAPH +0x9362 0x6FB1 #CJK UNIFIED IDEOGRAPH +0x9363 0x7530 #CJK UNIFIED IDEOGRAPH +0x9364 0x96FB #CJK UNIFIED IDEOGRAPH +0x9365 0x514E #CJK UNIFIED IDEOGRAPH +0x9366 0x5410 #CJK UNIFIED IDEOGRAPH +0x9367 0x5835 #CJK UNIFIED IDEOGRAPH +0x9368 0x5857 #CJK UNIFIED IDEOGRAPH +0x9369 0x59AC #CJK UNIFIED IDEOGRAPH +0x936A 0x5C60 #CJK UNIFIED IDEOGRAPH +0x936B 0x5F92 #CJK UNIFIED IDEOGRAPH +0x936C 0x6597 #CJK UNIFIED IDEOGRAPH +0x936D 0x675C #CJK UNIFIED IDEOGRAPH +0x936E 0x6E21 #CJK UNIFIED IDEOGRAPH +0x936F 0x767B #CJK UNIFIED IDEOGRAPH +0x9370 0x83DF #CJK UNIFIED IDEOGRAPH +0x9371 0x8CED #CJK UNIFIED IDEOGRAPH +0x9372 0x9014 #CJK UNIFIED IDEOGRAPH +0x9373 0x90FD #CJK UNIFIED IDEOGRAPH +0x9374 0x934D #CJK UNIFIED IDEOGRAPH +0x9375 0x7825 #CJK UNIFIED IDEOGRAPH +0x9376 0x783A #CJK UNIFIED IDEOGRAPH +0x9377 0x52AA #CJK UNIFIED IDEOGRAPH +0x9378 0x5EA6 #CJK UNIFIED IDEOGRAPH +0x9379 0x571F #CJK UNIFIED IDEOGRAPH +0x937A 0x5974 #CJK UNIFIED IDEOGRAPH +0x937B 0x6012 #CJK UNIFIED IDEOGRAPH +0x937C 0x5012 #CJK UNIFIED IDEOGRAPH +0x937D 0x515A #CJK UNIFIED IDEOGRAPH +0x937E 0x51AC #CJK UNIFIED IDEOGRAPH +0x9380 0x51CD #CJK UNIFIED IDEOGRAPH +0x9381 0x5200 #CJK UNIFIED IDEOGRAPH +0x9382 0x5510 #CJK UNIFIED IDEOGRAPH +0x9383 0x5854 #CJK UNIFIED IDEOGRAPH +0x9384 0x5858 #CJK UNIFIED IDEOGRAPH +0x9385 0x5957 #CJK UNIFIED IDEOGRAPH +0x9386 0x5B95 #CJK UNIFIED IDEOGRAPH +0x9387 0x5CF6 #CJK UNIFIED IDEOGRAPH +0x9388 0x5D8B #CJK UNIFIED IDEOGRAPH +0x9389 0x60BC #CJK UNIFIED IDEOGRAPH +0x938A 0x6295 #CJK UNIFIED IDEOGRAPH +0x938B 0x642D #CJK UNIFIED IDEOGRAPH +0x938C 0x6771 #CJK UNIFIED IDEOGRAPH +0x938D 0x6843 #CJK UNIFIED IDEOGRAPH +0x938E 0x68BC #CJK UNIFIED IDEOGRAPH +0x938F 0x68DF #CJK UNIFIED IDEOGRAPH +0x9390 0x76D7 #CJK UNIFIED IDEOGRAPH +0x9391 0x6DD8 #CJK UNIFIED IDEOGRAPH +0x9392 0x6E6F #CJK UNIFIED IDEOGRAPH +0x9393 0x6D9B #CJK UNIFIED IDEOGRAPH +0x9394 0x706F #CJK UNIFIED IDEOGRAPH +0x9395 0x71C8 #CJK UNIFIED IDEOGRAPH +0x9396 0x5F53 #CJK UNIFIED IDEOGRAPH +0x9397 0x75D8 #CJK UNIFIED IDEOGRAPH +0x9398 0x7977 #CJK UNIFIED IDEOGRAPH +0x9399 0x7B49 #CJK UNIFIED IDEOGRAPH +0x939A 0x7B54 #CJK UNIFIED IDEOGRAPH +0x939B 0x7B52 #CJK UNIFIED IDEOGRAPH +0x939C 0x7CD6 #CJK UNIFIED IDEOGRAPH +0x939D 0x7D71 #CJK UNIFIED IDEOGRAPH +0x939E 0x5230 #CJK UNIFIED IDEOGRAPH +0x939F 0x8463 #CJK UNIFIED IDEOGRAPH +0x93A0 0x8569 #CJK UNIFIED IDEOGRAPH +0x93A1 0x85E4 #CJK UNIFIED IDEOGRAPH +0x93A2 0x8A0E #CJK UNIFIED IDEOGRAPH +0x93A3 0x8B04 #CJK UNIFIED IDEOGRAPH +0x93A4 0x8C46 #CJK UNIFIED IDEOGRAPH +0x93A5 0x8E0F #CJK UNIFIED IDEOGRAPH +0x93A6 0x9003 #CJK UNIFIED IDEOGRAPH +0x93A7 0x900F #CJK UNIFIED IDEOGRAPH +0x93A8 0x9419 #CJK UNIFIED IDEOGRAPH +0x93A9 0x9676 #CJK UNIFIED IDEOGRAPH +0x93AA 0x982D #CJK UNIFIED IDEOGRAPH +0x93AB 0x9A30 #CJK UNIFIED IDEOGRAPH +0x93AC 0x95D8 #CJK UNIFIED IDEOGRAPH +0x93AD 0x50CD #CJK UNIFIED IDEOGRAPH +0x93AE 0x52D5 #CJK UNIFIED IDEOGRAPH +0x93AF 0x540C #CJK UNIFIED IDEOGRAPH +0x93B0 0x5802 #CJK UNIFIED IDEOGRAPH +0x93B1 0x5C0E #CJK UNIFIED IDEOGRAPH +0x93B2 0x61A7 #CJK UNIFIED IDEOGRAPH +0x93B3 0x649E #CJK UNIFIED IDEOGRAPH +0x93B4 0x6D1E #CJK UNIFIED IDEOGRAPH +0x93B5 0x77B3 #CJK UNIFIED IDEOGRAPH +0x93B6 0x7AE5 #CJK UNIFIED IDEOGRAPH +0x93B7 0x80F4 #CJK UNIFIED IDEOGRAPH +0x93B8 0x8404 #CJK UNIFIED IDEOGRAPH +0x93B9 0x9053 #CJK UNIFIED IDEOGRAPH +0x93BA 0x9285 #CJK UNIFIED IDEOGRAPH +0x93BB 0x5CE0 #CJK UNIFIED IDEOGRAPH +0x93BC 0x9D07 #CJK UNIFIED IDEOGRAPH +0x93BD 0x533F #CJK UNIFIED IDEOGRAPH +0x93BE 0x5F97 #CJK UNIFIED IDEOGRAPH +0x93BF 0x5FB3 #CJK UNIFIED IDEOGRAPH +0x93C0 0x6D9C #CJK UNIFIED IDEOGRAPH +0x93C1 0x7279 #CJK UNIFIED IDEOGRAPH +0x93C2 0x7763 #CJK UNIFIED IDEOGRAPH +0x93C3 0x79BF #CJK UNIFIED IDEOGRAPH +0x93C4 0x7BE4 #CJK UNIFIED IDEOGRAPH +0x93C5 0x6BD2 #CJK UNIFIED IDEOGRAPH +0x93C6 0x72EC #CJK UNIFIED IDEOGRAPH +0x93C7 0x8AAD #CJK UNIFIED IDEOGRAPH +0x93C8 0x6803 #CJK UNIFIED IDEOGRAPH +0x93C9 0x6A61 #CJK UNIFIED IDEOGRAPH +0x93CA 0x51F8 #CJK UNIFIED IDEOGRAPH +0x93CB 0x7A81 #CJK UNIFIED IDEOGRAPH +0x93CC 0x6934 #CJK UNIFIED IDEOGRAPH +0x93CD 0x5C4A #CJK UNIFIED IDEOGRAPH +0x93CE 0x9CF6 #CJK UNIFIED IDEOGRAPH +0x93CF 0x82EB #CJK UNIFIED IDEOGRAPH +0x93D0 0x5BC5 #CJK UNIFIED IDEOGRAPH +0x93D1 0x9149 #CJK UNIFIED IDEOGRAPH +0x93D2 0x701E #CJK UNIFIED IDEOGRAPH +0x93D3 0x5678 #CJK UNIFIED IDEOGRAPH +0x93D4 0x5C6F #CJK UNIFIED IDEOGRAPH +0x93D5 0x60C7 #CJK UNIFIED IDEOGRAPH +0x93D6 0x6566 #CJK UNIFIED IDEOGRAPH +0x93D7 0x6C8C #CJK UNIFIED IDEOGRAPH +0x93D8 0x8C5A #CJK UNIFIED IDEOGRAPH +0x93D9 0x9041 #CJK UNIFIED IDEOGRAPH +0x93DA 0x9813 #CJK UNIFIED IDEOGRAPH +0x93DB 0x5451 #CJK UNIFIED IDEOGRAPH +0x93DC 0x66C7 #CJK UNIFIED IDEOGRAPH +0x93DD 0x920D #CJK UNIFIED IDEOGRAPH +0x93DE 0x5948 #CJK UNIFIED IDEOGRAPH +0x93DF 0x90A3 #CJK UNIFIED IDEOGRAPH +0x93E0 0x5185 #CJK UNIFIED IDEOGRAPH +0x93E1 0x4E4D #CJK UNIFIED IDEOGRAPH +0x93E2 0x51EA #CJK UNIFIED IDEOGRAPH +0x93E3 0x8599 #CJK UNIFIED IDEOGRAPH +0x93E4 0x8B0E #CJK UNIFIED IDEOGRAPH +0x93E5 0x7058 #CJK UNIFIED IDEOGRAPH +0x93E6 0x637A #CJK UNIFIED IDEOGRAPH +0x93E7 0x934B #CJK UNIFIED IDEOGRAPH +0x93E8 0x6962 #CJK UNIFIED IDEOGRAPH +0x93E9 0x99B4 #CJK UNIFIED IDEOGRAPH +0x93EA 0x7E04 #CJK UNIFIED IDEOGRAPH +0x93EB 0x7577 #CJK UNIFIED IDEOGRAPH +0x93EC 0x5357 #CJK UNIFIED IDEOGRAPH +0x93ED 0x6960 #CJK UNIFIED IDEOGRAPH +0x93EE 0x8EDF #CJK UNIFIED IDEOGRAPH +0x93EF 0x96E3 #CJK UNIFIED IDEOGRAPH +0x93F0 0x6C5D #CJK UNIFIED IDEOGRAPH +0x93F1 0x4E8C #CJK UNIFIED IDEOGRAPH +0x93F2 0x5C3C #CJK UNIFIED IDEOGRAPH +0x93F3 0x5F10 #CJK UNIFIED IDEOGRAPH +0x93F4 0x8FE9 #CJK UNIFIED IDEOGRAPH +0x93F5 0x5302 #CJK UNIFIED IDEOGRAPH +0x93F6 0x8CD1 #CJK UNIFIED IDEOGRAPH +0x93F7 0x8089 #CJK UNIFIED IDEOGRAPH +0x93F8 0x8679 #CJK UNIFIED IDEOGRAPH +0x93F9 0x5EFF #CJK UNIFIED IDEOGRAPH +0x93FA 0x65E5 #CJK UNIFIED IDEOGRAPH +0x93FB 0x4E73 #CJK UNIFIED IDEOGRAPH +0x93FC 0x5165 #CJK UNIFIED IDEOGRAPH +0x9440 0x5982 #CJK UNIFIED IDEOGRAPH +0x9441 0x5C3F #CJK UNIFIED IDEOGRAPH +0x9442 0x97EE #CJK UNIFIED IDEOGRAPH +0x9443 0x4EFB #CJK UNIFIED IDEOGRAPH +0x9444 0x598A #CJK UNIFIED IDEOGRAPH +0x9445 0x5FCD #CJK UNIFIED IDEOGRAPH +0x9446 0x8A8D #CJK UNIFIED IDEOGRAPH +0x9447 0x6FE1 #CJK UNIFIED IDEOGRAPH +0x9448 0x79B0 #CJK UNIFIED IDEOGRAPH +0x9449 0x7962 #CJK UNIFIED IDEOGRAPH +0x944A 0x5BE7 #CJK UNIFIED IDEOGRAPH +0x944B 0x8471 #CJK UNIFIED IDEOGRAPH +0x944C 0x732B #CJK UNIFIED IDEOGRAPH +0x944D 0x71B1 #CJK UNIFIED IDEOGRAPH +0x944E 0x5E74 #CJK UNIFIED IDEOGRAPH +0x944F 0x5FF5 #CJK UNIFIED IDEOGRAPH +0x9450 0x637B #CJK UNIFIED IDEOGRAPH +0x9451 0x649A #CJK UNIFIED IDEOGRAPH +0x9452 0x71C3 #CJK UNIFIED IDEOGRAPH +0x9453 0x7C98 #CJK UNIFIED IDEOGRAPH +0x9454 0x4E43 #CJK UNIFIED IDEOGRAPH +0x9455 0x5EFC #CJK UNIFIED IDEOGRAPH +0x9456 0x4E4B #CJK UNIFIED IDEOGRAPH +0x9457 0x57DC #CJK UNIFIED IDEOGRAPH +0x9458 0x56A2 #CJK UNIFIED IDEOGRAPH +0x9459 0x60A9 #CJK UNIFIED IDEOGRAPH +0x945A 0x6FC3 #CJK UNIFIED IDEOGRAPH +0x945B 0x7D0D #CJK UNIFIED IDEOGRAPH +0x945C 0x80FD #CJK UNIFIED IDEOGRAPH +0x945D 0x8133 #CJK UNIFIED IDEOGRAPH +0x945E 0x81BF #CJK UNIFIED IDEOGRAPH +0x945F 0x8FB2 #CJK UNIFIED IDEOGRAPH +0x9460 0x8997 #CJK UNIFIED IDEOGRAPH +0x9461 0x86A4 #CJK UNIFIED IDEOGRAPH +0x9462 0x5DF4 #CJK UNIFIED IDEOGRAPH +0x9463 0x628A #CJK UNIFIED IDEOGRAPH +0x9464 0x64AD #CJK UNIFIED IDEOGRAPH +0x9465 0x8987 #CJK UNIFIED IDEOGRAPH +0x9466 0x6777 #CJK UNIFIED IDEOGRAPH +0x9467 0x6CE2 #CJK UNIFIED IDEOGRAPH +0x9468 0x6D3E #CJK UNIFIED IDEOGRAPH +0x9469 0x7436 #CJK UNIFIED IDEOGRAPH +0x946A 0x7834 #CJK UNIFIED IDEOGRAPH +0x946B 0x5A46 #CJK UNIFIED IDEOGRAPH +0x946C 0x7F75 #CJK UNIFIED IDEOGRAPH +0x946D 0x82AD #CJK UNIFIED IDEOGRAPH +0x946E 0x99AC #CJK UNIFIED IDEOGRAPH +0x946F 0x4FF3 #CJK UNIFIED IDEOGRAPH +0x9470 0x5EC3 #CJK UNIFIED IDEOGRAPH +0x9471 0x62DD #CJK UNIFIED IDEOGRAPH +0x9472 0x6392 #CJK UNIFIED IDEOGRAPH +0x9473 0x6557 #CJK UNIFIED IDEOGRAPH +0x9474 0x676F #CJK UNIFIED IDEOGRAPH +0x9475 0x76C3 #CJK UNIFIED IDEOGRAPH +0x9476 0x724C #CJK UNIFIED IDEOGRAPH +0x9477 0x80CC #CJK UNIFIED IDEOGRAPH +0x9478 0x80BA #CJK UNIFIED IDEOGRAPH +0x9479 0x8F29 #CJK UNIFIED IDEOGRAPH +0x947A 0x914D #CJK UNIFIED IDEOGRAPH +0x947B 0x500D #CJK UNIFIED IDEOGRAPH +0x947C 0x57F9 #CJK UNIFIED IDEOGRAPH +0x947D 0x5A92 #CJK UNIFIED IDEOGRAPH +0x947E 0x6885 #CJK UNIFIED IDEOGRAPH +0x9480 0x6973 #CJK UNIFIED IDEOGRAPH +0x9481 0x7164 #CJK UNIFIED IDEOGRAPH +0x9482 0x72FD #CJK UNIFIED IDEOGRAPH +0x9483 0x8CB7 #CJK UNIFIED IDEOGRAPH +0x9484 0x58F2 #CJK UNIFIED IDEOGRAPH +0x9485 0x8CE0 #CJK UNIFIED IDEOGRAPH +0x9486 0x966A #CJK UNIFIED IDEOGRAPH +0x9487 0x9019 #CJK UNIFIED IDEOGRAPH +0x9488 0x877F #CJK UNIFIED IDEOGRAPH +0x9489 0x79E4 #CJK UNIFIED IDEOGRAPH +0x948A 0x77E7 #CJK UNIFIED IDEOGRAPH +0x948B 0x8429 #CJK UNIFIED IDEOGRAPH +0x948C 0x4F2F #CJK UNIFIED IDEOGRAPH +0x948D 0x5265 #CJK UNIFIED IDEOGRAPH +0x948E 0x535A #CJK UNIFIED IDEOGRAPH +0x948F 0x62CD #CJK UNIFIED IDEOGRAPH +0x9490 0x67CF #CJK UNIFIED IDEOGRAPH +0x9491 0x6CCA #CJK UNIFIED IDEOGRAPH +0x9492 0x767D #CJK UNIFIED IDEOGRAPH +0x9493 0x7B94 #CJK UNIFIED IDEOGRAPH +0x9494 0x7C95 #CJK UNIFIED IDEOGRAPH +0x9495 0x8236 #CJK UNIFIED IDEOGRAPH +0x9496 0x8584 #CJK UNIFIED IDEOGRAPH +0x9497 0x8FEB #CJK UNIFIED IDEOGRAPH +0x9498 0x66DD #CJK UNIFIED IDEOGRAPH +0x9499 0x6F20 #CJK UNIFIED IDEOGRAPH +0x949A 0x7206 #CJK UNIFIED IDEOGRAPH +0x949B 0x7E1B #CJK UNIFIED IDEOGRAPH +0x949C 0x83AB #CJK UNIFIED IDEOGRAPH +0x949D 0x99C1 #CJK UNIFIED IDEOGRAPH +0x949E 0x9EA6 #CJK UNIFIED IDEOGRAPH +0x949F 0x51FD #CJK UNIFIED IDEOGRAPH +0x94A0 0x7BB1 #CJK UNIFIED IDEOGRAPH +0x94A1 0x7872 #CJK UNIFIED IDEOGRAPH +0x94A2 0x7BB8 #CJK UNIFIED IDEOGRAPH +0x94A3 0x8087 #CJK UNIFIED IDEOGRAPH +0x94A4 0x7B48 #CJK UNIFIED IDEOGRAPH +0x94A5 0x6AE8 #CJK UNIFIED IDEOGRAPH +0x94A6 0x5E61 #CJK UNIFIED IDEOGRAPH +0x94A7 0x808C #CJK UNIFIED IDEOGRAPH +0x94A8 0x7551 #CJK UNIFIED IDEOGRAPH +0x94A9 0x7560 #CJK UNIFIED IDEOGRAPH +0x94AA 0x516B #CJK UNIFIED IDEOGRAPH +0x94AB 0x9262 #CJK UNIFIED IDEOGRAPH +0x94AC 0x6E8C #CJK UNIFIED IDEOGRAPH +0x94AD 0x767A #CJK UNIFIED IDEOGRAPH +0x94AE 0x9197 #CJK UNIFIED IDEOGRAPH +0x94AF 0x9AEA #CJK UNIFIED IDEOGRAPH +0x94B0 0x4F10 #CJK UNIFIED IDEOGRAPH +0x94B1 0x7F70 #CJK UNIFIED IDEOGRAPH +0x94B2 0x629C #CJK UNIFIED IDEOGRAPH +0x94B3 0x7B4F #CJK UNIFIED IDEOGRAPH +0x94B4 0x95A5 #CJK UNIFIED IDEOGRAPH +0x94B5 0x9CE9 #CJK UNIFIED IDEOGRAPH +0x94B6 0x567A #CJK UNIFIED IDEOGRAPH +0x94B7 0x5859 #CJK UNIFIED IDEOGRAPH +0x94B8 0x86E4 #CJK UNIFIED IDEOGRAPH +0x94B9 0x96BC #CJK UNIFIED IDEOGRAPH +0x94BA 0x4F34 #CJK UNIFIED IDEOGRAPH +0x94BB 0x5224 #CJK UNIFIED IDEOGRAPH +0x94BC 0x534A #CJK UNIFIED IDEOGRAPH +0x94BD 0x53CD #CJK UNIFIED IDEOGRAPH +0x94BE 0x53DB #CJK UNIFIED IDEOGRAPH +0x94BF 0x5E06 #CJK UNIFIED IDEOGRAPH +0x94C0 0x642C #CJK UNIFIED IDEOGRAPH +0x94C1 0x6591 #CJK UNIFIED IDEOGRAPH +0x94C2 0x677F #CJK UNIFIED IDEOGRAPH +0x94C3 0x6C3E #CJK UNIFIED IDEOGRAPH +0x94C4 0x6C4E #CJK UNIFIED IDEOGRAPH +0x94C5 0x7248 #CJK UNIFIED IDEOGRAPH +0x94C6 0x72AF #CJK UNIFIED IDEOGRAPH +0x94C7 0x73ED #CJK UNIFIED IDEOGRAPH +0x94C8 0x7554 #CJK UNIFIED IDEOGRAPH +0x94C9 0x7E41 #CJK UNIFIED IDEOGRAPH +0x94CA 0x822C #CJK UNIFIED IDEOGRAPH +0x94CB 0x85E9 #CJK UNIFIED IDEOGRAPH +0x94CC 0x8CA9 #CJK UNIFIED IDEOGRAPH +0x94CD 0x7BC4 #CJK UNIFIED IDEOGRAPH +0x94CE 0x91C6 #CJK UNIFIED IDEOGRAPH +0x94CF 0x7169 #CJK UNIFIED IDEOGRAPH +0x94D0 0x9812 #CJK UNIFIED IDEOGRAPH +0x94D1 0x98EF #CJK UNIFIED IDEOGRAPH +0x94D2 0x633D #CJK UNIFIED IDEOGRAPH +0x94D3 0x6669 #CJK UNIFIED IDEOGRAPH +0x94D4 0x756A #CJK UNIFIED IDEOGRAPH +0x94D5 0x76E4 #CJK UNIFIED IDEOGRAPH +0x94D6 0x78D0 #CJK UNIFIED IDEOGRAPH +0x94D7 0x8543 #CJK UNIFIED IDEOGRAPH +0x94D8 0x86EE #CJK UNIFIED IDEOGRAPH +0x94D9 0x532A #CJK UNIFIED IDEOGRAPH +0x94DA 0x5351 #CJK UNIFIED IDEOGRAPH +0x94DB 0x5426 #CJK UNIFIED IDEOGRAPH +0x94DC 0x5983 #CJK UNIFIED IDEOGRAPH +0x94DD 0x5E87 #CJK UNIFIED IDEOGRAPH +0x94DE 0x5F7C #CJK UNIFIED IDEOGRAPH +0x94DF 0x60B2 #CJK UNIFIED IDEOGRAPH +0x94E0 0x6249 #CJK UNIFIED IDEOGRAPH +0x94E1 0x6279 #CJK UNIFIED IDEOGRAPH +0x94E2 0x62AB #CJK UNIFIED IDEOGRAPH +0x94E3 0x6590 #CJK UNIFIED IDEOGRAPH +0x94E4 0x6BD4 #CJK UNIFIED IDEOGRAPH +0x94E5 0x6CCC #CJK UNIFIED IDEOGRAPH +0x94E6 0x75B2 #CJK UNIFIED IDEOGRAPH +0x94E7 0x76AE #CJK UNIFIED IDEOGRAPH +0x94E8 0x7891 #CJK UNIFIED IDEOGRAPH +0x94E9 0x79D8 #CJK UNIFIED IDEOGRAPH +0x94EA 0x7DCB #CJK UNIFIED IDEOGRAPH +0x94EB 0x7F77 #CJK UNIFIED IDEOGRAPH +0x94EC 0x80A5 #CJK UNIFIED IDEOGRAPH +0x94ED 0x88AB #CJK UNIFIED IDEOGRAPH +0x94EE 0x8AB9 #CJK UNIFIED IDEOGRAPH +0x94EF 0x8CBB #CJK UNIFIED IDEOGRAPH +0x94F0 0x907F #CJK UNIFIED IDEOGRAPH +0x94F1 0x975E #CJK UNIFIED IDEOGRAPH +0x94F2 0x98DB #CJK UNIFIED IDEOGRAPH +0x94F3 0x6A0B #CJK UNIFIED IDEOGRAPH +0x94F4 0x7C38 #CJK UNIFIED IDEOGRAPH +0x94F5 0x5099 #CJK UNIFIED IDEOGRAPH +0x94F6 0x5C3E #CJK UNIFIED IDEOGRAPH +0x94F7 0x5FAE #CJK UNIFIED IDEOGRAPH +0x94F8 0x6787 #CJK UNIFIED IDEOGRAPH +0x94F9 0x6BD8 #CJK UNIFIED IDEOGRAPH +0x94FA 0x7435 #CJK UNIFIED IDEOGRAPH +0x94FB 0x7709 #CJK UNIFIED IDEOGRAPH +0x94FC 0x7F8E #CJK UNIFIED IDEOGRAPH +0x9540 0x9F3B #CJK UNIFIED IDEOGRAPH +0x9541 0x67CA #CJK UNIFIED IDEOGRAPH +0x9542 0x7A17 #CJK UNIFIED IDEOGRAPH +0x9543 0x5339 #CJK UNIFIED IDEOGRAPH +0x9544 0x758B #CJK UNIFIED IDEOGRAPH +0x9545 0x9AED #CJK UNIFIED IDEOGRAPH +0x9546 0x5F66 #CJK UNIFIED IDEOGRAPH +0x9547 0x819D #CJK UNIFIED IDEOGRAPH +0x9548 0x83F1 #CJK UNIFIED IDEOGRAPH +0x9549 0x8098 #CJK UNIFIED IDEOGRAPH +0x954A 0x5F3C #CJK UNIFIED IDEOGRAPH +0x954B 0x5FC5 #CJK UNIFIED IDEOGRAPH +0x954C 0x7562 #CJK UNIFIED IDEOGRAPH +0x954D 0x7B46 #CJK UNIFIED IDEOGRAPH +0x954E 0x903C #CJK UNIFIED IDEOGRAPH +0x954F 0x6867 #CJK UNIFIED IDEOGRAPH +0x9550 0x59EB #CJK UNIFIED IDEOGRAPH +0x9551 0x5A9B #CJK UNIFIED IDEOGRAPH +0x9552 0x7D10 #CJK UNIFIED IDEOGRAPH +0x9553 0x767E #CJK UNIFIED IDEOGRAPH +0x9554 0x8B2C #CJK UNIFIED IDEOGRAPH +0x9555 0x4FF5 #CJK UNIFIED IDEOGRAPH +0x9556 0x5F6A #CJK UNIFIED IDEOGRAPH +0x9557 0x6A19 #CJK UNIFIED IDEOGRAPH +0x9558 0x6C37 #CJK UNIFIED IDEOGRAPH +0x9559 0x6F02 #CJK UNIFIED IDEOGRAPH +0x955A 0x74E2 #CJK UNIFIED IDEOGRAPH +0x955B 0x7968 #CJK UNIFIED IDEOGRAPH +0x955C 0x8868 #CJK UNIFIED IDEOGRAPH +0x955D 0x8A55 #CJK UNIFIED IDEOGRAPH +0x955E 0x8C79 #CJK UNIFIED IDEOGRAPH +0x955F 0x5EDF #CJK UNIFIED IDEOGRAPH +0x9560 0x63CF #CJK UNIFIED IDEOGRAPH +0x9561 0x75C5 #CJK UNIFIED IDEOGRAPH +0x9562 0x79D2 #CJK UNIFIED IDEOGRAPH +0x9563 0x82D7 #CJK UNIFIED IDEOGRAPH +0x9564 0x9328 #CJK UNIFIED IDEOGRAPH +0x9565 0x92F2 #CJK UNIFIED IDEOGRAPH +0x9566 0x849C #CJK UNIFIED IDEOGRAPH +0x9567 0x86ED #CJK UNIFIED IDEOGRAPH +0x9568 0x9C2D #CJK UNIFIED IDEOGRAPH +0x9569 0x54C1 #CJK UNIFIED IDEOGRAPH +0x956A 0x5F6C #CJK UNIFIED IDEOGRAPH +0x956B 0x658C #CJK UNIFIED IDEOGRAPH +0x956C 0x6D5C #CJK UNIFIED IDEOGRAPH +0x956D 0x7015 #CJK UNIFIED IDEOGRAPH +0x956E 0x8CA7 #CJK UNIFIED IDEOGRAPH +0x956F 0x8CD3 #CJK UNIFIED IDEOGRAPH +0x9570 0x983B #CJK UNIFIED IDEOGRAPH +0x9571 0x654F #CJK UNIFIED IDEOGRAPH +0x9572 0x74F6 #CJK UNIFIED IDEOGRAPH +0x9573 0x4E0D #CJK UNIFIED IDEOGRAPH +0x9574 0x4ED8 #CJK UNIFIED IDEOGRAPH +0x9575 0x57E0 #CJK UNIFIED IDEOGRAPH +0x9576 0x592B #CJK UNIFIED IDEOGRAPH +0x9577 0x5A66 #CJK UNIFIED IDEOGRAPH +0x9578 0x5BCC #CJK UNIFIED IDEOGRAPH +0x9579 0x51A8 #CJK UNIFIED IDEOGRAPH +0x957A 0x5E03 #CJK UNIFIED IDEOGRAPH +0x957B 0x5E9C #CJK UNIFIED IDEOGRAPH +0x957C 0x6016 #CJK UNIFIED IDEOGRAPH +0x957D 0x6276 #CJK UNIFIED IDEOGRAPH +0x957E 0x6577 #CJK UNIFIED IDEOGRAPH +0x9580 0x65A7 #CJK UNIFIED IDEOGRAPH +0x9581 0x666E #CJK UNIFIED IDEOGRAPH +0x9582 0x6D6E #CJK UNIFIED IDEOGRAPH +0x9583 0x7236 #CJK UNIFIED IDEOGRAPH +0x9584 0x7B26 #CJK UNIFIED IDEOGRAPH +0x9585 0x8150 #CJK UNIFIED IDEOGRAPH +0x9586 0x819A #CJK UNIFIED IDEOGRAPH +0x9587 0x8299 #CJK UNIFIED IDEOGRAPH +0x9588 0x8B5C #CJK UNIFIED IDEOGRAPH +0x9589 0x8CA0 #CJK UNIFIED IDEOGRAPH +0x958A 0x8CE6 #CJK UNIFIED IDEOGRAPH +0x958B 0x8D74 #CJK UNIFIED IDEOGRAPH +0x958C 0x961C #CJK UNIFIED IDEOGRAPH +0x958D 0x9644 #CJK UNIFIED IDEOGRAPH +0x958E 0x4FAE #CJK UNIFIED IDEOGRAPH +0x958F 0x64AB #CJK UNIFIED IDEOGRAPH +0x9590 0x6B66 #CJK UNIFIED IDEOGRAPH +0x9591 0x821E #CJK UNIFIED IDEOGRAPH +0x9592 0x8461 #CJK UNIFIED IDEOGRAPH +0x9593 0x856A #CJK UNIFIED IDEOGRAPH +0x9594 0x90E8 #CJK UNIFIED IDEOGRAPH +0x9595 0x5C01 #CJK UNIFIED IDEOGRAPH +0x9596 0x6953 #CJK UNIFIED IDEOGRAPH +0x9597 0x98A8 #CJK UNIFIED IDEOGRAPH +0x9598 0x847A #CJK UNIFIED IDEOGRAPH +0x9599 0x8557 #CJK UNIFIED IDEOGRAPH +0x959A 0x4F0F #CJK UNIFIED IDEOGRAPH +0x959B 0x526F #CJK UNIFIED IDEOGRAPH +0x959C 0x5FA9 #CJK UNIFIED IDEOGRAPH +0x959D 0x5E45 #CJK UNIFIED IDEOGRAPH +0x959E 0x670D #CJK UNIFIED IDEOGRAPH +0x959F 0x798F #CJK UNIFIED IDEOGRAPH +0x95A0 0x8179 #CJK UNIFIED IDEOGRAPH +0x95A1 0x8907 #CJK UNIFIED IDEOGRAPH +0x95A2 0x8986 #CJK UNIFIED IDEOGRAPH +0x95A3 0x6DF5 #CJK UNIFIED IDEOGRAPH +0x95A4 0x5F17 #CJK UNIFIED IDEOGRAPH +0x95A5 0x6255 #CJK UNIFIED IDEOGRAPH +0x95A6 0x6CB8 #CJK UNIFIED IDEOGRAPH +0x95A7 0x4ECF #CJK UNIFIED IDEOGRAPH +0x95A8 0x7269 #CJK UNIFIED IDEOGRAPH +0x95A9 0x9B92 #CJK UNIFIED IDEOGRAPH +0x95AA 0x5206 #CJK UNIFIED IDEOGRAPH +0x95AB 0x543B #CJK UNIFIED IDEOGRAPH +0x95AC 0x5674 #CJK UNIFIED IDEOGRAPH +0x95AD 0x58B3 #CJK UNIFIED IDEOGRAPH +0x95AE 0x61A4 #CJK UNIFIED IDEOGRAPH +0x95AF 0x626E #CJK UNIFIED IDEOGRAPH +0x95B0 0x711A #CJK UNIFIED IDEOGRAPH +0x95B1 0x596E #CJK UNIFIED IDEOGRAPH +0x95B2 0x7C89 #CJK UNIFIED IDEOGRAPH +0x95B3 0x7CDE #CJK UNIFIED IDEOGRAPH +0x95B4 0x7D1B #CJK UNIFIED IDEOGRAPH +0x95B5 0x96F0 #CJK UNIFIED IDEOGRAPH +0x95B6 0x6587 #CJK UNIFIED IDEOGRAPH +0x95B7 0x805E #CJK UNIFIED IDEOGRAPH +0x95B8 0x4E19 #CJK UNIFIED IDEOGRAPH +0x95B9 0x4F75 #CJK UNIFIED IDEOGRAPH +0x95BA 0x5175 #CJK UNIFIED IDEOGRAPH +0x95BB 0x5840 #CJK UNIFIED IDEOGRAPH +0x95BC 0x5E63 #CJK UNIFIED IDEOGRAPH +0x95BD 0x5E73 #CJK UNIFIED IDEOGRAPH +0x95BE 0x5F0A #CJK UNIFIED IDEOGRAPH +0x95BF 0x67C4 #CJK UNIFIED IDEOGRAPH +0x95C0 0x4E26 #CJK UNIFIED IDEOGRAPH +0x95C1 0x853D #CJK UNIFIED IDEOGRAPH +0x95C2 0x9589 #CJK UNIFIED IDEOGRAPH +0x95C3 0x965B #CJK UNIFIED IDEOGRAPH +0x95C4 0x7C73 #CJK UNIFIED IDEOGRAPH +0x95C5 0x9801 #CJK UNIFIED IDEOGRAPH +0x95C6 0x50FB #CJK UNIFIED IDEOGRAPH +0x95C7 0x58C1 #CJK UNIFIED IDEOGRAPH +0x95C8 0x7656 #CJK UNIFIED IDEOGRAPH +0x95C9 0x78A7 #CJK UNIFIED IDEOGRAPH +0x95CA 0x5225 #CJK UNIFIED IDEOGRAPH +0x95CB 0x77A5 #CJK UNIFIED IDEOGRAPH +0x95CC 0x8511 #CJK UNIFIED IDEOGRAPH +0x95CD 0x7B86 #CJK UNIFIED IDEOGRAPH +0x95CE 0x504F #CJK UNIFIED IDEOGRAPH +0x95CF 0x5909 #CJK UNIFIED IDEOGRAPH +0x95D0 0x7247 #CJK UNIFIED IDEOGRAPH +0x95D1 0x7BC7 #CJK UNIFIED IDEOGRAPH +0x95D2 0x7DE8 #CJK UNIFIED IDEOGRAPH +0x95D3 0x8FBA #CJK UNIFIED IDEOGRAPH +0x95D4 0x8FD4 #CJK UNIFIED IDEOGRAPH +0x95D5 0x904D #CJK UNIFIED IDEOGRAPH +0x95D6 0x4FBF #CJK UNIFIED IDEOGRAPH +0x95D7 0x52C9 #CJK UNIFIED IDEOGRAPH +0x95D8 0x5A29 #CJK UNIFIED IDEOGRAPH +0x95D9 0x5F01 #CJK UNIFIED IDEOGRAPH +0x95DA 0x97AD #CJK UNIFIED IDEOGRAPH +0x95DB 0x4FDD #CJK UNIFIED IDEOGRAPH +0x95DC 0x8217 #CJK UNIFIED IDEOGRAPH +0x95DD 0x92EA #CJK UNIFIED IDEOGRAPH +0x95DE 0x5703 #CJK UNIFIED IDEOGRAPH +0x95DF 0x6355 #CJK UNIFIED IDEOGRAPH +0x95E0 0x6B69 #CJK UNIFIED IDEOGRAPH +0x95E1 0x752B #CJK UNIFIED IDEOGRAPH +0x95E2 0x88DC #CJK UNIFIED IDEOGRAPH +0x95E3 0x8F14 #CJK UNIFIED IDEOGRAPH +0x95E4 0x7A42 #CJK UNIFIED IDEOGRAPH +0x95E5 0x52DF #CJK UNIFIED IDEOGRAPH +0x95E6 0x5893 #CJK UNIFIED IDEOGRAPH +0x95E7 0x6155 #CJK UNIFIED IDEOGRAPH +0x95E8 0x620A #CJK UNIFIED IDEOGRAPH +0x95E9 0x66AE #CJK UNIFIED IDEOGRAPH +0x95EA 0x6BCD #CJK UNIFIED IDEOGRAPH +0x95EB 0x7C3F #CJK UNIFIED IDEOGRAPH +0x95EC 0x83E9 #CJK UNIFIED IDEOGRAPH +0x95ED 0x5023 #CJK UNIFIED IDEOGRAPH +0x95EE 0x4FF8 #CJK UNIFIED IDEOGRAPH +0x95EF 0x5305 #CJK UNIFIED IDEOGRAPH +0x95F0 0x5446 #CJK UNIFIED IDEOGRAPH +0x95F1 0x5831 #CJK UNIFIED IDEOGRAPH +0x95F2 0x5949 #CJK UNIFIED IDEOGRAPH +0x95F3 0x5B9D #CJK UNIFIED IDEOGRAPH +0x95F4 0x5CF0 #CJK UNIFIED IDEOGRAPH +0x95F5 0x5CEF #CJK UNIFIED IDEOGRAPH +0x95F6 0x5D29 #CJK UNIFIED IDEOGRAPH +0x95F7 0x5E96 #CJK UNIFIED IDEOGRAPH +0x95F8 0x62B1 #CJK UNIFIED IDEOGRAPH +0x95F9 0x6367 #CJK UNIFIED IDEOGRAPH +0x95FA 0x653E #CJK UNIFIED IDEOGRAPH +0x95FB 0x65B9 #CJK UNIFIED IDEOGRAPH +0x95FC 0x670B #CJK UNIFIED IDEOGRAPH +0x9640 0x6CD5 #CJK UNIFIED IDEOGRAPH +0x9641 0x6CE1 #CJK UNIFIED IDEOGRAPH +0x9642 0x70F9 #CJK UNIFIED IDEOGRAPH +0x9643 0x7832 #CJK UNIFIED IDEOGRAPH +0x9644 0x7E2B #CJK UNIFIED IDEOGRAPH +0x9645 0x80DE #CJK UNIFIED IDEOGRAPH +0x9646 0x82B3 #CJK UNIFIED IDEOGRAPH +0x9647 0x840C #CJK UNIFIED IDEOGRAPH +0x9648 0x84EC #CJK UNIFIED IDEOGRAPH +0x9649 0x8702 #CJK UNIFIED IDEOGRAPH +0x964A 0x8912 #CJK UNIFIED IDEOGRAPH +0x964B 0x8A2A #CJK UNIFIED IDEOGRAPH +0x964C 0x8C4A #CJK UNIFIED IDEOGRAPH +0x964D 0x90A6 #CJK UNIFIED IDEOGRAPH +0x964E 0x92D2 #CJK UNIFIED IDEOGRAPH +0x964F 0x98FD #CJK UNIFIED IDEOGRAPH +0x9650 0x9CF3 #CJK UNIFIED IDEOGRAPH +0x9651 0x9D6C #CJK UNIFIED IDEOGRAPH +0x9652 0x4E4F #CJK UNIFIED IDEOGRAPH +0x9653 0x4EA1 #CJK UNIFIED IDEOGRAPH +0x9654 0x508D #CJK UNIFIED IDEOGRAPH +0x9655 0x5256 #CJK UNIFIED IDEOGRAPH +0x9656 0x574A #CJK UNIFIED IDEOGRAPH +0x9657 0x59A8 #CJK UNIFIED IDEOGRAPH +0x9658 0x5E3D #CJK UNIFIED IDEOGRAPH +0x9659 0x5FD8 #CJK UNIFIED IDEOGRAPH +0x965A 0x5FD9 #CJK UNIFIED IDEOGRAPH +0x965B 0x623F #CJK UNIFIED IDEOGRAPH +0x965C 0x66B4 #CJK UNIFIED IDEOGRAPH +0x965D 0x671B #CJK UNIFIED IDEOGRAPH +0x965E 0x67D0 #CJK UNIFIED IDEOGRAPH +0x965F 0x68D2 #CJK UNIFIED IDEOGRAPH +0x9660 0x5192 #CJK UNIFIED IDEOGRAPH +0x9661 0x7D21 #CJK UNIFIED IDEOGRAPH +0x9662 0x80AA #CJK UNIFIED IDEOGRAPH +0x9663 0x81A8 #CJK UNIFIED IDEOGRAPH +0x9664 0x8B00 #CJK UNIFIED IDEOGRAPH +0x9665 0x8C8C #CJK UNIFIED IDEOGRAPH +0x9666 0x8CBF #CJK UNIFIED IDEOGRAPH +0x9667 0x927E #CJK UNIFIED IDEOGRAPH +0x9668 0x9632 #CJK UNIFIED IDEOGRAPH +0x9669 0x5420 #CJK UNIFIED IDEOGRAPH +0x966A 0x982C #CJK UNIFIED IDEOGRAPH +0x966B 0x5317 #CJK UNIFIED IDEOGRAPH +0x966C 0x50D5 #CJK UNIFIED IDEOGRAPH +0x966D 0x535C #CJK UNIFIED IDEOGRAPH +0x966E 0x58A8 #CJK UNIFIED IDEOGRAPH +0x966F 0x64B2 #CJK UNIFIED IDEOGRAPH +0x9670 0x6734 #CJK UNIFIED IDEOGRAPH +0x9671 0x7267 #CJK UNIFIED IDEOGRAPH +0x9672 0x7766 #CJK UNIFIED IDEOGRAPH +0x9673 0x7A46 #CJK UNIFIED IDEOGRAPH +0x9674 0x91E6 #CJK UNIFIED IDEOGRAPH +0x9675 0x52C3 #CJK UNIFIED IDEOGRAPH +0x9676 0x6CA1 #CJK UNIFIED IDEOGRAPH +0x9677 0x6B86 #CJK UNIFIED IDEOGRAPH +0x9678 0x5800 #CJK UNIFIED IDEOGRAPH +0x9679 0x5E4C #CJK UNIFIED IDEOGRAPH +0x967A 0x5954 #CJK UNIFIED IDEOGRAPH +0x967B 0x672C #CJK UNIFIED IDEOGRAPH +0x967C 0x7FFB #CJK UNIFIED IDEOGRAPH +0x967D 0x51E1 #CJK UNIFIED IDEOGRAPH +0x967E 0x76C6 #CJK UNIFIED IDEOGRAPH +0x9680 0x6469 #CJK UNIFIED IDEOGRAPH +0x9681 0x78E8 #CJK UNIFIED IDEOGRAPH +0x9682 0x9B54 #CJK UNIFIED IDEOGRAPH +0x9683 0x9EBB #CJK UNIFIED IDEOGRAPH +0x9684 0x57CB #CJK UNIFIED IDEOGRAPH +0x9685 0x59B9 #CJK UNIFIED IDEOGRAPH +0x9686 0x6627 #CJK UNIFIED IDEOGRAPH +0x9687 0x679A #CJK UNIFIED IDEOGRAPH +0x9688 0x6BCE #CJK UNIFIED IDEOGRAPH +0x9689 0x54E9 #CJK UNIFIED IDEOGRAPH +0x968A 0x69D9 #CJK UNIFIED IDEOGRAPH +0x968B 0x5E55 #CJK UNIFIED IDEOGRAPH +0x968C 0x819C #CJK UNIFIED IDEOGRAPH +0x968D 0x6795 #CJK UNIFIED IDEOGRAPH +0x968E 0x9BAA #CJK UNIFIED IDEOGRAPH +0x968F 0x67FE #CJK UNIFIED IDEOGRAPH +0x9690 0x9C52 #CJK UNIFIED IDEOGRAPH +0x9691 0x685D #CJK UNIFIED IDEOGRAPH +0x9692 0x4EA6 #CJK UNIFIED IDEOGRAPH +0x9693 0x4FE3 #CJK UNIFIED IDEOGRAPH +0x9694 0x53C8 #CJK UNIFIED IDEOGRAPH +0x9695 0x62B9 #CJK UNIFIED IDEOGRAPH +0x9696 0x672B #CJK UNIFIED IDEOGRAPH +0x9697 0x6CAB #CJK UNIFIED IDEOGRAPH +0x9698 0x8FC4 #CJK UNIFIED IDEOGRAPH +0x9699 0x4FAD #CJK UNIFIED IDEOGRAPH +0x969A 0x7E6D #CJK UNIFIED IDEOGRAPH +0x969B 0x9EBF #CJK UNIFIED IDEOGRAPH +0x969C 0x4E07 #CJK UNIFIED IDEOGRAPH +0x969D 0x6162 #CJK UNIFIED IDEOGRAPH +0x969E 0x6E80 #CJK UNIFIED IDEOGRAPH +0x969F 0x6F2B #CJK UNIFIED IDEOGRAPH +0x96A0 0x8513 #CJK UNIFIED IDEOGRAPH +0x96A1 0x5473 #CJK UNIFIED IDEOGRAPH +0x96A2 0x672A #CJK UNIFIED IDEOGRAPH +0x96A3 0x9B45 #CJK UNIFIED IDEOGRAPH +0x96A4 0x5DF3 #CJK UNIFIED IDEOGRAPH +0x96A5 0x7B95 #CJK UNIFIED IDEOGRAPH +0x96A6 0x5CAC #CJK UNIFIED IDEOGRAPH +0x96A7 0x5BC6 #CJK UNIFIED IDEOGRAPH +0x96A8 0x871C #CJK UNIFIED IDEOGRAPH +0x96A9 0x6E4A #CJK UNIFIED IDEOGRAPH +0x96AA 0x84D1 #CJK UNIFIED IDEOGRAPH +0x96AB 0x7A14 #CJK UNIFIED IDEOGRAPH +0x96AC 0x8108 #CJK UNIFIED IDEOGRAPH +0x96AD 0x5999 #CJK UNIFIED IDEOGRAPH +0x96AE 0x7C8D #CJK UNIFIED IDEOGRAPH +0x96AF 0x6C11 #CJK UNIFIED IDEOGRAPH +0x96B0 0x7720 #CJK UNIFIED IDEOGRAPH +0x96B1 0x52D9 #CJK UNIFIED IDEOGRAPH +0x96B2 0x5922 #CJK UNIFIED IDEOGRAPH +0x96B3 0x7121 #CJK UNIFIED IDEOGRAPH +0x96B4 0x725F #CJK UNIFIED IDEOGRAPH +0x96B5 0x77DB #CJK UNIFIED IDEOGRAPH +0x96B6 0x9727 #CJK UNIFIED IDEOGRAPH +0x96B7 0x9D61 #CJK UNIFIED IDEOGRAPH +0x96B8 0x690B #CJK UNIFIED IDEOGRAPH +0x96B9 0x5A7F #CJK UNIFIED IDEOGRAPH +0x96BA 0x5A18 #CJK UNIFIED IDEOGRAPH +0x96BB 0x51A5 #CJK UNIFIED IDEOGRAPH +0x96BC 0x540D #CJK UNIFIED IDEOGRAPH +0x96BD 0x547D #CJK UNIFIED IDEOGRAPH +0x96BE 0x660E #CJK UNIFIED IDEOGRAPH +0x96BF 0x76DF #CJK UNIFIED IDEOGRAPH +0x96C0 0x8FF7 #CJK UNIFIED IDEOGRAPH +0x96C1 0x9298 #CJK UNIFIED IDEOGRAPH +0x96C2 0x9CF4 #CJK UNIFIED IDEOGRAPH +0x96C3 0x59EA #CJK UNIFIED IDEOGRAPH +0x96C4 0x725D #CJK UNIFIED IDEOGRAPH +0x96C5 0x6EC5 #CJK UNIFIED IDEOGRAPH +0x96C6 0x514D #CJK UNIFIED IDEOGRAPH +0x96C7 0x68C9 #CJK UNIFIED IDEOGRAPH +0x96C8 0x7DBF #CJK UNIFIED IDEOGRAPH +0x96C9 0x7DEC #CJK UNIFIED IDEOGRAPH +0x96CA 0x9762 #CJK UNIFIED IDEOGRAPH +0x96CB 0x9EBA #CJK UNIFIED IDEOGRAPH +0x96CC 0x6478 #CJK UNIFIED IDEOGRAPH +0x96CD 0x6A21 #CJK UNIFIED IDEOGRAPH +0x96CE 0x8302 #CJK UNIFIED IDEOGRAPH +0x96CF 0x5984 #CJK UNIFIED IDEOGRAPH +0x96D0 0x5B5F #CJK UNIFIED IDEOGRAPH +0x96D1 0x6BDB #CJK UNIFIED IDEOGRAPH +0x96D2 0x731B #CJK UNIFIED IDEOGRAPH +0x96D3 0x76F2 #CJK UNIFIED IDEOGRAPH +0x96D4 0x7DB2 #CJK UNIFIED IDEOGRAPH +0x96D5 0x8017 #CJK UNIFIED IDEOGRAPH +0x96D6 0x8499 #CJK UNIFIED IDEOGRAPH +0x96D7 0x5132 #CJK UNIFIED IDEOGRAPH +0x96D8 0x6728 #CJK UNIFIED IDEOGRAPH +0x96D9 0x9ED9 #CJK UNIFIED IDEOGRAPH +0x96DA 0x76EE #CJK UNIFIED IDEOGRAPH +0x96DB 0x6762 #CJK UNIFIED IDEOGRAPH +0x96DC 0x52FF #CJK UNIFIED IDEOGRAPH +0x96DD 0x9905 #CJK UNIFIED IDEOGRAPH +0x96DE 0x5C24 #CJK UNIFIED IDEOGRAPH +0x96DF 0x623B #CJK UNIFIED IDEOGRAPH +0x96E0 0x7C7E #CJK UNIFIED IDEOGRAPH +0x96E1 0x8CB0 #CJK UNIFIED IDEOGRAPH +0x96E2 0x554F #CJK UNIFIED IDEOGRAPH +0x96E3 0x60B6 #CJK UNIFIED IDEOGRAPH +0x96E4 0x7D0B #CJK UNIFIED IDEOGRAPH +0x96E5 0x9580 #CJK UNIFIED IDEOGRAPH +0x96E6 0x5301 #CJK UNIFIED IDEOGRAPH +0x96E7 0x4E5F #CJK UNIFIED IDEOGRAPH +0x96E8 0x51B6 #CJK UNIFIED IDEOGRAPH +0x96E9 0x591C #CJK UNIFIED IDEOGRAPH +0x96EA 0x723A #CJK UNIFIED IDEOGRAPH +0x96EB 0x8036 #CJK UNIFIED IDEOGRAPH +0x96EC 0x91CE #CJK UNIFIED IDEOGRAPH +0x96ED 0x5F25 #CJK UNIFIED IDEOGRAPH +0x96EE 0x77E2 #CJK UNIFIED IDEOGRAPH +0x96EF 0x5384 #CJK UNIFIED IDEOGRAPH +0x96F0 0x5F79 #CJK UNIFIED IDEOGRAPH +0x96F1 0x7D04 #CJK UNIFIED IDEOGRAPH +0x96F2 0x85AC #CJK UNIFIED IDEOGRAPH +0x96F3 0x8A33 #CJK UNIFIED IDEOGRAPH +0x96F4 0x8E8D #CJK UNIFIED IDEOGRAPH +0x96F5 0x9756 #CJK UNIFIED IDEOGRAPH +0x96F6 0x67F3 #CJK UNIFIED IDEOGRAPH +0x96F7 0x85AE #CJK UNIFIED IDEOGRAPH +0x96F8 0x9453 #CJK UNIFIED IDEOGRAPH +0x96F9 0x6109 #CJK UNIFIED IDEOGRAPH +0x96FA 0x6108 #CJK UNIFIED IDEOGRAPH +0x96FB 0x6CB9 #CJK UNIFIED IDEOGRAPH +0x96FC 0x7652 #CJK UNIFIED IDEOGRAPH +0x9740 0x8AED #CJK UNIFIED IDEOGRAPH +0x9741 0x8F38 #CJK UNIFIED IDEOGRAPH +0x9742 0x552F #CJK UNIFIED IDEOGRAPH +0x9743 0x4F51 #CJK UNIFIED IDEOGRAPH +0x9744 0x512A #CJK UNIFIED IDEOGRAPH +0x9745 0x52C7 #CJK UNIFIED IDEOGRAPH +0x9746 0x53CB #CJK UNIFIED IDEOGRAPH +0x9747 0x5BA5 #CJK UNIFIED IDEOGRAPH +0x9748 0x5E7D #CJK UNIFIED IDEOGRAPH +0x9749 0x60A0 #CJK UNIFIED IDEOGRAPH +0x974A 0x6182 #CJK UNIFIED IDEOGRAPH +0x974B 0x63D6 #CJK UNIFIED IDEOGRAPH +0x974C 0x6709 #CJK UNIFIED IDEOGRAPH +0x974D 0x67DA #CJK UNIFIED IDEOGRAPH +0x974E 0x6E67 #CJK UNIFIED IDEOGRAPH +0x974F 0x6D8C #CJK UNIFIED IDEOGRAPH +0x9750 0x7336 #CJK UNIFIED IDEOGRAPH +0x9751 0x7337 #CJK UNIFIED IDEOGRAPH +0x9752 0x7531 #CJK UNIFIED IDEOGRAPH +0x9753 0x7950 #CJK UNIFIED IDEOGRAPH +0x9754 0x88D5 #CJK UNIFIED IDEOGRAPH +0x9755 0x8A98 #CJK UNIFIED IDEOGRAPH +0x9756 0x904A #CJK UNIFIED IDEOGRAPH +0x9757 0x9091 #CJK UNIFIED IDEOGRAPH +0x9758 0x90F5 #CJK UNIFIED IDEOGRAPH +0x9759 0x96C4 #CJK UNIFIED IDEOGRAPH +0x975A 0x878D #CJK UNIFIED IDEOGRAPH +0x975B 0x5915 #CJK UNIFIED IDEOGRAPH +0x975C 0x4E88 #CJK UNIFIED IDEOGRAPH +0x975D 0x4F59 #CJK UNIFIED IDEOGRAPH +0x975E 0x4E0E #CJK UNIFIED IDEOGRAPH +0x975F 0x8A89 #CJK UNIFIED IDEOGRAPH +0x9760 0x8F3F #CJK UNIFIED IDEOGRAPH +0x9761 0x9810 #CJK UNIFIED IDEOGRAPH +0x9762 0x50AD #CJK UNIFIED IDEOGRAPH +0x9763 0x5E7C #CJK UNIFIED IDEOGRAPH +0x9764 0x5996 #CJK UNIFIED IDEOGRAPH +0x9765 0x5BB9 #CJK UNIFIED IDEOGRAPH +0x9766 0x5EB8 #CJK UNIFIED IDEOGRAPH +0x9767 0x63DA #CJK UNIFIED IDEOGRAPH +0x9768 0x63FA #CJK UNIFIED IDEOGRAPH +0x9769 0x64C1 #CJK UNIFIED IDEOGRAPH +0x976A 0x66DC #CJK UNIFIED IDEOGRAPH +0x976B 0x694A #CJK UNIFIED IDEOGRAPH +0x976C 0x69D8 #CJK UNIFIED IDEOGRAPH +0x976D 0x6D0B #CJK UNIFIED IDEOGRAPH +0x976E 0x6EB6 #CJK UNIFIED IDEOGRAPH +0x976F 0x7194 #CJK UNIFIED IDEOGRAPH +0x9770 0x7528 #CJK UNIFIED IDEOGRAPH +0x9771 0x7AAF #CJK UNIFIED IDEOGRAPH +0x9772 0x7F8A #CJK UNIFIED IDEOGRAPH +0x9773 0x8000 #CJK UNIFIED IDEOGRAPH +0x9774 0x8449 #CJK UNIFIED IDEOGRAPH +0x9775 0x84C9 #CJK UNIFIED IDEOGRAPH +0x9776 0x8981 #CJK UNIFIED IDEOGRAPH +0x9777 0x8B21 #CJK UNIFIED IDEOGRAPH +0x9778 0x8E0A #CJK UNIFIED IDEOGRAPH +0x9779 0x9065 #CJK UNIFIED IDEOGRAPH +0x977A 0x967D #CJK UNIFIED IDEOGRAPH +0x977B 0x990A #CJK UNIFIED IDEOGRAPH +0x977C 0x617E #CJK UNIFIED IDEOGRAPH +0x977D 0x6291 #CJK UNIFIED IDEOGRAPH +0x977E 0x6B32 #CJK UNIFIED IDEOGRAPH +0x9780 0x6C83 #CJK UNIFIED IDEOGRAPH +0x9781 0x6D74 #CJK UNIFIED IDEOGRAPH +0x9782 0x7FCC #CJK UNIFIED IDEOGRAPH +0x9783 0x7FFC #CJK UNIFIED IDEOGRAPH +0x9784 0x6DC0 #CJK UNIFIED IDEOGRAPH +0x9785 0x7F85 #CJK UNIFIED IDEOGRAPH +0x9786 0x87BA #CJK UNIFIED IDEOGRAPH +0x9787 0x88F8 #CJK UNIFIED IDEOGRAPH +0x9788 0x6765 #CJK UNIFIED IDEOGRAPH +0x9789 0x83B1 #CJK UNIFIED IDEOGRAPH +0x978A 0x983C #CJK UNIFIED IDEOGRAPH +0x978B 0x96F7 #CJK UNIFIED IDEOGRAPH +0x978C 0x6D1B #CJK UNIFIED IDEOGRAPH +0x978D 0x7D61 #CJK UNIFIED IDEOGRAPH +0x978E 0x843D #CJK UNIFIED IDEOGRAPH +0x978F 0x916A #CJK UNIFIED IDEOGRAPH +0x9790 0x4E71 #CJK UNIFIED IDEOGRAPH +0x9791 0x5375 #CJK UNIFIED IDEOGRAPH +0x9792 0x5D50 #CJK UNIFIED IDEOGRAPH +0x9793 0x6B04 #CJK UNIFIED IDEOGRAPH +0x9794 0x6FEB #CJK UNIFIED IDEOGRAPH +0x9795 0x85CD #CJK UNIFIED IDEOGRAPH +0x9796 0x862D #CJK UNIFIED IDEOGRAPH +0x9797 0x89A7 #CJK UNIFIED IDEOGRAPH +0x9798 0x5229 #CJK UNIFIED IDEOGRAPH +0x9799 0x540F #CJK UNIFIED IDEOGRAPH +0x979A 0x5C65 #CJK UNIFIED IDEOGRAPH +0x979B 0x674E #CJK UNIFIED IDEOGRAPH +0x979C 0x68A8 #CJK UNIFIED IDEOGRAPH +0x979D 0x7406 #CJK UNIFIED IDEOGRAPH +0x979E 0x7483 #CJK UNIFIED IDEOGRAPH +0x979F 0x75E2 #CJK UNIFIED IDEOGRAPH +0x97A0 0x88CF #CJK UNIFIED IDEOGRAPH +0x97A1 0x88E1 #CJK UNIFIED IDEOGRAPH +0x97A2 0x91CC #CJK UNIFIED IDEOGRAPH +0x97A3 0x96E2 #CJK UNIFIED IDEOGRAPH +0x97A4 0x9678 #CJK UNIFIED IDEOGRAPH +0x97A5 0x5F8B #CJK UNIFIED IDEOGRAPH +0x97A6 0x7387 #CJK UNIFIED IDEOGRAPH +0x97A7 0x7ACB #CJK UNIFIED IDEOGRAPH +0x97A8 0x844E #CJK UNIFIED IDEOGRAPH +0x97A9 0x63A0 #CJK UNIFIED IDEOGRAPH +0x97AA 0x7565 #CJK UNIFIED IDEOGRAPH +0x97AB 0x5289 #CJK UNIFIED IDEOGRAPH +0x97AC 0x6D41 #CJK UNIFIED IDEOGRAPH +0x97AD 0x6E9C #CJK UNIFIED IDEOGRAPH +0x97AE 0x7409 #CJK UNIFIED IDEOGRAPH +0x97AF 0x7559 #CJK UNIFIED IDEOGRAPH +0x97B0 0x786B #CJK UNIFIED IDEOGRAPH +0x97B1 0x7C92 #CJK UNIFIED IDEOGRAPH +0x97B2 0x9686 #CJK UNIFIED IDEOGRAPH +0x97B3 0x7ADC #CJK UNIFIED IDEOGRAPH +0x97B4 0x9F8D #CJK UNIFIED IDEOGRAPH +0x97B5 0x4FB6 #CJK UNIFIED IDEOGRAPH +0x97B6 0x616E #CJK UNIFIED IDEOGRAPH +0x97B7 0x65C5 #CJK UNIFIED IDEOGRAPH +0x97B8 0x865C #CJK UNIFIED IDEOGRAPH +0x97B9 0x4E86 #CJK UNIFIED IDEOGRAPH +0x97BA 0x4EAE #CJK UNIFIED IDEOGRAPH +0x97BB 0x50DA #CJK UNIFIED IDEOGRAPH +0x97BC 0x4E21 #CJK UNIFIED IDEOGRAPH +0x97BD 0x51CC #CJK UNIFIED IDEOGRAPH +0x97BE 0x5BEE #CJK UNIFIED IDEOGRAPH +0x97BF 0x6599 #CJK UNIFIED IDEOGRAPH +0x97C0 0x6881 #CJK UNIFIED IDEOGRAPH +0x97C1 0x6DBC #CJK UNIFIED IDEOGRAPH +0x97C2 0x731F #CJK UNIFIED IDEOGRAPH +0x97C3 0x7642 #CJK UNIFIED IDEOGRAPH +0x97C4 0x77AD #CJK UNIFIED IDEOGRAPH +0x97C5 0x7A1C #CJK UNIFIED IDEOGRAPH +0x97C6 0x7CE7 #CJK UNIFIED IDEOGRAPH +0x97C7 0x826F #CJK UNIFIED IDEOGRAPH +0x97C8 0x8AD2 #CJK UNIFIED IDEOGRAPH +0x97C9 0x907C #CJK UNIFIED IDEOGRAPH +0x97CA 0x91CF #CJK UNIFIED IDEOGRAPH +0x97CB 0x9675 #CJK UNIFIED IDEOGRAPH +0x97CC 0x9818 #CJK UNIFIED IDEOGRAPH +0x97CD 0x529B #CJK UNIFIED IDEOGRAPH +0x97CE 0x7DD1 #CJK UNIFIED IDEOGRAPH +0x97CF 0x502B #CJK UNIFIED IDEOGRAPH +0x97D0 0x5398 #CJK UNIFIED IDEOGRAPH +0x97D1 0x6797 #CJK UNIFIED IDEOGRAPH +0x97D2 0x6DCB #CJK UNIFIED IDEOGRAPH +0x97D3 0x71D0 #CJK UNIFIED IDEOGRAPH +0x97D4 0x7433 #CJK UNIFIED IDEOGRAPH +0x97D5 0x81E8 #CJK UNIFIED IDEOGRAPH +0x97D6 0x8F2A #CJK UNIFIED IDEOGRAPH +0x97D7 0x96A3 #CJK UNIFIED IDEOGRAPH +0x97D8 0x9C57 #CJK UNIFIED IDEOGRAPH +0x97D9 0x9E9F #CJK UNIFIED IDEOGRAPH +0x97DA 0x7460 #CJK UNIFIED IDEOGRAPH +0x97DB 0x5841 #CJK UNIFIED IDEOGRAPH +0x97DC 0x6D99 #CJK UNIFIED IDEOGRAPH +0x97DD 0x7D2F #CJK UNIFIED IDEOGRAPH +0x97DE 0x985E #CJK UNIFIED IDEOGRAPH +0x97DF 0x4EE4 #CJK UNIFIED IDEOGRAPH +0x97E0 0x4F36 #CJK UNIFIED IDEOGRAPH +0x97E1 0x4F8B #CJK UNIFIED IDEOGRAPH +0x97E2 0x51B7 #CJK UNIFIED IDEOGRAPH +0x97E3 0x52B1 #CJK UNIFIED IDEOGRAPH +0x97E4 0x5DBA #CJK UNIFIED IDEOGRAPH +0x97E5 0x601C #CJK UNIFIED IDEOGRAPH +0x97E6 0x73B2 #CJK UNIFIED IDEOGRAPH +0x97E7 0x793C #CJK UNIFIED IDEOGRAPH +0x97E8 0x82D3 #CJK UNIFIED IDEOGRAPH +0x97E9 0x9234 #CJK UNIFIED IDEOGRAPH +0x97EA 0x96B7 #CJK UNIFIED IDEOGRAPH +0x97EB 0x96F6 #CJK UNIFIED IDEOGRAPH +0x97EC 0x970A #CJK UNIFIED IDEOGRAPH +0x97ED 0x9E97 #CJK UNIFIED IDEOGRAPH +0x97EE 0x9F62 #CJK UNIFIED IDEOGRAPH +0x97EF 0x66A6 #CJK UNIFIED IDEOGRAPH +0x97F0 0x6B74 #CJK UNIFIED IDEOGRAPH +0x97F1 0x5217 #CJK UNIFIED IDEOGRAPH +0x97F2 0x52A3 #CJK UNIFIED IDEOGRAPH +0x97F3 0x70C8 #CJK UNIFIED IDEOGRAPH +0x97F4 0x88C2 #CJK UNIFIED IDEOGRAPH +0x97F5 0x5EC9 #CJK UNIFIED IDEOGRAPH +0x97F6 0x604B #CJK UNIFIED IDEOGRAPH +0x97F7 0x6190 #CJK UNIFIED IDEOGRAPH +0x97F8 0x6F23 #CJK UNIFIED IDEOGRAPH +0x97F9 0x7149 #CJK UNIFIED IDEOGRAPH +0x97FA 0x7C3E #CJK UNIFIED IDEOGRAPH +0x97FB 0x7DF4 #CJK UNIFIED IDEOGRAPH +0x97FC 0x806F #CJK UNIFIED IDEOGRAPH +0x9840 0x84EE #CJK UNIFIED IDEOGRAPH +0x9841 0x9023 #CJK UNIFIED IDEOGRAPH +0x9842 0x932C #CJK UNIFIED IDEOGRAPH +0x9843 0x5442 #CJK UNIFIED IDEOGRAPH +0x9844 0x9B6F #CJK UNIFIED IDEOGRAPH +0x9845 0x6AD3 #CJK UNIFIED IDEOGRAPH +0x9846 0x7089 #CJK UNIFIED IDEOGRAPH +0x9847 0x8CC2 #CJK UNIFIED IDEOGRAPH +0x9848 0x8DEF #CJK UNIFIED IDEOGRAPH +0x9849 0x9732 #CJK UNIFIED IDEOGRAPH +0x984A 0x52B4 #CJK UNIFIED IDEOGRAPH +0x984B 0x5A41 #CJK UNIFIED IDEOGRAPH +0x984C 0x5ECA #CJK UNIFIED IDEOGRAPH +0x984D 0x5F04 #CJK UNIFIED IDEOGRAPH +0x984E 0x6717 #CJK UNIFIED IDEOGRAPH +0x984F 0x697C #CJK UNIFIED IDEOGRAPH +0x9850 0x6994 #CJK UNIFIED IDEOGRAPH +0x9851 0x6D6A #CJK UNIFIED IDEOGRAPH +0x9852 0x6F0F #CJK UNIFIED IDEOGRAPH +0x9853 0x7262 #CJK UNIFIED IDEOGRAPH +0x9854 0x72FC #CJK UNIFIED IDEOGRAPH +0x9855 0x7BED #CJK UNIFIED IDEOGRAPH +0x9856 0x8001 #CJK UNIFIED IDEOGRAPH +0x9857 0x807E #CJK UNIFIED IDEOGRAPH +0x9858 0x874B #CJK UNIFIED IDEOGRAPH +0x9859 0x90CE #CJK UNIFIED IDEOGRAPH +0x985A 0x516D #CJK UNIFIED IDEOGRAPH +0x985B 0x9E93 #CJK UNIFIED IDEOGRAPH +0x985C 0x7984 #CJK UNIFIED IDEOGRAPH +0x985D 0x808B #CJK UNIFIED IDEOGRAPH +0x985E 0x9332 #CJK UNIFIED IDEOGRAPH +0x985F 0x8AD6 #CJK UNIFIED IDEOGRAPH +0x9860 0x502D #CJK UNIFIED IDEOGRAPH +0x9861 0x548C #CJK UNIFIED IDEOGRAPH +0x9862 0x8A71 #CJK UNIFIED IDEOGRAPH +0x9863 0x6B6A #CJK UNIFIED IDEOGRAPH +0x9864 0x8CC4 #CJK UNIFIED IDEOGRAPH +0x9865 0x8107 #CJK UNIFIED IDEOGRAPH +0x9866 0x60D1 #CJK UNIFIED IDEOGRAPH +0x9867 0x67A0 #CJK UNIFIED IDEOGRAPH +0x9868 0x9DF2 #CJK UNIFIED IDEOGRAPH +0x9869 0x4E99 #CJK UNIFIED IDEOGRAPH +0x986A 0x4E98 #CJK UNIFIED IDEOGRAPH +0x986B 0x9C10 #CJK UNIFIED IDEOGRAPH +0x986C 0x8A6B #CJK UNIFIED IDEOGRAPH +0x986D 0x85C1 #CJK UNIFIED IDEOGRAPH +0x986E 0x8568 #CJK UNIFIED IDEOGRAPH +0x986F 0x6900 #CJK UNIFIED IDEOGRAPH +0x9870 0x6E7E #CJK UNIFIED IDEOGRAPH +0x9871 0x7897 #CJK UNIFIED IDEOGRAPH +0x9872 0x8155 #CJK UNIFIED IDEOGRAPH +0x989F 0x5F0C #CJK UNIFIED IDEOGRAPH +0x98A0 0x4E10 #CJK UNIFIED IDEOGRAPH +0x98A1 0x4E15 #CJK UNIFIED IDEOGRAPH +0x98A2 0x4E2A #CJK UNIFIED IDEOGRAPH +0x98A3 0x4E31 #CJK UNIFIED IDEOGRAPH +0x98A4 0x4E36 #CJK UNIFIED IDEOGRAPH +0x98A5 0x4E3C #CJK UNIFIED IDEOGRAPH +0x98A6 0x4E3F #CJK UNIFIED IDEOGRAPH +0x98A7 0x4E42 #CJK UNIFIED IDEOGRAPH +0x98A8 0x4E56 #CJK UNIFIED IDEOGRAPH +0x98A9 0x4E58 #CJK UNIFIED IDEOGRAPH +0x98AA 0x4E82 #CJK UNIFIED IDEOGRAPH +0x98AB 0x4E85 #CJK UNIFIED IDEOGRAPH +0x98AC 0x8C6B #CJK UNIFIED IDEOGRAPH +0x98AD 0x4E8A #CJK UNIFIED IDEOGRAPH +0x98AE 0x8212 #CJK UNIFIED IDEOGRAPH +0x98AF 0x5F0D #CJK UNIFIED IDEOGRAPH +0x98B0 0x4E8E #CJK UNIFIED IDEOGRAPH +0x98B1 0x4E9E #CJK UNIFIED IDEOGRAPH +0x98B2 0x4E9F #CJK UNIFIED IDEOGRAPH +0x98B3 0x4EA0 #CJK UNIFIED IDEOGRAPH +0x98B4 0x4EA2 #CJK UNIFIED IDEOGRAPH +0x98B5 0x4EB0 #CJK UNIFIED IDEOGRAPH +0x98B6 0x4EB3 #CJK UNIFIED IDEOGRAPH +0x98B7 0x4EB6 #CJK UNIFIED IDEOGRAPH +0x98B8 0x4ECE #CJK UNIFIED IDEOGRAPH +0x98B9 0x4ECD #CJK UNIFIED IDEOGRAPH +0x98BA 0x4EC4 #CJK UNIFIED IDEOGRAPH +0x98BB 0x4EC6 #CJK UNIFIED IDEOGRAPH +0x98BC 0x4EC2 #CJK UNIFIED IDEOGRAPH +0x98BD 0x4ED7 #CJK UNIFIED IDEOGRAPH +0x98BE 0x4EDE #CJK UNIFIED IDEOGRAPH +0x98BF 0x4EED #CJK UNIFIED IDEOGRAPH +0x98C0 0x4EDF #CJK UNIFIED IDEOGRAPH +0x98C1 0x4EF7 #CJK UNIFIED IDEOGRAPH +0x98C2 0x4F09 #CJK UNIFIED IDEOGRAPH +0x98C3 0x4F5A #CJK UNIFIED IDEOGRAPH +0x98C4 0x4F30 #CJK UNIFIED IDEOGRAPH +0x98C5 0x4F5B #CJK UNIFIED IDEOGRAPH +0x98C6 0x4F5D #CJK UNIFIED IDEOGRAPH +0x98C7 0x4F57 #CJK UNIFIED IDEOGRAPH +0x98C8 0x4F47 #CJK UNIFIED IDEOGRAPH +0x98C9 0x4F76 #CJK UNIFIED IDEOGRAPH +0x98CA 0x4F88 #CJK UNIFIED IDEOGRAPH +0x98CB 0x4F8F #CJK UNIFIED IDEOGRAPH +0x98CC 0x4F98 #CJK UNIFIED IDEOGRAPH +0x98CD 0x4F7B #CJK UNIFIED IDEOGRAPH +0x98CE 0x4F69 #CJK UNIFIED IDEOGRAPH +0x98CF 0x4F70 #CJK UNIFIED IDEOGRAPH +0x98D0 0x4F91 #CJK UNIFIED IDEOGRAPH +0x98D1 0x4F6F #CJK UNIFIED IDEOGRAPH +0x98D2 0x4F86 #CJK UNIFIED IDEOGRAPH +0x98D3 0x4F96 #CJK UNIFIED IDEOGRAPH +0x98D4 0x5118 #CJK UNIFIED IDEOGRAPH +0x98D5 0x4FD4 #CJK UNIFIED IDEOGRAPH +0x98D6 0x4FDF #CJK UNIFIED IDEOGRAPH +0x98D7 0x4FCE #CJK UNIFIED IDEOGRAPH +0x98D8 0x4FD8 #CJK UNIFIED IDEOGRAPH +0x98D9 0x4FDB #CJK UNIFIED IDEOGRAPH +0x98DA 0x4FD1 #CJK UNIFIED IDEOGRAPH +0x98DB 0x4FDA #CJK UNIFIED IDEOGRAPH +0x98DC 0x4FD0 #CJK UNIFIED IDEOGRAPH +0x98DD 0x4FE4 #CJK UNIFIED IDEOGRAPH +0x98DE 0x4FE5 #CJK UNIFIED IDEOGRAPH +0x98DF 0x501A #CJK UNIFIED IDEOGRAPH +0x98E0 0x5028 #CJK UNIFIED IDEOGRAPH +0x98E1 0x5014 #CJK UNIFIED IDEOGRAPH +0x98E2 0x502A #CJK UNIFIED IDEOGRAPH +0x98E3 0x5025 #CJK UNIFIED IDEOGRAPH +0x98E4 0x5005 #CJK UNIFIED IDEOGRAPH +0x98E5 0x4F1C #CJK UNIFIED IDEOGRAPH +0x98E6 0x4FF6 #CJK UNIFIED IDEOGRAPH +0x98E7 0x5021 #CJK UNIFIED IDEOGRAPH +0x98E8 0x5029 #CJK UNIFIED IDEOGRAPH +0x98E9 0x502C #CJK UNIFIED IDEOGRAPH +0x98EA 0x4FFE #CJK UNIFIED IDEOGRAPH +0x98EB 0x4FEF #CJK UNIFIED IDEOGRAPH +0x98EC 0x5011 #CJK UNIFIED IDEOGRAPH +0x98ED 0x5006 #CJK UNIFIED IDEOGRAPH +0x98EE 0x5043 #CJK UNIFIED IDEOGRAPH +0x98EF 0x5047 #CJK UNIFIED IDEOGRAPH +0x98F0 0x6703 #CJK UNIFIED IDEOGRAPH +0x98F1 0x5055 #CJK UNIFIED IDEOGRAPH +0x98F2 0x5050 #CJK UNIFIED IDEOGRAPH +0x98F3 0x5048 #CJK UNIFIED IDEOGRAPH +0x98F4 0x505A #CJK UNIFIED IDEOGRAPH +0x98F5 0x5056 #CJK UNIFIED IDEOGRAPH +0x98F6 0x506C #CJK UNIFIED IDEOGRAPH +0x98F7 0x5078 #CJK UNIFIED IDEOGRAPH +0x98F8 0x5080 #CJK UNIFIED IDEOGRAPH +0x98F9 0x509A #CJK UNIFIED IDEOGRAPH +0x98FA 0x5085 #CJK UNIFIED IDEOGRAPH +0x98FB 0x50B4 #CJK UNIFIED IDEOGRAPH +0x98FC 0x50B2 #CJK UNIFIED IDEOGRAPH +0x9940 0x50C9 #CJK UNIFIED IDEOGRAPH +0x9941 0x50CA #CJK UNIFIED IDEOGRAPH +0x9942 0x50B3 #CJK UNIFIED IDEOGRAPH +0x9943 0x50C2 #CJK UNIFIED IDEOGRAPH +0x9944 0x50D6 #CJK UNIFIED IDEOGRAPH +0x9945 0x50DE #CJK UNIFIED IDEOGRAPH +0x9946 0x50E5 #CJK UNIFIED IDEOGRAPH +0x9947 0x50ED #CJK UNIFIED IDEOGRAPH +0x9948 0x50E3 #CJK UNIFIED IDEOGRAPH +0x9949 0x50EE #CJK UNIFIED IDEOGRAPH +0x994A 0x50F9 #CJK UNIFIED IDEOGRAPH +0x994B 0x50F5 #CJK UNIFIED IDEOGRAPH +0x994C 0x5109 #CJK UNIFIED IDEOGRAPH +0x994D 0x5101 #CJK UNIFIED IDEOGRAPH +0x994E 0x5102 #CJK UNIFIED IDEOGRAPH +0x994F 0x5116 #CJK UNIFIED IDEOGRAPH +0x9950 0x5115 #CJK UNIFIED IDEOGRAPH +0x9951 0x5114 #CJK UNIFIED IDEOGRAPH +0x9952 0x511A #CJK UNIFIED IDEOGRAPH +0x9953 0x5121 #CJK UNIFIED IDEOGRAPH +0x9954 0x513A #CJK UNIFIED IDEOGRAPH +0x9955 0x5137 #CJK UNIFIED IDEOGRAPH +0x9956 0x513C #CJK UNIFIED IDEOGRAPH +0x9957 0x513B #CJK UNIFIED IDEOGRAPH +0x9958 0x513F #CJK UNIFIED IDEOGRAPH +0x9959 0x5140 #CJK UNIFIED IDEOGRAPH +0x995A 0x5152 #CJK UNIFIED IDEOGRAPH +0x995B 0x514C #CJK UNIFIED IDEOGRAPH +0x995C 0x5154 #CJK UNIFIED IDEOGRAPH +0x995D 0x5162 #CJK UNIFIED IDEOGRAPH +0x995E 0x7AF8 #CJK UNIFIED IDEOGRAPH +0x995F 0x5169 #CJK UNIFIED IDEOGRAPH +0x9960 0x516A #CJK UNIFIED IDEOGRAPH +0x9961 0x516E #CJK UNIFIED IDEOGRAPH +0x9962 0x5180 #CJK UNIFIED IDEOGRAPH +0x9963 0x5182 #CJK UNIFIED IDEOGRAPH +0x9964 0x56D8 #CJK UNIFIED IDEOGRAPH +0x9965 0x518C #CJK UNIFIED IDEOGRAPH +0x9966 0x5189 #CJK UNIFIED IDEOGRAPH +0x9967 0x518F #CJK UNIFIED IDEOGRAPH +0x9968 0x5191 #CJK UNIFIED IDEOGRAPH +0x9969 0x5193 #CJK UNIFIED IDEOGRAPH +0x996A 0x5195 #CJK UNIFIED IDEOGRAPH +0x996B 0x5196 #CJK UNIFIED IDEOGRAPH +0x996C 0x51A4 #CJK UNIFIED IDEOGRAPH +0x996D 0x51A6 #CJK UNIFIED IDEOGRAPH +0x996E 0x51A2 #CJK UNIFIED IDEOGRAPH +0x996F 0x51A9 #CJK UNIFIED IDEOGRAPH +0x9970 0x51AA #CJK UNIFIED IDEOGRAPH +0x9971 0x51AB #CJK UNIFIED IDEOGRAPH +0x9972 0x51B3 #CJK UNIFIED IDEOGRAPH +0x9973 0x51B1 #CJK UNIFIED IDEOGRAPH +0x9974 0x51B2 #CJK UNIFIED IDEOGRAPH +0x9975 0x51B0 #CJK UNIFIED IDEOGRAPH +0x9976 0x51B5 #CJK UNIFIED IDEOGRAPH +0x9977 0x51BD #CJK UNIFIED IDEOGRAPH +0x9978 0x51C5 #CJK UNIFIED IDEOGRAPH +0x9979 0x51C9 #CJK UNIFIED IDEOGRAPH +0x997A 0x51DB #CJK UNIFIED IDEOGRAPH +0x997B 0x51E0 #CJK UNIFIED IDEOGRAPH +0x997C 0x8655 #CJK UNIFIED IDEOGRAPH +0x997D 0x51E9 #CJK UNIFIED IDEOGRAPH +0x997E 0x51ED #CJK UNIFIED IDEOGRAPH +0x9980 0x51F0 #CJK UNIFIED IDEOGRAPH +0x9981 0x51F5 #CJK UNIFIED IDEOGRAPH +0x9982 0x51FE #CJK UNIFIED IDEOGRAPH +0x9983 0x5204 #CJK UNIFIED IDEOGRAPH +0x9984 0x520B #CJK UNIFIED IDEOGRAPH +0x9985 0x5214 #CJK UNIFIED IDEOGRAPH +0x9986 0x520E #CJK UNIFIED IDEOGRAPH +0x9987 0x5227 #CJK UNIFIED IDEOGRAPH +0x9988 0x522A #CJK UNIFIED IDEOGRAPH +0x9989 0x522E #CJK UNIFIED IDEOGRAPH +0x998A 0x5233 #CJK UNIFIED IDEOGRAPH +0x998B 0x5239 #CJK UNIFIED IDEOGRAPH +0x998C 0x524F #CJK UNIFIED IDEOGRAPH +0x998D 0x5244 #CJK UNIFIED IDEOGRAPH +0x998E 0x524B #CJK UNIFIED IDEOGRAPH +0x998F 0x524C #CJK UNIFIED IDEOGRAPH +0x9990 0x525E #CJK UNIFIED IDEOGRAPH +0x9991 0x5254 #CJK UNIFIED IDEOGRAPH +0x9992 0x526A #CJK UNIFIED IDEOGRAPH +0x9993 0x5274 #CJK UNIFIED IDEOGRAPH +0x9994 0x5269 #CJK UNIFIED IDEOGRAPH +0x9995 0x5273 #CJK UNIFIED IDEOGRAPH +0x9996 0x527F #CJK UNIFIED IDEOGRAPH +0x9997 0x527D #CJK UNIFIED IDEOGRAPH +0x9998 0x528D #CJK UNIFIED IDEOGRAPH +0x9999 0x5294 #CJK UNIFIED IDEOGRAPH +0x999A 0x5292 #CJK UNIFIED IDEOGRAPH +0x999B 0x5271 #CJK UNIFIED IDEOGRAPH +0x999C 0x5288 #CJK UNIFIED IDEOGRAPH +0x999D 0x5291 #CJK UNIFIED IDEOGRAPH +0x999E 0x8FA8 #CJK UNIFIED IDEOGRAPH +0x999F 0x8FA7 #CJK UNIFIED IDEOGRAPH +0x99A0 0x52AC #CJK UNIFIED IDEOGRAPH +0x99A1 0x52AD #CJK UNIFIED IDEOGRAPH +0x99A2 0x52BC #CJK UNIFIED IDEOGRAPH +0x99A3 0x52B5 #CJK UNIFIED IDEOGRAPH +0x99A4 0x52C1 #CJK UNIFIED IDEOGRAPH +0x99A5 0x52CD #CJK UNIFIED IDEOGRAPH +0x99A6 0x52D7 #CJK UNIFIED IDEOGRAPH +0x99A7 0x52DE #CJK UNIFIED IDEOGRAPH +0x99A8 0x52E3 #CJK UNIFIED IDEOGRAPH +0x99A9 0x52E6 #CJK UNIFIED IDEOGRAPH +0x99AA 0x98ED #CJK UNIFIED IDEOGRAPH +0x99AB 0x52E0 #CJK UNIFIED IDEOGRAPH +0x99AC 0x52F3 #CJK UNIFIED IDEOGRAPH +0x99AD 0x52F5 #CJK UNIFIED IDEOGRAPH +0x99AE 0x52F8 #CJK UNIFIED IDEOGRAPH +0x99AF 0x52F9 #CJK UNIFIED IDEOGRAPH +0x99B0 0x5306 #CJK UNIFIED IDEOGRAPH +0x99B1 0x5308 #CJK UNIFIED IDEOGRAPH +0x99B2 0x7538 #CJK UNIFIED IDEOGRAPH +0x99B3 0x530D #CJK UNIFIED IDEOGRAPH +0x99B4 0x5310 #CJK UNIFIED IDEOGRAPH +0x99B5 0x530F #CJK UNIFIED IDEOGRAPH +0x99B6 0x5315 #CJK UNIFIED IDEOGRAPH +0x99B7 0x531A #CJK UNIFIED IDEOGRAPH +0x99B8 0x5323 #CJK UNIFIED IDEOGRAPH +0x99B9 0x532F #CJK UNIFIED IDEOGRAPH +0x99BA 0x5331 #CJK UNIFIED IDEOGRAPH +0x99BB 0x5333 #CJK UNIFIED IDEOGRAPH +0x99BC 0x5338 #CJK UNIFIED IDEOGRAPH +0x99BD 0x5340 #CJK UNIFIED IDEOGRAPH +0x99BE 0x5346 #CJK UNIFIED IDEOGRAPH +0x99BF 0x5345 #CJK UNIFIED IDEOGRAPH +0x99C0 0x4E17 #CJK UNIFIED IDEOGRAPH +0x99C1 0x5349 #CJK UNIFIED IDEOGRAPH +0x99C2 0x534D #CJK UNIFIED IDEOGRAPH +0x99C3 0x51D6 #CJK UNIFIED IDEOGRAPH +0x99C4 0x535E #CJK UNIFIED IDEOGRAPH +0x99C5 0x5369 #CJK UNIFIED IDEOGRAPH +0x99C6 0x536E #CJK UNIFIED IDEOGRAPH +0x99C7 0x5918 #CJK UNIFIED IDEOGRAPH +0x99C8 0x537B #CJK UNIFIED IDEOGRAPH +0x99C9 0x5377 #CJK UNIFIED IDEOGRAPH +0x99CA 0x5382 #CJK UNIFIED IDEOGRAPH +0x99CB 0x5396 #CJK UNIFIED IDEOGRAPH +0x99CC 0x53A0 #CJK UNIFIED IDEOGRAPH +0x99CD 0x53A6 #CJK UNIFIED IDEOGRAPH +0x99CE 0x53A5 #CJK UNIFIED IDEOGRAPH +0x99CF 0x53AE #CJK UNIFIED IDEOGRAPH +0x99D0 0x53B0 #CJK UNIFIED IDEOGRAPH +0x99D1 0x53B6 #CJK UNIFIED IDEOGRAPH +0x99D2 0x53C3 #CJK UNIFIED IDEOGRAPH +0x99D3 0x7C12 #CJK UNIFIED IDEOGRAPH +0x99D4 0x96D9 #CJK UNIFIED IDEOGRAPH +0x99D5 0x53DF #CJK UNIFIED IDEOGRAPH +0x99D6 0x66FC #CJK UNIFIED IDEOGRAPH +0x99D7 0x71EE #CJK UNIFIED IDEOGRAPH +0x99D8 0x53EE #CJK UNIFIED IDEOGRAPH +0x99D9 0x53E8 #CJK UNIFIED IDEOGRAPH +0x99DA 0x53ED #CJK UNIFIED IDEOGRAPH +0x99DB 0x53FA #CJK UNIFIED IDEOGRAPH +0x99DC 0x5401 #CJK UNIFIED IDEOGRAPH +0x99DD 0x543D #CJK UNIFIED IDEOGRAPH +0x99DE 0x5440 #CJK UNIFIED IDEOGRAPH +0x99DF 0x542C #CJK UNIFIED IDEOGRAPH +0x99E0 0x542D #CJK UNIFIED IDEOGRAPH +0x99E1 0x543C #CJK UNIFIED IDEOGRAPH +0x99E2 0x542E #CJK UNIFIED IDEOGRAPH +0x99E3 0x5436 #CJK UNIFIED IDEOGRAPH +0x99E4 0x5429 #CJK UNIFIED IDEOGRAPH +0x99E5 0x541D #CJK UNIFIED IDEOGRAPH +0x99E6 0x544E #CJK UNIFIED IDEOGRAPH +0x99E7 0x548F #CJK UNIFIED IDEOGRAPH +0x99E8 0x5475 #CJK UNIFIED IDEOGRAPH +0x99E9 0x548E #CJK UNIFIED IDEOGRAPH +0x99EA 0x545F #CJK UNIFIED IDEOGRAPH +0x99EB 0x5471 #CJK UNIFIED IDEOGRAPH +0x99EC 0x5477 #CJK UNIFIED IDEOGRAPH +0x99ED 0x5470 #CJK UNIFIED IDEOGRAPH +0x99EE 0x5492 #CJK UNIFIED IDEOGRAPH +0x99EF 0x547B #CJK UNIFIED IDEOGRAPH +0x99F0 0x5480 #CJK UNIFIED IDEOGRAPH +0x99F1 0x5476 #CJK UNIFIED IDEOGRAPH +0x99F2 0x5484 #CJK UNIFIED IDEOGRAPH +0x99F3 0x5490 #CJK UNIFIED IDEOGRAPH +0x99F4 0x5486 #CJK UNIFIED IDEOGRAPH +0x99F5 0x54C7 #CJK UNIFIED IDEOGRAPH +0x99F6 0x54A2 #CJK UNIFIED IDEOGRAPH +0x99F7 0x54B8 #CJK UNIFIED IDEOGRAPH +0x99F8 0x54A5 #CJK UNIFIED IDEOGRAPH +0x99F9 0x54AC #CJK UNIFIED IDEOGRAPH +0x99FA 0x54C4 #CJK UNIFIED IDEOGRAPH +0x99FB 0x54C8 #CJK UNIFIED IDEOGRAPH +0x99FC 0x54A8 #CJK UNIFIED IDEOGRAPH +0x9A40 0x54AB #CJK UNIFIED IDEOGRAPH +0x9A41 0x54C2 #CJK UNIFIED IDEOGRAPH +0x9A42 0x54A4 #CJK UNIFIED IDEOGRAPH +0x9A43 0x54BE #CJK UNIFIED IDEOGRAPH +0x9A44 0x54BC #CJK UNIFIED IDEOGRAPH +0x9A45 0x54D8 #CJK UNIFIED IDEOGRAPH +0x9A46 0x54E5 #CJK UNIFIED IDEOGRAPH +0x9A47 0x54E6 #CJK UNIFIED IDEOGRAPH +0x9A48 0x550F #CJK UNIFIED IDEOGRAPH +0x9A49 0x5514 #CJK UNIFIED IDEOGRAPH +0x9A4A 0x54FD #CJK UNIFIED IDEOGRAPH +0x9A4B 0x54EE #CJK UNIFIED IDEOGRAPH +0x9A4C 0x54ED #CJK UNIFIED IDEOGRAPH +0x9A4D 0x54FA #CJK UNIFIED IDEOGRAPH +0x9A4E 0x54E2 #CJK UNIFIED IDEOGRAPH +0x9A4F 0x5539 #CJK UNIFIED IDEOGRAPH +0x9A50 0x5540 #CJK UNIFIED IDEOGRAPH +0x9A51 0x5563 #CJK UNIFIED IDEOGRAPH +0x9A52 0x554C #CJK UNIFIED IDEOGRAPH +0x9A53 0x552E #CJK UNIFIED IDEOGRAPH +0x9A54 0x555C #CJK UNIFIED IDEOGRAPH +0x9A55 0x5545 #CJK UNIFIED IDEOGRAPH +0x9A56 0x5556 #CJK UNIFIED IDEOGRAPH +0x9A57 0x5557 #CJK UNIFIED IDEOGRAPH +0x9A58 0x5538 #CJK UNIFIED IDEOGRAPH +0x9A59 0x5533 #CJK UNIFIED IDEOGRAPH +0x9A5A 0x555D #CJK UNIFIED IDEOGRAPH +0x9A5B 0x5599 #CJK UNIFIED IDEOGRAPH +0x9A5C 0x5580 #CJK UNIFIED IDEOGRAPH +0x9A5D 0x54AF #CJK UNIFIED IDEOGRAPH +0x9A5E 0x558A #CJK UNIFIED IDEOGRAPH +0x9A5F 0x559F #CJK UNIFIED IDEOGRAPH +0x9A60 0x557B #CJK UNIFIED IDEOGRAPH +0x9A61 0x557E #CJK UNIFIED IDEOGRAPH +0x9A62 0x5598 #CJK UNIFIED IDEOGRAPH +0x9A63 0x559E #CJK UNIFIED IDEOGRAPH +0x9A64 0x55AE #CJK UNIFIED IDEOGRAPH +0x9A65 0x557C #CJK UNIFIED IDEOGRAPH +0x9A66 0x5583 #CJK UNIFIED IDEOGRAPH +0x9A67 0x55A9 #CJK UNIFIED IDEOGRAPH +0x9A68 0x5587 #CJK UNIFIED IDEOGRAPH +0x9A69 0x55A8 #CJK UNIFIED IDEOGRAPH +0x9A6A 0x55DA #CJK UNIFIED IDEOGRAPH +0x9A6B 0x55C5 #CJK UNIFIED IDEOGRAPH +0x9A6C 0x55DF #CJK UNIFIED IDEOGRAPH +0x9A6D 0x55C4 #CJK UNIFIED IDEOGRAPH +0x9A6E 0x55DC #CJK UNIFIED IDEOGRAPH +0x9A6F 0x55E4 #CJK UNIFIED IDEOGRAPH +0x9A70 0x55D4 #CJK UNIFIED IDEOGRAPH +0x9A71 0x5614 #CJK UNIFIED IDEOGRAPH +0x9A72 0x55F7 #CJK UNIFIED IDEOGRAPH +0x9A73 0x5616 #CJK UNIFIED IDEOGRAPH +0x9A74 0x55FE #CJK UNIFIED IDEOGRAPH +0x9A75 0x55FD #CJK UNIFIED IDEOGRAPH +0x9A76 0x561B #CJK UNIFIED IDEOGRAPH +0x9A77 0x55F9 #CJK UNIFIED IDEOGRAPH +0x9A78 0x564E #CJK UNIFIED IDEOGRAPH +0x9A79 0x5650 #CJK UNIFIED IDEOGRAPH +0x9A7A 0x71DF #CJK UNIFIED IDEOGRAPH +0x9A7B 0x5634 #CJK UNIFIED IDEOGRAPH +0x9A7C 0x5636 #CJK UNIFIED IDEOGRAPH +0x9A7D 0x5632 #CJK UNIFIED IDEOGRAPH +0x9A7E 0x5638 #CJK UNIFIED IDEOGRAPH +0x9A80 0x566B #CJK UNIFIED IDEOGRAPH +0x9A81 0x5664 #CJK UNIFIED IDEOGRAPH +0x9A82 0x562F #CJK UNIFIED IDEOGRAPH +0x9A83 0x566C #CJK UNIFIED IDEOGRAPH +0x9A84 0x566A #CJK UNIFIED IDEOGRAPH +0x9A85 0x5686 #CJK UNIFIED IDEOGRAPH +0x9A86 0x5680 #CJK UNIFIED IDEOGRAPH +0x9A87 0x568A #CJK UNIFIED IDEOGRAPH +0x9A88 0x56A0 #CJK UNIFIED IDEOGRAPH +0x9A89 0x5694 #CJK UNIFIED IDEOGRAPH +0x9A8A 0x568F #CJK UNIFIED IDEOGRAPH +0x9A8B 0x56A5 #CJK UNIFIED IDEOGRAPH +0x9A8C 0x56AE #CJK UNIFIED IDEOGRAPH +0x9A8D 0x56B6 #CJK UNIFIED IDEOGRAPH +0x9A8E 0x56B4 #CJK UNIFIED IDEOGRAPH +0x9A8F 0x56C2 #CJK UNIFIED IDEOGRAPH +0x9A90 0x56BC #CJK UNIFIED IDEOGRAPH +0x9A91 0x56C1 #CJK UNIFIED IDEOGRAPH +0x9A92 0x56C3 #CJK UNIFIED IDEOGRAPH +0x9A93 0x56C0 #CJK UNIFIED IDEOGRAPH +0x9A94 0x56C8 #CJK UNIFIED IDEOGRAPH +0x9A95 0x56CE #CJK UNIFIED IDEOGRAPH +0x9A96 0x56D1 #CJK UNIFIED IDEOGRAPH +0x9A97 0x56D3 #CJK UNIFIED IDEOGRAPH +0x9A98 0x56D7 #CJK UNIFIED IDEOGRAPH +0x9A99 0x56EE #CJK UNIFIED IDEOGRAPH +0x9A9A 0x56F9 #CJK UNIFIED IDEOGRAPH +0x9A9B 0x5700 #CJK UNIFIED IDEOGRAPH +0x9A9C 0x56FF #CJK UNIFIED IDEOGRAPH +0x9A9D 0x5704 #CJK UNIFIED IDEOGRAPH +0x9A9E 0x5709 #CJK UNIFIED IDEOGRAPH +0x9A9F 0x5708 #CJK UNIFIED IDEOGRAPH +0x9AA0 0x570B #CJK UNIFIED IDEOGRAPH +0x9AA1 0x570D #CJK UNIFIED IDEOGRAPH +0x9AA2 0x5713 #CJK UNIFIED IDEOGRAPH +0x9AA3 0x5718 #CJK UNIFIED IDEOGRAPH +0x9AA4 0x5716 #CJK UNIFIED IDEOGRAPH +0x9AA5 0x55C7 #CJK UNIFIED IDEOGRAPH +0x9AA6 0x571C #CJK UNIFIED IDEOGRAPH +0x9AA7 0x5726 #CJK UNIFIED IDEOGRAPH +0x9AA8 0x5737 #CJK UNIFIED IDEOGRAPH +0x9AA9 0x5738 #CJK UNIFIED IDEOGRAPH +0x9AAA 0x574E #CJK UNIFIED IDEOGRAPH +0x9AAB 0x573B #CJK UNIFIED IDEOGRAPH +0x9AAC 0x5740 #CJK UNIFIED IDEOGRAPH +0x9AAD 0x574F #CJK UNIFIED IDEOGRAPH +0x9AAE 0x5769 #CJK UNIFIED IDEOGRAPH +0x9AAF 0x57C0 #CJK UNIFIED IDEOGRAPH +0x9AB0 0x5788 #CJK UNIFIED IDEOGRAPH +0x9AB1 0x5761 #CJK UNIFIED IDEOGRAPH +0x9AB2 0x577F #CJK UNIFIED IDEOGRAPH +0x9AB3 0x5789 #CJK UNIFIED IDEOGRAPH +0x9AB4 0x5793 #CJK UNIFIED IDEOGRAPH +0x9AB5 0x57A0 #CJK UNIFIED IDEOGRAPH +0x9AB6 0x57B3 #CJK UNIFIED IDEOGRAPH +0x9AB7 0x57A4 #CJK UNIFIED IDEOGRAPH +0x9AB8 0x57AA #CJK UNIFIED IDEOGRAPH +0x9AB9 0x57B0 #CJK UNIFIED IDEOGRAPH +0x9ABA 0x57C3 #CJK UNIFIED IDEOGRAPH +0x9ABB 0x57C6 #CJK UNIFIED IDEOGRAPH +0x9ABC 0x57D4 #CJK UNIFIED IDEOGRAPH +0x9ABD 0x57D2 #CJK UNIFIED IDEOGRAPH +0x9ABE 0x57D3 #CJK UNIFIED IDEOGRAPH +0x9ABF 0x580A #CJK UNIFIED IDEOGRAPH +0x9AC0 0x57D6 #CJK UNIFIED IDEOGRAPH +0x9AC1 0x57E3 #CJK UNIFIED IDEOGRAPH +0x9AC2 0x580B #CJK UNIFIED IDEOGRAPH +0x9AC3 0x5819 #CJK UNIFIED IDEOGRAPH +0x9AC4 0x581D #CJK UNIFIED IDEOGRAPH +0x9AC5 0x5872 #CJK UNIFIED IDEOGRAPH +0x9AC6 0x5821 #CJK UNIFIED IDEOGRAPH +0x9AC7 0x5862 #CJK UNIFIED IDEOGRAPH +0x9AC8 0x584B #CJK UNIFIED IDEOGRAPH +0x9AC9 0x5870 #CJK UNIFIED IDEOGRAPH +0x9ACA 0x6BC0 #CJK UNIFIED IDEOGRAPH +0x9ACB 0x5852 #CJK UNIFIED IDEOGRAPH +0x9ACC 0x583D #CJK UNIFIED IDEOGRAPH +0x9ACD 0x5879 #CJK UNIFIED IDEOGRAPH +0x9ACE 0x5885 #CJK UNIFIED IDEOGRAPH +0x9ACF 0x58B9 #CJK UNIFIED IDEOGRAPH +0x9AD0 0x589F #CJK UNIFIED IDEOGRAPH +0x9AD1 0x58AB #CJK UNIFIED IDEOGRAPH +0x9AD2 0x58BA #CJK UNIFIED IDEOGRAPH +0x9AD3 0x58DE #CJK UNIFIED IDEOGRAPH +0x9AD4 0x58BB #CJK UNIFIED IDEOGRAPH +0x9AD5 0x58B8 #CJK UNIFIED IDEOGRAPH +0x9AD6 0x58AE #CJK UNIFIED IDEOGRAPH +0x9AD7 0x58C5 #CJK UNIFIED IDEOGRAPH +0x9AD8 0x58D3 #CJK UNIFIED IDEOGRAPH +0x9AD9 0x58D1 #CJK UNIFIED IDEOGRAPH +0x9ADA 0x58D7 #CJK UNIFIED IDEOGRAPH +0x9ADB 0x58D9 #CJK UNIFIED IDEOGRAPH +0x9ADC 0x58D8 #CJK UNIFIED IDEOGRAPH +0x9ADD 0x58E5 #CJK UNIFIED IDEOGRAPH +0x9ADE 0x58DC #CJK UNIFIED IDEOGRAPH +0x9ADF 0x58E4 #CJK UNIFIED IDEOGRAPH +0x9AE0 0x58DF #CJK UNIFIED IDEOGRAPH +0x9AE1 0x58EF #CJK UNIFIED IDEOGRAPH +0x9AE2 0x58FA #CJK UNIFIED IDEOGRAPH +0x9AE3 0x58F9 #CJK UNIFIED IDEOGRAPH +0x9AE4 0x58FB #CJK UNIFIED IDEOGRAPH +0x9AE5 0x58FC #CJK UNIFIED IDEOGRAPH +0x9AE6 0x58FD #CJK UNIFIED IDEOGRAPH +0x9AE7 0x5902 #CJK UNIFIED IDEOGRAPH +0x9AE8 0x590A #CJK UNIFIED IDEOGRAPH +0x9AE9 0x5910 #CJK UNIFIED IDEOGRAPH +0x9AEA 0x591B #CJK UNIFIED IDEOGRAPH +0x9AEB 0x68A6 #CJK UNIFIED IDEOGRAPH +0x9AEC 0x5925 #CJK UNIFIED IDEOGRAPH +0x9AED 0x592C #CJK UNIFIED IDEOGRAPH +0x9AEE 0x592D #CJK UNIFIED IDEOGRAPH +0x9AEF 0x5932 #CJK UNIFIED IDEOGRAPH +0x9AF0 0x5938 #CJK UNIFIED IDEOGRAPH +0x9AF1 0x593E #CJK UNIFIED IDEOGRAPH +0x9AF2 0x7AD2 #CJK UNIFIED IDEOGRAPH +0x9AF3 0x5955 #CJK UNIFIED IDEOGRAPH +0x9AF4 0x5950 #CJK UNIFIED IDEOGRAPH +0x9AF5 0x594E #CJK UNIFIED IDEOGRAPH +0x9AF6 0x595A #CJK UNIFIED IDEOGRAPH +0x9AF7 0x5958 #CJK UNIFIED IDEOGRAPH +0x9AF8 0x5962 #CJK UNIFIED IDEOGRAPH +0x9AF9 0x5960 #CJK UNIFIED IDEOGRAPH +0x9AFA 0x5967 #CJK UNIFIED IDEOGRAPH +0x9AFB 0x596C #CJK UNIFIED IDEOGRAPH +0x9AFC 0x5969 #CJK UNIFIED IDEOGRAPH +0x9B40 0x5978 #CJK UNIFIED IDEOGRAPH +0x9B41 0x5981 #CJK UNIFIED IDEOGRAPH +0x9B42 0x599D #CJK UNIFIED IDEOGRAPH +0x9B43 0x4F5E #CJK UNIFIED IDEOGRAPH +0x9B44 0x4FAB #CJK UNIFIED IDEOGRAPH +0x9B45 0x59A3 #CJK UNIFIED IDEOGRAPH +0x9B46 0x59B2 #CJK UNIFIED IDEOGRAPH +0x9B47 0x59C6 #CJK UNIFIED IDEOGRAPH +0x9B48 0x59E8 #CJK UNIFIED IDEOGRAPH +0x9B49 0x59DC #CJK UNIFIED IDEOGRAPH +0x9B4A 0x598D #CJK UNIFIED IDEOGRAPH +0x9B4B 0x59D9 #CJK UNIFIED IDEOGRAPH +0x9B4C 0x59DA #CJK UNIFIED IDEOGRAPH +0x9B4D 0x5A25 #CJK UNIFIED IDEOGRAPH +0x9B4E 0x5A1F #CJK UNIFIED IDEOGRAPH +0x9B4F 0x5A11 #CJK UNIFIED IDEOGRAPH +0x9B50 0x5A1C #CJK UNIFIED IDEOGRAPH +0x9B51 0x5A09 #CJK UNIFIED IDEOGRAPH +0x9B52 0x5A1A #CJK UNIFIED IDEOGRAPH +0x9B53 0x5A40 #CJK UNIFIED IDEOGRAPH +0x9B54 0x5A6C #CJK UNIFIED IDEOGRAPH +0x9B55 0x5A49 #CJK UNIFIED IDEOGRAPH +0x9B56 0x5A35 #CJK UNIFIED IDEOGRAPH +0x9B57 0x5A36 #CJK UNIFIED IDEOGRAPH +0x9B58 0x5A62 #CJK UNIFIED IDEOGRAPH +0x9B59 0x5A6A #CJK UNIFIED IDEOGRAPH +0x9B5A 0x5A9A #CJK UNIFIED IDEOGRAPH +0x9B5B 0x5ABC #CJK UNIFIED IDEOGRAPH +0x9B5C 0x5ABE #CJK UNIFIED IDEOGRAPH +0x9B5D 0x5ACB #CJK UNIFIED IDEOGRAPH +0x9B5E 0x5AC2 #CJK UNIFIED IDEOGRAPH +0x9B5F 0x5ABD #CJK UNIFIED IDEOGRAPH +0x9B60 0x5AE3 #CJK UNIFIED IDEOGRAPH +0x9B61 0x5AD7 #CJK UNIFIED IDEOGRAPH +0x9B62 0x5AE6 #CJK UNIFIED IDEOGRAPH +0x9B63 0x5AE9 #CJK UNIFIED IDEOGRAPH +0x9B64 0x5AD6 #CJK UNIFIED IDEOGRAPH +0x9B65 0x5AFA #CJK UNIFIED IDEOGRAPH +0x9B66 0x5AFB #CJK UNIFIED IDEOGRAPH +0x9B67 0x5B0C #CJK UNIFIED IDEOGRAPH +0x9B68 0x5B0B #CJK UNIFIED IDEOGRAPH +0x9B69 0x5B16 #CJK UNIFIED IDEOGRAPH +0x9B6A 0x5B32 #CJK UNIFIED IDEOGRAPH +0x9B6B 0x5AD0 #CJK UNIFIED IDEOGRAPH +0x9B6C 0x5B2A #CJK UNIFIED IDEOGRAPH +0x9B6D 0x5B36 #CJK UNIFIED IDEOGRAPH +0x9B6E 0x5B3E #CJK UNIFIED IDEOGRAPH +0x9B6F 0x5B43 #CJK UNIFIED IDEOGRAPH +0x9B70 0x5B45 #CJK UNIFIED IDEOGRAPH +0x9B71 0x5B40 #CJK UNIFIED IDEOGRAPH +0x9B72 0x5B51 #CJK UNIFIED IDEOGRAPH +0x9B73 0x5B55 #CJK UNIFIED IDEOGRAPH +0x9B74 0x5B5A #CJK UNIFIED IDEOGRAPH +0x9B75 0x5B5B #CJK UNIFIED IDEOGRAPH +0x9B76 0x5B65 #CJK UNIFIED IDEOGRAPH +0x9B77 0x5B69 #CJK UNIFIED IDEOGRAPH +0x9B78 0x5B70 #CJK UNIFIED IDEOGRAPH +0x9B79 0x5B73 #CJK UNIFIED IDEOGRAPH +0x9B7A 0x5B75 #CJK UNIFIED IDEOGRAPH +0x9B7B 0x5B78 #CJK UNIFIED IDEOGRAPH +0x9B7C 0x6588 #CJK UNIFIED IDEOGRAPH +0x9B7D 0x5B7A #CJK UNIFIED IDEOGRAPH +0x9B7E 0x5B80 #CJK UNIFIED IDEOGRAPH +0x9B80 0x5B83 #CJK UNIFIED IDEOGRAPH +0x9B81 0x5BA6 #CJK UNIFIED IDEOGRAPH +0x9B82 0x5BB8 #CJK UNIFIED IDEOGRAPH +0x9B83 0x5BC3 #CJK UNIFIED IDEOGRAPH +0x9B84 0x5BC7 #CJK UNIFIED IDEOGRAPH +0x9B85 0x5BC9 #CJK UNIFIED IDEOGRAPH +0x9B86 0x5BD4 #CJK UNIFIED IDEOGRAPH +0x9B87 0x5BD0 #CJK UNIFIED IDEOGRAPH +0x9B88 0x5BE4 #CJK UNIFIED IDEOGRAPH +0x9B89 0x5BE6 #CJK UNIFIED IDEOGRAPH +0x9B8A 0x5BE2 #CJK UNIFIED IDEOGRAPH +0x9B8B 0x5BDE #CJK UNIFIED IDEOGRAPH +0x9B8C 0x5BE5 #CJK UNIFIED IDEOGRAPH +0x9B8D 0x5BEB #CJK UNIFIED IDEOGRAPH +0x9B8E 0x5BF0 #CJK UNIFIED IDEOGRAPH +0x9B8F 0x5BF6 #CJK UNIFIED IDEOGRAPH +0x9B90 0x5BF3 #CJK UNIFIED IDEOGRAPH +0x9B91 0x5C05 #CJK UNIFIED IDEOGRAPH +0x9B92 0x5C07 #CJK UNIFIED IDEOGRAPH +0x9B93 0x5C08 #CJK UNIFIED IDEOGRAPH +0x9B94 0x5C0D #CJK UNIFIED IDEOGRAPH +0x9B95 0x5C13 #CJK UNIFIED IDEOGRAPH +0x9B96 0x5C20 #CJK UNIFIED IDEOGRAPH +0x9B97 0x5C22 #CJK UNIFIED IDEOGRAPH +0x9B98 0x5C28 #CJK UNIFIED IDEOGRAPH +0x9B99 0x5C38 #CJK UNIFIED IDEOGRAPH +0x9B9A 0x5C39 #CJK UNIFIED IDEOGRAPH +0x9B9B 0x5C41 #CJK UNIFIED IDEOGRAPH +0x9B9C 0x5C46 #CJK UNIFIED IDEOGRAPH +0x9B9D 0x5C4E #CJK UNIFIED IDEOGRAPH +0x9B9E 0x5C53 #CJK UNIFIED IDEOGRAPH +0x9B9F 0x5C50 #CJK UNIFIED IDEOGRAPH +0x9BA0 0x5C4F #CJK UNIFIED IDEOGRAPH +0x9BA1 0x5B71 #CJK UNIFIED IDEOGRAPH +0x9BA2 0x5C6C #CJK UNIFIED IDEOGRAPH +0x9BA3 0x5C6E #CJK UNIFIED IDEOGRAPH +0x9BA4 0x4E62 #CJK UNIFIED IDEOGRAPH +0x9BA5 0x5C76 #CJK UNIFIED IDEOGRAPH +0x9BA6 0x5C79 #CJK UNIFIED IDEOGRAPH +0x9BA7 0x5C8C #CJK UNIFIED IDEOGRAPH +0x9BA8 0x5C91 #CJK UNIFIED IDEOGRAPH +0x9BA9 0x5C94 #CJK UNIFIED IDEOGRAPH +0x9BAA 0x599B #CJK UNIFIED IDEOGRAPH +0x9BAB 0x5CAB #CJK UNIFIED IDEOGRAPH +0x9BAC 0x5CBB #CJK UNIFIED IDEOGRAPH +0x9BAD 0x5CB6 #CJK UNIFIED IDEOGRAPH +0x9BAE 0x5CBC #CJK UNIFIED IDEOGRAPH +0x9BAF 0x5CB7 #CJK UNIFIED IDEOGRAPH +0x9BB0 0x5CC5 #CJK UNIFIED IDEOGRAPH +0x9BB1 0x5CBE #CJK UNIFIED IDEOGRAPH +0x9BB2 0x5CC7 #CJK UNIFIED IDEOGRAPH +0x9BB3 0x5CD9 #CJK UNIFIED IDEOGRAPH +0x9BB4 0x5CE9 #CJK UNIFIED IDEOGRAPH +0x9BB5 0x5CFD #CJK UNIFIED IDEOGRAPH +0x9BB6 0x5CFA #CJK UNIFIED IDEOGRAPH +0x9BB7 0x5CED #CJK UNIFIED IDEOGRAPH +0x9BB8 0x5D8C #CJK UNIFIED IDEOGRAPH +0x9BB9 0x5CEA #CJK UNIFIED IDEOGRAPH +0x9BBA 0x5D0B #CJK UNIFIED IDEOGRAPH +0x9BBB 0x5D15 #CJK UNIFIED IDEOGRAPH +0x9BBC 0x5D17 #CJK UNIFIED IDEOGRAPH +0x9BBD 0x5D5C #CJK UNIFIED IDEOGRAPH +0x9BBE 0x5D1F #CJK UNIFIED IDEOGRAPH +0x9BBF 0x5D1B #CJK UNIFIED IDEOGRAPH +0x9BC0 0x5D11 #CJK UNIFIED IDEOGRAPH +0x9BC1 0x5D14 #CJK UNIFIED IDEOGRAPH +0x9BC2 0x5D22 #CJK UNIFIED IDEOGRAPH +0x9BC3 0x5D1A #CJK UNIFIED IDEOGRAPH +0x9BC4 0x5D19 #CJK UNIFIED IDEOGRAPH +0x9BC5 0x5D18 #CJK UNIFIED IDEOGRAPH +0x9BC6 0x5D4C #CJK UNIFIED IDEOGRAPH +0x9BC7 0x5D52 #CJK UNIFIED IDEOGRAPH +0x9BC8 0x5D4E #CJK UNIFIED IDEOGRAPH +0x9BC9 0x5D4B #CJK UNIFIED IDEOGRAPH +0x9BCA 0x5D6C #CJK UNIFIED IDEOGRAPH +0x9BCB 0x5D73 #CJK UNIFIED IDEOGRAPH +0x9BCC 0x5D76 #CJK UNIFIED IDEOGRAPH +0x9BCD 0x5D87 #CJK UNIFIED IDEOGRAPH +0x9BCE 0x5D84 #CJK UNIFIED IDEOGRAPH +0x9BCF 0x5D82 #CJK UNIFIED IDEOGRAPH +0x9BD0 0x5DA2 #CJK UNIFIED IDEOGRAPH +0x9BD1 0x5D9D #CJK UNIFIED IDEOGRAPH +0x9BD2 0x5DAC #CJK UNIFIED IDEOGRAPH +0x9BD3 0x5DAE #CJK UNIFIED IDEOGRAPH +0x9BD4 0x5DBD #CJK UNIFIED IDEOGRAPH +0x9BD5 0x5D90 #CJK UNIFIED IDEOGRAPH +0x9BD6 0x5DB7 #CJK UNIFIED IDEOGRAPH +0x9BD7 0x5DBC #CJK UNIFIED IDEOGRAPH +0x9BD8 0x5DC9 #CJK UNIFIED IDEOGRAPH +0x9BD9 0x5DCD #CJK UNIFIED IDEOGRAPH +0x9BDA 0x5DD3 #CJK UNIFIED IDEOGRAPH +0x9BDB 0x5DD2 #CJK UNIFIED IDEOGRAPH +0x9BDC 0x5DD6 #CJK UNIFIED IDEOGRAPH +0x9BDD 0x5DDB #CJK UNIFIED IDEOGRAPH +0x9BDE 0x5DEB #CJK UNIFIED IDEOGRAPH +0x9BDF 0x5DF2 #CJK UNIFIED IDEOGRAPH +0x9BE0 0x5DF5 #CJK UNIFIED IDEOGRAPH +0x9BE1 0x5E0B #CJK UNIFIED IDEOGRAPH +0x9BE2 0x5E1A #CJK UNIFIED IDEOGRAPH +0x9BE3 0x5E19 #CJK UNIFIED IDEOGRAPH +0x9BE4 0x5E11 #CJK UNIFIED IDEOGRAPH +0x9BE5 0x5E1B #CJK UNIFIED IDEOGRAPH +0x9BE6 0x5E36 #CJK UNIFIED IDEOGRAPH +0x9BE7 0x5E37 #CJK UNIFIED IDEOGRAPH +0x9BE8 0x5E44 #CJK UNIFIED IDEOGRAPH +0x9BE9 0x5E43 #CJK UNIFIED IDEOGRAPH +0x9BEA 0x5E40 #CJK UNIFIED IDEOGRAPH +0x9BEB 0x5E4E #CJK UNIFIED IDEOGRAPH +0x9BEC 0x5E57 #CJK UNIFIED IDEOGRAPH +0x9BED 0x5E54 #CJK UNIFIED IDEOGRAPH +0x9BEE 0x5E5F #CJK UNIFIED IDEOGRAPH +0x9BEF 0x5E62 #CJK UNIFIED IDEOGRAPH +0x9BF0 0x5E64 #CJK UNIFIED IDEOGRAPH +0x9BF1 0x5E47 #CJK UNIFIED IDEOGRAPH +0x9BF2 0x5E75 #CJK UNIFIED IDEOGRAPH +0x9BF3 0x5E76 #CJK UNIFIED IDEOGRAPH +0x9BF4 0x5E7A #CJK UNIFIED IDEOGRAPH +0x9BF5 0x9EBC #CJK UNIFIED IDEOGRAPH +0x9BF6 0x5E7F #CJK UNIFIED IDEOGRAPH +0x9BF7 0x5EA0 #CJK UNIFIED IDEOGRAPH +0x9BF8 0x5EC1 #CJK UNIFIED IDEOGRAPH +0x9BF9 0x5EC2 #CJK UNIFIED IDEOGRAPH +0x9BFA 0x5EC8 #CJK UNIFIED IDEOGRAPH +0x9BFB 0x5ED0 #CJK UNIFIED IDEOGRAPH +0x9BFC 0x5ECF #CJK UNIFIED IDEOGRAPH +0x9C40 0x5ED6 #CJK UNIFIED IDEOGRAPH +0x9C41 0x5EE3 #CJK UNIFIED IDEOGRAPH +0x9C42 0x5EDD #CJK UNIFIED IDEOGRAPH +0x9C43 0x5EDA #CJK UNIFIED IDEOGRAPH +0x9C44 0x5EDB #CJK UNIFIED IDEOGRAPH +0x9C45 0x5EE2 #CJK UNIFIED IDEOGRAPH +0x9C46 0x5EE1 #CJK UNIFIED IDEOGRAPH +0x9C47 0x5EE8 #CJK UNIFIED IDEOGRAPH +0x9C48 0x5EE9 #CJK UNIFIED IDEOGRAPH +0x9C49 0x5EEC #CJK UNIFIED IDEOGRAPH +0x9C4A 0x5EF1 #CJK UNIFIED IDEOGRAPH +0x9C4B 0x5EF3 #CJK UNIFIED IDEOGRAPH +0x9C4C 0x5EF0 #CJK UNIFIED IDEOGRAPH +0x9C4D 0x5EF4 #CJK UNIFIED IDEOGRAPH +0x9C4E 0x5EF8 #CJK UNIFIED IDEOGRAPH +0x9C4F 0x5EFE #CJK UNIFIED IDEOGRAPH +0x9C50 0x5F03 #CJK UNIFIED IDEOGRAPH +0x9C51 0x5F09 #CJK UNIFIED IDEOGRAPH +0x9C52 0x5F5D #CJK UNIFIED IDEOGRAPH +0x9C53 0x5F5C #CJK UNIFIED IDEOGRAPH +0x9C54 0x5F0B #CJK UNIFIED IDEOGRAPH +0x9C55 0x5F11 #CJK UNIFIED IDEOGRAPH +0x9C56 0x5F16 #CJK UNIFIED IDEOGRAPH +0x9C57 0x5F29 #CJK UNIFIED IDEOGRAPH +0x9C58 0x5F2D #CJK UNIFIED IDEOGRAPH +0x9C59 0x5F38 #CJK UNIFIED IDEOGRAPH +0x9C5A 0x5F41 #CJK UNIFIED IDEOGRAPH +0x9C5B 0x5F48 #CJK UNIFIED IDEOGRAPH +0x9C5C 0x5F4C #CJK UNIFIED IDEOGRAPH +0x9C5D 0x5F4E #CJK UNIFIED IDEOGRAPH +0x9C5E 0x5F2F #CJK UNIFIED IDEOGRAPH +0x9C5F 0x5F51 #CJK UNIFIED IDEOGRAPH +0x9C60 0x5F56 #CJK UNIFIED IDEOGRAPH +0x9C61 0x5F57 #CJK UNIFIED IDEOGRAPH +0x9C62 0x5F59 #CJK UNIFIED IDEOGRAPH +0x9C63 0x5F61 #CJK UNIFIED IDEOGRAPH +0x9C64 0x5F6D #CJK UNIFIED IDEOGRAPH +0x9C65 0x5F73 #CJK UNIFIED IDEOGRAPH +0x9C66 0x5F77 #CJK UNIFIED IDEOGRAPH +0x9C67 0x5F83 #CJK UNIFIED IDEOGRAPH +0x9C68 0x5F82 #CJK UNIFIED IDEOGRAPH +0x9C69 0x5F7F #CJK UNIFIED IDEOGRAPH +0x9C6A 0x5F8A #CJK UNIFIED IDEOGRAPH +0x9C6B 0x5F88 #CJK UNIFIED IDEOGRAPH +0x9C6C 0x5F91 #CJK UNIFIED IDEOGRAPH +0x9C6D 0x5F87 #CJK UNIFIED IDEOGRAPH +0x9C6E 0x5F9E #CJK UNIFIED IDEOGRAPH +0x9C6F 0x5F99 #CJK UNIFIED IDEOGRAPH +0x9C70 0x5F98 #CJK UNIFIED IDEOGRAPH +0x9C71 0x5FA0 #CJK UNIFIED IDEOGRAPH +0x9C72 0x5FA8 #CJK UNIFIED IDEOGRAPH +0x9C73 0x5FAD #CJK UNIFIED IDEOGRAPH +0x9C74 0x5FBC #CJK UNIFIED IDEOGRAPH +0x9C75 0x5FD6 #CJK UNIFIED IDEOGRAPH +0x9C76 0x5FFB #CJK UNIFIED IDEOGRAPH +0x9C77 0x5FE4 #CJK UNIFIED IDEOGRAPH +0x9C78 0x5FF8 #CJK UNIFIED IDEOGRAPH +0x9C79 0x5FF1 #CJK UNIFIED IDEOGRAPH +0x9C7A 0x5FDD #CJK UNIFIED IDEOGRAPH +0x9C7B 0x60B3 #CJK UNIFIED IDEOGRAPH +0x9C7C 0x5FFF #CJK UNIFIED IDEOGRAPH +0x9C7D 0x6021 #CJK UNIFIED IDEOGRAPH +0x9C7E 0x6060 #CJK UNIFIED IDEOGRAPH +0x9C80 0x6019 #CJK UNIFIED IDEOGRAPH +0x9C81 0x6010 #CJK UNIFIED IDEOGRAPH +0x9C82 0x6029 #CJK UNIFIED IDEOGRAPH +0x9C83 0x600E #CJK UNIFIED IDEOGRAPH +0x9C84 0x6031 #CJK UNIFIED IDEOGRAPH +0x9C85 0x601B #CJK UNIFIED IDEOGRAPH +0x9C86 0x6015 #CJK UNIFIED IDEOGRAPH +0x9C87 0x602B #CJK UNIFIED IDEOGRAPH +0x9C88 0x6026 #CJK UNIFIED IDEOGRAPH +0x9C89 0x600F #CJK UNIFIED IDEOGRAPH +0x9C8A 0x603A #CJK UNIFIED IDEOGRAPH +0x9C8B 0x605A #CJK UNIFIED IDEOGRAPH +0x9C8C 0x6041 #CJK UNIFIED IDEOGRAPH +0x9C8D 0x606A #CJK UNIFIED IDEOGRAPH +0x9C8E 0x6077 #CJK UNIFIED IDEOGRAPH +0x9C8F 0x605F #CJK UNIFIED IDEOGRAPH +0x9C90 0x604A #CJK UNIFIED IDEOGRAPH +0x9C91 0x6046 #CJK UNIFIED IDEOGRAPH +0x9C92 0x604D #CJK UNIFIED IDEOGRAPH +0x9C93 0x6063 #CJK UNIFIED IDEOGRAPH +0x9C94 0x6043 #CJK UNIFIED IDEOGRAPH +0x9C95 0x6064 #CJK UNIFIED IDEOGRAPH +0x9C96 0x6042 #CJK UNIFIED IDEOGRAPH +0x9C97 0x606C #CJK UNIFIED IDEOGRAPH +0x9C98 0x606B #CJK UNIFIED IDEOGRAPH +0x9C99 0x6059 #CJK UNIFIED IDEOGRAPH +0x9C9A 0x6081 #CJK UNIFIED IDEOGRAPH +0x9C9B 0x608D #CJK UNIFIED IDEOGRAPH +0x9C9C 0x60E7 #CJK UNIFIED IDEOGRAPH +0x9C9D 0x6083 #CJK UNIFIED IDEOGRAPH +0x9C9E 0x609A #CJK UNIFIED IDEOGRAPH +0x9C9F 0x6084 #CJK UNIFIED IDEOGRAPH +0x9CA0 0x609B #CJK UNIFIED IDEOGRAPH +0x9CA1 0x6096 #CJK UNIFIED IDEOGRAPH +0x9CA2 0x6097 #CJK UNIFIED IDEOGRAPH +0x9CA3 0x6092 #CJK UNIFIED IDEOGRAPH +0x9CA4 0x60A7 #CJK UNIFIED IDEOGRAPH +0x9CA5 0x608B #CJK UNIFIED IDEOGRAPH +0x9CA6 0x60E1 #CJK UNIFIED IDEOGRAPH +0x9CA7 0x60B8 #CJK UNIFIED IDEOGRAPH +0x9CA8 0x60E0 #CJK UNIFIED IDEOGRAPH +0x9CA9 0x60D3 #CJK UNIFIED IDEOGRAPH +0x9CAA 0x60B4 #CJK UNIFIED IDEOGRAPH +0x9CAB 0x5FF0 #CJK UNIFIED IDEOGRAPH +0x9CAC 0x60BD #CJK UNIFIED IDEOGRAPH +0x9CAD 0x60C6 #CJK UNIFIED IDEOGRAPH +0x9CAE 0x60B5 #CJK UNIFIED IDEOGRAPH +0x9CAF 0x60D8 #CJK UNIFIED IDEOGRAPH +0x9CB0 0x614D #CJK UNIFIED IDEOGRAPH +0x9CB1 0x6115 #CJK UNIFIED IDEOGRAPH +0x9CB2 0x6106 #CJK UNIFIED IDEOGRAPH +0x9CB3 0x60F6 #CJK UNIFIED IDEOGRAPH +0x9CB4 0x60F7 #CJK UNIFIED IDEOGRAPH +0x9CB5 0x6100 #CJK UNIFIED IDEOGRAPH +0x9CB6 0x60F4 #CJK UNIFIED IDEOGRAPH +0x9CB7 0x60FA #CJK UNIFIED IDEOGRAPH +0x9CB8 0x6103 #CJK UNIFIED IDEOGRAPH +0x9CB9 0x6121 #CJK UNIFIED IDEOGRAPH +0x9CBA 0x60FB #CJK UNIFIED IDEOGRAPH +0x9CBB 0x60F1 #CJK UNIFIED IDEOGRAPH +0x9CBC 0x610D #CJK UNIFIED IDEOGRAPH +0x9CBD 0x610E #CJK UNIFIED IDEOGRAPH +0x9CBE 0x6147 #CJK UNIFIED IDEOGRAPH +0x9CBF 0x613E #CJK UNIFIED IDEOGRAPH +0x9CC0 0x6128 #CJK UNIFIED IDEOGRAPH +0x9CC1 0x6127 #CJK UNIFIED IDEOGRAPH +0x9CC2 0x614A #CJK UNIFIED IDEOGRAPH +0x9CC3 0x613F #CJK UNIFIED IDEOGRAPH +0x9CC4 0x613C #CJK UNIFIED IDEOGRAPH +0x9CC5 0x612C #CJK UNIFIED IDEOGRAPH +0x9CC6 0x6134 #CJK UNIFIED IDEOGRAPH +0x9CC7 0x613D #CJK UNIFIED IDEOGRAPH +0x9CC8 0x6142 #CJK UNIFIED IDEOGRAPH +0x9CC9 0x6144 #CJK UNIFIED IDEOGRAPH +0x9CCA 0x6173 #CJK UNIFIED IDEOGRAPH +0x9CCB 0x6177 #CJK UNIFIED IDEOGRAPH +0x9CCC 0x6158 #CJK UNIFIED IDEOGRAPH +0x9CCD 0x6159 #CJK UNIFIED IDEOGRAPH +0x9CCE 0x615A #CJK UNIFIED IDEOGRAPH +0x9CCF 0x616B #CJK UNIFIED IDEOGRAPH +0x9CD0 0x6174 #CJK UNIFIED IDEOGRAPH +0x9CD1 0x616F #CJK UNIFIED IDEOGRAPH +0x9CD2 0x6165 #CJK UNIFIED IDEOGRAPH +0x9CD3 0x6171 #CJK UNIFIED IDEOGRAPH +0x9CD4 0x615F #CJK UNIFIED IDEOGRAPH +0x9CD5 0x615D #CJK UNIFIED IDEOGRAPH +0x9CD6 0x6153 #CJK UNIFIED IDEOGRAPH +0x9CD7 0x6175 #CJK UNIFIED IDEOGRAPH +0x9CD8 0x6199 #CJK UNIFIED IDEOGRAPH +0x9CD9 0x6196 #CJK UNIFIED IDEOGRAPH +0x9CDA 0x6187 #CJK UNIFIED IDEOGRAPH +0x9CDB 0x61AC #CJK UNIFIED IDEOGRAPH +0x9CDC 0x6194 #CJK UNIFIED IDEOGRAPH +0x9CDD 0x619A #CJK UNIFIED IDEOGRAPH +0x9CDE 0x618A #CJK UNIFIED IDEOGRAPH +0x9CDF 0x6191 #CJK UNIFIED IDEOGRAPH +0x9CE0 0x61AB #CJK UNIFIED IDEOGRAPH +0x9CE1 0x61AE #CJK UNIFIED IDEOGRAPH +0x9CE2 0x61CC #CJK UNIFIED IDEOGRAPH +0x9CE3 0x61CA #CJK UNIFIED IDEOGRAPH +0x9CE4 0x61C9 #CJK UNIFIED IDEOGRAPH +0x9CE5 0x61F7 #CJK UNIFIED IDEOGRAPH +0x9CE6 0x61C8 #CJK UNIFIED IDEOGRAPH +0x9CE7 0x61C3 #CJK UNIFIED IDEOGRAPH +0x9CE8 0x61C6 #CJK UNIFIED IDEOGRAPH +0x9CE9 0x61BA #CJK UNIFIED IDEOGRAPH +0x9CEA 0x61CB #CJK UNIFIED IDEOGRAPH +0x9CEB 0x7F79 #CJK UNIFIED IDEOGRAPH +0x9CEC 0x61CD #CJK UNIFIED IDEOGRAPH +0x9CED 0x61E6 #CJK UNIFIED IDEOGRAPH +0x9CEE 0x61E3 #CJK UNIFIED IDEOGRAPH +0x9CEF 0x61F6 #CJK UNIFIED IDEOGRAPH +0x9CF0 0x61FA #CJK UNIFIED IDEOGRAPH +0x9CF1 0x61F4 #CJK UNIFIED IDEOGRAPH +0x9CF2 0x61FF #CJK UNIFIED IDEOGRAPH +0x9CF3 0x61FD #CJK UNIFIED IDEOGRAPH +0x9CF4 0x61FC #CJK UNIFIED IDEOGRAPH +0x9CF5 0x61FE #CJK UNIFIED IDEOGRAPH +0x9CF6 0x6200 #CJK UNIFIED IDEOGRAPH +0x9CF7 0x6208 #CJK UNIFIED IDEOGRAPH +0x9CF8 0x6209 #CJK UNIFIED IDEOGRAPH +0x9CF9 0x620D #CJK UNIFIED IDEOGRAPH +0x9CFA 0x620C #CJK UNIFIED IDEOGRAPH +0x9CFB 0x6214 #CJK UNIFIED IDEOGRAPH +0x9CFC 0x621B #CJK UNIFIED IDEOGRAPH +0x9D40 0x621E #CJK UNIFIED IDEOGRAPH +0x9D41 0x6221 #CJK UNIFIED IDEOGRAPH +0x9D42 0x622A #CJK UNIFIED IDEOGRAPH +0x9D43 0x622E #CJK UNIFIED IDEOGRAPH +0x9D44 0x6230 #CJK UNIFIED IDEOGRAPH +0x9D45 0x6232 #CJK UNIFIED IDEOGRAPH +0x9D46 0x6233 #CJK UNIFIED IDEOGRAPH +0x9D47 0x6241 #CJK UNIFIED IDEOGRAPH +0x9D48 0x624E #CJK UNIFIED IDEOGRAPH +0x9D49 0x625E #CJK UNIFIED IDEOGRAPH +0x9D4A 0x6263 #CJK UNIFIED IDEOGRAPH +0x9D4B 0x625B #CJK UNIFIED IDEOGRAPH +0x9D4C 0x6260 #CJK UNIFIED IDEOGRAPH +0x9D4D 0x6268 #CJK UNIFIED IDEOGRAPH +0x9D4E 0x627C #CJK UNIFIED IDEOGRAPH +0x9D4F 0x6282 #CJK UNIFIED IDEOGRAPH +0x9D50 0x6289 #CJK UNIFIED IDEOGRAPH +0x9D51 0x627E #CJK UNIFIED IDEOGRAPH +0x9D52 0x6292 #CJK UNIFIED IDEOGRAPH +0x9D53 0x6293 #CJK UNIFIED IDEOGRAPH +0x9D54 0x6296 #CJK UNIFIED IDEOGRAPH +0x9D55 0x62D4 #CJK UNIFIED IDEOGRAPH +0x9D56 0x6283 #CJK UNIFIED IDEOGRAPH +0x9D57 0x6294 #CJK UNIFIED IDEOGRAPH +0x9D58 0x62D7 #CJK UNIFIED IDEOGRAPH +0x9D59 0x62D1 #CJK UNIFIED IDEOGRAPH +0x9D5A 0x62BB #CJK UNIFIED IDEOGRAPH +0x9D5B 0x62CF #CJK UNIFIED IDEOGRAPH +0x9D5C 0x62FF #CJK UNIFIED IDEOGRAPH +0x9D5D 0x62C6 #CJK UNIFIED IDEOGRAPH +0x9D5E 0x64D4 #CJK UNIFIED IDEOGRAPH +0x9D5F 0x62C8 #CJK UNIFIED IDEOGRAPH +0x9D60 0x62DC #CJK UNIFIED IDEOGRAPH +0x9D61 0x62CC #CJK UNIFIED IDEOGRAPH +0x9D62 0x62CA #CJK UNIFIED IDEOGRAPH +0x9D63 0x62C2 #CJK UNIFIED IDEOGRAPH +0x9D64 0x62C7 #CJK UNIFIED IDEOGRAPH +0x9D65 0x629B #CJK UNIFIED IDEOGRAPH +0x9D66 0x62C9 #CJK UNIFIED IDEOGRAPH +0x9D67 0x630C #CJK UNIFIED IDEOGRAPH +0x9D68 0x62EE #CJK UNIFIED IDEOGRAPH +0x9D69 0x62F1 #CJK UNIFIED IDEOGRAPH +0x9D6A 0x6327 #CJK UNIFIED IDEOGRAPH +0x9D6B 0x6302 #CJK UNIFIED IDEOGRAPH +0x9D6C 0x6308 #CJK UNIFIED IDEOGRAPH +0x9D6D 0x62EF #CJK UNIFIED IDEOGRAPH +0x9D6E 0x62F5 #CJK UNIFIED IDEOGRAPH +0x9D6F 0x6350 #CJK UNIFIED IDEOGRAPH +0x9D70 0x633E #CJK UNIFIED IDEOGRAPH +0x9D71 0x634D #CJK UNIFIED IDEOGRAPH +0x9D72 0x641C #CJK UNIFIED IDEOGRAPH +0x9D73 0x634F #CJK UNIFIED IDEOGRAPH +0x9D74 0x6396 #CJK UNIFIED IDEOGRAPH +0x9D75 0x638E #CJK UNIFIED IDEOGRAPH +0x9D76 0x6380 #CJK UNIFIED IDEOGRAPH +0x9D77 0x63AB #CJK UNIFIED IDEOGRAPH +0x9D78 0x6376 #CJK UNIFIED IDEOGRAPH +0x9D79 0x63A3 #CJK UNIFIED IDEOGRAPH +0x9D7A 0x638F #CJK UNIFIED IDEOGRAPH +0x9D7B 0x6389 #CJK UNIFIED IDEOGRAPH +0x9D7C 0x639F #CJK UNIFIED IDEOGRAPH +0x9D7D 0x63B5 #CJK UNIFIED IDEOGRAPH +0x9D7E 0x636B #CJK UNIFIED IDEOGRAPH +0x9D80 0x6369 #CJK UNIFIED IDEOGRAPH +0x9D81 0x63BE #CJK UNIFIED IDEOGRAPH +0x9D82 0x63E9 #CJK UNIFIED IDEOGRAPH +0x9D83 0x63C0 #CJK UNIFIED IDEOGRAPH +0x9D84 0x63C6 #CJK UNIFIED IDEOGRAPH +0x9D85 0x63E3 #CJK UNIFIED IDEOGRAPH +0x9D86 0x63C9 #CJK UNIFIED IDEOGRAPH +0x9D87 0x63D2 #CJK UNIFIED IDEOGRAPH +0x9D88 0x63F6 #CJK UNIFIED IDEOGRAPH +0x9D89 0x63C4 #CJK UNIFIED IDEOGRAPH +0x9D8A 0x6416 #CJK UNIFIED IDEOGRAPH +0x9D8B 0x6434 #CJK UNIFIED IDEOGRAPH +0x9D8C 0x6406 #CJK UNIFIED IDEOGRAPH +0x9D8D 0x6413 #CJK UNIFIED IDEOGRAPH +0x9D8E 0x6426 #CJK UNIFIED IDEOGRAPH +0x9D8F 0x6436 #CJK UNIFIED IDEOGRAPH +0x9D90 0x651D #CJK UNIFIED IDEOGRAPH +0x9D91 0x6417 #CJK UNIFIED IDEOGRAPH +0x9D92 0x6428 #CJK UNIFIED IDEOGRAPH +0x9D93 0x640F #CJK UNIFIED IDEOGRAPH +0x9D94 0x6467 #CJK UNIFIED IDEOGRAPH +0x9D95 0x646F #CJK UNIFIED IDEOGRAPH +0x9D96 0x6476 #CJK UNIFIED IDEOGRAPH +0x9D97 0x644E #CJK UNIFIED IDEOGRAPH +0x9D98 0x652A #CJK UNIFIED IDEOGRAPH +0x9D99 0x6495 #CJK UNIFIED IDEOGRAPH +0x9D9A 0x6493 #CJK UNIFIED IDEOGRAPH +0x9D9B 0x64A5 #CJK UNIFIED IDEOGRAPH +0x9D9C 0x64A9 #CJK UNIFIED IDEOGRAPH +0x9D9D 0x6488 #CJK UNIFIED IDEOGRAPH +0x9D9E 0x64BC #CJK UNIFIED IDEOGRAPH +0x9D9F 0x64DA #CJK UNIFIED IDEOGRAPH +0x9DA0 0x64D2 #CJK UNIFIED IDEOGRAPH +0x9DA1 0x64C5 #CJK UNIFIED IDEOGRAPH +0x9DA2 0x64C7 #CJK UNIFIED IDEOGRAPH +0x9DA3 0x64BB #CJK UNIFIED IDEOGRAPH +0x9DA4 0x64D8 #CJK UNIFIED IDEOGRAPH +0x9DA5 0x64C2 #CJK UNIFIED IDEOGRAPH +0x9DA6 0x64F1 #CJK UNIFIED IDEOGRAPH +0x9DA7 0x64E7 #CJK UNIFIED IDEOGRAPH +0x9DA8 0x8209 #CJK UNIFIED IDEOGRAPH +0x9DA9 0x64E0 #CJK UNIFIED IDEOGRAPH +0x9DAA 0x64E1 #CJK UNIFIED IDEOGRAPH +0x9DAB 0x62AC #CJK UNIFIED IDEOGRAPH +0x9DAC 0x64E3 #CJK UNIFIED IDEOGRAPH +0x9DAD 0x64EF #CJK UNIFIED IDEOGRAPH +0x9DAE 0x652C #CJK UNIFIED IDEOGRAPH +0x9DAF 0x64F6 #CJK UNIFIED IDEOGRAPH +0x9DB0 0x64F4 #CJK UNIFIED IDEOGRAPH +0x9DB1 0x64F2 #CJK UNIFIED IDEOGRAPH +0x9DB2 0x64FA #CJK UNIFIED IDEOGRAPH +0x9DB3 0x6500 #CJK UNIFIED IDEOGRAPH +0x9DB4 0x64FD #CJK UNIFIED IDEOGRAPH +0x9DB5 0x6518 #CJK UNIFIED IDEOGRAPH +0x9DB6 0x651C #CJK UNIFIED IDEOGRAPH +0x9DB7 0x6505 #CJK UNIFIED IDEOGRAPH +0x9DB8 0x6524 #CJK UNIFIED IDEOGRAPH +0x9DB9 0x6523 #CJK UNIFIED IDEOGRAPH +0x9DBA 0x652B #CJK UNIFIED IDEOGRAPH +0x9DBB 0x6534 #CJK UNIFIED IDEOGRAPH +0x9DBC 0x6535 #CJK UNIFIED IDEOGRAPH +0x9DBD 0x6537 #CJK UNIFIED IDEOGRAPH +0x9DBE 0x6536 #CJK UNIFIED IDEOGRAPH +0x9DBF 0x6538 #CJK UNIFIED IDEOGRAPH +0x9DC0 0x754B #CJK UNIFIED IDEOGRAPH +0x9DC1 0x6548 #CJK UNIFIED IDEOGRAPH +0x9DC2 0x6556 #CJK UNIFIED IDEOGRAPH +0x9DC3 0x6555 #CJK UNIFIED IDEOGRAPH +0x9DC4 0x654D #CJK UNIFIED IDEOGRAPH +0x9DC5 0x6558 #CJK UNIFIED IDEOGRAPH +0x9DC6 0x655E #CJK UNIFIED IDEOGRAPH +0x9DC7 0x655D #CJK UNIFIED IDEOGRAPH +0x9DC8 0x6572 #CJK UNIFIED IDEOGRAPH +0x9DC9 0x6578 #CJK UNIFIED IDEOGRAPH +0x9DCA 0x6582 #CJK UNIFIED IDEOGRAPH +0x9DCB 0x6583 #CJK UNIFIED IDEOGRAPH +0x9DCC 0x8B8A #CJK UNIFIED IDEOGRAPH +0x9DCD 0x659B #CJK UNIFIED IDEOGRAPH +0x9DCE 0x659F #CJK UNIFIED IDEOGRAPH +0x9DCF 0x65AB #CJK UNIFIED IDEOGRAPH +0x9DD0 0x65B7 #CJK UNIFIED IDEOGRAPH +0x9DD1 0x65C3 #CJK UNIFIED IDEOGRAPH +0x9DD2 0x65C6 #CJK UNIFIED IDEOGRAPH +0x9DD3 0x65C1 #CJK UNIFIED IDEOGRAPH +0x9DD4 0x65C4 #CJK UNIFIED IDEOGRAPH +0x9DD5 0x65CC #CJK UNIFIED IDEOGRAPH +0x9DD6 0x65D2 #CJK UNIFIED IDEOGRAPH +0x9DD7 0x65DB #CJK UNIFIED IDEOGRAPH +0x9DD8 0x65D9 #CJK UNIFIED IDEOGRAPH +0x9DD9 0x65E0 #CJK UNIFIED IDEOGRAPH +0x9DDA 0x65E1 #CJK UNIFIED IDEOGRAPH +0x9DDB 0x65F1 #CJK UNIFIED IDEOGRAPH +0x9DDC 0x6772 #CJK UNIFIED IDEOGRAPH +0x9DDD 0x660A #CJK UNIFIED IDEOGRAPH +0x9DDE 0x6603 #CJK UNIFIED IDEOGRAPH +0x9DDF 0x65FB #CJK UNIFIED IDEOGRAPH +0x9DE0 0x6773 #CJK UNIFIED IDEOGRAPH +0x9DE1 0x6635 #CJK UNIFIED IDEOGRAPH +0x9DE2 0x6636 #CJK UNIFIED IDEOGRAPH +0x9DE3 0x6634 #CJK UNIFIED IDEOGRAPH +0x9DE4 0x661C #CJK UNIFIED IDEOGRAPH +0x9DE5 0x664F #CJK UNIFIED IDEOGRAPH +0x9DE6 0x6644 #CJK UNIFIED IDEOGRAPH +0x9DE7 0x6649 #CJK UNIFIED IDEOGRAPH +0x9DE8 0x6641 #CJK UNIFIED IDEOGRAPH +0x9DE9 0x665E #CJK UNIFIED IDEOGRAPH +0x9DEA 0x665D #CJK UNIFIED IDEOGRAPH +0x9DEB 0x6664 #CJK UNIFIED IDEOGRAPH +0x9DEC 0x6667 #CJK UNIFIED IDEOGRAPH +0x9DED 0x6668 #CJK UNIFIED IDEOGRAPH +0x9DEE 0x665F #CJK UNIFIED IDEOGRAPH +0x9DEF 0x6662 #CJK UNIFIED IDEOGRAPH +0x9DF0 0x6670 #CJK UNIFIED IDEOGRAPH +0x9DF1 0x6683 #CJK UNIFIED IDEOGRAPH +0x9DF2 0x6688 #CJK UNIFIED IDEOGRAPH +0x9DF3 0x668E #CJK UNIFIED IDEOGRAPH +0x9DF4 0x6689 #CJK UNIFIED IDEOGRAPH +0x9DF5 0x6684 #CJK UNIFIED IDEOGRAPH +0x9DF6 0x6698 #CJK UNIFIED IDEOGRAPH +0x9DF7 0x669D #CJK UNIFIED IDEOGRAPH +0x9DF8 0x66C1 #CJK UNIFIED IDEOGRAPH +0x9DF9 0x66B9 #CJK UNIFIED IDEOGRAPH +0x9DFA 0x66C9 #CJK UNIFIED IDEOGRAPH +0x9DFB 0x66BE #CJK UNIFIED IDEOGRAPH +0x9DFC 0x66BC #CJK UNIFIED IDEOGRAPH +0x9E40 0x66C4 #CJK UNIFIED IDEOGRAPH +0x9E41 0x66B8 #CJK UNIFIED IDEOGRAPH +0x9E42 0x66D6 #CJK UNIFIED IDEOGRAPH +0x9E43 0x66DA #CJK UNIFIED IDEOGRAPH +0x9E44 0x66E0 #CJK UNIFIED IDEOGRAPH +0x9E45 0x663F #CJK UNIFIED IDEOGRAPH +0x9E46 0x66E6 #CJK UNIFIED IDEOGRAPH +0x9E47 0x66E9 #CJK UNIFIED IDEOGRAPH +0x9E48 0x66F0 #CJK UNIFIED IDEOGRAPH +0x9E49 0x66F5 #CJK UNIFIED IDEOGRAPH +0x9E4A 0x66F7 #CJK UNIFIED IDEOGRAPH +0x9E4B 0x670F #CJK UNIFIED IDEOGRAPH +0x9E4C 0x6716 #CJK UNIFIED IDEOGRAPH +0x9E4D 0x671E #CJK UNIFIED IDEOGRAPH +0x9E4E 0x6726 #CJK UNIFIED IDEOGRAPH +0x9E4F 0x6727 #CJK UNIFIED IDEOGRAPH +0x9E50 0x9738 #CJK UNIFIED IDEOGRAPH +0x9E51 0x672E #CJK UNIFIED IDEOGRAPH +0x9E52 0x673F #CJK UNIFIED IDEOGRAPH +0x9E53 0x6736 #CJK UNIFIED IDEOGRAPH +0x9E54 0x6741 #CJK UNIFIED IDEOGRAPH +0x9E55 0x6738 #CJK UNIFIED IDEOGRAPH +0x9E56 0x6737 #CJK UNIFIED IDEOGRAPH +0x9E57 0x6746 #CJK UNIFIED IDEOGRAPH +0x9E58 0x675E #CJK UNIFIED IDEOGRAPH +0x9E59 0x6760 #CJK UNIFIED IDEOGRAPH +0x9E5A 0x6759 #CJK UNIFIED IDEOGRAPH +0x9E5B 0x6763 #CJK UNIFIED IDEOGRAPH +0x9E5C 0x6764 #CJK UNIFIED IDEOGRAPH +0x9E5D 0x6789 #CJK UNIFIED IDEOGRAPH +0x9E5E 0x6770 #CJK UNIFIED IDEOGRAPH +0x9E5F 0x67A9 #CJK UNIFIED IDEOGRAPH +0x9E60 0x677C #CJK UNIFIED IDEOGRAPH +0x9E61 0x676A #CJK UNIFIED IDEOGRAPH +0x9E62 0x678C #CJK UNIFIED IDEOGRAPH +0x9E63 0x678B #CJK UNIFIED IDEOGRAPH +0x9E64 0x67A6 #CJK UNIFIED IDEOGRAPH +0x9E65 0x67A1 #CJK UNIFIED IDEOGRAPH +0x9E66 0x6785 #CJK UNIFIED IDEOGRAPH +0x9E67 0x67B7 #CJK UNIFIED IDEOGRAPH +0x9E68 0x67EF #CJK UNIFIED IDEOGRAPH +0x9E69 0x67B4 #CJK UNIFIED IDEOGRAPH +0x9E6A 0x67EC #CJK UNIFIED IDEOGRAPH +0x9E6B 0x67B3 #CJK UNIFIED IDEOGRAPH +0x9E6C 0x67E9 #CJK UNIFIED IDEOGRAPH +0x9E6D 0x67B8 #CJK UNIFIED IDEOGRAPH +0x9E6E 0x67E4 #CJK UNIFIED IDEOGRAPH +0x9E6F 0x67DE #CJK UNIFIED IDEOGRAPH +0x9E70 0x67DD #CJK UNIFIED IDEOGRAPH +0x9E71 0x67E2 #CJK UNIFIED IDEOGRAPH +0x9E72 0x67EE #CJK UNIFIED IDEOGRAPH +0x9E73 0x67B9 #CJK UNIFIED IDEOGRAPH +0x9E74 0x67CE #CJK UNIFIED IDEOGRAPH +0x9E75 0x67C6 #CJK UNIFIED IDEOGRAPH +0x9E76 0x67E7 #CJK UNIFIED IDEOGRAPH +0x9E77 0x6A9C #CJK UNIFIED IDEOGRAPH +0x9E78 0x681E #CJK UNIFIED IDEOGRAPH +0x9E79 0x6846 #CJK UNIFIED IDEOGRAPH +0x9E7A 0x6829 #CJK UNIFIED IDEOGRAPH +0x9E7B 0x6840 #CJK UNIFIED IDEOGRAPH +0x9E7C 0x684D #CJK UNIFIED IDEOGRAPH +0x9E7D 0x6832 #CJK UNIFIED IDEOGRAPH +0x9E7E 0x684E #CJK UNIFIED IDEOGRAPH +0x9E80 0x68B3 #CJK UNIFIED IDEOGRAPH +0x9E81 0x682B #CJK UNIFIED IDEOGRAPH +0x9E82 0x6859 #CJK UNIFIED IDEOGRAPH +0x9E83 0x6863 #CJK UNIFIED IDEOGRAPH +0x9E84 0x6877 #CJK UNIFIED IDEOGRAPH +0x9E85 0x687F #CJK UNIFIED IDEOGRAPH +0x9E86 0x689F #CJK UNIFIED IDEOGRAPH +0x9E87 0x688F #CJK UNIFIED IDEOGRAPH +0x9E88 0x68AD #CJK UNIFIED IDEOGRAPH +0x9E89 0x6894 #CJK UNIFIED IDEOGRAPH +0x9E8A 0x689D #CJK UNIFIED IDEOGRAPH +0x9E8B 0x689B #CJK UNIFIED IDEOGRAPH +0x9E8C 0x6883 #CJK UNIFIED IDEOGRAPH +0x9E8D 0x6AAE #CJK UNIFIED IDEOGRAPH +0x9E8E 0x68B9 #CJK UNIFIED IDEOGRAPH +0x9E8F 0x6874 #CJK UNIFIED IDEOGRAPH +0x9E90 0x68B5 #CJK UNIFIED IDEOGRAPH +0x9E91 0x68A0 #CJK UNIFIED IDEOGRAPH +0x9E92 0x68BA #CJK UNIFIED IDEOGRAPH +0x9E93 0x690F #CJK UNIFIED IDEOGRAPH +0x9E94 0x688D #CJK UNIFIED IDEOGRAPH +0x9E95 0x687E #CJK UNIFIED IDEOGRAPH +0x9E96 0x6901 #CJK UNIFIED IDEOGRAPH +0x9E97 0x68CA #CJK UNIFIED IDEOGRAPH +0x9E98 0x6908 #CJK UNIFIED IDEOGRAPH +0x9E99 0x68D8 #CJK UNIFIED IDEOGRAPH +0x9E9A 0x6922 #CJK UNIFIED IDEOGRAPH +0x9E9B 0x6926 #CJK UNIFIED IDEOGRAPH +0x9E9C 0x68E1 #CJK UNIFIED IDEOGRAPH +0x9E9D 0x690C #CJK UNIFIED IDEOGRAPH +0x9E9E 0x68CD #CJK UNIFIED IDEOGRAPH +0x9E9F 0x68D4 #CJK UNIFIED IDEOGRAPH +0x9EA0 0x68E7 #CJK UNIFIED IDEOGRAPH +0x9EA1 0x68D5 #CJK UNIFIED IDEOGRAPH +0x9EA2 0x6936 #CJK UNIFIED IDEOGRAPH +0x9EA3 0x6912 #CJK UNIFIED IDEOGRAPH +0x9EA4 0x6904 #CJK UNIFIED IDEOGRAPH +0x9EA5 0x68D7 #CJK UNIFIED IDEOGRAPH +0x9EA6 0x68E3 #CJK UNIFIED IDEOGRAPH +0x9EA7 0x6925 #CJK UNIFIED IDEOGRAPH +0x9EA8 0x68F9 #CJK UNIFIED IDEOGRAPH +0x9EA9 0x68E0 #CJK UNIFIED IDEOGRAPH +0x9EAA 0x68EF #CJK UNIFIED IDEOGRAPH +0x9EAB 0x6928 #CJK UNIFIED IDEOGRAPH +0x9EAC 0x692A #CJK UNIFIED IDEOGRAPH +0x9EAD 0x691A #CJK UNIFIED IDEOGRAPH +0x9EAE 0x6923 #CJK UNIFIED IDEOGRAPH +0x9EAF 0x6921 #CJK UNIFIED IDEOGRAPH +0x9EB0 0x68C6 #CJK UNIFIED IDEOGRAPH +0x9EB1 0x6979 #CJK UNIFIED IDEOGRAPH +0x9EB2 0x6977 #CJK UNIFIED IDEOGRAPH +0x9EB3 0x695C #CJK UNIFIED IDEOGRAPH +0x9EB4 0x6978 #CJK UNIFIED IDEOGRAPH +0x9EB5 0x696B #CJK UNIFIED IDEOGRAPH +0x9EB6 0x6954 #CJK UNIFIED IDEOGRAPH +0x9EB7 0x697E #CJK UNIFIED IDEOGRAPH +0x9EB8 0x696E #CJK UNIFIED IDEOGRAPH +0x9EB9 0x6939 #CJK UNIFIED IDEOGRAPH +0x9EBA 0x6974 #CJK UNIFIED IDEOGRAPH +0x9EBB 0x693D #CJK UNIFIED IDEOGRAPH +0x9EBC 0x6959 #CJK UNIFIED IDEOGRAPH +0x9EBD 0x6930 #CJK UNIFIED IDEOGRAPH +0x9EBE 0x6961 #CJK UNIFIED IDEOGRAPH +0x9EBF 0x695E #CJK UNIFIED IDEOGRAPH +0x9EC0 0x695D #CJK UNIFIED IDEOGRAPH +0x9EC1 0x6981 #CJK UNIFIED IDEOGRAPH +0x9EC2 0x696A #CJK UNIFIED IDEOGRAPH +0x9EC3 0x69B2 #CJK UNIFIED IDEOGRAPH +0x9EC4 0x69AE #CJK UNIFIED IDEOGRAPH +0x9EC5 0x69D0 #CJK UNIFIED IDEOGRAPH +0x9EC6 0x69BF #CJK UNIFIED IDEOGRAPH +0x9EC7 0x69C1 #CJK UNIFIED IDEOGRAPH +0x9EC8 0x69D3 #CJK UNIFIED IDEOGRAPH +0x9EC9 0x69BE #CJK UNIFIED IDEOGRAPH +0x9ECA 0x69CE #CJK UNIFIED IDEOGRAPH +0x9ECB 0x5BE8 #CJK UNIFIED IDEOGRAPH +0x9ECC 0x69CA #CJK UNIFIED IDEOGRAPH +0x9ECD 0x69DD #CJK UNIFIED IDEOGRAPH +0x9ECE 0x69BB #CJK UNIFIED IDEOGRAPH +0x9ECF 0x69C3 #CJK UNIFIED IDEOGRAPH +0x9ED0 0x69A7 #CJK UNIFIED IDEOGRAPH +0x9ED1 0x6A2E #CJK UNIFIED IDEOGRAPH +0x9ED2 0x6991 #CJK UNIFIED IDEOGRAPH +0x9ED3 0x69A0 #CJK UNIFIED IDEOGRAPH +0x9ED4 0x699C #CJK UNIFIED IDEOGRAPH +0x9ED5 0x6995 #CJK UNIFIED IDEOGRAPH +0x9ED6 0x69B4 #CJK UNIFIED IDEOGRAPH +0x9ED7 0x69DE #CJK UNIFIED IDEOGRAPH +0x9ED8 0x69E8 #CJK UNIFIED IDEOGRAPH +0x9ED9 0x6A02 #CJK UNIFIED IDEOGRAPH +0x9EDA 0x6A1B #CJK UNIFIED IDEOGRAPH +0x9EDB 0x69FF #CJK UNIFIED IDEOGRAPH +0x9EDC 0x6B0A #CJK UNIFIED IDEOGRAPH +0x9EDD 0x69F9 #CJK UNIFIED IDEOGRAPH +0x9EDE 0x69F2 #CJK UNIFIED IDEOGRAPH +0x9EDF 0x69E7 #CJK UNIFIED IDEOGRAPH +0x9EE0 0x6A05 #CJK UNIFIED IDEOGRAPH +0x9EE1 0x69B1 #CJK UNIFIED IDEOGRAPH +0x9EE2 0x6A1E #CJK UNIFIED IDEOGRAPH +0x9EE3 0x69ED #CJK UNIFIED IDEOGRAPH +0x9EE4 0x6A14 #CJK UNIFIED IDEOGRAPH +0x9EE5 0x69EB #CJK UNIFIED IDEOGRAPH +0x9EE6 0x6A0A #CJK UNIFIED IDEOGRAPH +0x9EE7 0x6A12 #CJK UNIFIED IDEOGRAPH +0x9EE8 0x6AC1 #CJK UNIFIED IDEOGRAPH +0x9EE9 0x6A23 #CJK UNIFIED IDEOGRAPH +0x9EEA 0x6A13 #CJK UNIFIED IDEOGRAPH +0x9EEB 0x6A44 #CJK UNIFIED IDEOGRAPH +0x9EEC 0x6A0C #CJK UNIFIED IDEOGRAPH +0x9EED 0x6A72 #CJK UNIFIED IDEOGRAPH +0x9EEE 0x6A36 #CJK UNIFIED IDEOGRAPH +0x9EEF 0x6A78 #CJK UNIFIED IDEOGRAPH +0x9EF0 0x6A47 #CJK UNIFIED IDEOGRAPH +0x9EF1 0x6A62 #CJK UNIFIED IDEOGRAPH +0x9EF2 0x6A59 #CJK UNIFIED IDEOGRAPH +0x9EF3 0x6A66 #CJK UNIFIED IDEOGRAPH +0x9EF4 0x6A48 #CJK UNIFIED IDEOGRAPH +0x9EF5 0x6A38 #CJK UNIFIED IDEOGRAPH +0x9EF6 0x6A22 #CJK UNIFIED IDEOGRAPH +0x9EF7 0x6A90 #CJK UNIFIED IDEOGRAPH +0x9EF8 0x6A8D #CJK UNIFIED IDEOGRAPH +0x9EF9 0x6AA0 #CJK UNIFIED IDEOGRAPH +0x9EFA 0x6A84 #CJK UNIFIED IDEOGRAPH +0x9EFB 0x6AA2 #CJK UNIFIED IDEOGRAPH +0x9EFC 0x6AA3 #CJK UNIFIED IDEOGRAPH +0x9F40 0x6A97 #CJK UNIFIED IDEOGRAPH +0x9F41 0x8617 #CJK UNIFIED IDEOGRAPH +0x9F42 0x6ABB #CJK UNIFIED IDEOGRAPH +0x9F43 0x6AC3 #CJK UNIFIED IDEOGRAPH +0x9F44 0x6AC2 #CJK UNIFIED IDEOGRAPH +0x9F45 0x6AB8 #CJK UNIFIED IDEOGRAPH +0x9F46 0x6AB3 #CJK UNIFIED IDEOGRAPH +0x9F47 0x6AAC #CJK UNIFIED IDEOGRAPH +0x9F48 0x6ADE #CJK UNIFIED IDEOGRAPH +0x9F49 0x6AD1 #CJK UNIFIED IDEOGRAPH +0x9F4A 0x6ADF #CJK UNIFIED IDEOGRAPH +0x9F4B 0x6AAA #CJK UNIFIED IDEOGRAPH +0x9F4C 0x6ADA #CJK UNIFIED IDEOGRAPH +0x9F4D 0x6AEA #CJK UNIFIED IDEOGRAPH +0x9F4E 0x6AFB #CJK UNIFIED IDEOGRAPH +0x9F4F 0x6B05 #CJK UNIFIED IDEOGRAPH +0x9F50 0x8616 #CJK UNIFIED IDEOGRAPH +0x9F51 0x6AFA #CJK UNIFIED IDEOGRAPH +0x9F52 0x6B12 #CJK UNIFIED IDEOGRAPH +0x9F53 0x6B16 #CJK UNIFIED IDEOGRAPH +0x9F54 0x9B31 #CJK UNIFIED IDEOGRAPH +0x9F55 0x6B1F #CJK UNIFIED IDEOGRAPH +0x9F56 0x6B38 #CJK UNIFIED IDEOGRAPH +0x9F57 0x6B37 #CJK UNIFIED IDEOGRAPH +0x9F58 0x76DC #CJK UNIFIED IDEOGRAPH +0x9F59 0x6B39 #CJK UNIFIED IDEOGRAPH +0x9F5A 0x98EE #CJK UNIFIED IDEOGRAPH +0x9F5B 0x6B47 #CJK UNIFIED IDEOGRAPH +0x9F5C 0x6B43 #CJK UNIFIED IDEOGRAPH +0x9F5D 0x6B49 #CJK UNIFIED IDEOGRAPH +0x9F5E 0x6B50 #CJK UNIFIED IDEOGRAPH +0x9F5F 0x6B59 #CJK UNIFIED IDEOGRAPH +0x9F60 0x6B54 #CJK UNIFIED IDEOGRAPH +0x9F61 0x6B5B #CJK UNIFIED IDEOGRAPH +0x9F62 0x6B5F #CJK UNIFIED IDEOGRAPH +0x9F63 0x6B61 #CJK UNIFIED IDEOGRAPH +0x9F64 0x6B78 #CJK UNIFIED IDEOGRAPH +0x9F65 0x6B79 #CJK UNIFIED IDEOGRAPH +0x9F66 0x6B7F #CJK UNIFIED IDEOGRAPH +0x9F67 0x6B80 #CJK UNIFIED IDEOGRAPH +0x9F68 0x6B84 #CJK UNIFIED IDEOGRAPH +0x9F69 0x6B83 #CJK UNIFIED IDEOGRAPH +0x9F6A 0x6B8D #CJK UNIFIED IDEOGRAPH +0x9F6B 0x6B98 #CJK UNIFIED IDEOGRAPH +0x9F6C 0x6B95 #CJK UNIFIED IDEOGRAPH +0x9F6D 0x6B9E #CJK UNIFIED IDEOGRAPH +0x9F6E 0x6BA4 #CJK UNIFIED IDEOGRAPH +0x9F6F 0x6BAA #CJK UNIFIED IDEOGRAPH +0x9F70 0x6BAB #CJK UNIFIED IDEOGRAPH +0x9F71 0x6BAF #CJK UNIFIED IDEOGRAPH +0x9F72 0x6BB2 #CJK UNIFIED IDEOGRAPH +0x9F73 0x6BB1 #CJK UNIFIED IDEOGRAPH +0x9F74 0x6BB3 #CJK UNIFIED IDEOGRAPH +0x9F75 0x6BB7 #CJK UNIFIED IDEOGRAPH +0x9F76 0x6BBC #CJK UNIFIED IDEOGRAPH +0x9F77 0x6BC6 #CJK UNIFIED IDEOGRAPH +0x9F78 0x6BCB #CJK UNIFIED IDEOGRAPH +0x9F79 0x6BD3 #CJK UNIFIED IDEOGRAPH +0x9F7A 0x6BDF #CJK UNIFIED IDEOGRAPH +0x9F7B 0x6BEC #CJK UNIFIED IDEOGRAPH +0x9F7C 0x6BEB #CJK UNIFIED IDEOGRAPH +0x9F7D 0x6BF3 #CJK UNIFIED IDEOGRAPH +0x9F7E 0x6BEF #CJK UNIFIED IDEOGRAPH +0x9F80 0x9EBE #CJK UNIFIED IDEOGRAPH +0x9F81 0x6C08 #CJK UNIFIED IDEOGRAPH +0x9F82 0x6C13 #CJK UNIFIED IDEOGRAPH +0x9F83 0x6C14 #CJK UNIFIED IDEOGRAPH +0x9F84 0x6C1B #CJK UNIFIED IDEOGRAPH +0x9F85 0x6C24 #CJK UNIFIED IDEOGRAPH +0x9F86 0x6C23 #CJK UNIFIED IDEOGRAPH +0x9F87 0x6C5E #CJK UNIFIED IDEOGRAPH +0x9F88 0x6C55 #CJK UNIFIED IDEOGRAPH +0x9F89 0x6C62 #CJK UNIFIED IDEOGRAPH +0x9F8A 0x6C6A #CJK UNIFIED IDEOGRAPH +0x9F8B 0x6C82 #CJK UNIFIED IDEOGRAPH +0x9F8C 0x6C8D #CJK UNIFIED IDEOGRAPH +0x9F8D 0x6C9A #CJK UNIFIED IDEOGRAPH +0x9F8E 0x6C81 #CJK UNIFIED IDEOGRAPH +0x9F8F 0x6C9B #CJK UNIFIED IDEOGRAPH +0x9F90 0x6C7E #CJK UNIFIED IDEOGRAPH +0x9F91 0x6C68 #CJK UNIFIED IDEOGRAPH +0x9F92 0x6C73 #CJK UNIFIED IDEOGRAPH +0x9F93 0x6C92 #CJK UNIFIED IDEOGRAPH +0x9F94 0x6C90 #CJK UNIFIED IDEOGRAPH +0x9F95 0x6CC4 #CJK UNIFIED IDEOGRAPH +0x9F96 0x6CF1 #CJK UNIFIED IDEOGRAPH +0x9F97 0x6CD3 #CJK UNIFIED IDEOGRAPH +0x9F98 0x6CBD #CJK UNIFIED IDEOGRAPH +0x9F99 0x6CD7 #CJK UNIFIED IDEOGRAPH +0x9F9A 0x6CC5 #CJK UNIFIED IDEOGRAPH +0x9F9B 0x6CDD #CJK UNIFIED IDEOGRAPH +0x9F9C 0x6CAE #CJK UNIFIED IDEOGRAPH +0x9F9D 0x6CB1 #CJK UNIFIED IDEOGRAPH +0x9F9E 0x6CBE #CJK UNIFIED IDEOGRAPH +0x9F9F 0x6CBA #CJK UNIFIED IDEOGRAPH +0x9FA0 0x6CDB #CJK UNIFIED IDEOGRAPH +0x9FA1 0x6CEF #CJK UNIFIED IDEOGRAPH +0x9FA2 0x6CD9 #CJK UNIFIED IDEOGRAPH +0x9FA3 0x6CEA #CJK UNIFIED IDEOGRAPH +0x9FA4 0x6D1F #CJK UNIFIED IDEOGRAPH +0x9FA5 0x884D #CJK UNIFIED IDEOGRAPH +0x9FA6 0x6D36 #CJK UNIFIED IDEOGRAPH +0x9FA7 0x6D2B #CJK UNIFIED IDEOGRAPH +0x9FA8 0x6D3D #CJK UNIFIED IDEOGRAPH +0x9FA9 0x6D38 #CJK UNIFIED IDEOGRAPH +0x9FAA 0x6D19 #CJK UNIFIED IDEOGRAPH +0x9FAB 0x6D35 #CJK UNIFIED IDEOGRAPH +0x9FAC 0x6D33 #CJK UNIFIED IDEOGRAPH +0x9FAD 0x6D12 #CJK UNIFIED IDEOGRAPH +0x9FAE 0x6D0C #CJK UNIFIED IDEOGRAPH +0x9FAF 0x6D63 #CJK UNIFIED IDEOGRAPH +0x9FB0 0x6D93 #CJK UNIFIED IDEOGRAPH +0x9FB1 0x6D64 #CJK UNIFIED IDEOGRAPH +0x9FB2 0x6D5A #CJK UNIFIED IDEOGRAPH +0x9FB3 0x6D79 #CJK UNIFIED IDEOGRAPH +0x9FB4 0x6D59 #CJK UNIFIED IDEOGRAPH +0x9FB5 0x6D8E #CJK UNIFIED IDEOGRAPH +0x9FB6 0x6D95 #CJK UNIFIED IDEOGRAPH +0x9FB7 0x6FE4 #CJK UNIFIED IDEOGRAPH +0x9FB8 0x6D85 #CJK UNIFIED IDEOGRAPH +0x9FB9 0x6DF9 #CJK UNIFIED IDEOGRAPH +0x9FBA 0x6E15 #CJK UNIFIED IDEOGRAPH +0x9FBB 0x6E0A #CJK UNIFIED IDEOGRAPH +0x9FBC 0x6DB5 #CJK UNIFIED IDEOGRAPH +0x9FBD 0x6DC7 #CJK UNIFIED IDEOGRAPH +0x9FBE 0x6DE6 #CJK UNIFIED IDEOGRAPH +0x9FBF 0x6DB8 #CJK UNIFIED IDEOGRAPH +0x9FC0 0x6DC6 #CJK UNIFIED IDEOGRAPH +0x9FC1 0x6DEC #CJK UNIFIED IDEOGRAPH +0x9FC2 0x6DDE #CJK UNIFIED IDEOGRAPH +0x9FC3 0x6DCC #CJK UNIFIED IDEOGRAPH +0x9FC4 0x6DE8 #CJK UNIFIED IDEOGRAPH +0x9FC5 0x6DD2 #CJK UNIFIED IDEOGRAPH +0x9FC6 0x6DC5 #CJK UNIFIED IDEOGRAPH +0x9FC7 0x6DFA #CJK UNIFIED IDEOGRAPH +0x9FC8 0x6DD9 #CJK UNIFIED IDEOGRAPH +0x9FC9 0x6DE4 #CJK UNIFIED IDEOGRAPH +0x9FCA 0x6DD5 #CJK UNIFIED IDEOGRAPH +0x9FCB 0x6DEA #CJK UNIFIED IDEOGRAPH +0x9FCC 0x6DEE #CJK UNIFIED IDEOGRAPH +0x9FCD 0x6E2D #CJK UNIFIED IDEOGRAPH +0x9FCE 0x6E6E #CJK UNIFIED IDEOGRAPH +0x9FCF 0x6E2E #CJK UNIFIED IDEOGRAPH +0x9FD0 0x6E19 #CJK UNIFIED IDEOGRAPH +0x9FD1 0x6E72 #CJK UNIFIED IDEOGRAPH +0x9FD2 0x6E5F #CJK UNIFIED IDEOGRAPH +0x9FD3 0x6E3E #CJK UNIFIED IDEOGRAPH +0x9FD4 0x6E23 #CJK UNIFIED IDEOGRAPH +0x9FD5 0x6E6B #CJK UNIFIED IDEOGRAPH +0x9FD6 0x6E2B #CJK UNIFIED IDEOGRAPH +0x9FD7 0x6E76 #CJK UNIFIED IDEOGRAPH +0x9FD8 0x6E4D #CJK UNIFIED IDEOGRAPH +0x9FD9 0x6E1F #CJK UNIFIED IDEOGRAPH +0x9FDA 0x6E43 #CJK UNIFIED IDEOGRAPH +0x9FDB 0x6E3A #CJK UNIFIED IDEOGRAPH +0x9FDC 0x6E4E #CJK UNIFIED IDEOGRAPH +0x9FDD 0x6E24 #CJK UNIFIED IDEOGRAPH +0x9FDE 0x6EFF #CJK UNIFIED IDEOGRAPH +0x9FDF 0x6E1D #CJK UNIFIED IDEOGRAPH +0x9FE0 0x6E38 #CJK UNIFIED IDEOGRAPH +0x9FE1 0x6E82 #CJK UNIFIED IDEOGRAPH +0x9FE2 0x6EAA #CJK UNIFIED IDEOGRAPH +0x9FE3 0x6E98 #CJK UNIFIED IDEOGRAPH +0x9FE4 0x6EC9 #CJK UNIFIED IDEOGRAPH +0x9FE5 0x6EB7 #CJK UNIFIED IDEOGRAPH +0x9FE6 0x6ED3 #CJK UNIFIED IDEOGRAPH +0x9FE7 0x6EBD #CJK UNIFIED IDEOGRAPH +0x9FE8 0x6EAF #CJK UNIFIED IDEOGRAPH +0x9FE9 0x6EC4 #CJK UNIFIED IDEOGRAPH +0x9FEA 0x6EB2 #CJK UNIFIED IDEOGRAPH +0x9FEB 0x6ED4 #CJK UNIFIED IDEOGRAPH +0x9FEC 0x6ED5 #CJK UNIFIED IDEOGRAPH +0x9FED 0x6E8F #CJK UNIFIED IDEOGRAPH +0x9FEE 0x6EA5 #CJK UNIFIED IDEOGRAPH +0x9FEF 0x6EC2 #CJK UNIFIED IDEOGRAPH +0x9FF0 0x6E9F #CJK UNIFIED IDEOGRAPH +0x9FF1 0x6F41 #CJK UNIFIED IDEOGRAPH +0x9FF2 0x6F11 #CJK UNIFIED IDEOGRAPH +0x9FF3 0x704C #CJK UNIFIED IDEOGRAPH +0x9FF4 0x6EEC #CJK UNIFIED IDEOGRAPH +0x9FF5 0x6EF8 #CJK UNIFIED IDEOGRAPH +0x9FF6 0x6EFE #CJK UNIFIED IDEOGRAPH +0x9FF7 0x6F3F #CJK UNIFIED IDEOGRAPH +0x9FF8 0x6EF2 #CJK UNIFIED IDEOGRAPH +0x9FF9 0x6F31 #CJK UNIFIED IDEOGRAPH +0x9FFA 0x6EEF #CJK UNIFIED IDEOGRAPH +0x9FFB 0x6F32 #CJK UNIFIED IDEOGRAPH +0x9FFC 0x6ECC #CJK UNIFIED IDEOGRAPH +0xE040 0x6F3E #CJK UNIFIED IDEOGRAPH +0xE041 0x6F13 #CJK UNIFIED IDEOGRAPH +0xE042 0x6EF7 #CJK UNIFIED IDEOGRAPH +0xE043 0x6F86 #CJK UNIFIED IDEOGRAPH +0xE044 0x6F7A #CJK UNIFIED IDEOGRAPH +0xE045 0x6F78 #CJK UNIFIED IDEOGRAPH +0xE046 0x6F81 #CJK UNIFIED IDEOGRAPH +0xE047 0x6F80 #CJK UNIFIED IDEOGRAPH +0xE048 0x6F6F #CJK UNIFIED IDEOGRAPH +0xE049 0x6F5B #CJK UNIFIED IDEOGRAPH +0xE04A 0x6FF3 #CJK UNIFIED IDEOGRAPH +0xE04B 0x6F6D #CJK UNIFIED IDEOGRAPH +0xE04C 0x6F82 #CJK UNIFIED IDEOGRAPH +0xE04D 0x6F7C #CJK UNIFIED IDEOGRAPH +0xE04E 0x6F58 #CJK UNIFIED IDEOGRAPH +0xE04F 0x6F8E #CJK UNIFIED IDEOGRAPH +0xE050 0x6F91 #CJK UNIFIED IDEOGRAPH +0xE051 0x6FC2 #CJK UNIFIED IDEOGRAPH +0xE052 0x6F66 #CJK UNIFIED IDEOGRAPH +0xE053 0x6FB3 #CJK UNIFIED IDEOGRAPH +0xE054 0x6FA3 #CJK UNIFIED IDEOGRAPH +0xE055 0x6FA1 #CJK UNIFIED IDEOGRAPH +0xE056 0x6FA4 #CJK UNIFIED IDEOGRAPH +0xE057 0x6FB9 #CJK UNIFIED IDEOGRAPH +0xE058 0x6FC6 #CJK UNIFIED IDEOGRAPH +0xE059 0x6FAA #CJK UNIFIED IDEOGRAPH +0xE05A 0x6FDF #CJK UNIFIED IDEOGRAPH +0xE05B 0x6FD5 #CJK UNIFIED IDEOGRAPH +0xE05C 0x6FEC #CJK UNIFIED IDEOGRAPH +0xE05D 0x6FD4 #CJK UNIFIED IDEOGRAPH +0xE05E 0x6FD8 #CJK UNIFIED IDEOGRAPH +0xE05F 0x6FF1 #CJK UNIFIED IDEOGRAPH +0xE060 0x6FEE #CJK UNIFIED IDEOGRAPH +0xE061 0x6FDB #CJK UNIFIED IDEOGRAPH +0xE062 0x7009 #CJK UNIFIED IDEOGRAPH +0xE063 0x700B #CJK UNIFIED IDEOGRAPH +0xE064 0x6FFA #CJK UNIFIED IDEOGRAPH +0xE065 0x7011 #CJK UNIFIED IDEOGRAPH +0xE066 0x7001 #CJK UNIFIED IDEOGRAPH +0xE067 0x700F #CJK UNIFIED IDEOGRAPH +0xE068 0x6FFE #CJK UNIFIED IDEOGRAPH +0xE069 0x701B #CJK UNIFIED IDEOGRAPH +0xE06A 0x701A #CJK UNIFIED IDEOGRAPH +0xE06B 0x6F74 #CJK UNIFIED IDEOGRAPH +0xE06C 0x701D #CJK UNIFIED IDEOGRAPH +0xE06D 0x7018 #CJK UNIFIED IDEOGRAPH +0xE06E 0x701F #CJK UNIFIED IDEOGRAPH +0xE06F 0x7030 #CJK UNIFIED IDEOGRAPH +0xE070 0x703E #CJK UNIFIED IDEOGRAPH +0xE071 0x7032 #CJK UNIFIED IDEOGRAPH +0xE072 0x7051 #CJK UNIFIED IDEOGRAPH +0xE073 0x7063 #CJK UNIFIED IDEOGRAPH +0xE074 0x7099 #CJK UNIFIED IDEOGRAPH +0xE075 0x7092 #CJK UNIFIED IDEOGRAPH +0xE076 0x70AF #CJK UNIFIED IDEOGRAPH +0xE077 0x70F1 #CJK UNIFIED IDEOGRAPH +0xE078 0x70AC #CJK UNIFIED IDEOGRAPH +0xE079 0x70B8 #CJK UNIFIED IDEOGRAPH +0xE07A 0x70B3 #CJK UNIFIED IDEOGRAPH +0xE07B 0x70AE #CJK UNIFIED IDEOGRAPH +0xE07C 0x70DF #CJK UNIFIED IDEOGRAPH +0xE07D 0x70CB #CJK UNIFIED IDEOGRAPH +0xE07E 0x70DD #CJK UNIFIED IDEOGRAPH +0xE080 0x70D9 #CJK UNIFIED IDEOGRAPH +0xE081 0x7109 #CJK UNIFIED IDEOGRAPH +0xE082 0x70FD #CJK UNIFIED IDEOGRAPH +0xE083 0x711C #CJK UNIFIED IDEOGRAPH +0xE084 0x7119 #CJK UNIFIED IDEOGRAPH +0xE085 0x7165 #CJK UNIFIED IDEOGRAPH +0xE086 0x7155 #CJK UNIFIED IDEOGRAPH +0xE087 0x7188 #CJK UNIFIED IDEOGRAPH +0xE088 0x7166 #CJK UNIFIED IDEOGRAPH +0xE089 0x7162 #CJK UNIFIED IDEOGRAPH +0xE08A 0x714C #CJK UNIFIED IDEOGRAPH +0xE08B 0x7156 #CJK UNIFIED IDEOGRAPH +0xE08C 0x716C #CJK UNIFIED IDEOGRAPH +0xE08D 0x718F #CJK UNIFIED IDEOGRAPH +0xE08E 0x71FB #CJK UNIFIED IDEOGRAPH +0xE08F 0x7184 #CJK UNIFIED IDEOGRAPH +0xE090 0x7195 #CJK UNIFIED IDEOGRAPH +0xE091 0x71A8 #CJK UNIFIED IDEOGRAPH +0xE092 0x71AC #CJK UNIFIED IDEOGRAPH +0xE093 0x71D7 #CJK UNIFIED IDEOGRAPH +0xE094 0x71B9 #CJK UNIFIED IDEOGRAPH +0xE095 0x71BE #CJK UNIFIED IDEOGRAPH +0xE096 0x71D2 #CJK UNIFIED IDEOGRAPH +0xE097 0x71C9 #CJK UNIFIED IDEOGRAPH +0xE098 0x71D4 #CJK UNIFIED IDEOGRAPH +0xE099 0x71CE #CJK UNIFIED IDEOGRAPH +0xE09A 0x71E0 #CJK UNIFIED IDEOGRAPH +0xE09B 0x71EC #CJK UNIFIED IDEOGRAPH +0xE09C 0x71E7 #CJK UNIFIED IDEOGRAPH +0xE09D 0x71F5 #CJK UNIFIED IDEOGRAPH +0xE09E 0x71FC #CJK UNIFIED IDEOGRAPH +0xE09F 0x71F9 #CJK UNIFIED IDEOGRAPH +0xE0A0 0x71FF #CJK UNIFIED IDEOGRAPH +0xE0A1 0x720D #CJK UNIFIED IDEOGRAPH +0xE0A2 0x7210 #CJK UNIFIED IDEOGRAPH +0xE0A3 0x721B #CJK UNIFIED IDEOGRAPH +0xE0A4 0x7228 #CJK UNIFIED IDEOGRAPH +0xE0A5 0x722D #CJK UNIFIED IDEOGRAPH +0xE0A6 0x722C #CJK UNIFIED IDEOGRAPH +0xE0A7 0x7230 #CJK UNIFIED IDEOGRAPH +0xE0A8 0x7232 #CJK UNIFIED IDEOGRAPH +0xE0A9 0x723B #CJK UNIFIED IDEOGRAPH +0xE0AA 0x723C #CJK UNIFIED IDEOGRAPH +0xE0AB 0x723F #CJK UNIFIED IDEOGRAPH +0xE0AC 0x7240 #CJK UNIFIED IDEOGRAPH +0xE0AD 0x7246 #CJK UNIFIED IDEOGRAPH +0xE0AE 0x724B #CJK UNIFIED IDEOGRAPH +0xE0AF 0x7258 #CJK UNIFIED IDEOGRAPH +0xE0B0 0x7274 #CJK UNIFIED IDEOGRAPH +0xE0B1 0x727E #CJK UNIFIED IDEOGRAPH +0xE0B2 0x7282 #CJK UNIFIED IDEOGRAPH +0xE0B3 0x7281 #CJK UNIFIED IDEOGRAPH +0xE0B4 0x7287 #CJK UNIFIED IDEOGRAPH +0xE0B5 0x7292 #CJK UNIFIED IDEOGRAPH +0xE0B6 0x7296 #CJK UNIFIED IDEOGRAPH +0xE0B7 0x72A2 #CJK UNIFIED IDEOGRAPH +0xE0B8 0x72A7 #CJK UNIFIED IDEOGRAPH +0xE0B9 0x72B9 #CJK UNIFIED IDEOGRAPH +0xE0BA 0x72B2 #CJK UNIFIED IDEOGRAPH +0xE0BB 0x72C3 #CJK UNIFIED IDEOGRAPH +0xE0BC 0x72C6 #CJK UNIFIED IDEOGRAPH +0xE0BD 0x72C4 #CJK UNIFIED IDEOGRAPH +0xE0BE 0x72CE #CJK UNIFIED IDEOGRAPH +0xE0BF 0x72D2 #CJK UNIFIED IDEOGRAPH +0xE0C0 0x72E2 #CJK UNIFIED IDEOGRAPH +0xE0C1 0x72E0 #CJK UNIFIED IDEOGRAPH +0xE0C2 0x72E1 #CJK UNIFIED IDEOGRAPH +0xE0C3 0x72F9 #CJK UNIFIED IDEOGRAPH +0xE0C4 0x72F7 #CJK UNIFIED IDEOGRAPH +0xE0C5 0x500F #CJK UNIFIED IDEOGRAPH +0xE0C6 0x7317 #CJK UNIFIED IDEOGRAPH +0xE0C7 0x730A #CJK UNIFIED IDEOGRAPH +0xE0C8 0x731C #CJK UNIFIED IDEOGRAPH +0xE0C9 0x7316 #CJK UNIFIED IDEOGRAPH +0xE0CA 0x731D #CJK UNIFIED IDEOGRAPH +0xE0CB 0x7334 #CJK UNIFIED IDEOGRAPH +0xE0CC 0x732F #CJK UNIFIED IDEOGRAPH +0xE0CD 0x7329 #CJK UNIFIED IDEOGRAPH +0xE0CE 0x7325 #CJK UNIFIED IDEOGRAPH +0xE0CF 0x733E #CJK UNIFIED IDEOGRAPH +0xE0D0 0x734E #CJK UNIFIED IDEOGRAPH +0xE0D1 0x734F #CJK UNIFIED IDEOGRAPH +0xE0D2 0x9ED8 #CJK UNIFIED IDEOGRAPH +0xE0D3 0x7357 #CJK UNIFIED IDEOGRAPH +0xE0D4 0x736A #CJK UNIFIED IDEOGRAPH +0xE0D5 0x7368 #CJK UNIFIED IDEOGRAPH +0xE0D6 0x7370 #CJK UNIFIED IDEOGRAPH +0xE0D7 0x7378 #CJK UNIFIED IDEOGRAPH +0xE0D8 0x7375 #CJK UNIFIED IDEOGRAPH +0xE0D9 0x737B #CJK UNIFIED IDEOGRAPH +0xE0DA 0x737A #CJK UNIFIED IDEOGRAPH +0xE0DB 0x73C8 #CJK UNIFIED IDEOGRAPH +0xE0DC 0x73B3 #CJK UNIFIED IDEOGRAPH +0xE0DD 0x73CE #CJK UNIFIED IDEOGRAPH +0xE0DE 0x73BB #CJK UNIFIED IDEOGRAPH +0xE0DF 0x73C0 #CJK UNIFIED IDEOGRAPH +0xE0E0 0x73E5 #CJK UNIFIED IDEOGRAPH +0xE0E1 0x73EE #CJK UNIFIED IDEOGRAPH +0xE0E2 0x73DE #CJK UNIFIED IDEOGRAPH +0xE0E3 0x74A2 #CJK UNIFIED IDEOGRAPH +0xE0E4 0x7405 #CJK UNIFIED IDEOGRAPH +0xE0E5 0x746F #CJK UNIFIED IDEOGRAPH +0xE0E6 0x7425 #CJK UNIFIED IDEOGRAPH +0xE0E7 0x73F8 #CJK UNIFIED IDEOGRAPH +0xE0E8 0x7432 #CJK UNIFIED IDEOGRAPH +0xE0E9 0x743A #CJK UNIFIED IDEOGRAPH +0xE0EA 0x7455 #CJK UNIFIED IDEOGRAPH +0xE0EB 0x743F #CJK UNIFIED IDEOGRAPH +0xE0EC 0x745F #CJK UNIFIED IDEOGRAPH +0xE0ED 0x7459 #CJK UNIFIED IDEOGRAPH +0xE0EE 0x7441 #CJK UNIFIED IDEOGRAPH +0xE0EF 0x745C #CJK UNIFIED IDEOGRAPH +0xE0F0 0x7469 #CJK UNIFIED IDEOGRAPH +0xE0F1 0x7470 #CJK UNIFIED IDEOGRAPH +0xE0F2 0x7463 #CJK UNIFIED IDEOGRAPH +0xE0F3 0x746A #CJK UNIFIED IDEOGRAPH +0xE0F4 0x7476 #CJK UNIFIED IDEOGRAPH +0xE0F5 0x747E #CJK UNIFIED IDEOGRAPH +0xE0F6 0x748B #CJK UNIFIED IDEOGRAPH +0xE0F7 0x749E #CJK UNIFIED IDEOGRAPH +0xE0F8 0x74A7 #CJK UNIFIED IDEOGRAPH +0xE0F9 0x74CA #CJK UNIFIED IDEOGRAPH +0xE0FA 0x74CF #CJK UNIFIED IDEOGRAPH +0xE0FB 0x74D4 #CJK UNIFIED IDEOGRAPH +0xE0FC 0x73F1 #CJK UNIFIED IDEOGRAPH +0xE140 0x74E0 #CJK UNIFIED IDEOGRAPH +0xE141 0x74E3 #CJK UNIFIED IDEOGRAPH +0xE142 0x74E7 #CJK UNIFIED IDEOGRAPH +0xE143 0x74E9 #CJK UNIFIED IDEOGRAPH +0xE144 0x74EE #CJK UNIFIED IDEOGRAPH +0xE145 0x74F2 #CJK UNIFIED IDEOGRAPH +0xE146 0x74F0 #CJK UNIFIED IDEOGRAPH +0xE147 0x74F1 #CJK UNIFIED IDEOGRAPH +0xE148 0x74F8 #CJK UNIFIED IDEOGRAPH +0xE149 0x74F7 #CJK UNIFIED IDEOGRAPH +0xE14A 0x7504 #CJK UNIFIED IDEOGRAPH +0xE14B 0x7503 #CJK UNIFIED IDEOGRAPH +0xE14C 0x7505 #CJK UNIFIED IDEOGRAPH +0xE14D 0x750C #CJK UNIFIED IDEOGRAPH +0xE14E 0x750E #CJK UNIFIED IDEOGRAPH +0xE14F 0x750D #CJK UNIFIED IDEOGRAPH +0xE150 0x7515 #CJK UNIFIED IDEOGRAPH +0xE151 0x7513 #CJK UNIFIED IDEOGRAPH +0xE152 0x751E #CJK UNIFIED IDEOGRAPH +0xE153 0x7526 #CJK UNIFIED IDEOGRAPH +0xE154 0x752C #CJK UNIFIED IDEOGRAPH +0xE155 0x753C #CJK UNIFIED IDEOGRAPH +0xE156 0x7544 #CJK UNIFIED IDEOGRAPH +0xE157 0x754D #CJK UNIFIED IDEOGRAPH +0xE158 0x754A #CJK UNIFIED IDEOGRAPH +0xE159 0x7549 #CJK UNIFIED IDEOGRAPH +0xE15A 0x755B #CJK UNIFIED IDEOGRAPH +0xE15B 0x7546 #CJK UNIFIED IDEOGRAPH +0xE15C 0x755A #CJK UNIFIED IDEOGRAPH +0xE15D 0x7569 #CJK UNIFIED IDEOGRAPH +0xE15E 0x7564 #CJK UNIFIED IDEOGRAPH +0xE15F 0x7567 #CJK UNIFIED IDEOGRAPH +0xE160 0x756B #CJK UNIFIED IDEOGRAPH +0xE161 0x756D #CJK UNIFIED IDEOGRAPH +0xE162 0x7578 #CJK UNIFIED IDEOGRAPH +0xE163 0x7576 #CJK UNIFIED IDEOGRAPH +0xE164 0x7586 #CJK UNIFIED IDEOGRAPH +0xE165 0x7587 #CJK UNIFIED IDEOGRAPH +0xE166 0x7574 #CJK UNIFIED IDEOGRAPH +0xE167 0x758A #CJK UNIFIED IDEOGRAPH +0xE168 0x7589 #CJK UNIFIED IDEOGRAPH +0xE169 0x7582 #CJK UNIFIED IDEOGRAPH +0xE16A 0x7594 #CJK UNIFIED IDEOGRAPH +0xE16B 0x759A #CJK UNIFIED IDEOGRAPH +0xE16C 0x759D #CJK UNIFIED IDEOGRAPH +0xE16D 0x75A5 #CJK UNIFIED IDEOGRAPH +0xE16E 0x75A3 #CJK UNIFIED IDEOGRAPH +0xE16F 0x75C2 #CJK UNIFIED IDEOGRAPH +0xE170 0x75B3 #CJK UNIFIED IDEOGRAPH +0xE171 0x75C3 #CJK UNIFIED IDEOGRAPH +0xE172 0x75B5 #CJK UNIFIED IDEOGRAPH +0xE173 0x75BD #CJK UNIFIED IDEOGRAPH +0xE174 0x75B8 #CJK UNIFIED IDEOGRAPH +0xE175 0x75BC #CJK UNIFIED IDEOGRAPH +0xE176 0x75B1 #CJK UNIFIED IDEOGRAPH +0xE177 0x75CD #CJK UNIFIED IDEOGRAPH +0xE178 0x75CA #CJK UNIFIED IDEOGRAPH +0xE179 0x75D2 #CJK UNIFIED IDEOGRAPH +0xE17A 0x75D9 #CJK UNIFIED IDEOGRAPH +0xE17B 0x75E3 #CJK UNIFIED IDEOGRAPH +0xE17C 0x75DE #CJK UNIFIED IDEOGRAPH +0xE17D 0x75FE #CJK UNIFIED IDEOGRAPH +0xE17E 0x75FF #CJK UNIFIED IDEOGRAPH +0xE180 0x75FC #CJK UNIFIED IDEOGRAPH +0xE181 0x7601 #CJK UNIFIED IDEOGRAPH +0xE182 0x75F0 #CJK UNIFIED IDEOGRAPH +0xE183 0x75FA #CJK UNIFIED IDEOGRAPH +0xE184 0x75F2 #CJK UNIFIED IDEOGRAPH +0xE185 0x75F3 #CJK UNIFIED IDEOGRAPH +0xE186 0x760B #CJK UNIFIED IDEOGRAPH +0xE187 0x760D #CJK UNIFIED IDEOGRAPH +0xE188 0x7609 #CJK UNIFIED IDEOGRAPH +0xE189 0x761F #CJK UNIFIED IDEOGRAPH +0xE18A 0x7627 #CJK UNIFIED IDEOGRAPH +0xE18B 0x7620 #CJK UNIFIED IDEOGRAPH +0xE18C 0x7621 #CJK UNIFIED IDEOGRAPH +0xE18D 0x7622 #CJK UNIFIED IDEOGRAPH +0xE18E 0x7624 #CJK UNIFIED IDEOGRAPH +0xE18F 0x7634 #CJK UNIFIED IDEOGRAPH +0xE190 0x7630 #CJK UNIFIED IDEOGRAPH +0xE191 0x763B #CJK UNIFIED IDEOGRAPH +0xE192 0x7647 #CJK UNIFIED IDEOGRAPH +0xE193 0x7648 #CJK UNIFIED IDEOGRAPH +0xE194 0x7646 #CJK UNIFIED IDEOGRAPH +0xE195 0x765C #CJK UNIFIED IDEOGRAPH +0xE196 0x7658 #CJK UNIFIED IDEOGRAPH +0xE197 0x7661 #CJK UNIFIED IDEOGRAPH +0xE198 0x7662 #CJK UNIFIED IDEOGRAPH +0xE199 0x7668 #CJK UNIFIED IDEOGRAPH +0xE19A 0x7669 #CJK UNIFIED IDEOGRAPH +0xE19B 0x766A #CJK UNIFIED IDEOGRAPH +0xE19C 0x7667 #CJK UNIFIED IDEOGRAPH +0xE19D 0x766C #CJK UNIFIED IDEOGRAPH +0xE19E 0x7670 #CJK UNIFIED IDEOGRAPH +0xE19F 0x7672 #CJK UNIFIED IDEOGRAPH +0xE1A0 0x7676 #CJK UNIFIED IDEOGRAPH +0xE1A1 0x7678 #CJK UNIFIED IDEOGRAPH +0xE1A2 0x767C #CJK UNIFIED IDEOGRAPH +0xE1A3 0x7680 #CJK UNIFIED IDEOGRAPH +0xE1A4 0x7683 #CJK UNIFIED IDEOGRAPH +0xE1A5 0x7688 #CJK UNIFIED IDEOGRAPH +0xE1A6 0x768B #CJK UNIFIED IDEOGRAPH +0xE1A7 0x768E #CJK UNIFIED IDEOGRAPH +0xE1A8 0x7696 #CJK UNIFIED IDEOGRAPH +0xE1A9 0x7693 #CJK UNIFIED IDEOGRAPH +0xE1AA 0x7699 #CJK UNIFIED IDEOGRAPH +0xE1AB 0x769A #CJK UNIFIED IDEOGRAPH +0xE1AC 0x76B0 #CJK UNIFIED IDEOGRAPH +0xE1AD 0x76B4 #CJK UNIFIED IDEOGRAPH +0xE1AE 0x76B8 #CJK UNIFIED IDEOGRAPH +0xE1AF 0x76B9 #CJK UNIFIED IDEOGRAPH +0xE1B0 0x76BA #CJK UNIFIED IDEOGRAPH +0xE1B1 0x76C2 #CJK UNIFIED IDEOGRAPH +0xE1B2 0x76CD #CJK UNIFIED IDEOGRAPH +0xE1B3 0x76D6 #CJK UNIFIED IDEOGRAPH +0xE1B4 0x76D2 #CJK UNIFIED IDEOGRAPH +0xE1B5 0x76DE #CJK UNIFIED IDEOGRAPH +0xE1B6 0x76E1 #CJK UNIFIED IDEOGRAPH +0xE1B7 0x76E5 #CJK UNIFIED IDEOGRAPH +0xE1B8 0x76E7 #CJK UNIFIED IDEOGRAPH +0xE1B9 0x76EA #CJK UNIFIED IDEOGRAPH +0xE1BA 0x862F #CJK UNIFIED IDEOGRAPH +0xE1BB 0x76FB #CJK UNIFIED IDEOGRAPH +0xE1BC 0x7708 #CJK UNIFIED IDEOGRAPH +0xE1BD 0x7707 #CJK UNIFIED IDEOGRAPH +0xE1BE 0x7704 #CJK UNIFIED IDEOGRAPH +0xE1BF 0x7729 #CJK UNIFIED IDEOGRAPH +0xE1C0 0x7724 #CJK UNIFIED IDEOGRAPH +0xE1C1 0x771E #CJK UNIFIED IDEOGRAPH +0xE1C2 0x7725 #CJK UNIFIED IDEOGRAPH +0xE1C3 0x7726 #CJK UNIFIED IDEOGRAPH +0xE1C4 0x771B #CJK UNIFIED IDEOGRAPH +0xE1C5 0x7737 #CJK UNIFIED IDEOGRAPH +0xE1C6 0x7738 #CJK UNIFIED IDEOGRAPH +0xE1C7 0x7747 #CJK UNIFIED IDEOGRAPH +0xE1C8 0x775A #CJK UNIFIED IDEOGRAPH +0xE1C9 0x7768 #CJK UNIFIED IDEOGRAPH +0xE1CA 0x776B #CJK UNIFIED IDEOGRAPH +0xE1CB 0x775B #CJK UNIFIED IDEOGRAPH +0xE1CC 0x7765 #CJK UNIFIED IDEOGRAPH +0xE1CD 0x777F #CJK UNIFIED IDEOGRAPH +0xE1CE 0x777E #CJK UNIFIED IDEOGRAPH +0xE1CF 0x7779 #CJK UNIFIED IDEOGRAPH +0xE1D0 0x778E #CJK UNIFIED IDEOGRAPH +0xE1D1 0x778B #CJK UNIFIED IDEOGRAPH +0xE1D2 0x7791 #CJK UNIFIED IDEOGRAPH +0xE1D3 0x77A0 #CJK UNIFIED IDEOGRAPH +0xE1D4 0x779E #CJK UNIFIED IDEOGRAPH +0xE1D5 0x77B0 #CJK UNIFIED IDEOGRAPH +0xE1D6 0x77B6 #CJK UNIFIED IDEOGRAPH +0xE1D7 0x77B9 #CJK UNIFIED IDEOGRAPH +0xE1D8 0x77BF #CJK UNIFIED IDEOGRAPH +0xE1D9 0x77BC #CJK UNIFIED IDEOGRAPH +0xE1DA 0x77BD #CJK UNIFIED IDEOGRAPH +0xE1DB 0x77BB #CJK UNIFIED IDEOGRAPH +0xE1DC 0x77C7 #CJK UNIFIED IDEOGRAPH +0xE1DD 0x77CD #CJK UNIFIED IDEOGRAPH +0xE1DE 0x77D7 #CJK UNIFIED IDEOGRAPH +0xE1DF 0x77DA #CJK UNIFIED IDEOGRAPH +0xE1E0 0x77DC #CJK UNIFIED IDEOGRAPH +0xE1E1 0x77E3 #CJK UNIFIED IDEOGRAPH +0xE1E2 0x77EE #CJK UNIFIED IDEOGRAPH +0xE1E3 0x77FC #CJK UNIFIED IDEOGRAPH +0xE1E4 0x780C #CJK UNIFIED IDEOGRAPH +0xE1E5 0x7812 #CJK UNIFIED IDEOGRAPH +0xE1E6 0x7926 #CJK UNIFIED IDEOGRAPH +0xE1E7 0x7820 #CJK UNIFIED IDEOGRAPH +0xE1E8 0x792A #CJK UNIFIED IDEOGRAPH +0xE1E9 0x7845 #CJK UNIFIED IDEOGRAPH +0xE1EA 0x788E #CJK UNIFIED IDEOGRAPH +0xE1EB 0x7874 #CJK UNIFIED IDEOGRAPH +0xE1EC 0x7886 #CJK UNIFIED IDEOGRAPH +0xE1ED 0x787C #CJK UNIFIED IDEOGRAPH +0xE1EE 0x789A #CJK UNIFIED IDEOGRAPH +0xE1EF 0x788C #CJK UNIFIED IDEOGRAPH +0xE1F0 0x78A3 #CJK UNIFIED IDEOGRAPH +0xE1F1 0x78B5 #CJK UNIFIED IDEOGRAPH +0xE1F2 0x78AA #CJK UNIFIED IDEOGRAPH +0xE1F3 0x78AF #CJK UNIFIED IDEOGRAPH +0xE1F4 0x78D1 #CJK UNIFIED IDEOGRAPH +0xE1F5 0x78C6 #CJK UNIFIED IDEOGRAPH +0xE1F6 0x78CB #CJK UNIFIED IDEOGRAPH +0xE1F7 0x78D4 #CJK UNIFIED IDEOGRAPH +0xE1F8 0x78BE #CJK UNIFIED IDEOGRAPH +0xE1F9 0x78BC #CJK UNIFIED IDEOGRAPH +0xE1FA 0x78C5 #CJK UNIFIED IDEOGRAPH +0xE1FB 0x78CA #CJK UNIFIED IDEOGRAPH +0xE1FC 0x78EC #CJK UNIFIED IDEOGRAPH +0xE240 0x78E7 #CJK UNIFIED IDEOGRAPH +0xE241 0x78DA #CJK UNIFIED IDEOGRAPH +0xE242 0x78FD #CJK UNIFIED IDEOGRAPH +0xE243 0x78F4 #CJK UNIFIED IDEOGRAPH +0xE244 0x7907 #CJK UNIFIED IDEOGRAPH +0xE245 0x7912 #CJK UNIFIED IDEOGRAPH +0xE246 0x7911 #CJK UNIFIED IDEOGRAPH +0xE247 0x7919 #CJK UNIFIED IDEOGRAPH +0xE248 0x792C #CJK UNIFIED IDEOGRAPH +0xE249 0x792B #CJK UNIFIED IDEOGRAPH +0xE24A 0x7940 #CJK UNIFIED IDEOGRAPH +0xE24B 0x7960 #CJK UNIFIED IDEOGRAPH +0xE24C 0x7957 #CJK UNIFIED IDEOGRAPH +0xE24D 0x795F #CJK UNIFIED IDEOGRAPH +0xE24E 0x795A #CJK UNIFIED IDEOGRAPH +0xE24F 0x7955 #CJK UNIFIED IDEOGRAPH +0xE250 0x7953 #CJK UNIFIED IDEOGRAPH +0xE251 0x797A #CJK UNIFIED IDEOGRAPH +0xE252 0x797F #CJK UNIFIED IDEOGRAPH +0xE253 0x798A #CJK UNIFIED IDEOGRAPH +0xE254 0x799D #CJK UNIFIED IDEOGRAPH +0xE255 0x79A7 #CJK UNIFIED IDEOGRAPH +0xE256 0x9F4B #CJK UNIFIED IDEOGRAPH +0xE257 0x79AA #CJK UNIFIED IDEOGRAPH +0xE258 0x79AE #CJK UNIFIED IDEOGRAPH +0xE259 0x79B3 #CJK UNIFIED IDEOGRAPH +0xE25A 0x79B9 #CJK UNIFIED IDEOGRAPH +0xE25B 0x79BA #CJK UNIFIED IDEOGRAPH +0xE25C 0x79C9 #CJK UNIFIED IDEOGRAPH +0xE25D 0x79D5 #CJK UNIFIED IDEOGRAPH +0xE25E 0x79E7 #CJK UNIFIED IDEOGRAPH +0xE25F 0x79EC #CJK UNIFIED IDEOGRAPH +0xE260 0x79E1 #CJK UNIFIED IDEOGRAPH +0xE261 0x79E3 #CJK UNIFIED IDEOGRAPH +0xE262 0x7A08 #CJK UNIFIED IDEOGRAPH +0xE263 0x7A0D #CJK UNIFIED IDEOGRAPH +0xE264 0x7A18 #CJK UNIFIED IDEOGRAPH +0xE265 0x7A19 #CJK UNIFIED IDEOGRAPH +0xE266 0x7A20 #CJK UNIFIED IDEOGRAPH +0xE267 0x7A1F #CJK UNIFIED IDEOGRAPH +0xE268 0x7980 #CJK UNIFIED IDEOGRAPH +0xE269 0x7A31 #CJK UNIFIED IDEOGRAPH +0xE26A 0x7A3B #CJK UNIFIED IDEOGRAPH +0xE26B 0x7A3E #CJK UNIFIED IDEOGRAPH +0xE26C 0x7A37 #CJK UNIFIED IDEOGRAPH +0xE26D 0x7A43 #CJK UNIFIED IDEOGRAPH +0xE26E 0x7A57 #CJK UNIFIED IDEOGRAPH +0xE26F 0x7A49 #CJK UNIFIED IDEOGRAPH +0xE270 0x7A61 #CJK UNIFIED IDEOGRAPH +0xE271 0x7A62 #CJK UNIFIED IDEOGRAPH +0xE272 0x7A69 #CJK UNIFIED IDEOGRAPH +0xE273 0x9F9D #CJK UNIFIED IDEOGRAPH +0xE274 0x7A70 #CJK UNIFIED IDEOGRAPH +0xE275 0x7A79 #CJK UNIFIED IDEOGRAPH +0xE276 0x7A7D #CJK UNIFIED IDEOGRAPH +0xE277 0x7A88 #CJK UNIFIED IDEOGRAPH +0xE278 0x7A97 #CJK UNIFIED IDEOGRAPH +0xE279 0x7A95 #CJK UNIFIED IDEOGRAPH +0xE27A 0x7A98 #CJK UNIFIED IDEOGRAPH +0xE27B 0x7A96 #CJK UNIFIED IDEOGRAPH +0xE27C 0x7AA9 #CJK UNIFIED IDEOGRAPH +0xE27D 0x7AC8 #CJK UNIFIED IDEOGRAPH +0xE27E 0x7AB0 #CJK UNIFIED IDEOGRAPH +0xE280 0x7AB6 #CJK UNIFIED IDEOGRAPH +0xE281 0x7AC5 #CJK UNIFIED IDEOGRAPH +0xE282 0x7AC4 #CJK UNIFIED IDEOGRAPH +0xE283 0x7ABF #CJK UNIFIED IDEOGRAPH +0xE284 0x9083 #CJK UNIFIED IDEOGRAPH +0xE285 0x7AC7 #CJK UNIFIED IDEOGRAPH +0xE286 0x7ACA #CJK UNIFIED IDEOGRAPH +0xE287 0x7ACD #CJK UNIFIED IDEOGRAPH +0xE288 0x7ACF #CJK UNIFIED IDEOGRAPH +0xE289 0x7AD5 #CJK UNIFIED IDEOGRAPH +0xE28A 0x7AD3 #CJK UNIFIED IDEOGRAPH +0xE28B 0x7AD9 #CJK UNIFIED IDEOGRAPH +0xE28C 0x7ADA #CJK UNIFIED IDEOGRAPH +0xE28D 0x7ADD #CJK UNIFIED IDEOGRAPH +0xE28E 0x7AE1 #CJK UNIFIED IDEOGRAPH +0xE28F 0x7AE2 #CJK UNIFIED IDEOGRAPH +0xE290 0x7AE6 #CJK UNIFIED IDEOGRAPH +0xE291 0x7AED #CJK UNIFIED IDEOGRAPH +0xE292 0x7AF0 #CJK UNIFIED IDEOGRAPH +0xE293 0x7B02 #CJK UNIFIED IDEOGRAPH +0xE294 0x7B0F #CJK UNIFIED IDEOGRAPH +0xE295 0x7B0A #CJK UNIFIED IDEOGRAPH +0xE296 0x7B06 #CJK UNIFIED IDEOGRAPH +0xE297 0x7B33 #CJK UNIFIED IDEOGRAPH +0xE298 0x7B18 #CJK UNIFIED IDEOGRAPH +0xE299 0x7B19 #CJK UNIFIED IDEOGRAPH +0xE29A 0x7B1E #CJK UNIFIED IDEOGRAPH +0xE29B 0x7B35 #CJK UNIFIED IDEOGRAPH +0xE29C 0x7B28 #CJK UNIFIED IDEOGRAPH +0xE29D 0x7B36 #CJK UNIFIED IDEOGRAPH +0xE29E 0x7B50 #CJK UNIFIED IDEOGRAPH +0xE29F 0x7B7A #CJK UNIFIED IDEOGRAPH +0xE2A0 0x7B04 #CJK UNIFIED IDEOGRAPH +0xE2A1 0x7B4D #CJK UNIFIED IDEOGRAPH +0xE2A2 0x7B0B #CJK UNIFIED IDEOGRAPH +0xE2A3 0x7B4C #CJK UNIFIED IDEOGRAPH +0xE2A4 0x7B45 #CJK UNIFIED IDEOGRAPH +0xE2A5 0x7B75 #CJK UNIFIED IDEOGRAPH +0xE2A6 0x7B65 #CJK UNIFIED IDEOGRAPH +0xE2A7 0x7B74 #CJK UNIFIED IDEOGRAPH +0xE2A8 0x7B67 #CJK UNIFIED IDEOGRAPH +0xE2A9 0x7B70 #CJK UNIFIED IDEOGRAPH +0xE2AA 0x7B71 #CJK UNIFIED IDEOGRAPH +0xE2AB 0x7B6C #CJK UNIFIED IDEOGRAPH +0xE2AC 0x7B6E #CJK UNIFIED IDEOGRAPH +0xE2AD 0x7B9D #CJK UNIFIED IDEOGRAPH +0xE2AE 0x7B98 #CJK UNIFIED IDEOGRAPH +0xE2AF 0x7B9F #CJK UNIFIED IDEOGRAPH +0xE2B0 0x7B8D #CJK UNIFIED IDEOGRAPH +0xE2B1 0x7B9C #CJK UNIFIED IDEOGRAPH +0xE2B2 0x7B9A #CJK UNIFIED IDEOGRAPH +0xE2B3 0x7B8B #CJK UNIFIED IDEOGRAPH +0xE2B4 0x7B92 #CJK UNIFIED IDEOGRAPH +0xE2B5 0x7B8F #CJK UNIFIED IDEOGRAPH +0xE2B6 0x7B5D #CJK UNIFIED IDEOGRAPH +0xE2B7 0x7B99 #CJK UNIFIED IDEOGRAPH +0xE2B8 0x7BCB #CJK UNIFIED IDEOGRAPH +0xE2B9 0x7BC1 #CJK UNIFIED IDEOGRAPH +0xE2BA 0x7BCC #CJK UNIFIED IDEOGRAPH +0xE2BB 0x7BCF #CJK UNIFIED IDEOGRAPH +0xE2BC 0x7BB4 #CJK UNIFIED IDEOGRAPH +0xE2BD 0x7BC6 #CJK UNIFIED IDEOGRAPH +0xE2BE 0x7BDD #CJK UNIFIED IDEOGRAPH +0xE2BF 0x7BE9 #CJK UNIFIED IDEOGRAPH +0xE2C0 0x7C11 #CJK UNIFIED IDEOGRAPH +0xE2C1 0x7C14 #CJK UNIFIED IDEOGRAPH +0xE2C2 0x7BE6 #CJK UNIFIED IDEOGRAPH +0xE2C3 0x7BE5 #CJK UNIFIED IDEOGRAPH +0xE2C4 0x7C60 #CJK UNIFIED IDEOGRAPH +0xE2C5 0x7C00 #CJK UNIFIED IDEOGRAPH +0xE2C6 0x7C07 #CJK UNIFIED IDEOGRAPH +0xE2C7 0x7C13 #CJK UNIFIED IDEOGRAPH +0xE2C8 0x7BF3 #CJK UNIFIED IDEOGRAPH +0xE2C9 0x7BF7 #CJK UNIFIED IDEOGRAPH +0xE2CA 0x7C17 #CJK UNIFIED IDEOGRAPH +0xE2CB 0x7C0D #CJK UNIFIED IDEOGRAPH +0xE2CC 0x7BF6 #CJK UNIFIED IDEOGRAPH +0xE2CD 0x7C23 #CJK UNIFIED IDEOGRAPH +0xE2CE 0x7C27 #CJK UNIFIED IDEOGRAPH +0xE2CF 0x7C2A #CJK UNIFIED IDEOGRAPH +0xE2D0 0x7C1F #CJK UNIFIED IDEOGRAPH +0xE2D1 0x7C37 #CJK UNIFIED IDEOGRAPH +0xE2D2 0x7C2B #CJK UNIFIED IDEOGRAPH +0xE2D3 0x7C3D #CJK UNIFIED IDEOGRAPH +0xE2D4 0x7C4C #CJK UNIFIED IDEOGRAPH +0xE2D5 0x7C43 #CJK UNIFIED IDEOGRAPH +0xE2D6 0x7C54 #CJK UNIFIED IDEOGRAPH +0xE2D7 0x7C4F #CJK UNIFIED IDEOGRAPH +0xE2D8 0x7C40 #CJK UNIFIED IDEOGRAPH +0xE2D9 0x7C50 #CJK UNIFIED IDEOGRAPH +0xE2DA 0x7C58 #CJK UNIFIED IDEOGRAPH +0xE2DB 0x7C5F #CJK UNIFIED IDEOGRAPH +0xE2DC 0x7C64 #CJK UNIFIED IDEOGRAPH +0xE2DD 0x7C56 #CJK UNIFIED IDEOGRAPH +0xE2DE 0x7C65 #CJK UNIFIED IDEOGRAPH +0xE2DF 0x7C6C #CJK UNIFIED IDEOGRAPH +0xE2E0 0x7C75 #CJK UNIFIED IDEOGRAPH +0xE2E1 0x7C83 #CJK UNIFIED IDEOGRAPH +0xE2E2 0x7C90 #CJK UNIFIED IDEOGRAPH +0xE2E3 0x7CA4 #CJK UNIFIED IDEOGRAPH +0xE2E4 0x7CAD #CJK UNIFIED IDEOGRAPH +0xE2E5 0x7CA2 #CJK UNIFIED IDEOGRAPH +0xE2E6 0x7CAB #CJK UNIFIED IDEOGRAPH +0xE2E7 0x7CA1 #CJK UNIFIED IDEOGRAPH +0xE2E8 0x7CA8 #CJK UNIFIED IDEOGRAPH +0xE2E9 0x7CB3 #CJK UNIFIED IDEOGRAPH +0xE2EA 0x7CB2 #CJK UNIFIED IDEOGRAPH +0xE2EB 0x7CB1 #CJK UNIFIED IDEOGRAPH +0xE2EC 0x7CAE #CJK UNIFIED IDEOGRAPH +0xE2ED 0x7CB9 #CJK UNIFIED IDEOGRAPH +0xE2EE 0x7CBD #CJK UNIFIED IDEOGRAPH +0xE2EF 0x7CC0 #CJK UNIFIED IDEOGRAPH +0xE2F0 0x7CC5 #CJK UNIFIED IDEOGRAPH +0xE2F1 0x7CC2 #CJK UNIFIED IDEOGRAPH +0xE2F2 0x7CD8 #CJK UNIFIED IDEOGRAPH +0xE2F3 0x7CD2 #CJK UNIFIED IDEOGRAPH +0xE2F4 0x7CDC #CJK UNIFIED IDEOGRAPH +0xE2F5 0x7CE2 #CJK UNIFIED IDEOGRAPH +0xE2F6 0x9B3B #CJK UNIFIED IDEOGRAPH +0xE2F7 0x7CEF #CJK UNIFIED IDEOGRAPH +0xE2F8 0x7CF2 #CJK UNIFIED IDEOGRAPH +0xE2F9 0x7CF4 #CJK UNIFIED IDEOGRAPH +0xE2FA 0x7CF6 #CJK UNIFIED IDEOGRAPH +0xE2FB 0x7CFA #CJK UNIFIED IDEOGRAPH +0xE2FC 0x7D06 #CJK UNIFIED IDEOGRAPH +0xE340 0x7D02 #CJK UNIFIED IDEOGRAPH +0xE341 0x7D1C #CJK UNIFIED IDEOGRAPH +0xE342 0x7D15 #CJK UNIFIED IDEOGRAPH +0xE343 0x7D0A #CJK UNIFIED IDEOGRAPH +0xE344 0x7D45 #CJK UNIFIED IDEOGRAPH +0xE345 0x7D4B #CJK UNIFIED IDEOGRAPH +0xE346 0x7D2E #CJK UNIFIED IDEOGRAPH +0xE347 0x7D32 #CJK UNIFIED IDEOGRAPH +0xE348 0x7D3F #CJK UNIFIED IDEOGRAPH +0xE349 0x7D35 #CJK UNIFIED IDEOGRAPH +0xE34A 0x7D46 #CJK UNIFIED IDEOGRAPH +0xE34B 0x7D73 #CJK UNIFIED IDEOGRAPH +0xE34C 0x7D56 #CJK UNIFIED IDEOGRAPH +0xE34D 0x7D4E #CJK UNIFIED IDEOGRAPH +0xE34E 0x7D72 #CJK UNIFIED IDEOGRAPH +0xE34F 0x7D68 #CJK UNIFIED IDEOGRAPH +0xE350 0x7D6E #CJK UNIFIED IDEOGRAPH +0xE351 0x7D4F #CJK UNIFIED IDEOGRAPH +0xE352 0x7D63 #CJK UNIFIED IDEOGRAPH +0xE353 0x7D93 #CJK UNIFIED IDEOGRAPH +0xE354 0x7D89 #CJK UNIFIED IDEOGRAPH +0xE355 0x7D5B #CJK UNIFIED IDEOGRAPH +0xE356 0x7D8F #CJK UNIFIED IDEOGRAPH +0xE357 0x7D7D #CJK UNIFIED IDEOGRAPH +0xE358 0x7D9B #CJK UNIFIED IDEOGRAPH +0xE359 0x7DBA #CJK UNIFIED IDEOGRAPH +0xE35A 0x7DAE #CJK UNIFIED IDEOGRAPH +0xE35B 0x7DA3 #CJK UNIFIED IDEOGRAPH +0xE35C 0x7DB5 #CJK UNIFIED IDEOGRAPH +0xE35D 0x7DC7 #CJK UNIFIED IDEOGRAPH +0xE35E 0x7DBD #CJK UNIFIED IDEOGRAPH +0xE35F 0x7DAB #CJK UNIFIED IDEOGRAPH +0xE360 0x7E3D #CJK UNIFIED IDEOGRAPH +0xE361 0x7DA2 #CJK UNIFIED IDEOGRAPH +0xE362 0x7DAF #CJK UNIFIED IDEOGRAPH +0xE363 0x7DDC #CJK UNIFIED IDEOGRAPH +0xE364 0x7DB8 #CJK UNIFIED IDEOGRAPH +0xE365 0x7D9F #CJK UNIFIED IDEOGRAPH +0xE366 0x7DB0 #CJK UNIFIED IDEOGRAPH +0xE367 0x7DD8 #CJK UNIFIED IDEOGRAPH +0xE368 0x7DDD #CJK UNIFIED IDEOGRAPH +0xE369 0x7DE4 #CJK UNIFIED IDEOGRAPH +0xE36A 0x7DDE #CJK UNIFIED IDEOGRAPH +0xE36B 0x7DFB #CJK UNIFIED IDEOGRAPH +0xE36C 0x7DF2 #CJK UNIFIED IDEOGRAPH +0xE36D 0x7DE1 #CJK UNIFIED IDEOGRAPH +0xE36E 0x7E05 #CJK UNIFIED IDEOGRAPH +0xE36F 0x7E0A #CJK UNIFIED IDEOGRAPH +0xE370 0x7E23 #CJK UNIFIED IDEOGRAPH +0xE371 0x7E21 #CJK UNIFIED IDEOGRAPH +0xE372 0x7E12 #CJK UNIFIED IDEOGRAPH +0xE373 0x7E31 #CJK UNIFIED IDEOGRAPH +0xE374 0x7E1F #CJK UNIFIED IDEOGRAPH +0xE375 0x7E09 #CJK UNIFIED IDEOGRAPH +0xE376 0x7E0B #CJK UNIFIED IDEOGRAPH +0xE377 0x7E22 #CJK UNIFIED IDEOGRAPH +0xE378 0x7E46 #CJK UNIFIED IDEOGRAPH +0xE379 0x7E66 #CJK UNIFIED IDEOGRAPH +0xE37A 0x7E3B #CJK UNIFIED IDEOGRAPH +0xE37B 0x7E35 #CJK UNIFIED IDEOGRAPH +0xE37C 0x7E39 #CJK UNIFIED IDEOGRAPH +0xE37D 0x7E43 #CJK UNIFIED IDEOGRAPH +0xE37E 0x7E37 #CJK UNIFIED IDEOGRAPH +0xE380 0x7E32 #CJK UNIFIED IDEOGRAPH +0xE381 0x7E3A #CJK UNIFIED IDEOGRAPH +0xE382 0x7E67 #CJK UNIFIED IDEOGRAPH +0xE383 0x7E5D #CJK UNIFIED IDEOGRAPH +0xE384 0x7E56 #CJK UNIFIED IDEOGRAPH +0xE385 0x7E5E #CJK UNIFIED IDEOGRAPH +0xE386 0x7E59 #CJK UNIFIED IDEOGRAPH +0xE387 0x7E5A #CJK UNIFIED IDEOGRAPH +0xE388 0x7E79 #CJK UNIFIED IDEOGRAPH +0xE389 0x7E6A #CJK UNIFIED IDEOGRAPH +0xE38A 0x7E69 #CJK UNIFIED IDEOGRAPH +0xE38B 0x7E7C #CJK UNIFIED IDEOGRAPH +0xE38C 0x7E7B #CJK UNIFIED IDEOGRAPH +0xE38D 0x7E83 #CJK UNIFIED IDEOGRAPH +0xE38E 0x7DD5 #CJK UNIFIED IDEOGRAPH +0xE38F 0x7E7D #CJK UNIFIED IDEOGRAPH +0xE390 0x8FAE #CJK UNIFIED IDEOGRAPH +0xE391 0x7E7F #CJK UNIFIED IDEOGRAPH +0xE392 0x7E88 #CJK UNIFIED IDEOGRAPH +0xE393 0x7E89 #CJK UNIFIED IDEOGRAPH +0xE394 0x7E8C #CJK UNIFIED IDEOGRAPH +0xE395 0x7E92 #CJK UNIFIED IDEOGRAPH +0xE396 0x7E90 #CJK UNIFIED IDEOGRAPH +0xE397 0x7E93 #CJK UNIFIED IDEOGRAPH +0xE398 0x7E94 #CJK UNIFIED IDEOGRAPH +0xE399 0x7E96 #CJK UNIFIED IDEOGRAPH +0xE39A 0x7E8E #CJK UNIFIED IDEOGRAPH +0xE39B 0x7E9B #CJK UNIFIED IDEOGRAPH +0xE39C 0x7E9C #CJK UNIFIED IDEOGRAPH +0xE39D 0x7F38 #CJK UNIFIED IDEOGRAPH +0xE39E 0x7F3A #CJK UNIFIED IDEOGRAPH +0xE39F 0x7F45 #CJK UNIFIED IDEOGRAPH +0xE3A0 0x7F4C #CJK UNIFIED IDEOGRAPH +0xE3A1 0x7F4D #CJK UNIFIED IDEOGRAPH +0xE3A2 0x7F4E #CJK UNIFIED IDEOGRAPH +0xE3A3 0x7F50 #CJK UNIFIED IDEOGRAPH +0xE3A4 0x7F51 #CJK UNIFIED IDEOGRAPH +0xE3A5 0x7F55 #CJK UNIFIED IDEOGRAPH +0xE3A6 0x7F54 #CJK UNIFIED IDEOGRAPH +0xE3A7 0x7F58 #CJK UNIFIED IDEOGRAPH +0xE3A8 0x7F5F #CJK UNIFIED IDEOGRAPH +0xE3A9 0x7F60 #CJK UNIFIED IDEOGRAPH +0xE3AA 0x7F68 #CJK UNIFIED IDEOGRAPH +0xE3AB 0x7F69 #CJK UNIFIED IDEOGRAPH +0xE3AC 0x7F67 #CJK UNIFIED IDEOGRAPH +0xE3AD 0x7F78 #CJK UNIFIED IDEOGRAPH +0xE3AE 0x7F82 #CJK UNIFIED IDEOGRAPH +0xE3AF 0x7F86 #CJK UNIFIED IDEOGRAPH +0xE3B0 0x7F83 #CJK UNIFIED IDEOGRAPH +0xE3B1 0x7F88 #CJK UNIFIED IDEOGRAPH +0xE3B2 0x7F87 #CJK UNIFIED IDEOGRAPH +0xE3B3 0x7F8C #CJK UNIFIED IDEOGRAPH +0xE3B4 0x7F94 #CJK UNIFIED IDEOGRAPH +0xE3B5 0x7F9E #CJK UNIFIED IDEOGRAPH +0xE3B6 0x7F9D #CJK UNIFIED IDEOGRAPH +0xE3B7 0x7F9A #CJK UNIFIED IDEOGRAPH +0xE3B8 0x7FA3 #CJK UNIFIED IDEOGRAPH +0xE3B9 0x7FAF #CJK UNIFIED IDEOGRAPH +0xE3BA 0x7FB2 #CJK UNIFIED IDEOGRAPH +0xE3BB 0x7FB9 #CJK UNIFIED IDEOGRAPH +0xE3BC 0x7FAE #CJK UNIFIED IDEOGRAPH +0xE3BD 0x7FB6 #CJK UNIFIED IDEOGRAPH +0xE3BE 0x7FB8 #CJK UNIFIED IDEOGRAPH +0xE3BF 0x8B71 #CJK UNIFIED IDEOGRAPH +0xE3C0 0x7FC5 #CJK UNIFIED IDEOGRAPH +0xE3C1 0x7FC6 #CJK UNIFIED IDEOGRAPH +0xE3C2 0x7FCA #CJK UNIFIED IDEOGRAPH +0xE3C3 0x7FD5 #CJK UNIFIED IDEOGRAPH +0xE3C4 0x7FD4 #CJK UNIFIED IDEOGRAPH +0xE3C5 0x7FE1 #CJK UNIFIED IDEOGRAPH +0xE3C6 0x7FE6 #CJK UNIFIED IDEOGRAPH +0xE3C7 0x7FE9 #CJK UNIFIED IDEOGRAPH +0xE3C8 0x7FF3 #CJK UNIFIED IDEOGRAPH +0xE3C9 0x7FF9 #CJK UNIFIED IDEOGRAPH +0xE3CA 0x98DC #CJK UNIFIED IDEOGRAPH +0xE3CB 0x8006 #CJK UNIFIED IDEOGRAPH +0xE3CC 0x8004 #CJK UNIFIED IDEOGRAPH +0xE3CD 0x800B #CJK UNIFIED IDEOGRAPH +0xE3CE 0x8012 #CJK UNIFIED IDEOGRAPH +0xE3CF 0x8018 #CJK UNIFIED IDEOGRAPH +0xE3D0 0x8019 #CJK UNIFIED IDEOGRAPH +0xE3D1 0x801C #CJK UNIFIED IDEOGRAPH +0xE3D2 0x8021 #CJK UNIFIED IDEOGRAPH +0xE3D3 0x8028 #CJK UNIFIED IDEOGRAPH +0xE3D4 0x803F #CJK UNIFIED IDEOGRAPH +0xE3D5 0x803B #CJK UNIFIED IDEOGRAPH +0xE3D6 0x804A #CJK UNIFIED IDEOGRAPH +0xE3D7 0x8046 #CJK UNIFIED IDEOGRAPH +0xE3D8 0x8052 #CJK UNIFIED IDEOGRAPH +0xE3D9 0x8058 #CJK UNIFIED IDEOGRAPH +0xE3DA 0x805A #CJK UNIFIED IDEOGRAPH +0xE3DB 0x805F #CJK UNIFIED IDEOGRAPH +0xE3DC 0x8062 #CJK UNIFIED IDEOGRAPH +0xE3DD 0x8068 #CJK UNIFIED IDEOGRAPH +0xE3DE 0x8073 #CJK UNIFIED IDEOGRAPH +0xE3DF 0x8072 #CJK UNIFIED IDEOGRAPH +0xE3E0 0x8070 #CJK UNIFIED IDEOGRAPH +0xE3E1 0x8076 #CJK UNIFIED IDEOGRAPH +0xE3E2 0x8079 #CJK UNIFIED IDEOGRAPH +0xE3E3 0x807D #CJK UNIFIED IDEOGRAPH +0xE3E4 0x807F #CJK UNIFIED IDEOGRAPH +0xE3E5 0x8084 #CJK UNIFIED IDEOGRAPH +0xE3E6 0x8086 #CJK UNIFIED IDEOGRAPH +0xE3E7 0x8085 #CJK UNIFIED IDEOGRAPH +0xE3E8 0x809B #CJK UNIFIED IDEOGRAPH +0xE3E9 0x8093 #CJK UNIFIED IDEOGRAPH +0xE3EA 0x809A #CJK UNIFIED IDEOGRAPH +0xE3EB 0x80AD #CJK UNIFIED IDEOGRAPH +0xE3EC 0x5190 #CJK UNIFIED IDEOGRAPH +0xE3ED 0x80AC #CJK UNIFIED IDEOGRAPH +0xE3EE 0x80DB #CJK UNIFIED IDEOGRAPH +0xE3EF 0x80E5 #CJK UNIFIED IDEOGRAPH +0xE3F0 0x80D9 #CJK UNIFIED IDEOGRAPH +0xE3F1 0x80DD #CJK UNIFIED IDEOGRAPH +0xE3F2 0x80C4 #CJK UNIFIED IDEOGRAPH +0xE3F3 0x80DA #CJK UNIFIED IDEOGRAPH +0xE3F4 0x80D6 #CJK UNIFIED IDEOGRAPH +0xE3F5 0x8109 #CJK UNIFIED IDEOGRAPH +0xE3F6 0x80EF #CJK UNIFIED IDEOGRAPH +0xE3F7 0x80F1 #CJK UNIFIED IDEOGRAPH +0xE3F8 0x811B #CJK UNIFIED IDEOGRAPH +0xE3F9 0x8129 #CJK UNIFIED IDEOGRAPH +0xE3FA 0x8123 #CJK UNIFIED IDEOGRAPH +0xE3FB 0x812F #CJK UNIFIED IDEOGRAPH +0xE3FC 0x814B #CJK UNIFIED IDEOGRAPH +0xE440 0x968B #CJK UNIFIED IDEOGRAPH +0xE441 0x8146 #CJK UNIFIED IDEOGRAPH +0xE442 0x813E #CJK UNIFIED IDEOGRAPH +0xE443 0x8153 #CJK UNIFIED IDEOGRAPH +0xE444 0x8151 #CJK UNIFIED IDEOGRAPH +0xE445 0x80FC #CJK UNIFIED IDEOGRAPH +0xE446 0x8171 #CJK UNIFIED IDEOGRAPH +0xE447 0x816E #CJK UNIFIED IDEOGRAPH +0xE448 0x8165 #CJK UNIFIED IDEOGRAPH +0xE449 0x8166 #CJK UNIFIED IDEOGRAPH +0xE44A 0x8174 #CJK UNIFIED IDEOGRAPH +0xE44B 0x8183 #CJK UNIFIED IDEOGRAPH +0xE44C 0x8188 #CJK UNIFIED IDEOGRAPH +0xE44D 0x818A #CJK UNIFIED IDEOGRAPH +0xE44E 0x8180 #CJK UNIFIED IDEOGRAPH +0xE44F 0x8182 #CJK UNIFIED IDEOGRAPH +0xE450 0x81A0 #CJK UNIFIED IDEOGRAPH +0xE451 0x8195 #CJK UNIFIED IDEOGRAPH +0xE452 0x81A4 #CJK UNIFIED IDEOGRAPH +0xE453 0x81A3 #CJK UNIFIED IDEOGRAPH +0xE454 0x815F #CJK UNIFIED IDEOGRAPH +0xE455 0x8193 #CJK UNIFIED IDEOGRAPH +0xE456 0x81A9 #CJK UNIFIED IDEOGRAPH +0xE457 0x81B0 #CJK UNIFIED IDEOGRAPH +0xE458 0x81B5 #CJK UNIFIED IDEOGRAPH +0xE459 0x81BE #CJK UNIFIED IDEOGRAPH +0xE45A 0x81B8 #CJK UNIFIED IDEOGRAPH +0xE45B 0x81BD #CJK UNIFIED IDEOGRAPH +0xE45C 0x81C0 #CJK UNIFIED IDEOGRAPH +0xE45D 0x81C2 #CJK UNIFIED IDEOGRAPH +0xE45E 0x81BA #CJK UNIFIED IDEOGRAPH +0xE45F 0x81C9 #CJK UNIFIED IDEOGRAPH +0xE460 0x81CD #CJK UNIFIED IDEOGRAPH +0xE461 0x81D1 #CJK UNIFIED IDEOGRAPH +0xE462 0x81D9 #CJK UNIFIED IDEOGRAPH +0xE463 0x81D8 #CJK UNIFIED IDEOGRAPH +0xE464 0x81C8 #CJK UNIFIED IDEOGRAPH +0xE465 0x81DA #CJK UNIFIED IDEOGRAPH +0xE466 0x81DF #CJK UNIFIED IDEOGRAPH +0xE467 0x81E0 #CJK UNIFIED IDEOGRAPH +0xE468 0x81E7 #CJK UNIFIED IDEOGRAPH +0xE469 0x81FA #CJK UNIFIED IDEOGRAPH +0xE46A 0x81FB #CJK UNIFIED IDEOGRAPH +0xE46B 0x81FE #CJK UNIFIED IDEOGRAPH +0xE46C 0x8201 #CJK UNIFIED IDEOGRAPH +0xE46D 0x8202 #CJK UNIFIED IDEOGRAPH +0xE46E 0x8205 #CJK UNIFIED IDEOGRAPH +0xE46F 0x8207 #CJK UNIFIED IDEOGRAPH +0xE470 0x820A #CJK UNIFIED IDEOGRAPH +0xE471 0x820D #CJK UNIFIED IDEOGRAPH +0xE472 0x8210 #CJK UNIFIED IDEOGRAPH +0xE473 0x8216 #CJK UNIFIED IDEOGRAPH +0xE474 0x8229 #CJK UNIFIED IDEOGRAPH +0xE475 0x822B #CJK UNIFIED IDEOGRAPH +0xE476 0x8238 #CJK UNIFIED IDEOGRAPH +0xE477 0x8233 #CJK UNIFIED IDEOGRAPH +0xE478 0x8240 #CJK UNIFIED IDEOGRAPH +0xE479 0x8259 #CJK UNIFIED IDEOGRAPH +0xE47A 0x8258 #CJK UNIFIED IDEOGRAPH +0xE47B 0x825D #CJK UNIFIED IDEOGRAPH +0xE47C 0x825A #CJK UNIFIED IDEOGRAPH +0xE47D 0x825F #CJK UNIFIED IDEOGRAPH +0xE47E 0x8264 #CJK UNIFIED IDEOGRAPH +0xE480 0x8262 #CJK UNIFIED IDEOGRAPH +0xE481 0x8268 #CJK UNIFIED IDEOGRAPH +0xE482 0x826A #CJK UNIFIED IDEOGRAPH +0xE483 0x826B #CJK UNIFIED IDEOGRAPH +0xE484 0x822E #CJK UNIFIED IDEOGRAPH +0xE485 0x8271 #CJK UNIFIED IDEOGRAPH +0xE486 0x8277 #CJK UNIFIED IDEOGRAPH +0xE487 0x8278 #CJK UNIFIED IDEOGRAPH +0xE488 0x827E #CJK UNIFIED IDEOGRAPH +0xE489 0x828D #CJK UNIFIED IDEOGRAPH +0xE48A 0x8292 #CJK UNIFIED IDEOGRAPH +0xE48B 0x82AB #CJK UNIFIED IDEOGRAPH +0xE48C 0x829F #CJK UNIFIED IDEOGRAPH +0xE48D 0x82BB #CJK UNIFIED IDEOGRAPH +0xE48E 0x82AC #CJK UNIFIED IDEOGRAPH +0xE48F 0x82E1 #CJK UNIFIED IDEOGRAPH +0xE490 0x82E3 #CJK UNIFIED IDEOGRAPH +0xE491 0x82DF #CJK UNIFIED IDEOGRAPH +0xE492 0x82D2 #CJK UNIFIED IDEOGRAPH +0xE493 0x82F4 #CJK UNIFIED IDEOGRAPH +0xE494 0x82F3 #CJK UNIFIED IDEOGRAPH +0xE495 0x82FA #CJK UNIFIED IDEOGRAPH +0xE496 0x8393 #CJK UNIFIED IDEOGRAPH +0xE497 0x8303 #CJK UNIFIED IDEOGRAPH +0xE498 0x82FB #CJK UNIFIED IDEOGRAPH +0xE499 0x82F9 #CJK UNIFIED IDEOGRAPH +0xE49A 0x82DE #CJK UNIFIED IDEOGRAPH +0xE49B 0x8306 #CJK UNIFIED IDEOGRAPH +0xE49C 0x82DC #CJK UNIFIED IDEOGRAPH +0xE49D 0x8309 #CJK UNIFIED IDEOGRAPH +0xE49E 0x82D9 #CJK UNIFIED IDEOGRAPH +0xE49F 0x8335 #CJK UNIFIED IDEOGRAPH +0xE4A0 0x8334 #CJK UNIFIED IDEOGRAPH +0xE4A1 0x8316 #CJK UNIFIED IDEOGRAPH +0xE4A2 0x8332 #CJK UNIFIED IDEOGRAPH +0xE4A3 0x8331 #CJK UNIFIED IDEOGRAPH +0xE4A4 0x8340 #CJK UNIFIED IDEOGRAPH +0xE4A5 0x8339 #CJK UNIFIED IDEOGRAPH +0xE4A6 0x8350 #CJK UNIFIED IDEOGRAPH +0xE4A7 0x8345 #CJK UNIFIED IDEOGRAPH +0xE4A8 0x832F #CJK UNIFIED IDEOGRAPH +0xE4A9 0x832B #CJK UNIFIED IDEOGRAPH +0xE4AA 0x8317 #CJK UNIFIED IDEOGRAPH +0xE4AB 0x8318 #CJK UNIFIED IDEOGRAPH +0xE4AC 0x8385 #CJK UNIFIED IDEOGRAPH +0xE4AD 0x839A #CJK UNIFIED IDEOGRAPH +0xE4AE 0x83AA #CJK UNIFIED IDEOGRAPH +0xE4AF 0x839F #CJK UNIFIED IDEOGRAPH +0xE4B0 0x83A2 #CJK UNIFIED IDEOGRAPH +0xE4B1 0x8396 #CJK UNIFIED IDEOGRAPH +0xE4B2 0x8323 #CJK UNIFIED IDEOGRAPH +0xE4B3 0x838E #CJK UNIFIED IDEOGRAPH +0xE4B4 0x8387 #CJK UNIFIED IDEOGRAPH +0xE4B5 0x838A #CJK UNIFIED IDEOGRAPH +0xE4B6 0x837C #CJK UNIFIED IDEOGRAPH +0xE4B7 0x83B5 #CJK UNIFIED IDEOGRAPH +0xE4B8 0x8373 #CJK UNIFIED IDEOGRAPH +0xE4B9 0x8375 #CJK UNIFIED IDEOGRAPH +0xE4BA 0x83A0 #CJK UNIFIED IDEOGRAPH +0xE4BB 0x8389 #CJK UNIFIED IDEOGRAPH +0xE4BC 0x83A8 #CJK UNIFIED IDEOGRAPH +0xE4BD 0x83F4 #CJK UNIFIED IDEOGRAPH +0xE4BE 0x8413 #CJK UNIFIED IDEOGRAPH +0xE4BF 0x83EB #CJK UNIFIED IDEOGRAPH +0xE4C0 0x83CE #CJK UNIFIED IDEOGRAPH +0xE4C1 0x83FD #CJK UNIFIED IDEOGRAPH +0xE4C2 0x8403 #CJK UNIFIED IDEOGRAPH +0xE4C3 0x83D8 #CJK UNIFIED IDEOGRAPH +0xE4C4 0x840B #CJK UNIFIED IDEOGRAPH +0xE4C5 0x83C1 #CJK UNIFIED IDEOGRAPH +0xE4C6 0x83F7 #CJK UNIFIED IDEOGRAPH +0xE4C7 0x8407 #CJK UNIFIED IDEOGRAPH +0xE4C8 0x83E0 #CJK UNIFIED IDEOGRAPH +0xE4C9 0x83F2 #CJK UNIFIED IDEOGRAPH +0xE4CA 0x840D #CJK UNIFIED IDEOGRAPH +0xE4CB 0x8422 #CJK UNIFIED IDEOGRAPH +0xE4CC 0x8420 #CJK UNIFIED IDEOGRAPH +0xE4CD 0x83BD #CJK UNIFIED IDEOGRAPH +0xE4CE 0x8438 #CJK UNIFIED IDEOGRAPH +0xE4CF 0x8506 #CJK UNIFIED IDEOGRAPH +0xE4D0 0x83FB #CJK UNIFIED IDEOGRAPH +0xE4D1 0x846D #CJK UNIFIED IDEOGRAPH +0xE4D2 0x842A #CJK UNIFIED IDEOGRAPH +0xE4D3 0x843C #CJK UNIFIED IDEOGRAPH +0xE4D4 0x855A #CJK UNIFIED IDEOGRAPH +0xE4D5 0x8484 #CJK UNIFIED IDEOGRAPH +0xE4D6 0x8477 #CJK UNIFIED IDEOGRAPH +0xE4D7 0x846B #CJK UNIFIED IDEOGRAPH +0xE4D8 0x84AD #CJK UNIFIED IDEOGRAPH +0xE4D9 0x846E #CJK UNIFIED IDEOGRAPH +0xE4DA 0x8482 #CJK UNIFIED IDEOGRAPH +0xE4DB 0x8469 #CJK UNIFIED IDEOGRAPH +0xE4DC 0x8446 #CJK UNIFIED IDEOGRAPH +0xE4DD 0x842C #CJK UNIFIED IDEOGRAPH +0xE4DE 0x846F #CJK UNIFIED IDEOGRAPH +0xE4DF 0x8479 #CJK UNIFIED IDEOGRAPH +0xE4E0 0x8435 #CJK UNIFIED IDEOGRAPH +0xE4E1 0x84CA #CJK UNIFIED IDEOGRAPH +0xE4E2 0x8462 #CJK UNIFIED IDEOGRAPH +0xE4E3 0x84B9 #CJK UNIFIED IDEOGRAPH +0xE4E4 0x84BF #CJK UNIFIED IDEOGRAPH +0xE4E5 0x849F #CJK UNIFIED IDEOGRAPH +0xE4E6 0x84D9 #CJK UNIFIED IDEOGRAPH +0xE4E7 0x84CD #CJK UNIFIED IDEOGRAPH +0xE4E8 0x84BB #CJK UNIFIED IDEOGRAPH +0xE4E9 0x84DA #CJK UNIFIED IDEOGRAPH +0xE4EA 0x84D0 #CJK UNIFIED IDEOGRAPH +0xE4EB 0x84C1 #CJK UNIFIED IDEOGRAPH +0xE4EC 0x84C6 #CJK UNIFIED IDEOGRAPH +0xE4ED 0x84D6 #CJK UNIFIED IDEOGRAPH +0xE4EE 0x84A1 #CJK UNIFIED IDEOGRAPH +0xE4EF 0x8521 #CJK UNIFIED IDEOGRAPH +0xE4F0 0x84FF #CJK UNIFIED IDEOGRAPH +0xE4F1 0x84F4 #CJK UNIFIED IDEOGRAPH +0xE4F2 0x8517 #CJK UNIFIED IDEOGRAPH +0xE4F3 0x8518 #CJK UNIFIED IDEOGRAPH +0xE4F4 0x852C #CJK UNIFIED IDEOGRAPH +0xE4F5 0x851F #CJK UNIFIED IDEOGRAPH +0xE4F6 0x8515 #CJK UNIFIED IDEOGRAPH +0xE4F7 0x8514 #CJK UNIFIED IDEOGRAPH +0xE4F8 0x84FC #CJK UNIFIED IDEOGRAPH +0xE4F9 0x8540 #CJK UNIFIED IDEOGRAPH +0xE4FA 0x8563 #CJK UNIFIED IDEOGRAPH +0xE4FB 0x8558 #CJK UNIFIED IDEOGRAPH +0xE4FC 0x8548 #CJK UNIFIED IDEOGRAPH +0xE540 0x8541 #CJK UNIFIED IDEOGRAPH +0xE541 0x8602 #CJK UNIFIED IDEOGRAPH +0xE542 0x854B #CJK UNIFIED IDEOGRAPH +0xE543 0x8555 #CJK UNIFIED IDEOGRAPH +0xE544 0x8580 #CJK UNIFIED IDEOGRAPH +0xE545 0x85A4 #CJK UNIFIED IDEOGRAPH +0xE546 0x8588 #CJK UNIFIED IDEOGRAPH +0xE547 0x8591 #CJK UNIFIED IDEOGRAPH +0xE548 0x858A #CJK UNIFIED IDEOGRAPH +0xE549 0x85A8 #CJK UNIFIED IDEOGRAPH +0xE54A 0x856D #CJK UNIFIED IDEOGRAPH +0xE54B 0x8594 #CJK UNIFIED IDEOGRAPH +0xE54C 0x859B #CJK UNIFIED IDEOGRAPH +0xE54D 0x85EA #CJK UNIFIED IDEOGRAPH +0xE54E 0x8587 #CJK UNIFIED IDEOGRAPH +0xE54F 0x859C #CJK UNIFIED IDEOGRAPH +0xE550 0x8577 #CJK UNIFIED IDEOGRAPH +0xE551 0x857E #CJK UNIFIED IDEOGRAPH +0xE552 0x8590 #CJK UNIFIED IDEOGRAPH +0xE553 0x85C9 #CJK UNIFIED IDEOGRAPH +0xE554 0x85BA #CJK UNIFIED IDEOGRAPH +0xE555 0x85CF #CJK UNIFIED IDEOGRAPH +0xE556 0x85B9 #CJK UNIFIED IDEOGRAPH +0xE557 0x85D0 #CJK UNIFIED IDEOGRAPH +0xE558 0x85D5 #CJK UNIFIED IDEOGRAPH +0xE559 0x85DD #CJK UNIFIED IDEOGRAPH +0xE55A 0x85E5 #CJK UNIFIED IDEOGRAPH +0xE55B 0x85DC #CJK UNIFIED IDEOGRAPH +0xE55C 0x85F9 #CJK UNIFIED IDEOGRAPH +0xE55D 0x860A #CJK UNIFIED IDEOGRAPH +0xE55E 0x8613 #CJK UNIFIED IDEOGRAPH +0xE55F 0x860B #CJK UNIFIED IDEOGRAPH +0xE560 0x85FE #CJK UNIFIED IDEOGRAPH +0xE561 0x85FA #CJK UNIFIED IDEOGRAPH +0xE562 0x8606 #CJK UNIFIED IDEOGRAPH +0xE563 0x8622 #CJK UNIFIED IDEOGRAPH +0xE564 0x861A #CJK UNIFIED IDEOGRAPH +0xE565 0x8630 #CJK UNIFIED IDEOGRAPH +0xE566 0x863F #CJK UNIFIED IDEOGRAPH +0xE567 0x864D #CJK UNIFIED IDEOGRAPH +0xE568 0x4E55 #CJK UNIFIED IDEOGRAPH +0xE569 0x8654 #CJK UNIFIED IDEOGRAPH +0xE56A 0x865F #CJK UNIFIED IDEOGRAPH +0xE56B 0x8667 #CJK UNIFIED IDEOGRAPH +0xE56C 0x8671 #CJK UNIFIED IDEOGRAPH +0xE56D 0x8693 #CJK UNIFIED IDEOGRAPH +0xE56E 0x86A3 #CJK UNIFIED IDEOGRAPH +0xE56F 0x86A9 #CJK UNIFIED IDEOGRAPH +0xE570 0x86AA #CJK UNIFIED IDEOGRAPH +0xE571 0x868B #CJK UNIFIED IDEOGRAPH +0xE572 0x868C #CJK UNIFIED IDEOGRAPH +0xE573 0x86B6 #CJK UNIFIED IDEOGRAPH +0xE574 0x86AF #CJK UNIFIED IDEOGRAPH +0xE575 0x86C4 #CJK UNIFIED IDEOGRAPH +0xE576 0x86C6 #CJK UNIFIED IDEOGRAPH +0xE577 0x86B0 #CJK UNIFIED IDEOGRAPH +0xE578 0x86C9 #CJK UNIFIED IDEOGRAPH +0xE579 0x8823 #CJK UNIFIED IDEOGRAPH +0xE57A 0x86AB #CJK UNIFIED IDEOGRAPH +0xE57B 0x86D4 #CJK UNIFIED IDEOGRAPH +0xE57C 0x86DE #CJK UNIFIED IDEOGRAPH +0xE57D 0x86E9 #CJK UNIFIED IDEOGRAPH +0xE57E 0x86EC #CJK UNIFIED IDEOGRAPH +0xE580 0x86DF #CJK UNIFIED IDEOGRAPH +0xE581 0x86DB #CJK UNIFIED IDEOGRAPH +0xE582 0x86EF #CJK UNIFIED IDEOGRAPH +0xE583 0x8712 #CJK UNIFIED IDEOGRAPH +0xE584 0x8706 #CJK UNIFIED IDEOGRAPH +0xE585 0x8708 #CJK UNIFIED IDEOGRAPH +0xE586 0x8700 #CJK UNIFIED IDEOGRAPH +0xE587 0x8703 #CJK UNIFIED IDEOGRAPH +0xE588 0x86FB #CJK UNIFIED IDEOGRAPH +0xE589 0x8711 #CJK UNIFIED IDEOGRAPH +0xE58A 0x8709 #CJK UNIFIED IDEOGRAPH +0xE58B 0x870D #CJK UNIFIED IDEOGRAPH +0xE58C 0x86F9 #CJK UNIFIED IDEOGRAPH +0xE58D 0x870A #CJK UNIFIED IDEOGRAPH +0xE58E 0x8734 #CJK UNIFIED IDEOGRAPH +0xE58F 0x873F #CJK UNIFIED IDEOGRAPH +0xE590 0x8737 #CJK UNIFIED IDEOGRAPH +0xE591 0x873B #CJK UNIFIED IDEOGRAPH +0xE592 0x8725 #CJK UNIFIED IDEOGRAPH +0xE593 0x8729 #CJK UNIFIED IDEOGRAPH +0xE594 0x871A #CJK UNIFIED IDEOGRAPH +0xE595 0x8760 #CJK UNIFIED IDEOGRAPH +0xE596 0x875F #CJK UNIFIED IDEOGRAPH +0xE597 0x8778 #CJK UNIFIED IDEOGRAPH +0xE598 0x874C #CJK UNIFIED IDEOGRAPH +0xE599 0x874E #CJK UNIFIED IDEOGRAPH +0xE59A 0x8774 #CJK UNIFIED IDEOGRAPH +0xE59B 0x8757 #CJK UNIFIED IDEOGRAPH +0xE59C 0x8768 #CJK UNIFIED IDEOGRAPH +0xE59D 0x876E #CJK UNIFIED IDEOGRAPH +0xE59E 0x8759 #CJK UNIFIED IDEOGRAPH +0xE59F 0x8753 #CJK UNIFIED IDEOGRAPH +0xE5A0 0x8763 #CJK UNIFIED IDEOGRAPH +0xE5A1 0x876A #CJK UNIFIED IDEOGRAPH +0xE5A2 0x8805 #CJK UNIFIED IDEOGRAPH +0xE5A3 0x87A2 #CJK UNIFIED IDEOGRAPH +0xE5A4 0x879F #CJK UNIFIED IDEOGRAPH +0xE5A5 0x8782 #CJK UNIFIED IDEOGRAPH +0xE5A6 0x87AF #CJK UNIFIED IDEOGRAPH +0xE5A7 0x87CB #CJK UNIFIED IDEOGRAPH +0xE5A8 0x87BD #CJK UNIFIED IDEOGRAPH +0xE5A9 0x87C0 #CJK UNIFIED IDEOGRAPH +0xE5AA 0x87D0 #CJK UNIFIED IDEOGRAPH +0xE5AB 0x96D6 #CJK UNIFIED IDEOGRAPH +0xE5AC 0x87AB #CJK UNIFIED IDEOGRAPH +0xE5AD 0x87C4 #CJK UNIFIED IDEOGRAPH +0xE5AE 0x87B3 #CJK UNIFIED IDEOGRAPH +0xE5AF 0x87C7 #CJK UNIFIED IDEOGRAPH +0xE5B0 0x87C6 #CJK UNIFIED IDEOGRAPH +0xE5B1 0x87BB #CJK UNIFIED IDEOGRAPH +0xE5B2 0x87EF #CJK UNIFIED IDEOGRAPH +0xE5B3 0x87F2 #CJK UNIFIED IDEOGRAPH +0xE5B4 0x87E0 #CJK UNIFIED IDEOGRAPH +0xE5B5 0x880F #CJK UNIFIED IDEOGRAPH +0xE5B6 0x880D #CJK UNIFIED IDEOGRAPH +0xE5B7 0x87FE #CJK UNIFIED IDEOGRAPH +0xE5B8 0x87F6 #CJK UNIFIED IDEOGRAPH +0xE5B9 0x87F7 #CJK UNIFIED IDEOGRAPH +0xE5BA 0x880E #CJK UNIFIED IDEOGRAPH +0xE5BB 0x87D2 #CJK UNIFIED IDEOGRAPH +0xE5BC 0x8811 #CJK UNIFIED IDEOGRAPH +0xE5BD 0x8816 #CJK UNIFIED IDEOGRAPH +0xE5BE 0x8815 #CJK UNIFIED IDEOGRAPH +0xE5BF 0x8822 #CJK UNIFIED IDEOGRAPH +0xE5C0 0x8821 #CJK UNIFIED IDEOGRAPH +0xE5C1 0x8831 #CJK UNIFIED IDEOGRAPH +0xE5C2 0x8836 #CJK UNIFIED IDEOGRAPH +0xE5C3 0x8839 #CJK UNIFIED IDEOGRAPH +0xE5C4 0x8827 #CJK UNIFIED IDEOGRAPH +0xE5C5 0x883B #CJK UNIFIED IDEOGRAPH +0xE5C6 0x8844 #CJK UNIFIED IDEOGRAPH +0xE5C7 0x8842 #CJK UNIFIED IDEOGRAPH +0xE5C8 0x8852 #CJK UNIFIED IDEOGRAPH +0xE5C9 0x8859 #CJK UNIFIED IDEOGRAPH +0xE5CA 0x885E #CJK UNIFIED IDEOGRAPH +0xE5CB 0x8862 #CJK UNIFIED IDEOGRAPH +0xE5CC 0x886B #CJK UNIFIED IDEOGRAPH +0xE5CD 0x8881 #CJK UNIFIED IDEOGRAPH +0xE5CE 0x887E #CJK UNIFIED IDEOGRAPH +0xE5CF 0x889E #CJK UNIFIED IDEOGRAPH +0xE5D0 0x8875 #CJK UNIFIED IDEOGRAPH +0xE5D1 0x887D #CJK UNIFIED IDEOGRAPH +0xE5D2 0x88B5 #CJK UNIFIED IDEOGRAPH +0xE5D3 0x8872 #CJK UNIFIED IDEOGRAPH +0xE5D4 0x8882 #CJK UNIFIED IDEOGRAPH +0xE5D5 0x8897 #CJK UNIFIED IDEOGRAPH +0xE5D6 0x8892 #CJK UNIFIED IDEOGRAPH +0xE5D7 0x88AE #CJK UNIFIED IDEOGRAPH +0xE5D8 0x8899 #CJK UNIFIED IDEOGRAPH +0xE5D9 0x88A2 #CJK UNIFIED IDEOGRAPH +0xE5DA 0x888D #CJK UNIFIED IDEOGRAPH +0xE5DB 0x88A4 #CJK UNIFIED IDEOGRAPH +0xE5DC 0x88B0 #CJK UNIFIED IDEOGRAPH +0xE5DD 0x88BF #CJK UNIFIED IDEOGRAPH +0xE5DE 0x88B1 #CJK UNIFIED IDEOGRAPH +0xE5DF 0x88C3 #CJK UNIFIED IDEOGRAPH +0xE5E0 0x88C4 #CJK UNIFIED IDEOGRAPH +0xE5E1 0x88D4 #CJK UNIFIED IDEOGRAPH +0xE5E2 0x88D8 #CJK UNIFIED IDEOGRAPH +0xE5E3 0x88D9 #CJK UNIFIED IDEOGRAPH +0xE5E4 0x88DD #CJK UNIFIED IDEOGRAPH +0xE5E5 0x88F9 #CJK UNIFIED IDEOGRAPH +0xE5E6 0x8902 #CJK UNIFIED IDEOGRAPH +0xE5E7 0x88FC #CJK UNIFIED IDEOGRAPH +0xE5E8 0x88F4 #CJK UNIFIED IDEOGRAPH +0xE5E9 0x88E8 #CJK UNIFIED IDEOGRAPH +0xE5EA 0x88F2 #CJK UNIFIED IDEOGRAPH +0xE5EB 0x8904 #CJK UNIFIED IDEOGRAPH +0xE5EC 0x890C #CJK UNIFIED IDEOGRAPH +0xE5ED 0x890A #CJK UNIFIED IDEOGRAPH +0xE5EE 0x8913 #CJK UNIFIED IDEOGRAPH +0xE5EF 0x8943 #CJK UNIFIED IDEOGRAPH +0xE5F0 0x891E #CJK UNIFIED IDEOGRAPH +0xE5F1 0x8925 #CJK UNIFIED IDEOGRAPH +0xE5F2 0x892A #CJK UNIFIED IDEOGRAPH +0xE5F3 0x892B #CJK UNIFIED IDEOGRAPH +0xE5F4 0x8941 #CJK UNIFIED IDEOGRAPH +0xE5F5 0x8944 #CJK UNIFIED IDEOGRAPH +0xE5F6 0x893B #CJK UNIFIED IDEOGRAPH +0xE5F7 0x8936 #CJK UNIFIED IDEOGRAPH +0xE5F8 0x8938 #CJK UNIFIED IDEOGRAPH +0xE5F9 0x894C #CJK UNIFIED IDEOGRAPH +0xE5FA 0x891D #CJK UNIFIED IDEOGRAPH +0xE5FB 0x8960 #CJK UNIFIED IDEOGRAPH +0xE5FC 0x895E #CJK UNIFIED IDEOGRAPH +0xE640 0x8966 #CJK UNIFIED IDEOGRAPH +0xE641 0x8964 #CJK UNIFIED IDEOGRAPH +0xE642 0x896D #CJK UNIFIED IDEOGRAPH +0xE643 0x896A #CJK UNIFIED IDEOGRAPH +0xE644 0x896F #CJK UNIFIED IDEOGRAPH +0xE645 0x8974 #CJK UNIFIED IDEOGRAPH +0xE646 0x8977 #CJK UNIFIED IDEOGRAPH +0xE647 0x897E #CJK UNIFIED IDEOGRAPH +0xE648 0x8983 #CJK UNIFIED IDEOGRAPH +0xE649 0x8988 #CJK UNIFIED IDEOGRAPH +0xE64A 0x898A #CJK UNIFIED IDEOGRAPH +0xE64B 0x8993 #CJK UNIFIED IDEOGRAPH +0xE64C 0x8998 #CJK UNIFIED IDEOGRAPH +0xE64D 0x89A1 #CJK UNIFIED IDEOGRAPH +0xE64E 0x89A9 #CJK UNIFIED IDEOGRAPH +0xE64F 0x89A6 #CJK UNIFIED IDEOGRAPH +0xE650 0x89AC #CJK UNIFIED IDEOGRAPH +0xE651 0x89AF #CJK UNIFIED IDEOGRAPH +0xE652 0x89B2 #CJK UNIFIED IDEOGRAPH +0xE653 0x89BA #CJK UNIFIED IDEOGRAPH +0xE654 0x89BD #CJK UNIFIED IDEOGRAPH +0xE655 0x89BF #CJK UNIFIED IDEOGRAPH +0xE656 0x89C0 #CJK UNIFIED IDEOGRAPH +0xE657 0x89DA #CJK UNIFIED IDEOGRAPH +0xE658 0x89DC #CJK UNIFIED IDEOGRAPH +0xE659 0x89DD #CJK UNIFIED IDEOGRAPH +0xE65A 0x89E7 #CJK UNIFIED IDEOGRAPH +0xE65B 0x89F4 #CJK UNIFIED IDEOGRAPH +0xE65C 0x89F8 #CJK UNIFIED IDEOGRAPH +0xE65D 0x8A03 #CJK UNIFIED IDEOGRAPH +0xE65E 0x8A16 #CJK UNIFIED IDEOGRAPH +0xE65F 0x8A10 #CJK UNIFIED IDEOGRAPH +0xE660 0x8A0C #CJK UNIFIED IDEOGRAPH +0xE661 0x8A1B #CJK UNIFIED IDEOGRAPH +0xE662 0x8A1D #CJK UNIFIED IDEOGRAPH +0xE663 0x8A25 #CJK UNIFIED IDEOGRAPH +0xE664 0x8A36 #CJK UNIFIED IDEOGRAPH +0xE665 0x8A41 #CJK UNIFIED IDEOGRAPH +0xE666 0x8A5B #CJK UNIFIED IDEOGRAPH +0xE667 0x8A52 #CJK UNIFIED IDEOGRAPH +0xE668 0x8A46 #CJK UNIFIED IDEOGRAPH +0xE669 0x8A48 #CJK UNIFIED IDEOGRAPH +0xE66A 0x8A7C #CJK UNIFIED IDEOGRAPH +0xE66B 0x8A6D #CJK UNIFIED IDEOGRAPH +0xE66C 0x8A6C #CJK UNIFIED IDEOGRAPH +0xE66D 0x8A62 #CJK UNIFIED IDEOGRAPH +0xE66E 0x8A85 #CJK UNIFIED IDEOGRAPH +0xE66F 0x8A82 #CJK UNIFIED IDEOGRAPH +0xE670 0x8A84 #CJK UNIFIED IDEOGRAPH +0xE671 0x8AA8 #CJK UNIFIED IDEOGRAPH +0xE672 0x8AA1 #CJK UNIFIED IDEOGRAPH +0xE673 0x8A91 #CJK UNIFIED IDEOGRAPH +0xE674 0x8AA5 #CJK UNIFIED IDEOGRAPH +0xE675 0x8AA6 #CJK UNIFIED IDEOGRAPH +0xE676 0x8A9A #CJK UNIFIED IDEOGRAPH +0xE677 0x8AA3 #CJK UNIFIED IDEOGRAPH +0xE678 0x8AC4 #CJK UNIFIED IDEOGRAPH +0xE679 0x8ACD #CJK UNIFIED IDEOGRAPH +0xE67A 0x8AC2 #CJK UNIFIED IDEOGRAPH +0xE67B 0x8ADA #CJK UNIFIED IDEOGRAPH +0xE67C 0x8AEB #CJK UNIFIED IDEOGRAPH +0xE67D 0x8AF3 #CJK UNIFIED IDEOGRAPH +0xE67E 0x8AE7 #CJK UNIFIED IDEOGRAPH +0xE680 0x8AE4 #CJK UNIFIED IDEOGRAPH +0xE681 0x8AF1 #CJK UNIFIED IDEOGRAPH +0xE682 0x8B14 #CJK UNIFIED IDEOGRAPH +0xE683 0x8AE0 #CJK UNIFIED IDEOGRAPH +0xE684 0x8AE2 #CJK UNIFIED IDEOGRAPH +0xE685 0x8AF7 #CJK UNIFIED IDEOGRAPH +0xE686 0x8ADE #CJK UNIFIED IDEOGRAPH +0xE687 0x8ADB #CJK UNIFIED IDEOGRAPH +0xE688 0x8B0C #CJK UNIFIED IDEOGRAPH +0xE689 0x8B07 #CJK UNIFIED IDEOGRAPH +0xE68A 0x8B1A #CJK UNIFIED IDEOGRAPH +0xE68B 0x8AE1 #CJK UNIFIED IDEOGRAPH +0xE68C 0x8B16 #CJK UNIFIED IDEOGRAPH +0xE68D 0x8B10 #CJK UNIFIED IDEOGRAPH +0xE68E 0x8B17 #CJK UNIFIED IDEOGRAPH +0xE68F 0x8B20 #CJK UNIFIED IDEOGRAPH +0xE690 0x8B33 #CJK UNIFIED IDEOGRAPH +0xE691 0x97AB #CJK UNIFIED IDEOGRAPH +0xE692 0x8B26 #CJK UNIFIED IDEOGRAPH +0xE693 0x8B2B #CJK UNIFIED IDEOGRAPH +0xE694 0x8B3E #CJK UNIFIED IDEOGRAPH +0xE695 0x8B28 #CJK UNIFIED IDEOGRAPH +0xE696 0x8B41 #CJK UNIFIED IDEOGRAPH +0xE697 0x8B4C #CJK UNIFIED IDEOGRAPH +0xE698 0x8B4F #CJK UNIFIED IDEOGRAPH +0xE699 0x8B4E #CJK UNIFIED IDEOGRAPH +0xE69A 0x8B49 #CJK UNIFIED IDEOGRAPH +0xE69B 0x8B56 #CJK UNIFIED IDEOGRAPH +0xE69C 0x8B5B #CJK UNIFIED IDEOGRAPH +0xE69D 0x8B5A #CJK UNIFIED IDEOGRAPH +0xE69E 0x8B6B #CJK UNIFIED IDEOGRAPH +0xE69F 0x8B5F #CJK UNIFIED IDEOGRAPH +0xE6A0 0x8B6C #CJK UNIFIED IDEOGRAPH +0xE6A1 0x8B6F #CJK UNIFIED IDEOGRAPH +0xE6A2 0x8B74 #CJK UNIFIED IDEOGRAPH +0xE6A3 0x8B7D #CJK UNIFIED IDEOGRAPH +0xE6A4 0x8B80 #CJK UNIFIED IDEOGRAPH +0xE6A5 0x8B8C #CJK UNIFIED IDEOGRAPH +0xE6A6 0x8B8E #CJK UNIFIED IDEOGRAPH +0xE6A7 0x8B92 #CJK UNIFIED IDEOGRAPH +0xE6A8 0x8B93 #CJK UNIFIED IDEOGRAPH +0xE6A9 0x8B96 #CJK UNIFIED IDEOGRAPH +0xE6AA 0x8B99 #CJK UNIFIED IDEOGRAPH +0xE6AB 0x8B9A #CJK UNIFIED IDEOGRAPH +0xE6AC 0x8C3A #CJK UNIFIED IDEOGRAPH +0xE6AD 0x8C41 #CJK UNIFIED IDEOGRAPH +0xE6AE 0x8C3F #CJK UNIFIED IDEOGRAPH +0xE6AF 0x8C48 #CJK UNIFIED IDEOGRAPH +0xE6B0 0x8C4C #CJK UNIFIED IDEOGRAPH +0xE6B1 0x8C4E #CJK UNIFIED IDEOGRAPH +0xE6B2 0x8C50 #CJK UNIFIED IDEOGRAPH +0xE6B3 0x8C55 #CJK UNIFIED IDEOGRAPH +0xE6B4 0x8C62 #CJK UNIFIED IDEOGRAPH +0xE6B5 0x8C6C #CJK UNIFIED IDEOGRAPH +0xE6B6 0x8C78 #CJK UNIFIED IDEOGRAPH +0xE6B7 0x8C7A #CJK UNIFIED IDEOGRAPH +0xE6B8 0x8C82 #CJK UNIFIED IDEOGRAPH +0xE6B9 0x8C89 #CJK UNIFIED IDEOGRAPH +0xE6BA 0x8C85 #CJK UNIFIED IDEOGRAPH +0xE6BB 0x8C8A #CJK UNIFIED IDEOGRAPH +0xE6BC 0x8C8D #CJK UNIFIED IDEOGRAPH +0xE6BD 0x8C8E #CJK UNIFIED IDEOGRAPH +0xE6BE 0x8C94 #CJK UNIFIED IDEOGRAPH +0xE6BF 0x8C7C #CJK UNIFIED IDEOGRAPH +0xE6C0 0x8C98 #CJK UNIFIED IDEOGRAPH +0xE6C1 0x621D #CJK UNIFIED IDEOGRAPH +0xE6C2 0x8CAD #CJK UNIFIED IDEOGRAPH +0xE6C3 0x8CAA #CJK UNIFIED IDEOGRAPH +0xE6C4 0x8CBD #CJK UNIFIED IDEOGRAPH +0xE6C5 0x8CB2 #CJK UNIFIED IDEOGRAPH +0xE6C6 0x8CB3 #CJK UNIFIED IDEOGRAPH +0xE6C7 0x8CAE #CJK UNIFIED IDEOGRAPH +0xE6C8 0x8CB6 #CJK UNIFIED IDEOGRAPH +0xE6C9 0x8CC8 #CJK UNIFIED IDEOGRAPH +0xE6CA 0x8CC1 #CJK UNIFIED IDEOGRAPH +0xE6CB 0x8CE4 #CJK UNIFIED IDEOGRAPH +0xE6CC 0x8CE3 #CJK UNIFIED IDEOGRAPH +0xE6CD 0x8CDA #CJK UNIFIED IDEOGRAPH +0xE6CE 0x8CFD #CJK UNIFIED IDEOGRAPH +0xE6CF 0x8CFA #CJK UNIFIED IDEOGRAPH +0xE6D0 0x8CFB #CJK UNIFIED IDEOGRAPH +0xE6D1 0x8D04 #CJK UNIFIED IDEOGRAPH +0xE6D2 0x8D05 #CJK UNIFIED IDEOGRAPH +0xE6D3 0x8D0A #CJK UNIFIED IDEOGRAPH +0xE6D4 0x8D07 #CJK UNIFIED IDEOGRAPH +0xE6D5 0x8D0F #CJK UNIFIED IDEOGRAPH +0xE6D6 0x8D0D #CJK UNIFIED IDEOGRAPH +0xE6D7 0x8D10 #CJK UNIFIED IDEOGRAPH +0xE6D8 0x9F4E #CJK UNIFIED IDEOGRAPH +0xE6D9 0x8D13 #CJK UNIFIED IDEOGRAPH +0xE6DA 0x8CCD #CJK UNIFIED IDEOGRAPH +0xE6DB 0x8D14 #CJK UNIFIED IDEOGRAPH +0xE6DC 0x8D16 #CJK UNIFIED IDEOGRAPH +0xE6DD 0x8D67 #CJK UNIFIED IDEOGRAPH +0xE6DE 0x8D6D #CJK UNIFIED IDEOGRAPH +0xE6DF 0x8D71 #CJK UNIFIED IDEOGRAPH +0xE6E0 0x8D73 #CJK UNIFIED IDEOGRAPH +0xE6E1 0x8D81 #CJK UNIFIED IDEOGRAPH +0xE6E2 0x8D99 #CJK UNIFIED IDEOGRAPH +0xE6E3 0x8DC2 #CJK UNIFIED IDEOGRAPH +0xE6E4 0x8DBE #CJK UNIFIED IDEOGRAPH +0xE6E5 0x8DBA #CJK UNIFIED IDEOGRAPH +0xE6E6 0x8DCF #CJK UNIFIED IDEOGRAPH +0xE6E7 0x8DDA #CJK UNIFIED IDEOGRAPH +0xE6E8 0x8DD6 #CJK UNIFIED IDEOGRAPH +0xE6E9 0x8DCC #CJK UNIFIED IDEOGRAPH +0xE6EA 0x8DDB #CJK UNIFIED IDEOGRAPH +0xE6EB 0x8DCB #CJK UNIFIED IDEOGRAPH +0xE6EC 0x8DEA #CJK UNIFIED IDEOGRAPH +0xE6ED 0x8DEB #CJK UNIFIED IDEOGRAPH +0xE6EE 0x8DDF #CJK UNIFIED IDEOGRAPH +0xE6EF 0x8DE3 #CJK UNIFIED IDEOGRAPH +0xE6F0 0x8DFC #CJK UNIFIED IDEOGRAPH +0xE6F1 0x8E08 #CJK UNIFIED IDEOGRAPH +0xE6F2 0x8E09 #CJK UNIFIED IDEOGRAPH +0xE6F3 0x8DFF #CJK UNIFIED IDEOGRAPH +0xE6F4 0x8E1D #CJK UNIFIED IDEOGRAPH +0xE6F5 0x8E1E #CJK UNIFIED IDEOGRAPH +0xE6F6 0x8E10 #CJK UNIFIED IDEOGRAPH +0xE6F7 0x8E1F #CJK UNIFIED IDEOGRAPH +0xE6F8 0x8E42 #CJK UNIFIED IDEOGRAPH +0xE6F9 0x8E35 #CJK UNIFIED IDEOGRAPH +0xE6FA 0x8E30 #CJK UNIFIED IDEOGRAPH +0xE6FB 0x8E34 #CJK UNIFIED IDEOGRAPH +0xE6FC 0x8E4A #CJK UNIFIED IDEOGRAPH +0xE740 0x8E47 #CJK UNIFIED IDEOGRAPH +0xE741 0x8E49 #CJK UNIFIED IDEOGRAPH +0xE742 0x8E4C #CJK UNIFIED IDEOGRAPH +0xE743 0x8E50 #CJK UNIFIED IDEOGRAPH +0xE744 0x8E48 #CJK UNIFIED IDEOGRAPH +0xE745 0x8E59 #CJK UNIFIED IDEOGRAPH +0xE746 0x8E64 #CJK UNIFIED IDEOGRAPH +0xE747 0x8E60 #CJK UNIFIED IDEOGRAPH +0xE748 0x8E2A #CJK UNIFIED IDEOGRAPH +0xE749 0x8E63 #CJK UNIFIED IDEOGRAPH +0xE74A 0x8E55 #CJK UNIFIED IDEOGRAPH +0xE74B 0x8E76 #CJK UNIFIED IDEOGRAPH +0xE74C 0x8E72 #CJK UNIFIED IDEOGRAPH +0xE74D 0x8E7C #CJK UNIFIED IDEOGRAPH +0xE74E 0x8E81 #CJK UNIFIED IDEOGRAPH +0xE74F 0x8E87 #CJK UNIFIED IDEOGRAPH +0xE750 0x8E85 #CJK UNIFIED IDEOGRAPH +0xE751 0x8E84 #CJK UNIFIED IDEOGRAPH +0xE752 0x8E8B #CJK UNIFIED IDEOGRAPH +0xE753 0x8E8A #CJK UNIFIED IDEOGRAPH +0xE754 0x8E93 #CJK UNIFIED IDEOGRAPH +0xE755 0x8E91 #CJK UNIFIED IDEOGRAPH +0xE756 0x8E94 #CJK UNIFIED IDEOGRAPH +0xE757 0x8E99 #CJK UNIFIED IDEOGRAPH +0xE758 0x8EAA #CJK UNIFIED IDEOGRAPH +0xE759 0x8EA1 #CJK UNIFIED IDEOGRAPH +0xE75A 0x8EAC #CJK UNIFIED IDEOGRAPH +0xE75B 0x8EB0 #CJK UNIFIED IDEOGRAPH +0xE75C 0x8EC6 #CJK UNIFIED IDEOGRAPH +0xE75D 0x8EB1 #CJK UNIFIED IDEOGRAPH +0xE75E 0x8EBE #CJK UNIFIED IDEOGRAPH +0xE75F 0x8EC5 #CJK UNIFIED IDEOGRAPH +0xE760 0x8EC8 #CJK UNIFIED IDEOGRAPH +0xE761 0x8ECB #CJK UNIFIED IDEOGRAPH +0xE762 0x8EDB #CJK UNIFIED IDEOGRAPH +0xE763 0x8EE3 #CJK UNIFIED IDEOGRAPH +0xE764 0x8EFC #CJK UNIFIED IDEOGRAPH +0xE765 0x8EFB #CJK UNIFIED IDEOGRAPH +0xE766 0x8EEB #CJK UNIFIED IDEOGRAPH +0xE767 0x8EFE #CJK UNIFIED IDEOGRAPH +0xE768 0x8F0A #CJK UNIFIED IDEOGRAPH +0xE769 0x8F05 #CJK UNIFIED IDEOGRAPH +0xE76A 0x8F15 #CJK UNIFIED IDEOGRAPH +0xE76B 0x8F12 #CJK UNIFIED IDEOGRAPH +0xE76C 0x8F19 #CJK UNIFIED IDEOGRAPH +0xE76D 0x8F13 #CJK UNIFIED IDEOGRAPH +0xE76E 0x8F1C #CJK UNIFIED IDEOGRAPH +0xE76F 0x8F1F #CJK UNIFIED IDEOGRAPH +0xE770 0x8F1B #CJK UNIFIED IDEOGRAPH +0xE771 0x8F0C #CJK UNIFIED IDEOGRAPH +0xE772 0x8F26 #CJK UNIFIED IDEOGRAPH +0xE773 0x8F33 #CJK UNIFIED IDEOGRAPH +0xE774 0x8F3B #CJK UNIFIED IDEOGRAPH +0xE775 0x8F39 #CJK UNIFIED IDEOGRAPH +0xE776 0x8F45 #CJK UNIFIED IDEOGRAPH +0xE777 0x8F42 #CJK UNIFIED IDEOGRAPH +0xE778 0x8F3E #CJK UNIFIED IDEOGRAPH +0xE779 0x8F4C #CJK UNIFIED IDEOGRAPH +0xE77A 0x8F49 #CJK UNIFIED IDEOGRAPH +0xE77B 0x8F46 #CJK UNIFIED IDEOGRAPH +0xE77C 0x8F4E #CJK UNIFIED IDEOGRAPH +0xE77D 0x8F57 #CJK UNIFIED IDEOGRAPH +0xE77E 0x8F5C #CJK UNIFIED IDEOGRAPH +0xE780 0x8F62 #CJK UNIFIED IDEOGRAPH +0xE781 0x8F63 #CJK UNIFIED IDEOGRAPH +0xE782 0x8F64 #CJK UNIFIED IDEOGRAPH +0xE783 0x8F9C #CJK UNIFIED IDEOGRAPH +0xE784 0x8F9F #CJK UNIFIED IDEOGRAPH +0xE785 0x8FA3 #CJK UNIFIED IDEOGRAPH +0xE786 0x8FAD #CJK UNIFIED IDEOGRAPH +0xE787 0x8FAF #CJK UNIFIED IDEOGRAPH +0xE788 0x8FB7 #CJK UNIFIED IDEOGRAPH +0xE789 0x8FDA #CJK UNIFIED IDEOGRAPH +0xE78A 0x8FE5 #CJK UNIFIED IDEOGRAPH +0xE78B 0x8FE2 #CJK UNIFIED IDEOGRAPH +0xE78C 0x8FEA #CJK UNIFIED IDEOGRAPH +0xE78D 0x8FEF #CJK UNIFIED IDEOGRAPH +0xE78E 0x9087 #CJK UNIFIED IDEOGRAPH +0xE78F 0x8FF4 #CJK UNIFIED IDEOGRAPH +0xE790 0x9005 #CJK UNIFIED IDEOGRAPH +0xE791 0x8FF9 #CJK UNIFIED IDEOGRAPH +0xE792 0x8FFA #CJK UNIFIED IDEOGRAPH +0xE793 0x9011 #CJK UNIFIED IDEOGRAPH +0xE794 0x9015 #CJK UNIFIED IDEOGRAPH +0xE795 0x9021 #CJK UNIFIED IDEOGRAPH +0xE796 0x900D #CJK UNIFIED IDEOGRAPH +0xE797 0x901E #CJK UNIFIED IDEOGRAPH +0xE798 0x9016 #CJK UNIFIED IDEOGRAPH +0xE799 0x900B #CJK UNIFIED IDEOGRAPH +0xE79A 0x9027 #CJK UNIFIED IDEOGRAPH +0xE79B 0x9036 #CJK UNIFIED IDEOGRAPH +0xE79C 0x9035 #CJK UNIFIED IDEOGRAPH +0xE79D 0x9039 #CJK UNIFIED IDEOGRAPH +0xE79E 0x8FF8 #CJK UNIFIED IDEOGRAPH +0xE79F 0x904F #CJK UNIFIED IDEOGRAPH +0xE7A0 0x9050 #CJK UNIFIED IDEOGRAPH +0xE7A1 0x9051 #CJK UNIFIED IDEOGRAPH +0xE7A2 0x9052 #CJK UNIFIED IDEOGRAPH +0xE7A3 0x900E #CJK UNIFIED IDEOGRAPH +0xE7A4 0x9049 #CJK UNIFIED IDEOGRAPH +0xE7A5 0x903E #CJK UNIFIED IDEOGRAPH +0xE7A6 0x9056 #CJK UNIFIED IDEOGRAPH +0xE7A7 0x9058 #CJK UNIFIED IDEOGRAPH +0xE7A8 0x905E #CJK UNIFIED IDEOGRAPH +0xE7A9 0x9068 #CJK UNIFIED IDEOGRAPH +0xE7AA 0x906F #CJK UNIFIED IDEOGRAPH +0xE7AB 0x9076 #CJK UNIFIED IDEOGRAPH +0xE7AC 0x96A8 #CJK UNIFIED IDEOGRAPH +0xE7AD 0x9072 #CJK UNIFIED IDEOGRAPH +0xE7AE 0x9082 #CJK UNIFIED IDEOGRAPH +0xE7AF 0x907D #CJK UNIFIED IDEOGRAPH +0xE7B0 0x9081 #CJK UNIFIED IDEOGRAPH +0xE7B1 0x9080 #CJK UNIFIED IDEOGRAPH +0xE7B2 0x908A #CJK UNIFIED IDEOGRAPH +0xE7B3 0x9089 #CJK UNIFIED IDEOGRAPH +0xE7B4 0x908F #CJK UNIFIED IDEOGRAPH +0xE7B5 0x90A8 #CJK UNIFIED IDEOGRAPH +0xE7B6 0x90AF #CJK UNIFIED IDEOGRAPH +0xE7B7 0x90B1 #CJK UNIFIED IDEOGRAPH +0xE7B8 0x90B5 #CJK UNIFIED IDEOGRAPH +0xE7B9 0x90E2 #CJK UNIFIED IDEOGRAPH +0xE7BA 0x90E4 #CJK UNIFIED IDEOGRAPH +0xE7BB 0x6248 #CJK UNIFIED IDEOGRAPH +0xE7BC 0x90DB #CJK UNIFIED IDEOGRAPH +0xE7BD 0x9102 #CJK UNIFIED IDEOGRAPH +0xE7BE 0x9112 #CJK UNIFIED IDEOGRAPH +0xE7BF 0x9119 #CJK UNIFIED IDEOGRAPH +0xE7C0 0x9132 #CJK UNIFIED IDEOGRAPH +0xE7C1 0x9130 #CJK UNIFIED IDEOGRAPH +0xE7C2 0x914A #CJK UNIFIED IDEOGRAPH +0xE7C3 0x9156 #CJK UNIFIED IDEOGRAPH +0xE7C4 0x9158 #CJK UNIFIED IDEOGRAPH +0xE7C5 0x9163 #CJK UNIFIED IDEOGRAPH +0xE7C6 0x9165 #CJK UNIFIED IDEOGRAPH +0xE7C7 0x9169 #CJK UNIFIED IDEOGRAPH +0xE7C8 0x9173 #CJK UNIFIED IDEOGRAPH +0xE7C9 0x9172 #CJK UNIFIED IDEOGRAPH +0xE7CA 0x918B #CJK UNIFIED IDEOGRAPH +0xE7CB 0x9189 #CJK UNIFIED IDEOGRAPH +0xE7CC 0x9182 #CJK UNIFIED IDEOGRAPH +0xE7CD 0x91A2 #CJK UNIFIED IDEOGRAPH +0xE7CE 0x91AB #CJK UNIFIED IDEOGRAPH +0xE7CF 0x91AF #CJK UNIFIED IDEOGRAPH +0xE7D0 0x91AA #CJK UNIFIED IDEOGRAPH +0xE7D1 0x91B5 #CJK UNIFIED IDEOGRAPH +0xE7D2 0x91B4 #CJK UNIFIED IDEOGRAPH +0xE7D3 0x91BA #CJK UNIFIED IDEOGRAPH +0xE7D4 0x91C0 #CJK UNIFIED IDEOGRAPH +0xE7D5 0x91C1 #CJK UNIFIED IDEOGRAPH +0xE7D6 0x91C9 #CJK UNIFIED IDEOGRAPH +0xE7D7 0x91CB #CJK UNIFIED IDEOGRAPH +0xE7D8 0x91D0 #CJK UNIFIED IDEOGRAPH +0xE7D9 0x91D6 #CJK UNIFIED IDEOGRAPH +0xE7DA 0x91DF #CJK UNIFIED IDEOGRAPH +0xE7DB 0x91E1 #CJK UNIFIED IDEOGRAPH +0xE7DC 0x91DB #CJK UNIFIED IDEOGRAPH +0xE7DD 0x91FC #CJK UNIFIED IDEOGRAPH +0xE7DE 0x91F5 #CJK UNIFIED IDEOGRAPH +0xE7DF 0x91F6 #CJK UNIFIED IDEOGRAPH +0xE7E0 0x921E #CJK UNIFIED IDEOGRAPH +0xE7E1 0x91FF #CJK UNIFIED IDEOGRAPH +0xE7E2 0x9214 #CJK UNIFIED IDEOGRAPH +0xE7E3 0x922C #CJK UNIFIED IDEOGRAPH +0xE7E4 0x9215 #CJK UNIFIED IDEOGRAPH +0xE7E5 0x9211 #CJK UNIFIED IDEOGRAPH +0xE7E6 0x925E #CJK UNIFIED IDEOGRAPH +0xE7E7 0x9257 #CJK UNIFIED IDEOGRAPH +0xE7E8 0x9245 #CJK UNIFIED IDEOGRAPH +0xE7E9 0x9249 #CJK UNIFIED IDEOGRAPH +0xE7EA 0x9264 #CJK UNIFIED IDEOGRAPH +0xE7EB 0x9248 #CJK UNIFIED IDEOGRAPH +0xE7EC 0x9295 #CJK UNIFIED IDEOGRAPH +0xE7ED 0x923F #CJK UNIFIED IDEOGRAPH +0xE7EE 0x924B #CJK UNIFIED IDEOGRAPH +0xE7EF 0x9250 #CJK UNIFIED IDEOGRAPH +0xE7F0 0x929C #CJK UNIFIED IDEOGRAPH +0xE7F1 0x9296 #CJK UNIFIED IDEOGRAPH +0xE7F2 0x9293 #CJK UNIFIED IDEOGRAPH +0xE7F3 0x929B #CJK UNIFIED IDEOGRAPH +0xE7F4 0x925A #CJK UNIFIED IDEOGRAPH +0xE7F5 0x92CF #CJK UNIFIED IDEOGRAPH +0xE7F6 0x92B9 #CJK UNIFIED IDEOGRAPH +0xE7F7 0x92B7 #CJK UNIFIED IDEOGRAPH +0xE7F8 0x92E9 #CJK UNIFIED IDEOGRAPH +0xE7F9 0x930F #CJK UNIFIED IDEOGRAPH +0xE7FA 0x92FA #CJK UNIFIED IDEOGRAPH +0xE7FB 0x9344 #CJK UNIFIED IDEOGRAPH +0xE7FC 0x932E #CJK UNIFIED IDEOGRAPH +0xE840 0x9319 #CJK UNIFIED IDEOGRAPH +0xE841 0x9322 #CJK UNIFIED IDEOGRAPH +0xE842 0x931A #CJK UNIFIED IDEOGRAPH +0xE843 0x9323 #CJK UNIFIED IDEOGRAPH +0xE844 0x933A #CJK UNIFIED IDEOGRAPH +0xE845 0x9335 #CJK UNIFIED IDEOGRAPH +0xE846 0x933B #CJK UNIFIED IDEOGRAPH +0xE847 0x935C #CJK UNIFIED IDEOGRAPH +0xE848 0x9360 #CJK UNIFIED IDEOGRAPH +0xE849 0x937C #CJK UNIFIED IDEOGRAPH +0xE84A 0x936E #CJK UNIFIED IDEOGRAPH +0xE84B 0x9356 #CJK UNIFIED IDEOGRAPH +0xE84C 0x93B0 #CJK UNIFIED IDEOGRAPH +0xE84D 0x93AC #CJK UNIFIED IDEOGRAPH +0xE84E 0x93AD #CJK UNIFIED IDEOGRAPH +0xE84F 0x9394 #CJK UNIFIED IDEOGRAPH +0xE850 0x93B9 #CJK UNIFIED IDEOGRAPH +0xE851 0x93D6 #CJK UNIFIED IDEOGRAPH +0xE852 0x93D7 #CJK UNIFIED IDEOGRAPH +0xE853 0x93E8 #CJK UNIFIED IDEOGRAPH +0xE854 0x93E5 #CJK UNIFIED IDEOGRAPH +0xE855 0x93D8 #CJK UNIFIED IDEOGRAPH +0xE856 0x93C3 #CJK UNIFIED IDEOGRAPH +0xE857 0x93DD #CJK UNIFIED IDEOGRAPH +0xE858 0x93D0 #CJK UNIFIED IDEOGRAPH +0xE859 0x93C8 #CJK UNIFIED IDEOGRAPH +0xE85A 0x93E4 #CJK UNIFIED IDEOGRAPH +0xE85B 0x941A #CJK UNIFIED IDEOGRAPH +0xE85C 0x9414 #CJK UNIFIED IDEOGRAPH +0xE85D 0x9413 #CJK UNIFIED IDEOGRAPH +0xE85E 0x9403 #CJK UNIFIED IDEOGRAPH +0xE85F 0x9407 #CJK UNIFIED IDEOGRAPH +0xE860 0x9410 #CJK UNIFIED IDEOGRAPH +0xE861 0x9436 #CJK UNIFIED IDEOGRAPH +0xE862 0x942B #CJK UNIFIED IDEOGRAPH +0xE863 0x9435 #CJK UNIFIED IDEOGRAPH +0xE864 0x9421 #CJK UNIFIED IDEOGRAPH +0xE865 0x943A #CJK UNIFIED IDEOGRAPH +0xE866 0x9441 #CJK UNIFIED IDEOGRAPH +0xE867 0x9452 #CJK UNIFIED IDEOGRAPH +0xE868 0x9444 #CJK UNIFIED IDEOGRAPH +0xE869 0x945B #CJK UNIFIED IDEOGRAPH +0xE86A 0x9460 #CJK UNIFIED IDEOGRAPH +0xE86B 0x9462 #CJK UNIFIED IDEOGRAPH +0xE86C 0x945E #CJK UNIFIED IDEOGRAPH +0xE86D 0x946A #CJK UNIFIED IDEOGRAPH +0xE86E 0x9229 #CJK UNIFIED IDEOGRAPH +0xE86F 0x9470 #CJK UNIFIED IDEOGRAPH +0xE870 0x9475 #CJK UNIFIED IDEOGRAPH +0xE871 0x9477 #CJK UNIFIED IDEOGRAPH +0xE872 0x947D #CJK UNIFIED IDEOGRAPH +0xE873 0x945A #CJK UNIFIED IDEOGRAPH +0xE874 0x947C #CJK UNIFIED IDEOGRAPH +0xE875 0x947E #CJK UNIFIED IDEOGRAPH +0xE876 0x9481 #CJK UNIFIED IDEOGRAPH +0xE877 0x947F #CJK UNIFIED IDEOGRAPH +0xE878 0x9582 #CJK UNIFIED IDEOGRAPH +0xE879 0x9587 #CJK UNIFIED IDEOGRAPH +0xE87A 0x958A #CJK UNIFIED IDEOGRAPH +0xE87B 0x9594 #CJK UNIFIED IDEOGRAPH +0xE87C 0x9596 #CJK UNIFIED IDEOGRAPH +0xE87D 0x9598 #CJK UNIFIED IDEOGRAPH +0xE87E 0x9599 #CJK UNIFIED IDEOGRAPH +0xE880 0x95A0 #CJK UNIFIED IDEOGRAPH +0xE881 0x95A8 #CJK UNIFIED IDEOGRAPH +0xE882 0x95A7 #CJK UNIFIED IDEOGRAPH +0xE883 0x95AD #CJK UNIFIED IDEOGRAPH +0xE884 0x95BC #CJK UNIFIED IDEOGRAPH +0xE885 0x95BB #CJK UNIFIED IDEOGRAPH +0xE886 0x95B9 #CJK UNIFIED IDEOGRAPH +0xE887 0x95BE #CJK UNIFIED IDEOGRAPH +0xE888 0x95CA #CJK UNIFIED IDEOGRAPH +0xE889 0x6FF6 #CJK UNIFIED IDEOGRAPH +0xE88A 0x95C3 #CJK UNIFIED IDEOGRAPH +0xE88B 0x95CD #CJK UNIFIED IDEOGRAPH +0xE88C 0x95CC #CJK UNIFIED IDEOGRAPH +0xE88D 0x95D5 #CJK UNIFIED IDEOGRAPH +0xE88E 0x95D4 #CJK UNIFIED IDEOGRAPH +0xE88F 0x95D6 #CJK UNIFIED IDEOGRAPH +0xE890 0x95DC #CJK UNIFIED IDEOGRAPH +0xE891 0x95E1 #CJK UNIFIED IDEOGRAPH +0xE892 0x95E5 #CJK UNIFIED IDEOGRAPH +0xE893 0x95E2 #CJK UNIFIED IDEOGRAPH +0xE894 0x9621 #CJK UNIFIED IDEOGRAPH +0xE895 0x9628 #CJK UNIFIED IDEOGRAPH +0xE896 0x962E #CJK UNIFIED IDEOGRAPH +0xE897 0x962F #CJK UNIFIED IDEOGRAPH +0xE898 0x9642 #CJK UNIFIED IDEOGRAPH +0xE899 0x964C #CJK UNIFIED IDEOGRAPH +0xE89A 0x964F #CJK UNIFIED IDEOGRAPH +0xE89B 0x964B #CJK UNIFIED IDEOGRAPH +0xE89C 0x9677 #CJK UNIFIED IDEOGRAPH +0xE89D 0x965C #CJK UNIFIED IDEOGRAPH +0xE89E 0x965E #CJK UNIFIED IDEOGRAPH +0xE89F 0x965D #CJK UNIFIED IDEOGRAPH +0xE8A0 0x965F #CJK UNIFIED IDEOGRAPH +0xE8A1 0x9666 #CJK UNIFIED IDEOGRAPH +0xE8A2 0x9672 #CJK UNIFIED IDEOGRAPH +0xE8A3 0x966C #CJK UNIFIED IDEOGRAPH +0xE8A4 0x968D #CJK UNIFIED IDEOGRAPH +0xE8A5 0x9698 #CJK UNIFIED IDEOGRAPH +0xE8A6 0x9695 #CJK UNIFIED IDEOGRAPH +0xE8A7 0x9697 #CJK UNIFIED IDEOGRAPH +0xE8A8 0x96AA #CJK UNIFIED IDEOGRAPH +0xE8A9 0x96A7 #CJK UNIFIED IDEOGRAPH +0xE8AA 0x96B1 #CJK UNIFIED IDEOGRAPH +0xE8AB 0x96B2 #CJK UNIFIED IDEOGRAPH +0xE8AC 0x96B0 #CJK UNIFIED IDEOGRAPH +0xE8AD 0x96B4 #CJK UNIFIED IDEOGRAPH +0xE8AE 0x96B6 #CJK UNIFIED IDEOGRAPH +0xE8AF 0x96B8 #CJK UNIFIED IDEOGRAPH +0xE8B0 0x96B9 #CJK UNIFIED IDEOGRAPH +0xE8B1 0x96CE #CJK UNIFIED IDEOGRAPH +0xE8B2 0x96CB #CJK UNIFIED IDEOGRAPH +0xE8B3 0x96C9 #CJK UNIFIED IDEOGRAPH +0xE8B4 0x96CD #CJK UNIFIED IDEOGRAPH +0xE8B5 0x894D #CJK UNIFIED IDEOGRAPH +0xE8B6 0x96DC #CJK UNIFIED IDEOGRAPH +0xE8B7 0x970D #CJK UNIFIED IDEOGRAPH +0xE8B8 0x96D5 #CJK UNIFIED IDEOGRAPH +0xE8B9 0x96F9 #CJK UNIFIED IDEOGRAPH +0xE8BA 0x9704 #CJK UNIFIED IDEOGRAPH +0xE8BB 0x9706 #CJK UNIFIED IDEOGRAPH +0xE8BC 0x9708 #CJK UNIFIED IDEOGRAPH +0xE8BD 0x9713 #CJK UNIFIED IDEOGRAPH +0xE8BE 0x970E #CJK UNIFIED IDEOGRAPH +0xE8BF 0x9711 #CJK UNIFIED IDEOGRAPH +0xE8C0 0x970F #CJK UNIFIED IDEOGRAPH +0xE8C1 0x9716 #CJK UNIFIED IDEOGRAPH +0xE8C2 0x9719 #CJK UNIFIED IDEOGRAPH +0xE8C3 0x9724 #CJK UNIFIED IDEOGRAPH +0xE8C4 0x972A #CJK UNIFIED IDEOGRAPH +0xE8C5 0x9730 #CJK UNIFIED IDEOGRAPH +0xE8C6 0x9739 #CJK UNIFIED IDEOGRAPH +0xE8C7 0x973D #CJK UNIFIED IDEOGRAPH +0xE8C8 0x973E #CJK UNIFIED IDEOGRAPH +0xE8C9 0x9744 #CJK UNIFIED IDEOGRAPH +0xE8CA 0x9746 #CJK UNIFIED IDEOGRAPH +0xE8CB 0x9748 #CJK UNIFIED IDEOGRAPH +0xE8CC 0x9742 #CJK UNIFIED IDEOGRAPH +0xE8CD 0x9749 #CJK UNIFIED IDEOGRAPH +0xE8CE 0x975C #CJK UNIFIED IDEOGRAPH +0xE8CF 0x9760 #CJK UNIFIED IDEOGRAPH +0xE8D0 0x9764 #CJK UNIFIED IDEOGRAPH +0xE8D1 0x9766 #CJK UNIFIED IDEOGRAPH +0xE8D2 0x9768 #CJK UNIFIED IDEOGRAPH +0xE8D3 0x52D2 #CJK UNIFIED IDEOGRAPH +0xE8D4 0x976B #CJK UNIFIED IDEOGRAPH +0xE8D5 0x9771 #CJK UNIFIED IDEOGRAPH +0xE8D6 0x9779 #CJK UNIFIED IDEOGRAPH +0xE8D7 0x9785 #CJK UNIFIED IDEOGRAPH +0xE8D8 0x977C #CJK UNIFIED IDEOGRAPH +0xE8D9 0x9781 #CJK UNIFIED IDEOGRAPH +0xE8DA 0x977A #CJK UNIFIED IDEOGRAPH +0xE8DB 0x9786 #CJK UNIFIED IDEOGRAPH +0xE8DC 0x978B #CJK UNIFIED IDEOGRAPH +0xE8DD 0x978F #CJK UNIFIED IDEOGRAPH +0xE8DE 0x9790 #CJK UNIFIED IDEOGRAPH +0xE8DF 0x979C #CJK UNIFIED IDEOGRAPH +0xE8E0 0x97A8 #CJK UNIFIED IDEOGRAPH +0xE8E1 0x97A6 #CJK UNIFIED IDEOGRAPH +0xE8E2 0x97A3 #CJK UNIFIED IDEOGRAPH +0xE8E3 0x97B3 #CJK UNIFIED IDEOGRAPH +0xE8E4 0x97B4 #CJK UNIFIED IDEOGRAPH +0xE8E5 0x97C3 #CJK UNIFIED IDEOGRAPH +0xE8E6 0x97C6 #CJK UNIFIED IDEOGRAPH +0xE8E7 0x97C8 #CJK UNIFIED IDEOGRAPH +0xE8E8 0x97CB #CJK UNIFIED IDEOGRAPH +0xE8E9 0x97DC #CJK UNIFIED IDEOGRAPH +0xE8EA 0x97ED #CJK UNIFIED IDEOGRAPH +0xE8EB 0x9F4F #CJK UNIFIED IDEOGRAPH +0xE8EC 0x97F2 #CJK UNIFIED IDEOGRAPH +0xE8ED 0x7ADF #CJK UNIFIED IDEOGRAPH +0xE8EE 0x97F6 #CJK UNIFIED IDEOGRAPH +0xE8EF 0x97F5 #CJK UNIFIED IDEOGRAPH +0xE8F0 0x980F #CJK UNIFIED IDEOGRAPH +0xE8F1 0x980C #CJK UNIFIED IDEOGRAPH +0xE8F2 0x9838 #CJK UNIFIED IDEOGRAPH +0xE8F3 0x9824 #CJK UNIFIED IDEOGRAPH +0xE8F4 0x9821 #CJK UNIFIED IDEOGRAPH +0xE8F5 0x9837 #CJK UNIFIED IDEOGRAPH +0xE8F6 0x983D #CJK UNIFIED IDEOGRAPH +0xE8F7 0x9846 #CJK UNIFIED IDEOGRAPH +0xE8F8 0x984F #CJK UNIFIED IDEOGRAPH +0xE8F9 0x984B #CJK UNIFIED IDEOGRAPH +0xE8FA 0x986B #CJK UNIFIED IDEOGRAPH +0xE8FB 0x986F #CJK UNIFIED IDEOGRAPH +0xE8FC 0x9870 #CJK UNIFIED IDEOGRAPH +0xE940 0x9871 #CJK UNIFIED IDEOGRAPH +0xE941 0x9874 #CJK UNIFIED IDEOGRAPH +0xE942 0x9873 #CJK UNIFIED IDEOGRAPH +0xE943 0x98AA #CJK UNIFIED IDEOGRAPH +0xE944 0x98AF #CJK UNIFIED IDEOGRAPH +0xE945 0x98B1 #CJK UNIFIED IDEOGRAPH +0xE946 0x98B6 #CJK UNIFIED IDEOGRAPH +0xE947 0x98C4 #CJK UNIFIED IDEOGRAPH +0xE948 0x98C3 #CJK UNIFIED IDEOGRAPH +0xE949 0x98C6 #CJK UNIFIED IDEOGRAPH +0xE94A 0x98E9 #CJK UNIFIED IDEOGRAPH +0xE94B 0x98EB #CJK UNIFIED IDEOGRAPH +0xE94C 0x9903 #CJK UNIFIED IDEOGRAPH +0xE94D 0x9909 #CJK UNIFIED IDEOGRAPH +0xE94E 0x9912 #CJK UNIFIED IDEOGRAPH +0xE94F 0x9914 #CJK UNIFIED IDEOGRAPH +0xE950 0x9918 #CJK UNIFIED IDEOGRAPH +0xE951 0x9921 #CJK UNIFIED IDEOGRAPH +0xE952 0x991D #CJK UNIFIED IDEOGRAPH +0xE953 0x991E #CJK UNIFIED IDEOGRAPH +0xE954 0x9924 #CJK UNIFIED IDEOGRAPH +0xE955 0x9920 #CJK UNIFIED IDEOGRAPH +0xE956 0x992C #CJK UNIFIED IDEOGRAPH +0xE957 0x992E #CJK UNIFIED IDEOGRAPH +0xE958 0x993D #CJK UNIFIED IDEOGRAPH +0xE959 0x993E #CJK UNIFIED IDEOGRAPH +0xE95A 0x9942 #CJK UNIFIED IDEOGRAPH +0xE95B 0x9949 #CJK UNIFIED IDEOGRAPH +0xE95C 0x9945 #CJK UNIFIED IDEOGRAPH +0xE95D 0x9950 #CJK UNIFIED IDEOGRAPH +0xE95E 0x994B #CJK UNIFIED IDEOGRAPH +0xE95F 0x9951 #CJK UNIFIED IDEOGRAPH +0xE960 0x9952 #CJK UNIFIED IDEOGRAPH +0xE961 0x994C #CJK UNIFIED IDEOGRAPH +0xE962 0x9955 #CJK UNIFIED IDEOGRAPH +0xE963 0x9997 #CJK UNIFIED IDEOGRAPH +0xE964 0x9998 #CJK UNIFIED IDEOGRAPH +0xE965 0x99A5 #CJK UNIFIED IDEOGRAPH +0xE966 0x99AD #CJK UNIFIED IDEOGRAPH +0xE967 0x99AE #CJK UNIFIED IDEOGRAPH +0xE968 0x99BC #CJK UNIFIED IDEOGRAPH +0xE969 0x99DF #CJK UNIFIED IDEOGRAPH +0xE96A 0x99DB #CJK UNIFIED IDEOGRAPH +0xE96B 0x99DD #CJK UNIFIED IDEOGRAPH +0xE96C 0x99D8 #CJK UNIFIED IDEOGRAPH +0xE96D 0x99D1 #CJK UNIFIED IDEOGRAPH +0xE96E 0x99ED #CJK UNIFIED IDEOGRAPH +0xE96F 0x99EE #CJK UNIFIED IDEOGRAPH +0xE970 0x99F1 #CJK UNIFIED IDEOGRAPH +0xE971 0x99F2 #CJK UNIFIED IDEOGRAPH +0xE972 0x99FB #CJK UNIFIED IDEOGRAPH +0xE973 0x99F8 #CJK UNIFIED IDEOGRAPH +0xE974 0x9A01 #CJK UNIFIED IDEOGRAPH +0xE975 0x9A0F #CJK UNIFIED IDEOGRAPH +0xE976 0x9A05 #CJK UNIFIED IDEOGRAPH +0xE977 0x99E2 #CJK UNIFIED IDEOGRAPH +0xE978 0x9A19 #CJK UNIFIED IDEOGRAPH +0xE979 0x9A2B #CJK UNIFIED IDEOGRAPH +0xE97A 0x9A37 #CJK UNIFIED IDEOGRAPH +0xE97B 0x9A45 #CJK UNIFIED IDEOGRAPH +0xE97C 0x9A42 #CJK UNIFIED IDEOGRAPH +0xE97D 0x9A40 #CJK UNIFIED IDEOGRAPH +0xE97E 0x9A43 #CJK UNIFIED IDEOGRAPH +0xE980 0x9A3E #CJK UNIFIED IDEOGRAPH +0xE981 0x9A55 #CJK UNIFIED IDEOGRAPH +0xE982 0x9A4D #CJK UNIFIED IDEOGRAPH +0xE983 0x9A5B #CJK UNIFIED IDEOGRAPH +0xE984 0x9A57 #CJK UNIFIED IDEOGRAPH +0xE985 0x9A5F #CJK UNIFIED IDEOGRAPH +0xE986 0x9A62 #CJK UNIFIED IDEOGRAPH +0xE987 0x9A65 #CJK UNIFIED IDEOGRAPH +0xE988 0x9A64 #CJK UNIFIED IDEOGRAPH +0xE989 0x9A69 #CJK UNIFIED IDEOGRAPH +0xE98A 0x9A6B #CJK UNIFIED IDEOGRAPH +0xE98B 0x9A6A #CJK UNIFIED IDEOGRAPH +0xE98C 0x9AAD #CJK UNIFIED IDEOGRAPH +0xE98D 0x9AB0 #CJK UNIFIED IDEOGRAPH +0xE98E 0x9ABC #CJK UNIFIED IDEOGRAPH +0xE98F 0x9AC0 #CJK UNIFIED IDEOGRAPH +0xE990 0x9ACF #CJK UNIFIED IDEOGRAPH +0xE991 0x9AD1 #CJK UNIFIED IDEOGRAPH +0xE992 0x9AD3 #CJK UNIFIED IDEOGRAPH +0xE993 0x9AD4 #CJK UNIFIED IDEOGRAPH +0xE994 0x9ADE #CJK UNIFIED IDEOGRAPH +0xE995 0x9ADF #CJK UNIFIED IDEOGRAPH +0xE996 0x9AE2 #CJK UNIFIED IDEOGRAPH +0xE997 0x9AE3 #CJK UNIFIED IDEOGRAPH +0xE998 0x9AE6 #CJK UNIFIED IDEOGRAPH +0xE999 0x9AEF #CJK UNIFIED IDEOGRAPH +0xE99A 0x9AEB #CJK UNIFIED IDEOGRAPH +0xE99B 0x9AEE #CJK UNIFIED IDEOGRAPH +0xE99C 0x9AF4 #CJK UNIFIED IDEOGRAPH +0xE99D 0x9AF1 #CJK UNIFIED IDEOGRAPH +0xE99E 0x9AF7 #CJK UNIFIED IDEOGRAPH +0xE99F 0x9AFB #CJK UNIFIED IDEOGRAPH +0xE9A0 0x9B06 #CJK UNIFIED IDEOGRAPH +0xE9A1 0x9B18 #CJK UNIFIED IDEOGRAPH +0xE9A2 0x9B1A #CJK UNIFIED IDEOGRAPH +0xE9A3 0x9B1F #CJK UNIFIED IDEOGRAPH +0xE9A4 0x9B22 #CJK UNIFIED IDEOGRAPH +0xE9A5 0x9B23 #CJK UNIFIED IDEOGRAPH +0xE9A6 0x9B25 #CJK UNIFIED IDEOGRAPH +0xE9A7 0x9B27 #CJK UNIFIED IDEOGRAPH +0xE9A8 0x9B28 #CJK UNIFIED IDEOGRAPH +0xE9A9 0x9B29 #CJK UNIFIED IDEOGRAPH +0xE9AA 0x9B2A #CJK UNIFIED IDEOGRAPH +0xE9AB 0x9B2E #CJK UNIFIED IDEOGRAPH +0xE9AC 0x9B2F #CJK UNIFIED IDEOGRAPH +0xE9AD 0x9B32 #CJK UNIFIED IDEOGRAPH +0xE9AE 0x9B44 #CJK UNIFIED IDEOGRAPH +0xE9AF 0x9B43 #CJK UNIFIED IDEOGRAPH +0xE9B0 0x9B4F #CJK UNIFIED IDEOGRAPH +0xE9B1 0x9B4D #CJK UNIFIED IDEOGRAPH +0xE9B2 0x9B4E #CJK UNIFIED IDEOGRAPH +0xE9B3 0x9B51 #CJK UNIFIED IDEOGRAPH +0xE9B4 0x9B58 #CJK UNIFIED IDEOGRAPH +0xE9B5 0x9B74 #CJK UNIFIED IDEOGRAPH +0xE9B6 0x9B93 #CJK UNIFIED IDEOGRAPH +0xE9B7 0x9B83 #CJK UNIFIED IDEOGRAPH +0xE9B8 0x9B91 #CJK UNIFIED IDEOGRAPH +0xE9B9 0x9B96 #CJK UNIFIED IDEOGRAPH +0xE9BA 0x9B97 #CJK UNIFIED IDEOGRAPH +0xE9BB 0x9B9F #CJK UNIFIED IDEOGRAPH +0xE9BC 0x9BA0 #CJK UNIFIED IDEOGRAPH +0xE9BD 0x9BA8 #CJK UNIFIED IDEOGRAPH +0xE9BE 0x9BB4 #CJK UNIFIED IDEOGRAPH +0xE9BF 0x9BC0 #CJK UNIFIED IDEOGRAPH +0xE9C0 0x9BCA #CJK UNIFIED IDEOGRAPH +0xE9C1 0x9BB9 #CJK UNIFIED IDEOGRAPH +0xE9C2 0x9BC6 #CJK UNIFIED IDEOGRAPH +0xE9C3 0x9BCF #CJK UNIFIED IDEOGRAPH +0xE9C4 0x9BD1 #CJK UNIFIED IDEOGRAPH +0xE9C5 0x9BD2 #CJK UNIFIED IDEOGRAPH +0xE9C6 0x9BE3 #CJK UNIFIED IDEOGRAPH +0xE9C7 0x9BE2 #CJK UNIFIED IDEOGRAPH +0xE9C8 0x9BE4 #CJK UNIFIED IDEOGRAPH +0xE9C9 0x9BD4 #CJK UNIFIED IDEOGRAPH +0xE9CA 0x9BE1 #CJK UNIFIED IDEOGRAPH +0xE9CB 0x9C3A #CJK UNIFIED IDEOGRAPH +0xE9CC 0x9BF2 #CJK UNIFIED IDEOGRAPH +0xE9CD 0x9BF1 #CJK UNIFIED IDEOGRAPH +0xE9CE 0x9BF0 #CJK UNIFIED IDEOGRAPH +0xE9CF 0x9C15 #CJK UNIFIED IDEOGRAPH +0xE9D0 0x9C14 #CJK UNIFIED IDEOGRAPH +0xE9D1 0x9C09 #CJK UNIFIED IDEOGRAPH +0xE9D2 0x9C13 #CJK UNIFIED IDEOGRAPH +0xE9D3 0x9C0C #CJK UNIFIED IDEOGRAPH +0xE9D4 0x9C06 #CJK UNIFIED IDEOGRAPH +0xE9D5 0x9C08 #CJK UNIFIED IDEOGRAPH +0xE9D6 0x9C12 #CJK UNIFIED IDEOGRAPH +0xE9D7 0x9C0A #CJK UNIFIED IDEOGRAPH +0xE9D8 0x9C04 #CJK UNIFIED IDEOGRAPH +0xE9D9 0x9C2E #CJK UNIFIED IDEOGRAPH +0xE9DA 0x9C1B #CJK UNIFIED IDEOGRAPH +0xE9DB 0x9C25 #CJK UNIFIED IDEOGRAPH +0xE9DC 0x9C24 #CJK UNIFIED IDEOGRAPH +0xE9DD 0x9C21 #CJK UNIFIED IDEOGRAPH +0xE9DE 0x9C30 #CJK UNIFIED IDEOGRAPH +0xE9DF 0x9C47 #CJK UNIFIED IDEOGRAPH +0xE9E0 0x9C32 #CJK UNIFIED IDEOGRAPH +0xE9E1 0x9C46 #CJK UNIFIED IDEOGRAPH +0xE9E2 0x9C3E #CJK UNIFIED IDEOGRAPH +0xE9E3 0x9C5A #CJK UNIFIED IDEOGRAPH +0xE9E4 0x9C60 #CJK UNIFIED IDEOGRAPH +0xE9E5 0x9C67 #CJK UNIFIED IDEOGRAPH +0xE9E6 0x9C76 #CJK UNIFIED IDEOGRAPH +0xE9E7 0x9C78 #CJK UNIFIED IDEOGRAPH +0xE9E8 0x9CE7 #CJK UNIFIED IDEOGRAPH +0xE9E9 0x9CEC #CJK UNIFIED IDEOGRAPH +0xE9EA 0x9CF0 #CJK UNIFIED IDEOGRAPH +0xE9EB 0x9D09 #CJK UNIFIED IDEOGRAPH +0xE9EC 0x9D08 #CJK UNIFIED IDEOGRAPH +0xE9ED 0x9CEB #CJK UNIFIED IDEOGRAPH +0xE9EE 0x9D03 #CJK UNIFIED IDEOGRAPH +0xE9EF 0x9D06 #CJK UNIFIED IDEOGRAPH +0xE9F0 0x9D2A #CJK UNIFIED IDEOGRAPH +0xE9F1 0x9D26 #CJK UNIFIED IDEOGRAPH +0xE9F2 0x9DAF #CJK UNIFIED IDEOGRAPH +0xE9F3 0x9D23 #CJK UNIFIED IDEOGRAPH +0xE9F4 0x9D1F #CJK UNIFIED IDEOGRAPH +0xE9F5 0x9D44 #CJK UNIFIED IDEOGRAPH +0xE9F6 0x9D15 #CJK UNIFIED IDEOGRAPH +0xE9F7 0x9D12 #CJK UNIFIED IDEOGRAPH +0xE9F8 0x9D41 #CJK UNIFIED IDEOGRAPH +0xE9F9 0x9D3F #CJK UNIFIED IDEOGRAPH +0xE9FA 0x9D3E #CJK UNIFIED IDEOGRAPH +0xE9FB 0x9D46 #CJK UNIFIED IDEOGRAPH +0xE9FC 0x9D48 #CJK UNIFIED IDEOGRAPH +0xEA40 0x9D5D #CJK UNIFIED IDEOGRAPH +0xEA41 0x9D5E #CJK UNIFIED IDEOGRAPH +0xEA42 0x9D64 #CJK UNIFIED IDEOGRAPH +0xEA43 0x9D51 #CJK UNIFIED IDEOGRAPH +0xEA44 0x9D50 #CJK UNIFIED IDEOGRAPH +0xEA45 0x9D59 #CJK UNIFIED IDEOGRAPH +0xEA46 0x9D72 #CJK UNIFIED IDEOGRAPH +0xEA47 0x9D89 #CJK UNIFIED IDEOGRAPH +0xEA48 0x9D87 #CJK UNIFIED IDEOGRAPH +0xEA49 0x9DAB #CJK UNIFIED IDEOGRAPH +0xEA4A 0x9D6F #CJK UNIFIED IDEOGRAPH +0xEA4B 0x9D7A #CJK UNIFIED IDEOGRAPH +0xEA4C 0x9D9A #CJK UNIFIED IDEOGRAPH +0xEA4D 0x9DA4 #CJK UNIFIED IDEOGRAPH +0xEA4E 0x9DA9 #CJK UNIFIED IDEOGRAPH +0xEA4F 0x9DB2 #CJK UNIFIED IDEOGRAPH +0xEA50 0x9DC4 #CJK UNIFIED IDEOGRAPH +0xEA51 0x9DC1 #CJK UNIFIED IDEOGRAPH +0xEA52 0x9DBB #CJK UNIFIED IDEOGRAPH +0xEA53 0x9DB8 #CJK UNIFIED IDEOGRAPH +0xEA54 0x9DBA #CJK UNIFIED IDEOGRAPH +0xEA55 0x9DC6 #CJK UNIFIED IDEOGRAPH +0xEA56 0x9DCF #CJK UNIFIED IDEOGRAPH +0xEA57 0x9DC2 #CJK UNIFIED IDEOGRAPH +0xEA58 0x9DD9 #CJK UNIFIED IDEOGRAPH +0xEA59 0x9DD3 #CJK UNIFIED IDEOGRAPH +0xEA5A 0x9DF8 #CJK UNIFIED IDEOGRAPH +0xEA5B 0x9DE6 #CJK UNIFIED IDEOGRAPH +0xEA5C 0x9DED #CJK UNIFIED IDEOGRAPH +0xEA5D 0x9DEF #CJK UNIFIED IDEOGRAPH +0xEA5E 0x9DFD #CJK UNIFIED IDEOGRAPH +0xEA5F 0x9E1A #CJK UNIFIED IDEOGRAPH +0xEA60 0x9E1B #CJK UNIFIED IDEOGRAPH +0xEA61 0x9E1E #CJK UNIFIED IDEOGRAPH +0xEA62 0x9E75 #CJK UNIFIED IDEOGRAPH +0xEA63 0x9E79 #CJK UNIFIED IDEOGRAPH +0xEA64 0x9E7D #CJK UNIFIED IDEOGRAPH +0xEA65 0x9E81 #CJK UNIFIED IDEOGRAPH +0xEA66 0x9E88 #CJK UNIFIED IDEOGRAPH +0xEA67 0x9E8B #CJK UNIFIED IDEOGRAPH +0xEA68 0x9E8C #CJK UNIFIED IDEOGRAPH +0xEA69 0x9E92 #CJK UNIFIED IDEOGRAPH +0xEA6A 0x9E95 #CJK UNIFIED IDEOGRAPH +0xEA6B 0x9E91 #CJK UNIFIED IDEOGRAPH +0xEA6C 0x9E9D #CJK UNIFIED IDEOGRAPH +0xEA6D 0x9EA5 #CJK UNIFIED IDEOGRAPH +0xEA6E 0x9EA9 #CJK UNIFIED IDEOGRAPH +0xEA6F 0x9EB8 #CJK UNIFIED IDEOGRAPH +0xEA70 0x9EAA #CJK UNIFIED IDEOGRAPH +0xEA71 0x9EAD #CJK UNIFIED IDEOGRAPH +0xEA72 0x9761 #CJK UNIFIED IDEOGRAPH +0xEA73 0x9ECC #CJK UNIFIED IDEOGRAPH +0xEA74 0x9ECE #CJK UNIFIED IDEOGRAPH +0xEA75 0x9ECF #CJK UNIFIED IDEOGRAPH +0xEA76 0x9ED0 #CJK UNIFIED IDEOGRAPH +0xEA77 0x9ED4 #CJK UNIFIED IDEOGRAPH +0xEA78 0x9EDC #CJK UNIFIED IDEOGRAPH +0xEA79 0x9EDE #CJK UNIFIED IDEOGRAPH +0xEA7A 0x9EDD #CJK UNIFIED IDEOGRAPH +0xEA7B 0x9EE0 #CJK UNIFIED IDEOGRAPH +0xEA7C 0x9EE5 #CJK UNIFIED IDEOGRAPH +0xEA7D 0x9EE8 #CJK UNIFIED IDEOGRAPH +0xEA7E 0x9EEF #CJK UNIFIED IDEOGRAPH +0xEA80 0x9EF4 #CJK UNIFIED IDEOGRAPH +0xEA81 0x9EF6 #CJK UNIFIED IDEOGRAPH +0xEA82 0x9EF7 #CJK UNIFIED IDEOGRAPH +0xEA83 0x9EF9 #CJK UNIFIED IDEOGRAPH +0xEA84 0x9EFB #CJK UNIFIED IDEOGRAPH +0xEA85 0x9EFC #CJK UNIFIED IDEOGRAPH +0xEA86 0x9EFD #CJK UNIFIED IDEOGRAPH +0xEA87 0x9F07 #CJK UNIFIED IDEOGRAPH +0xEA88 0x9F08 #CJK UNIFIED IDEOGRAPH +0xEA89 0x76B7 #CJK UNIFIED IDEOGRAPH +0xEA8A 0x9F15 #CJK UNIFIED IDEOGRAPH +0xEA8B 0x9F21 #CJK UNIFIED IDEOGRAPH +0xEA8C 0x9F2C #CJK UNIFIED IDEOGRAPH +0xEA8D 0x9F3E #CJK UNIFIED IDEOGRAPH +0xEA8E 0x9F4A #CJK UNIFIED IDEOGRAPH +0xEA8F 0x9F52 #CJK UNIFIED IDEOGRAPH +0xEA90 0x9F54 #CJK UNIFIED IDEOGRAPH +0xEA91 0x9F63 #CJK UNIFIED IDEOGRAPH +0xEA92 0x9F5F #CJK UNIFIED IDEOGRAPH +0xEA93 0x9F60 #CJK UNIFIED IDEOGRAPH +0xEA94 0x9F61 #CJK UNIFIED IDEOGRAPH +0xEA95 0x9F66 #CJK UNIFIED IDEOGRAPH +0xEA96 0x9F67 #CJK UNIFIED IDEOGRAPH +0xEA97 0x9F6C #CJK UNIFIED IDEOGRAPH +0xEA98 0x9F6A #CJK UNIFIED IDEOGRAPH +0xEA99 0x9F77 #CJK UNIFIED IDEOGRAPH +0xEA9A 0x9F72 #CJK UNIFIED IDEOGRAPH +0xEA9B 0x9F76 #CJK UNIFIED IDEOGRAPH +0xEA9C 0x9F95 #CJK UNIFIED IDEOGRAPH +0xEA9D 0x9F9C #CJK UNIFIED IDEOGRAPH +0xEA9E 0x9FA0 #CJK UNIFIED IDEOGRAPH +0xEA9F 0x582F #CJK UNIFIED IDEOGRAPH +0xEAA0 0x69C7 #CJK UNIFIED IDEOGRAPH +0xEAA1 0x9059 #CJK UNIFIED IDEOGRAPH +0xEAA2 0x7464 #CJK UNIFIED IDEOGRAPH +0xEAA3 0x51DC #CJK UNIFIED IDEOGRAPH +0xEAA4 0x7199 #CJK UNIFIED IDEOGRAPH +0xED40 0x7E8A #CJK UNIFIED IDEOGRAPH +0xED41 0x891C #CJK UNIFIED IDEOGRAPH +0xED42 0x9348 #CJK UNIFIED IDEOGRAPH +0xED43 0x9288 #CJK UNIFIED IDEOGRAPH +0xED44 0x84DC #CJK UNIFIED IDEOGRAPH +0xED45 0x4FC9 #CJK UNIFIED IDEOGRAPH +0xED46 0x70BB #CJK UNIFIED IDEOGRAPH +0xED47 0x6631 #CJK UNIFIED IDEOGRAPH +0xED48 0x68C8 #CJK UNIFIED IDEOGRAPH +0xED49 0x92F9 #CJK UNIFIED IDEOGRAPH +0xED4A 0x66FB #CJK UNIFIED IDEOGRAPH +0xED4B 0x5F45 #CJK UNIFIED IDEOGRAPH +0xED4C 0x4E28 #CJK UNIFIED IDEOGRAPH +0xED4D 0x4EE1 #CJK UNIFIED IDEOGRAPH +0xED4E 0x4EFC #CJK UNIFIED IDEOGRAPH +0xED4F 0x4F00 #CJK UNIFIED IDEOGRAPH +0xED50 0x4F03 #CJK UNIFIED IDEOGRAPH +0xED51 0x4F39 #CJK UNIFIED IDEOGRAPH +0xED52 0x4F56 #CJK UNIFIED IDEOGRAPH +0xED53 0x4F92 #CJK UNIFIED IDEOGRAPH +0xED54 0x4F8A #CJK UNIFIED IDEOGRAPH +0xED55 0x4F9A #CJK UNIFIED IDEOGRAPH +0xED56 0x4F94 #CJK UNIFIED IDEOGRAPH +0xED57 0x4FCD #CJK UNIFIED IDEOGRAPH +0xED58 0x5040 #CJK UNIFIED IDEOGRAPH +0xED59 0x5022 #CJK UNIFIED IDEOGRAPH +0xED5A 0x4FFF #CJK UNIFIED IDEOGRAPH +0xED5B 0x501E #CJK UNIFIED IDEOGRAPH +0xED5C 0x5046 #CJK UNIFIED IDEOGRAPH +0xED5D 0x5070 #CJK UNIFIED IDEOGRAPH +0xED5E 0x5042 #CJK UNIFIED IDEOGRAPH +0xED5F 0x5094 #CJK UNIFIED IDEOGRAPH +0xED60 0x50F4 #CJK UNIFIED IDEOGRAPH +0xED61 0x50D8 #CJK UNIFIED IDEOGRAPH +0xED62 0x514A #CJK UNIFIED IDEOGRAPH +0xED63 0x5164 #CJK UNIFIED IDEOGRAPH +0xED64 0x519D #CJK UNIFIED IDEOGRAPH +0xED65 0x51BE #CJK UNIFIED IDEOGRAPH +0xED66 0x51EC #CJK UNIFIED IDEOGRAPH +0xED67 0x5215 #CJK UNIFIED IDEOGRAPH +0xED68 0x529C #CJK UNIFIED IDEOGRAPH +0xED69 0x52A6 #CJK UNIFIED IDEOGRAPH +0xED6A 0x52C0 #CJK UNIFIED IDEOGRAPH +0xED6B 0x52DB #CJK UNIFIED IDEOGRAPH +0xED6C 0x5300 #CJK UNIFIED IDEOGRAPH +0xED6D 0x5307 #CJK UNIFIED IDEOGRAPH +0xED6E 0x5324 #CJK UNIFIED IDEOGRAPH +0xED6F 0x5372 #CJK UNIFIED IDEOGRAPH +0xED70 0x5393 #CJK UNIFIED IDEOGRAPH +0xED71 0x53B2 #CJK UNIFIED IDEOGRAPH +0xED72 0x53DD #CJK UNIFIED IDEOGRAPH +0xED73 0xFA0E #CJK COMPATIBILITY IDEOGRAPH +0xED74 0x549C #CJK UNIFIED IDEOGRAPH +0xED75 0x548A #CJK UNIFIED IDEOGRAPH +0xED76 0x54A9 #CJK UNIFIED IDEOGRAPH +0xED77 0x54FF #CJK UNIFIED IDEOGRAPH +0xED78 0x5586 #CJK UNIFIED IDEOGRAPH +0xED79 0x5759 #CJK UNIFIED IDEOGRAPH +0xED7A 0x5765 #CJK UNIFIED IDEOGRAPH +0xED7B 0x57AC #CJK UNIFIED IDEOGRAPH +0xED7C 0x57C8 #CJK UNIFIED IDEOGRAPH +0xED7D 0x57C7 #CJK UNIFIED IDEOGRAPH +0xED7E 0xFA0F #CJK COMPATIBILITY IDEOGRAPH +0xED80 0xFA10 #CJK COMPATIBILITY IDEOGRAPH +0xED81 0x589E #CJK UNIFIED IDEOGRAPH +0xED82 0x58B2 #CJK UNIFIED IDEOGRAPH +0xED83 0x590B #CJK UNIFIED IDEOGRAPH +0xED84 0x5953 #CJK UNIFIED IDEOGRAPH +0xED85 0x595B #CJK UNIFIED IDEOGRAPH +0xED86 0x595D #CJK UNIFIED IDEOGRAPH +0xED87 0x5963 #CJK UNIFIED IDEOGRAPH +0xED88 0x59A4 #CJK UNIFIED IDEOGRAPH +0xED89 0x59BA #CJK UNIFIED IDEOGRAPH +0xED8A 0x5B56 #CJK UNIFIED IDEOGRAPH +0xED8B 0x5BC0 #CJK UNIFIED IDEOGRAPH +0xED8C 0x752F #CJK UNIFIED IDEOGRAPH +0xED8D 0x5BD8 #CJK UNIFIED IDEOGRAPH +0xED8E 0x5BEC #CJK UNIFIED IDEOGRAPH +0xED8F 0x5C1E #CJK UNIFIED IDEOGRAPH +0xED90 0x5CA6 #CJK UNIFIED IDEOGRAPH +0xED91 0x5CBA #CJK UNIFIED IDEOGRAPH +0xED92 0x5CF5 #CJK UNIFIED IDEOGRAPH +0xED93 0x5D27 #CJK UNIFIED IDEOGRAPH +0xED94 0x5D53 #CJK UNIFIED IDEOGRAPH +0xED95 0xFA11 #CJK COMPATIBILITY IDEOGRAPH +0xED96 0x5D42 #CJK UNIFIED IDEOGRAPH +0xED97 0x5D6D #CJK UNIFIED IDEOGRAPH +0xED98 0x5DB8 #CJK UNIFIED IDEOGRAPH +0xED99 0x5DB9 #CJK UNIFIED IDEOGRAPH +0xED9A 0x5DD0 #CJK UNIFIED IDEOGRAPH +0xED9B 0x5F21 #CJK UNIFIED IDEOGRAPH +0xED9C 0x5F34 #CJK UNIFIED IDEOGRAPH +0xED9D 0x5F67 #CJK UNIFIED IDEOGRAPH +0xED9E 0x5FB7 #CJK UNIFIED IDEOGRAPH +0xED9F 0x5FDE #CJK UNIFIED IDEOGRAPH +0xEDA0 0x605D #CJK UNIFIED IDEOGRAPH +0xEDA1 0x6085 #CJK UNIFIED IDEOGRAPH +0xEDA2 0x608A #CJK UNIFIED IDEOGRAPH +0xEDA3 0x60DE #CJK UNIFIED IDEOGRAPH +0xEDA4 0x60D5 #CJK UNIFIED IDEOGRAPH +0xEDA5 0x6120 #CJK UNIFIED IDEOGRAPH +0xEDA6 0x60F2 #CJK UNIFIED IDEOGRAPH +0xEDA7 0x6111 #CJK UNIFIED IDEOGRAPH +0xEDA8 0x6137 #CJK UNIFIED IDEOGRAPH +0xEDA9 0x6130 #CJK UNIFIED IDEOGRAPH +0xEDAA 0x6198 #CJK UNIFIED IDEOGRAPH +0xEDAB 0x6213 #CJK UNIFIED IDEOGRAPH +0xEDAC 0x62A6 #CJK UNIFIED IDEOGRAPH +0xEDAD 0x63F5 #CJK UNIFIED IDEOGRAPH +0xEDAE 0x6460 #CJK UNIFIED IDEOGRAPH +0xEDAF 0x649D #CJK UNIFIED IDEOGRAPH +0xEDB0 0x64CE #CJK UNIFIED IDEOGRAPH +0xEDB1 0x654E #CJK UNIFIED IDEOGRAPH +0xEDB2 0x6600 #CJK UNIFIED IDEOGRAPH +0xEDB3 0x6615 #CJK UNIFIED IDEOGRAPH +0xEDB4 0x663B #CJK UNIFIED IDEOGRAPH +0xEDB5 0x6609 #CJK UNIFIED IDEOGRAPH +0xEDB6 0x662E #CJK UNIFIED IDEOGRAPH +0xEDB7 0x661E #CJK UNIFIED IDEOGRAPH +0xEDB8 0x6624 #CJK UNIFIED IDEOGRAPH +0xEDB9 0x6665 #CJK UNIFIED IDEOGRAPH +0xEDBA 0x6657 #CJK UNIFIED IDEOGRAPH +0xEDBB 0x6659 #CJK UNIFIED IDEOGRAPH +0xEDBC 0xFA12 #CJK COMPATIBILITY IDEOGRAPH +0xEDBD 0x6673 #CJK UNIFIED IDEOGRAPH +0xEDBE 0x6699 #CJK UNIFIED IDEOGRAPH +0xEDBF 0x66A0 #CJK UNIFIED IDEOGRAPH +0xEDC0 0x66B2 #CJK UNIFIED IDEOGRAPH +0xEDC1 0x66BF #CJK UNIFIED IDEOGRAPH +0xEDC2 0x66FA #CJK UNIFIED IDEOGRAPH +0xEDC3 0x670E #CJK UNIFIED IDEOGRAPH +0xEDC4 0xF929 #CJK COMPATIBILITY IDEOGRAPH +0xEDC5 0x6766 #CJK UNIFIED IDEOGRAPH +0xEDC6 0x67BB #CJK UNIFIED IDEOGRAPH +0xEDC7 0x6852 #CJK UNIFIED IDEOGRAPH +0xEDC8 0x67C0 #CJK UNIFIED IDEOGRAPH +0xEDC9 0x6801 #CJK UNIFIED IDEOGRAPH +0xEDCA 0x6844 #CJK UNIFIED IDEOGRAPH +0xEDCB 0x68CF #CJK UNIFIED IDEOGRAPH +0xEDCC 0xFA13 #CJK COMPATIBILITY IDEOGRAPH +0xEDCD 0x6968 #CJK UNIFIED IDEOGRAPH +0xEDCE 0xFA14 #CJK COMPATIBILITY IDEOGRAPH +0xEDCF 0x6998 #CJK UNIFIED IDEOGRAPH +0xEDD0 0x69E2 #CJK UNIFIED IDEOGRAPH +0xEDD1 0x6A30 #CJK UNIFIED IDEOGRAPH +0xEDD2 0x6A6B #CJK UNIFIED IDEOGRAPH +0xEDD3 0x6A46 #CJK UNIFIED IDEOGRAPH +0xEDD4 0x6A73 #CJK UNIFIED IDEOGRAPH +0xEDD5 0x6A7E #CJK UNIFIED IDEOGRAPH +0xEDD6 0x6AE2 #CJK UNIFIED IDEOGRAPH +0xEDD7 0x6AE4 #CJK UNIFIED IDEOGRAPH +0xEDD8 0x6BD6 #CJK UNIFIED IDEOGRAPH +0xEDD9 0x6C3F #CJK UNIFIED IDEOGRAPH +0xEDDA 0x6C5C #CJK UNIFIED IDEOGRAPH +0xEDDB 0x6C86 #CJK UNIFIED IDEOGRAPH +0xEDDC 0x6C6F #CJK UNIFIED IDEOGRAPH +0xEDDD 0x6CDA #CJK UNIFIED IDEOGRAPH +0xEDDE 0x6D04 #CJK UNIFIED IDEOGRAPH +0xEDDF 0x6D87 #CJK UNIFIED IDEOGRAPH +0xEDE0 0x6D6F #CJK UNIFIED IDEOGRAPH +0xEDE1 0x6D96 #CJK UNIFIED IDEOGRAPH +0xEDE2 0x6DAC #CJK UNIFIED IDEOGRAPH +0xEDE3 0x6DCF #CJK UNIFIED IDEOGRAPH +0xEDE4 0x6DF8 #CJK UNIFIED IDEOGRAPH +0xEDE5 0x6DF2 #CJK UNIFIED IDEOGRAPH +0xEDE6 0x6DFC #CJK UNIFIED IDEOGRAPH +0xEDE7 0x6E39 #CJK UNIFIED IDEOGRAPH +0xEDE8 0x6E5C #CJK UNIFIED IDEOGRAPH +0xEDE9 0x6E27 #CJK UNIFIED IDEOGRAPH +0xEDEA 0x6E3C #CJK UNIFIED IDEOGRAPH +0xEDEB 0x6EBF #CJK UNIFIED IDEOGRAPH +0xEDEC 0x6F88 #CJK UNIFIED IDEOGRAPH +0xEDED 0x6FB5 #CJK UNIFIED IDEOGRAPH +0xEDEE 0x6FF5 #CJK UNIFIED IDEOGRAPH +0xEDEF 0x7005 #CJK UNIFIED IDEOGRAPH +0xEDF0 0x7007 #CJK UNIFIED IDEOGRAPH +0xEDF1 0x7028 #CJK UNIFIED IDEOGRAPH +0xEDF2 0x7085 #CJK UNIFIED IDEOGRAPH +0xEDF3 0x70AB #CJK UNIFIED IDEOGRAPH +0xEDF4 0x710F #CJK UNIFIED IDEOGRAPH +0xEDF5 0x7104 #CJK UNIFIED IDEOGRAPH +0xEDF6 0x715C #CJK UNIFIED IDEOGRAPH +0xEDF7 0x7146 #CJK UNIFIED IDEOGRAPH +0xEDF8 0x7147 #CJK UNIFIED IDEOGRAPH +0xEDF9 0xFA15 #CJK COMPATIBILITY IDEOGRAPH +0xEDFA 0x71C1 #CJK UNIFIED IDEOGRAPH +0xEDFB 0x71FE #CJK UNIFIED IDEOGRAPH +0xEDFC 0x72B1 #CJK UNIFIED IDEOGRAPH +0xEE40 0x72BE #CJK UNIFIED IDEOGRAPH +0xEE41 0x7324 #CJK UNIFIED IDEOGRAPH +0xEE42 0xFA16 #CJK COMPATIBILITY IDEOGRAPH +0xEE43 0x7377 #CJK UNIFIED IDEOGRAPH +0xEE44 0x73BD #CJK UNIFIED IDEOGRAPH +0xEE45 0x73C9 #CJK UNIFIED IDEOGRAPH +0xEE46 0x73D6 #CJK UNIFIED IDEOGRAPH +0xEE47 0x73E3 #CJK UNIFIED IDEOGRAPH +0xEE48 0x73D2 #CJK UNIFIED IDEOGRAPH +0xEE49 0x7407 #CJK UNIFIED IDEOGRAPH +0xEE4A 0x73F5 #CJK UNIFIED IDEOGRAPH +0xEE4B 0x7426 #CJK UNIFIED IDEOGRAPH +0xEE4C 0x742A #CJK UNIFIED IDEOGRAPH +0xEE4D 0x7429 #CJK UNIFIED IDEOGRAPH +0xEE4E 0x742E #CJK UNIFIED IDEOGRAPH +0xEE4F 0x7462 #CJK UNIFIED IDEOGRAPH +0xEE50 0x7489 #CJK UNIFIED IDEOGRAPH +0xEE51 0x749F #CJK UNIFIED IDEOGRAPH +0xEE52 0x7501 #CJK UNIFIED IDEOGRAPH +0xEE53 0x756F #CJK UNIFIED IDEOGRAPH +0xEE54 0x7682 #CJK UNIFIED IDEOGRAPH +0xEE55 0x769C #CJK UNIFIED IDEOGRAPH +0xEE56 0x769E #CJK UNIFIED IDEOGRAPH +0xEE57 0x769B #CJK UNIFIED IDEOGRAPH +0xEE58 0x76A6 #CJK UNIFIED IDEOGRAPH +0xEE59 0xFA17 #CJK COMPATIBILITY IDEOGRAPH +0xEE5A 0x7746 #CJK UNIFIED IDEOGRAPH +0xEE5B 0x52AF #CJK UNIFIED IDEOGRAPH +0xEE5C 0x7821 #CJK UNIFIED IDEOGRAPH +0xEE5D 0x784E #CJK UNIFIED IDEOGRAPH +0xEE5E 0x7864 #CJK UNIFIED IDEOGRAPH +0xEE5F 0x787A #CJK UNIFIED IDEOGRAPH +0xEE60 0x7930 #CJK UNIFIED IDEOGRAPH +0xEE61 0xFA18 #CJK COMPATIBILITY IDEOGRAPH +0xEE62 0xFA19 #CJK COMPATIBILITY IDEOGRAPH +0xEE63 0xFA1A #CJK COMPATIBILITY IDEOGRAPH +0xEE64 0x7994 #CJK UNIFIED IDEOGRAPH +0xEE65 0xFA1B #CJK COMPATIBILITY IDEOGRAPH +0xEE66 0x799B #CJK UNIFIED IDEOGRAPH +0xEE67 0x7AD1 #CJK UNIFIED IDEOGRAPH +0xEE68 0x7AE7 #CJK UNIFIED IDEOGRAPH +0xEE69 0xFA1C #CJK COMPATIBILITY IDEOGRAPH +0xEE6A 0x7AEB #CJK UNIFIED IDEOGRAPH +0xEE6B 0x7B9E #CJK UNIFIED IDEOGRAPH +0xEE6C 0xFA1D #CJK COMPATIBILITY IDEOGRAPH +0xEE6D 0x7D48 #CJK UNIFIED IDEOGRAPH +0xEE6E 0x7D5C #CJK UNIFIED IDEOGRAPH +0xEE6F 0x7DB7 #CJK UNIFIED IDEOGRAPH +0xEE70 0x7DA0 #CJK UNIFIED IDEOGRAPH +0xEE71 0x7DD6 #CJK UNIFIED IDEOGRAPH +0xEE72 0x7E52 #CJK UNIFIED IDEOGRAPH +0xEE73 0x7F47 #CJK UNIFIED IDEOGRAPH +0xEE74 0x7FA1 #CJK UNIFIED IDEOGRAPH +0xEE75 0xFA1E #CJK COMPATIBILITY IDEOGRAPH +0xEE76 0x8301 #CJK UNIFIED IDEOGRAPH +0xEE77 0x8362 #CJK UNIFIED IDEOGRAPH +0xEE78 0x837F #CJK UNIFIED IDEOGRAPH +0xEE79 0x83C7 #CJK UNIFIED IDEOGRAPH +0xEE7A 0x83F6 #CJK UNIFIED IDEOGRAPH +0xEE7B 0x8448 #CJK UNIFIED IDEOGRAPH +0xEE7C 0x84B4 #CJK UNIFIED IDEOGRAPH +0xEE7D 0x8553 #CJK UNIFIED IDEOGRAPH +0xEE7E 0x8559 #CJK UNIFIED IDEOGRAPH +0xEE80 0x856B #CJK UNIFIED IDEOGRAPH +0xEE81 0xFA1F #CJK COMPATIBILITY IDEOGRAPH +0xEE82 0x85B0 #CJK UNIFIED IDEOGRAPH +0xEE83 0xFA20 #CJK COMPATIBILITY IDEOGRAPH +0xEE84 0xFA21 #CJK COMPATIBILITY IDEOGRAPH +0xEE85 0x8807 #CJK UNIFIED IDEOGRAPH +0xEE86 0x88F5 #CJK UNIFIED IDEOGRAPH +0xEE87 0x8A12 #CJK UNIFIED IDEOGRAPH +0xEE88 0x8A37 #CJK UNIFIED IDEOGRAPH +0xEE89 0x8A79 #CJK UNIFIED IDEOGRAPH +0xEE8A 0x8AA7 #CJK UNIFIED IDEOGRAPH +0xEE8B 0x8ABE #CJK UNIFIED IDEOGRAPH +0xEE8C 0x8ADF #CJK UNIFIED IDEOGRAPH +0xEE8D 0xFA22 #CJK COMPATIBILITY IDEOGRAPH +0xEE8E 0x8AF6 #CJK UNIFIED IDEOGRAPH +0xEE8F 0x8B53 #CJK UNIFIED IDEOGRAPH +0xEE90 0x8B7F #CJK UNIFIED IDEOGRAPH +0xEE91 0x8CF0 #CJK UNIFIED IDEOGRAPH +0xEE92 0x8CF4 #CJK UNIFIED IDEOGRAPH +0xEE93 0x8D12 #CJK UNIFIED IDEOGRAPH +0xEE94 0x8D76 #CJK UNIFIED IDEOGRAPH +0xEE95 0xFA23 #CJK COMPATIBILITY IDEOGRAPH +0xEE96 0x8ECF #CJK UNIFIED IDEOGRAPH +0xEE97 0xFA24 #CJK COMPATIBILITY IDEOGRAPH +0xEE98 0xFA25 #CJK COMPATIBILITY IDEOGRAPH +0xEE99 0x9067 #CJK UNIFIED IDEOGRAPH +0xEE9A 0x90DE #CJK UNIFIED IDEOGRAPH +0xEE9B 0xFA26 #CJK COMPATIBILITY IDEOGRAPH +0xEE9C 0x9115 #CJK UNIFIED IDEOGRAPH +0xEE9D 0x9127 #CJK UNIFIED IDEOGRAPH +0xEE9E 0x91DA #CJK UNIFIED IDEOGRAPH +0xEE9F 0x91D7 #CJK UNIFIED IDEOGRAPH +0xEEA0 0x91DE #CJK UNIFIED IDEOGRAPH +0xEEA1 0x91ED #CJK UNIFIED IDEOGRAPH +0xEEA2 0x91EE #CJK UNIFIED IDEOGRAPH +0xEEA3 0x91E4 #CJK UNIFIED IDEOGRAPH +0xEEA4 0x91E5 #CJK UNIFIED IDEOGRAPH +0xEEA5 0x9206 #CJK UNIFIED IDEOGRAPH +0xEEA6 0x9210 #CJK UNIFIED IDEOGRAPH +0xEEA7 0x920A #CJK UNIFIED IDEOGRAPH +0xEEA8 0x923A #CJK UNIFIED IDEOGRAPH +0xEEA9 0x9240 #CJK UNIFIED IDEOGRAPH +0xEEAA 0x923C #CJK UNIFIED IDEOGRAPH +0xEEAB 0x924E #CJK UNIFIED IDEOGRAPH +0xEEAC 0x9259 #CJK UNIFIED IDEOGRAPH +0xEEAD 0x9251 #CJK UNIFIED IDEOGRAPH +0xEEAE 0x9239 #CJK UNIFIED IDEOGRAPH +0xEEAF 0x9267 #CJK UNIFIED IDEOGRAPH +0xEEB0 0x92A7 #CJK UNIFIED IDEOGRAPH +0xEEB1 0x9277 #CJK UNIFIED IDEOGRAPH +0xEEB2 0x9278 #CJK UNIFIED IDEOGRAPH +0xEEB3 0x92E7 #CJK UNIFIED IDEOGRAPH +0xEEB4 0x92D7 #CJK UNIFIED IDEOGRAPH +0xEEB5 0x92D9 #CJK UNIFIED IDEOGRAPH +0xEEB6 0x92D0 #CJK UNIFIED IDEOGRAPH +0xEEB7 0xFA27 #CJK COMPATIBILITY IDEOGRAPH +0xEEB8 0x92D5 #CJK UNIFIED IDEOGRAPH +0xEEB9 0x92E0 #CJK UNIFIED IDEOGRAPH +0xEEBA 0x92D3 #CJK UNIFIED IDEOGRAPH +0xEEBB 0x9325 #CJK UNIFIED IDEOGRAPH +0xEEBC 0x9321 #CJK UNIFIED IDEOGRAPH +0xEEBD 0x92FB #CJK UNIFIED IDEOGRAPH +0xEEBE 0xFA28 #CJK COMPATIBILITY IDEOGRAPH +0xEEBF 0x931E #CJK UNIFIED IDEOGRAPH +0xEEC0 0x92FF #CJK UNIFIED IDEOGRAPH +0xEEC1 0x931D #CJK UNIFIED IDEOGRAPH +0xEEC2 0x9302 #CJK UNIFIED IDEOGRAPH +0xEEC3 0x9370 #CJK UNIFIED IDEOGRAPH +0xEEC4 0x9357 #CJK UNIFIED IDEOGRAPH +0xEEC5 0x93A4 #CJK UNIFIED IDEOGRAPH +0xEEC6 0x93C6 #CJK UNIFIED IDEOGRAPH +0xEEC7 0x93DE #CJK UNIFIED IDEOGRAPH +0xEEC8 0x93F8 #CJK UNIFIED IDEOGRAPH +0xEEC9 0x9431 #CJK UNIFIED IDEOGRAPH +0xEECA 0x9445 #CJK UNIFIED IDEOGRAPH +0xEECB 0x9448 #CJK UNIFIED IDEOGRAPH +0xEECC 0x9592 #CJK UNIFIED IDEOGRAPH +0xEECD 0xF9DC #CJK COMPATIBILITY IDEOGRAPH +0xEECE 0xFA29 #CJK COMPATIBILITY IDEOGRAPH +0xEECF 0x969D #CJK UNIFIED IDEOGRAPH +0xEED0 0x96AF #CJK UNIFIED IDEOGRAPH +0xEED1 0x9733 #CJK UNIFIED IDEOGRAPH +0xEED2 0x973B #CJK UNIFIED IDEOGRAPH +0xEED3 0x9743 #CJK UNIFIED IDEOGRAPH +0xEED4 0x974D #CJK UNIFIED IDEOGRAPH +0xEED5 0x974F #CJK UNIFIED IDEOGRAPH +0xEED6 0x9751 #CJK UNIFIED IDEOGRAPH +0xEED7 0x9755 #CJK UNIFIED IDEOGRAPH +0xEED8 0x9857 #CJK UNIFIED IDEOGRAPH +0xEED9 0x9865 #CJK UNIFIED IDEOGRAPH +0xEEDA 0xFA2A #CJK COMPATIBILITY IDEOGRAPH +0xEEDB 0xFA2B #CJK COMPATIBILITY IDEOGRAPH +0xEEDC 0x9927 #CJK UNIFIED IDEOGRAPH +0xEEDD 0xFA2C #CJK COMPATIBILITY IDEOGRAPH +0xEEDE 0x999E #CJK UNIFIED IDEOGRAPH +0xEEDF 0x9A4E #CJK UNIFIED IDEOGRAPH +0xEEE0 0x9AD9 #CJK UNIFIED IDEOGRAPH +0xEEE1 0x9ADC #CJK UNIFIED IDEOGRAPH +0xEEE2 0x9B75 #CJK UNIFIED IDEOGRAPH +0xEEE3 0x9B72 #CJK UNIFIED IDEOGRAPH +0xEEE4 0x9B8F #CJK UNIFIED IDEOGRAPH +0xEEE5 0x9BB1 #CJK UNIFIED IDEOGRAPH +0xEEE6 0x9BBB #CJK UNIFIED IDEOGRAPH +0xEEE7 0x9C00 #CJK UNIFIED IDEOGRAPH +0xEEE8 0x9D70 #CJK UNIFIED IDEOGRAPH +0xEEE9 0x9D6B #CJK UNIFIED IDEOGRAPH +0xEEEA 0xFA2D #CJK COMPATIBILITY IDEOGRAPH +0xEEEB 0x9E19 #CJK UNIFIED IDEOGRAPH +0xEEEC 0x9ED1 #CJK UNIFIED IDEOGRAPH +0xEEEF 0x2170 #SMALL ROMAN NUMERAL ONE +0xEEF0 0x2171 #SMALL ROMAN NUMERAL TWO +0xEEF1 0x2172 #SMALL ROMAN NUMERAL THREE +0xEEF2 0x2173 #SMALL ROMAN NUMERAL FOUR +0xEEF3 0x2174 #SMALL ROMAN NUMERAL FIVE +0xEEF4 0x2175 #SMALL ROMAN NUMERAL SIX +0xEEF5 0x2176 #SMALL ROMAN NUMERAL SEVEN +0xEEF6 0x2177 #SMALL ROMAN NUMERAL EIGHT +0xEEF7 0x2178 #SMALL ROMAN NUMERAL NINE +0xEEF8 0x2179 #SMALL ROMAN NUMERAL TEN +0xEEF9 0xFFE2 #FULLWIDTH NOT SIGN +0xEEFA 0xFFE4 #FULLWIDTH BROKEN BAR +0xEEFB 0xFF07 #FULLWIDTH APOSTROPHE +0xEEFC 0xFF02 #FULLWIDTH QUOTATION MARK +0xFA40 0x2170 #SMALL ROMAN NUMERAL ONE +0xFA41 0x2171 #SMALL ROMAN NUMERAL TWO +0xFA42 0x2172 #SMALL ROMAN NUMERAL THREE +0xFA43 0x2173 #SMALL ROMAN NUMERAL FOUR +0xFA44 0x2174 #SMALL ROMAN NUMERAL FIVE +0xFA45 0x2175 #SMALL ROMAN NUMERAL SIX +0xFA46 0x2176 #SMALL ROMAN NUMERAL SEVEN +0xFA47 0x2177 #SMALL ROMAN NUMERAL EIGHT +0xFA48 0x2178 #SMALL ROMAN NUMERAL NINE +0xFA49 0x2179 #SMALL ROMAN NUMERAL TEN +0xFA4A 0x2160 #ROMAN NUMERAL ONE +0xFA4B 0x2161 #ROMAN NUMERAL TWO +0xFA4C 0x2162 #ROMAN NUMERAL THREE +0xFA4D 0x2163 #ROMAN NUMERAL FOUR +0xFA4E 0x2164 #ROMAN NUMERAL FIVE +0xFA4F 0x2165 #ROMAN NUMERAL SIX +0xFA50 0x2166 #ROMAN NUMERAL SEVEN +0xFA51 0x2167 #ROMAN NUMERAL EIGHT +0xFA52 0x2168 #ROMAN NUMERAL NINE +0xFA53 0x2169 #ROMAN NUMERAL TEN +0xFA54 0xFFE2 #FULLWIDTH NOT SIGN +0xFA55 0xFFE4 #FULLWIDTH BROKEN BAR +0xFA56 0xFF07 #FULLWIDTH APOSTROPHE +0xFA57 0xFF02 #FULLWIDTH QUOTATION MARK +0xFA58 0x3231 #PARENTHESIZED IDEOGRAPH STOCK +0xFA59 0x2116 #NUMERO SIGN +0xFA5A 0x2121 #TELEPHONE SIGN +0xFA5B 0x2235 #BECAUSE +0xFA5C 0x7E8A #CJK UNIFIED IDEOGRAPH +0xFA5D 0x891C #CJK UNIFIED IDEOGRAPH +0xFA5E 0x9348 #CJK UNIFIED IDEOGRAPH +0xFA5F 0x9288 #CJK UNIFIED IDEOGRAPH +0xFA60 0x84DC #CJK UNIFIED IDEOGRAPH +0xFA61 0x4FC9 #CJK UNIFIED IDEOGRAPH +0xFA62 0x70BB #CJK UNIFIED IDEOGRAPH +0xFA63 0x6631 #CJK UNIFIED IDEOGRAPH +0xFA64 0x68C8 #CJK UNIFIED IDEOGRAPH +0xFA65 0x92F9 #CJK UNIFIED IDEOGRAPH +0xFA66 0x66FB #CJK UNIFIED IDEOGRAPH +0xFA67 0x5F45 #CJK UNIFIED IDEOGRAPH +0xFA68 0x4E28 #CJK UNIFIED IDEOGRAPH +0xFA69 0x4EE1 #CJK UNIFIED IDEOGRAPH +0xFA6A 0x4EFC #CJK UNIFIED IDEOGRAPH +0xFA6B 0x4F00 #CJK UNIFIED IDEOGRAPH +0xFA6C 0x4F03 #CJK UNIFIED IDEOGRAPH +0xFA6D 0x4F39 #CJK UNIFIED IDEOGRAPH +0xFA6E 0x4F56 #CJK UNIFIED IDEOGRAPH +0xFA6F 0x4F92 #CJK UNIFIED IDEOGRAPH +0xFA70 0x4F8A #CJK UNIFIED IDEOGRAPH +0xFA71 0x4F9A #CJK UNIFIED IDEOGRAPH +0xFA72 0x4F94 #CJK UNIFIED IDEOGRAPH +0xFA73 0x4FCD #CJK UNIFIED IDEOGRAPH +0xFA74 0x5040 #CJK UNIFIED IDEOGRAPH +0xFA75 0x5022 #CJK UNIFIED IDEOGRAPH +0xFA76 0x4FFF #CJK UNIFIED IDEOGRAPH +0xFA77 0x501E #CJK UNIFIED IDEOGRAPH +0xFA78 0x5046 #CJK UNIFIED IDEOGRAPH +0xFA79 0x5070 #CJK UNIFIED IDEOGRAPH +0xFA7A 0x5042 #CJK UNIFIED IDEOGRAPH +0xFA7B 0x5094 #CJK UNIFIED IDEOGRAPH +0xFA7C 0x50F4 #CJK UNIFIED IDEOGRAPH +0xFA7D 0x50D8 #CJK UNIFIED IDEOGRAPH +0xFA7E 0x514A #CJK UNIFIED IDEOGRAPH +0xFA80 0x5164 #CJK UNIFIED IDEOGRAPH +0xFA81 0x519D #CJK UNIFIED IDEOGRAPH +0xFA82 0x51BE #CJK UNIFIED IDEOGRAPH +0xFA83 0x51EC #CJK UNIFIED IDEOGRAPH +0xFA84 0x5215 #CJK UNIFIED IDEOGRAPH +0xFA85 0x529C #CJK UNIFIED IDEOGRAPH +0xFA86 0x52A6 #CJK UNIFIED IDEOGRAPH +0xFA87 0x52C0 #CJK UNIFIED IDEOGRAPH +0xFA88 0x52DB #CJK UNIFIED IDEOGRAPH +0xFA89 0x5300 #CJK UNIFIED IDEOGRAPH +0xFA8A 0x5307 #CJK UNIFIED IDEOGRAPH +0xFA8B 0x5324 #CJK UNIFIED IDEOGRAPH +0xFA8C 0x5372 #CJK UNIFIED IDEOGRAPH +0xFA8D 0x5393 #CJK UNIFIED IDEOGRAPH +0xFA8E 0x53B2 #CJK UNIFIED IDEOGRAPH +0xFA8F 0x53DD #CJK UNIFIED IDEOGRAPH +0xFA90 0xFA0E #CJK COMPATIBILITY IDEOGRAPH +0xFA91 0x549C #CJK UNIFIED IDEOGRAPH +0xFA92 0x548A #CJK UNIFIED IDEOGRAPH +0xFA93 0x54A9 #CJK UNIFIED IDEOGRAPH +0xFA94 0x54FF #CJK UNIFIED IDEOGRAPH +0xFA95 0x5586 #CJK UNIFIED IDEOGRAPH +0xFA96 0x5759 #CJK UNIFIED IDEOGRAPH +0xFA97 0x5765 #CJK UNIFIED IDEOGRAPH +0xFA98 0x57AC #CJK UNIFIED IDEOGRAPH +0xFA99 0x57C8 #CJK UNIFIED IDEOGRAPH +0xFA9A 0x57C7 #CJK UNIFIED IDEOGRAPH +0xFA9B 0xFA0F #CJK COMPATIBILITY IDEOGRAPH +0xFA9C 0xFA10 #CJK COMPATIBILITY IDEOGRAPH +0xFA9D 0x589E #CJK UNIFIED IDEOGRAPH +0xFA9E 0x58B2 #CJK UNIFIED IDEOGRAPH +0xFA9F 0x590B #CJK UNIFIED IDEOGRAPH +0xFAA0 0x5953 #CJK UNIFIED IDEOGRAPH +0xFAA1 0x595B #CJK UNIFIED IDEOGRAPH +0xFAA2 0x595D #CJK UNIFIED IDEOGRAPH +0xFAA3 0x5963 #CJK UNIFIED IDEOGRAPH +0xFAA4 0x59A4 #CJK UNIFIED IDEOGRAPH +0xFAA5 0x59BA #CJK UNIFIED IDEOGRAPH +0xFAA6 0x5B56 #CJK UNIFIED IDEOGRAPH +0xFAA7 0x5BC0 #CJK UNIFIED IDEOGRAPH +0xFAA8 0x752F #CJK UNIFIED IDEOGRAPH +0xFAA9 0x5BD8 #CJK UNIFIED IDEOGRAPH +0xFAAA 0x5BEC #CJK UNIFIED IDEOGRAPH +0xFAAB 0x5C1E #CJK UNIFIED IDEOGRAPH +0xFAAC 0x5CA6 #CJK UNIFIED IDEOGRAPH +0xFAAD 0x5CBA #CJK UNIFIED IDEOGRAPH +0xFAAE 0x5CF5 #CJK UNIFIED IDEOGRAPH +0xFAAF 0x5D27 #CJK UNIFIED IDEOGRAPH +0xFAB0 0x5D53 #CJK UNIFIED IDEOGRAPH +0xFAB1 0xFA11 #CJK COMPATIBILITY IDEOGRAPH +0xFAB2 0x5D42 #CJK UNIFIED IDEOGRAPH +0xFAB3 0x5D6D #CJK UNIFIED IDEOGRAPH +0xFAB4 0x5DB8 #CJK UNIFIED IDEOGRAPH +0xFAB5 0x5DB9 #CJK UNIFIED IDEOGRAPH +0xFAB6 0x5DD0 #CJK UNIFIED IDEOGRAPH +0xFAB7 0x5F21 #CJK UNIFIED IDEOGRAPH +0xFAB8 0x5F34 #CJK UNIFIED IDEOGRAPH +0xFAB9 0x5F67 #CJK UNIFIED IDEOGRAPH +0xFABA 0x5FB7 #CJK UNIFIED IDEOGRAPH +0xFABB 0x5FDE #CJK UNIFIED IDEOGRAPH +0xFABC 0x605D #CJK UNIFIED IDEOGRAPH +0xFABD 0x6085 #CJK UNIFIED IDEOGRAPH +0xFABE 0x608A #CJK UNIFIED IDEOGRAPH +0xFABF 0x60DE #CJK UNIFIED IDEOGRAPH +0xFAC0 0x60D5 #CJK UNIFIED IDEOGRAPH +0xFAC1 0x6120 #CJK UNIFIED IDEOGRAPH +0xFAC2 0x60F2 #CJK UNIFIED IDEOGRAPH +0xFAC3 0x6111 #CJK UNIFIED IDEOGRAPH +0xFAC4 0x6137 #CJK UNIFIED IDEOGRAPH +0xFAC5 0x6130 #CJK UNIFIED IDEOGRAPH +0xFAC6 0x6198 #CJK UNIFIED IDEOGRAPH +0xFAC7 0x6213 #CJK UNIFIED IDEOGRAPH +0xFAC8 0x62A6 #CJK UNIFIED IDEOGRAPH +0xFAC9 0x63F5 #CJK UNIFIED IDEOGRAPH +0xFACA 0x6460 #CJK UNIFIED IDEOGRAPH +0xFACB 0x649D #CJK UNIFIED IDEOGRAPH +0xFACC 0x64CE #CJK UNIFIED IDEOGRAPH +0xFACD 0x654E #CJK UNIFIED IDEOGRAPH +0xFACE 0x6600 #CJK UNIFIED IDEOGRAPH +0xFACF 0x6615 #CJK UNIFIED IDEOGRAPH +0xFAD0 0x663B #CJK UNIFIED IDEOGRAPH +0xFAD1 0x6609 #CJK UNIFIED IDEOGRAPH +0xFAD2 0x662E #CJK UNIFIED IDEOGRAPH +0xFAD3 0x661E #CJK UNIFIED IDEOGRAPH +0xFAD4 0x6624 #CJK UNIFIED IDEOGRAPH +0xFAD5 0x6665 #CJK UNIFIED IDEOGRAPH +0xFAD6 0x6657 #CJK UNIFIED IDEOGRAPH +0xFAD7 0x6659 #CJK UNIFIED IDEOGRAPH +0xFAD8 0xFA12 #CJK COMPATIBILITY IDEOGRAPH +0xFAD9 0x6673 #CJK UNIFIED IDEOGRAPH +0xFADA 0x6699 #CJK UNIFIED IDEOGRAPH +0xFADB 0x66A0 #CJK UNIFIED IDEOGRAPH +0xFADC 0x66B2 #CJK UNIFIED IDEOGRAPH +0xFADD 0x66BF #CJK UNIFIED IDEOGRAPH +0xFADE 0x66FA #CJK UNIFIED IDEOGRAPH +0xFADF 0x670E #CJK UNIFIED IDEOGRAPH +0xFAE0 0xF929 #CJK COMPATIBILITY IDEOGRAPH +0xFAE1 0x6766 #CJK UNIFIED IDEOGRAPH +0xFAE2 0x67BB #CJK UNIFIED IDEOGRAPH +0xFAE3 0x6852 #CJK UNIFIED IDEOGRAPH +0xFAE4 0x67C0 #CJK UNIFIED IDEOGRAPH +0xFAE5 0x6801 #CJK UNIFIED IDEOGRAPH +0xFAE6 0x6844 #CJK UNIFIED IDEOGRAPH +0xFAE7 0x68CF #CJK UNIFIED IDEOGRAPH +0xFAE8 0xFA13 #CJK COMPATIBILITY IDEOGRAPH +0xFAE9 0x6968 #CJK UNIFIED IDEOGRAPH +0xFAEA 0xFA14 #CJK COMPATIBILITY IDEOGRAPH +0xFAEB 0x6998 #CJK UNIFIED IDEOGRAPH +0xFAEC 0x69E2 #CJK UNIFIED IDEOGRAPH +0xFAED 0x6A30 #CJK UNIFIED IDEOGRAPH +0xFAEE 0x6A6B #CJK UNIFIED IDEOGRAPH +0xFAEF 0x6A46 #CJK UNIFIED IDEOGRAPH +0xFAF0 0x6A73 #CJK UNIFIED IDEOGRAPH +0xFAF1 0x6A7E #CJK UNIFIED IDEOGRAPH +0xFAF2 0x6AE2 #CJK UNIFIED IDEOGRAPH +0xFAF3 0x6AE4 #CJK UNIFIED IDEOGRAPH +0xFAF4 0x6BD6 #CJK UNIFIED IDEOGRAPH +0xFAF5 0x6C3F #CJK UNIFIED IDEOGRAPH +0xFAF6 0x6C5C #CJK UNIFIED IDEOGRAPH +0xFAF7 0x6C86 #CJK UNIFIED IDEOGRAPH +0xFAF8 0x6C6F #CJK UNIFIED IDEOGRAPH +0xFAF9 0x6CDA #CJK UNIFIED IDEOGRAPH +0xFAFA 0x6D04 #CJK UNIFIED IDEOGRAPH +0xFAFB 0x6D87 #CJK UNIFIED IDEOGRAPH +0xFAFC 0x6D6F #CJK UNIFIED IDEOGRAPH +0xFB40 0x6D96 #CJK UNIFIED IDEOGRAPH +0xFB41 0x6DAC #CJK UNIFIED IDEOGRAPH +0xFB42 0x6DCF #CJK UNIFIED IDEOGRAPH +0xFB43 0x6DF8 #CJK UNIFIED IDEOGRAPH +0xFB44 0x6DF2 #CJK UNIFIED IDEOGRAPH +0xFB45 0x6DFC #CJK UNIFIED IDEOGRAPH +0xFB46 0x6E39 #CJK UNIFIED IDEOGRAPH +0xFB47 0x6E5C #CJK UNIFIED IDEOGRAPH +0xFB48 0x6E27 #CJK UNIFIED IDEOGRAPH +0xFB49 0x6E3C #CJK UNIFIED IDEOGRAPH +0xFB4A 0x6EBF #CJK UNIFIED IDEOGRAPH +0xFB4B 0x6F88 #CJK UNIFIED IDEOGRAPH +0xFB4C 0x6FB5 #CJK UNIFIED IDEOGRAPH +0xFB4D 0x6FF5 #CJK UNIFIED IDEOGRAPH +0xFB4E 0x7005 #CJK UNIFIED IDEOGRAPH +0xFB4F 0x7007 #CJK UNIFIED IDEOGRAPH +0xFB50 0x7028 #CJK UNIFIED IDEOGRAPH +0xFB51 0x7085 #CJK UNIFIED IDEOGRAPH +0xFB52 0x70AB #CJK UNIFIED IDEOGRAPH +0xFB53 0x710F #CJK UNIFIED IDEOGRAPH +0xFB54 0x7104 #CJK UNIFIED IDEOGRAPH +0xFB55 0x715C #CJK UNIFIED IDEOGRAPH +0xFB56 0x7146 #CJK UNIFIED IDEOGRAPH +0xFB57 0x7147 #CJK UNIFIED IDEOGRAPH +0xFB58 0xFA15 #CJK COMPATIBILITY IDEOGRAPH +0xFB59 0x71C1 #CJK UNIFIED IDEOGRAPH +0xFB5A 0x71FE #CJK UNIFIED IDEOGRAPH +0xFB5B 0x72B1 #CJK UNIFIED IDEOGRAPH +0xFB5C 0x72BE #CJK UNIFIED IDEOGRAPH +0xFB5D 0x7324 #CJK UNIFIED IDEOGRAPH +0xFB5E 0xFA16 #CJK COMPATIBILITY IDEOGRAPH +0xFB5F 0x7377 #CJK UNIFIED IDEOGRAPH +0xFB60 0x73BD #CJK UNIFIED IDEOGRAPH +0xFB61 0x73C9 #CJK UNIFIED IDEOGRAPH +0xFB62 0x73D6 #CJK UNIFIED IDEOGRAPH +0xFB63 0x73E3 #CJK UNIFIED IDEOGRAPH +0xFB64 0x73D2 #CJK UNIFIED IDEOGRAPH +0xFB65 0x7407 #CJK UNIFIED IDEOGRAPH +0xFB66 0x73F5 #CJK UNIFIED IDEOGRAPH +0xFB67 0x7426 #CJK UNIFIED IDEOGRAPH +0xFB68 0x742A #CJK UNIFIED IDEOGRAPH +0xFB69 0x7429 #CJK UNIFIED IDEOGRAPH +0xFB6A 0x742E #CJK UNIFIED IDEOGRAPH +0xFB6B 0x7462 #CJK UNIFIED IDEOGRAPH +0xFB6C 0x7489 #CJK UNIFIED IDEOGRAPH +0xFB6D 0x749F #CJK UNIFIED IDEOGRAPH +0xFB6E 0x7501 #CJK UNIFIED IDEOGRAPH +0xFB6F 0x756F #CJK UNIFIED IDEOGRAPH +0xFB70 0x7682 #CJK UNIFIED IDEOGRAPH +0xFB71 0x769C #CJK UNIFIED IDEOGRAPH +0xFB72 0x769E #CJK UNIFIED IDEOGRAPH +0xFB73 0x769B #CJK UNIFIED IDEOGRAPH +0xFB74 0x76A6 #CJK UNIFIED IDEOGRAPH +0xFB75 0xFA17 #CJK COMPATIBILITY IDEOGRAPH +0xFB76 0x7746 #CJK UNIFIED IDEOGRAPH +0xFB77 0x52AF #CJK UNIFIED IDEOGRAPH +0xFB78 0x7821 #CJK UNIFIED IDEOGRAPH +0xFB79 0x784E #CJK UNIFIED IDEOGRAPH +0xFB7A 0x7864 #CJK UNIFIED IDEOGRAPH +0xFB7B 0x787A #CJK UNIFIED IDEOGRAPH +0xFB7C 0x7930 #CJK UNIFIED IDEOGRAPH +0xFB7D 0xFA18 #CJK COMPATIBILITY IDEOGRAPH +0xFB7E 0xFA19 #CJK COMPATIBILITY IDEOGRAPH +0xFB80 0xFA1A #CJK COMPATIBILITY IDEOGRAPH +0xFB81 0x7994 #CJK UNIFIED IDEOGRAPH +0xFB82 0xFA1B #CJK COMPATIBILITY IDEOGRAPH +0xFB83 0x799B #CJK UNIFIED IDEOGRAPH +0xFB84 0x7AD1 #CJK UNIFIED IDEOGRAPH +0xFB85 0x7AE7 #CJK UNIFIED IDEOGRAPH +0xFB86 0xFA1C #CJK COMPATIBILITY IDEOGRAPH +0xFB87 0x7AEB #CJK UNIFIED IDEOGRAPH +0xFB88 0x7B9E #CJK UNIFIED IDEOGRAPH +0xFB89 0xFA1D #CJK COMPATIBILITY IDEOGRAPH +0xFB8A 0x7D48 #CJK UNIFIED IDEOGRAPH +0xFB8B 0x7D5C #CJK UNIFIED IDEOGRAPH +0xFB8C 0x7DB7 #CJK UNIFIED IDEOGRAPH +0xFB8D 0x7DA0 #CJK UNIFIED IDEOGRAPH +0xFB8E 0x7DD6 #CJK UNIFIED IDEOGRAPH +0xFB8F 0x7E52 #CJK UNIFIED IDEOGRAPH +0xFB90 0x7F47 #CJK UNIFIED IDEOGRAPH +0xFB91 0x7FA1 #CJK UNIFIED IDEOGRAPH +0xFB92 0xFA1E #CJK COMPATIBILITY IDEOGRAPH +0xFB93 0x8301 #CJK UNIFIED IDEOGRAPH +0xFB94 0x8362 #CJK UNIFIED IDEOGRAPH +0xFB95 0x837F #CJK UNIFIED IDEOGRAPH +0xFB96 0x83C7 #CJK UNIFIED IDEOGRAPH +0xFB97 0x83F6 #CJK UNIFIED IDEOGRAPH +0xFB98 0x8448 #CJK UNIFIED IDEOGRAPH +0xFB99 0x84B4 #CJK UNIFIED IDEOGRAPH +0xFB9A 0x8553 #CJK UNIFIED IDEOGRAPH +0xFB9B 0x8559 #CJK UNIFIED IDEOGRAPH +0xFB9C 0x856B #CJK UNIFIED IDEOGRAPH +0xFB9D 0xFA1F #CJK COMPATIBILITY IDEOGRAPH +0xFB9E 0x85B0 #CJK UNIFIED IDEOGRAPH +0xFB9F 0xFA20 #CJK COMPATIBILITY IDEOGRAPH +0xFBA0 0xFA21 #CJK COMPATIBILITY IDEOGRAPH +0xFBA1 0x8807 #CJK UNIFIED IDEOGRAPH +0xFBA2 0x88F5 #CJK UNIFIED IDEOGRAPH +0xFBA3 0x8A12 #CJK UNIFIED IDEOGRAPH +0xFBA4 0x8A37 #CJK UNIFIED IDEOGRAPH +0xFBA5 0x8A79 #CJK UNIFIED IDEOGRAPH +0xFBA6 0x8AA7 #CJK UNIFIED IDEOGRAPH +0xFBA7 0x8ABE #CJK UNIFIED IDEOGRAPH +0xFBA8 0x8ADF #CJK UNIFIED IDEOGRAPH +0xFBA9 0xFA22 #CJK COMPATIBILITY IDEOGRAPH +0xFBAA 0x8AF6 #CJK UNIFIED IDEOGRAPH +0xFBAB 0x8B53 #CJK UNIFIED IDEOGRAPH +0xFBAC 0x8B7F #CJK UNIFIED IDEOGRAPH +0xFBAD 0x8CF0 #CJK UNIFIED IDEOGRAPH +0xFBAE 0x8CF4 #CJK UNIFIED IDEOGRAPH +0xFBAF 0x8D12 #CJK UNIFIED IDEOGRAPH +0xFBB0 0x8D76 #CJK UNIFIED IDEOGRAPH +0xFBB1 0xFA23 #CJK COMPATIBILITY IDEOGRAPH +0xFBB2 0x8ECF #CJK UNIFIED IDEOGRAPH +0xFBB3 0xFA24 #CJK COMPATIBILITY IDEOGRAPH +0xFBB4 0xFA25 #CJK COMPATIBILITY IDEOGRAPH +0xFBB5 0x9067 #CJK UNIFIED IDEOGRAPH +0xFBB6 0x90DE #CJK UNIFIED IDEOGRAPH +0xFBB7 0xFA26 #CJK COMPATIBILITY IDEOGRAPH +0xFBB8 0x9115 #CJK UNIFIED IDEOGRAPH +0xFBB9 0x9127 #CJK UNIFIED IDEOGRAPH +0xFBBA 0x91DA #CJK UNIFIED IDEOGRAPH +0xFBBB 0x91D7 #CJK UNIFIED IDEOGRAPH +0xFBBC 0x91DE #CJK UNIFIED IDEOGRAPH +0xFBBD 0x91ED #CJK UNIFIED IDEOGRAPH +0xFBBE 0x91EE #CJK UNIFIED IDEOGRAPH +0xFBBF 0x91E4 #CJK UNIFIED IDEOGRAPH +0xFBC0 0x91E5 #CJK UNIFIED IDEOGRAPH +0xFBC1 0x9206 #CJK UNIFIED IDEOGRAPH +0xFBC2 0x9210 #CJK UNIFIED IDEOGRAPH +0xFBC3 0x920A #CJK UNIFIED IDEOGRAPH +0xFBC4 0x923A #CJK UNIFIED IDEOGRAPH +0xFBC5 0x9240 #CJK UNIFIED IDEOGRAPH +0xFBC6 0x923C #CJK UNIFIED IDEOGRAPH +0xFBC7 0x924E #CJK UNIFIED IDEOGRAPH +0xFBC8 0x9259 #CJK UNIFIED IDEOGRAPH +0xFBC9 0x9251 #CJK UNIFIED IDEOGRAPH +0xFBCA 0x9239 #CJK UNIFIED IDEOGRAPH +0xFBCB 0x9267 #CJK UNIFIED IDEOGRAPH +0xFBCC 0x92A7 #CJK UNIFIED IDEOGRAPH +0xFBCD 0x9277 #CJK UNIFIED IDEOGRAPH +0xFBCE 0x9278 #CJK UNIFIED IDEOGRAPH +0xFBCF 0x92E7 #CJK UNIFIED IDEOGRAPH +0xFBD0 0x92D7 #CJK UNIFIED IDEOGRAPH +0xFBD1 0x92D9 #CJK UNIFIED IDEOGRAPH +0xFBD2 0x92D0 #CJK UNIFIED IDEOGRAPH +0xFBD3 0xFA27 #CJK COMPATIBILITY IDEOGRAPH +0xFBD4 0x92D5 #CJK UNIFIED IDEOGRAPH +0xFBD5 0x92E0 #CJK UNIFIED IDEOGRAPH +0xFBD6 0x92D3 #CJK UNIFIED IDEOGRAPH +0xFBD7 0x9325 #CJK UNIFIED IDEOGRAPH +0xFBD8 0x9321 #CJK UNIFIED IDEOGRAPH +0xFBD9 0x92FB #CJK UNIFIED IDEOGRAPH +0xFBDA 0xFA28 #CJK COMPATIBILITY IDEOGRAPH +0xFBDB 0x931E #CJK UNIFIED IDEOGRAPH +0xFBDC 0x92FF #CJK UNIFIED IDEOGRAPH +0xFBDD 0x931D #CJK UNIFIED IDEOGRAPH +0xFBDE 0x9302 #CJK UNIFIED IDEOGRAPH +0xFBDF 0x9370 #CJK UNIFIED IDEOGRAPH +0xFBE0 0x9357 #CJK UNIFIED IDEOGRAPH +0xFBE1 0x93A4 #CJK UNIFIED IDEOGRAPH +0xFBE2 0x93C6 #CJK UNIFIED IDEOGRAPH +0xFBE3 0x93DE #CJK UNIFIED IDEOGRAPH +0xFBE4 0x93F8 #CJK UNIFIED IDEOGRAPH +0xFBE5 0x9431 #CJK UNIFIED IDEOGRAPH +0xFBE6 0x9445 #CJK UNIFIED IDEOGRAPH +0xFBE7 0x9448 #CJK UNIFIED IDEOGRAPH +0xFBE8 0x9592 #CJK UNIFIED IDEOGRAPH +0xFBE9 0xF9DC #CJK COMPATIBILITY IDEOGRAPH +0xFBEA 0xFA29 #CJK COMPATIBILITY IDEOGRAPH +0xFBEB 0x969D #CJK UNIFIED IDEOGRAPH +0xFBEC 0x96AF #CJK UNIFIED IDEOGRAPH +0xFBED 0x9733 #CJK UNIFIED IDEOGRAPH +0xFBEE 0x973B #CJK UNIFIED IDEOGRAPH +0xFBEF 0x9743 #CJK UNIFIED IDEOGRAPH +0xFBF0 0x974D #CJK UNIFIED IDEOGRAPH +0xFBF1 0x974F #CJK UNIFIED IDEOGRAPH +0xFBF2 0x9751 #CJK UNIFIED IDEOGRAPH +0xFBF3 0x9755 #CJK UNIFIED IDEOGRAPH +0xFBF4 0x9857 #CJK UNIFIED IDEOGRAPH +0xFBF5 0x9865 #CJK UNIFIED IDEOGRAPH +0xFBF6 0xFA2A #CJK COMPATIBILITY IDEOGRAPH +0xFBF7 0xFA2B #CJK COMPATIBILITY IDEOGRAPH +0xFBF8 0x9927 #CJK UNIFIED IDEOGRAPH +0xFBF9 0xFA2C #CJK COMPATIBILITY IDEOGRAPH +0xFBFA 0x999E #CJK UNIFIED IDEOGRAPH +0xFBFB 0x9A4E #CJK UNIFIED IDEOGRAPH +0xFBFC 0x9AD9 #CJK UNIFIED IDEOGRAPH +0xFC40 0x9ADC #CJK UNIFIED IDEOGRAPH +0xFC41 0x9B75 #CJK UNIFIED IDEOGRAPH +0xFC42 0x9B72 #CJK UNIFIED IDEOGRAPH +0xFC43 0x9B8F #CJK UNIFIED IDEOGRAPH +0xFC44 0x9BB1 #CJK UNIFIED IDEOGRAPH +0xFC45 0x9BBB #CJK UNIFIED IDEOGRAPH +0xFC46 0x9C00 #CJK UNIFIED IDEOGRAPH +0xFC47 0x9D70 #CJK UNIFIED IDEOGRAPH +0xFC48 0x9D6B #CJK UNIFIED IDEOGRAPH +0xFC49 0xFA2D #CJK COMPATIBILITY IDEOGRAPH +0xFC4A 0x9E19 #CJK UNIFIED IDEOGRAPH +0xFC4B 0x9ED1 #CJK UNIFIED IDEOGRAPH diff --git a/lib/unicode.nim b/lib/unicode.nim index de3b80c94..e6665fbe2 100644 --- a/lib/unicode.nim +++ b/lib/unicode.nim @@ -7,6 +7,8 @@ # distribution, for details about the copyright. # +## This module provides a way to handle various Unicode (or other) encodings. + type TUniChar* = int32 ## type that can hold any Unicode character TUniChar16* = int16 ## 16 bit Unicode character @@ -17,19 +19,15 @@ proc uniCharLen*(s: string): int = ## returns the number of Unicode characters of the string `s`. var i = 0 while i < len(s): - if ord(s[i]) <= 127: - inc(i) - elif ord(s[i]) shr 5 == 0b110: - inc(i, 2) - elif ord(s[i]) shr 4 == 0b1110: - inc(i, 3) - elif ord(s[i]) shr 3 == 0b11110: - inc(i, 4) - else: - assert(false) + if ord(s[i]) <= 127: inc(i) + elif ord(s[i]) shr 5 == 0b110: inc(i, 2) + elif ord(s[i]) shr 4 == 0b1110: inc(i, 3) + elif ord(s[i]) shr 3 == 0b11110: inc(i, 4) + else: assert(false) inc(result) proc uniCharAt*(s: string, i: int): TUniChar = + ## returns the unicode character in `s` at byte index `i` if ord(s[i]) <= 127: result = ord(s[i]) elif ord(s[i]) shr 5 == 0b110: @@ -53,8 +51,7 @@ proc uniCharAt*(s: string, i: int): TUniChar = assert(false) iterator unichars*(s: string): TUniChar = - ## iterates over any unicode character of the string `s`. Fastest possible - ## method. + ## iterates over any unicode character of the string `s`. var i = 0 result: TUniChar @@ -79,6 +76,59 @@ iterator unichars*(s: string): TUniChar = else: assert(false) yield result + +type + TCharacterSet = enum + cs8859_1, cs8859_2 + +const + characterSetToName: array [TCharacterSet, string] = [ + "ISO/IEC 8859-1:1998", + "ISO 8859-2:1999", + "", + "" + ] + + cs8859_2toUnicode: array [0xA1..0xff, TUniChar16] = [ + 0x0104'i16, 0x02D8'i16, 0x0141'i16, 0x00A4'i16, 0x013D'i16, 0x015A'i16, + 0x00A7'i16, 0x00A8'i16, 0x0160'i16, 0x015E'i16, 0x0164'i16, 0x0179'i16, + 0x00AD'i16, 0x017D'i16, 0x017B'i16, 0x00B0'i16, 0x0105'i16, 0x02DB'i16, + 0x0142'i16, 0x00B4'i16, 0x013E'i16, 0x015B'i16, 0x02C7'i16, 0x00B8'i16, + 0x0161'i16, 0x015F'i16, 0x0165'i16, 0x017A'i16, 0x02DD'i16, 0x017E'i16, + 0x017C'i16, 0x0154'i16, 0x00C1'i16, 0x00C2'i16, 0x0102'i16, 0x00C4'i16, + 0x0139'i16, 0x0106'i16, 0x00C7'i16, 0x010C'i16, 0x00C9'i16, 0x0118'i16, + 0x00CB'i16, 0x011A'i16, 0x00CD'i16, 0x00CE'i16, 0x010E'i16, 0x0110'i16, + 0x0143'i16, 0x0147'i16, 0x00D3'i16, 0x00D4'i16, 0x0150'i16, 0x00D6'i16, + 0x00D7'i16, 0x0158'i16, 0x016E'i16, 0x00DA'i16, 0x0170'i16, 0x00DC'i16, + 0x00DD'i16, 0x0162'i16, 0x00DF'i16, 0x0155'i16, 0x00E1'i16, 0x00E2'i16, + 0x0103'i16, 0x00E4'i16, 0x013A'i16, 0x0107'i16, 0x00E7'i16, 0x010D'i16, + 0x00E9'i16, 0x0119'i16, 0x00EB'i16, 0x011B'i16, 0x00ED'i16, 0x00EE'i16, + 0x010F'i16, 0x0111'i16, 0x0144'i16, 0x0148'i16, 0x00F3'i16, 0x00F4'i16, + 0x0151'i16, 0x00F6'i16, 0x00F7'i16, 0x0159'i16, 0x016F'i16, 0x00FA'i16, + 0x0171'i16, 0x00FC'i16, 0x00FD'i16, 0x0163'i16, 0x02D9'i16] + +proc searchTable(tab: openarray[TUniChar16], u: TUniChar16): int8 = + var idx = find(tab, u) + assert(idx > 0) + result = toU8(idx) + +proc csToUnicode(cs: TCharacterSet, c: int8): TUniChar16 = + case cs + of cs8859_1: result = ze16(c) # no table lookup necessary + of cs8859_2: + if c <=% 0xA0'i8: + result = ze16(c) + else: + result = cs8859_2toUnicode[ze(c)] + +proc unicodeToCS(cs: TCharacterSet, u: TUniChar16): int8 = + case cs + of cs8859_1: result = toU8(u) # no table lookup necessary + of cs8859_2: + if u <=% 0x00A0'i16: + result = toU8(u) + else: + result = searchTable(cs8859_2toUnicode, u) +% 0xA1'8 proc utf8toLocale*(s: string): string proc localeToUtf8*(s: string): string diff --git a/lib/windows/windows.nim b/lib/windows/windows.nim index d14f56d12..2ac5fd7b6 100644 --- a/lib/windows/windows.nim +++ b/lib/windows/windows.nim @@ -7362,8 +7362,6 @@ when defined(x86_64): TXmmSaveArea* = XMM_SAVE_AREA32 PXmmSaveArea* = ptr TXmmSaveArea - const - LEGACY_SAVE_AREA_LENGTH* = sizeof(XMM_SAVE_AREA32) type CONTEXT* {.final, pure.} = object P1Home*: DWORD64 diff --git a/nim/ast.pas b/nim/ast.pas index c84262db4..899554c4e 100644 --- a/nim/ast.pas +++ b/nim/ast.pas @@ -65,148 +65,148 @@ for key, val in enums.items(): cog.out(a) cog.out(b) ]]]*) -type - TTypeFlag = ( - tfVarargs, tfFinal, tfAcyclic, tfEnumHasWholes); - TTypeFlags = set of TTypeFlag; -const - TypeFlagToStr: array [TTypeFlag] of string = ( - 'tfVarargs', 'tfFinal', 'tfAcyclic', 'tfEnumHasWholes'); -type - TTypeKind = ( - tyNone, tyBool, tyChar, tyEmpty, - tyArrayConstr, tyNil, tyGeneric, tyGenericInst, - tyGenericParam, tyEnum, tyAnyEnum, tyArray, - tyObject, tyTuple, tySet, tyRange, - tyPtr, tyRef, tyVar, tySequence, - tyProc, tyPointer, tyOpenArray, tyString, - tyCString, tyForward, tyInt, tyInt8, - tyInt16, tyInt32, tyInt64, tyFloat, - tyFloat32, tyFloat64, tyFloat128); - TTypeKinds = set of TTypeKind; -const - TypeKindToStr: array [TTypeKind] of string = ( - 'tyNone', 'tyBool', 'tyChar', 'tyEmpty', - 'tyArrayConstr', 'tyNil', 'tyGeneric', 'tyGenericInst', - 'tyGenericParam', 'tyEnum', 'tyAnyEnum', 'tyArray', - 'tyObject', 'tyTuple', 'tySet', 'tyRange', - 'tyPtr', 'tyRef', 'tyVar', 'tySequence', - 'tyProc', 'tyPointer', 'tyOpenArray', 'tyString', - 'tyCString', 'tyForward', 'tyInt', 'tyInt8', - 'tyInt16', 'tyInt32', 'tyInt64', 'tyFloat', - 'tyFloat32', 'tyFloat64', 'tyFloat128'); -type - TSymFlag = ( - sfUsed, sfStar, sfMinus, sfInInterface, - sfFromGeneric, sfGlobal, sfForward, sfImportc, - sfExportc, sfVolatile, sfRegister, sfPure, - sfResult, sfNoSideEffect, sfMainModule, sfSystemModule, - sfNoReturn, sfAddrTaken, sfCompilerProc, sfCppMethod, - sfDiscriminant, sfDeprecated, sfInClosure, sfTypeCheck, - sfCompileTime, sfThreadVar, sfMerge); - TSymFlags = set of TSymFlag; -const - SymFlagToStr: array [TSymFlag] of string = ( - 'sfUsed', 'sfStar', 'sfMinus', 'sfInInterface', - 'sfFromGeneric', 'sfGlobal', 'sfForward', 'sfImportc', - 'sfExportc', 'sfVolatile', 'sfRegister', 'sfPure', - 'sfResult', 'sfNoSideEffect', 'sfMainModule', 'sfSystemModule', - 'sfNoReturn', 'sfAddrTaken', 'sfCompilerProc', 'sfCppMethod', - 'sfDiscriminant', 'sfDeprecated', 'sfInClosure', 'sfTypeCheck', - 'sfCompileTime', 'sfThreadVar', 'sfMerge'); -type - TNodeFlag = ( - nfNone, nfBase2, nfBase8, nfBase16, - nfAllConst, nfTransf, nfSem); - TNodeFlags = set of TNodeFlag; -const - NodeFlagToStr: array [TNodeFlag] of string = ( - 'nfNone', 'nfBase2', 'nfBase8', 'nfBase16', - 'nfAllConst', 'nfTransf', 'nfSem'); -type - TSymKind = ( - skUnknownSym, skConditional, skDynLib, skParam, - skTypeParam, skTemp, skType, skConst, - skVar, skProc, skIterator, skConverter, - skMacro, skTemplate, skField, skEnumField, - skForVar, skModule, skLabel, skStub); - TSymKinds = set of TSymKind; -const - SymKindToStr: array [TSymKind] of string = ( - 'skUnknownSym', 'skConditional', 'skDynLib', 'skParam', - 'skTypeParam', 'skTemp', 'skType', 'skConst', - 'skVar', 'skProc', 'skIterator', 'skConverter', - 'skMacro', 'skTemplate', 'skField', 'skEnumField', - 'skForVar', 'skModule', 'skLabel', 'skStub'); -type - TNodeKind = ( - nkNone, nkEmpty, nkIdent, nkSym, - nkType, nkCharLit, nkIntLit, nkInt8Lit, - nkInt16Lit, nkInt32Lit, nkInt64Lit, nkFloatLit, - nkFloat32Lit, nkFloat64Lit, nkStrLit, nkRStrLit, - nkTripleStrLit, nkMetaNode, nkNilLit, nkDotCall, - nkCommand, nkCall, nkGenericCall, nkExplicitTypeListCall, - nkExprEqExpr, nkExprColonExpr, nkIdentDefs, nkInfix, - nkPrefix, nkPostfix, nkPar, nkCurly, - nkBracket, nkBracketExpr, nkPragmaExpr, nkRange, - nkDotExpr, nkCheckedFieldExpr, nkDerefExpr, nkIfExpr, - nkElifExpr, nkElseExpr, nkLambda, nkAccQuoted, - nkHeaderQuoted, nkTableConstr, nkQualified, nkHiddenStdConv, - nkHiddenSubConv, nkHiddenCallConv, nkConv, nkCast, - nkAddr, nkHiddenAddr, nkHiddenDeref, nkObjDownConv, - nkObjUpConv, nkChckRangeF, nkChckRange64, nkChckRange, - nkStringToCString, nkCStringToString, nkPassAsOpenArray, nkAsgn, - nkDefaultTypeParam, nkGenericParams, nkFormalParams, nkOfInherit, - nkModule, nkProcDef, nkConverterDef, nkMacroDef, - nkTemplateDef, nkIteratorDef, nkOfBranch, nkElifBranch, - nkExceptBranch, nkElse, nkMacroStmt, nkAsmStmt, - nkPragma, nkIfStmt, nkWhenStmt, nkForStmt, - nkWhileStmt, nkCaseStmt, nkVarSection, nkConstSection, - nkConstDef, nkTypeSection, nkTypeDef, nkYieldStmt, - nkTryStmt, nkFinally, nkRaiseStmt, nkReturnStmt, - nkBreakStmt, nkContinueStmt, nkBlockStmt, nkDiscardStmt, - nkStmtList, nkImportStmt, nkFromStmt, nkImportAs, - nkIncludeStmt, nkAccessStmt, nkCommentStmt, nkStmtListExpr, - nkBlockExpr, nkStmtListType, nkBlockType, nkVm, - nkTypeOfExpr, nkObjectTy, nkTupleTy, nkRecList, - nkRecCase, nkRecWhen, nkRefTy, nkPtrTy, - nkVarTy, nkProcTy, nkEnumTy, nkEnumFieldDef, - nkReturnToken); - TNodeKinds = set of TNodeKind; -const - NodeKindToStr: array [TNodeKind] of string = ( - 'nkNone', 'nkEmpty', 'nkIdent', 'nkSym', - 'nkType', 'nkCharLit', 'nkIntLit', 'nkInt8Lit', - 'nkInt16Lit', 'nkInt32Lit', 'nkInt64Lit', 'nkFloatLit', - 'nkFloat32Lit', 'nkFloat64Lit', 'nkStrLit', 'nkRStrLit', - 'nkTripleStrLit', 'nkMetaNode', 'nkNilLit', 'nkDotCall', - 'nkCommand', 'nkCall', 'nkGenericCall', 'nkExplicitTypeListCall', - 'nkExprEqExpr', 'nkExprColonExpr', 'nkIdentDefs', 'nkInfix', - 'nkPrefix', 'nkPostfix', 'nkPar', 'nkCurly', - 'nkBracket', 'nkBracketExpr', 'nkPragmaExpr', 'nkRange', - 'nkDotExpr', 'nkCheckedFieldExpr', 'nkDerefExpr', 'nkIfExpr', - 'nkElifExpr', 'nkElseExpr', 'nkLambda', 'nkAccQuoted', - 'nkHeaderQuoted', 'nkTableConstr', 'nkQualified', 'nkHiddenStdConv', - 'nkHiddenSubConv', 'nkHiddenCallConv', 'nkConv', 'nkCast', - 'nkAddr', 'nkHiddenAddr', 'nkHiddenDeref', 'nkObjDownConv', - 'nkObjUpConv', 'nkChckRangeF', 'nkChckRange64', 'nkChckRange', - 'nkStringToCString', 'nkCStringToString', 'nkPassAsOpenArray', 'nkAsgn', - 'nkDefaultTypeParam', 'nkGenericParams', 'nkFormalParams', 'nkOfInherit', - 'nkModule', 'nkProcDef', 'nkConverterDef', 'nkMacroDef', - 'nkTemplateDef', 'nkIteratorDef', 'nkOfBranch', 'nkElifBranch', - 'nkExceptBranch', 'nkElse', 'nkMacroStmt', 'nkAsmStmt', - 'nkPragma', 'nkIfStmt', 'nkWhenStmt', 'nkForStmt', - 'nkWhileStmt', 'nkCaseStmt', 'nkVarSection', 'nkConstSection', - 'nkConstDef', 'nkTypeSection', 'nkTypeDef', 'nkYieldStmt', - 'nkTryStmt', 'nkFinally', 'nkRaiseStmt', 'nkReturnStmt', - 'nkBreakStmt', 'nkContinueStmt', 'nkBlockStmt', 'nkDiscardStmt', - 'nkStmtList', 'nkImportStmt', 'nkFromStmt', 'nkImportAs', - 'nkIncludeStmt', 'nkAccessStmt', 'nkCommentStmt', 'nkStmtListExpr', - 'nkBlockExpr', 'nkStmtListType', 'nkBlockType', 'nkVm', - 'nkTypeOfExpr', 'nkObjectTy', 'nkTupleTy', 'nkRecList', - 'nkRecCase', 'nkRecWhen', 'nkRefTy', 'nkPtrTy', - 'nkVarTy', 'nkProcTy', 'nkEnumTy', 'nkEnumFieldDef', - 'nkReturnToken'); +type + TNodeKind = ( + nkNone, nkEmpty, nkIdent, nkSym, + nkType, nkCharLit, nkIntLit, nkInt8Lit, + nkInt16Lit, nkInt32Lit, nkInt64Lit, nkFloatLit, + nkFloat32Lit, nkFloat64Lit, nkStrLit, nkRStrLit, + nkTripleStrLit, nkMetaNode, nkNilLit, nkDotCall, + nkCommand, nkCall, nkGenericCall, nkExplicitTypeListCall, + nkExprEqExpr, nkExprColonExpr, nkIdentDefs, nkInfix, + nkPrefix, nkPostfix, nkPar, nkCurly, + nkBracket, nkBracketExpr, nkPragmaExpr, nkRange, + nkDotExpr, nkCheckedFieldExpr, nkDerefExpr, nkIfExpr, + nkElifExpr, nkElseExpr, nkLambda, nkAccQuoted, + nkHeaderQuoted, nkTableConstr, nkQualified, nkHiddenStdConv, + nkHiddenSubConv, nkHiddenCallConv, nkConv, nkCast, + nkAddr, nkHiddenAddr, nkHiddenDeref, nkObjDownConv, + nkObjUpConv, nkChckRangeF, nkChckRange64, nkChckRange, + nkStringToCString, nkCStringToString, nkPassAsOpenArray, nkAsgn, + nkDefaultTypeParam, nkGenericParams, nkFormalParams, nkOfInherit, + nkModule, nkProcDef, nkConverterDef, nkMacroDef, + nkTemplateDef, nkIteratorDef, nkOfBranch, nkElifBranch, + nkExceptBranch, nkElse, nkMacroStmt, nkAsmStmt, + nkPragma, nkIfStmt, nkWhenStmt, nkForStmt, + nkWhileStmt, nkCaseStmt, nkVarSection, nkConstSection, + nkConstDef, nkTypeSection, nkTypeDef, nkYieldStmt, + nkTryStmt, nkFinally, nkRaiseStmt, nkReturnStmt, + nkBreakStmt, nkContinueStmt, nkBlockStmt, nkDiscardStmt, + nkStmtList, nkImportStmt, nkFromStmt, nkImportAs, + nkIncludeStmt, nkAccessStmt, nkCommentStmt, nkStmtListExpr, + nkBlockExpr, nkStmtListType, nkBlockType, nkVm, + nkTypeOfExpr, nkObjectTy, nkTupleTy, nkRecList, + nkRecCase, nkRecWhen, nkRefTy, nkPtrTy, + nkVarTy, nkProcTy, nkEnumTy, nkEnumFieldDef, + nkReturnToken); + TNodeKinds = set of TNodeKind; +const + NodeKindToStr: array [TNodeKind] of string = ( + 'nkNone', 'nkEmpty', 'nkIdent', 'nkSym', + 'nkType', 'nkCharLit', 'nkIntLit', 'nkInt8Lit', + 'nkInt16Lit', 'nkInt32Lit', 'nkInt64Lit', 'nkFloatLit', + 'nkFloat32Lit', 'nkFloat64Lit', 'nkStrLit', 'nkRStrLit', + 'nkTripleStrLit', 'nkMetaNode', 'nkNilLit', 'nkDotCall', + 'nkCommand', 'nkCall', 'nkGenericCall', 'nkExplicitTypeListCall', + 'nkExprEqExpr', 'nkExprColonExpr', 'nkIdentDefs', 'nkInfix', + 'nkPrefix', 'nkPostfix', 'nkPar', 'nkCurly', + 'nkBracket', 'nkBracketExpr', 'nkPragmaExpr', 'nkRange', + 'nkDotExpr', 'nkCheckedFieldExpr', 'nkDerefExpr', 'nkIfExpr', + 'nkElifExpr', 'nkElseExpr', 'nkLambda', 'nkAccQuoted', + 'nkHeaderQuoted', 'nkTableConstr', 'nkQualified', 'nkHiddenStdConv', + 'nkHiddenSubConv', 'nkHiddenCallConv', 'nkConv', 'nkCast', + 'nkAddr', 'nkHiddenAddr', 'nkHiddenDeref', 'nkObjDownConv', + 'nkObjUpConv', 'nkChckRangeF', 'nkChckRange64', 'nkChckRange', + 'nkStringToCString', 'nkCStringToString', 'nkPassAsOpenArray', 'nkAsgn', + 'nkDefaultTypeParam', 'nkGenericParams', 'nkFormalParams', 'nkOfInherit', + 'nkModule', 'nkProcDef', 'nkConverterDef', 'nkMacroDef', + 'nkTemplateDef', 'nkIteratorDef', 'nkOfBranch', 'nkElifBranch', + 'nkExceptBranch', 'nkElse', 'nkMacroStmt', 'nkAsmStmt', + 'nkPragma', 'nkIfStmt', 'nkWhenStmt', 'nkForStmt', + 'nkWhileStmt', 'nkCaseStmt', 'nkVarSection', 'nkConstSection', + 'nkConstDef', 'nkTypeSection', 'nkTypeDef', 'nkYieldStmt', + 'nkTryStmt', 'nkFinally', 'nkRaiseStmt', 'nkReturnStmt', + 'nkBreakStmt', 'nkContinueStmt', 'nkBlockStmt', 'nkDiscardStmt', + 'nkStmtList', 'nkImportStmt', 'nkFromStmt', 'nkImportAs', + 'nkIncludeStmt', 'nkAccessStmt', 'nkCommentStmt', 'nkStmtListExpr', + 'nkBlockExpr', 'nkStmtListType', 'nkBlockType', 'nkVm', + 'nkTypeOfExpr', 'nkObjectTy', 'nkTupleTy', 'nkRecList', + 'nkRecCase', 'nkRecWhen', 'nkRefTy', 'nkPtrTy', + 'nkVarTy', 'nkProcTy', 'nkEnumTy', 'nkEnumFieldDef', + 'nkReturnToken'); +type + TSymFlag = ( + sfUsed, sfStar, sfMinus, sfInInterface, + sfFromGeneric, sfGlobal, sfForward, sfImportc, + sfExportc, sfVolatile, sfRegister, sfPure, + sfResult, sfNoSideEffect, sfMainModule, sfSystemModule, + sfNoReturn, sfAddrTaken, sfCompilerProc, sfCppMethod, + sfDiscriminant, sfDeprecated, sfInClosure, sfTypeCheck, + sfCompileTime, sfThreadVar, sfMerge); + TSymFlags = set of TSymFlag; +const + SymFlagToStr: array [TSymFlag] of string = ( + 'sfUsed', 'sfStar', 'sfMinus', 'sfInInterface', + 'sfFromGeneric', 'sfGlobal', 'sfForward', 'sfImportc', + 'sfExportc', 'sfVolatile', 'sfRegister', 'sfPure', + 'sfResult', 'sfNoSideEffect', 'sfMainModule', 'sfSystemModule', + 'sfNoReturn', 'sfAddrTaken', 'sfCompilerProc', 'sfCppMethod', + 'sfDiscriminant', 'sfDeprecated', 'sfInClosure', 'sfTypeCheck', + 'sfCompileTime', 'sfThreadVar', 'sfMerge'); +type + TTypeKind = ( + tyNone, tyBool, tyChar, tyEmpty, + tyArrayConstr, tyNil, tyGeneric, tyGenericInst, + tyGenericParam, tyEnum, tyAnyEnum, tyArray, + tyObject, tyTuple, tySet, tyRange, + tyPtr, tyRef, tyVar, tySequence, + tyProc, tyPointer, tyOpenArray, tyString, + tyCString, tyForward, tyInt, tyInt8, + tyInt16, tyInt32, tyInt64, tyFloat, + tyFloat32, tyFloat64, tyFloat128); + TTypeKinds = set of TTypeKind; +const + TypeKindToStr: array [TTypeKind] of string = ( + 'tyNone', 'tyBool', 'tyChar', 'tyEmpty', + 'tyArrayConstr', 'tyNil', 'tyGeneric', 'tyGenericInst', + 'tyGenericParam', 'tyEnum', 'tyAnyEnum', 'tyArray', + 'tyObject', 'tyTuple', 'tySet', 'tyRange', + 'tyPtr', 'tyRef', 'tyVar', 'tySequence', + 'tyProc', 'tyPointer', 'tyOpenArray', 'tyString', + 'tyCString', 'tyForward', 'tyInt', 'tyInt8', + 'tyInt16', 'tyInt32', 'tyInt64', 'tyFloat', + 'tyFloat32', 'tyFloat64', 'tyFloat128'); +type + TNodeFlag = ( + nfNone, nfBase2, nfBase8, nfBase16, + nfAllConst, nfTransf, nfSem); + TNodeFlags = set of TNodeFlag; +const + NodeFlagToStr: array [TNodeFlag] of string = ( + 'nfNone', 'nfBase2', 'nfBase8', 'nfBase16', + 'nfAllConst', 'nfTransf', 'nfSem'); +type + TTypeFlag = ( + tfVarargs, tfFinal, tfAcyclic, tfEnumHasWholes); + TTypeFlags = set of TTypeFlag; +const + TypeFlagToStr: array [TTypeFlag] of string = ( + 'tfVarargs', 'tfFinal', 'tfAcyclic', 'tfEnumHasWholes'); +type + TSymKind = ( + skUnknownSym, skConditional, skDynLib, skParam, + skTypeParam, skTemp, skType, skConst, + skVar, skProc, skIterator, skConverter, + skMacro, skTemplate, skField, skEnumField, + skForVar, skModule, skLabel, skStub); + TSymKinds = set of TSymKind; +const + SymKindToStr: array [TSymKind] of string = ( + 'skUnknownSym', 'skConditional', 'skDynLib', 'skParam', + 'skTypeParam', 'skTemp', 'skType', 'skConst', + 'skVar', 'skProc', 'skIterator', 'skConverter', + 'skMacro', 'skTemplate', 'skField', 'skEnumField', + 'skForVar', 'skModule', 'skLabel', 'skStub'); {[[[end]]]} type @@ -219,43 +219,43 @@ type // if (i+1) % 6 == 0: cog.outl("") //cog.outl("m" + magics[-1]) //]]] - mNone, mDefined, mLow, mHigh, mSizeOf, mIs, - mSucc, mPred, mInc, mDec, mOrd, mNew, - mNewFinalize, mNewSeq, mRegisterFinalizer, mLengthOpenArray, mLengthStr, mLengthArray, - mLengthSeq, mIncl, mExcl, mCard, mChr, mGCref, - mGCunref, mAddI, mSubI, mMulI, mDivI, mModI, - mAddI64, mSubI64, mMulI64, mDivI64, mModI64, mShrI, - mShlI, mBitandI, mBitorI, mBitxorI, mMinI, mMaxI, - mShrI64, mShlI64, mBitandI64, mBitorI64, mBitxorI64, mMinI64, - mMaxI64, mAddF64, mSubF64, mMulF64, mDivF64, mMinF64, - mMaxF64, mAddU, mSubU, mMulU, mDivU, mModU, - mAddU64, mSubU64, mMulU64, mDivU64, mModU64, mEqI, - mLeI, mLtI, mEqI64, mLeI64, mLtI64, mEqF64, - mLeF64, mLtF64, mLeU, mLtU, mLeU64, mLtU64, - mEqEnum, mLeEnum, mLtEnum, mEqCh, mLeCh, mLtCh, - mEqB, mLeB, mLtB, mEqRef, mEqProc, mEqUntracedRef, - mLePtr, mLtPtr, mEqCString, mXor, mUnaryMinusI, mUnaryMinusI64, - mAbsI, mAbsI64, mNot, mUnaryPlusI, mBitnotI, mUnaryPlusI64, - mBitnotI64, mUnaryPlusF64, mUnaryMinusF64, mAbsF64, mZe8ToI, mZe8ToI64, - mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64, mToU8, mToU16, - mToU32, mToFloat, mToBiggestFloat, mToInt, mToBiggestInt, mCharToStr, - mBoolToStr, mIntToStr, mInt64ToStr, mFloatToStr, mCStrToStr, mStrToStr, - mAnd, mOr, mEqStr, mLeStr, mLtStr, mEqSet, - mLeSet, mLtSet, mMulSet, mPlusSet, mMinusSet, mSymDiffSet, - mConStrStr, mConArrArr, mConArrT, mConTArr, mConTT, mSlice, - mAppendStrCh, mAppendStrStr, mAppendSeqElem, mAppendSeqSeq, mInRange, mInSet, - mAsgn, mRepr, mExit, mSetLengthStr, mSetLengthSeq, mAssert, - mSwap, mIsNil, mArrToSeq, mArray, mOpenArray, mRange, - mSet, mSeq, mInt, mInt8, mInt16, mInt32, - mInt64, mFloat, mFloat32, mFloat64, mBool, mChar, - mString, mCstring, mPointer, mAnyEnum, mEmptySet, mIntSetBaseType, - mNil, mIsMainModule, mCompileDate, mCompileTime, mNimrodVersion, mNimrodMajor, - mNimrodMinor, mNimrodPatch, mCpuEndian, mNaN, mInf, mNegInf, - mNLen, mNChild, mNSetChild, mNAdd, mNAddMultiple, mNDel, - mNKind, mNIntVal, mNFloatVal, mNSymbol, mNIdent, mNGetType, - mNStrVal, mNSetIntVal, mNSetFloatVal, mNSetSymbol, mNSetIdent, mNSetType, - mNSetStrVal, mNNewNimNode, mNCopyNimNode, mNCopyNimTree, mStrToIdent, mIdentToStr, - mEqIdent, mNHint, mNWarning, mNError + mNone, mDefined, mLow, mHigh, mSizeOf, mIs, + mSucc, mPred, mInc, mDec, mOrd, mNew, + mNewFinalize, mNewSeq, mRegisterFinalizer, mLengthOpenArray, mLengthStr, mLengthArray, + mLengthSeq, mIncl, mExcl, mCard, mChr, mGCref, + mGCunref, mAddI, mSubI, mMulI, mDivI, mModI, + mAddI64, mSubI64, mMulI64, mDivI64, mModI64, mShrI, + mShlI, mBitandI, mBitorI, mBitxorI, mMinI, mMaxI, + mShrI64, mShlI64, mBitandI64, mBitorI64, mBitxorI64, mMinI64, + mMaxI64, mAddF64, mSubF64, mMulF64, mDivF64, mMinF64, + mMaxF64, mAddU, mSubU, mMulU, mDivU, mModU, + mAddU64, mSubU64, mMulU64, mDivU64, mModU64, mEqI, + mLeI, mLtI, mEqI64, mLeI64, mLtI64, mEqF64, + mLeF64, mLtF64, mLeU, mLtU, mLeU64, mLtU64, + mEqEnum, mLeEnum, mLtEnum, mEqCh, mLeCh, mLtCh, + mEqB, mLeB, mLtB, mEqRef, mEqProc, mEqUntracedRef, + mLePtr, mLtPtr, mEqCString, mXor, mUnaryMinusI, mUnaryMinusI64, + mAbsI, mAbsI64, mNot, mUnaryPlusI, mBitnotI, mUnaryPlusI64, + mBitnotI64, mUnaryPlusF64, mUnaryMinusF64, mAbsF64, mZe8ToI, mZe8ToI64, + mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64, mToU8, mToU16, + mToU32, mToFloat, mToBiggestFloat, mToInt, mToBiggestInt, mCharToStr, + mBoolToStr, mIntToStr, mInt64ToStr, mFloatToStr, mCStrToStr, mStrToStr, + mAnd, mOr, mEqStr, mLeStr, mLtStr, mEqSet, + mLeSet, mLtSet, mMulSet, mPlusSet, mMinusSet, mSymDiffSet, + mConStrStr, mConArrArr, mConArrT, mConTArr, mConTT, mSlice, + mAppendStrCh, mAppendStrStr, mAppendSeqElem, mAppendSeqSeq, mInRange, mInSet, + mAsgn, mRepr, mExit, mSetLengthStr, mSetLengthSeq, mAssert, + mSwap, mIsNil, mArrToSeq, mArray, mOpenArray, mRange, + mSet, mSeq, mInt, mInt8, mInt16, mInt32, + mInt64, mFloat, mFloat32, mFloat64, mBool, mChar, + mString, mCstring, mPointer, mAnyEnum, mEmptySet, mIntSetBaseType, + mNil, mIsMainModule, mCompileDate, mCompileTime, mNimrodVersion, mNimrodMajor, + mNimrodMinor, mNimrodPatch, mCpuEndian, mNaN, mInf, mNegInf, + mNLen, mNChild, mNSetChild, mNAdd, mNAddMultiple, mNDel, + mNKind, mNIntVal, mNFloatVal, mNSymbol, mNIdent, mNGetType, + mNStrVal, mNSetIntVal, mNSetFloatVal, mNSetSymbol, mNSetIdent, mNSetType, + mNSetStrVal, mNNewNimNode, mNCopyNimNode, mNCopyNimTree, mStrToIdent, mIdentToStr, + mEqIdent, mNHint, mNWarning, mNError //[[[end]]] ); @@ -319,10 +319,10 @@ type locField, // location is a record field locArrayElem, // location is an array element locExpr, // "location" is really an expression - locImmediate, // location is an immediate value locProc, // location is a proc (an address of a procedure) locData, // location is a constant - locCall, // location is a call expression + locCall, // location is a call expression + locImmediate, // location is an immediate value locOther // location is something other ); @@ -351,9 +351,10 @@ type end; // ---------------- end of backend information ------------------------------ - TLibKind = (libHeader, libDynamic, libDynamicGenerated); + TLibKind = (libHeader, libDynamic); TLib = object(lists.TListEntry) // also misused for headers! kind: TLibKind; + generated: bool; // needed for the backends: name: PRope; path: string; @@ -476,43 +477,43 @@ const // "MagicToStr" array: // if (i+1) % 6 == 0: cog.outl("") //cog.outl("'%s'" % magics[-1]) //]]] - 'None', 'Defined', 'Low', 'High', 'SizeOf', 'Is', - 'Succ', 'Pred', 'Inc', 'Dec', 'Ord', 'New', - 'NewFinalize', 'NewSeq', 'RegisterFinalizer', 'LengthOpenArray', 'LengthStr', 'LengthArray', - 'LengthSeq', 'Incl', 'Excl', 'Card', 'Chr', 'GCref', - 'GCunref', 'AddI', 'SubI', 'MulI', 'DivI', 'ModI', - 'AddI64', 'SubI64', 'MulI64', 'DivI64', 'ModI64', 'ShrI', - 'ShlI', 'BitandI', 'BitorI', 'BitxorI', 'MinI', 'MaxI', - 'ShrI64', 'ShlI64', 'BitandI64', 'BitorI64', 'BitxorI64', 'MinI64', - 'MaxI64', 'AddF64', 'SubF64', 'MulF64', 'DivF64', 'MinF64', - 'MaxF64', 'AddU', 'SubU', 'MulU', 'DivU', 'ModU', - 'AddU64', 'SubU64', 'MulU64', 'DivU64', 'ModU64', 'EqI', - 'LeI', 'LtI', 'EqI64', 'LeI64', 'LtI64', 'EqF64', - 'LeF64', 'LtF64', 'LeU', 'LtU', 'LeU64', 'LtU64', - 'EqEnum', 'LeEnum', 'LtEnum', 'EqCh', 'LeCh', 'LtCh', - 'EqB', 'LeB', 'LtB', 'EqRef', 'EqProc', 'EqUntracedRef', - 'LePtr', 'LtPtr', 'EqCString', 'Xor', 'UnaryMinusI', 'UnaryMinusI64', - 'AbsI', 'AbsI64', 'Not', 'UnaryPlusI', 'BitnotI', 'UnaryPlusI64', - 'BitnotI64', 'UnaryPlusF64', 'UnaryMinusF64', 'AbsF64', 'Ze8ToI', 'Ze8ToI64', - 'Ze16ToI', 'Ze16ToI64', 'Ze32ToI64', 'ZeIToI64', 'ToU8', 'ToU16', - 'ToU32', 'ToFloat', 'ToBiggestFloat', 'ToInt', 'ToBiggestInt', 'CharToStr', - 'BoolToStr', 'IntToStr', 'Int64ToStr', 'FloatToStr', 'CStrToStr', 'StrToStr', - 'And', 'Or', 'EqStr', 'LeStr', 'LtStr', 'EqSet', - 'LeSet', 'LtSet', 'MulSet', 'PlusSet', 'MinusSet', 'SymDiffSet', - 'ConStrStr', 'ConArrArr', 'ConArrT', 'ConTArr', 'ConTT', 'Slice', - 'AppendStrCh', 'AppendStrStr', 'AppendSeqElem', 'AppendSeqSeq', 'InRange', 'InSet', - 'Asgn', 'Repr', 'Exit', 'SetLengthStr', 'SetLengthSeq', 'Assert', - 'Swap', 'IsNil', 'ArrToSeq', 'Array', 'OpenArray', 'Range', - 'Set', 'Seq', 'Int', 'Int8', 'Int16', 'Int32', - 'Int64', 'Float', 'Float32', 'Float64', 'Bool', 'Char', - 'String', 'Cstring', 'Pointer', 'AnyEnum', 'EmptySet', 'IntSetBaseType', - 'Nil', 'IsMainModule', 'CompileDate', 'CompileTime', 'NimrodVersion', 'NimrodMajor', - 'NimrodMinor', 'NimrodPatch', 'CpuEndian', 'NaN', 'Inf', 'NegInf', - 'NLen', 'NChild', 'NSetChild', 'NAdd', 'NAddMultiple', 'NDel', - 'NKind', 'NIntVal', 'NFloatVal', 'NSymbol', 'NIdent', 'NGetType', - 'NStrVal', 'NSetIntVal', 'NSetFloatVal', 'NSetSymbol', 'NSetIdent', 'NSetType', - 'NSetStrVal', 'NNewNimNode', 'NCopyNimNode', 'NCopyNimTree', 'StrToIdent', 'IdentToStr', - 'EqIdent', 'NHint', 'NWarning', 'NError' + 'None', 'Defined', 'Low', 'High', 'SizeOf', 'Is', + 'Succ', 'Pred', 'Inc', 'Dec', 'Ord', 'New', + 'NewFinalize', 'NewSeq', 'RegisterFinalizer', 'LengthOpenArray', 'LengthStr', 'LengthArray', + 'LengthSeq', 'Incl', 'Excl', 'Card', 'Chr', 'GCref', + 'GCunref', 'AddI', 'SubI', 'MulI', 'DivI', 'ModI', + 'AddI64', 'SubI64', 'MulI64', 'DivI64', 'ModI64', 'ShrI', + 'ShlI', 'BitandI', 'BitorI', 'BitxorI', 'MinI', 'MaxI', + 'ShrI64', 'ShlI64', 'BitandI64', 'BitorI64', 'BitxorI64', 'MinI64', + 'MaxI64', 'AddF64', 'SubF64', 'MulF64', 'DivF64', 'MinF64', + 'MaxF64', 'AddU', 'SubU', 'MulU', 'DivU', 'ModU', + 'AddU64', 'SubU64', 'MulU64', 'DivU64', 'ModU64', 'EqI', + 'LeI', 'LtI', 'EqI64', 'LeI64', 'LtI64', 'EqF64', + 'LeF64', 'LtF64', 'LeU', 'LtU', 'LeU64', 'LtU64', + 'EqEnum', 'LeEnum', 'LtEnum', 'EqCh', 'LeCh', 'LtCh', + 'EqB', 'LeB', 'LtB', 'EqRef', 'EqProc', 'EqUntracedRef', + 'LePtr', 'LtPtr', 'EqCString', 'Xor', 'UnaryMinusI', 'UnaryMinusI64', + 'AbsI', 'AbsI64', 'Not', 'UnaryPlusI', 'BitnotI', 'UnaryPlusI64', + 'BitnotI64', 'UnaryPlusF64', 'UnaryMinusF64', 'AbsF64', 'Ze8ToI', 'Ze8ToI64', + 'Ze16ToI', 'Ze16ToI64', 'Ze32ToI64', 'ZeIToI64', 'ToU8', 'ToU16', + 'ToU32', 'ToFloat', 'ToBiggestFloat', 'ToInt', 'ToBiggestInt', 'CharToStr', + 'BoolToStr', 'IntToStr', 'Int64ToStr', 'FloatToStr', 'CStrToStr', 'StrToStr', + 'And', 'Or', 'EqStr', 'LeStr', 'LtStr', 'EqSet', + 'LeSet', 'LtSet', 'MulSet', 'PlusSet', 'MinusSet', 'SymDiffSet', + 'ConStrStr', 'ConArrArr', 'ConArrT', 'ConTArr', 'ConTT', 'Slice', + 'AppendStrCh', 'AppendStrStr', 'AppendSeqElem', 'AppendSeqSeq', 'InRange', 'InSet', + 'Asgn', 'Repr', 'Exit', 'SetLengthStr', 'SetLengthSeq', 'Assert', + 'Swap', 'IsNil', 'ArrToSeq', 'Array', 'OpenArray', 'Range', + 'Set', 'Seq', 'Int', 'Int8', 'Int16', 'Int32', + 'Int64', 'Float', 'Float32', 'Float64', 'Bool', 'Char', + 'String', 'Cstring', 'Pointer', 'AnyEnum', 'EmptySet', 'IntSetBaseType', + 'Nil', 'IsMainModule', 'CompileDate', 'CompileTime', 'NimrodVersion', 'NimrodMajor', + 'NimrodMinor', 'NimrodPatch', 'CpuEndian', 'NaN', 'Inf', 'NegInf', + 'NLen', 'NChild', 'NSetChild', 'NAdd', 'NAddMultiple', 'NDel', + 'NKind', 'NIntVal', 'NFloatVal', 'NSymbol', 'NIdent', 'NGetType', + 'NStrVal', 'NSetIntVal', 'NSetFloatVal', 'NSetSymbol', 'NSetIdent', 'NSetType', + 'NSetStrVal', 'NNewNimNode', 'NCopyNimNode', 'NCopyNimTree', 'StrToIdent', 'IdentToStr', + 'EqIdent', 'NHint', 'NWarning', 'NError' //[[[end]]] ); @@ -629,18 +630,29 @@ function leValue(a, b: PNode): Boolean; // a <= b? a, b are literals function ValueToString(a: PNode): string; // ------------- efficient integer sets ------------------------------------- +{@ignore} +type + TBitScalar = int32; // FPC produces wrong code for ``int`` +{@emit +type + TBitScalar = int; } + const - IntsPerTrunk = 8; InitIntSetSize = 8; // must be a power of two! - BitsPerTrunk = IntsPerTrunk * sizeof(int) * 8; - BitsPerInt = sizeof(int) * 8; + TrunkShift = 9; + BitsPerTrunk = 1 shl TrunkShift; + // needs to be a power of 2 and divisible by 64 + TrunkMask = BitsPerTrunk-1; + IntsPerTrunk = BitsPerTrunk div (sizeof(TBitScalar)*8); + IntShift = 5+ord(sizeof(TBitScalar)=8); // 5 or 6, depending on int width + IntMask = 1 shl IntShift -1; type PTrunk = ^TTrunk; TTrunk = record next: PTrunk; // all nodes are connected with this pointer key: int; // start address at bit 0 - bits: array [0..IntsPerTrunk-1] of int; // a bit vector + bits: array [0..IntsPerTrunk-1] of TBitScalar; // a bit vector end; TTrunkSeq = array of PTrunk; TIntSet = record @@ -661,45 +673,9 @@ const procedure registerID(id: PIdObj); -// owner handling: -function getCurrOwner(): PSym; -procedure PushOwner(owner: PSym); -procedure PopOwner; - implementation var - gOwners: array of PSym; // owner stack (used for initializing the - // owner field of syms) - // the documentation comment always gets - // assigned to the current owner - // BUGFIX: global array is needed! -{@emit gOwners := @[]; } - -function getCurrOwner(): PSym; -begin - result := gOwners[high(gOwners)]; -end; - -procedure PushOwner(owner: PSym); -var - len: int; -begin - len := length(gOwners); - setLength(gOwners, len+1); - gOwners[len] := owner; -end; - -procedure PopOwner; -var - len: int; -begin - len := length(gOwners); - if (len <= 0) then InternalError('popOwner'); - setLength(gOwners, len - 1); -end; - -var usedIds: TIntSet; procedure registerID(id: PIdObj); @@ -1301,8 +1277,7 @@ begin result := nil end; -procedure IntSetRawInsert(const t: TIntSet; var data: TTrunkSeq; - desc: PTrunk); +procedure IntSetRawInsert(const t: TIntSet; var data: TTrunkSeq; desc: PTrunk); var h: int; begin @@ -1365,23 +1340,15 @@ end; // ---------- slightly higher level procs ---------------------------------- -function transform(key: int): int; -begin - if key < 0 then result := 1000000000 + key // avoid negative numbers! - else result := key -end; - function IntSetContains(const s: TIntSet; key: int): bool; var u: int; t: PTrunk; begin - u := transform(key); - t := IntSetGet(s, u div BitsPerTrunk); + t := IntSetGet(s, key shr TrunkShift); if t <> nil then begin - u := u mod BitsPerTrunk; - result := (t.bits[u div BitsPerInt] - and (1 shl (u mod BitsPerInt))) <> 0 + u := key and TrunkMask; + result := (t.bits[u shr IntShift] and (1 shl (u and IntMask))) <> 0 end else result := false @@ -1392,11 +1359,10 @@ var u: int; t: PTrunk; begin - u := transform(key); - t := IntSetPut(s, u div BitsPerTrunk); - u := u mod BitsPerTrunk; - t.bits[u div BitsPerInt] := t.bits[u div BitsPerInt] - or (1 shl (u mod BitsPerInt)); + t := IntSetPut(s, key shr TrunkShift); + u := key and TrunkMask; + t.bits[u shr IntShift] := t.bits[u shr IntShift] + or (1 shl (u and IntMask)); end; function IntSetContainsOrIncl(var s: TIntSet; key: int): bool; @@ -1404,22 +1370,35 @@ var u: int; t: PTrunk; begin - u := transform(key); - t := IntSetGet(s, u div BitsPerTrunk); + t := IntSetGet(s, key shr TrunkShift); if t <> nil then begin - u := u mod BitsPerTrunk; - result := (t.bits[u div BitsPerInt] - and (1 shl (u mod BitsPerInt))) <> 0; + u := key and TrunkMask; + result := (t.bits[u shr IntShift] and (1 shl (u and IntMask))) <> 0; if not result then - t.bits[u div BitsPerInt] := t.bits[u div BitsPerInt] - or (1 shl (u mod BitsPerInt)); + t.bits[u shr IntShift] := t.bits[u shr IntShift] + or (1 shl (u and IntMask)); end else begin IntSetIncl(s, key); result := false end end; - +(* +procedure IntSetDebug(const s: TIntSet); +var + it: PTrunk; + i, j: int; +begin + it := s.head; + while it <> nil do begin + for i := 0 to high(it.bits) do + for j := 0 to BitsPerInt-1 do begin + if (it.bits[j] and (1 shl j)) <> 0 then + MessageOut('Contains key: ' + toString(it.key + i * BitsPerInt + j)); + end; + it := it.next + end +end;*) initialization if debugIDs then IntSetInit(usedIds); diff --git a/nim/astalgo.pas b/nim/astalgo.pas index ddd646efb..0e31f4ac7 100644 --- a/nim/astalgo.pas +++ b/nim/astalgo.pas @@ -274,11 +274,12 @@ begin res := '"' + ''; for i := strStart to length(s)+strStart-1 do begin if (i-strStart+1) mod MaxLineLength = 0 then begin - res := res +{&} '"' +{&} nl; + addChar(res, '"'); + add(res, nl); app(result, toRope(res)); res := '"'+''; // reset end; - res := res +{&} toYamlChar(s[i]); + add(res, toYamlChar(s[i])); end; addChar(res, '"'); app(result, toRope(res)); diff --git a/nim/ccgexprs.pas b/nim/ccgexprs.pas index 97828680b..f94cff3a4 100644 --- a/nim/ccgexprs.pas +++ b/nim/ccgexprs.pas @@ -32,7 +32,7 @@ begin end; function genHexLiteral(v: PNode): PRope; -// hex literals are unsigned in C (at least I think so) +// hex literals are unsigned in C // so we don't generate hex literals any longer. begin if not (v.kind in [nkIntLit..nkInt64Lit]) then @@ -58,7 +58,13 @@ begin nkCharLit..nkInt64Lit: begin case skipVarGenericRange(ty).kind of tyChar, tyInt64, tyNil: result := intLiteral(v.intVal); - tyInt..tyInt32: begin + tyInt8: + result := ropef('((NI8) $1)', [intLiteral(biggestInt(int8(v.intVal)))]); + tyInt16: + result := ropef('((NI16) $1)', [intLiteral(biggestInt(int16(v.intVal)))]); + tyInt32: + result := ropef('((NI32) $1)', [intLiteral(biggestInt(int32(v.intVal)))]); + tyInt: begin if (v.intVal >= low(int32)) and (v.intVal <= high(int32)) then result := int32Literal(int32(v.intVal)) else @@ -436,8 +442,6 @@ begin InitLocExpr(p, e.sons[1], a); InitLocExpr(p, e.sons[2], b); appf(p.s[cpsStmts], frmt, [rdLoc(a), rdLoc(b)]); - freeTemp(p, a); - freeTemp(p, b) end; procedure unaryStmt(p: BProc; e: PNode; var d: TLoc; @@ -449,7 +453,6 @@ begin if magic <> '' then useMagic(p.module, magic); InitLocExpr(p, e.sons[1], a); appf(p.s[cpsStmts], frmt, [rdLoc(a)]); - freeTemp(p, a); end; procedure binaryStmtChar(p: BProc; e: PNode; var d: TLoc; @@ -462,8 +465,6 @@ begin InitLocExpr(p, e.sons[1], a); InitLocExpr(p, e.sons[2], b); appf(p.s[cpsStmts], frmt, [rdCharLoc(a), rdCharLoc(b)]); - freeTemp(p, a); - freeTemp(p, b) end; procedure binaryExpr(p: BProc; e: PNode; var d: TLoc; @@ -476,12 +477,7 @@ begin assert(e.sons[2].typ <> nil); InitLocExpr(p, e.sons[1], a); InitLocExpr(p, e.sons[2], b); - putIntoDest(p, d, e.typ, - ropef(frmt, [rdLoc(a), rdLoc(b), getTypeDesc(p.module, e.typ)])); - if d.k <> locExpr then begin // BACKPORT - freeTemp(p, a); - freeTemp(p, b) - end + putIntoDest(p, d, e.typ, ropef(frmt, [rdLoc(a), rdLoc(b)])); end; procedure binaryExprChar(p: BProc; e: PNode; var d: TLoc; @@ -495,10 +491,6 @@ begin InitLocExpr(p, e.sons[1], a); InitLocExpr(p, e.sons[2], b); putIntoDest(p, d, e.typ, ropef(frmt, [rdCharLoc(a), rdCharLoc(b)])); - if d.k <> locExpr then begin // BACKPORT - freeTemp(p, a); - freeTemp(p, b) - end end; procedure unaryExpr(p: BProc; e: PNode; var d: TLoc; @@ -508,10 +500,7 @@ var begin if magic <> '' then useMagic(p.module, magic); InitLocExpr(p, e.sons[1], a); - putIntoDest(p, d, e.typ, ropef(frmt, - [rdLoc(a), getTypeDesc(p.module, e.typ)])); - if d.k <> locExpr then // BACKPORT - freeTemp(p, a) + putIntoDest(p, d, e.typ, ropef(frmt, [rdLoc(a)])); end; procedure unaryExprChar(p: BProc; e: PNode; var d: TLoc; @@ -522,26 +511,90 @@ begin if magic <> '' then useMagic(p.module, magic); InitLocExpr(p, e.sons[1], a); putIntoDest(p, d, e.typ, ropef(frmt, [rdCharLoc(a)])); - if d.k <> locExpr then // BACKPORT - freeTemp(p, a) end; +procedure binaryArithOverflow(p: BProc; e: PNode; var d: TLoc; m: TMagic); const - binOverflowTab: array [mAddi..mModi64] of string = ( + prc: array [mAddi..mModi64] of string = ( 'addInt', 'subInt', 'mulInt', 'divInt', 'modInt', 'addInt64', 'subInt64', 'mulInt64', 'divInt64', 'modInt64' ); - binWoOverflowTab: array [mAddi..mModi64] of string = ( - '($3)($1 + $2)', '($3)($1 - $2)', '($3)($1 * $2)', '($3)($1 / $2)', - '($3)($1 % $2)', - '($1 + $2)', '($1 - $2)', '($1 * $2)', '($1 / $2)', '($1 % $2)' + opr: array [mAddi..mModi64] of string = ( + '+'+'', '-'+'', '*'+'', '/'+'', '%'+'', + '+'+'', '-'+'', '*'+'', '/'+'', '%'+'' + ); +var + a, b: TLoc; + t: PType; +begin + assert(e.sons[1].typ <> nil); + assert(e.sons[2].typ <> nil); + InitLocExpr(p, e.sons[1], a); + InitLocExpr(p, e.sons[2], b); + t := skipGenericRange(e.typ); + if getSize(t) >= platform.IntSize then begin + if optOverflowCheck in p.options then begin + useMagic(p.module, prc[m]); + putIntoDest(p, d, e.typ, ropef('$1($2, $3)', + [toRope(prc[m]), rdLoc(a), rdLoc(b)])); + end + else + putIntoDest(p, d, e.typ, ropef('(NI$4)($2 $1 $3)', + [toRope(opr[m]), rdLoc(a), rdLoc(b), toRope(getSize(t)*8)])); + end + else begin + if optOverflowCheck in p.options then begin + useMagic(p.module, 'raiseOverflow'); + if (m = mModI) or (m = mDivI) then begin + useMagic(p.module, 'raiseDivByZero'); + appf(p.s[cpsStmts], 'if (!$1) raiseDivByZero();$n', [rdLoc(b)]); + end; + a.r := ropef('((NI)($2) $1 (NI)($3))', + [toRope(opr[m]), rdLoc(a), rdLoc(b)]); + if d.k = locNone then getTemp(p, getSysType(tyInt), d); + genAssignment(p, d, a, {@set}[]); + appf(p.s[cpsStmts], 'if ($1 < $2 || $1 > $3) raiseOverflow();$n', + [rdLoc(d), intLiteral(firstOrd(t)), intLiteral(lastOrd(t))]); + d.t := e.typ; + d.r := ropef('(NI$1)($2)', [toRope(getSize(t)*8), rdLoc(d)]); + end + else + putIntoDest(p, d, e.typ, ropef('(NI$4)($2 $1 $3)', + [toRope(opr[m]), rdLoc(a), rdLoc(b), toRope(getSize(t)*8)])); + end +end; + +procedure unaryArithOverflow(p: BProc; e: PNode; var d: TLoc; m: TMagic); +const + opr: array [mUnaryMinusI..mAbsI64] of string = ( + '((NI$2)-($1))', // UnaryMinusI + '-($1)', // UnaryMinusI64 + '(NI$2)abs($1)', // AbsI + '($1 > 0? ($1) : -($1))' // AbsI64 ); +var + a: TLoc; + t: PType; +begin + assert(e.sons[1].typ <> nil); + InitLocExpr(p, e.sons[1], a); + t := skipGenericRange(e.typ); + if optOverflowCheck in p.options then begin + useMagic(p.module, 'raiseOverflow'); + appf(p.s[cpsStmts], 'if ($1 == $2) raiseOverflow();$n', + [rdLoc(a), intLiteral(firstOrd(t))]); + end; + putIntoDest(p, d, e.typ, ropef(opr[m], [rdLoc(a), toRope(getSize(t)*8)])); +end; + +procedure binaryArith(p: BProc; e: PNode; var d: TLoc; op: TMagic); +const binArithTab: array [mShrI..mXor] of string = ( - '($3)((NU)($1) >> (NU)($2))', // ShrI - '($3)((NU)($1) << (NU)($2))', // ShlI - '($3)($1 & $2)', // BitandI - '($3)($1 | $2)', // BitorI - '($3)($1 ^ $2)', // BitxorI + '(NI$3)((NU$3)($1) >> (NU$3)($2))', // ShrI + '(NI$3)((NU$3)($1) << (NU$3)($2))', // ShlI + '(NI$3)($1 & $2)', // BitandI + '(NI$3)($1 | $2)', // BitorI + '(NI$3)($1 ^ $2)', // BitxorI '(($1 <= $2) ? $1 : $2)', // MinI '(($1 >= $2) ? $1 : $2)', // MaxI '(NI64)((NU64)($1) >> (NU64)($2))', // ShrI64 @@ -559,11 +612,11 @@ const '(($1 <= $2) ? $1 : $2)', // MinF64 '(($1 >= $2) ? $1 : $2)', // MaxF64 - '($3)((NU)($1) + (NU)($2))', // AddU - '($3)((NU)($1) - (NU)($2))', // SubU - '($3)((NU)($1) * (NU)($2))', // MulU - '($3)((NU)($1) / (NU)($2))', // DivU - '($3)((NU)($1) % (NU)($2))', // ModU + '(NI$3)((NU$3)($1) + (NU$3)($2))', // AddU + '(NI$3)((NU$3)($1) - (NU$3)($2))', // SubU + '(NI$3)((NU$3)($1) * (NU$3)($2))', // MulU + '(NI$3)((NU$3)($1) / (NU$3)($2))', // DivU + '(NI$3)((NU$3)($1) % (NU$3)($2))', // ModU '(NI64)((NU64)($1) + (NU64)($2))', // AddU64 '(NI64)((NU64)($1) - (NU64)($2))', // SubU64 '(NI64)((NU64)($1) * (NU64)($2))', // MulU64 @@ -580,8 +633,8 @@ const '($1 <= $2)', // LeF64 '($1 < $2)', // LtF64 - '((NU)($1) <= (NU)($2))', // LeU - '((NU)($1) < (NU)($2))', // LtU + '((NU$3)($1) <= (NU$3)($2))', // LeU + '((NU$3)($1) < (NU$3)($2))', // LtU '((NU64)($1) <= (NU64)($2))', // LeU64 '((NU64)($1) < (NU64)($2))', // LtU64 @@ -604,16 +657,32 @@ const '($1 != $2)' // Xor ); +var + a, b: TLoc; + s: biggestInt; +begin + assert(e.sons[1].typ <> nil); + assert(e.sons[2].typ <> nil); + InitLocExpr(p, e.sons[1], a); + InitLocExpr(p, e.sons[2], b); + // BUGFIX: cannot use result-type here, as it may be a boolean + s := max(getSize(a.t), getSize(b.t))*8; + putIntoDest(p, d, e.typ, ropef(binArithTab[op], + [rdLoc(a), rdLoc(b), toRope(s)])); +end; + +procedure unaryArith(p: BProc; e: PNode; var d: TLoc; op: TMagic); +const unArithTab: array [mNot..mToBiggestInt] of string = ( '!($1)', // Not '$1', // UnaryPlusI - '(($2) ~($1))', // BitnotI - '+($1)', // UnaryPlusI64 + '(NI$2)((NU$2) ~($1))', // BitnotI + '$1', // UnaryPlusI64 '~($1)', // BitnotI64 - '+($1)', // UnaryPlusF64 + '$1', // UnaryPlusF64 '-($1)', // UnaryMinusF64 - '($1 > 0? ($1) : -($1))', // AbsF64; BUGFIX: fabs() makes problems for Tiny C, so we don't use it - + '($1 > 0? ($1) : -($1))', // AbsF64; BUGFIX: fabs() makes problems + // for Tiny C, so we don't use it '((NI)(NU)(NU8)($1))', // mZe8ToI '((NI64)(NU64)(NU8)($1))', // mZe8ToI64 '((NI)(NU)(NU16)($1))', // mZe16ToI @@ -630,70 +699,15 @@ const 'float64ToInt32($1)', // ToInt XXX: this is not correct! 'float64ToInt64($1)' // ToBiggestInt ); - unOverflowTab: array [mUnaryMinusI..mAbsI64] of string = ( - 'negInt', // UnaryMinusI - 'negInt64', // UnaryMinusI64 - 'absInt', // AbsI - 'absInt64' // AbsI64 - ); - unWoOverflowTab: array [mUnaryMinusI..mAbsI64] of string = ( - '(($2)-($1))', // UnaryMinusI - '-($1)', // UnaryMinusI64 - '($2)abs($1)', // AbsI - '($1 > 0? ($1) : -($1))' // AbsI64 - ); - -procedure binaryArith(p: BProc; e: PNode; var d: TLoc; op: TMagic); -begin - binaryExpr(p, e, d, '', binArithTab[op]) -end; - -procedure binaryArithOverflow(p: BProc; e: PNode; var d: TLoc; op: TMagic); var - a, b: TLoc; -begin - if not (optOverflowCheck in p.options) then - binaryExpr(p, e, d, '', binWoOverflowTab[op]) - else begin - case op of - mAddi..mModi: begin - if (skipGeneric(e.typ).kind = tyInt) then - binaryExpr(p, e, d, binOverflowTab[op], - binOverflowTab[op] + '($1, $2)') - else begin - InitLocExpr(p, e.sons[1], a); - InitLocExpr(p, e.sons[2], b); - UseMagic(p.module, binOverflowTab[op]); - UseMagic(p.module, 'raiseOverflow'); - a.r := ropef(binOverflowTab[op] + '($1, $2)', - [rdLoc(a), rdLoc(b)]); - if d.k = locNone then getTemp(p, getSysType(tyInt), d); - genAssignment(p, d, a, {@set}[]); - appf(p.s[cpsStmts], 'if ($1 < $2 || $1 > $3) raiseOverflow();$n', - [rdLoc(d), intLiteral(firstOrd(e.typ)), - intLiteral(lastOrd(e.typ))]); - d.t := e.typ; - d.r := ropef('($1)($2)', [getTypeDesc(p.module, e.typ), rdLoc(d)]); - end - end; - mAddi64..mModi64: - binaryExpr(p, e, d, binOverflowTab[op], binOverflowTab[op] + '($1, $2)'); - else InternalError(e.info, 'binaryArithOverflow'); - end - end -end; - -procedure unaryArith(p: BProc; e: PNode; var d: TLoc; op: TMagic); -begin - unaryExpr(p, e, d, '', unArithTab[op]) -end; - -procedure unaryArithOverflow(p: BProc; e: PNode; var d: TLoc; op: TMagic); + a: TLoc; + t: PType; begin - if optOverflowCheck in p.options then - unaryExpr(p, e, d, unOverflowTab[op], '($2)' + unOverflowTab[op] + '($1)') - else - unaryExpr(p, e, d, '', unWoOverflowTab[op]) + assert(e.sons[1].typ <> nil); + InitLocExpr(p, e.sons[1], a); + t := skipGenericRange(e.typ); + putIntoDest(p, d, e.typ, ropef(unArithTab[op], + [rdLoc(a), toRope(getSize(t)*8)])); end; procedure genDeref(p: BProc; e: PNode; var d: TLoc); @@ -707,7 +721,7 @@ begin case skipGeneric(a.t).kind of tyRef: d.s := OnHeap; tyVar: d.s := OnUnknown; - tyPtr: d.s := OnStack; + tyPtr: d.s := OnUnknown; // BUGFIX! else InternalError(e.info, 'genDeref ' + typekindToStr[a.t.kind]); end; putIntoDest(p, d, a.t.sons[0], ropef('(*$1)', [rdLoc(a)])); @@ -723,7 +737,6 @@ begin else begin InitLocExpr(p, e.sons[0], a); putIntoDest(p, d, e.typ, addrLoc(a)); - if d.k <> locExpr then freeTemp(p, a) end end; @@ -834,7 +847,7 @@ begin ty := skipPtrsGeneric(skipVarGenericRange(a.t)); first := intLiteral(firstOrd(ty)); // emit range check: - if (optBoundsCheck in p.options) then + if (optBoundsCheck in p.options) then begin if b.k <> locImmediate then begin // semantic pass has already checked: useMagic(p.module, 'raiseIndexError'); if firstOrd(ty) = 0 then begin @@ -848,11 +861,10 @@ begin 'if ($1 < $2 || $1 > $3) raiseIndexError();$n', [rdCharLoc(b), first, intLiteral(lastOrd(ty))]) end; + end; if d.k = locNone then d.s := a.s; putIntoDest(p, d, elemType(skipVarGeneric(ty)), ropef('$1[($2)-$3]', [rdLoc(a), rdCharLoc(b), first])); - // freeTemp(p, a); // backport - // freeTemp(p, b) end; procedure genCStringElem(p: BProc; e: PNode; var d: TLoc); @@ -866,8 +878,6 @@ begin if d.k = locNone then d.s := a.s; putIntoDest(p, d, elemType(skipVarGeneric(ty)), ropef('$1[$2]', [rdLoc(a), rdCharLoc(b)])); - // freeTemp(p, a); // backport - // freeTemp(p, b) end; procedure genOpenArrayElem(p: BProc; e: PNode; var d: TLoc); @@ -880,13 +890,12 @@ begin if (optBoundsCheck in p.options) then begin useMagic(p.module, 'raiseIndexError'); appf(p.s[cpsStmts], - 'if ((NU)($1) > (NU)($2Len0)) raiseIndexError();$n', [rdLoc(b), rdLoc(a)]) + 'if ((NU)($1) >= (NU)($2Len0)) raiseIndexError();$n', [rdLoc(b), rdLoc(a)]) + // BUGFIX: ``>=`` and not ``>``! end; if d.k = locNone then d.s := a.s; putIntoDest(p, d, elemType(skipVarGeneric(a.t)), ropef('$1[$2]', [rdLoc(a), rdCharLoc(b)])); - // freeTemp(p, a); // backport - // freeTemp(p, b) end; procedure genSeqElem(p: BPRoc; e: PNode; var d: TLoc); @@ -915,8 +924,6 @@ begin a.r := ropef('(*$1)', [a.r]); putIntoDest(p, d, elemType(skipVarGeneric(a.t)), ropef('$1->data[$2]', [rdLoc(a), rdCharLoc(b)])); - // freeTemp(p, a); // backport - // freeTemp(p, b) end; procedure genAndOr(p: BProc; e: PNode; var d: TLoc; m: TMagic); @@ -955,10 +962,8 @@ begin fixLabel(p, L); if d.k = locNone then d := tmp - else begin + else genAssignment(p, d, tmp, {@set}[]); // no need for deep copying - freeTemp(p, tmp); - end end; procedure genIfExpr(p: BProc; n: PNode; var d: TLoc); @@ -989,7 +994,6 @@ begin initLocExpr(p, it.sons[0], a); Lelse := getLabel(p); appf(p.s[cpsStmts], 'if (!$1) goto $2;$n', [rdLoc(a), Lelse]); - freeTemp(p, a); expr(p, it.sons[1], tmp); appf(p.s[cpsStmts], 'goto $1;$n', [Lend]); fixLabel(p, Lelse); @@ -1003,10 +1007,8 @@ begin fixLabel(p, Lend); if d.k = locNone then d := tmp - else begin + else genAssignment(p, d, tmp, {@set}[]); // no need for deep copying - freeTemp(p, tmp); - end end; procedure genCall(p: BProc; t: PNode; var d: TLoc); @@ -1111,14 +1113,10 @@ begin appf(p.s[cpsStmts], '$1 = rawNewString($2$3);$n', [tmp.r, lens, toRope(L)]); app(p.s[cpsStmts], appends); - for i := 0 to high(a) do - freeTemp(p, a[i]); if d.k = locNone then d := tmp - else begin + else genAssignment(p, d, tmp, {@set}[]); // no need for deep copying - freeTemp(p, tmp); // BACKPORT - end end; procedure genStrAppend(p: BProc; e: PNode; var d: TLoc); @@ -1170,8 +1168,6 @@ begin appf(p.s[cpsStmts], '$1 = resizeString($1, $2$3);$n', [rdLoc(a[0]), lens, toRope(L)]); app(p.s[cpsStmts], appends); - for i := 0 to high(a) do - freeTemp(p, a[i]) end; procedure genSeqElemAppend(p: BProc; e: PNode; var d: TLoc); @@ -1376,8 +1372,6 @@ begin [addrLoc(a), genTypeInfo(p.module, t)])) end end; - if d.k <> locExpr then - freeTemp(p, a); end; procedure genDollar(p: BProc; n: PNode; var d: TLoc; const magic, frmt: string); @@ -1441,8 +1435,6 @@ begin '$1 = ($3) setLengthSeq(&($1)->Sup, sizeof($4), $2);$n', [rdLoc(a), rdLoc(b), getTypeDesc(p.module, t), getTypeDesc(p.module, t.sons[0])]); - freeTemp(p, a); - freeTemp(p, b) end; procedure genSetLengthStr(p: BProc; e: PNode; var d: TLoc); @@ -1464,7 +1456,6 @@ begin genAssignment(p, tmp, a, {@set}[]); genAssignment(p, a, b, {@set}[]); genAssignment(p, b, tmp, {@set}[]); - freeTemp(p, tmp); // BACKPORT end; // -------------------- set operations ------------------------------------ @@ -1496,10 +1487,6 @@ procedure binaryExprIn(p: BProc; e: PNode; var a, b, d: TLoc; const frmt: string); begin putIntoDest(p, d, e.typ, ropef(frmt, [rdLoc(a), rdSetElemLoc(b, a.t)])); - if d.k <> locExpr then begin - freeTemp(p, a); - freeTemp(p, b) - end end; procedure genInExprAux(p: BProc; e: PNode; var a, b, d: TLoc); @@ -1521,8 +1508,6 @@ begin InitLocExpr(p, e.sons[1], a); InitLocExpr(p, e.sons[2], b); appf(p.s[cpsStmts], frmt, [rdLoc(a), rdSetElemLoc(b, a.t)]); - freeTemp(p, a); - freeTemp(p, b) end; procedure genInOp(p: BProc; e: PNode; var d: TLoc); @@ -1557,10 +1542,6 @@ begin end; app(b.r, ')'+''); putIntoDest(p, d, e.typ, b.r); - if d.k <> locExpr then begin - for i := 0 to high(c) do freeTemp(p, c[i]); - freeTemp(p, a) - end end else begin assert(e.sons[1].typ <> nil); @@ -1635,9 +1616,6 @@ begin if d.k = locNone then getTemp(p, a.t, d); appf(p.s[cpsStmts], lookupOpr[op], [rdLoc(i), toRope(size), rdLoc(d), rdLoc(a), rdLoc(b)]); - freeTemp(p, a); - freeTemp(p, b); - freeTemp(p, i) end; mEqSet: binaryExprChar(p, e, d, '', @@ -1652,9 +1630,6 @@ begin 'for ($1 = 0; $1 < $2; $1++) $n' + ' $3[$1] = $4[$1] $6 $5[$1];$n', [rdLoc(i), toRope(size), rdLoc(d), rdLoc(a), rdLoc(b), toRope(lookupOpr[op])]); - freeTemp(p, a); - freeTemp(p, b); - freeTemp(p, i) end; mInSet: genInOp(p, e, d); else internalError(e.info, 'genSetOp') @@ -1686,7 +1661,6 @@ begin else putIntoDest(p, d, e.typ, ropef('(($1) ($2))', [getTypeDesc(p.module, e.typ), rdCharLoc(a)])); - if d.k <> locExpr then freeTemp(p, a) end; procedure genRangeChck(p: BProc; n: PNode; var d: TLoc; const magic: string); @@ -1704,11 +1678,11 @@ begin InitLocExpr(p, n.sons[0], a); useMagic(p.module, magic); putIntoDest(p, d, dest, - ropef('(($1)' +{&} magic +{&} '($2, $3, $4))', + ropef('(($1)$5($2, $3, $4))', [getTypeDesc(p.module, dest), rdCharLoc(a), genLiteral(p, n.sons[1], dest), - genLiteral(p, n.sons[2], dest)])); - if d.k <> locExpr then freeTemp(p, a) + genLiteral(p, n.sons[2], dest), + toRope(magic)])); end end; @@ -1722,19 +1696,25 @@ var a: TLoc; dest: PType; begin + while n.sons[0].kind = nkPassAsOpenArray do + n.sons[0] := n.sons[0].sons[0]; // BUGFIX dest := skipVarGeneric(n.typ); - initLocExpr(p, n.sons[0], a); - case skipVarGeneric(a.t).kind of - tyOpenArray: + case skipVarGeneric(n.sons[0].typ).kind of + tyOpenArray: begin + initLocExpr(p, n.sons[0], a); putIntoDest(p, d, dest, ropef('$1, $1Len0', [rdLoc(a)])); - tyString, tySequence: + end; + tyString, tySequence: begin + initLocExpr(p, n.sons[0], a); putIntoDest(p, d, dest, ropef('$1->data, $1->Sup.len', [rdLoc(a)])); - tyArray, tyArrayConstr: + end; + tyArray, tyArrayConstr: begin + initLocExpr(p, n.sons[0], a); putIntoDest(p, d, dest, ropef('$1, $2', [rdLoc(a), toRope(lengthOrd(a.t))])); + end else InternalError(n.sons[0].info, 'passToOpenArray: ' + typeToString(a.t)) - end; - if d.k <> locExpr then freeTemp(p, a) + end end; procedure convStrToCStr(p: BProc; n: PNode; var d: TLoc); @@ -1743,7 +1723,6 @@ var begin initLocExpr(p, n.sons[0], a); putIntoDest(p, d, skipVarGeneric(n.typ), ropef('$1->data', [rdLoc(a)])); - if d.k <> locExpr then freeTemp(p, a) end; procedure convCStrToStr(p: BProc; n: PNode; var d: TLoc); @@ -1754,7 +1733,6 @@ begin initLocExpr(p, n.sons[0], a); putIntoDest(p, d, skipVarGeneric(n.typ), ropef('cstrToNimstr($1)', [rdLoc(a)])); - if d.k <> locExpr then freeTemp(p, a) end; procedure genStrEquals(p: BProc; e: PNode; var d: TLoc); @@ -1846,7 +1824,6 @@ begin InitLocExpr(p, e.sons[1], a); assert(a.t <> nil); expr(p, e.sons[2], a); - freeTemp(p, a) end; mSwap: genSwap(p, e, d); mPred: begin // XXX: range checking? @@ -1978,15 +1955,11 @@ begin '$2[$1/8] |=(1<<($1%8));$n', [rdLoc(idx), rdLoc(d), rdSetElemLoc(a, e.typ), rdSetElemLoc(b, e.typ)]); - freeTemp(p, a); - freeTemp(p, b); - freeTemp(p, idx) end else begin initLocExpr(p, e.sons[i], a); appf(p.s[cpsStmts], '$1[$2/8] |=(1<<($2%8));$n', [rdLoc(d), rdSetElemLoc(a, e.typ)]); - freeTemp(p, a) end end end @@ -2003,9 +1976,6 @@ begin '$2 |=(1<<((' +{&} ts +{&} ')($1)%(sizeof(' +{&}ts+{&}')*8)));$n', [rdLoc(idx), rdLoc(d), rdSetElemLoc(a, e.typ), rdSetElemLoc(b, e.typ)]); - freeTemp(p, a); - freeTemp(p, b); - freeTemp(p, idx) end else begin initLocExpr(p, e.sons[i], a); @@ -2013,7 +1983,6 @@ begin '$1 |=(1<<((' +{&} ts +{&} ')($2)%(sizeof(' +{&}ts+{&} ')*8)));$n', [rdLoc(d), rdSetElemLoc(a, e.typ)]); - freeTemp(p, a) end end end @@ -2191,7 +2160,8 @@ begin nkStrLit..nkTripleStrLit, nkIntLit..nkInt64Lit, nkFloatLit..nkFloat64Lit, nkNilLit, nkCharLit: begin putIntoDest(p, d, e.typ, genLiteral(p, e)); - d.k := locImmediate // for removal of index checks + if d.k in [locNone, locExpr] then + d.k := locImmediate // for removal of index checks end; nkCall, nkHiddenCallConv, nkInfix, nkPrefix, nkPostfix, nkCommand: begin if (e.sons[0].kind = nkSym) and diff --git a/nim/ccgstmts.pas b/nim/ccgstmts.pas index b00751edd..0e93d6b0f 100644 --- a/nim/ccgstmts.pas +++ b/nim/ccgstmts.pas @@ -141,7 +141,6 @@ begin initLocExpr(p, it.sons[0], a); Lelse := getLabel(p); appf(p.s[cpsStmts], 'if (!$1) goto $2;$n', [rdLoc(a), Lelse]); - freeTemp(p, a); genStmts(p, it.sons[1]); if sonsLen(n) > 1 then appf(p.s[cpsStmts], 'goto $1;$n', [Lend]); @@ -179,7 +178,6 @@ begin p.blocks[len].id := abs(p.blocks[len].id); appf(p.s[cpsStmts], 'if (!$1) goto $2;$n', [rdLoc(a), Labl]); end; - freeTemp(p, a); genStmts(p, t.sons[1]); if p.blocks[len].id > 0 then appf(p.s[cpsStmts], '} $1: ;$n', [Labl]) @@ -286,7 +284,6 @@ begin if gCmd <> cmdCompileToCpp then useMagic(p.module, 'raiseException'); InitLocExpr(p, t.sons[0], a); e := rdLoc(a); - freeTemp(p, a); typ := t.sons[0].typ; while typ.kind in [tyVar, tyRef, tyPtr] do typ := typ.sons[0]; appf(p.s[cpsStmts], getRaiseFrmt(p), @@ -306,10 +303,11 @@ end; // ---------------- case statement generation ----------------------------- const - stringCaseThreshold = 1000; //4; // above X strings a hash-switch for strings - // is generated - // this version sets it too high to avoid hashing, because the hashing - // algorithm won't be the same; I don't know why + stringCaseThreshold = 100000; + // above X strings a hash-switch for strings is generated + // this version sets it too high to avoid hashing, because this has not + // been tested for a long time + // XXX test and enable this optimization! procedure genCaseGenericBranch(p: BProc; b: PNode; const e: TLoc; const rangeFormat, eqFormat: TFormatStr; @@ -323,14 +321,11 @@ begin if b.sons[i].kind = nkRange then begin initLocExpr(p, b.sons[i].sons[0], x); initLocExpr(p, b.sons[i].sons[1], y); - freeTemp(p, x); - freeTemp(p, y); appf(p.s[cpsStmts], rangeFormat, [rdCharLoc(e), rdCharLoc(x), rdCharLoc(y), labl]) end else begin initLocExpr(p, b.sons[i], x); - freeTemp(p, x); appf(p.s[cpsStmts], eqFormat, [rdCharLoc(e), rdCharLoc(x), labl]) end @@ -377,7 +372,6 @@ begin end; // second pass: generate statements genCaseSecondPass(p, t, labId); - freeTemp(p, a) end; {@ignore} @@ -402,24 +396,24 @@ begin b := 0; for i := 0 to Length(s)-1 do begin b := b +{%} Ord(s[i]); - b := b +{%} b shl 10; - b := b xor (b shr 6) + b := b +{%} shlu(b, 10); + b := b xor shru(b, 6) end; - b := b +{%} b shl 3; - b := b xor (b shr 11); - b := b +{%} b shl 15; + b := b +{%} shlu(b, 3); + b := b xor shru(b, 11); + b := b +{%} shlu(b, 15); result := b end else begin a := 0; for i := 0 to Length(s)-1 do begin a := a +{%} int32(Ord(s[i])); - a := a +{%} a shl int32(10); - a := a xor (a shr int32(6)); + a := a +{%} shlu(a, int32(10)); + a := a xor shru(a, int32(6)); end; - a := a +{%} a shl int32(3); - a := a xor (a shr int32(11)); - a := a +{%} a shl int32(15); + a := a +{%} shlu(a, int32(3)); + a := a xor shru(a, int32(11)); + a := a +{%} shlu(a, int32(15)); result := a end end; @@ -448,7 +442,6 @@ begin for i := 0 to len - 2 do begin assert(b.sons[i].kind <> nkRange); initLocExpr(p, b.sons[i], x); - freeTemp(p, x); assert(b.sons[i].kind in [nkStrLit..nkTripleStrLit]); j := int(hashString(b.sons[i].strVal) and high(branches)); appf(branches[j], 'if (eqStrings($1, $2)) goto $3;$n', @@ -499,7 +492,6 @@ begin appf(p.s[cpsStmts], 'goto LA$1;$n', [toRope(p.labels)]); // third pass: generate statements genCaseSecondPass(p, t, labId); - freeTemp(p, a); end else genCaseGeneric(p, t, '', 'if (eqStrings($1, $2)) goto $3;$n') @@ -541,7 +533,6 @@ begin if canGenerateSwitch then begin initLocExpr(p, t.sons[0], a); appf(p.s[cpsStmts], 'switch ($1) {$n', [rdCharLoc(a)]); - freeTemp(p, a); for i := 1 to sonsLen(t)-1 do begin if t.sons[i].kind = nkOfBranch then begin len := sonsLen(t.sons[i]); @@ -823,7 +814,6 @@ begin InitLocExpr(p, e.sons[0], a); assert(a.t <> nil); expr(p, e.sons[1], a); - freeTemp(p, a) end; procedure genStmts(p: BProc; t: PNode); @@ -852,13 +842,11 @@ begin nkCall: begin genLineDir(p, t); initLocExpr(p, t, a); - freeTemp(p, a); end; nkAsgn: genAsgn(p, t); nkDiscardStmt: begin genLineDir(p, t); initLocExpr(p, t.sons[0], a); - freeTemp(p, a) end; nkAsmStmt: genAsmStmt(p, t); nkTryStmt: begin @@ -880,8 +868,11 @@ begin if (t.sons[codePos] <> nil) or (lfDynamicLib in prc.loc.flags) then begin // BUGFIX if IntSetContainsOrIncl(p.module.debugDeclared, prc.id) then begin - internalError(t.info, 'genProc()'); // XXX: remove this check! + internalError(t.info, 'genStmts(): ' + toString(prc.id)); + // XXX: remove this check! end; + //if IntSetContains(p.module.debugDeclared, 2642) then + // InternalError(t.info, 'this sucks ' + toString(prc.id)); genProc(p.module, prc) end //else if sfCompilerProc in prc.flags then genProcPrototype(prc); diff --git a/nim/ccgtypes.pas b/nim/ccgtypes.pas index 2c238ce84..5f4def667 100644 --- a/nim/ccgtypes.pas +++ b/nim/ccgtypes.pas @@ -33,7 +33,10 @@ begin 'A'..'Z': addChar(result, chr(ord(name[i]) - ord('A') + ord('a'))); '_': begin end; 'a'..'z', '0'..'9': addChar(result, name[i]); - else result := result + 'HEX' +{&} toHex(ord(name[i]), 2); + else begin + add(result, 'HEX'); + add(result, toHex(ord(name[i]), 2)) + end end end end; @@ -92,6 +95,7 @@ begin 1: result := ctUInt8; 2: result := ctUInt16; 4: result := ctInt32; + 8: result := ctInt64; else internalError('mapType'); end end @@ -284,8 +288,10 @@ begin 1: result := typeNameOrLiteral(typ, 'NU8'); 2: result := typeNameOrLiteral(typ, 'NU16'); 4: result := typeNameOrLiteral(typ, 'NI32'); + 8: result := typeNameOrLiteral(typ, 'NI64'); else begin - internalError('getSimpleTypeDesc()'); + internalError(typ.sym.info, + 'getSimpleTypeDesc: ' + toString(getSize(typ))); result := nil end end @@ -885,7 +891,7 @@ begin dataGen := true end; tyObject: begin - if sfPure in t.sym.flags then + if isPureObject(t) then id := getID() else begin id := t.id; @@ -943,7 +949,7 @@ begin genEnumInfo(m, t, ropef('NTI$1', [toRope(t.id)])); end; tyObject: begin - if not (sfPure in t.sym.flags) then begin + if not isPureObject(t) then begin useMagic(m, 'TNimType'); useMagic(m, 'TNimNode'); genObjectInfo(m, t, ropef('NTI$1', [toRope(t.id)])); diff --git a/nim/ccgutils.pas b/nim/ccgutils.pas index 8e3775d22..05f2ea828 100644 --- a/nim/ccgutils.pas +++ b/nim/ccgutils.pas @@ -39,7 +39,7 @@ begin if key = nil then exit; case key.Kind of tyEmpty, tyChar, tyBool, tyNil, tyPointer, tyString, tyCString, - tyInt..tyFloat128, tyProc, tyEnum, tyObject, tyAnyEnum: begin end; + tyInt..tyFloat128, tyProc, tyAnyEnum: begin end; tyNone, tyForward: InternalError('GetUniqueType: ' + typeToString(key)); tyGenericParam, tyGeneric, tySequence, @@ -54,6 +54,13 @@ begin end; IdTablePut(gTypeTable, key, key); end; + tyObject, tyEnum: begin + result := PType(IdTableGet(gTypeTable, key)); + if result = nil then begin + IdTablePut(gTypeTable, key, key); + result := key; + end + end; tyGenericInst: result := GetUniqueType(lastSon(key)); end; end; @@ -102,11 +109,14 @@ begin res := '"'+''; for i := strStart to length(s)+strStart-1 do begin if (i-strStart+1) mod MaxLineLength = 0 then begin - res := res +{&} '"' +{&} nl; - app(result, toRope(res)); - res := '"'+''; // reset + add(res, '"'); + add(res, nl); + app(result, toRope(res)); + // reset: + setLength(res, 1); + res[strStart] := '"'; end; - res := res +{&} toCChar(s[i]); + add(res, toCChar(s[i])); end; addChar(res, '"'); app(result, toRope(res)); diff --git a/nim/cgen.pas b/nim/cgen.pas index 2f89c4208..736d4b796 100644 --- a/nim/cgen.pas +++ b/nim/cgen.pas @@ -207,10 +207,6 @@ begin result.flags := {@set}[]; end; -procedure freeTemp(p: BProc; const temp: TLoc); -begin -end; - // -------------------------- Variable manager ---------------------------- procedure declareGlobalVar(m: BModule; s: PSym); @@ -318,8 +314,8 @@ var tmp: PRope; begin assert(lib <> nil); - if lib.kind = libDynamic then begin - lib.kind := libDynamicGenerated; + if not lib.generated then begin + lib.generated := true; useMagic(m, 'nimLoadLibrary'); useMagic(m, 'nimUnloadLibrary'); useMagic(m, 'NimStringDesc'); diff --git a/nim/condsyms.pas b/nim/condsyms.pas index c018a37ea..9c5d64d4b 100644 --- a/nim/condsyms.pas +++ b/nim/condsyms.pas @@ -102,6 +102,7 @@ begin case targetCPU of cpuI386: DefineSymbol('x86'); cpuIa64: DefineSymbol('itanium'); + cpuAmd64: DefineSymbol('x8664'); else begin end end; case targetOS of diff --git a/nim/crc.pas b/nim/crc.pas index 429f0ec30..e14716605 100644 --- a/nim/crc.pas +++ b/nim/crc.pas @@ -126,7 +126,8 @@ const function updateCrc32(val: Byte; crc: TCrc32): TCrc32; overload; begin - result := crc32Table[(int(crc) xor (int(val) and $ff)) and $ff] xor (int(crc) shr 8); + result := TCrc32(crc32Table[(int(crc) xor (int(val) and $ff)) and $ff]) xor + (crc shr TCrc32(8)); end; function updateCrc32(val: Char; crc: TCrc32): TCrc32; overload; diff --git a/nim/debugids.pas b/nim/debugids.pas new file mode 100644 index 000000000..fff9ed10b --- /dev/null +++ b/nim/debugids.pas @@ -0,0 +1,129 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit debugids; + +interface + +{$include 'config.inc'} + +uses + nsystem, nos, strutils, ast; + +const + idfile = 'debugids.txt'; + +// This module implements debugging facilities for the ID mechanism. +procedure registerID(s: PSym); + +procedure writeIDTable(); +procedure loadIDTable(); + +implementation + +type + TIdSymTuple = record{@tuple} // keep id from sym to better detect bugs + id: int; + s: PSym; + end; + TIdSymTupleSeq = array of TIdSymTuple; + TIdSymTable = record + counter: int; + data: TIdSymTupleSeq; + end; + +function TableRawGet(const t: TTable; key: PObject): int; +var + h: THash; +begin + h := hashNode(key) and high(t.data); // start with real hash value + while t.data[h].key <> nil do begin + if (t.data[h].key = key) then begin + result := h; exit + end; + h := nextTry(h, high(t.data)) + end; + result := -1 +end; + +function TableSearch(const t: TTable; key, closure: PObject; + comparator: TCmpProc): PObject; +var + h: THash; +begin + h := hashNode(key) and high(t.data); // start with real hash value + while t.data[h].key <> nil do begin + if (t.data[h].key = key) then + if comparator(t.data[h].val, closure) then begin // BUGFIX 1 + result := t.data[h].val; exit + end; + h := nextTry(h, high(t.data)) + end; + result := nil +end; + +function TableGet(const t: TTable; key: PObject): PObject; +var + index: int; +begin + index := TableRawGet(t, key); + if index >= 0 then result := t.data[index].val + else result := nil +end; + +procedure TableRawInsert(var data: TPairSeq; key, val: PObject); +var + h: THash; +begin + h := HashNode(key) and high(data); + while data[h].key <> nil do begin + assert(data[h].key <> key); + h := nextTry(h, high(data)) + end; + assert(data[h].key = nil); + data[h].key := key; + data[h].val := val; +end; + +procedure TableEnlarge(var t: TTable); +var + n: TPairSeq; + i: int; +begin +{@ignore} + n := emptySeq; + setLength(n, length(t.data) * growthFactor); + fillChar(n[0], length(n)*sizeof(n[0]), 0); +{@emit + newSeq(n, length(t.data) * growthFactor); } + for i := 0 to high(t.data) do + if t.data[i].key <> nil then + TableRawInsert(n, t.data[i].key, t.data[i].val); +{@ignore} + t.data := n; +{@emit + swap(t.data, n); +} +end; + +procedure TablePut(var t: TTable; key, val: PObject); +var + index: int; +begin + index := TableRawGet(t, key); + if index >= 0 then + t.data[index].val := val + else begin + if mustRehash(length(t.data), t.counter) then TableEnlarge(t); + TableRawInsert(t.data, key, val); + inc(t.counter) + end; +end; + + +end. diff --git a/nim/depends.pas b/nim/depends.pas new file mode 100644 index 000000000..d8b978142 --- /dev/null +++ b/nim/depends.pas @@ -0,0 +1,97 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit depends; + +// This module implements a dependency file generator. + +interface + +{$include 'config.inc'} + +uses + nsystem, nos, options, ast, astalgo, msgs, ropes, idents, passes, importer; + +function genDependPass(): TPass; +procedure generateDot(const project: string); + +implementation + +type + TGen = object(TPassContext) + module: PSym; + filename: string; + end; + PGen = ^TGen; + +var + gDotGraph: PRope; // the generated DOT file; we need a global variable + +procedure addDependencyAux(const importing, imported: string); +begin + appf(gDotGraph, '$1 -> $2;$n', [toRope(importing), + toRope(imported)]); + // s1 -> s2_4 [label="[0-9]"]; +end; + +function addDotDependency(c: PPassContext; n: PNode): PNode; +var + i: int; + g: PGen; + imported: string; +begin + result := n; + if n = nil then exit; + g := PGen(c); + case n.kind of + nkImportStmt: begin + for i := 0 to sonsLen(n)-1 do begin + imported := getFileTrunk(getModuleFile(n.sons[i])); + addDependencyAux(g.module.name.s, imported); + end + end; + nkFromStmt: begin + imported := getFileTrunk(getModuleFile(n.sons[0])); + addDependencyAux(g.module.name.s, imported); + end; + nkStmtList, nkBlockStmt, nkStmtListExpr, nkBlockExpr: begin + for i := 0 to sonsLen(n)-1 do {@discard} addDotDependency(c, n.sons[i]); + end + else begin end + end +end; + +procedure generateDot(const project: string); +begin + writeRope( + ropef('digraph $1 {$n$2}$n', [ + toRope(changeFileExt(extractFileName(project), '')), gDotGraph]), + changeFileExt(project, 'dot') ); +end; + +function myOpen(module: PSym; const filename: string): PPassContext; +var + g: PGen; +begin + new(g); +{@ignore} + fillChar(g^, sizeof(g^), 0); +{@emit} + g.module := module; + g.filename := filename; + result := g; +end; + +function gendependPass(): TPass; +begin + initPass(result); + result.open := myOpen; + result.process := addDotDependency; +end; + +end. diff --git a/nim/docgen.pas b/nim/docgen.pas index fd835db57..19dc93a91 100644 --- a/nim/docgen.pas +++ b/nim/docgen.pas @@ -209,10 +209,10 @@ end; procedure addXmlChar(var dest: string; c: Char); begin case c of - '&': dest := dest + '&'; - '<': dest := dest + '<'; - '>': dest := dest + '>'; - '"': dest := dest + '"'; + '&': add(dest, '&'); + '<': add(dest, '<'); + '>': add(dest, '>'); + '"': add(dest, '"'); else addChar(dest, c) end end; @@ -292,8 +292,7 @@ var a, h: PRstNode; begin inc(d.id); - result := ropef('<em id="$1">$2</em>', - [toRope(d.id), renderAux(d, n)]); + result := ropef('<em id="$1">$2</em>', [toRope(d.id), renderAux(d, n)]); h := newRstNode(rnHyperlink); a := newRstNode(rnLeaf, d.indexValFilename +{&} '#' +{&} toString(d.id)); addSon(h, a); @@ -709,8 +708,8 @@ begin g.len+g.start-1+strStart)); else appf(result, '<span class="$2">$1</span>', - [toRope(ncopy(m.text, g.start+strStart, - g.len+g.start-1+strStart)), + [toRope(toXml(ncopy(m.text, g.start+strStart, + g.len+g.start-1+strStart))), toRope(tokenClassToStr[g.kind])]); end; end; diff --git a/nim/evals.pas b/nim/evals.pas new file mode 100644 index 000000000..bb14f8be9 --- /dev/null +++ b/nim/evals.pas @@ -0,0 +1,1308 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit evals; + +// This file implements the evaluator for Nimrod code. +// The evaluator is very slow, but simple. Since this +// is used mainly for evaluating macros and some other +// stuff at compile time, performance is not that +// important. + +interface + +{$include 'config.inc'} + +uses + sysutils, nsystem, charsets, strutils, magicsys, + lists, options, ast, astalgo, trees, treetab, nimsets, + msgs, nos, condsyms, idents, rnimsyn, types, passes, semfold; + +type + PStackFrame = ^TStackFrame; + TStackFrame = record + mapping: TIdNodeTable; // mapping from symbols to nodes + prc: PSym; // current prc; proc that is evaluated + call: PNode; // current for stmt + next: PStackFrame; // for stacking + params: TNodeSeq; // parameters passed to the proc + end; + + TEvalContext = object(passes.TPassContext) + module: PSym; + tos: PStackFrame; // top of a tos tos + lastException: PNode; + end; + PEvalContext = ^TEvalContext; + +function newStackFrame(): PStackFrame; +procedure pushStackFrame(c: PEvalContext; t: PStackFrame); +procedure popStackFrame(c: PEvalContext); + +function newEvalContext(module: PSym; const filename: string): PEvalContext; + +function eval(c: PEvalContext; n: PNode): PNode; +// eval never returns nil! This simplifies the code a lot and +// makes it faster too. + +function evalPass(): TPass; + +implementation + +const + evalMaxIterations = 10000000; // max iterations of all loops + evalMaxRecDepth = 100000; // max recursion depth for evaluation + +var + emptyNode: PNode; + +function newStackFrame(): PStackFrame; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit} + initIdNodeTable(result.mapping); +{@emit result.params := @[];} +end; + +function newEvalContext(module: PSym; const filename: string): PEvalContext; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit} + result.module := module; +end; + +procedure pushStackFrame(c: PEvalContext; t: PStackFrame); +begin + t.next := c.tos; + c.tos := t; +end; + +procedure popStackFrame(c: PEvalContext); +begin + if (c.tos = nil) then InternalError('popStackFrame'); + c.tos := c.tos.next; +end; + +function evalAux(c: PEvalContext; n: PNode): PNode; forward; + +procedure stackTraceAux(x: PStackFrame); +begin + if x <> nil then begin + stackTraceAux(x.next); + messageOut(format('file: $1, line: $2', [toFilename(x.call.info), + toString(toLineNumber(x.call.info))])); + end +end; + +procedure stackTrace(c: PEvalContext; n: PNode; msg: TMsgKind; + const arg: string = ''); +begin + messageOut('stack trace: (most recent call last)'); + stackTraceAux(c.tos); + liMessage(n.info, msg, arg); +end; + +function evalIf(c: PEvalContext; n: PNode): PNode; +var + i, len: int; +begin + i := 0; + len := sonsLen(n); + while (i < len) and (sonsLen(n.sons[i]) >= 2) do begin + result := evalAux(c, n.sons[i].sons[0]); + if result.kind = nkExceptBranch then exit; + if (result.kind = nkIntLit) and (result.intVal <> 0) then begin + result := evalAux(c, n.sons[i].sons[1]); + exit + end; + inc(i) + end; + if (i < len) and (sonsLen(n.sons[i]) < 2) then // eval else-part + result := evalAux(c, n.sons[0]) + else + result := emptyNode +end; + +function evalCase(c: PEvalContext; n: PNode): PNode; +var + i, j: int; + res: PNode; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + res := result; + result := emptyNode; + for i := 1 to sonsLen(n)-1 do begin + if n.sons[i].kind = nkOfBranch then begin + for j := 0 to sonsLen(n.sons[i])-2 do begin + if overlap(res, n.sons[i].sons[j]) then begin + result := evalAux(c, lastSon(n.sons[i])); + exit + end + end + end + else begin + result := evalAux(c, lastSon(n.sons[i])); + end + end; +end; + +var + gWhileCounter: int; // Use a counter to prevend endless loops! + // We make this counter global, because otherwise + // nested loops could make the compiler extremely slow. + gNestedEvals: int; // count the recursive calls to ``evalAux`` to prevent + // endless recursion + +function evalWhile(c: PEvalContext; n: PNode): PNode; +begin + while true do begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + if getOrdValue(result) = 0 then break; + result := evalAux(c, n.sons[1]); + case result.kind of + nkBreakStmt: begin + if result.sons[0] = nil then begin + result := emptyNode; // consume ``break`` token + break + end + end; + nkExceptBranch, nkReturnToken: break; + else begin end + end; + dec(gWhileCounter); + if gWhileCounter <= 0 then begin + stackTrace(c, n, errTooManyIterations); + break; + end + end +end; + +function evalBlock(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkBreakStmt then begin + if result.sons[0] <> nil then begin + assert(result.sons[0].kind = nkSym); + if n.sons[0] <> nil then begin + assert(n.sons[0].kind = nkSym); + if result.sons[0].sym.id = n.sons[0].sym.id then + result := emptyNode + end + end + else + result := emptyNode // consume ``break`` token + end +end; + +function evalFinally(c: PEvalContext; n, exc: PNode): PNode; +var + finallyNode: PNode; +begin + finallyNode := lastSon(n); + if finallyNode.kind = nkFinally then begin + result := evalAux(c, finallyNode); + if result.kind <> nkExceptBranch then + result := exc + end + else + result := exc +end; + +function evalTry(c: PEvalContext; n: PNode): PNode; +var + exc: PNode; + i, j, len, blen: int; +begin + result := evalAux(c, n.sons[0]); + case result.kind of + nkBreakStmt, nkReturnToken: begin end; + nkExceptBranch: begin + // exception token! + exc := result; + i := 1; + len := sonsLen(n); + while (i < len) and (n.sons[i].kind = nkExceptBranch) do begin + blen := sonsLen(n.sons[i]); + if blen = 1 then begin + // general except section: + result := evalAux(c, n.sons[i].sons[0]); + exc := result; + break + end + else begin + for j := 0 to blen-2 do begin + assert(n.sons[i].sons[j].kind = nkType); + if exc.typ.id = n.sons[i].sons[j].typ.id then begin + result := evalAux(c, n.sons[i].sons[blen-1]); + exc := result; + break + end + end + end; + inc(i); + end; + result := evalFinally(c, n, exc); + end; + else + result := evalFinally(c, n, emptyNode); + end +end; + +function getNullValue(typ: PType; const info: TLineInfo): PNode; +var + i: int; + t: PType; +begin + t := skipGenericRange(typ); + result := emptyNode; + case t.kind of + tyBool, tyChar, tyInt..tyInt64: result := newNodeIT(nkIntLit, info, t); + tyFloat..tyFloat128: result := newNodeIt(nkFloatLit, info, t); + tyVar, tyPointer, tyPtr, tyRef, tyCString, tySequence, tyString: + result := newNodeIT(nkNilLit, info, t); + tyObject: begin + result := newNodeIT(nkPar, info, t); + internalError(info, 'init to implement'); + end; + tyArray, tyArrayConstr: begin + result := newNodeIT(nkBracket, info, t); + for i := 0 to int(lengthOrd(t))-1 do + addSon(result, getNullValue(elemType(t), info)); + end; + tyTuple: begin + result := newNodeIT(nkPar, info, t); + for i := 0 to sonsLen(t)-1 do + addSon(result, getNullValue(t.sons[i], info)); + end; + else InternalError('getNullValue') + end +end; + +function evalVar(c: PEvalContext; n: PNode): PNode; +var + i: int; + v: PSym; + a: PNode; +begin + for i := 0 to sonsLen(n)-1 do begin + a := n.sons[i]; + if a.kind = nkCommentStmt then continue; + assert(a.kind = nkIdentDefs); + assert(a.sons[0].kind = nkSym); + v := a.sons[0].sym; + if a.sons[2] <> nil then begin + result := evalAux(c, a.sons[2]); + if result.kind = nkExceptBranch then exit; + end + else + result := getNullValue(a.sons[0].typ, a.sons[0].info); + IdNodeTablePut(c.tos.mapping, v, result); + end; + result := emptyNode; +end; + +function evalCall(c: PEvalContext; n: PNode): PNode; +var + d: PStackFrame; + prc: PNode; + i: int; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + prc := result; + // bind the actual params to the local parameter + // of a new binding + d := newStackFrame(); + d.call := n; + if prc.kind = nkSym then begin + d.prc := prc.sym; + if not (prc.sym.kind in [skProc, skConverter]) then + InternalError(n.info, 'evalCall'); + end; + setLength(d.params, sonsLen(n)); + for i := 1 to sonsLen(n)-1 do begin + result := evalAux(c, n.sons[i]); + if result.kind = nkExceptBranch then exit; + d.params[i] := result; + end; + if n.typ <> nil then d.params[0] := getNullValue(n.typ, n.info); + pushStackFrame(c, d); + result := evalAux(c, prc); + if n.typ <> nil then result := d.params[0]; + popStackFrame(c); +end; + +function evalVariable(c: PStackFrame; sym: PSym): PNode; +// We need to return a node to the actual value, +// which can be modified. +var + x: PStackFrame; +begin + x := c; + while x <> nil do begin + if sfResult in sym.flags then begin + result := x.params[0]; + exit + end; + result := IdNodeTableGet(x.mapping, sym); + if result <> nil then exit; + x := x.next + end; + result := emptyNode; +end; + +function evalArrayAccess(c: PEvalContext; n: PNode): PNode; +var + x: PNode; + idx: biggestInt; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + x := result; + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + idx := getOrdValue(result); + result := emptyNode; + case x.kind of + nkBracket, nkPar, nkMetaNode: begin + if (idx >= 0) and (idx < sonsLen(x)) then + result := x.sons[int(idx)] + else + stackTrace(c, n, errIndexOutOfBounds); + end; + nkStrLit..nkTripleStrLit: begin + result := newNodeIT(nkCharLit, x.info, getSysType(tyChar)); + if (idx >= 0) and (idx < length(x.strVal)) then + result.intVal := ord(x.strVal[int(idx)+strStart]) + else if idx = length(x.strVal) then begin end + else + stackTrace(c, n, errIndexOutOfBounds); + end; + else + stackTrace(c, n, errIndexNoIntType); + end +end; + +function evalFieldAccess(c: PEvalContext; n: PNode): PNode; +// a real field access; proc calls have already been +// transformed +// XXX: field checks! +var + x: PNode; + field: PSym; + i: int; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + x := result; + if x.kind <> nkPar then InternalError(n.info, 'evalFieldAccess'); + field := n.sons[1].sym; + for i := 0 to sonsLen(n)-1 do begin + if x.sons[i].kind <> nkExprColonExpr then + InternalError(n.info, 'evalFieldAccess'); + if x.sons[i].sons[0].sym.name.id = field.id then begin + result := x.sons[i].sons[1]; exit + end + end; + stackTrace(c, n, errFieldXNotFound, field.name.s); + result := emptyNode; +end; + +function evalAsgn(c: PEvalContext; n: PNode): PNode; +var + x: PNode; + i: int; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + x := result; + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + x.kind := result.kind; + x.typ := result.typ; + case x.kind of + nkCharLit..nkInt64Lit: x.intVal := result.intVal; + nkFloatLit..nkFloat64Lit: x.floatVal := result.floatVal; + nkStrLit..nkTripleStrLit: begin + x.strVal := result.strVal; + end + else begin + if not (x.kind in [nkEmpty..nkNilLit]) then begin + discardSons(x); + for i := 0 to sonsLen(result)-1 do addSon(x, result.sons[i]); + end + end + end; + result := emptyNode +end; + +function evalSwap(c: PEvalContext; n: PNode): PNode; +var + x: PNode; + i: int; + tmpi: biggestInt; + tmpf: biggestFloat; + tmps: string; + tmpn: PNode; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + x := result; + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + if (x.kind <> result.kind) then + stackTrace(c, n, errCannotInterpretNodeX, nodeKindToStr[n.kind]) + else begin + case x.kind of + nkCharLit..nkInt64Lit: begin + tmpi := x.intVal; + x.intVal := result.intVal; + result.intVal := tmpi + end; + nkFloatLit..nkFloat64Lit: begin + tmpf := x.floatVal; + x.floatVal := result.floatVal; + result.floatVal := tmpf; + end; + nkStrLit..nkTripleStrLit: begin + tmps := x.strVal; + x.strVal := result.strVal; + result.strVal := tmps; + end + else begin + tmpn := copyTree(x); + discardSons(x); + for i := 0 to sonsLen(result)-1 do + addSon(x, result.sons[i]); + discardSons(result); + for i := 0 to sonsLen(tmpn)-1 do + addSon(result, tmpn.sons[i]); + end + end + end; + result := emptyNode +end; + +function evalSym(c: PEvalContext; n: PNode): PNode; +begin + case n.sym.kind of + skProc, skConverter, skMacro: result := n.sym.ast.sons[codePos]; + skVar, skForVar, skTemp: result := evalVariable(c.tos, n.sym); + skParam: result := c.tos.params[n.sym.position+1]; + skConst: result := n.sym.ast; + else begin + stackTrace(c, n, errCannotInterpretNodeX, symKindToStr[n.sym.kind]); + result := emptyNode + end + end; + if result = nil then InternalError(n.info, 'evalSym: ' + n.sym.name.s); +end; + +function evalIncDec(c: PEvalContext; n: PNode; sign: biggestInt): PNode; +var + a, b: PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + case a.kind of + nkCharLit..nkInt64Lit: a.intval := a.intVal + sign * getOrdValue(b); + else internalError(n.info, 'evalIncDec'); + end; + result := emptyNode +end; + +function evalExit(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + liMessage(n.info, hintQuitCalled); + halt(int(getOrdValue(result))); +end; + +function evalOr(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + if result.kind <> nkIntLit then InternalError(n.info, 'evalOr'); + if result.intVal = 0 then result := evalAux(c, n.sons[2]) +end; + +function evalAnd(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + if result.kind <> nkIntLit then InternalError(n.info, 'evalAnd'); + if result.intVal <> 0 then result := evalAux(c, n.sons[2]) +end; + +function evalNew(c: PEvalContext; n: PNode): PNode; +var + t: PType; +begin + t := skipVarGeneric(n.sons[1].typ); + result := newNodeIT(nkRefTy, n.info, t); + addSon(result, getNullValue(t.sons[0], n.info)); +end; + +function evalDeref(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + if result.kind <> nkRefTy then InternalError(n.info, 'evalDeref'); + result := result.sons[0]; +end; + +function evalAddr(c: PEvalContext; n: PNode): PNode; +var + a: PNode; + t: PType; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + if result.kind <> nkRefTy then InternalError(n.info, 'evalDeref'); + a := result; + t := newType(tyPtr, c.module); + addSon(t, a.typ); + result := newNodeIT(nkRefTy, n.info, t); + addSon(result, a); +end; + +function evalConv(c: PEvalContext; n: PNode): PNode; +begin + // hm, I cannot think of any conversions that need to be handled here... + result := evalAux(c, n.sons[1]); + result.typ := n.typ; +end; + +function evalCheckedFieldAccess(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[0]); +end; + +function evalUpConv(c: PEvalContext; n: PNode): PNode; +var + dest, src: PType; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + dest := skipPtrsGeneric(n.typ); + src := skipPtrsGeneric(result.typ); + if inheritanceDiff(src, dest) > 0 then + stackTrace(c, n, errInvalidConversionFromTypeX, typeToString(src)); +end; + +function evalRangeChck(c: PEvalContext; n: PNode): PNode; +var + x, a, b: PNode; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + x := result; + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + + if leValueConv(a, x) and leValueConv(x, b) then begin + result := x; // a <= x and x <= b + result.typ := n.typ + end + else + stackTrace(c, n, errGenerated, + format(msgKindToString(errIllegalConvFromXtoY), + [typeToString(n.sons[0].typ), typeToString(n.typ)])); +end; + +function evalConvStrToCStr(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + result.typ := n.typ; +end; + +function evalConvCStrToStr(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + result.typ := n.typ; +end; + +function evalRaise(c: PEvalContext; n: PNode): PNode; +var + a: PNode; +begin + if n.sons[0] <> nil then begin + result := evalAux(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + a := result; + result := newNodeIT(nkExceptBranch, n.info, a.typ); + addSon(result, a); + c.lastException := result; + end + else if c.lastException <> nil then + result := c.lastException + else begin + stackTrace(c, n, errExceptionAlreadyHandled); + result := newNodeIT(nkExceptBranch, n.info, nil); + addSon(result, nil); + end +end; + +function evalReturn(c: PEvalContext; n: PNode): PNode; +begin + if n.sons[0] <> nil then begin + result := evalAsgn(c, n.sons[0]); + if result.kind = nkExceptBranch then exit; + end; + result := newNodeIT(nkReturnToken, n.info, nil); +end; + +function evalProc(c: PEvalContext; n: PNode): PNode; +var + v: PSym; +begin + if n.sons[genericParamsPos] = nil then begin + if (resultPos < sonsLen(n)) and (n.sons[resultPos] <> nil) then begin + v := n.sons[resultPos].sym; + result := getNullValue(v.typ, n.info); + IdNodeTablePut(c.tos.mapping, v, result); + end; + result := evalAux(c, n.sons[codePos]); + if result.kind = nkReturnToken then + result := IdNodeTableGet(c.tos.mapping, v); + end + else + result := emptyNode +end; + +function evalHigh(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + case skipVarGeneric(n.sons[1].typ).kind of + tyOpenArray, tySequence: + result := newIntNodeT(sonsLen(result), n); + tyString: + result := newIntNodeT(length(result.strVal)-1, n); + else InternalError(n.info, 'evalHigh') + end +end; + +function evalIs(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + result := newIntNodeT(ord(inheritanceDiff(result.typ, n.sons[2].typ) >= 0), n) +end; + +function evalSetLengthStr(c: PEvalContext; n: PNode): PNode; +var + a, b: PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + case a.kind of + nkStrLit..nkTripleStrLit: setLength(a.strVal, int(getOrdValue(b))); + else InternalError(n.info, 'evalSetLengthStr') + end; + result := emptyNode +end; + +function evalSetLengthSeq(c: PEvalContext; n: PNode): PNode; +var + a, b: PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + if a.kind = nkBracket then setLength(a.sons, int(getOrdValue(b))) + else InternalError(n.info, 'evalSetLengthSeq'); + result := emptyNode +end; + +function evalNewSeq(c: PEvalContext; n: PNode): PNode; +var + a, b: PNode; + t: PType; + i: int; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + + t := skipVarGeneric(n.sons[1].typ); + result := newNodeIT(nkBracket, n.info, t); + for i := 0 to int(getOrdValue(b))-1 do + addSon(result, getNullValue(t.sons[0], n.info)); + // XXX: assign to `a`? result := emptyNode +end; + +function evalAssert(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + if getOrdValue(result) <> 0 then + result := emptyNode + else + stackTrace(c, n, errAssertionFailed) +end; + +function evalIncl(c: PEvalContext; n: PNode): PNode; +var + a, b: PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + if not inSet(a, b) then addSon(a, copyTree(b)); + result := emptyNode; +end; + +function evalExcl(c: PEvalContext; n: PNode): PNode; +var + a, b, r: PNode; + i: int; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := newNodeIT(nkCurly, n.info, n.sons[1].typ); + addSon(b, result); + r := diffSets(a, b); + discardSons(a); + for i := 0 to sonsLen(r)-1 do addSon(a, r.sons[i]); + result := emptyNode; +end; + +function evalAppendStrCh(c: PEvalContext; n: PNode): PNode; +var + a, b: PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + case a.kind of + nkStrLit..nkTripleStrLit: addChar(a.strVal, chr(int(getOrdValue(b)))); + else InternalError(n.info, 'evalAppendStrCh'); + end; + result := emptyNode; +end; + +function getStrValue(n: PNode): string; +begin + case n.kind of + nkStrLit..nkTripleStrLit: result := n.strVal; + else begin InternalError(n.info, 'getStrValue'); result := '' end; + end +end; + +function evalConStrStr(c: PEvalContext; n: PNode): PNode; +// we cannot use ``evalOp`` for this as we can here have more than 2 arguments +var + a: PNode; + i: int; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + for i := 2 to sonsLen(n)-1 do begin + result := evalAux(c, n.sons[i]); + if result.kind = nkExceptBranch then exit; + a.strVal := getStrValue(a) +{&} getStrValue(result); + end; + result := a; +end; + +function evalAppendStrStr(c: PEvalContext; n: PNode): PNode; +var + a, b: PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + case a.kind of + nkStrLit..nkTripleStrLit: a.strVal := a.strVal +{&} getStrValue(b); + else InternalError(n.info, 'evalAppendStrStr'); + end; + result := emptyNode; +end; + +function evalAppendSeqElem(c: PEvalContext; n: PNode): PNode; +var + a, b: PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + if a.kind = nkBracket then addSon(a, copyTree(b)) + else InternalError(n.info, 'evalAppendSeqElem'); + result := emptyNode; +end; + +function evalAppendSeqSeq(c: PEvalContext; n: PNode): PNode; +var + a, b: PNode; + i: int; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + if a.kind = nkBracket then + for i := 0 to sonsLen(b)-1 do addSon(a, copyTree(b.sons[i])) + else InternalError(n.info, 'evalAppendSeqSeq'); + result := emptyNode; +end; + +function evalRepr(c: PEvalContext; n: PNode): PNode; +begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + result := newStrNodeT(renderTree(result, {@set}[renderNoComments]), n); +end; + +function evalMagicOrCall(c: PEvalContext; n: PNode): PNode; +var + m: TMagic; + a, b: PNode; + k: biggestInt; + i: int; +begin + m := getMagic(n); + case m of + mNone: result := evalCall(c, n); + mIs: result := evalIs(c, n); + mSizeOf: internalError(n.info, 'sizeof() should have been evaluated'); + mHigh: result := evalHigh(c, n); + mAssert: result := evalAssert(c, n); + mExit: result := evalExit(c, n); + mNew, mNewFinalize: result := evalNew(c, n); + mNewSeq: result := evalNewSeq(c, n); + mSwap: result := evalSwap(c, n); + mInc: result := evalIncDec(c, n, 1); + ast.mDec: result := evalIncDec(c, n, -1); + mSetLengthStr: result := evalSetLengthStr(c, n); + mSetLengthSeq: result := evalSetLengthSeq(c, n); + mIncl: result := evalIncl(c, n); + mExcl: result := evalExcl(c, n); + mAnd: result := evalAnd(c, n); + mOr: result := evalOr(c, n); + + mAppendStrCh: result := evalAppendStrCh(c, n); + mAppendStrStr: result := evalAppendStrStr(c, n); + mAppendSeqElem: result := evalAppendSeqElem(c, n); + mAppendSeqSeq: result := evalAppendSeqSeq(c, n); + + mNLen: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := newNodeIT(nkIntLit, n.info, n.typ); + case a.kind of + nkEmpty..nkNilLit: begin end; + else result.intVal := sonsLen(a); + end + end; + mNChild: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + k := getOrdValue(result); + if (k >= 0) and (k < sonsLen(a)) + and not (a.kind in [nkEmpty..nkNilLit]) then + result := a.sons[int(k)] + else begin + stackTrace(c, n, errIndexOutOfBounds); + result := emptyNode + end; + end; + mNSetChild: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + result := evalAux(c, n.sons[3]); + if result.kind = nkExceptBranch then exit; + k := getOrdValue(b); + if (k >= 0) and (k < sonsLen(a)) + and not (a.kind in [nkEmpty..nkNilLit]) then + a.sons[int(k)] := result + else + stackTrace(c, n, errIndexOutOfBounds); + result := emptyNode; + end; + mNAdd: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + addSon(a, result); + result := emptyNode + end; + mNAddMultiple: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + for i := 0 to sonsLen(result)-1 do addSon(a, result.sons[i]); + result := emptyNode + end; + mNDel: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + result := evalAux(c, n.sons[3]); + if result.kind = nkExceptBranch then exit; + for i := 0 to int(getOrdValue(result))-1 do + delSon(a, int(getOrdValue(b))); + result := emptyNode; + end; + mNKind: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := newNodeIT(nkIntLit, n.info, n.typ); + result.intVal := ord(a.kind); + end; + mNIntVal: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := newNodeIT(nkIntLit, n.info, n.typ); + case a.kind of + nkCharLit..nkInt64Lit: result.intVal := a.intVal; + else InternalError(n.info, 'no int value') + end + end; + mNFloatVal: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := newNodeIT(nkFloatLit, n.info, n.typ); + case a.kind of + nkFloatLit..nkFloat64Lit: result.floatVal := a.floatVal; + else InternalError(n.info, 'no float value') + end + end; + mNSymbol: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + if result.kind <> nkSym then InternalError(n.info, 'no symbol') + end; + mNIdent: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + if result.kind <> nkIdent then InternalError(n.info, 'no symbol') + end; + mNGetType: result := evalAux(c, n.sons[1]); + mNStrVal: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := newNodeIT(nkStrLit, n.info, n.typ); + case a.kind of + nkStrLit..nkTripleStrLit: result.strVal := a.strVal; + else InternalError(n.info, 'no string value') + end + end; + mNSetIntVal: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + a.intVal := result.intVal; // XXX: exception handling? + result := emptyNode + end; + mNSetFloatVal: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + a.floatVal := result.floatVal; // XXX: exception handling? + result := emptyNode + end; + mNSetSymbol: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + a.sym := result.sym; // XXX: exception handling? + result := emptyNode + end; + mNSetIdent: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + a.ident := result.ident; // XXX: exception handling? + result := emptyNode + end; + mNSetType: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + a.typ := result.typ; // XXX: exception handling? + result := emptyNode + end; + mNSetStrVal: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + a.strVal := result.strVal; // XXX: exception handling? + result := emptyNode + end; + mNNewNimNode: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + k := getOrdValue(result); + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + a := result; + if (k < 0) or (k > ord(high(TNodeKind))) then + internalError(n.info, 'request to create a NimNode with invalid kind'); + if a.kind = nkNilLit then + result := newNodeI(TNodeKind(int(k)), n.info) + else + result := newNodeI(TNodeKind(int(k)), a.info) + end; + mNCopyNimNode: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + result := copyNode(result); + end; + mNCopyNimTree: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + result := copyTree(result); + end; + mStrToIdent: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + if not (result.kind in [nkStrLit..nkTripleStrLit]) then + InternalError(n.info, 'no string node'); + a := result; + result := newNodeIT(nkIdent, n.info, n.typ); + result.ident := getIdent(a.strVal); + end; + mIdentToStr: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + if result.kind <> nkIdent then + InternalError(n.info, 'no ident node'); + a := result; + result := newNodeIT(nkStrLit, n.info, n.typ); + result.strVal := a.ident.s; + end; + mEqIdent: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + b := result; + result := newNodeIT(nkIntLit, n.info, n.typ); + if (a.kind = nkIdent) and (b.kind = nkIdent) then + if a.ident.id = b.ident.id then result.intVal := 1 + end; + mNHint: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + liMessage(n.info, hintUser, getStrValue(result)); + result := emptyNode + end; + mNWarning: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + liMessage(n.info, warnUser, getStrValue(result)); + result := emptyNode + end; + mNError: begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + liMessage(n.info, errUser, getStrValue(result)); + result := emptyNode + end; + mConStrStr: result := evalConStrStr(c, n); + mRepr: result := evalRepr(c, n); + else begin + result := evalAux(c, n.sons[1]); + if result.kind = nkExceptBranch then exit; + a := result; + if sonsLen(n) > 2 then begin + result := evalAux(c, n.sons[2]); + if result.kind = nkExceptBranch then exit; + end + else + result := nil; + result := evalOp(m, n, a, result); + end + end +end; + +function evalAux(c: PEvalContext; n: PNode): PNode; +var + i: int; +begin + result := emptyNode; + dec(gNestedEvals); + if gNestedEvals <= 0 then stackTrace(c, n, errTooManyIterations); + case n.kind of // atoms: + nkEmpty: result := n; + nkSym: result := evalSym(c, n); + nkType..pred(nkNilLit): result := copyNode(n); + nkNilLit: result := n; // end of atoms + + nkCall, nkHiddenCallConv, nkMacroStmt: result := evalMagicOrCall(c, n); + nkCurly, nkBracket: begin + result := copyNode(n); + for i := 0 to sonsLen(n)-1 do addSon(result, evalAux(c, n.sons[i])); + end; + nkPar: begin + result := copyTree(n); + for i := 0 to sonsLen(n)-1 do + result.sons[i].sons[1] := evalAux(c, n.sons[i].sons[1]); + end; + nkBracketExpr: result := evalArrayAccess(c, n); + nkDotExpr: result := evalFieldAccess(c, n); + nkDerefExpr, nkHiddenDeref: result := evalDeref(c, n); + nkAddr, nkHiddenAddr: result := evalAddr(c, n); + nkHiddenStdConv, nkHiddenSubConv, nkConv: result := evalConv(c, n); + nkAsgn: result := evalAsgn(c, n); + nkWhenStmt, nkIfStmt, nkIfExpr: result := evalIf(c, n); + nkWhileStmt: result := evalWhile(c, n); + nkCaseStmt: result := evalCase(c, n); + nkVarSection: result := evalVar(c, n); + nkTryStmt: result := evalTry(c, n); + nkRaiseStmt: result := evalRaise(c, n); + nkReturnStmt: result := evalReturn(c, n); + nkBreakStmt, nkReturnToken: result := n; + nkBlockExpr, nkBlockStmt: result := evalBlock(c, n); + nkDiscardStmt: result := evalAux(c, n.sons[0]); + nkCheckedFieldExpr: result := evalCheckedFieldAccess(c, n); + nkObjDownConv: result := evalAux(c, n.sons[0]); + nkObjUpConv: result := evalUpConv(c, n); + nkChckRangeF, nkChckRange64, nkChckRange: result := evalRangeChck(c, n); + nkStringToCString: result := evalConvStrToCStr(c, n); + nkCStringToString: result := evalConvCStrToStr(c, n); + nkPassAsOpenArray: result := evalAux(c, n.sons[0]); + + nkStmtListExpr, nkStmtList, nkModule: begin + for i := 0 to sonsLen(n)-1 do begin + result := evalAux(c, n.sons[i]); + case result.kind of + nkExceptBranch, nkReturnToken, nkBreakStmt: break; + else begin end + end + end + end; + nkProcDef, nkMacroDef, nkCommentStmt, nkPragma, nkTypeSection, + nkTemplateDef, nkConstSection, nkIteratorDef, nkConverterDef, + nkIncludeStmt, nkImportStmt, nkFromStmt: begin end; + nkIdentDefs, nkCast, nkYieldStmt, nkAsmStmt, nkForStmt, nkPragmaExpr, + nkQualified, nkLambda, nkContinueStmt: + stackTrace(c, n, errCannotInterpretNodeX, nodeKindToStr[n.kind]); + else InternalError(n.info, 'evalAux: ' + nodekindToStr[n.kind]); + end; + if result = nil then + InternalError(n.info, 'evalAux: returned nil ' + nodekindToStr[n.kind]); + inc(gNestedEvals); +end; + +function eval(c: PEvalContext; n: PNode): PNode; +begin + gWhileCounter := evalMaxIterations; + gNestedEvals := evalMaxRecDepth; + result := evalAux(c, n); + if result.kind = nkExceptBranch then + stackTrace(c, n, errUnhandledExceptionX, typeToString(result.typ)); +end; + +function myOpen(module: PSym; const filename: string): PPassContext; +var + c: PEvalContext; +begin + c := newEvalContext(module, filename); + pushStackFrame(c, newStackFrame()); + result := c; +end; + +function myProcess(c: PPassContext; n: PNode): PNode; +begin + result := eval(PEvalContext(c), n); +end; + +function evalPass(): TPass; +begin + initPass(result); + result.open := myOpen; + result.close := myProcess; + result.process := myProcess; +end; + +initialization + new(emptyNode); +{@ignore} + fillChar(emptyNode^, sizeof(emptyNode^), 0); +{@emit} + emptyNode.kind := nkEmpty; +end. diff --git a/nim/hashes.pas b/nim/hashes.pas index cf5ab03bc..1bd3c7d2a 100644 --- a/nim/hashes.pas +++ b/nim/hashes.pas @@ -44,9 +44,6 @@ function finishHash(h: THash): THash; implementation -type - TUnsignedHash = cardinal; - {@ignore} {$ifopt Q+} { we need Q- here! } {$define Q_on} @@ -89,7 +86,7 @@ end; function GetDataHash(Data: Pointer; Size: int): THash; var - h: TUnsignedHash; + h: THash; p: PChar; i, s: int; begin @@ -116,7 +113,7 @@ end; function GetHash(str: PChar): THash; var - h: TUnsignedHash; + h: THash; i: int; begin h := 0; @@ -135,7 +132,7 @@ end; function GetHashStr(const s: string): THash; var - h: TUnsignedHash; + h: THash; i: int; begin h := 0; @@ -152,7 +149,7 @@ end; function getNormalizedHash(const s: string): THash; var - h: TUnsignedHash; + h: THash; c: Char; i: int; begin @@ -173,7 +170,7 @@ end; function GetHashStrCI(const s: string): THash; var - h: TUnsignedHash; + h: THash; c: Char; i: int; begin @@ -193,7 +190,7 @@ end; function GetHashCI(str: PChar): THash; var - h: TUnsignedHash; + h: THash; c: Char; i: int; begin diff --git a/nim/hashtest.pas b/nim/hashtest.pas new file mode 100644 index 000000000..ba7a62372 --- /dev/null +++ b/nim/hashtest.pas @@ -0,0 +1,10 @@ +program hashtest; + +{$include 'config.inc'} + +uses + hashes; + +begin + writeln(output, getNormalizedHash(ParamStr(1))); +end. diff --git a/nim/interact.pas b/nim/interact.pas new file mode 100644 index 000000000..ac238107f --- /dev/null +++ b/nim/interact.pas @@ -0,0 +1,22 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit interact; + +// This file implements interactive sessions. + +interface + +{$include 'config.inc'} + +uses + nsystem, llstream, strutils, charsets, ropes, strtabs, msgs; + +implementation + +end. diff --git a/nim/lists.pas b/nim/lists.pas index 74b1479d9..e3442eb29 100644 --- a/nim/lists.pas +++ b/nim/lists.pas @@ -8,7 +8,7 @@ // unit lists; -// This unit implements a generic doubled linked list. +// This module implements a generic doubled linked list. interface diff --git a/nim/llstream.pas b/nim/llstream.pas new file mode 100644 index 000000000..2d4336664 --- /dev/null +++ b/nim/llstream.pas @@ -0,0 +1,250 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit llstream; + +// Low-level streams for high performance. + +interface + +uses + nsystem, charsets, strutils; + +type + TLLStreamKind = ( + llsNone, // null stream: reading and writing has no effect + llsString, // stream encapsulates a string + llsFile, // stream encapsulates a file + llsStdIn); // stream encapsulates stdin + TLLStream = object(NObject) + kind: TLLStreamKind; // exposed for low-level access (lexbase uses this) + f: TBinaryFile; + s: string; + pos: int; // for string streams + end; + PLLStream = ^TLLStream; + + +function LLStreamOpen(const data: string): PLLStream; overload; +function LLStreamOpen(var f: TBinaryFile): PLLStream; overload; +function LLStreamOpen(const filename: string; mode: TFileMode): PLLStream; overload; +function LLStreamOpen(): PLLStream; overload; +function LLStreamOpenStdIn(): PLLStream; + +procedure LLStreamClose(s: PLLStream); + +function LLStreamRead(s: PLLStream; buf: pointer; bufLen: int): int; +function LLStreamReadLine(s: PLLStream): string; +function LLStreamReadAll(s: PLLStream): string; + +procedure LLStreamWrite(s: PLLStream; const data: string); overload; +procedure LLStreamWrite(s: PLLStream; data: Char); overload; +procedure LLStreamWrite(s: PLLStream; buf: pointer; buflen: int); overload; + +function LLStreamAtEnd(s: PLLStream): bool; + +implementation + +function LLStreamOpen(const data: string): PLLStream; overload; +begin + new(result); + {@ignore} + fillChar(result^, sizeof(result^), 0); + {@emit} + result.s := data; + result.kind := llsString; +end; + +function LLStreamOpen(var f: TBinaryFile): PLLStream; overload; +begin + new(result); + {@ignore} + fillChar(result^, sizeof(result^), 0); + {@emit} + result.f := f; + result.kind := llsFile; +end; + +function LLStreamOpen(const filename: string; mode: TFileMode): PLLStream; overload; +begin + new(result); + {@ignore} + fillChar(result^, sizeof(result^), 0); + {@emit} + result.kind := llsFile; + if not OpenFile(result.f, filename, mode) then result := nil; +end; + +function LLStreamOpen(): PLLStream; overload; +begin + new(result); + {@ignore} + fillChar(result^, sizeof(result^), 0); + {@emit} + result.kind := llsNone; +end; + +function LLStreamOpenStdIn(): PLLStream; +begin + new(result); + {@ignore} + fillChar(result^, sizeof(result^), 0); + {@emit} + result.kind := llsStdIn; + result.s := ''; + result.pos := -1; +end; + +procedure LLStreamClose(s: PLLStream); +begin + case s.kind of + llsNone, llsString, llsStdIn: begin end; + llsFile: nimCloseFile(s.f); + end +end; + +function LLreadFromStdin(s: PLLStream; buf: pointer; bufLen: int): int; +var + line: string; + L: int; +begin + s.s := ''; + s.pos := 0; + while true do begin + write(output, 'Nimrod> '); + line := readLine(input); + L := length(line); + add(s.s, line); + add(s.s, nl); + if (L > 0) and (line[L-1+strStart] = '#') then break; + end; + result := min(bufLen, length(s.s)-s.pos); + if result > 0 then begin + copyMem(buf, addr(s.s[strStart+s.pos]), result); + inc(s.pos, result) + end +end; + +function LLStreamRead(s: PLLStream; buf: pointer; bufLen: int): int; +begin + case s.kind of + llsNone: result := 0; + llsString: begin + result := min(bufLen, length(s.s)-s.pos); + if result > 0 then begin + copyMem(buf, addr(s.s[strStart+s.pos]), result); + inc(s.pos, result) + end + end; + llsFile: result := readBuffer(s.f, buf, bufLen); + llsStdIn: result := LLreadFromStdin(s, buf, bufLen); + end +end; + +function LLStreamReadLine(s: PLLStream): string; +begin + case s.kind of + llsNone: result := ''; + llsString: begin + result := ''; + while s.pos < length(s.s) do begin + case s.s[s.pos+strStart] of + #13: begin + inc(s.pos); + if s.s[s.pos+strStart] = #10 then inc(s.pos); + break + end; + #10: begin inc(s.pos); break end; + else begin + addChar(result, s.s[s.pos+strStart]); + inc(s.pos); + end + end + end + end; + llsFile: result := readLine(s.f); + llsStdIn: result := readLine(input); + end +end; + +function LLStreamAtEnd(s: PLLStream): bool; +begin + case s.kind of + llsNone: result := true; + llsString: result := s.pos < length(s.s); + llsFile: result := endOfFile(s.f); + llsStdIn: result := false; + end +end; + +procedure LLStreamWrite(s: PLLStream; const data: string); overload; +begin + case s.kind of + llsNone, llsStdIn: begin end; + llsString: add(s.s, data); + llsFile: nimWrite(s.f, data); + end +end; + +procedure LLStreamWrite(s: PLLStream; data: Char); overload; +var + c: char; +begin + case s.kind of + llsNone, llsStdIn: begin end; + llsString: addChar(s.s, data); + llsFile: begin + c := data; + {@discard} writeBuffer(s.f, addr(c), sizeof(c)); + end + end +end; + +procedure LLStreamWrite(s: PLLStream; buf: pointer; buflen: int); overload; +begin + case s.kind of + llsNone, llsStdIn: begin end; + llsString: begin + if bufLen > 0 then begin + setLength(s.s, length(s.s) + bufLen); + copyMem(addr(s.s[strStart+s.pos]), buf, bufLen); + inc(s.pos, bufLen); + end + end; + llsFile: {@discard} writeBuffer(s.f, buf, bufLen); + end +end; + +function LLStreamReadAll(s: PLLStream): string; +const + bufSize = 2048; +var + bytes, i: int; +begin + case s.kind of + llsNone, llsStdIn: result := ''; + llsString: begin + if s.pos = 0 then result := s.s + else result := ncopy(s.s, s.pos+strStart); + s.pos := length(s.s); + end; + llsFile: begin + result := newString(bufSize); + bytes := readBuffer(s.f, addr(result[strStart]), bufSize); + i := bytes; + while bytes = bufSize do begin + setLength(result, i+bufSize); + bytes := readBuffer(s.f, addr(result[i+strStart]), bufSize); + inc(i, bytes); + end; + setLength(result, i); + end + end +end; + +end. diff --git a/nim/lookups.pas b/nim/lookups.pas new file mode 100644 index 000000000..a9a4a783b --- /dev/null +++ b/nim/lookups.pas @@ -0,0 +1,289 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit lookups; + +// This module implements lookup helpers. + +interface + +uses + nsystem, ast, astalgo, idents, semdata, types, msgs, options, rodread, + rnimsyn; + +{$include 'config.inc'} + +type + TOverloadIterMode = (oimNoQualifier, oimSelfModule, oimOtherModule); + TOverloadIter = record + stackPtr: int; + it: TIdentIter; + m: PSym; + mode: TOverloadIterMode; + end; + +function getSymRepr(s: PSym): string; + +procedure CloseScope(var tab: TSymTab); + +procedure AddSym(var t: TStrTable; n: PSym); + +procedure addDecl(c: PContext; sym: PSym); +procedure addDeclAt(c: PContext; sym: PSym; at: Natural); +procedure addOverloadableSymAt(c: PContext; fn: PSym; at: Natural); + +procedure addInterfaceDecl(c: PContext; sym: PSym); +procedure addInterfaceOverloadableSymAt(c: PContext; sym: PSym; at: int); + +function lookUp(c: PContext; n: PNode): PSym; +// Looks up a symbol. Generates an error in case of nil. + +function QualifiedLookUp(c: PContext; n: PNode; ambigiousCheck: bool): PSym; + +function InitOverloadIter(out o: TOverloadIter; c: PContext; n: PNode): PSym; +function nextOverloadIter(var o: TOverloadIter; c: PContext; n: PNode): PSym; + +implementation + +function getSymRepr(s: PSym): string; +begin + case s.kind of + skProc, skConverter, skIterator: result := getProcHeader(s); + else result := s.name.s + end +end; + +procedure CloseScope(var tab: TSymTab); +var + it: TTabIter; + s: PSym; +begin + // check if all symbols have been used and defined: + if (tab.tos > length(tab.stack)) then InternalError('CloseScope'); + s := InitTabIter(it, tab.stack[tab.tos-1]); + while s <> nil do begin + if sfForward in s.flags then + liMessage(s.info, errImplOfXexpected, getSymRepr(s)) + else if ([sfUsed, sfInInterface] * s.flags = []) and + (optHints in s.options) then // BUGFIX: check options in s! + if not (s.kind in [skForVar, skParam]) then + liMessage(s.info, hintXDeclaredButNotUsed, getSymRepr(s)); + s := NextIter(it, tab.stack[tab.tos-1]); + end; + astalgo.rawCloseScope(tab); +end; + +procedure AddSym(var t: TStrTable; n: PSym); +begin + if StrTableIncl(t, n) then liMessage(n.info, errAttemptToRedefine, n.name.s); +end; + +procedure addDecl(c: PContext; sym: PSym); +begin + if SymTabAddUnique(c.tab, sym) = Failure then + liMessage(sym.info, errAttemptToRedefine, sym.Name.s); +end; + +procedure addDeclAt(c: PContext; sym: PSym; at: Natural); +begin + if SymTabAddUniqueAt(c.tab, sym, at) = Failure then + liMessage(sym.info, errAttemptToRedefine, sym.Name.s); +end; + +procedure addOverloadableSymAt(c: PContext; fn: PSym; at: Natural); +var + check: PSym; +begin + if not (fn.kind in OverloadableSyms) then + InternalError(fn.info, 'addOverloadableSymAt'); + check := StrTableGet(c.tab.stack[at], fn.name); + if (check <> nil) and (check.Kind <> fn.kind) then + liMessage(fn.info, errAttemptToRedefine, fn.Name.s); + SymTabAddAt(c.tab, fn, at); +end; + +procedure AddInterfaceDeclAux(c: PContext; sym: PSym); +begin + if (sfInInterface in sym.flags) then begin + // add to interface: + if c.module = nil then InternalError(sym.info, 'AddInterfaceDeclAux'); + StrTableAdd(c.module.tab, sym); + end; + if getCurrOwner().kind = skModule then + include(sym.flags, sfGlobal) +end; + +procedure addInterfaceDecl(c: PContext; sym: PSym); +begin // it adds the symbol to the interface if appropriate + addDecl(c, sym); + AddInterfaceDeclAux(c, sym); +end; + +procedure addInterfaceOverloadableSymAt(c: PContext; sym: PSym; at: int); +begin // it adds the symbol to the interface if appropriate + addOverloadableSymAt(c, sym, at); + AddInterfaceDeclAux(c, sym); +end; + +function lookUp(c: PContext; n: PNode): PSym; +// Looks up a symbol. Generates an error in case of nil. +begin + case n.kind of + nkAccQuoted: result := lookup(c, n.sons[0]); + nkSym: begin + result := SymtabGet(c.Tab, n.sym.name); + if result = nil then + liMessage(n.info, errUndeclaredIdentifier, n.sym.name.s); + include(result.flags, sfUsed); + end; + nkIdent: begin + result := SymtabGet(c.Tab, n.ident); + if result = nil then + liMessage(n.info, errUndeclaredIdentifier, n.ident.s); + include(result.flags, sfUsed); + end + else InternalError(n.info, 'lookUp'); + end; + if IntSetContains(c.AmbigiousSymbols, result.id) then + liMessage(n.info, errUseQualifier, result.name.s); + if result.kind = skStub then loadStub(result); +end; + +function QualifiedLookUp(c: PContext; n: PNode; ambigiousCheck: bool): PSym; +var + m: PSym; + ident: PIdent; +begin + case n.kind of + nkIdent: begin + result := SymtabGet(c.Tab, n.ident); + if result = nil then + liMessage(n.info, errUndeclaredIdentifier, n.ident.s) + else if ambigiousCheck + and IntSetContains(c.AmbigiousSymbols, result.id) then + liMessage(n.info, errUseQualifier, n.ident.s) + end; + nkSym: begin + result := SymtabGet(c.Tab, n.sym.name); + if result = nil then + liMessage(n.info, errUndeclaredIdentifier, n.sym.name.s) + else if ambigiousCheck + and IntSetContains(c.AmbigiousSymbols, result.id) then + liMessage(n.info, errUseQualifier, n.sym.name.s) + end; + nkDotExpr, nkQualified: begin + result := nil; + m := qualifiedLookUp(c, n.sons[0], false); + if (m <> nil) and (m.kind = skModule) then begin + ident := nil; + if (n.sons[1].kind = nkIdent) then + ident := n.sons[1].ident + else if (n.sons[1].kind = nkAccQuoted) + and (n.sons[1].sons[0].kind = nkIdent) then + ident := n.sons[1].sons[0].ident; + if ident <> nil then begin + if m = c.module then + // a module may access its private members: + result := StrTableGet(c.tab.stack[ModuleTablePos], ident) + else + result := StrTableGet(m.tab, ident); + if result = nil then + liMessage(n.sons[1].info, errUndeclaredIdentifier, ident.s) + end + else + liMessage(n.sons[1].info, errIdentifierExpected, + renderTree(n.sons[1])); + end + end; + nkAccQuoted: result := QualifiedLookup(c, n.sons[0], ambigiousCheck); + else begin + result := nil; + //liMessage(n.info, errIdentifierExpected, '') + end; + end; + if (result <> nil) and (result.kind = skStub) then loadStub(result); +end; + +function InitOverloadIter(out o: TOverloadIter; c: PContext; n: PNode): PSym; +var + ident: PIdent; +begin + result := nil; + case n.kind of + nkIdent: begin + o.stackPtr := c.tab.tos; + o.mode := oimNoQualifier; + while (result = nil) do begin + dec(o.stackPtr); + if o.stackPtr < 0 then break; + result := InitIdentIter(o.it, c.tab.stack[o.stackPtr], n.ident); + end; + end; + nkSym: begin + o.stackPtr := c.tab.tos; + o.mode := oimNoQualifier; + while (result = nil) do begin + dec(o.stackPtr); + if o.stackPtr < 0 then break; + result := InitIdentIter(o.it, c.tab.stack[o.stackPtr], n.sym.name); + end; + end; + nkDotExpr, nkQualified: begin + o.mode := oimOtherModule; + o.m := qualifiedLookUp(c, n.sons[0], false); + if (o.m <> nil) and (o.m.kind = skModule) then begin + ident := nil; + if (n.sons[1].kind = nkIdent) then + ident := n.sons[1].ident + else if (n.sons[1].kind = nkAccQuoted) + and (n.sons[1].sons[0].kind = nkIdent) then + ident := n.sons[1].sons[0].ident; + if ident <> nil then begin + if o.m = c.module then begin + // a module may access its private members: + result := InitIdentIter(o.it, c.tab.stack[ModuleTablePos], ident); + o.mode := oimSelfModule; + end + else + result := InitIdentIter(o.it, o.m.tab, ident); + end + else + liMessage(n.sons[1].info, errIdentifierExpected, + renderTree(n.sons[1])); + end + end; + nkAccQuoted: result := InitOverloadIter(o, c, n.sons[0]); + else begin end + end; + if (result <> nil) and (result.kind = skStub) then loadStub(result); +end; + +function nextOverloadIter(var o: TOverloadIter; c: PContext; n: PNode): PSym; +begin + case o.mode of + oimNoQualifier: begin + if n.kind = nkAccQuoted then + result := nextOverloadIter(o, c, n.sons[0]) // BUGFIX + else if o.stackPtr >= 0 then begin + result := nextIdentIter(o.it, c.tab.stack[o.stackPtr]); + while (result = nil) do begin + dec(o.stackPtr); + if o.stackPtr < 0 then break; + result := InitIdentIter(o.it, c.tab.stack[o.stackPtr], o.it.name); + // BUGFIX: o.it.name <-> n.ident + end + end + else result := nil; + end; + oimSelfModule: result := nextIdentIter(o.it, c.tab.stack[ModuleTablePos]); + oimOtherModule: result := nextIdentIter(o.it, o.m.tab); + end; + if (result <> nil) and (result.kind = skStub) then loadStub(result); +end; + +end. diff --git a/nim/main.pas b/nim/main.pas index 7cf3fbd0a..565373685 100644 --- a/nim/main.pas +++ b/nim/main.pas @@ -127,7 +127,6 @@ begin registerPass(verbosePass()); registerPass(sem.semPass()); registerPass(transf.transfPass()); - registerPass(rodwrite.rodwritePass()); end; procedure CommandGenDepend(const filename: string); @@ -152,6 +151,7 @@ procedure CommandCompileToC(const filename: string); begin semanticPasses(); registerPass(cgen.cgenPass()); + registerPass(rodwrite.rodwritePass()); registerPass(cleanupPass()); compileProject(filename); //for i := low(TTypeKind) to high(TTypeKind) do diff --git a/nim/nsystem.pas b/nim/nsystem.pas index 340477461..c33236189 100644 --- a/nim/nsystem.pas +++ b/nim/nsystem.pas @@ -41,6 +41,8 @@ type EOverflow = class(Exception) end; {$endif} + EOutOfRange = class(Exception) + end; float32 = single; float64 = double; @@ -153,6 +155,7 @@ function ltU(a, b: biggestInt): bool; function leU(a, b: biggestInt): bool; function toU8(a: biggestInt): byte; +function toU16(a: biggestInt): int16; function toU32(a: biggestInt): int32; function ze64(a: byte): biggestInt; function ze(a: byte): int; @@ -206,9 +209,25 @@ function readFile(const filename: string): string; procedure nimWrite(var f: tBinaryFile; const str: string); overload; +procedure add(var x: string; const y: string); +// Pascal version of string appending. Terminating zero is ignored. implementation +{@ignore} +procedure add(var x: string; const y: string); +// Pascal version of string appending. Terminating zero is ignored. +var + L: int; +begin + L := length(y); + if L > 0 then begin + if y[L] = #0 then x := x + copy(y, 1, L-1) + else x := x + y; + end +end; +{@emit} + function alloc(size: int): Pointer; begin getMem(result, size); // use standard allocator @@ -284,6 +303,11 @@ begin result := int32(a and $ffffffff); end; +function toU16(a: biggestInt): int16; +begin + result := int16(a and $ffff); +end; + function ze64(a: byte): biggestInt; begin result := a @@ -565,16 +589,30 @@ end; var zero: float; Saved8087CW: Word; + savedExcMask: TFPUExceptionMask; initialization +{$ifdef cpu64} + savedExcMask := SetExceptionMask([exInvalidOp, + exDenormalized, + exPrecision, + exZeroDivide, + exOverflow, + exUnderflow + ]); +{$else} Saved8087CW := Default8087CW; Set8087CW($133f); // Disable all fpu exceptions - +{$endif} zero := 0.0; NaN := 0.0 / zero; inf := 1.0 / zero; NegInf := -inf; finalization +{$ifdef cpu64} + SetExceptionMask(savedExcMask); // set back exception mask +{$else} Set8087CW(Saved8087CW); +{$endif} {$ifdef R_on} {$R+,Q+} {$endif} diff --git a/nim/nversion.pas b/nim/nversion.pas index 51390a073..9629079b2 100644 --- a/nim/nversion.pas +++ b/nim/nversion.pas @@ -31,10 +31,10 @@ const //cog.outl('VersionMinor = %s;' % ver[1]) //cog.outl('VersionPatch = %s;' % ver[2]) //]]] - VersionAsString = '0.7.0'; + VersionAsString = '0.7.2'; VersionMajor = 0; VersionMinor = 7; - VersionPatch = 0; + VersionPatch = 2; //[[[[end]]]] implementation diff --git a/nim/paslex.pas b/nim/paslex.pas index 678f3af1a..c0136e4d8 100644 --- a/nim/paslex.pas +++ b/nim/paslex.pas @@ -298,7 +298,7 @@ begin end; '_': inc(pos); '0', '1': begin - xi := (xi shl 1) or (ord(L.buf[pos]) - ord('0')); + xi := shlu(xi, 1) or (ord(L.buf[pos]) - ord('0')); inc(pos); inc(bits); end; @@ -330,17 +330,17 @@ begin end; '_': inc(pos); '0'..'9': begin - xi := (xi shl 4) or (ord(L.buf[pos]) - ord('0')); + xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('0')); inc(pos); inc(bits, 4); end; 'a'..'f': begin - xi := (xi shl 4) or (ord(L.buf[pos]) - ord('a') + 10); + xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('a') + 10); inc(pos); inc(bits, 4); end; 'A'..'F': begin - xi := (xi shl 4) or (ord(L.buf[pos]) - ord('A') + 10); + xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('A') + 10); inc(pos); inc(bits, 4); end; diff --git a/nim/passaux.pas b/nim/passaux.pas new file mode 100644 index 000000000..6344efb0b --- /dev/null +++ b/nim/passaux.pas @@ -0,0 +1,74 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit passaux; + +// implements some little helper passes +{$include 'config.inc'} + +interface + +uses + nsystem, strutils, ast, passes, msgs, options; + +function verbosePass: TPass; +function cleanupPass: TPass; + +implementation + +function verboseOpen(s: PSym; const filename: string): PPassContext; +begin + //MessageOut('compiling ' + s.name.s); + result := nil; // we don't need a context + if gVerbosity > 0 then + rawMessage(hintProcessing, s.name.s); +end; + +function verboseProcess(context: PPassContext; n: PNode): PNode; +begin + result := n; + if context <> nil then InternalError('logpass: context is not nil'); + if gVerbosity = 3 then + liMessage(n.info, hintProcessing, toString(ast.gid)); +end; + +function verbosePass: TPass; +begin + initPass(result); + result.open := verboseOpen; + result.process := verboseProcess; +end; + +function cleanUp(c: PPassContext; n: PNode): PNode; +var + i: int; + s: PSym; +begin + result := n; + case n.kind of + nkStmtList: begin + for i := 0 to sonsLen(n)-1 do {@discard} cleanup(c, n.sons[i]); + end; + nkProcDef: begin + if (n.sons[namePos].kind = nkSym) then begin + s := n.sons[namePos].sym; + if not astNeeded(s) then s.ast.sons[codePos] := nil; // free the memory + end + end + else begin end; + end +end; + +function cleanupPass: TPass; +begin + initPass(result); + result.process := cleanUp; + result.close := cleanUp; +end; + +end. diff --git a/nim/passes.pas b/nim/passes.pas new file mode 100644 index 000000000..028cfc2a2 --- /dev/null +++ b/nim/passes.pas @@ -0,0 +1,216 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit passes; + +// This module implements the passes functionality. A pass must implement the +// `TPass` interface. + +interface + +{$include 'config.inc'} + +uses + nsystem, charsets, strutils, + lists, options, ast, astalgo, llstream, + msgs, platform, nos, condsyms, idents, rnimsyn, types, + extccomp, nmath, magicsys, nversion, nimsets, pnimsyn, ntime, rodread; + +type + TPassContext = object(NObject) // the pass's context + end; + PPassContext = ^TPassContext; + + TPass = record {@tuple} // a pass is a tuple of procedure vars + open: function (module: PSym; const filename: string): PPassContext; + openCached: function (module: PSym; const filename: string; + rd: PRodReader): PPassContext; + close: function (p: PPassContext; n: PNode): PNode; + process: function (p: PPassContext; topLevelStmt: PNode): PNode; + end; + +// ``TPass.close`` may produce additional nodes. These are passed to the other +// close procedures. This mechanism is needed for the instantiation of +// generics. + +procedure registerPass(const p: TPass); + +procedure initPass(var p: TPass); + +// This implements a memory preserving scheme: Top level statements are +// processed in a pipeline. The compiler never looks at a whole module +// any longer. However, this is simple to change, as new passes may perform +// whole program optimizations. For now, we avoid it to save a lot of memory. + +procedure processModule(module: PSym; const filename: string; + stream: PLLStream; rd: PRodReader); + + +function astNeeded(s: PSym): bool; + // The ``rodwrite`` module uses this to determine if the body of a proc + // needs to be stored. The passes manager frees s.sons[codePos] when + // appropriate to free the procedure body's memory. This is important + // to keep memory usage down. + +// some passes (the semantic checker) need these: +var + gImportModule: function (const filename: string): PSym; + gIncludeFile: function (const filename: string): PNode; + gIncludeTmplFile: function (const filename: string): PNode; + +implementation + +function astNeeded(s: PSym): bool; +begin + if (s.kind = skProc) + and ([sfCompilerProc, sfCompileTime] * s.flags = []) + and (s.typ.callConv <> ccInline) + and (s.ast.sons[genericParamsPos] = nil) then + result := false + else + result := true +end; + +const + maxPasses = 10; + +type + TPassContextArray = array [0..maxPasses-1] of PPassContext; +var + gPasses: array [0..maxPasses-1] of TPass; + gPassesLen: int; + +procedure registerPass(const p: TPass); +begin + gPasses[gPassesLen] := p; + inc(gPassesLen); +end; + +procedure openPasses(var a: TPassContextArray; module: PSym; + const filename: string); +var + i: int; +begin + for i := 0 to gPassesLen-1 do + if assigned(gPasses[i].open) then + a[i] := gPasses[i].open(module, filename) + else + a[i] := nil +end; + +procedure openPassesCached(var a: TPassContextArray; module: PSym; + const filename: string; rd: PRodReader); +var + i: int; +begin + for i := 0 to gPassesLen-1 do + if assigned(gPasses[i].openCached) then + a[i] := gPasses[i].openCached(module, filename, rd) + else + a[i] := nil +end; + +procedure closePasses(var a: TPassContextArray); +var + i: int; + m: PNode; +begin + m := nil; + for i := 0 to gPassesLen-1 do begin + if assigned(gPasses[i].close) then m := gPasses[i].close(a[i], m); + a[i] := nil; // free the memory here + end +end; + +procedure processTopLevelStmt(n: PNode; var a: TPassContextArray); +var + i: int; + m: PNode; +begin + // this implements the code transformation pipeline + m := n; + for i := 0 to gPassesLen-1 do + if assigned(gPasses[i].process) then m := gPasses[i].process(a[i], m); +end; + +procedure processTopLevelStmtCached(n: PNode; var a: TPassContextArray); +var + i: int; + m: PNode; +begin + // this implements the code transformation pipeline + m := n; + for i := 0 to gPassesLen-1 do + if assigned(gPasses[i].openCached) then m := gPasses[i].process(a[i], m); +end; + +procedure closePassesCached(var a: TPassContextArray); +var + i: int; + m: PNode; +begin + m := nil; + for i := 0 to gPassesLen-1 do begin + if assigned(gPasses[i].openCached) and assigned(gPasses[i].close) then + m := gPasses[i].close(a[i], m); + a[i] := nil; // free the memory here + end +end; + +procedure processModule(module: PSym; const filename: string; + stream: PLLStream; rd: PRodReader); +var + p: TParser; + n: PNode; + a: TPassContextArray; + s: PLLStream; + i: int; +begin + if rd = nil then begin + openPasses(a, module, filename); + if stream = nil then begin + s := LLStreamOpen(filename, fmRead); + if s = nil then begin + rawMessage(errCannotOpenFile, filename); + exit + end; + end + else + s := stream; + while true do begin + openParser(p, filename, s); + while true do begin + n := parseTopLevelStmt(p); + if n = nil then break; + processTopLevelStmt(n, a) + end; + closeParser(p); + if s.kind <> llsStdIn then break; + end; + closePasses(a); + // id synchronization point for more consistent code generation: + IDsynchronizationPoint(1000); + end + else begin + openPassesCached(a, module, filename, rd); + n := loadInitSection(rd); + //MessageOut('init section' + renderTree(n)); + for i := 0 to sonsLen(n)-1 do processTopLevelStmtCached(n.sons[i], a); + closePassesCached(a); + end; +end; + +procedure initPass(var p: TPass); +begin + p.open := nil; + p.openCached := nil; + p.close := nil; + p.process := nil; +end; + +end. diff --git a/nim/pragmas.pas b/nim/pragmas.pas index 372d8d4a4..68bc366f1 100644 --- a/nim/pragmas.pas +++ b/nim/pragmas.pas @@ -197,10 +197,10 @@ begin while it <> nil do begin if it.kind = kind then begin if ospCaseInsensitive in platform.OS[targetOS].props then begin - if it.path = path then begin result := it; exit end; + if cmpIgnoreCase(it.path, path) = 0 then begin result := it; exit end; end else begin - if cmpIgnoreCase(it.path, path) = 0 then begin result := it; exit end; + if it.path = path then begin result := it; exit end; end end; it := PLib(it.next) diff --git a/nim/ptmplsyn.pas b/nim/ptmplsyn.pas new file mode 100644 index 000000000..2368b22c7 --- /dev/null +++ b/nim/ptmplsyn.pas @@ -0,0 +1,270 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit ptmplsyn; + +// This module implements the parser of the Nimrod Template files. + +{$include config.inc} + +interface + +uses + nsystem, llstream, nos, charsets, wordrecg, strutils, + ast, astalgo, msgs, options, pnimsyn; + +function ParseTmplFile(const filename: string): PNode; + + +type + TParseState = (psDirective, psMultiDir, psTempl); + TTmplParser = record + inp: PLLStream; + state: TParseState; + info: TLineInfo; + indent, par: int; + x: string; // the current input line + outp: PLLStream; // the ouput will be parsed by pnimsyn + subsChar: Char; + end; + +function ParseTmpl(var p: TTmplParser): PNode; + +procedure openTmplParser(var p: TTmplParser; const filename: string; + inputStream: PLLStream); +procedure closeTmplParser(var p: TTmplParser); + +implementation + +const + NimDirective = '#'; + PatternChars = ['a'..'z', 'A'..'Z', '0'..'9', #128..#255, '.', '_']; + +procedure newLine(var p: TTmplParser); +begin + LLStreamWrite(p.outp, repeatChar(p.par, ')')); + p.par := 0; + if p.info.line > int16(1) then LLStreamWrite(p.outp, nl); +end; + +procedure parseLine(var p: TTmplParser); +var + d, j, curly: int; + keyw: string; +begin + j := strStart; + while p.x[j] = ' ' do inc(j); + if p.state = psMultiDir then begin + newLine(p); + if p.x[j] = '*' then begin + inc(j); + if p.x[j] = NimDirective then p.state := psTempl; + // ignore the rest of the line + end + else + LLStreamWrite(p.outp, p.x); // simply add the whole line + end + else if p.x[j] = NimDirective then begin + newLine(p); + inc(j); + while p.x[j] = ' ' do inc(j); + d := j; + if p.x[j] = '*' then begin + inc(j); + p.state := psMultiDir; + LLStreamWrite(p.outp, repeatChar(p.indent)); + LLStreamWrite(p.outp, '#*'); + LLStreamWrite(p.outp, ncopy(p.x, j)); // simply add the whole line + end + else begin + keyw := ''; + while p.x[j] in PatternChars do begin + addChar(keyw, p.x[j]); + inc(j); + end; + case whichKeyword(keyw) of + wEnd: begin + if p.indent >= 2 then + dec(p.indent, 2) + else begin + p.info.col := int16(j); + liMessage(p.info, errXNotAllowedHere, 'end'); + end; + LLStreamWrite(p.outp, repeatChar(p.indent)); + LLStreamWrite(p.outp, '#end'); + end; + wSubsChar: begin + LLStreamWrite(p.outp, repeatChar(p.indent)); + LLStreamWrite(p.outp, '#subschar'); + while p.x[j] = ' ' do inc(j); + if p.x[j] in ['+', '-', '*', '/', '<', '>', '!', '?', '^', '.', + '|', '=', '%', '&', '$', '@', '~'] then p.subsChar := p.x[j] + else begin + p.info.col := int16(j); + liMessage(p.info, errXNotAllowedHere, p.x[j]+''); + end + end; + wIf, wWhen, wTry, wWhile, wFor, wBlock, wCase, wProc, wIterator, + wConverter, wMacro, wTemplate: begin + LLStreamWrite(p.outp, repeatChar(p.indent)); + LLStreamWrite(p.outp, ncopy(p.x, d)); + inc(p.indent, 2); + end; + wElif, wOf, wElse, wExcept, wFinally: begin + LLStreamWrite(p.outp, repeatChar(p.indent-2)); + LLStreamWrite(p.outp, ncopy(p.x, d)); + end + else begin + LLStreamWrite(p.outp, repeatChar(p.indent)); + LLStreamWrite(p.outp, ncopy(p.x, d)); + end + end; + p.state := psDirective; + end + end + else begin + // data line + j := strStart; + case p.state of + psTempl: begin + // next line of string literal: + LLStreamWrite(p.outp, ' &'+nl); + LLStreamWrite(p.outp, repeatChar(p.indent + 2)); + LLStreamWrite(p.outp, '"'+''); + end; + psDirective: begin + newLine(p); + LLStreamWrite(p.outp, repeatChar(p.indent)); + LLStreamWrite(p.outp, 'add(result, "'); + inc(p.par); + end; + else InternalError(p.info, 'parser in invalid state'); + end; + p.state := psTempl; + while true do begin + case p.x[j] of + #0: break; + #1..#31, #128..#255: begin + LLStreamWrite(p.outp, '\x'); + LLStreamWrite(p.outp, toHex(ord(p.x[j]), 2)); + inc(j); + end; + '\': begin LLStreamWrite(p.outp, '\\'); inc(j); end; + '''': begin LLStreamWrite(p.outp, '\'''); inc(j); end; + '"': begin LLStreamWrite(p.outp, '\"'); inc(j); end; + else if p.x[j] = p.subsChar then begin // parse Nimrod expression: + inc(j); + case p.x[j] of + '{': begin + p.info.col := int16(j); + LLStreamWrite(p.outp, '" & $('); + inc(j); + curly := 0; + while true do begin + case p.x[j] of + #0: liMessage(p.info, errXExpected, '}'+''); + '{': begin + inc(j); + inc(curly); + LLStreamWrite(p.outp, '{'+''); + end; + '}': begin + inc(j); + if curly = 0 then break; + if curly > 0 then dec(curly); + LLStreamWrite(p.outp, '}'+''); + end; + else begin + LLStreamWrite(p.outp, p.x[j]); + inc(j) + end + end + end; + LLStreamWrite(p.outp, ') & "') + end; + 'A'..'Z', 'a'..'z', '_': begin + LLStreamWrite(p.outp, '" & $'); + while p.x[j] in PatternChars do begin + LLStreamWrite(p.outp, p.x[j]); + inc(j) + end; + LLStreamWrite(p.outp, ' & "') + end; + else if p.x[j] = p.subsChar then begin + LLStreamWrite(p.outp, p.subsChar); + inc(j); + end + else begin + p.info.col := int16(j); + liMessage(p.info, errInvalidExpression, '$'+''); + end + end; + end + else begin + LLStreamWrite(p.outp, p.x[j]); + inc(j); + end + end + end; + LLStreamWrite(p.outp, '\n"'); + end +end; + +function ParseTmpl(var p: TTmplParser): PNode; +var + q: TParser; +begin + while not LLStreamAtEnd(p.inp) do begin + p.x := LLStreamReadLine(p.inp) {@ignore} + #0 {@emit}; + p.info.line := p.info.line + int16(1); + parseLine(p); + end; + newLine(p); + if gVerbosity >= 2 then begin + rawMessage(hintCodeBegin); + messageOut(p.outp.s); + rawMessage(hintCodeEnd); + end; + openParser(q, toFilename(p.info), p.outp); + result := ParseModule(q); + closeParser(q); +end; + +procedure openTmplParser(var p: TTmplParser; const filename: string; + inputStream: PLLStream); +begin +{@ignore} + FillChar(p, sizeof(p), 0); +{@emit} + p.info := newLineInfo(filename, 0, 0); + p.outp := LLStreamOpen(''); + p.inp := inputStream; + p.subsChar := '$'; +end; + +procedure CloseTmplParser(var p: TTmplParser); +begin + LLStreamClose(p.inp); +end; + +function ParseTmplFile(const filename: string): PNode; +var + p: TTmplParser; + f: TBinaryFile; +begin + if not OpenFile(f, filename) then begin + rawMessage(errCannotOpenFile, filename); + result := nil; + exit + end; + OpenTmplParser(p, filename, LLStreamOpen(f)); + result := ParseTmpl(p); + CloseTmplParser(p); +end; + +end. diff --git a/nim/rodread.pas b/nim/rodread.pas new file mode 100644 index 000000000..549cfec58 --- /dev/null +++ b/nim/rodread.pas @@ -0,0 +1,1134 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit rodread; + +// This module is responsible for loading of rod files. +(* + Reading and writing binary files are really hard to debug. Therefore we use + a special text format. ROD-files only describe the interface of a module. + Thus they are smaller than the source files most of the time. Even if they + are bigger, they are more efficient to process because symbols are only + loaded on demand. + It consists of: + + - a header: + NIM:$fileversion\n + - the module's id (even if the module changed, its ID will not!): + ID:Ax3\n + - CRC value of this module: + CRC:CRC-val\n + - a section containing the compiler options and defines this + module has been compiled with: + OPTIONS:options\n + DEFINES:defines\n + - FILES( + myfile.inc + lib/mymodA + ) + - a include file dependency section: + INCLUDES( + <fileidx> <CRC of myfile.inc>\n # fileidx is the LINE in the file section! + ) + - a module dependency section: + DEPS: <fileidx> <fileidx>\n + - an interface section: + INTERF( + identifier1 id\n # id is the symbol's id + identifier2 id\n + ) + - a compiler proc section: + COMPILERPROCS( + identifier1 id\n # id is the symbol's id + ) + - an index consisting of (ID, linenumber)-pairs: + INDEX( + id-diff idx-diff\n + id-diff idx-diff\n + ) + - an import index consisting of (ID, moduleID)-pairs: + IMPORTS( + id-diff moduleID-diff\n + id-diff moduleID-diff\n + ) + - a list of all exported type converters because they are needed for correct + semantic checking: + CONVERTERS:id id\n # position of the symbol in the DATA section + - an AST section that contains the module's AST: + INIT( + idx\n # position of the node in the DATA section + idx\n + ) + - a data section, where each type, symbol or AST is stored. + DATA( + type + (node) + sym + ) + + We now also do index compression, because an index always needs to be read. +*) + +interface + +{$include 'config.inc'} + +uses + sysutils, nsystem, nos, options, strutils, nversion, ast, astalgo, msgs, + platform, condsyms, ropes, idents, crc; + +type + TReasonForRecompile = ( + rrEmpty, // used by moddeps module + rrNone, // no need to recompile + rrRodDoesNotExist, // rod file does not exist + rrRodInvalid, // rod file is invalid + rrCrcChange, // file has been edited since last recompilation + rrDefines, // defines have changed + rrOptions, // options have changed + rrInclDeps, // an include has changed + rrModDeps // a module this module depends on has been changed + ); +const + reasonToFrmt: array [TReasonForRecompile] of string = ( + '', + 'no need to recompile: $1', + 'symbol file for $1 does not exist', + 'symbol file for $1 has the wrong version', + 'file edited since last compilation: $1', + 'list of conditional symbols changed for: $1', + 'list of options changed for: $1', + 'an include file edited: $1', + 'a module $1 depends on has changed' + ); + +type + TIndex = record // an index with compression + lastIdxKey, lastIdxVal: int; + tab: TIITable; + r: PRope; // writers use this + offset: int; // readers use this + end; + TRodReader = object(NObject) + pos: int; // position; used for parsing + s: string; // the whole file in memory + options: TOptions; + reason: TReasonForRecompile; + modDeps: TStringSeq; + files: TStringSeq; + dataIdx: int; // offset of start of data section + convertersIdx: int; // offset of start of converters section + initIdx, interfIdx, compilerProcsIdx: int; + filename: string; + index, imports: TIndex; + readerIndex: int; + line: int; // only used for debugging, but is always in the code + moduleID: int; + syms: TIdTable; // already processed symbols + end; + PRodReader = ^TRodReader; + +const + FileVersion = '1012'; // modify this if the rod-format changes! + +var + rodCompilerprocs: TStrTable; // global because this is needed by magicsys + + +function handleSymbolFile(module: PSym; const filename: string): PRodReader; +function GetCRC(const filename: string): TCrc32; + +function loadInitSection(r: PRodReader): PNode; + +procedure loadStub(s: PSym); + +function encodeInt(x: BiggestInt): PRope; +function encode(const s: string): PRope; + +implementation + +var + gTypeTable: TIdTable; + +function rrGetSym(r: PRodReader; id: int; const info: TLineInfo): PSym; forward; + // `info` is only used for debugging purposes + +function rrGetType(r: PRodReader; id: int; const info: TLineInfo): PType; forward; + +function decode(r: PRodReader): string; forward; +function decodeInt(r: PRodReader): int; forward; +function decodeBInt(r: PRodReader): biggestInt; forward; + +function encode(const s: string): PRope; +var + i: int; + res: string; +begin + res := ''; + for i := strStart to length(s)+strStart-1 do begin + case s[i] of + '0'..'9', 'a'..'z', 'A'..'Z', '_': + addChar(res, s[i]); + else + res := res +{&} '\' +{&} toHex(ord(s[i]), 2) + end + end; + result := toRope(res); +end; + +procedure encodeIntAux(var str: string; x: BiggestInt); +const + chars: string = + '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; +var + v, rem: biggestInt; + d: char; + idx: int; +begin + v := x; + rem := v mod 190; + if (rem < 0) then begin + str := str + '-'; + v := -(v div 190); + rem := -rem; + end + else + v := v div 190; + idx := int(rem); + if idx < 62 then d := chars[idx+strStart] + else d := chr(idx - 62 + 128); + if (v <> 0) then encodeIntAux(str, v); + addChar(str, d); +end; + +function encodeInt(x: BiggestInt): PRope; +var + res: string; +begin + res := ''; + encodeIntAux(res, x); + result := toRope(res); +end; + + +procedure decodeLineInfo(r: PRodReader; var info: TLineInfo); +begin + if r.s[r.pos] = '?' then begin + inc(r.pos); + if r.s[r.pos] = ',' then + info.col := int16(-1) + else + info.col := int16(decodeInt(r)); + if r.s[r.pos] = ',' then begin + inc(r.pos); + if r.s[r.pos] = ',' then info.line := int16(-1) + else info.line := int16(decodeInt(r)); + if r.s[r.pos] = ',' then begin + inc(r.pos); + info := newLineInfo(r.files[decodeInt(r)], info.line, info.col); + end + end + end +end; + +function decodeNode(r: PRodReader; const fInfo: TLineInfo): PNode; +var + id: int; + fl: string; +begin + result := nil; + if r.s[r.pos] = '(' then begin + inc(r.pos); + if r.s[r.pos] = ')' then begin + inc(r.pos); exit; // nil node + end; + result := newNodeI(TNodeKind(decodeInt(r)), fInfo); + decodeLineInfo(r, result.info); + if r.s[r.pos] = '$' then begin + inc(r.pos); + result.flags := {@cast}TNodeFlags(int32(decodeInt(r))); + end; + if r.s[r.pos] = '^' then begin + inc(r.pos); + id := decodeInt(r); + result.typ := rrGetType(r, id, result.info); + end; + case result.kind of + nkCharLit..nkInt64Lit: begin + if r.s[r.pos] = '!' then begin + inc(r.pos); + result.intVal := decodeBInt(r); + end + end; + nkFloatLit..nkFloat64Lit: begin + if r.s[r.pos] = '!' then begin + inc(r.pos); + fl := decode(r); + result.floatVal := parseFloat(fl); + end + end; + nkStrLit..nkTripleStrLit: begin + if r.s[r.pos] = '!' then begin + inc(r.pos); + result.strVal := decode(r); + end + else + result.strVal := ''; // BUGFIX + end; + nkIdent: begin + if r.s[r.pos] = '!' then begin + inc(r.pos); + fl := decode(r); + result.ident := getIdent(fl); + end + else + internalError(result.info, 'decodeNode: nkIdent'); + end; + nkSym: begin + if r.s[r.pos] = '!' then begin + inc(r.pos); + id := decodeInt(r); + result.sym := rrGetSym(r, id, result.info); + end + else + internalError(result.info, 'decodeNode: nkSym'); + end; + else begin + while r.s[r.pos] <> ')' do + addSon(result, decodeNode(r, result.info)); + end + end; + if r.s[r.pos] = ')' then inc(r.pos) + else internalError(result.info, 'decodeNode'); + end + else InternalError(result.info, 'decodeNode ' + r.s[r.pos]) +end; + +procedure decodeLoc(r: PRodReader; var loc: TLoc; const info: TLineInfo); +begin + if r.s[r.pos] = '<' then begin + inc(r.pos); + if r.s[r.pos] in ['0'..'9', 'a'..'z', 'A'..'Z'] then + loc.k := TLocKind(decodeInt(r)) + else + loc.k := low(loc.k); + if r.s[r.pos] = '*' then begin + inc(r.pos); + loc.s := TStorageLoc(decodeInt(r)); + end + else + loc.s := low(loc.s); + if r.s[r.pos] = '$' then begin + inc(r.pos); + loc.flags := {@cast}TLocFlags(int32(decodeInt(r))); + end + else + loc.flags := {@set}[]; + if r.s[r.pos] = '^' then begin + inc(r.pos); + loc.t := rrGetType(r, decodeInt(r), info); + end + else + loc.t := nil; + if r.s[r.pos] = '!' then begin + inc(r.pos); + loc.r := toRope(decode(r)); + end + else + loc.r := nil; + if r.s[r.pos] = '?' then begin + inc(r.pos); + loc.a := decodeInt(r); + end + else + loc.a := 0; + if r.s[r.pos] = '>' then inc(r.pos) + else InternalError(info, 'decodeLoc ' + r.s[r.pos]); + end +end; + +function decodeType(r: PRodReader; const info: TLineInfo): PType; +var + d: int; +begin + result := nil; + if r.s[r.pos] = '[' then begin + inc(r.pos); + if r.s[r.pos] = ']' then begin + inc(r.pos); exit; // nil type + end; + end; + new(result); +{@ignore} + FillChar(result^, sizeof(result^), 0); +{@emit} + result.kind := TTypeKind(decodeInt(r)); + if r.s[r.pos] = '+' then begin + inc(r.pos); + result.id := decodeInt(r); + setId(result.id); + if debugIds then registerID(result); + end + else + InternalError(info, 'decodeType: no id'); + IdTablePut(gTypeTable, result, result); // here this also + // avoids endless recursion for recursive type + if r.s[r.pos] = '(' then + result.n := decodeNode(r, UnknownLineInfo()); + if r.s[r.pos] = '$' then begin + inc(r.pos); + result.flags := {@cast}TTypeFlags(int32(decodeInt(r))); + end; + if r.s[r.pos] = '?' then begin + inc(r.pos); + result.callConv := TCallingConvention(decodeInt(r)); + end; + if r.s[r.pos] = '*' then begin + inc(r.pos); + result.owner := rrGetSym(r, decodeInt(r), info); + end; + if r.s[r.pos] = '&' then begin + inc(r.pos); + result.sym := rrGetSym(r, decodeInt(r), info); + end; + if r.s[r.pos] = '/' then begin + inc(r.pos); + result.size := decodeInt(r); + end + else result.size := -1; + if r.s[r.pos] = '=' then begin + inc(r.pos); + result.align := decodeInt(r); + end + else result.align := 2; + if r.s[r.pos] = '@' then begin + inc(r.pos); + result.containerID := decodeInt(r); + end; + decodeLoc(r, result.loc, info); + while r.s[r.pos] = '^' do begin + inc(r.pos); + if r.s[r.pos] = '(' then begin + inc(r.pos); + if r.s[r.pos] = ')' then inc(r.pos) + else InternalError(info, 'decodeType ^(' + r.s[r.pos]); + addSon(result, nil); + end + else begin + d := decodeInt(r); + addSon(result, rrGetType(r, d, info)); + end; + end +end; + +function decodeLib(r: PRodReader): PLib; +begin + result := nil; + if r.s[r.pos] = '|' then begin + new(result); + {@ignore} + fillChar(result^, sizeof(result^), 0); + {@emit} + inc(r.pos); + result.kind := TLibKind(decodeInt(r)); + if r.s[r.pos] <> '|' then InternalError('decodeLib: 1'); + inc(r.pos); + result.name := toRope(decode(r)); + if r.s[r.pos] <> '|' then InternalError('decodeLib: 2'); + inc(r.pos); + result.path := decode(r); + end +end; + +function decodeSym(r: PRodReader; const info: TLineInfo): PSym; +var + k: TSymKind; + id: int; + ident: PIdent; +begin + result := nil; + if r.s[r.pos] = '{' then begin + inc(r.pos); + if r.s[r.pos] = '}' then begin + inc(r.pos); exit; // nil sym + end + end; + k := TSymKind(decodeInt(r)); + if r.s[r.pos] = '+' then begin + inc(r.pos); + id := decodeInt(r); + setId(id); + end + else + InternalError(info, 'decodeSym: no id'); + if r.s[r.pos] = '&' then begin + inc(r.pos); + ident := getIdent(decode(r)); + end + else + InternalError(info, 'decodeSym: no ident'); + result := PSym(IdTableGet(r.syms, id)); + if result = nil then begin + new(result); + {@ignore} + FillChar(result^, sizeof(result^), 0); + {@emit} + result.id := id; + IdTablePut(r.syms, result, result); + if debugIds then registerID(result); + end + else if (result.id <> id) then + InternalError(info, 'decodeSym: wrong id'); + result.kind := k; + result.name := ident; + // read the rest of the symbol description: + if r.s[r.pos] = '^' then begin + inc(r.pos); + result.typ := rrGetType(r, decodeInt(r), info); + end; + decodeLineInfo(r, result.info); + if r.s[r.pos] = '*' then begin + inc(r.pos); + result.owner := rrGetSym(r, decodeInt(r), result.info); + end; + if r.s[r.pos] = '$' then begin + inc(r.pos); + result.flags := {@cast}TSymFlags(int32(decodeInt(r))); + end; + if r.s[r.pos] = '@' then begin + inc(r.pos); + result.magic := TMagic(decodeInt(r)); + end; + if r.s[r.pos] = '(' then + result.ast := decodeNode(r, result.info); + if r.s[r.pos] = '!' then begin + inc(r.pos); + result.options := {@cast}TOptions(int32(decodeInt(r))); + end + else + result.options := r.options; + if r.s[r.pos] = '%' then begin + inc(r.pos); + result.position := decodeInt(r); + end + else + result.position := 0; // BUGFIX: this may have been misused as reader index! + if r.s[r.pos] = '`' then begin + inc(r.pos); + result.offset := decodeInt(r); + end + else + result.offset := -1; + decodeLoc(r, result.loc, result.info); + result.annex := decodeLib(r); +end; + +function decodeInt(r: PRodReader): int; // base 190 numbers +var + i: int; + sign: int; +begin + i := r.pos; + sign := -1; + assert(r.s[i] in ['0'..'9', 'a'..'z', 'A'..'Z', '-', #128..#255]); + if r.s[i] = '-' then begin + inc(i); + sign := 1 + end; + result := 0; + while true do begin + case r.s[i] of + '0'..'9': result := result * 190 - (ord(r.s[i]) - ord('0')); + 'a'..'z': result := result * 190 - (ord(r.s[i]) - ord('a') + 10); + 'A'..'Z': result := result * 190 - (ord(r.s[i]) - ord('A') + 36); + #128..#255: result := result * 190 - (ord(r.s[i]) - 128 + 62); + else break; + end; + inc(i) + end; + result := result * sign; + r.pos := i +end; + +function decodeBInt(r: PRodReader): biggestInt; +var + i: int; + sign: biggestInt; +begin + i := r.pos; + sign := -1; + assert(r.s[i] in ['0'..'9', 'a'..'z', 'A'..'Z', '-', #128..#255]); + if r.s[i] = '-' then begin + inc(i); + sign := 1 + end; + result := 0; + while true do begin + case r.s[i] of + '0'..'9': result := result * 190 - (ord(r.s[i]) - ord('0')); + 'a'..'z': result := result * 190 - (ord(r.s[i]) - ord('a') + 10); + 'A'..'Z': result := result * 190 - (ord(r.s[i]) - ord('A') + 36); + #128..#255: result := result * 190 - (ord(r.s[i]) - 128 + 62); + else break; + end; + inc(i) + end; + result := result * sign; + r.pos := i +end; + +procedure hexChar(c: char; var xi: int); +begin + case c of + '0'..'9': xi := (xi shl 4) or (ord(c) - ord('0')); + 'a'..'f': xi := (xi shl 4) or (ord(c) - ord('a') + 10); + 'A'..'F': xi := (xi shl 4) or (ord(c) - ord('A') + 10); + else begin end + end +end; + +function decode(r: PRodReader): string; +var + i, xi: int; +begin + i := r.pos; + result := ''; + while true do begin + case r.s[i] of + '\': begin + inc(i, 3); xi := 0; + hexChar(r.s[i-2], xi); + hexChar(r.s[i-1], xi); + addChar(result, chr(xi)); + end; + 'a'..'z', '0'..'9', 'A'..'Z', '_': begin + addChar(result, r.s[i]); + inc(i); + end + else break + end + end; + r.pos := i; +end; + +procedure skipSection(r: PRodReader); +var + c: int; +begin + if r.s[r.pos] = ':' then begin + while r.s[r.pos] > #10 do inc(r.pos); + end + else if r.s[r.pos] = '(' then begin + c := 0; // count () pairs + inc(r.pos); + while true do begin + case r.s[r.pos] of + #10: inc(r.line); + '(': inc(c); + ')': begin + if c = 0 then begin inc(r.pos); break end + else if c > 0 then dec(c); + end; + #0: break; // end of file + else begin end; + end; + inc(r.pos); + end + end + else + InternalError('skipSection ' + toString(r.line)); +end; + +function rdWord(r: PRodReader): string; +begin + result := ''; + while r.s[r.pos] in ['A'..'Z', '_', 'a'..'z', '0'..'9'] do begin + addChar(result, r.s[r.pos]); + inc(r.pos); + end; +end; + +function newStub(r: PRodReader; const name: string; id: int): PSym; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit} + result.kind := skStub; + result.id := id; + result.name := getIdent(name); + result.position := r.readerIndex; + setID(id); + //MessageOut(result.name.s); + if debugIds then registerID(result); +end; + +procedure processInterf(r: PRodReader; module: PSym); +var + s: PSym; + w: string; + key: int; +begin + if r.interfIdx = 0 then InternalError('processInterf'); + r.pos := r.interfIdx; + while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin + w := decode(r); + inc(r.pos); + key := decodeInt(r); + inc(r.pos); // #10 + s := newStub(r, w, key); + s.owner := module; + StrTableAdd(module.tab, s); + IdTablePut(r.syms, s, s); + end; +end; + +procedure processCompilerProcs(r: PRodReader; module: PSym); +var + s: PSym; + w: string; + key: int; +begin + if r.compilerProcsIdx = 0 then InternalError('processCompilerProcs'); + r.pos := r.compilerProcsIdx; + while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin + w := decode(r); + inc(r.pos); + key := decodeInt(r); + inc(r.pos); // #10 + s := PSym(IdTableGet(r.syms, key)); + if s = nil then begin + s := newStub(r, w, key); + s.owner := module; + IdTablePut(r.syms, s, s); + end; + StrTableAdd(rodCompilerProcs, s); + end; +end; + +procedure processIndex(r: PRodReader; var idx: TIndex); +var + key, val, tmp: int; +begin + inc(r.pos, 2); // skip "(\10" + inc(r.line); + while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin + tmp := decodeInt(r); + if r.s[r.pos] = ' ' then begin + inc(r.pos); + key := idx.lastIdxKey + tmp; + val := decodeInt(r) + idx.lastIdxVal; + end + else begin + key := idx.lastIdxKey + 1; + val := tmp + idx.lastIdxVal; + end; + IITablePut(idx.tab, key, val); + idx.lastIdxKey := key; + idx.lastIdxVal := val; + setID(key); // ensure that this id will not be used + if r.s[r.pos] = #10 then begin inc(r.pos); inc(r.line) end; + end; + if r.s[r.pos] = ')' then inc(r.pos); +end; + +procedure processRodFile(r: PRodReader; crc: TCrc32); +var + section, w: string; + d, L, inclCrc: int; +begin + while r.s[r.pos] <> #0 do begin + section := rdWord(r); + if r.reason <> rrNone then break; // no need to process this file further + if section = 'CRC' then begin + inc(r.pos); // skip ':' + if int(crc) <> decodeInt(r) then + r.reason := rrCrcChange + end + else if section = 'ID' then begin + inc(r.pos); // skip ':' + r.moduleID := decodeInt(r); + setID(r.moduleID); + end + else if section = 'OPTIONS' then begin + inc(r.pos); // skip ':' + r.options := {@cast}TOptions(int32(decodeInt(r))); + if options.gOptions <> r.options then r.reason := rrOptions + end + else if section = 'DEFINES' then begin + inc(r.pos); // skip ':' + d := 0; + while r.s[r.pos] > #10 do begin + w := decode(r); + inc(d); + if not condsyms.isDefined(getIdent(w)) then begin + r.reason := rrDefines; + //MessageOut('not defined, but should: ' + w); + end; + if r.s[r.pos] = ' ' then inc(r.pos); + end; + if (d <> countDefinedSymbols()) then + r.reason := rrDefines + end + else if section = 'FILES' then begin + inc(r.pos, 2); // skip "(\10" + inc(r.line); + L := 0; + while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin + setLength(r.files, L+1); + r.files[L] := decode(r); + inc(r.pos); // skip #10 + inc(r.line); + inc(L); + end; + if r.s[r.pos] = ')' then inc(r.pos); + end + else if section = 'INCLUDES' then begin + inc(r.pos, 2); // skip "(\10" + inc(r.line); + while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin + w := r.files[decodeInt(r)]; + inc(r.pos); // skip ' ' + inclCrc := decodeInt(r); + if r.reason = rrNone then begin + if not ExistsFile(w) or (inclCrc <> int(crcFromFile(w))) then + r.reason := rrInclDeps + end; + if r.s[r.pos] = #10 then begin inc(r.pos); inc(r.line) end; + end; + if r.s[r.pos] = ')' then inc(r.pos); + end + else if section = 'DEPS' then begin + inc(r.pos); // skip ':' + L := 0; + while (r.s[r.pos] > #10) do begin + setLength(r.modDeps, L+1); + r.modDeps[L] := r.files[decodeInt(r)]; + inc(L); + if r.s[r.pos] = ' ' then inc(r.pos); + end; + end + else if section = 'INTERF' then begin + r.interfIdx := r.pos+2; + skipSection(r); + end + else if section = 'COMPILERPROCS' then begin + r.compilerProcsIdx := r.pos+2; + skipSection(r); + end + else if section = 'INDEX' then begin + processIndex(r, r.index); + end + else if section = 'IMPORTS' then begin + processIndex(r, r.imports); + end + else if section = 'CONVERTERS' then begin + r.convertersIdx := r.pos+1; + skipSection(r); + end + else if section = 'DATA' then begin + r.dataIdx := r.pos+2; // "(\10" + // We do not read the DATA section here! We read the needed objects on + // demand. + skipSection(r); + end + else if section = 'INIT' then begin + r.initIdx := r.pos+2; // "(\10" + skipSection(r); + end + else begin + MessageOut('skipping section: ' + toString(r.pos)); + skipSection(r); + end; + if r.s[r.pos] = #10 then begin inc(r.pos); inc(r.line) end; + end +end; + +function newRodReader(const modfilename: string; crc: TCrc32; + readerIndex: int): PRodReader; +var + version: string; + r: PRodReader; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit result.files := @[];} +{@emit result.modDeps := @[];} + r := result; + r.reason := rrNone; + r.pos := strStart; + r.line := 1; + r.readerIndex := readerIndex; + r.filename := modfilename; + InitIdTable(r.syms); + r.s := readFile(modfilename) {@ignore} + #0 {@emit}; + if startsWith(r.s, 'NIM:') then begin + initIITable(r.index.tab); + initIITable(r.imports.tab); + // looks like a ROD file + inc(r.pos, 4); + version := ''; + while not (r.s[r.pos] in [#0,#10]) do begin + addChar(version, r.s[r.pos]); + inc(r.pos); + end; + if r.s[r.pos] = #10 then inc(r.pos); + if version = FileVersion then begin + // since ROD files are only for caching, no backwarts compability is + // needed + processRodFile(r, crc); + end + else + result := nil + end + else + result := nil; +end; + +function rrGetType(r: PRodReader; id: int; const info: TLineInfo): PType; +var + oldPos, d: int; +begin + result := PType(IdTableGet(gTypeTable, id)); + if result = nil then begin + // load the type: + oldPos := r.pos; + d := IITableGet(r.index.tab, id); + if d = invalidKey then InternalError(info, 'rrGetType'); + r.pos := d + r.dataIdx; + result := decodeType(r, info); + r.pos := oldPos; + end; +end; + +type + TFileModuleRec = record + filename: string; + reason: TReasonForRecompile; + rd: PRodReader; + crc: TCrc32; + end; + TFileModuleMap = array of TFileModuleRec; +var + gMods: TFileModuleMap = {@ignore} nil {@emit @[]}; // all compiled modules + +function decodeSymSafePos(rd: PRodReader; offset: int; + const info: TLineInfo): PSym; +var + oldPos: int; +begin + if rd.dataIdx = 0 then InternalError(info, 'dataIdx == 0'); + oldPos := rd.pos; + rd.pos := offset + rd.dataIdx; + result := decodeSym(rd, info); + rd.pos := oldPos; +end; + +function rrGetSym(r: PRodReader; id: int; const info: TLineInfo): PSym; +var + d, i, moduleID: int; + rd: PRodReader; +begin + result := PSym(IdTableGet(r.syms, id)); + if result = nil then begin + // load the symbol: + d := IITableGet(r.index.tab, id); + if d = invalidKey then begin + moduleID := IiTableGet(r.imports.tab, id); + if moduleID < 0 then + InternalError(info, + 'missing from both indexes: +' + ropeToStr(encodeInt(id))); + // find the reader with the correct moduleID: + for i := 0 to high(gMods) do begin + rd := gMods[i].rd; + if (rd <> nil) then begin + if (rd.moduleID = moduleID) then begin + d := IITableGet(rd.index.tab, id); + if d <> invalidKey then begin + result := decodeSymSafePos(rd, d, info); + break + end + else + InternalError(info, + 'rrGetSym: no reader found: +' + ropeToStr(encodeInt(id))); + end + else begin + //if IiTableGet(rd.index.tab, id) <> invalidKey then + // XXX expensive check! + //InternalError(info, + //'id found in other module: +' + ropeToStr(encodeInt(id))) + end + end + end; + end + else begin + // own symbol: + result := decodeSymSafePos(r, d, info); + end; + end; + if (result <> nil) and (result.kind = skStub) then loadStub(result); +end; + +function loadInitSection(r: PRodReader): PNode; +var + d, oldPos, p: int; +begin + if (r.initIdx = 0) or (r.dataIdx = 0) then InternalError('loadInitSection'); + oldPos := r.pos; + r.pos := r.initIdx; + result := newNode(nkStmtList); + while (r.s[r.pos] > #10) and (r.s[r.pos] <> ')') do begin + d := decodeInt(r); + inc(r.pos); // #10 + p := r.pos; + r.pos := d + r.dataIdx; + addSon(result, decodeNode(r, UnknownLineInfo())); + r.pos := p; + end; + r.pos := oldPos; +end; + +procedure loadConverters(r: PRodReader); +var + d: int; +begin + // We have to ensure that no exported converter is a stub anymore. + if (r.convertersIdx = 0) or (r.dataIdx = 0) then + InternalError('importConverters'); + r.pos := r.convertersIdx; + while (r.s[r.pos] > #10) do begin + d := decodeInt(r); + {@discard} rrGetSym(r, d, UnknownLineInfo()); + if r.s[r.pos] = ' ' then inc(r.pos) + end; +end; + +function getModuleIdx(const filename: string): int; +var + i: int; +begin + for i := 0 to high(gMods) do + if sameFile(gMods[i].filename, filename) then begin + result := i; exit + end; + // not found, reserve space: + result := length(gMods); + setLength(gMods, result+1); +end; + +function checkDep(const filename: string): TReasonForRecompile; +var + crc: TCrc32; + r: PRodReader; + rodfile: string; + idx, i: int; + res: TReasonForRecompile; +begin + idx := getModuleIdx(filename); + if gMods[idx].reason <> rrEmpty then begin + // reason has already been computed for this module: + result := gMods[idx].reason; exit + end; + crc := crcFromFile(filename); + gMods[idx].reason := rrNone; // we need to set it here to avoid cycles + gMods[idx].filename := filename; + gMods[idx].crc := crc; + result := rrNone; + r := nil; + rodfile := toGeneratedFile(filename, RodExt); + if ExistsFile(rodfile) then begin + r := newRodReader(rodfile, crc, idx); + if r = nil then + result := rrRodInvalid + else begin + result := r.reason; + if result = rrNone then begin + // check modules it depends on + // NOTE: we need to process the entire module graph so that no ID will + // be used twice! However, compilation speed does not suffer much from + // this, since results are cached. + res := checkDep(JoinPath(options.libpath, + appendFileExt('system', nimExt))); + if res <> rrNone then result := rrModDeps; + for i := 0 to high(r.modDeps) do begin + res := checkDep(r.modDeps[i]); + if res <> rrNone then begin + result := rrModDeps; + //break // BUGFIX: cannot break here! + end + end + end + end + end + else + result := rrRodDoesNotExist; + if (result <> rrNone) and (gVerbosity > 0) then + MessageOut(format(reasonToFrmt[result], [filename])); + if (result <> rrNone) or (optForceFullMake in gGlobalOptions) then begin + // recompilation is necessary: + r := nil; + end; + gMods[idx].rd := r; + gMods[idx].reason := result; // now we know better +end; + +function handleSymbolFile(module: PSym; const filename: string): PRodReader; +var + idx: int; +begin + if not (optSymbolFiles in gGlobalOptions) then begin + module.id := getID(); + result := nil; + exit + end; + {@discard} checkDep(filename); + idx := getModuleIdx(filename); + if gMods[idx].reason = rrEmpty then InternalError('handleSymbolFile'); + result := gMods[idx].rd; + if result <> nil then begin + module.id := result.moduleID; + IdTablePut(result.syms, module, module); + processInterf(result, module); + processCompilerProcs(result, module); + loadConverters(result); + end + else + module.id := getID(); +end; + +function GetCRC(const filename: string): TCrc32; +var + idx: int; +begin + idx := getModuleIdx(filename); + result := gMods[idx].crc; +end; + +procedure loadStub(s: PSym); +var + rd: PRodReader; + d, theId: int; + rs: PSym; +begin + if s.kind <> skStub then InternalError('loadStub'); + //MessageOut('loading stub: ' + s.name.s); + rd := gMods[s.position].rd; + theId := s.id; // used for later check + d := IITableGet(rd.index.tab, s.id); + if d = invalidKey then InternalError('loadStub: invalid key'); + rs := decodeSymSafePos(rd, d, UnknownLineInfo()); + if rs <> s then InternalError(rs.info, 'loadStub: wrong symbol') + else if rs.id <> theId then InternalError(rs.info, 'loadStub: wrong ID'); + //MessageOut('loaded stub: ' + s.name.s); +end; + +initialization + InitIdTable(gTypeTable); + InitStrTable(rodCompilerProcs); +end. diff --git a/nim/rodwrite.pas b/nim/rodwrite.pas new file mode 100644 index 000000000..64f3d6733 --- /dev/null +++ b/nim/rodwrite.pas @@ -0,0 +1,609 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit rodwrite; + +// This module is responsible for writing of rod files. Note that writing of +// rod files is a pass, reading of rod files is not! This is why reading and +// writing of rod files is split into two different modules. + +interface + +{$include 'config.inc'} + +uses + sysutils, nsystem, nos, options, strutils, nversion, ast, astalgo, msgs, + platform, condsyms, ropes, idents, crc, rodread, passes, importer; + +function rodwritePass(): TPass; + +implementation + +type + TRodWriter = object(TPassContext) + module: PSym; + crc: TCrc32; + options: TOptions; + defines: PRope; + inclDeps: PRope; + modDeps: PRope; + interf: PRope; + compilerProcs: PRope; + index, imports: TIndex; + converters: PRope; + init: PRope; + data: PRope; + filename: string; + sstack: TSymSeq; // a stack of symbols to process + tstack: TTypeSeq; // a stack of types to process + files: TStringSeq; + end; + PRodWriter = ^TRodWriter; + +function newRodWriter(const modfilename: string; crc: TCrc32; + module: PSym): PRodWriter; forward; +procedure addModDep(w: PRodWriter; const dep: string); forward; +procedure addInclDep(w: PRodWriter; const dep: string); forward; +procedure addInterfaceSym(w: PRodWriter; s: PSym); forward; +procedure addStmt(w: PRodWriter; n: PNode); forward; +procedure writeRod(w: PRodWriter); forward; + +function encodeStr(w: PRodWriter; const s: string): PRope; +begin + result := encode(s) +end; + +procedure processStacks(w: PRodWriter); forward; + +function getDefines: PRope; +var + it: TTabIter; + s: PSym; +begin + s := InitTabIter(it, gSymbols); + result := nil; + while s <> nil do begin + if s.position = 1 then begin + if result <> nil then app(result, ' '+''); + app(result, s.name.s); + end; + s := nextIter(it, gSymbols); + end +end; + +function fileIdx(w: PRodWriter; const filename: string): int; +var + i: int; +begin + for i := 0 to high(w.files) do begin + if w.files[i] = filename then begin result := i; exit end; + end; + result := length(w.files); + setLength(w.files, result+1); + w.files[result] := filename; +end; + +function newRodWriter(const modfilename: string; crc: TCrc32; + module: PSym): PRodWriter; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit + result.sstack := @[];} +{@emit + result.tstack := @[];} + InitIITable(result.index.tab); + InitIITable(result.imports.tab); + result.filename := modfilename; + result.crc := crc; + result.module := module; + result.defines := getDefines(); + result.options := options.gOptions; + {@emit result.files := @[];} +end; + +procedure addModDep(w: PRodWriter; const dep: string); +begin + if w.modDeps <> nil then app(w.modDeps, ' '+''); + app(w.modDeps, encodeInt(fileIdx(w, dep))); +end; + +const + rodNL = #10+''; + +procedure addInclDep(w: PRodWriter; const dep: string); +begin + app(w.inclDeps, encodeInt(fileIdx(w, dep))); + app(w.inclDeps, ' '+''); + app(w.inclDeps, encodeInt(crcFromFile(dep))); + app(w.inclDeps, rodNL); +end; + +procedure pushType(w: PRodWriter; t: PType); +var + L: int; +begin + // check so that the stack does not grow too large: + if IiTableGet(w.index.tab, t.id) = invalidKey then begin + L := length(w.tstack); + setLength(w.tstack, L+1); + w.tstack[L] := t; + end +end; + +procedure pushSym(w: PRodWriter; s: PSym); +var + L: int; +begin + // check so that the stack does not grow too large: + if IiTableGet(w.index.tab, s.id) = invalidKey then begin + L := length(w.sstack); + setLength(w.sstack, L+1); + w.sstack[L] := s; + end +end; + +function encodeNode(w: PRodWriter; const fInfo: TLineInfo; n: PNode): PRope; +var + i: int; + f: TNodeFlags; +begin + if n = nil then begin + // nil nodes have to be stored too: + result := toRope('()'); exit + end; + result := toRope('('+''); + app(result, encodeInt(ord(n.kind))); + // we do not write comments for now + // Line information takes easily 20% or more of the filesize! Therefore we + // omit line information if it is the same as the father's line information: + if (finfo.fileIndex <> n.info.fileIndex) then + appf(result, '?$1,$2,$3', [encodeInt(n.info.col), encodeInt(n.info.line), + encodeInt(fileIdx(w, toFilename(n.info)))]) + else if (finfo.line <> n.info.line) then + appf(result, '?$1,$2', [encodeInt(n.info.col), encodeInt(n.info.line)]) + else if (finfo.col <> n.info.col) then + appf(result, '?$1', [encodeInt(n.info.col)]); + // No need to output the file index, as this is the serialization of one + // file. + f := n.flags * PersistentNodeFlags; + if f <> {@set}[] then + appf(result, '$$$1', [encodeInt({@cast}int32(f))]); + if n.typ <> nil then begin + appf(result, '^$1', [encodeInt(n.typ.id)]); + pushType(w, n.typ); + end; + case n.kind of + nkCharLit..nkInt64Lit: begin + if n.intVal <> 0 then + appf(result, '!$1', [encodeInt(n.intVal)]); + end; + nkFloatLit..nkFloat64Lit: begin + if n.floatVal <> 0.0 then + appf(result, '!$1', [encodeStr(w, toStringF(n.floatVal))]); + end; + nkStrLit..nkTripleStrLit: begin + if n.strVal <> '' then + appf(result, '!$1', [encodeStr(w, n.strVal)]); + end; + nkIdent: + appf(result, '!$1', [encodeStr(w, n.ident.s)]); + nkSym: begin + appf(result, '!$1', [encodeInt(n.sym.id)]); + pushSym(w, n.sym); + end; + else begin + for i := 0 to sonsLen(n)-1 do + app(result, encodeNode(w, n.info, n.sons[i])); + end + end; + app(result, ')'+''); +end; + +function encodeLoc(w: PRodWriter; const loc: TLoc): PRope; +begin + result := nil; + if loc.k <> low(loc.k) then + app(result, encodeInt(ord(loc.k))); + if loc.s <> low(loc.s) then + appf(result, '*$1', [encodeInt(ord(loc.s))]); + if loc.flags <> {@set}[] then + appf(result, '$$$1', [encodeInt({@cast}int32(loc.flags))]); + if loc.t <> nil then begin + appf(result, '^$1', [encodeInt(loc.t.id)]); + pushType(w, loc.t); + end; + if loc.r <> nil then + appf(result, '!$1', [encodeStr(w, ropeToStr(loc.r))]); + if loc.a <> 0 then + appf(result, '?$1', [encodeInt(loc.a)]); + if result <> nil then + result := ropef('<$1>', [result]); +end; + +function encodeType(w: PRodWriter; t: PType): PRope; +var + i: int; +begin + if t = nil then begin + // nil nodes have to be stored too: + result := toRope('[]'); exit + end; + result := nil; + if t.kind = tyForward then InternalError('encodeType: tyForward'); + app(result, encodeInt(ord(t.kind))); + appf(result, '+$1', [encodeInt(t.id)]); + if t.n <> nil then + app(result, encodeNode(w, UnknownLineInfo(), t.n)); + if t.flags <> {@set}[] then + appf(result, '$$$1', [encodeInt({@cast}int32(t.flags))]); + if t.callConv <> low(t.callConv) then + appf(result, '?$1', [encodeInt(ord(t.callConv))]); + if t.owner <> nil then begin + appf(result, '*$1', [encodeInt(t.owner.id)]); + pushSym(w, t.owner); + end; + if t.sym <> nil then begin + appf(result, '&$1', [encodeInt(t.sym.id)]); + pushSym(w, t.sym); + end; + if t.size <> -1 then appf(result, '/$1', [encodeInt(t.size)]); + if t.align <> 2 then appf(result, '=$1', [encodeInt(t.align)]); + if t.containerID <> 0 then + appf(result, '@$1', [encodeInt(t.containerID)]); + app(result, encodeLoc(w, t.loc)); + for i := 0 to sonsLen(t)-1 do begin + if t.sons[i] = nil then + app(result, '^()') + else begin + appf(result, '^$1', [encodeInt(t.sons[i].id)]); + pushType(w, t.sons[i]); + end + end; +end; + +function encodeLib(w: PRodWriter; lib: PLib): PRope; +begin + result := nil; + appf(result, '|$1', [encodeInt(ord(lib.kind))]); + appf(result, '|$1', [encodeStr(w, ropeToStr(lib.name))]); + appf(result, '|$1', [encodeStr(w, lib.path)]); +end; + +function encodeSym(w: PRodWriter; s: PSym): PRope; +var + codeAst: PNode; + col, line: PRope; +begin + codeAst := nil; + if s = nil then begin + // nil nodes have to be stored too: + result := toRope('{}'); exit + end; + result := nil; + app(result, encodeInt(ord(s.kind))); + appf(result, '+$1', [encodeInt(s.id)]); + appf(result, '&$1', [encodeStr(w, s.name.s)]); + if s.typ <> nil then begin + appf(result, '^$1', [encodeInt(s.typ.id)]); + pushType(w, s.typ); + end; + if s.info.col = int16(-1) then col := nil + else col := encodeInt(s.info.col); + if s.info.line = int16(-1) then line := nil + else line := encodeInt(s.info.line); + appf(result, '?$1,$2,$3', [col, line, + encodeInt(fileIdx(w, toFilename(s.info)))]); + if s.owner <> nil then begin + appf(result, '*$1', [encodeInt(s.owner.id)]); + pushSym(w, s.owner); + end; + if s.flags <> {@set}[] then + appf(result, '$$$1', [encodeInt({@cast}int32(s.flags))]); + if s.magic <> mNone then + appf(result, '@$1', [encodeInt(ord(s.magic))]); + if (s.ast <> nil) then begin + if not astNeeded(s) then begin + codeAst := s.ast.sons[codePos]; + s.ast.sons[codePos] := nil; + end; + app(result, encodeNode(w, s.info, s.ast)); + if codeAst <> nil then // restore code ast + s.ast.sons[codePos] := codeAst; + end; + if s.options <> w.options then + appf(result, '!$1', [encodeInt({@cast}int32(s.options))]); + if s.position <> 0 then + appf(result, '%$1', [encodeInt(s.position)]); + if s.offset <> -1 then + appf(result, '`$1', [encodeInt(s.offset)]); + app(result, encodeLoc(w, s.loc)); + if s.annex <> nil then + app(result, encodeLib(w, s.annex)); +end; + +procedure addToIndex(var w: TIndex; key, val: int); +begin + if key - w.lastIdxKey = 1 then begin + // we do not store a key-diff of 1 to safe space + app(w.r, encodeInt(val - w.lastIdxVal)); + app(w.r, rodNL); + end + else + appf(w.r, '$1 $2'+rodNL, [encodeInt(key - w.lastIdxKey), + encodeInt(val - w.lastIdxVal)]); + w.lastIdxKey := key; + w.lastIdxVal := val; + IiTablePut(w.tab, key, val); +end; + +var + debugWritten: TIntSet; + +procedure symStack(w: PRodWriter); +var + i, L: int; + s, m: PSym; +begin + i := 0; + while i < length(w.sstack) do begin + s := w.sstack[i]; + if IiTableGet(w.index.tab, s.id) = invalidKey then begin + m := getModule(s); + if m = nil then InternalError('symStack: module nil: ' + s.name.s); + if (m.id = w.module.id) or (sfFromGeneric in s.flags) then begin + // put definition in here + L := ropeLen(w.data); + addToIndex(w.index, s.id, L); + //intSetIncl(debugWritten, s.id); + app(w.data, encodeSym(w, s)); + app(w.data, rodNL); + if sfInInterface in s.flags then + appf(w.interf, '$1 $2'+rodNL, [encode(s.name.s), encodeInt(s.id)]); + if sfCompilerProc in s.flags then + appf(w.compilerProcs, '$1 $2'+rodNL, [encode(s.name.s), encodeInt(s.id)]); + if s.kind = skConverter then begin + if w.converters <> nil then app(w.converters, ' '+''); + app(w.converters, encodeInt(s.id)) + end + end + else if IiTableGet(w.imports.tab, s.id) = invalidKey then begin + addToIndex(w.imports, s.id, m.id); + //if not IntSetContains(debugWritten, s.id) then begin + // MessageOut(w.filename); + // debug(s.owner); + // debug(s); + // InternalError('BUG!!!!'); + //end + end + end; + inc(i); + end; + setLength(w.sstack, 0); +end; + +procedure typeStack(w: PRodWriter); +var + i, L: int; +begin + i := 0; + while i < length(w.tstack) do begin + if IiTableGet(w.index.tab, w.tstack[i].id) = invalidKey then begin + L := ropeLen(w.data); + addToIndex(w.index, w.tstack[i].id, L); + app(w.data, encodeType(w, w.tstack[i])); + app(w.data, rodNL); + end; + inc(i); + end; + setLength(w.tstack, 0); +end; + +procedure processStacks(w: PRodWriter); +begin + while (length(w.tstack) > 0) or (length(w.sstack) > 0) do begin + symStack(w); + typeStack(w); + end +end; + +procedure rawAddInterfaceSym(w: PRodWriter; s: PSym); +begin + pushSym(w, s); + processStacks(w); +end; + +procedure addInterfaceSym(w: PRodWriter; s: PSym); +begin + if w = nil then exit; + if [sfInInterface, sfCompilerProc] * s.flags <> [] then begin + rawAddInterfaceSym(w, s); + end +end; + +procedure addStmt(w: PRodWriter; n: PNode); +begin + app(w.init, encodeInt(ropeLen(w.data))); + app(w.init, rodNL); + app(w.data, encodeNode(w, UnknownLineInfo(), n)); + app(w.data, rodNL); + processStacks(w); +end; + +procedure writeRod(w: PRodWriter); +var + content: PRope; + i: int; +begin + processStacks(w); + // write header: + content := toRope('NIM:'); + app(content, toRope(FileVersion)); + app(content, rodNL); + app(content, toRope('ID:')); + app(content, encodeInt(w.module.id)); + app(content, rodNL); + app(content, toRope('CRC:')); + app(content, encodeInt(w.crc)); + app(content, rodNL); + app(content, toRope('OPTIONS:')); + app(content, encodeInt({@cast}int32(w.options))); + app(content, rodNL); + app(content, toRope('DEFINES:')); + app(content, w.defines); + app(content, rodNL); + app(content, toRope('FILES('+rodNL)); + for i := 0 to high(w.files) do begin + app(content, encode(w.files[i])); + app(content, rodNL); + end; + app(content, toRope(')'+rodNL)); + app(content, toRope('INCLUDES('+rodNL)); + app(content, w.inclDeps); + app(content, toRope(')'+rodNL)); + app(content, toRope('DEPS:')); + app(content, w.modDeps); + app(content, rodNL); + app(content, toRope('INTERF('+rodNL)); + app(content, w.interf); + app(content, toRope(')'+rodNL)); + app(content, toRope('COMPILERPROCS('+rodNL)); + app(content, w.compilerProcs); + app(content, toRope(')'+rodNL)); + app(content, toRope('INDEX('+rodNL)); + app(content, w.index.r); + app(content, toRope(')'+rodNL)); + app(content, toRope('IMPORTS('+rodNL)); + app(content, w.imports.r); + app(content, toRope(')'+rodNL)); + app(content, toRope('CONVERTERS:')); + app(content, w.converters); + app(content, toRope(rodNL)); + app(content, toRope('INIT('+rodNL)); + app(content, w.init); + app(content, toRope(')'+rodNL)); + app(content, toRope('DATA('+rodNL)); + app(content, w.data); + app(content, toRope(')'+rodNL)); + + //MessageOut('interf ' + ToString(ropeLen(w.interf))); + //MessageOut('index ' + ToString(ropeLen(w.indexRope))); + //MessageOut('init ' + ToString(ropeLen(w.init))); + //MessageOut('data ' + ToString(ropeLen(w.data))); + + writeRope(content, + completeGeneratedFilePath(changeFileExt(w.filename, 'rod'))); +end; + +function process(c: PPassContext; n: PNode): PNode; +var + i, j: int; + w: PRodWriter; + a: PNode; + s: PSym; +begin + result := n; + if c = nil then exit; + w := PRodWriter(c); + case n.kind of + nkStmtList: begin + for i := 0 to sonsLen(n)-1 do {@discard} process(c, n.sons[i]); + end; + nkTemplateDef, nkMacroDef: begin + s := n.sons[namePos].sym; + addInterfaceSym(w, s); + end; + nkProcDef, nkIteratorDef, nkConverterDef: begin + s := n.sons[namePos].sym; + if s = nil then InternalError(n.info, 'rodwrite.process'); + if (n.sons[codePos] <> nil) or (s.magic <> mNone) + or not (sfForward in s.flags) then begin + addInterfaceSym(w, s); + end + end; + nkVarSection: begin + for i := 0 to sonsLen(n)-1 do begin + a := n.sons[i]; + if a.kind <> nkIdentDefs then InternalError(a.info, 'rodwrite.process'); + addInterfaceSym(w, a.sons[0].sym); + end + end; + nkConstSection: begin + for i := 0 to sonsLen(n)-1 do begin + a := n.sons[i]; + if a.kind <> nkConstDef then InternalError(a.info, 'rodwrite.process'); + addInterfaceSym(w, a.sons[0].sym); + end + end; + nkTypeSection: begin + for i := 0 to sonsLen(n)-1 do begin + a := n.sons[i]; + if a.sons[0].kind <> nkSym then + InternalError(a.info, 'rodwrite.process'); + s := a.sons[0].sym; + addInterfaceSym(w, s); // this takes care of enum fields too + // Note: The check for ``s.typ.kind = tyEnum`` is wrong for enum + // type aliasing! Otherwise the same enum symbol would be included + // several times! + (* + if (a.sons[2] <> nil) and (a.sons[2].kind = nkEnumTy) then begin + a := s.typ.n; + for j := 0 to sonsLen(a)-1 do + addInterfaceSym(w, a.sons[j].sym); + end *) + end + end; + nkImportStmt: begin + for i := 0 to sonsLen(n)-1 do addModDep(w, getModuleFile(n.sons[i])); + addStmt(w, n); + end; + nkFromStmt: begin + addModDep(w, getModuleFile(n.sons[0])); + addStmt(w, n); + end; + nkIncludeStmt: begin + for i := 0 to sonsLen(n)-1 do addInclDep(w, getModuleFile(n.sons[i])); + end; + nkPragma: addStmt(w, n); + else begin end + end; +end; + +function myOpen(module: PSym; const filename: string): PPassContext; +var + w: PRodWriter; +begin + if module.id < 0 then InternalError('rodwrite: module ID not set'); + w := newRodWriter(filename, rodread.GetCRC(filename), module); + rawAddInterfaceSym(w, module); + result := w; +end; + +function myClose(c: PPassContext; n: PNode): PNode; +var + w: PRodWriter; +begin + w := PRodWriter(c); + writeRod(w); + result := n; +end; + +function rodwritePass(): TPass; +begin + initPass(result); + if optSymbolFiles in gGlobalOptions then begin + result.open := myOpen; + result.close := myClose; + result.process := process; + end +end; + +initialization + IntSetInit(debugWritten); +end. diff --git a/nim/rst.pas b/nim/rst.pas index b5e5846b1..cc92e41eb 100644 --- a/nim/rst.pas +++ b/nim/rst.pas @@ -469,19 +469,24 @@ end; // --------------------------------------------------------------- -function addNodes(n: PRstNode): string; +procedure addNodesAux(n: PRstNode; var result: string); var i: int; begin if n.kind = rnLeaf then - result := n.text + add(result, n.text) else begin - result := ''; for i := 0 to rsonsLen(n)-1 do - result := result +{&} addNodes(n.sons[i]) + addNodesAux(n.sons[i], result) end end; +function addNodes(n: PRstNode): string; +begin + result := ''; + addNodesAux(n, result); +end; + procedure rstnodeToRefnameAux(n: PRstNode; var r: string; var b: bool); var i: int; @@ -1118,7 +1123,7 @@ begin inc(p.idx); while p.tok[p.idx].kind in [tkWord, tkPunct, tkAdornment, tkOther] do begin if p.tok[p.idx].symbol = '::' then break; - result := result +{&} p.tok[p.idx].symbol; + add(result, p.tok[p.idx].symbol); inc(p.idx); end; if (p.tok[p.idx].kind = tkWhite) then inc(p.idx); @@ -1287,12 +1292,13 @@ begin break; end else begin - n.text := n.text +{&} nl +{&} repeatChar(p.tok[p.idx].ival - indent); + add(n.text, nl); + add(n.text, repeatChar(p.tok[p.idx].ival - indent)); inc(p.idx) end end else begin - n.text := n.text +{&} p.tok[p.idx].symbol; + add(n.text, p.tok[p.idx].symbol); inc(p.idx) end end @@ -1300,7 +1306,7 @@ begin end else begin while not (p.tok[p.idx].kind in [tkIndent, tkEof]) do begin - n.text := n.text +{&} p.tok[p.idx].symbol; + add(n.text, p.tok[p.idx].symbol); inc(p.idx) end end; @@ -1560,7 +1566,7 @@ begin i := 0; while not (p.tok[p.idx].kind in [tkIndent, tkEof]) do begin if (tokEnd(p) <= cols[i]) then begin - row[i] := row[i] +{&} p.tok[p.idx].symbol; + add(row[i], p.tok[p.idx].symbol); inc(p.idx); end else begin diff --git a/nim/scanner.pas b/nim/scanner.pas index 98bb54c07..83f5c12b0 100644 --- a/nim/scanner.pas +++ b/nim/scanner.pas @@ -10,12 +10,11 @@ unit scanner; // This scanner is handwritten for efficiency. I used an elegant buffering // scheme which I have not seen anywhere else: -// We guarantee that a hole line is in the buffer (too long lines are reported -// as an error). Thus only when scanning the \n or \r character we have -// to check wether we need to read in the next chunk. (\n or \r already need -// special handling for incrementing the line counter; choosing both \n and \r -// allows the scanner to properly read Unix, DOS or Macintosh text files, even -// when it is not the native format. +// We guarantee that a whole line is in the buffer. Thus only when scanning +// the \n or \r character we have to check wether we need to read in the next +// chunk. (\n or \r already need special handling for incrementing the line +// counter; choosing both \n and \r allows the scanner to properly read Unix, +// DOS or Macintosh text files, even when it is not the native format. interface @@ -29,7 +28,7 @@ uses const MaxLineLength = 80; // lines longer than this lead to a warning - numChars: TCharSet = ['0'..'9','a'..'z','A'..'Z']; // we support up to base 36 + numChars: TCharSet = ['0'..'9','a'..'z','A'..'Z']; SymChars: TCharSet = ['a'..'z', 'A'..'Z', '0'..'9', #128..#255]; SymStartChars: TCharSet = ['a'..'z', 'A'..'Z', #128..#255]; OpChars: TCharSet = ['+', '-', '*', '/', '<', '>', '!', '?', '^', '.', @@ -436,7 +435,7 @@ begin end; '_': inc(pos); '0', '1': begin - xi := (xi shl 1) or (ord(L.buf[pos]) - ord('0')); + xi := shlu(xi, 1) or (ord(L.buf[pos]) - ord('0')); inc(pos); end; else break; @@ -453,7 +452,7 @@ begin end; '_': inc(pos); '0'..'7': begin - xi := (xi shl 3) or (ord(L.buf[pos]) - ord('0')); + xi := shlu(xi, 3) or (ord(L.buf[pos]) - ord('0')); inc(pos); end; else break; @@ -471,15 +470,15 @@ begin end; '_': inc(pos); '0'..'9': begin - xi := (xi shl 4) or (ord(L.buf[pos]) - ord('0')); + xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('0')); inc(pos); end; 'a'..'f': begin - xi := (xi shl 4) or (ord(L.buf[pos]) - ord('a') + 10); + xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('a') + 10); inc(pos); end; 'A'..'F': begin - xi := (xi shl 4) or (ord(L.buf[pos]) - ord('A') + 10); + xi := shlu(xi, 4) or (ord(L.buf[pos]) - ord('A') + 10); inc(pos); end; else break; @@ -490,8 +489,14 @@ begin end; // now look at the optional type suffix: case result.tokType of - tkIntLit..tkInt64Lit: + tkIntLit, tkInt64Lit: result.iNumber := xi; + tkInt8Lit: + result.iNumber := biggestInt(int8(toU8(int(xi)))); + tkInt16Lit: + result.iNumber := biggestInt(toU16(int(xi))); + tkInt32Lit: + result.iNumber := biggestInt(toU32(xi)); tkFloat32Lit: result.fNumber := ({@cast}PFloat32(addr(xi)))^; // note: this code is endian neutral! @@ -525,6 +530,8 @@ begin {@emit} on EOverflow do lexMessage(L, errNumberOutOfRange, result.literal); + on EOutOfRange do + lexMessage(L, errNumberOutOfRange, result.literal); end; L.bufpos := endpos; end; diff --git a/nim/semdata.pas b/nim/semdata.pas new file mode 100644 index 000000000..f920fae2a --- /dev/null +++ b/nim/semdata.pas @@ -0,0 +1,254 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// +unit semdata; + +// This module contains the data structures for the semantic checking phase. + +interface + +{$include 'config.inc'} + +uses + sysutils, nsystem, charsets, strutils, + lists, options, scanner, ast, astalgo, trees, treetab, wordrecg, + ropes, msgs, platform, nos, condsyms, idents, rnimsyn, types, + extccomp, nmath, magicsys, nversion, nimsets, pnimsyn, ntime, passes, + rodread; + +type + TOptionEntry = object(lists.TListEntry) + // entries to put on a stack for pragma parsing + options: TOptions; + defaultCC: TCallingConvention; + dynlib: PLib; + Notes: TNoteKinds; + end; + POptionEntry = ^TOptionEntry; + + TProcCon = record // procedure context; also used for top-level + // statements + owner: PSym; // the symbol this context belongs to + resultSym: PSym; // the result symbol (if we are in a proc) + nestedLoopCounter: int; // whether we are in a loop or not + nestedBlockCounter: int; // whether we are in a block or not + end; + PProcCon = ^TProcCon; + + PContext = ^TContext; + TContext = object(TPassContext) // a context represents a module + module: PSym; // the module sym belonging to the context + tab: TSymTab; // each module has its own symbol table + AmbigiousSymbols: TIntSet; // contains ids of all ambigious symbols (cannot + // store this info in the syms themselves!) + generics: PNode; // a list of the things to compile; list of + // nkExprEqExpr nodes which contain the generic + // symbol and the instantiated symbol + converters: TSymSeq; // sequence of converters + optionStack: TLinkedList; + libs: TLinkedList; // all libs used by this module + p: PProcCon; // procedure context + fromCache: bool; // is the module read from a cache? + semConstExpr: function (c: PContext; n: PNode): PNode; + // for the pragmas module + end; + +function newContext(module: PSym; const nimfile: string): PContext; +function newProcCon(owner: PSym): PProcCon; + +function lastOptionEntry(c: PContext): POptionEntry; +function newOptionEntry(): POptionEntry; + +procedure addConverter(c: PContext; conv: PSym); + +function newLib(kind: TLibKind): PLib; +procedure addToLib(lib: PLib; sym: PSym); + +function makePtrType(c: PContext; baseType: PType): PType; +function makeVarType(c: PContext; baseType: PType): PType; + +function newTypeS(const kind: TTypeKind; c: PContext): PType; +procedure fillTypeS(dest: PType; const kind: TTypeKind; c: PContext); +function makeRangeType(c: PContext; first, last: biggestInt; + const info: TLineInfo): PType; + +procedure illFormedAst(n: PNode); +function getSon(n: PNode; indx: int): PNode; +procedure checkSonsLen(n: PNode; len: int); +procedure checkMinSonsLen(n: PNode; len: int); + +// owner handling: +function getCurrOwner(): PSym; +procedure PushOwner(owner: PSym); +procedure PopOwner; + +implementation + +var + gOwners: array of PSym; // owner stack (used for initializing the + // owner field of syms) + // the documentation comment always gets + // assigned to the current owner + // BUGFIX: global array is needed! +{@emit gOwners := @[]; } + +function getCurrOwner(): PSym; +begin + result := gOwners[high(gOwners)]; +end; + +procedure PushOwner(owner: PSym); +var + len: int; +begin + len := length(gOwners); + setLength(gOwners, len+1); + gOwners[len] := owner; +end; + +procedure PopOwner; +var + len: int; +begin + len := length(gOwners); + if (len <= 0) then InternalError('popOwner'); + setLength(gOwners, len - 1); +end; + +function lastOptionEntry(c: PContext): POptionEntry; +begin + result := POptionEntry(c.optionStack.tail); +end; + +function newProcCon(owner: PSym): PProcCon; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit} + result.owner := owner; +end; + +function newOptionEntry(): POptionEntry; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit} + result.options := gOptions; + result.defaultCC := ccDefault; + result.dynlib := nil; + result.notes := gNotes; +end; + +function newContext(module: PSym; const nimfile: string): PContext; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit} + InitSymTab(result.tab); + IntSetInit(result.AmbigiousSymbols); + initLinkedList(result.optionStack); + initLinkedList(result.libs); + append(result.optionStack, newOptionEntry()); + result.module := module; + result.generics := newNode(nkStmtList); +{@emit result.converters := @[];} +end; + +procedure addConverter(c: PContext; conv: PSym); +var + i, L: int; +begin + L := length(c.converters); + for i := 0 to L-1 do + if c.converters[i].id = conv.id then exit; + setLength(c.converters, L+1); + c.converters[L] := conv; +end; + + +function newLib(kind: TLibKind): PLib; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit} + result.kind := kind; + //initObjectSet(result.syms) +end; + +procedure addToLib(lib: PLib; sym: PSym); +begin + //ObjectSetIncl(lib.syms, sym); + if sym.annex <> nil then liMessage(sym.info, errInvalidPragma); + sym.annex := lib +end; + +function makePtrType(c: PContext; baseType: PType): PType; +begin + if (baseType = nil) then InternalError('makePtrType'); + result := newTypeS(tyPtr, c); + addSon(result, baseType); +end; + +function makeVarType(c: PContext; baseType: PType): PType; +begin + if (baseType = nil) then InternalError('makeVarType'); + result := newTypeS(tyVar, c); + addSon(result, baseType); +end; + +function newTypeS(const kind: TTypeKind; c: PContext): PType; +begin + result := newType(kind, getCurrOwner()) +end; + +procedure fillTypeS(dest: PType; const kind: TTypeKind; c: PContext); +begin + dest.kind := kind; + dest.owner := getCurrOwner(); + dest.size := -1; +end; + +function makeRangeType(c: PContext; first, last: biggestInt; + const info: TLineInfo): PType; +var + n: PNode; +begin + n := newNodeI(nkRange, info); + addSon(n, newIntNode(nkIntLit, first)); + addSon(n, newIntNode(nkIntLit, last)); + result := newTypeS(tyRange, c); + result.n := n; + addSon(result, getSysType(tyInt)); // basetype of range +end; + +procedure illFormedAst(n: PNode); +begin + liMessage(n.info, errIllFormedAstX, renderTree(n, {@set}[renderNoComments])); +end; + +function getSon(n: PNode; indx: int): PNode; +begin + if (n <> nil) and (indx < sonsLen(n)) then result := n.sons[indx] + else begin illFormedAst(n); result := nil end; +end; + +procedure checkSonsLen(n: PNode; len: int); +begin + if (n = nil) or (sonsLen(n) <> len) then illFormedAst(n); +end; + +procedure checkMinSonsLen(n: PNode; len: int); +begin + if (n = nil) or (sonsLen(n) < len) then illFormedAst(n); +end; + +end. diff --git a/nim/semexprs.pas b/nim/semexprs.pas index 26e63c845..2c5672f7f 100644 --- a/nim/semexprs.pas +++ b/nim/semexprs.pas @@ -637,7 +637,7 @@ begin Consider:: const x = [] proc p(a: openarray[int], i: int) - proc q(a: sequence[char], c: char) + proc q(a: openarray[char], c: char) p(x, 0) q(x, '\0') diff --git a/nim/semfold.pas b/nim/semfold.pas index 9c27c3a16..fa2e97635 100644 --- a/nim/semfold.pas +++ b/nim/semfold.pas @@ -122,7 +122,7 @@ begin end; mZe8ToI, mZe8ToI64, mZe16ToI, mZe16ToI64, mZe32ToI64, mZeIToI64: begin // byte(-128) = 1...1..1000_0000'64 --> 0...0..1000_0000'64 - result := newIntNodeT(getInt(a) and (1 shl a.typ.size*8 - 1), n); + result := newIntNodeT(getInt(a) and (shlu(1, getSize(a.typ)*8) - 1), n); end; mToU8: result := newIntNodeT(getInt(a) and $ff, n); mToU16: result := newIntNodeT(getInt(a) and $ffff, n); @@ -142,8 +142,26 @@ begin if getInt(a) > getInt(b) then result := newIntNodeT(getInt(a), n) else result := newIntNodeT(getInt(b), n); end; - mShlI, mShlI64: result := newIntNodeT(getInt(a) shl getInt(b), n); - mShrI, mShrI64: result := newIntNodeT(getInt(a) shr getInt(b), n); + mShlI, mShlI64: begin + case skipGenericRange(n.typ).kind of + tyInt8: result := newIntNodeT(int8(getInt(a)) shl int8(getInt(b)), n); + tyInt16: result := newIntNodeT(int16(getInt(a)) shl int16(getInt(b)), n); + tyInt32: result := newIntNodeT(int32(getInt(a)) shl int32(getInt(b)), n); + tyInt64, tyInt: + result := newIntNodeT(shlu(getInt(a), getInt(b)), n); + else InternalError(n.info, 'constant folding for shl'); + end + end; + mShrI, mShrI64: begin + case skipGenericRange(n.typ).kind of + tyInt8: result := newIntNodeT(int8(getInt(a)) shr int8(getInt(b)), n); + tyInt16: result := newIntNodeT(int16(getInt(a)) shr int16(getInt(b)), n); + tyInt32: result := newIntNodeT(int32(getInt(a)) shr int32(getInt(b)), n); + tyInt64, tyInt: + result := newIntNodeT(shru(getInt(a), getInt(b)), n); + else InternalError(n.info, 'constant folding for shl'); + end + end; mDivI, mDivI64: result := newIntNodeT(getInt(a) div getInt(b), n); mModI, mModI64: result := newIntNodeT(getInt(a) mod getInt(b), n); @@ -380,7 +398,7 @@ begin result := nil // XXX: size computation for complex types // is still wrong else - result := newIntNodeT(a.typ.size, n); + result := newIntNodeT(getSize(a.typ), n); end; mLow: result := newIntNodeT(firstOrd(n.sons[1].typ), n); mHigh: begin diff --git a/nim/seminst.pas b/nim/seminst.pas new file mode 100644 index 000000000..4c3d416d4 --- /dev/null +++ b/nim/seminst.pas @@ -0,0 +1,278 @@ +// +// +// The Nimrod Compiler +// (c) Copyright 2008 Andreas Rumpf +// +// See the file "copying.txt", included in this +// distribution, for details about the copyright. +// + +// This module does the instantiation of generic procs and types. + +function generateInstance(c: PContext; fn: PSym; const pt: TIdTable; + const instantiator: TLineInfo): PSym; forward; +// generates an instantiated proc + +type + TInstantiateClosure = object(NObject) + typeMap: TIdTable; // map PType to PType + symMap: TIdTable; // map PSym to PSym + fn: PSym; + module: PSym; + //newOwner: PSym; + instantiator: TLineInfo; + end; + PInstantiateClosure = ^TInstantiateClosure; + PInstClosure = PInstantiateClosure; + +function instantiateTree(c: PInstantiateClosure; t: PNode): PNode; forward; +function instantiateSym(c: PInstantiateClosure; sym: PSym): PSym; forward; +function instantiateType(c: PInstantiateClosure; typ: PType): PType; forward; + +function containsGenericTypeIter(t: PType; closure: PObject): bool; +begin + result := t.kind in GenericTypes; +end; + +function containsGenericType(t: PType): bool; +begin + result := iterOverType(t, containsGenericTypeIter, nil); +end; + +function instTypeNode(c: PInstantiateClosure; n: PNode): PNode; +var + i: int; +begin + result := nil; + if n <> nil then begin + result := copyNode(n); + result.typ := instantiateType(c, n.typ); + case n.kind of + nkNone..nkNilLit: begin // a leaf + end; + else begin + for i := 0 to sonsLen(n)-1 do + addSon(result, instTypeNode(c, n.sons[i])); + end + end + end +end; + +function instantiateType(c: PInstantiateClosure; typ: PType): PType; +var + i: int; +begin + result := PType(idTableGet(c.typeMap, typ)); + if result <> nil then exit; + //if typ.kind = tyOpenArray then + // liMessage(c.instantiator, warnUser, 'instantiating type for: openarray'); + if containsGenericType(typ) then begin + result := copyType(typ, typ.owner, false); + idTablePut(c.typeMap, typ, result); // to avoid cycles + for i := 0 to sonsLen(result)-1 do + result.sons[i] := instantiateType(c, result.sons[i]); + if result.n <> nil then + result.n := instTypeNode(c, result.n); + end + else + result := typ; + if result.Kind in GenericTypes then begin + liMessage(c.instantiator, errCannotInstantiateX, + TypeToString(typ, preferName)); + end + else if result.kind = tyVar then begin + if result.sons[0].kind = tyVar then + liMessage(c.instantiator, errVarVarTypeNotAllowed); + end; +end; + +function instantiateSym(c: PInstantiateClosure; sym: PSym): PSym; +begin + if sym = nil then begin result := nil; exit end; // BUGFIX + result := PSym(idTableGet(c.symMap, sym)); + if (result = nil) then begin + if (sym.owner.id = c.fn.id) then begin // XXX: nested generics? + result := copySym(sym, false); + include(result.flags, sfFromGeneric); + idTablePut(c.symMap, sym, result); // BUGFIX + result.typ := instantiateType(c, sym.typ); + if (result.owner <> nil) and (result.owner.kind = skModule) then + result.owner := c.module // BUGFIX + else + result.owner := instantiateSym(c, result.owner); + if sym.ast <> nil then begin + result.ast := instantiateTree(c, sym.ast); + end + end + else + result := sym // do not copy t! + end +end; + +function instantiateTree(c: PInstantiateClosure; t: PNode): PNode; +var + len, i: int; +begin + if t = nil then begin result := nil; exit end; + result := copyNode(t); + if result.typ <> nil then result.typ := instantiateType(c, result.typ); + case t.kind of + nkNone..pred(nkSym), succ(nkSym)..nkNilLit: begin end; + nkSym: begin + if result.sym <> nil then result.sym := instantiateSym(c, result.sym); + end + else begin + len := sonsLen(t); + if len > 0 then begin + newSons(result, len); + for i := 0 to len-1 do + result.sons[i] := instantiateTree(c, t.sons[i]); + end + end + end +end; + +procedure instantiateGenericParamList(c: PContext; n: PNode; + const pt: TIdTable); +var + i: int; + s, q: PSym; + t: PType; +begin + if (n.kind <> nkGenericParams) then + InternalError(n.info, 'instantiateGenericParamList'); + for i := 0 to sonsLen(n)-1 do begin + if n.sons[i].kind = nkDefaultTypeParam then begin + internalError(n.sons[i].info, + 'instantiateGenericParamList() to implement'); + // XXX + end; + if (n.sons[i].kind <> nkSym) then + InternalError(n.info, 'instantiateGenericParamList'); + q := n.sons[i].sym; + s := newSym(skType, q.name, getCurrOwner()); + t := PType(IdTableGet(pt, q.typ)); + if t = nil then + liMessage(n.sons[i].info, errCannotInstantiateX, s.name.s); + if (t.kind = tyGenericParam) then + InternalError(n.info, 'instantiateGenericParamList'); + s.typ := t; + addDecl(c, s); + end +end; + +function GenericCacheGet(c: PContext; genericSym, instSym: PSym): PSym; +var + i: int; + a, b: PSym; +begin + result := nil; + for i := 0 to sonsLen(c.generics)-1 do begin + if c.generics.sons[i].kind <> nkExprEqExpr then + InternalError(genericSym.info, 'GenericCacheGet'); + a := c.generics.sons[i].sons[0].sym; + if genericSym.id = a.id then begin + b := c.generics.sons[i].sons[1].sym; + if equalParams(b.typ.n, instSym.typ.n) = paramsEqual then begin + //if gVerbosity > 0 then + // MessageOut('found in cache: ' + getProcHeader(instSym)); + result := b; exit + end + end + end +end; + +procedure GenericCacheAdd(c: PContext; genericSym, instSym: PSym); +var + n: PNode; +begin + n := newNode(nkExprEqExpr); + addSon(n, newSymNode(genericSym)); + addSon(n, newSymNode(instSym)); + addSon(c.generics, n); +end; + +procedure semParamList(c: PContext; n: PNode; s: PSym); forward; +procedure addParams(c: PContext; n: PNode); forward; +procedure addResult(c: PContext; t: PType; const info: TLineInfo); forward; +procedure addResultNode(c: PContext; n: PNode); forward; + +function generateInstance(c: PContext; fn: PSym; const pt: TIdTable; + const instantiator: TLineInfo): PSym; +// generates an instantiated proc +var + oldPrc: PSym; + oldP: PProcCon; + n: PNode; +begin + oldP := c.p; // restore later + result := copySym(fn, false); + include(result.flags, sfFromGeneric); + //include(fn.flags, sfFromGeneric); + result.owner := getCurrOwner().owner; + //idTablePut(c.mapping, fn, result); + n := copyTree(fn.ast); + result.ast := n; + pushOwner(result); + openScope(c.tab); + if (n.sons[genericParamsPos] = nil) then + InternalError(n.info, 'generateInstance'); + n.sons[namePos] := newSymNode(result); + pushInfoContext(instantiator); + + instantiateGenericParamList(c, n.sons[genericParamsPos], pt); + n.sons[genericParamsPos] := nil; + // semantic checking for the parameters: + if n.sons[paramsPos] <> nil then begin + semParamList(c, n.sons[ParamsPos], result); + addParams(c, result.typ.n); + end + else begin + result.typ := newTypeS(tyProc, c); + addSon(result.typ, nil); + end; + + // now check if we have already such a proc generated + oldPrc := GenericCacheGet(c, fn, result); + if oldPrc = nil then begin + // add it here, so that recursive generic procs are possible: + addDecl(c, result); + if n.sons[codePos] <> nil then begin + c.p := newProcCon(result); + if result.kind in [skProc, skConverter] then begin + addResult(c, result.typ.sons[0], n.info); + addResultNode(c, n); + end; + n.sons[codePos] := semStmtScope(c, n.sons[codePos]); + end; + GenericCacheAdd(c, fn, result); + end + else + result := oldPrc; + popInfoContext(); + closeScope(c.tab); // close scope for parameters + popOwner(); + c.p := oldP; // restore +end; + +function generateTypeInstance(p: PContext; const pt: TIdTable; + const instantiator: TLineInfo; t: PType): PType; +var + c: PInstantiateClosure; +begin + new(c); +{@ignore} + fillChar(c^, sizeof(c^), 0); +{@emit} + copyIdTable(c.typeMap, pt); + InitIdTable(c.symMap); + c.fn := nil; + c.instantiator := instantiator; + c.module := p.module; + result := instantiateType(c, t); +end; + +function partialSpecialization(c: PContext; n: PNode; s: PSym): PNode; +begin + result := n; +end; diff --git a/nim/semtypes.pas b/nim/semtypes.pas index 00cb019f8..5d9bd626a 100644 --- a/nim/semtypes.pas +++ b/nim/semtypes.pas @@ -157,7 +157,7 @@ begin liMessage(n.info, errOrdinalTypeExpected); if enumHasWholes(a.typ) then liMessage(n.info, errEnumXHasWholes, a.typ.sym.name.s); - if not leValue(a, b) then + if not leValue(a, b) then liMessage(n.Info, errRangeIsEmpty); addSon(result.n, a); addSon(result.n, b); diff --git a/nim/sigmatch.pas b/nim/sigmatch.pas index 96001ed90..741052f05 100644 --- a/nim/sigmatch.pas +++ b/nim/sigmatch.pas @@ -570,9 +570,10 @@ begin result := copyTree(arg); result.typ := getInstantiatedType(c, arg, m, f); // BUG: f may not be the right key! - if (skipVarGeneric(f).kind in [tyTuple, tyOpenArray]) then + if (skipVarGeneric(result.typ).kind in [tyTuple, tyOpenArray]) then // BUGFIX: must pass length implicitely result := implicitConv(nkHiddenStdConv, f, copyTree(arg), m, c); + // BUGFIX: use ``result.typ`` and not `f` here end; isEqual: begin inc(m.exactMatches); diff --git a/nim/transf.pas b/nim/transf.pas index fb59eeef2..d74f2aa83 100644 --- a/nim/transf.pas +++ b/nim/transf.pas @@ -69,9 +69,15 @@ end; // ------------ helpers ----------------------------------------------------- +function getCurrOwner(c: PTransf): PSym; +begin + if c.transCon <> nil then result := c.transCon.owner + else result := c.module; +end; + function newTemp(c: PTransf; typ: PType; const info: TLineInfo): PSym; begin - result := newSym(skTemp, getIdent(genPrefix), getCurrOwner()); + result := newSym(skTemp, getIdent(genPrefix), getCurrOwner(c)); result.info := info; result.typ := skipGeneric(typ); include(result.flags, sfFromGeneric); @@ -195,7 +201,7 @@ begin for i := 0 to sonsLen(n)-1 do result.sons[i] := transform(c, n.sons[i]); counter := 0; - labl := newSym(skLabel, nil, getCurrOwner()); + labl := newSym(skLabel, nil, getCurrOwner(c)); labl.name := getIdent(genPrefix +{&} ToString(labl.id)); labl.info := result.info; transformContinueAux(c, result, labl, counter); @@ -270,7 +276,7 @@ begin include(newVar.flags, sfFromGeneric); // fixes a strange bug for rodgen: //include(it.sons[0].sym.flags, sfFromGeneric); - newVar.owner := getCurrOwner(); + newVar.owner := getCurrOwner(c); IdNodeTablePut(c.transCon.mapping, it.sons[0].sym, newSymNode(newVar)); it.sons[0] := newSymNode(newVar); it.sons[2] := transform(c, it.sons[2]); @@ -460,7 +466,9 @@ begin // generate a temporary and produce an assignment statement: temp := newTemp(c, formal.typ, formal.info); addVar(v, newSymNode(temp)); - addSon(result, newAsgnStmt(c, newSymNode(temp), copyTree(call.sons[i]))); + // BUGFIX: do not copy call.sons[i], but transform it! + addSon(result, newAsgnStmt(c, newSymNode(temp), + transform(c, call.sons[i]))); IdNodeTablePut(newC.mapping, formal, newSymNode(temp)); // BUGFIX end end; diff --git a/nim/types.pas b/nim/types.pas index bc42f2169..0686a368f 100644 --- a/nim/types.pas +++ b/nim/types.pas @@ -930,7 +930,7 @@ end; function align(address, alignment: biggestInt): biggestInt; begin - result := address + (alignment-1) and not (alignment-1); + result := (address + (alignment-1)) and not (alignment-1); end; // we compute the size of types lazily: @@ -951,6 +951,7 @@ begin case n.sons[i].kind of nkOfBranch, nkElse: begin res := computeRecSizeAux(lastSon(n.sons[i]), b, currOffset); + if res < 0 then begin result := res; exit end; maxSize := max(maxSize, res); maxAlign := max(maxAlign, b); end; @@ -966,6 +967,7 @@ begin maxAlign := 1; for i := 0 to sonsLen(n)-1 do begin res := computeRecSizeAux(n.sons[i], b, currOffset); + if res < 0 then begin result := res; exit end; currOffset := align(currOffset, b) + res; result := align(result, b) + res; if b > maxAlign then maxAlign := b; @@ -1024,9 +1026,9 @@ begin result := 4 // use signed int32 else begin len := lastOrd(typ); // BUGFIX: use lastOrd! - if len+1 < 1 shl 8 then result := 1 - else if len+1 < 1 shl 16 then result := 2 - else if len+1 < 1 shl 32 then result := 4 + if len+1 < shlu(1, 8) then result := 1 + else if len+1 < shlu(1, 16) then result := 2 + else if len+1 < shlu(biggestInt(1), 32) then result := 4 else result := 8; end; a := result; @@ -1047,6 +1049,7 @@ begin maxAlign := 1; for i := 0 to sonsLen(typ)-1 do begin res := computeSizeAux(typ.sons[i], a); + if res < 0 then begin result := res; exit end; maxAlign := max(maxAlign, a); result := align(result, a) + res; end; @@ -1056,6 +1059,7 @@ begin tyObject: begin if typ.sons[0] <> nil then begin result := computeSizeAux(typ.sons[0], a); + if result < 0 then exit; maxAlign := a end else if typ.kind = tyObject then begin @@ -1066,6 +1070,7 @@ begin end; currOffset := result; result := computeRecSizeAux(typ.n, a, currOffset); + if result < 0 then exit; if a < maxAlign then a := maxAlign; result := align(result, a); end; @@ -1097,4 +1102,3 @@ begin end; end. - diff --git a/objdata.txt b/objdata.txt new file mode 100644 index 000000000..653ae5931 --- /dev/null +++ b/objdata.txt @@ -0,0 +1,8 @@ +nodes: 2224942 +syms: 39562 +Types: 28189 + +nodes: 2224942 +syms: 39562 +Types: 29054 +Ropes: 1245961 diff --git a/rod/nimrod.cfg b/rod/nimrod.cfg new file mode 100644 index 000000000..51a9dc52d --- /dev/null +++ b/rod/nimrod.cfg @@ -0,0 +1,11 @@ +# Special configuration file for the Nimrod project + +--hint[XDeclaredButNotUsed]=off + +@if llvm_gcc or gcc: + # GCC, LLVM and Visual C++ have a problem to optimize some modules. + # This is really strange. + cgen.speed = "-O1 -fno-strict-aliasing" +@elif vcc: + cgen.speed = "" +@end diff --git a/rod/nimrod.dot b/rod/nimrod.dot new file mode 100644 index 000000000..8f77bb60d --- /dev/null +++ b/rod/nimrod.dot @@ -0,0 +1,532 @@ +digraph nimrod { +times -> strutils; +os -> strutils; +os -> times; +hashes -> strutils; +strtabs -> os; +strtabs -> hashes; +strtabs -> strutils; +options -> os; +options -> lists; +options -> strutils; +options -> strtabs; +msgs -> options; +msgs -> strutils; +msgs -> os; +nversion -> strutils; +crc -> strutils; +platform -> strutils; +ropes -> msgs; +ropes -> strutils; +ropes -> platform; +ropes -> hashes; +ropes -> crc; +idents -> hashes; +idents -> strutils; +ast -> msgs; +ast -> hashes; +ast -> nversion; +ast -> options; +ast -> strutils; +ast -> crc; +ast -> ropes; +ast -> idents; +ast -> lists; +astalgo -> ast; +astalgo -> hashes; +astalgo -> strutils; +astalgo -> options; +astalgo -> msgs; +astalgo -> ropes; +astalgo -> idents; +condsyms -> ast; +condsyms -> astalgo; +condsyms -> msgs; +condsyms -> hashes; +condsyms -> platform; +condsyms -> strutils; +condsyms -> idents; +extccomp -> lists; +extccomp -> ropes; +extccomp -> os; +extccomp -> strutils; +extccomp -> platform; +extccomp -> condsyms; +extccomp -> options; +extccomp -> msgs; +wordrecg -> hashes; +wordrecg -> strutils; +wordrecg -> idents; +commands -> os; +commands -> msgs; +commands -> options; +commands -> nversion; +commands -> condsyms; +commands -> strutils; +commands -> extccomp; +commands -> platform; +commands -> lists; +commands -> wordrecg; +llstream -> strutils; +lexbase -> llstream; +lexbase -> strutils; +scanner -> hashes; +scanner -> options; +scanner -> msgs; +scanner -> strutils; +scanner -> platform; +scanner -> idents; +scanner -> lexbase; +scanner -> llstream; +scanner -> wordrecg; +nimconf -> llstream; +nimconf -> nversion; +nimconf -> commands; +nimconf -> os; +nimconf -> strutils; +nimconf -> msgs; +nimconf -> platform; +nimconf -> condsyms; +nimconf -> scanner; +nimconf -> options; +nimconf -> idents; +nimconf -> wordrecg; +pnimsyn -> llstream; +pnimsyn -> scanner; +pnimsyn -> idents; +pnimsyn -> strutils; +pnimsyn -> ast; +pnimsyn -> msgs; +rnimsyn -> lexbase; +rnimsyn -> scanner; +rnimsyn -> options; +rnimsyn -> idents; +rnimsyn -> strutils; +rnimsyn -> ast; +rnimsyn -> msgs; +rnimsyn -> lists; +paslex -> hashes; +paslex -> options; +paslex -> msgs; +paslex -> strutils; +paslex -> platform; +paslex -> idents; +paslex -> lexbase; +paslex -> wordrecg; +paslex -> scanner; +pasparse -> os; +pasparse -> llstream; +pasparse -> scanner; +pasparse -> paslex; +pasparse -> idents; +pasparse -> wordrecg; +pasparse -> strutils; +pasparse -> ast; +pasparse -> astalgo; +pasparse -> msgs; +pasparse -> options; +rodread -> os; +rodread -> options; +rodread -> strutils; +rodread -> nversion; +rodread -> ast; +rodread -> astalgo; +rodread -> msgs; +rodread -> platform; +rodread -> condsyms; +rodread -> ropes; +rodread -> idents; +rodread -> crc; +trees -> ast; +trees -> astalgo; +trees -> scanner; +trees -> msgs; +trees -> strutils; +types -> ast; +types -> astalgo; +types -> trees; +types -> msgs; +types -> strutils; +types -> platform; +magicsys -> ast; +magicsys -> astalgo; +magicsys -> hashes; +magicsys -> msgs; +magicsys -> platform; +magicsys -> nversion; +magicsys -> times; +magicsys -> idents; +magicsys -> rodread; +nimsets -> ast; +nimsets -> astalgo; +nimsets -> trees; +nimsets -> nversion; +nimsets -> msgs; +nimsets -> platform; +nimsets -> bitsets; +nimsets -> types; +nimsets -> rnimsyn; +passes -> strutils; +passes -> lists; +passes -> options; +passes -> ast; +passes -> astalgo; +passes -> llstream; +passes -> msgs; +passes -> platform; +passes -> os; +passes -> condsyms; +passes -> idents; +passes -> rnimsyn; +passes -> types; +passes -> extccomp; +passes -> math; +passes -> magicsys; +passes -> nversion; +passes -> nimsets; +passes -> pnimsyn; +passes -> times; +passes -> rodread; +treetab -> hashes; +treetab -> ast; +treetab -> astalgo; +treetab -> types; +semdata -> strutils; +semdata -> lists; +semdata -> options; +semdata -> scanner; +semdata -> ast; +semdata -> astalgo; +semdata -> trees; +semdata -> treetab; +semdata -> wordrecg; +semdata -> ropes; +semdata -> msgs; +semdata -> platform; +semdata -> os; +semdata -> condsyms; +semdata -> idents; +semdata -> rnimsyn; +semdata -> types; +semdata -> extccomp; +semdata -> math; +semdata -> magicsys; +semdata -> nversion; +semdata -> nimsets; +semdata -> pnimsyn; +semdata -> times; +semdata -> passes; +semdata -> rodread; +lookups -> ast; +lookups -> astalgo; +lookups -> idents; +lookups -> semdata; +lookups -> types; +lookups -> msgs; +lookups -> options; +lookups -> rodread; +lookups -> rnimsyn; +importer -> strutils; +importer -> os; +importer -> ast; +importer -> astalgo; +importer -> msgs; +importer -> options; +importer -> idents; +importer -> rodread; +importer -> lookups; +importer -> semdata; +importer -> passes; +rodwrite -> os; +rodwrite -> options; +rodwrite -> strutils; +rodwrite -> nversion; +rodwrite -> ast; +rodwrite -> astalgo; +rodwrite -> msgs; +rodwrite -> platform; +rodwrite -> condsyms; +rodwrite -> ropes; +rodwrite -> idents; +rodwrite -> crc; +rodwrite -> rodread; +rodwrite -> passes; +rodwrite -> importer; +semfold -> strutils; +semfold -> lists; +semfold -> options; +semfold -> ast; +semfold -> astalgo; +semfold -> trees; +semfold -> treetab; +semfold -> nimsets; +semfold -> times; +semfold -> nversion; +semfold -> platform; +semfold -> math; +semfold -> msgs; +semfold -> os; +semfold -> condsyms; +semfold -> idents; +semfold -> rnimsyn; +semfold -> types; +evals -> strutils; +evals -> magicsys; +evals -> lists; +evals -> options; +evals -> ast; +evals -> astalgo; +evals -> trees; +evals -> treetab; +evals -> nimsets; +evals -> msgs; +evals -> os; +evals -> condsyms; +evals -> idents; +evals -> rnimsyn; +evals -> types; +evals -> passes; +evals -> semfold; +procfind -> ast; +procfind -> astalgo; +procfind -> msgs; +procfind -> semdata; +procfind -> types; +pragmas -> os; +pragmas -> platform; +pragmas -> condsyms; +pragmas -> ast; +pragmas -> astalgo; +pragmas -> idents; +pragmas -> semdata; +pragmas -> msgs; +pragmas -> rnimsyn; +pragmas -> wordrecg; +pragmas -> ropes; +pragmas -> options; +pragmas -> strutils; +pragmas -> lists; +pragmas -> extccomp; +pragmas -> math; +pragmas -> magicsys; +sem -> strutils; +sem -> lists; +sem -> options; +sem -> scanner; +sem -> ast; +sem -> astalgo; +sem -> trees; +sem -> treetab; +sem -> wordrecg; +sem -> ropes; +sem -> msgs; +sem -> os; +sem -> condsyms; +sem -> idents; +sem -> rnimsyn; +sem -> types; +sem -> platform; +sem -> math; +sem -> magicsys; +sem -> pnimsyn; +sem -> nversion; +sem -> nimsets; +sem -> semdata; +sem -> evals; +sem -> semfold; +sem -> importer; +sem -> procfind; +sem -> lookups; +sem -> rodread; +sem -> pragmas; +sem -> passes; +rst -> os; +rst -> msgs; +rst -> strutils; +rst -> platform; +rst -> hashes; +rst -> ropes; +rst -> options; +highlite -> hashes; +highlite -> options; +highlite -> msgs; +highlite -> strutils; +highlite -> platform; +highlite -> idents; +highlite -> lexbase; +highlite -> wordrecg; +highlite -> scanner; +docgen -> ast; +docgen -> astalgo; +docgen -> strutils; +docgen -> hashes; +docgen -> options; +docgen -> nversion; +docgen -> msgs; +docgen -> os; +docgen -> ropes; +docgen -> idents; +docgen -> wordrecg; +docgen -> math; +docgen -> pnimsyn; +docgen -> rnimsyn; +docgen -> scanner; +docgen -> rst; +docgen -> times; +docgen -> highlite; +ccgutils -> ast; +ccgutils -> astalgo; +ccgutils -> ropes; +ccgutils -> lists; +ccgutils -> hashes; +ccgutils -> strutils; +ccgutils -> types; +ccgutils -> msgs; +cgen -> ast; +cgen -> astalgo; +cgen -> strutils; +cgen -> hashes; +cgen -> trees; +cgen -> platform; +cgen -> magicsys; +cgen -> extccomp; +cgen -> options; +cgen -> nversion; +cgen -> nimsets; +cgen -> msgs; +cgen -> crc; +cgen -> bitsets; +cgen -> idents; +cgen -> lists; +cgen -> types; +cgen -> ccgutils; +cgen -> os; +cgen -> times; +cgen -> ropes; +cgen -> math; +cgen -> passes; +cgen -> rodread; +cgen -> wordrecg; +cgen -> rnimsyn; +cgen -> treetab; +ecmasgen -> ast; +ecmasgen -> astalgo; +ecmasgen -> strutils; +ecmasgen -> hashes; +ecmasgen -> trees; +ecmasgen -> platform; +ecmasgen -> magicsys; +ecmasgen -> extccomp; +ecmasgen -> options; +ecmasgen -> nversion; +ecmasgen -> nimsets; +ecmasgen -> msgs; +ecmasgen -> crc; +ecmasgen -> bitsets; +ecmasgen -> idents; +ecmasgen -> lists; +ecmasgen -> types; +ecmasgen -> os; +ecmasgen -> times; +ecmasgen -> ropes; +ecmasgen -> math; +ecmasgen -> passes; +ecmasgen -> ccgutils; +ecmasgen -> wordrecg; +ecmasgen -> rnimsyn; +ecmasgen -> rodread; +ptmplsyn -> llstream; +ptmplsyn -> os; +ptmplsyn -> wordrecg; +ptmplsyn -> strutils; +ptmplsyn -> ast; +ptmplsyn -> astalgo; +ptmplsyn -> msgs; +ptmplsyn -> options; +ptmplsyn -> pnimsyn; +interact -> llstream; +interact -> strutils; +interact -> ropes; +interact -> strtabs; +interact -> msgs; +passaux -> strutils; +passaux -> ast; +passaux -> passes; +passaux -> msgs; +passaux -> options; +depends -> os; +depends -> options; +depends -> ast; +depends -> astalgo; +depends -> msgs; +depends -> ropes; +depends -> idents; +depends -> passes; +depends -> importer; +transf -> strutils; +transf -> lists; +transf -> options; +transf -> ast; +transf -> astalgo; +transf -> trees; +transf -> treetab; +transf -> msgs; +transf -> os; +transf -> idents; +transf -> rnimsyn; +transf -> types; +transf -> passes; +transf -> semfold; +main -> llstream; +main -> strutils; +main -> ast; +main -> astalgo; +main -> scanner; +main -> pnimsyn; +main -> rnimsyn; +main -> options; +main -> msgs; +main -> os; +main -> lists; +main -> condsyms; +main -> paslex; +main -> pasparse; +main -> rodread; +main -> rodwrite; +main -> ropes; +main -> trees; +main -> wordrecg; +main -> sem; +main -> semdata; +main -> idents; +main -> passes; +main -> docgen; +main -> extccomp; +main -> cgen; +main -> ecmasgen; +main -> platform; +main -> ptmplsyn; +main -> interact; +main -> nimconf; +main -> importer; +main -> passaux; +main -> depends; +main -> transf; +main -> evals; +parseopt -> os; +parseopt -> strutils; +nimrod -> commands; +nimrod -> scanner; +nimrod -> condsyms; +nimrod -> options; +nimrod -> msgs; +nimrod -> nversion; +nimrod -> nimconf; +nimrod -> ropes; +nimrod -> extccomp; +nimrod -> strutils; +nimrod -> os; +nimrod -> platform; +nimrod -> main; +nimrod -> parseopt; +} diff --git a/rod/nimrod.ini b/rod/nimrod.ini new file mode 100644 index 000000000..3d0852f3b --- /dev/null +++ b/rod/nimrod.ini @@ -0,0 +1,90 @@ +[Project] +Name: "Nimrod" +Version: "$version" +OS: "linux;macosx;freebsd;netbsd;openbsd;solaris;aix" +CPU: "i386;amd64;sparc;powerpc" +Authors: "Andreas Rumpf" +Description: """This is the Nimrod Compiler. Nimrod is a new statically typed, +imperative programming language, that supports procedural, functional, object +oriented and generic programming styles while remaining simple and efficient. +A special feature that Nimrod inherited from Lisp is that Nimrod's abstract +syntax tree (AST) is part of the specification - this allows a powerful macro +system which can be used to create domain specific languages. + +Nimrod is a compiled, garbage-collected systems programming language +which has an excellent productivity/performance ratio. Nimrod's design +focuses on the 3E: efficiency, expressiveness, elegance (in the order of +priority).""" + +App: Console +License: "copying.txt" + +[InstallScript] +[UninstallScript] + +[Common] +Files: "readme.txt;install.txt" +Files: "configure;makefile" +Files: "*.html" +Files: "*.py" +Files: "*.ini" + +Files: "lib/nimbase.h;lib/cycle.h;lib/tlsf.h;lib/target.h;lib/dlmalloc.h" +Files: "lib/tlsf.c;lib/dlmalloc.c" +Files: "lib/*.nim" + +Files: "rod/readme.txt" +Files: "rod/nimrod.ini" +Files: "rod/nimrod.cfg" +Files: "build/empty.txt" +Files: "bin/empty.txt" +Files: "nim/*.*" + +Files: "data/*.yml" +Files: "data/*.txt" +Files: "obj/*.txt" +Files: "diff/*.txt" + +Files: "config/nimdoc.cfg" +Files: "config/nimrod.cfg" + +Files: "doc/*.txt" +Files: "doc/*.html" +Files: "doc/*.cfg" + +Files: "tests/*.nim" +Files: "tests/*.html" +Files: "tests/*.txt" +Files: "tests/*.cfg" +Files: "tests/*.tmpl" +Files: "tests/gtk/*.nim" + +Files: "lib/base/*.c" +Files: "lib/base/*.nim" +Files: "lib/base/gtk/*.nim" +Files: "lib/base/cairo/*.nim" +Files: "lib/base/x11/*.nim" +Files: "lib/base/zip/*.nim" +Files: "lib/base/zip/libzip_all.c" +Files: "lib/windows/*.nim" +Files: "lib/posix/*.nim" +Files: "lib/ecmas/*.nim" +Files: "lib/base/sdl/*.nim" +Files: "lib/base/opengl/*.nim" +Files: "lib/base/lua/*.nim" + +[Windows] +Files: "bin/nimrod.exe" +Files: "dist/llvm-gcc4.2" +BinPath: r"bin;dist\llvm-gcc4.2\bin" + +[Unix] + + +[InnoSetup] +path = r"c:\programme\innosetup5\iscc.exe" +flags = "/Q" + +[C_Compiler] +path = r"" +flags = "-w" diff --git a/tests/cairotest.nim b/tests/cairotest.nim new file mode 100644 index 000000000..2c28e1abf --- /dev/null +++ b/tests/cairotest.nim @@ -0,0 +1,14 @@ +import cairo + +var surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 240, 80) +var cr = cairo_create(surface) + +cairo_select_font_face(cr, "serif", CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_BOLD) +cairo_set_font_size(cr, 32.0) +cairo_set_source_rgb(cr, 0.0, 0.0, 1.0) +cairo_move_to(cr, 10.0, 50.0) +cairo_show_text(cr, "Hello, world") +cairo_destroy(cr) +discard cairo_surface_write_to_png(surface, "hello.png") +cairo_surface_destroy(surface) diff --git a/tests/cgitest.nim b/tests/cgitest.nim new file mode 100644 index 000000000..ef115c80b --- /dev/null +++ b/tests/cgitest.nim @@ -0,0 +1,15 @@ +# Test the new CGI module +import strtabs, cgi + + +#setTestData("name", "the andreas", "password", "rumpf\t\ttab") + +var myData = readData() +validateData(myData, "name", "password") +writeContentType() + +write(stdout, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n") +write(stdout, "<html><head><title>Test</title></head><body>\n") +writeln(stdout, "name: " & myData["name"]) +writeln(stdout, "password: " & myData["password"]) +writeln(stdout, "</body></html>") diff --git a/tests/stckovfl.nim b/tests/stckovfl.nim new file mode 100644 index 000000000..799fe0001 --- /dev/null +++ b/tests/stckovfl.nim @@ -0,0 +1,8 @@ +# To test stack overflow message + +proc over(a: int): int = + if a == high(int): return + result = over(a+1)+5 + +Echo($over(0)) + diff --git a/tests/sunset.tmpl b/tests/sunset.tmpl new file mode 100644 index 000000000..08fa50f56 --- /dev/null +++ b/tests/sunset.tmpl @@ -0,0 +1,67 @@ +#proc sunsetTemplate*(current, ticker, content: string, +# tabs: openarray[array[0..1, string]]): string = +# result = "" +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> + +<head> + <title>Nimrod Programming System</title> + <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> + <link rel="stylesheet" type="text/css" href="style/style.css" /> +</head> + +<body> + <div id="main"> + <div id="links"> + <!-- **** INSERT LINKS HERE **** --> + </div> + <div id="logo"><h1>Nimrod Programming System</h1></div> + <div id="content"> + <div id="menu"> + <ul> + #for item in items(tabs): + #var name = item[0] + #var t = item[1] + #if t == current: + <li><a id="selected" href="${t}.html" title = "Nimrod - $name">$name</a></li> + #else: + <li><a href="${t}.html" title = "Nimrod - $name">$name</a></li> + #end if + #end for + </ul> + </div> + <div id="column1"> + <div class="sidebaritem"> + <div class="sbihead"> + <h1>latest news</h1> + </div> + <div class="sbicontent"> + $ticker + </div> + </div> + <div class="sidebaritem"> + <div class="sbihead"> + <h1>additional links</h1> + </div> + <div class="sbilinks"> + <!-- **** INSERT ADDITIONAL LINKS HERE **** --> + <ul> + <li><a class="reference" href="http://llvm.org">LLVM</a></li> + <li><a class="reference" href="http://gcc.gnu.org">GCC</a></li> + </ul> + </div> + </div> + </div> + <div id="column2"> + $content + </div> + </div> + <div id="footer"> + copyright © 2008 Andreas Rumpf | Last update: ${getDateStr()} + | <a class="reference" href="http://validator.w3.org/check?uri=referer">XHTML 1.1</a> + | <a class="reference" href="http://jigsaw.w3.org/css-validator/check/referer">CSS</a> + | <a class="reference" href="http://www.dcarter.co.uk">design by dcarter</a> + </div> + </div> +</body> +</html> diff --git a/tests/tambsym2.nim b/tests/tambsym2.nim new file mode 100644 index 000000000..9178182aa --- /dev/null +++ b/tests/tambsym2.nim @@ -0,0 +1,18 @@ +# Test overloading of procs with locals + +type + TMyType = object + len: int + data: string + +proc len(x: TMyType): int {.inline.} = return x.len + +proc x(s: TMyType, len: int) = + writeln(stdout, len(s)) + +var + m: TMyType +m.len = 7 +m.data = "1234" + +x(m, 5) #OUT 7 diff --git a/tests/tambsym3.nim b/tests/tambsym3.nim new file mode 100644 index 000000000..5d0a5f6b2 --- /dev/null +++ b/tests/tambsym3.nim @@ -0,0 +1,8 @@ +# Test ambigious symbols + +import mambsym1, times + +var + v = mDec #ERROR_MSG ambigious identifier + +writeln(stdout, ord(v)) diff --git a/tests/tester.nim b/tests/tester.nim new file mode 100644 index 000000000..fc75754d5 --- /dev/null +++ b/tests/tester.nim @@ -0,0 +1,161 @@ +# +# +# Nimrod Tester +# (c) Copyright 2008 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +## This program verifies Nimrod against the testcases. +## The testcases may contain the directives '#ERROR' or '#ERROR_IN'. +## '#ERROR' is used to indicate that the compiler should report +## an error in the marked line (the line that contains the '#ERROR' +## directive.) +## The format for '#ERROR_IN' is: +## #ERROR_IN filename linenumber +## One can omit the extension of the filename ('.nim' is then assumed). +## Tests which contain none of the two directives should compile. Thus they +## are executed after successful compilation and their output is verified +## against the results specified with the '#OUT' directive. +## (Tests which require user interaction are not possible.) +## Tests can have an #ERROR_MSG directive specifiying the error message +## Nimrod shall produce. + +import + strutils, regexprs, os, osproc, streams + +const + cmdTemplate = r"nimrod cc --hints:on $options $filename" + +type + TSpec = object of TObject ## specification object + line: int ## line number where compiler should throw an error + file: string ## file where compiler should throw an error + err: bool ## true if the specification says there should be an error + outp: string ## output that should be produced + puremsg: string ## pure message of compiler + +proc myExec(cmd: string): string = + #echo("Executing: " & cmd) + result = osproc.executeProcess(cmd) + #echo("Received: " & result) + +proc parseTest(filename: string): TSpec = + var i = 0 # the line counter + var matches: array [0..2, string] + result.outp = "" + result.puremsg = "" + result.file = filename + for s in lines(filename): + inc(i) + if find(s, r"\#OUT\s*(.*)", matches): + result.outp = matches[1] + break + if find(s, r"\#ERROR_IN\s*(\S*)\s*(\d+)", matches): + result.file = matches[1] + result.line = parseInt(matches[2]) + result.err = true + break + if find(s, r"\#ERROR_MSG\s*(.*)", matches): + result.line = i + result.outp = matches[1] + result.err = True + break + if find(s, r"\#ERROR$", matches): + result.line = i + result.err = true + break + +proc callCompiler(filename, options: string): TSpec = + var c = parseCmdLine(cmdTemplate % ["filename", filename, "options", options]) + var a: seq[string] = @[] # slicing is not yet implemented :-( + for i in 1 .. c.len-1: add(a, c[i]) + var p = startProcess(command=c[0], args=a, + options={poStdErrToStdOut, poUseShell}) + var outp = p.outputStream + while running(p) or not outp.atEnd(outp): + var s = outp.readLine() + var matches: array [0..3, string] + result.outp = "" + result.puremsg = "" + result.file = "" + result.err = true + if match(s, r"(.*)\((\d+), \d+\) Error\: (.*)", matches): + result.file = matches[1] + result.line = parseInt(matches[2]) + result.outp = matches[0] + result.puremsg = matches[3] + break + elif match(s, r"Error\: (.*)", matches): + result.puremsg = matches[1] + result.outp = matches[0] + result.line = 1 + break + elif match(s, r"Hint\: operation successful", matches): + result.outp = matches[0] + result.err = false + break + +proc cmpResults(filename: string, spec, comp: TSpec): bool = + # short filename for messages (better readability): + var shortfile = os.extractFilename(filename) + + if comp.err and comp.outp == "": + # the compiler did not say "[Error]" nor "operation sucessful" + Echo("[Tester] $1 -- FAILED; COMPILER BROKEN" % shortfile) + elif spec.err != comp.err: + Echo(("[Tester] $1 -- FAILED\n" & + "Compiler says: $2\n" & + "But specification says: $3") % + [shortfile, comp.outp, spec.outp]) + elif spec.err: + if extractFilename(comp.file) != extractFilename(spec.file): + Echo(("[Tester] $1 -- FAILED: file names do not match:\n" & + "Compiler: $2\nSpec: $3") % [shortfile, comp.file, spec.file]) + elif strip(spec.outp) notin strip(comp.puremsg): + Echo(("[Tester] $1 -- FAILED: error messages do not match:\n" & + "Compiler: $2\nSpec: $3") % [shortfile, comp.pureMsg, spec.outp]) + elif comp.line != spec.line: + Echo(("[Tester] $1 -- FAILED: line numbers do not match:\n" & + "Compiler: $2\nSpec: $3") % [shortfile, $comp.line, $spec.line]) + else: + Echo("[Tester] $1 -- OK" % shortfile) + result = true + else: + # we have to run the executable and check its output: + var exeFile = changeFileExt(filename, ExeExt) + if ExistsFile(exeFile): + if len(spec.outp) == 0: + # we have no output to validate against, but compilation succeeded, + # so it's okay: + Echo("[Tester] $1 -- OK" % shortfile) + result = true + else: + var buf = myExec(exeFile) + result = strip(buf) == strip(spec.outp) + if result: + Echo("[Tester] $1 -- compiled program OK" % shortfile) + else: + Echo("[Tester] $1 -- compiled program FAILED" % shortfile) + else: + Echo("[Tester] $1 -- FAILED; executable not found" % shortfile) + +proc main(options: string) = + # runs the complete testsuite + var total = 0 + var passed = 0 + for filename in os.walkFiles("tests/t*.nim"): + if extractFilename(filename) == "tester.nim": continue + var spec = parseTest(filename) + var comp = callCompiler(filename, options) + if cmpResults(filename, spec, comp): inc(passed) + inc(total) + Echo("[Tester] $1/$2 tests passed\n" % [$passed, $total]) + +var + options = "" +for i in 1.. paramCount(): + add(options, " ") + add(options, paramStr(i)) +main(options) diff --git a/tests/tints.nim b/tests/tints.nim new file mode 100644 index 000000000..f2b52c134 --- /dev/null +++ b/tests/tints.nim @@ -0,0 +1,41 @@ +# Test the different integer operations + +var testNumber = 0 + +template test(opr, a, b, c: expr): stmt = + # test the expression at compile and runtime + block: + const constExpr = opr(a, b) + when constExpr != c: + {.error: "Test failed " & $constExpr & " " & $c.} + inc(testNumber) + #Echo("Test: " & $testNumber) + var aa = a + var bb = b + var varExpr = opr(aa, bb) + assert(varExpr == c) + +test(`+`, 12'i8, -13'i16, -1'i16) +test(`shl`, 0b11, 0b100, 0b110000) +test(`shl`, 0b11'i32, 0b100'i64, 0b110000'i64) +test(`shl`, 0b11'i32, 0b100'i32, 0b110000'i32) + +test(`or`, 0xf0f0'i16, 0x0d0d'i16, 0xfdfd'i16) +test(`and`, 0xf0f0'i16, 0xfdfd'i16, 0xf0f0'i16) + +test(`shr`, 0xffffffffffffffff'i64, 0x4'i64, 0x0fffffffffffffff'i64) +test(`shr`, 0xffff'i16, 0x4'i16, 0x0fff'i16) +test(`shr`, 0xff'i8, 0x4'i8, 0x0f'i8) + +test(`shr`, 0xffffffff'i64, 0x4'i64, 0x0fffffff'i64) +test(`shr`, 0xffffffff'i32, 0x4'i32, 0x0fffffff'i32) + +test(`shl`, 0xffffffffffffffff'i64, 0x4'i64, 0xfffffffffffffff0'i64) +test(`shl`, 0xffff'i16, 0x4'i16, 0xfff0'i16) +test(`shl`, 0xff'i8, 0x4'i8, 0xf0'i8) + +test(`shl`, 0xffffffff'i64, 0x4'i64, 0xffffffff0'i64) +test(`shl`, 0xffffffff'i32, 0x4'i32, 0xfffffff0'i32) + +Echo("Success") #OUT Success + diff --git a/tests/tisopr.nim b/tests/tisopr.nim new file mode 100644 index 000000000..d52859b09 --- /dev/null +++ b/tests/tisopr.nim @@ -0,0 +1,20 @@ +# Test is operator + +type + TMyType = object + len: int + data: string + + TOtherType = object of TMyType + +proc p(x: TMyType): bool = + return x is TOtherType + +var + m: TMyType + n: TOtherType + +write(stdout, p(m)) +write(stdout, p(n)) + +#OUT falsetrue diff --git a/tests/tlibs.nim b/tests/tlibs.nim new file mode 100644 index 000000000..317430744 --- /dev/null +++ b/tests/tlibs.nim @@ -0,0 +1,19 @@ +# Test wether the bindings at least compile... + +import + osproc, zipfiles, + sdl, smpeg, sdl_gfx, sdl_net, sdl_mixer, sdl_ttf, + sdl_image, sdl_mixer_nosmpeg + cursorfont, xatom, xf86vmode, xkb, xrandr, xshm, xvlib, keysym, xcms, xi, + xkblib, xrender, xutil, x, xf86dga, xinerama, xlib, xresource, xv, + gtk2, glib2, pango, gdk2, + cairowin32, cairoxlib, + odbcsql, + gl, glut, glu, glx, glext, wingl, + zlib + +import "lib/base/lua/lua" +import "lib/base/lua/lualib" +import "lib/base/lua/lauxlib" + +writeln(stdout, "test compilation of binding modules") diff --git a/tests/topenlen.nim b/tests/topenlen.nim new file mode 100644 index 000000000..b9d7fbc2d --- /dev/null +++ b/tests/topenlen.nim @@ -0,0 +1,12 @@ +# Tests a special bug + +proc choose(b: openArray[string]): string = return b[0] + +proc p(a, b: openarray[string]): int = + result = a.len + b.len - 1 + for j in 0 .. a.len: inc(result) + discard choose(a) + discard choose(b) + +discard choose(["sh", "-c", $p([""], ["a"])]) +echo($p(["", "ha", "abc"], ["xyz"])) #OUT 7 diff --git a/tests/tos.nim b/tests/tos.nim new file mode 100644 index 000000000..9ab4295f8 --- /dev/null +++ b/tests/tos.nim @@ -0,0 +1,12 @@ +# test some things of the os module + +import os + +proc walkDirTree(root: string) = + for k, f in walkDir(root): + case k + of pcFile, pcLinkToFile: echo(f) + of pcDirectory: walkDirTree(f) + of pcLinkToDirectory: nil + +walkDirTree(".") diff --git a/tests/trectype.nim b/tests/trectype.nim index 8e68767b5..3161b0255 100644 --- a/tests/trectype.nim +++ b/tests/trectype.nim @@ -13,3 +13,5 @@ type PB = ref TB TB = array [0..3, P1] T1 = array [0..6, PB] +#ERROR_MSG internal error: cannot generate C type for: PA + diff --git a/tests/tsets.nim b/tests/tsets.nim index 2a01292f3..08ab3e54b 100644 --- a/tests/tsets.nim +++ b/tests/tsets.nim @@ -34,7 +34,8 @@ type TTokTypes* = set[TTokTypeRange] const - toktypes: TTokTypes = {tkSymbol..pred(tkIntLit), tkStrLit..tkTripleStrLit} + toktypes: TTokTypes = {TTokTypeRange(tkSymbol)..pred(tkIntLit), + tkStrLit..tkTripleStrLit} var s: set[char] @@ -46,11 +47,12 @@ else: write(stdout, "BUG: F ist nicht in s!\n") a = {} #{'a'..'z'} for x in low(TAZ) .. high(TAZ): incl(a, x) - if x in a: write(stdout, x & " ") + if x in a: nil else: write(stdout, "BUG: something not in a!\n") for x in low(TTokTypeRange) .. high(TTokTypeRange): if x in tokTypes: - writeln(stdout, "the token '$1' is in the set" % repr(x)) + nil + #writeln(stdout, "the token '$1' is in the set" % repr(x)) #OUT Ha ein F ist in s! diff --git a/tests/tstreams.nim b/tests/tstreams.nim new file mode 100644 index 000000000..68ca8eeeb --- /dev/null +++ b/tests/tstreams.nim @@ -0,0 +1,7 @@ +import streams + +var outp = newFileStream(stdout) +var inp = newFileStream(stdin) +write(outp, "Hallo! What is your name?") +var line = readLine(inp) +write(outp, "nice name: " & line) diff --git a/tests/ttempl.nim b/tests/ttempl.nim new file mode 100644 index 000000000..dcf096671 --- /dev/null +++ b/tests/ttempl.nim @@ -0,0 +1,27 @@ +# Test the new template file mechanism + +import + os, times + +include "sunset.tmpl" + +const + tabs = [["home", "index"], + ["news", "news"], + ["documentation", "documentation"], + ["download", "download"], + ["FAQ", "question"], + ["links", "links"]] + + +var i = 0 +for item in items(tabs): + var content = $i + var file: TFile + if openFile(file, changeFileExt(item[1], "html"), fmWrite): + write(file, sunsetTemplate(current=item[1], ticker="", content=content, + tabs=tabs)) + closeFile(file) + else: + write(stdout, "cannot open file for writing") + inc(i) diff --git a/tests/tvarnums.nim b/tests/tvarnums.nim index 5079e0e16..1b683ad94 100644 --- a/tests/tvarnums.nim +++ b/tests/tvarnums.nim @@ -66,13 +66,13 @@ proc toNum(b: TBuffer): int32 = result = ze(b[0]) and 63 var i = 0 - Shift = 6 + Shift = 6'i32 while (ze(b[i]) and 128) != 0: inc(i) - result = result or int32((ze(b[i]) and 127) shl Shift) - inc(Shift, 7) + result = result or ((int32(ze(b[i])) and 127'i32) shl Shift) + Shift = shift + 7'i32 if (ze(b[0]) and (1 shl 6)) != 0: # sign bit set? - result = not int(result) +% 1 + result = (not result) +% 1'i32 # this is the same as ``- result`` # but gives no overflow error for low(int) diff --git a/tests/typalias.nim b/tests/typalias.nim new file mode 100644 index 000000000..ba9f38ed9 --- /dev/null +++ b/tests/typalias.nim @@ -0,0 +1,15 @@ + +type + TMyObj = TYourObj + TYourObj = object of TObject + x, y: int + +proc init: TYourObj = + result.x = 0 + result.y = -1 + +proc f(x: var TYourObj) = + nil + +var m: TMyObj = init() +f(m) diff --git a/tests/x11test.nim b/tests/x11test.nim new file mode 100644 index 000000000..2769b6c74 --- /dev/null +++ b/tests/x11test.nim @@ -0,0 +1,71 @@ +import xlib, xutil, x, keysym + +const + WINDOW_WIDTH = 400 + WINDOW_HEIGHT = 300 + +var + width, height: int + display: PDisplay + screen: cint + depth: int + win: TWindow + sizeHints: TXSizeHints + +proc create_window = + width = WINDOW_WIDTH + height = WINDOW_HEIGHT + + display = XOpenDisplay(nil) + if display == nil: + echo("Verbindung zum X-Server fehlgeschlagen") + quit(1) + + screen = XDefaultScreen(display) + depth = XDefaultDepth(display, screen) + var rootwin = XRootWindow(display, screen) + win = XCreateSimpleWindow(display, rootwin, 100, 10, + width, height, 5, + XBlackPixel(display, screen), + XWhitePixel(display, screen)) + size_hints.flags = PSize or PMinSize or PMaxSize + size_hints.min_width = width + size_hints.max_width = width + size_hints.min_height = height + size_hints.max_height = height + discard XSetStandardProperties(display, win, "Simple Window", "window", + 0, nil, 0, addr(size_hints)) + discard XSelectInput(display, win, ButtonPressMask or KeyPressMask or + PointerMotionMask) + discard XMapWindow(display, win) + +proc close_window = + discard XDestroyWindow(display, win) + discard XCloseDisplay(display) + +var + xev: TXEvent + +proc process_event = + var key: TKeySym + case int(xev.theType) + of KeyPress: + key = XLookupKeysym(cast[ptr TXKeyEvent](addr(xev)), 0) + if key != 0: + echo("keyboard event") + of ButtonPressMask, PointerMotionMask: + Echo("Mouse event") + else: nil + +proc eventloop = + discard XFlush(display) + var num_events = int(XPending(display)) + while num_events != 0: + dec(num_events) + discard XNextEvent(display, addr(xev)) + process_event() + +create_window() +while true: + eventloop() +close_window() diff --git a/todo.txt b/todo.txt index 149f9bc30..2cd30ceea 100644 --- a/todo.txt +++ b/todo.txt @@ -8,20 +8,15 @@ RST Bugs ---- -- BUG: sigmatch for ``len`` matches the open array too often... *sigh* -- BUG: - for j in 0 .. a.len + b.len - 1: nil - where a and b are open arrays does not compile -- BUG: ["sh", "-c", someProcWithOpenArray(openArr)] produces wrong C code -- BUG: bootstrapping does not work with Borland C -- BUG: addr/deref does not work when interpreting -- BUG: Check that pure procs only consist of asm statements (and comments) -- BUG: tlastmod returns wrong results on BSD (Linux, MacOS X: works) +- BUG: addr/deref may not work when interpreting - BUG: the parser allows empty statements/object case branches +- BUG: the parser allows to omit commas - BUG: when optmizing cgen.c with Visual C++, GCC, LLVM (O3), it breaks. - BUG: ``-cc:bcc`` command line option does not error - BUG: symbol files still do not work +- BUG: tlastmod returns wrong results on BSD (Linux, MacOS X: works) +- BUG: sigmatch for ``len`` matches the open array too often... (?) High priority @@ -30,7 +25,7 @@ High priority - documentation: var types, ``[]`` overloading, ``cast`` and type convertions, ``if`` expresssions, (anonymous) procs - implement two-phase lookup for generics (this is hard...): This is useful - for macros too! Alternative: Explicit early name binding. Both is hard to + for macros too! Alternative: Explicit early name binding. Both are hard to implement - implement closures for the C code generator - get rid of ``nkHiddenStdConv`` in several places: this mechanism caused more @@ -39,7 +34,7 @@ High priority Library ------- -- xml, html, url, cgi, fastcgi: implement from scratch +- xml, html, url, fastcgi: implement from scratch - unicode library - socket library (does SDL for us?) - osproc for Windows @@ -325,6 +320,28 @@ Changelog - fixed many bugs in ``os`` module for Windows - bug in ``semVar`` removed standard convertions - BUGFIX: ``setLen`` for sequences may lead to memory leaks +0.7.1 +- gtk2: cleaned up return types for ``Gtk_*_new`` constructors +- gtk2: added ``pure`` to ``final`` objects +- BUGFIX: ``genTypeSection`` uses ``isPureObject`` now +- BUGFIX: ``GetUniqueType`` was wrong +- BUGFIX: count references from untraced heap to traced heap! +- BUGFIX: fixed owner handling bug; only accessible in semantic checking phase +- BUGFIX: ``ParamTypesMatch`` generics resulting in openarray now generate the + nkHiddenStdConv tree +- BUGFIX: dynamic libraries are reused again -> much smaller C code is produced +- small corrections in the manual +- BUGFIX: the build script did not detect 64 bit Linux +- BUGFIX: the Pascal version did not compile for 64 bit (TUnsignedHash!) +- several bugfixes for 64bit version +- BUGFIX: no index checking was generated for some code that should be checked! +- BUGFIX: docgen did not escape tokens from highlite module +- BUGFIX: fixed seldom integer operations +- BUGFIX: illegal type recursion detection +- BUGFIX: ``for j in 0 .. a.len`` where a is an open array did not transform + correctly +0.7.2 +- small performance improvements for the RST parser For the next versions diff --git a/tools/inno.tmpl b/tools/inno.tmpl new file mode 100644 index 000000000..e2d31eb80 --- /dev/null +++ b/tools/inno.tmpl @@ -0,0 +1,180 @@ +#proc GenerateInnoSetup(c: TConfigData): string = +# result = "" +; Default Template for NimInst +[Setup] +AppName=$c.name +AppVerName=$c.name $c.version +DefaultDirName={code:GiveMeAPath|nimrod} +DefaultGroupName=$c.name +AllowNoIcons=yes +LicenseFile=${expandFilename(c.license)} +OutputBaseFilename=${c.name}_${c.version} +Compression=lzma +SolidCompression=yes +PrivilegesRequired=none +ChangesEnvironment=yes + +[Languages] +Name: english; MessagesFile: compiler:Default.isl + +[Files] + #for f in items(c.commonFiles): +Source: ${expandFilename(f)}; DestDir: {app}\${extractDir(f)}; Flags: ignoreversion + #end for + #for f in items(c.windowsFiles): +Source: ${expandFilename(f)}; DestDir: {app}\${extractDir(f)}; Flags: ignoreversion + #end for + +[Icons] + #if c.app == appConsole: +Name: {group}\Console for $c.name; Filename: {cmd} + #else: +Name: {group}\$c.name; Filename: {app} + #end if +Name: {group}\Documentation; Filename: {app}\doc\overview.html +Name: {group}\{cm:UninstallProgram,$c.name}; Filename: {uninstallexe} + + #if c.binPaths.len > 0: +[Tasks] +Name: modifypath; Description: &Add $c.name to your system path (if not in path already); + #end if + +[Code] +function GiveMeAPath(const DefaultPathName: string): string; +begin + if IsAdminLoggedOn then Result := ExpandConstant('{pf}') + else Result := ExpandConstant('{userdocs}'); + Result := Result + '\' + DefaultPathName; +end; + + #if c.binPaths.len > 0: +// ---------------------------------------------------------------------------- +// +// Inno Setup Ver: 5.2.1 +// Script Version: 1.3.1 +// Author: Jared Breland <jbreland@legroom.net> +// Homepage: http://www.legroom.net/software +// +// Script Function: +// Enable modification of system path directly from Inno Setup installers + +function ModPathDir(): TArrayOfString; +begin + setArrayLength(result, $c.binPaths.len); + #var i = 0 + #for b in items(c.binPaths): + result[$i] := ExpandConstant('{app}') + '\$b'; + #inc(i) + #end for +end; + +procedure ModPath(); +var + oldpath, newpath, aExecFile: String; + pathArr, aExecArr, pathdir: TArrayOfString; + i, d: Integer; +begin + // Get array of new directories and act on each individually + pathdir := ModPathDir(); + for d := 0 to GetArrayLength(pathdir)-1 do begin + // Modify WinNT path + if UsingWinNT() then begin + // Get current path, split into an array + RegQueryStringValue(HKEY_LOCAL_MACHINE, + 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', + 'Path', oldpath); + oldpath := oldpath + ';'; + i := 0; + while (Pos(';', oldpath) > 0) do begin + SetArrayLength(pathArr, i+1); + pathArr[i] := Copy(oldpath, 0, Pos(';', oldpath)-1); + oldpath := Copy(oldpath, Pos(';', oldpath)+1, Length(oldpath)); + i := i + 1; + // Check if current directory matches app dir + if pathdir[d] = pathArr[i-1] then begin + // if uninstalling, remove dir from path + if IsUninstaller() then continue + // if installing, abort because dir was already in path + else abort; + end; + // Add current directory to new path + if i = 1 then newpath := pathArr[i-1] + else newpath := newpath + ';' + pathArr[i-1]; + end; + // Append app dir to path if not already included + if not IsUninstaller() then + newpath := newpath + ';' + pathdir[d]; + // Write new path + RegWriteStringValue(HKEY_LOCAL_MACHINE, + 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', + 'Path', newpath); + end + else begin + // Modify Win9x path + // Convert to shortened dirname + pathdir[d] := GetShortName(pathdir[d]); + // If autoexec.bat exists, check if app dir already exists in path + aExecFile := 'C:\AUTOEXEC.BAT'; + if FileExists(aExecFile) then begin + LoadStringsFromFile(aExecFile, aExecArr); + for i := 0 to GetArrayLength(aExecArr)-1 do begin + if not IsUninstaller() then begin + // If app dir already exists while installing, abort add + if (Pos(pathdir[d], aExecArr[i]) > 0) then + abort; + end + else begin + // If app dir exists and = what we originally set, + // then delete at uninstall + if aExecArr[i] = 'SET PATH=%PATH%;' + pathdir[d] then + aExecArr[i] := ''; + end; + end; + end; + // If app dir not found, or autoexec.bat didn't exist, then + // (create and) append to current path + if not IsUninstaller() then begin + SaveStringToFile(aExecFile, #13#10 + 'SET PATH=%PATH%;' + pathdir[d], + True); + end + else begin + // If uninstalling, write the full autoexec out + SaveStringsToFile(aExecFile, aExecArr, False); + end; + end; + + // Write file to flag modifypath was selected + // Workaround since IsTaskSelected() cannot be called at uninstall and + // AppName and AppId cannot be "read" in Code section + if not IsUninstaller() then + SaveStringToFile(ExpandConstant('{app}') + '\uninsTasks.txt', + WizardSelectedTasks(False), False); + end; +end; + +procedure CurStepChanged(CurStep: TSetupStep); +begin + if CurStep = ssPostInstall then begin + if IsTaskSelected('modifypath') then + ModPath(); + end +end; + +procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); +var + appdir, selectedTasks: String; +begin + appdir := ExpandConstant('{app}'); + if CurUninstallStep = usUninstall then begin + if LoadStringFromFile(appdir + '\uninsTasks.txt', selectedTasks) then + if Pos('modifypath', selectedTasks) > 0 then + ModPath(); + DeleteFile(appdir + '\uninsTasks.txt') + end; +end; + +function NeedRestart(): Boolean; +begin + result := IsTaskSelected('modifypath') and not UsingWinNT() +end; + #end if diff --git a/tools/install.tmpl b/tools/install.tmpl new file mode 100644 index 000000000..c98cbc8d5 --- /dev/null +++ b/tools/install.tmpl @@ -0,0 +1,97 @@ +#subsChar ? +#proc GenerateInstallScript(c: TConfigData): string = +# result = "#! /bin/sh\n# Generated by niminst\n" +CC="gcc" +LINKER="gcc" +COMP_FLAGS="-w" +LINK_FLAGS="" +# add(result, "# platform detection\n") +ucpu=`uname -m` +uos=`uname` + +# add(result, "# convert to lower case:\n") +upcu=`echo $ucpu | tr "[:upper:]" "[:lower:]"` +uos=`echo $uos | tr "[:upper:]" "[:lower:]"` + +case $uos in + *linux* ) + myos="linux" + LINK_FLAGS="$LINK_FLAGS -ldl -lm" + ;; + *freebsd* ) + myos="freebsd" + LINK_FLAGS="$LINK_FLAGS -lm" + ;; + *openbsd* ) + myos="openbsd" + LINK_FLAGS="$LINK_FLAGS -lm" + ;; + *netbsd* ) + myos="netbsd" + LINK_FLAGS="$LINK_FLAGS -lm" + ;; + *darwin* ) + myos="macosx" + LINK_FLAGS="$LINK_FLAGS -ldl -lm" + ;; + *aix* ) + myos="aix" + LINK_FLAGS="$LINK_FLAGS -ldl -lm" + ;; + *solaris* | *sun* ) + myos="solaris" + LINK_FLAGS="$LINK_FLAGS -ldl -lm" + ;; + *) + echo "Error: unknown operating system: $uos" + exit 1 + ;; +esac + +case $ucpu in + *i386* | *i486* | *i586* | *i686* ) + mycpu="i386" ;; + *amd*64* | *x86-64* | *x86_64* ) + mycpu="amd64" ;; + *sparc*|*sun* ) + mycpu="sparc" ;; + *power* ) + mycpu="powerpc" ;; + *mips* ) + mycpu="mips" ;; + *) + echo "Error: unknown processor: $ucpu" + exit 1 + ;; +esac + +# add(result, "# write ``build/platdef.c`` file\n") +cat >build/platdef.c <<EOF +char* nimOS(void) { return "$myos"; } +char* nimCPU(void) { return "$mycpu"; } +EOF +# add(result, "# call the compiler:\n") + +case $myos in +# for osA in 1..c.oses.len: +?{c.oses[osA-1]}) + case $mycpu in +# for cpuA in 1..c.cpus.len: + ?{c.cpus[cpuA-1]}) +# var linkCmd = "build/platdef.o" +# for f in items(c.cfiles[osA][cpuA]): + echo "$CC $COMP_FLAGS -Ibuild -c ?{f} -o ?{changeFileExt(f, "o")}" + $CC $COMP_FLAGS -Ibuild -c ?{f} -o ?{changeFileExt(f, "o")} || exit 1 +# add(linkCmd, " \\\n" & changeFileExt(f, "o")) +# end for + $CC $COMP_FLAGS -Ibuild -c build/platdef.c -o build/platdef.o || exit 1 + echo "$LINKER $LINK_FLAGS -o ?{c.binPaths[0]}/?{toLower(c.name)} ?linkCmd" + $LINKER $LINK_FLAGS -o ?{c.binPaths[0]}/?{toLower(c.name)} ?linkCmd || exit 1 + ;; +# end for + esac + ;; +# end for +esac + +echo "SUCCESS" diff --git a/tools/niminst b/tools/niminst new file mode 100644 index 000000000..1eb39a5b6 --- /dev/null +++ b/tools/niminst Binary files differdiff --git a/tools/niminst.nim b/tools/niminst.nim new file mode 100644 index 000000000..2418ea6c9 --- /dev/null +++ b/tools/niminst.nim @@ -0,0 +1,346 @@ +# +# +# The Nimrod Installation Generator +# (c) Copyright 2008 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +const + haveZipLib = defined(unix) + +when haveZipLib: + import zipfiles + +import + os, strutils, parseopt, parsecfg, strtabs, streams + +const + maxOS = 20 # max number of OSes + maxCPU = 10 # max number of CPUs + buildShFile = "build.sh" + +type + TAppType = enum appConsole, appGUI + TAction = enum + actionNone, # action not yet known + actionCSource # action: create C sources + actionInno, # action: create Inno Setup installer + actionZip # action: create zip file + TConfigData = object of TObject + actions: set[TAction] + commonFiles, windowsFiles, unixFiles, binPaths, authors, + oses, cpus: seq[string] + cfiles: array[1..maxOS, array[1..maxCPU, seq[string]]] + ccompiler, innosetup: tuple[path, flags: string] + name, version, description, license, infile, outdir: string + innoSetupFlag, installScript, uninstallScript: bool + vars: PStringTable + app: TAppType + nimrodArgs: string + +proc initConfigData(c: var TConfigData) = + c.actions = {} + c.commonFiles = @[] + c.windowsFiles = @[] + c.unixFiles = @[] + c.binPaths = @[] + c.authors = @[] + c.oses = @[] + c.cpus = @[] + c.ccompiler = ("", "") + c.innosetup = ("", "") + c.name = "" + c.version = "" + c.description = "" + c.license = "" + c.infile = "" + c.outdir = "" + c.nimrodArgs = "" + c.innoSetupFlag = false + c.installScript = false + c.uninstallScript = false + c.vars = newStringTable(modeStyleInsensitive) + +include "inno.tmpl" +include "install.tmpl" + +# ------------------------- configuration file ------------------------------- + +const + Version = "0.5" + Usage = "niminst - Nimrod Installation Generator Version " & version & """ + + (c) 2008 Andreas Rumpf +Usage: + niminst [options] command[;command2...] ini-file[.ini] [compile_options] +Command: + csource build C source code for source based installations + zip build the ZIP file + inno build the Inno Setup installer +Options: + -o, --output:dir set the output directory + --var:name=value set the value of a variable + -h, --help shows this help + -v, --version shows the version +Compile_options: + will be passed to the Nimrod compiler +""" + +proc parseCmdLine(c: var TConfigData) = + var p = init() + while true: + next(p) + var kind = p.kind + var key = p.key + var val = p.val + case kind + of cmdArgument: + if c.actions == {}: + for a in split(normalize(key), {';', ','}): + case a + of "csource": incl(c.actions, actionCSource) + of "zip": incl(c.actions, actionZip) + of "inno": incl(c.actions, actionInno) + else: quit(Usage) + else: + c.infile = appendFileExt(key, "ini") + c.nimrodArgs = getRestOfCommandLine(p) + break + of cmdLongOption, cmdShortOption: + case normalize(key) + of "help", "h": write(stdout, Usage) + of "version", "v": writeln(stdout, Version) + of "o", "output": c.outdir = val + of "var": + var idx = findSubStr('=', val) + if idx < 0: quit("invalid command line") + c.vars[copy(val, 0, idx-1)] = copy(val, idx+1) + else: quit(Usage) + of cmdEnd: break + if c.infile.len == 0: quit(Usage) + +proc walkDirRecursively(s: var seq[string], root: string) = + for k, f in walkDir(root): + case k + of pcFile, pcLinkToFile: add(s, UnixToNativePath(f)) + of pcDirectory: walkDirRecursively(s, f) + of pcLinkToDirectory: nil + +proc addFiles(s: var seq[string], patterns: seq[string]) = + for p in items(patterns): + if existsDir(p): + walkDirRecursively(s, p) + else: + var i = 0 + for f in walkFiles(p): + add(s, UnixToNativePath(f)) + inc(i) + if i == 0: echo("[Warning] No file found that matches: " & p) + +proc pathFlags(p: var TCfgParser, k, v: string, + t: var tuple[path, flags: string]) = + case normalize(k) + of "path": t.path = v + of "flags": t.flags = v + else: quit(errorStr(p, "unknown variable: " & k)) + +proc parseIniFile(c: var TConfigData) = + var + p: TCfgParser + section: string # current section + var input = newFileStream(c.infile, fmRead) + if input != nil: + open(p, input, c.infile) + while true: + var k = next(p) + case k.kind + of cfgEof: break + of cfgSectionStart: + section = normalize(k.section) + case section + of "innosetup": c.innoSetupFlag = true + of "installscript": c.installScript = true + of "uninstallscript": c.uninstallScript = true + of "var", "project", "common", "ccompiler", "windows", "unix", "7z": nil + else: nil # quit(errorStr(p, "invalid section: " & section)) + + of cfgKeyValuePair: + var v = k.value % c.vars + c.vars[k.key] = v + + case section + of "project": + case normalize(k.key) + of "name": c.name = v + of "version": c.version = v + of "os": c.oses = splitSeq(v, {';'}) + of "cpu": c.cpus = splitSeq(v, {';'}) + of "authors": c.authors = splitSeq(v, {';'}) + of "description": c.description = v + of "app": + case normalize(v) + of "console": c.app = appConsole + of "gui": c.app = appGUI + else: quit(errorStr(p, "expected: console or gui")) + of "license": c.license = UnixToNativePath(k.value) + else: quit(errorStr(p, "unknown variable: " & k.key)) + of "var": nil + of "installscript", "uninstallscript": + quit(errorStr(p, "unknown variable: " & k.key)) + of "common": + case normalize(k.key) + of "files": addFiles(c.commonFiles, splitSeq(v, {';'})) + else: quit(errorStr(p, "unknown variable: " & k.key)) + of "innosetup": pathFlags(p, k.key, v, c.innoSetup) + of "ccompiler": pathFlags(p, k.key, v, c.ccompiler) + of "windows": + case normalize(k.key) + of "files": addFiles(c.windowsFiles, splitSeq(v, {';'})) + of "binpath": c.binPaths = splitSeq(v, {';'}) + else: quit(errorStr(p, "unknown variable: " & k.key)) + of "unix": + case normalize(k.key) + of "files": addFiles(c.unixFiles, splitSeq(v, {';'})) + else: quit(errorStr(p, "unknown variable: " & k.key)) + else: nil + + of cfgOption: quit(errorStr(p, "syntax error")) + of cfgError: quit(errorStr(p, k.msg)) + close(p) + if c.name.len == 0: c.name = changeFileExt(extractFilename(c.infile), "") + else: + quit("cannot open: " & c.infile) + +# ------------------------- generate source based installation --------------- + +proc readCFiles(c: var TConfigData, osA, cpuA: int) = + var cfg: TCfgParser + var cfilesSection = false + var f = extractDir(c.infile) / "mapping.txt" + c.cfiles[osA][cpuA] = @[] + var input = newFileStream(f, fmRead) + if input != nil: + open(cfg, input, f) + while true: + var k = next(cfg) + case k.kind + of cfgEof: break + of cfgSectionStart: + if cfilesSection: break + cfilesSection = cmpIgnoreStyle(k.section, "cfiles") == 0 + of cfgKeyValuePair: nil + of cfgOption: + if cfilesSection and cmpIgnoreStyle(k.key, "file") == 0: + add(c.cfiles[osA][cpuA], k.value) + of cfgError: quit(errorStr(cfg, k.msg)) + close(cfg) + else: + quit("Cannot open: " & f) + +proc buildDir(os, cpu: int): string = + return "build" / ($os & "_" & $cpu) + +proc srcdist(c: var TConfigData) = + for x in walkFiles("lib/*.h"): CopyFile("build" / extractFilename(x), x) + for osA in 1..c.oses.len: + for cpuA in 1..c.cpus.len: + var dir = buildDir(osA, cpuA) + createDir(dir) + var cmd = ("nimrod compile -f --symbolfiles:off --compileonly " & + "--gen_mapping $1 " & + " --os:$2 --cpu:$3 $4") % + [c.nimrodArgs, c.oses[osA-1], c.cpus[cpuA-1], + changeFileExt(c.infile, "nim")] + echo("Executing: " & cmd) + if executeShellCommand(cmd) != 0: + quit("Error: call to nimrod compiler failed") + readCFiles(c, osA, cpuA) + for i in 0 .. c.cfiles[osA][cpuA].len-1: + var dest = dir / extractFilename(c.cfiles[osA][cpuA][i]) + CopyFile(dest, c.cfiles[osA][cpuA][i]) + c.cfiles[osA][cpuA][i] = dest + # second pass: remove duplicate files + for osA in countdown(c.oses.len, 1): + for cpuA in countdown(c.cpus.len, 1): + for i in 0..c.cfiles[osA][cpuA].len-1: + var dup = c.cfiles[osA][cpuA][i] + var f = extractFilename(dup) + for osB in 1..c.oses.len: + for cpuB in 1..c.cpus.len: + if osB != osA or cpuB != cpuA: + var orig = buildDir(osB, cpuB) / f + if ExistsFile(orig) and ExistsFile(dup) and + sameFileContent(orig, dup): + # file is identical, so delete duplicate: + RemoveFile(dup) + c.cfiles[osA][cpuA][i] = orig + var scrpt = GenerateInstallScript(c) + var f: TFile + if openFile(f, buildShFile, fmWrite): + writeln(f, scrpt) + closeFile(f) + else: + quit("Cannot open for writing: " & buildShFile) + +# --------------------- generate inno setup ----------------------------------- +proc setupDist(c: var TConfigData) = + var scrpt = GenerateInnoSetup(c) + var f: TFile + var n = "build" / "install_$1_$2.iss" % [toLower(c.name), c.version] + if openFile(f, n, fmWrite): + writeln(f, scrpt) + closeFile(f) + when defined(windows): + if c.innoSetup.path.len == 0: + c.innoSetup.path = "iscc.exe" + var outcmd = if c.outdir.len == 0: "build" else: c.outdir + var cmd = "$1 $2 /O$3 $4" % [c.innoSetup.path, c.innoSetup.flags, + outcmd, n] + Echo("Executing: " & cmd) + if executeShellCommand(cmd) == 0: + removeFile(n) + else: + quit("External program failed") + else: + quit("Cannot open for writing: " & n) + +# ------------------ generate ZIP file --------------------------------------- +when haveZipLib: + proc zipDist(c: var TConfigData) = + var proj = toLower(c.name) + var n = "$1_$2.zip" % [proj, c.version] + if c.outdir.len == 0: n = "build" / n + else: n = c.outdir / n + var z: TZipArchive + if open(z, n, fmWrite): + addFile(z, proj / buildShFile, buildShFile) + for f in walkFiles("lib/*.h"): + addFile(z, proj / "build" / extractFilename(f), f) + for osA in 1..c.oses.len: + for cpuA in 1..c.cpus.len: + var dir = buildDir(osA, cpuA) + for k, f in walkDir(dir): + if k == pcFile: addFile(z, proj / dir / extractFilename(f), f) + for f in items(c.commonFiles): addFile(z, proj / f, f) + for f in items(c.unixFiles): addFile(z, proj / f, f) + close(z) + else: + quit("Cannot open for writing: " & n) + +# ------------------- main ---------------------------------------------------- + +var c: TConfigData +initConfigData(c) +parseCmdLine(c) +parseIniFile(c) +if actionInno in c.actions: + setupDist(c) +if actionCSource in c.actions: + srcdist(c) +if actionZip in c.actions: + when haveZipLib: + zipdist(c) + else: + quit("libzip is not installed") diff --git a/tools/nimweb.nim b/tools/nimweb.nim new file mode 100644 index 000000000..4835c5f4f --- /dev/null +++ b/tools/nimweb.nim @@ -0,0 +1,203 @@ +# +# +# The Nimrod Website Generator +# (c) Copyright 2008 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +import + os, strutils, times, parseopt, parsecfg, streams, strtabs + +type + TKeyValPair = tuple[key, val: string] + TConfigData = object of TObject + tabs, links: seq[TKeyValPair] + doc, srcdoc, webdoc: seq[string] + authors, projectName, projectTitle, infile, outdir, ticker: string + vars: PStringTable + nimrodArgs: string + +proc initConfigData(c: var TConfigData) = + c.tabs = @[] + c.links = @[] + c.doc = @[] + c.srcdoc = @[] + c.webdoc = @[] + c.infile = "" + c.outdir = "" + c.nimrodArgs = "" + c.authors = "" + c.ticker = "" + c.vars = newStringTable(modeStyleInsensitive) + +include "sunset.tmpl" + +# ------------------------- configuration file ------------------------------- + +const + Version = "0.5" + Usage = "nimweb - Nimrod Installation Generator Version " & version & """ + + (c) 2008 Andreas Rumpf +Usage: + nimweb [options] ini-file[.ini] [compile_options] +Options: + -o, --output:dir set the output directory (default: same as ini-file) + --var:name=value set the value of a variable + -h, --help shows this help + -v, --version shows the version +Compile_options: + will be passed to the Nimrod compiler +""" + +proc parseCmdLine(c: var TConfigData) = + var p = init() + while true: + next(p) + var kind = p.kind + var key = p.key + var val = p.val + case kind + of cmdArgument: + c.infile = appendFileExt(key, "ini") + c.nimrodArgs = getRestOfCommandLine(p) + break + of cmdLongOption, cmdShortOption: + case normalize(key) + of "help", "h": write(stdout, Usage) + of "version", "v": writeln(stdout, Version) + of "o", "output": c.outdir = val + of "var": + var idx = findSubStr('=', val) + if idx < 0: quit("invalid command line") + c.vars[copy(val, 0, idx-1)] = copy(val, idx+1) + else: quit(Usage) + of cmdEnd: break + if c.infile.len == 0: quit(Usage) + +proc walkDirRecursively(s: var seq[string], root, ext: string) = + for k, f in walkDir(root): + case k + of pcFile, pcLinkToFile: + if cmpIgnoreCase(ext, extractFileExt(f)) == 0: + add(s, f) + of pcDirectory: walkDirRecursively(s, f, ext) + of pcLinkToDirectory: nil + +proc addFiles(s: var seq[string], dir, ext: string, patterns: seq[string]) = + for p in items(patterns): + if existsDir(dir / p): + walkDirRecursively(s, dir / p, ext) + else: + add(s, dir / appendFileExt(p, ext)) + +proc parseIniFile(c: var TConfigData) = + var + p: TCfgParser + section: string # current section + var input = newFileStream(c.infile, fmRead) + if input != nil: + open(p, input, c.infile) + while true: + var k = next(p) + case k.kind + of cfgEof: break + of cfgSectionStart: + section = normalize(k.section) + case section + of "project", "links", "tabs", "ticker", "documentation", "var": nil + else: echo("[Warning] Skipping unknown section: " & section) + + of cfgKeyValuePair: + var v = k.value % c.vars + c.vars[k.key] = v + + case section + of "project": + case normalize(k.key) + of "name": c.projectName = v + of "title": c.projectTitle = v + of "authors": c.authors = v + else: quit(errorStr(p, "unknown variable: " & k.key)) + of "var": nil + of "links": add(c.links, (key: k.key, val: v)) + of "tabs": add(c.tabs, (key: k.key, val: v)) + of "ticker": c.ticker = v + of "documentation": + case normalize(k.key) + of "doc": addFiles(c.doc, "doc", "txt" splitSeq(v, {';'})) + of "srcdoc": addFiles(c.srcdoc, "lib", "nim", splitSeq(v, {';'})) + of "webdoc": addFiles(c.webdoc, "lib", "nim", splitSeq(v, {';'})) + else: quit(errorStr(p, "unknown variable: " & k.key)) + else: nil + + of cfgOption: quit(errorStr(p, "syntax error")) + of cfgError: quit(errorStr(p, k.msg)) + close(p) + if c.projectName.len == 0: + c.projectName = changeFileExt(extractFilename(c.infile), "") + if c.outdir.len == 0: + c.outdir = extractDir(c.infile) + else: + quit("cannot open: " & c.infile) + +# ------------------- main ---------------------------------------------------- + +proc Exec(cmd: string) = + echo(cmd) + if os.executeShellCommand(cmd) != 0: quit("external program failed") + +proc buildDoc(c: var TConfigData, destPath: string) = + # call nim for the documentation: + for d in items(c.doc): + Exec("nimrod rst2html $1 -o:$2 --index=$3/theindex $4" % + [c.nimrodArgs, destPath / changeFileExt(extractFileTrunk(d), "html"), + destpath, d]) + for d in items(c.srcdoc): + Exec("nimrod doc $1 -o:$2 --index=$3/theindex $4" % + [c.nimrodArgs, destPath / changeFileExt(extractFileTrunk(d), "html"), + destpath, d]) + Exec("nimrod rst2html $1 -o:$2/theindex.html $2/theindex" % + [c.nimrodArgs, destPath]) + +proc buildAddDoc(c: var TConfigData, destPath: string) = + # build additional documentation (without the index): + for d in items(c.webdoc): + Exec("nimrod doc $1 -o:$2 $3" % + [c.nimrodArgs, destPath / changeFileExt(extractFileTrunk(d), "html"), d]) + +proc main(c: var TConfigData) = + const + cmd = "nimrod rst2html --compileonly $1 -o:web/$2.temp web/$2.txt" + if c.ticker.len > 0: + Exec(cmd % [c.nimrodArgs, c.ticker]) + var temp = "web" / changeFileExt(c.ticker, "temp") + c.ticker = readFile(temp) + if isNil(c.ticker): quit("[Error] cannot open:" & temp) + RemoveFile(temp) + for i in 0..c.tabs.len-1: + var file = c.tabs[i].val + Exec(cmd % [c.nimrodArgs, file]) + var temp = "web" / changeFileExt(file, "temp") + var content = readFile(temp) + if isNil(content): quit("[Error] cannot open: " & temp) + var f: TFile + var outfile = "web/upload/$1.html" % file + if openFile(f, outfile, fmWrite): + writeln(f, generateHTMLPage(c, file, content)) + closeFile(f) + else: + quit("[Error] cannot write file: " & outfile) + removeFile(temp) + + buildAddDoc(c, "web/upload") + buildDoc(c, "web/upload") + buildDoc(c, "doc") + +var c: TConfigData +initConfigData(c) +parseCmdLine(c) +parseIniFile(c) +main(c) diff --git a/tools/sunset.tmpl b/tools/sunset.tmpl new file mode 100644 index 000000000..02e49218c --- /dev/null +++ b/tools/sunset.tmpl @@ -0,0 +1,72 @@ +#proc generateHTMLPage(c: var TConfigData, currentTab, content: string): string = +# result = "" +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> + +<head> + <title>$c.projectTitle</title> + <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> + <link rel="stylesheet" type="text/css" href="style/style.css" /> +</head> + +<body> + <div id="main"> + <div id="links"> + <!-- **** INSERT LINKS HERE **** --> + </div> + <div id="logo"><h1>$c.projectTitle</h1></div> + <div id="content"> + <div id="menu"> + <ul> +#for i in 0.. c.tabs.len-1: +# var name = c.tabs[i].key +# var t = c.tabs[i].val + #if currentTab == t: + <li><a id="selected" + #else: + <li><a + #end if + href="${t}.html" title = "$c.projectName - $name">$name</a></li> +#end for + </ul> + </div> + <div id="column1"> +# if len(c.ticker) > 0: + <div class="sidebaritem"> + <div class="sbihead"> + <h1>latest news</h1> + </div> + <div class="sbicontent"> + $c.ticker + </div> + </div> +# end if +# if len(c.links) > 0: + <div class="sidebaritem"> + <div class="sbihead"> + <h1>additional links</h1> + </div> + <div class="sbilinks"> + <!-- **** INSERT ADDITIONAL LINKS HERE **** --> + <ul> +# for i in 0..c.links.len-1: + <li><a class="reference" href="${c.links[i].val}">${c.links[i].key}</a></li> +# end for + </ul> + </div> + </div> +# end if + </div> + <div id="column2"> + $content + </div> + </div> + <div id="footer"> + copyright © 2008 $c.authors | Last update: ${getDateStr()} + | <a class="reference" href="http://validator.w3.org/check?uri=referer">XHTML 1.1</a> + | <a class="reference" href="http://jigsaw.w3.org/css-validator/check/referer">CSS</a> + | <a class="reference" href="http://www.dcarter.co.uk">design by dcarter</a> + </div> + </div> +</body> +</html> |