diff options
author | Remko Tronçon <git@el-tramo.be> | 2010-02-12 20:54:23 (GMT) |
---|---|---|
committer | Remko Tronçon <git@el-tramo.be> | 2010-02-12 20:54:23 (GMT) |
commit | 231c2cb6d00061e70860626467107f4c63f359a0 (patch) | |
tree | c3ab479f071e882030d6b2fc6d2e3d88b25d16fe /3rdParty | |
parent | 0efa7c32aaf21a29b42b5926cc116007056843be (diff) | |
download | swift-contrib-231c2cb6d00061e70860626467107f4c63f359a0.zip swift-contrib-231c2cb6d00061e70860626467107f4c63f359a0.tar.bz2 |
Creating more submodules.
Diffstat (limited to '3rdParty')
234 files changed, 0 insertions, 92757 deletions
diff --git a/3rdParty/Expat b/3rdParty/Expat new file mode 160000 +Subproject 2e5ac4f15191c245a39b3e223c18de0477c23ab diff --git a/3rdParty/Expat/SConscript b/3rdParty/Expat/SConscript deleted file mode 100644 index 3e3b751..0000000 --- a/3rdParty/Expat/SConscript +++ /dev/null @@ -1,23 +0,0 @@ -Import(["env", "conf_env"]) - -env["EXPAT_FLAGS"] = { - "CPPDEFINES": ["XML_STATIC"], - "CPPPATH": [Dir("src")], - "LIBPATH": [Dir(".")], - "LIBS": ["Expat"], - } - -myenv = env.Clone() -myenv.Append(CPPDEFINES = ["XML_STATIC", "HAVE_EXPAT_CONFIG_H"]) -myenv.Append(CPPPATH = [".", "src"]) - -conf = Configure(conf_env) -if conf.CheckFunc('memmove') : - myenv.Append(CPPDEFINES = ["HAVE_MEMMOVE"]) -conf.Finish() - -myenv.StaticLibrary("Expat", [ - "src/xmltok.c", - "src/xmlparse.c", - "src/xmlrole.c" - ]) diff --git a/3rdParty/Expat/expat_config.h b/3rdParty/Expat/expat_config.h deleted file mode 100644 index 46f8a75..0000000 --- a/3rdParty/Expat/expat_config.h +++ /dev/null @@ -1,5 +0,0 @@ -#define XML_CONTEXT_BYTES 1024 -#define XML_NS 1 - -#include "../Boost/boost/detail/endian.hpp" -#define BYTEORDER BOOST_BYTE_ORDER diff --git a/3rdParty/Expat/src/ascii.h b/3rdParty/Expat/src/ascii.h deleted file mode 100755 index d10530b..0000000 --- a/3rdParty/Expat/src/ascii.h +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#define ASCII_A 0x41 -#define ASCII_B 0x42 -#define ASCII_C 0x43 -#define ASCII_D 0x44 -#define ASCII_E 0x45 -#define ASCII_F 0x46 -#define ASCII_G 0x47 -#define ASCII_H 0x48 -#define ASCII_I 0x49 -#define ASCII_J 0x4A -#define ASCII_K 0x4B -#define ASCII_L 0x4C -#define ASCII_M 0x4D -#define ASCII_N 0x4E -#define ASCII_O 0x4F -#define ASCII_P 0x50 -#define ASCII_Q 0x51 -#define ASCII_R 0x52 -#define ASCII_S 0x53 -#define ASCII_T 0x54 -#define ASCII_U 0x55 -#define ASCII_V 0x56 -#define ASCII_W 0x57 -#define ASCII_X 0x58 -#define ASCII_Y 0x59 -#define ASCII_Z 0x5A - -#define ASCII_a 0x61 -#define ASCII_b 0x62 -#define ASCII_c 0x63 -#define ASCII_d 0x64 -#define ASCII_e 0x65 -#define ASCII_f 0x66 -#define ASCII_g 0x67 -#define ASCII_h 0x68 -#define ASCII_i 0x69 -#define ASCII_j 0x6A -#define ASCII_k 0x6B -#define ASCII_l 0x6C -#define ASCII_m 0x6D -#define ASCII_n 0x6E -#define ASCII_o 0x6F -#define ASCII_p 0x70 -#define ASCII_q 0x71 -#define ASCII_r 0x72 -#define ASCII_s 0x73 -#define ASCII_t 0x74 -#define ASCII_u 0x75 -#define ASCII_v 0x76 -#define ASCII_w 0x77 -#define ASCII_x 0x78 -#define ASCII_y 0x79 -#define ASCII_z 0x7A - -#define ASCII_0 0x30 -#define ASCII_1 0x31 -#define ASCII_2 0x32 -#define ASCII_3 0x33 -#define ASCII_4 0x34 -#define ASCII_5 0x35 -#define ASCII_6 0x36 -#define ASCII_7 0x37 -#define ASCII_8 0x38 -#define ASCII_9 0x39 - -#define ASCII_TAB 0x09 -#define ASCII_SPACE 0x20 -#define ASCII_EXCL 0x21 -#define ASCII_QUOT 0x22 -#define ASCII_AMP 0x26 -#define ASCII_APOS 0x27 -#define ASCII_MINUS 0x2D -#define ASCII_PERIOD 0x2E -#define ASCII_COLON 0x3A -#define ASCII_SEMI 0x3B -#define ASCII_LT 0x3C -#define ASCII_EQUALS 0x3D -#define ASCII_GT 0x3E -#define ASCII_LSQB 0x5B -#define ASCII_RSQB 0x5D -#define ASCII_UNDERSCORE 0x5F -#define ASCII_LPAREN 0x28 -#define ASCII_RPAREN 0x29 -#define ASCII_FF 0x0C -#define ASCII_SLASH 0x2F -#define ASCII_HASH 0x23 -#define ASCII_PIPE 0x7C -#define ASCII_COMMA 0x2C diff --git a/3rdParty/Expat/src/asciitab.h b/3rdParty/Expat/src/asciitab.h deleted file mode 100755 index 79a15c2..0000000 --- a/3rdParty/Expat/src/asciitab.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, -/* 0x0C */ BT_NONXML, BT_CR, BT_NONXML, BT_NONXML, -/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, -/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, -/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, -/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, -/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, -/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, -/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, -/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, -/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, diff --git a/3rdParty/Expat/src/expat.h b/3rdParty/Expat/src/expat.h deleted file mode 100755 index 20a8278..0000000 --- a/3rdParty/Expat/src/expat.h +++ /dev/null @@ -1,1014 +0,0 @@ -/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#ifndef Expat_INCLUDED -#define Expat_INCLUDED 1 - -#ifdef __VMS -/* 0 1 2 3 0 1 2 3 - 1234567890123456789012345678901 1234567890123456789012345678901 */ -#define XML_SetProcessingInstructionHandler XML_SetProcessingInstrHandler -#define XML_SetUnparsedEntityDeclHandler XML_SetUnparsedEntDeclHandler -#define XML_SetStartNamespaceDeclHandler XML_SetStartNamespcDeclHandler -#define XML_SetExternalEntityRefHandlerArg XML_SetExternalEntRefHandlerArg -#endif - -#include <stdlib.h> -#include "expat_external.h" - -#ifdef __cplusplus -extern "C" { -#endif - -struct XML_ParserStruct; -typedef struct XML_ParserStruct *XML_Parser; - -/* Should this be defined using stdbool.h when C99 is available? */ -typedef unsigned char XML_Bool; -#define XML_TRUE ((XML_Bool) 1) -#define XML_FALSE ((XML_Bool) 0) - -/* The XML_Status enum gives the possible return values for several - API functions. The preprocessor #defines are included so this - stanza can be added to code that still needs to support older - versions of Expat 1.95.x: - - #ifndef XML_STATUS_OK - #define XML_STATUS_OK 1 - #define XML_STATUS_ERROR 0 - #endif - - Otherwise, the #define hackery is quite ugly and would have been - dropped. -*/ -enum XML_Status { - XML_STATUS_ERROR = 0, -#define XML_STATUS_ERROR XML_STATUS_ERROR - XML_STATUS_OK = 1, -#define XML_STATUS_OK XML_STATUS_OK - XML_STATUS_SUSPENDED = 2 -#define XML_STATUS_SUSPENDED XML_STATUS_SUSPENDED -}; - -enum XML_Error { - XML_ERROR_NONE, - XML_ERROR_NO_MEMORY, - XML_ERROR_SYNTAX, - XML_ERROR_NO_ELEMENTS, - XML_ERROR_INVALID_TOKEN, - XML_ERROR_UNCLOSED_TOKEN, - XML_ERROR_PARTIAL_CHAR, - XML_ERROR_TAG_MISMATCH, - XML_ERROR_DUPLICATE_ATTRIBUTE, - XML_ERROR_JUNK_AFTER_DOC_ELEMENT, - XML_ERROR_PARAM_ENTITY_REF, - XML_ERROR_UNDEFINED_ENTITY, - XML_ERROR_RECURSIVE_ENTITY_REF, - XML_ERROR_ASYNC_ENTITY, - XML_ERROR_BAD_CHAR_REF, - XML_ERROR_BINARY_ENTITY_REF, - XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF, - XML_ERROR_MISPLACED_XML_PI, - XML_ERROR_UNKNOWN_ENCODING, - XML_ERROR_INCORRECT_ENCODING, - XML_ERROR_UNCLOSED_CDATA_SECTION, - XML_ERROR_EXTERNAL_ENTITY_HANDLING, - XML_ERROR_NOT_STANDALONE, - XML_ERROR_UNEXPECTED_STATE, - XML_ERROR_ENTITY_DECLARED_IN_PE, - XML_ERROR_FEATURE_REQUIRES_XML_DTD, - XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING, - /* Added in 1.95.7. */ - XML_ERROR_UNBOUND_PREFIX, - /* Added in 1.95.8. */ - XML_ERROR_UNDECLARING_PREFIX, - XML_ERROR_INCOMPLETE_PE, - XML_ERROR_XML_DECL, - XML_ERROR_TEXT_DECL, - XML_ERROR_PUBLICID, - XML_ERROR_SUSPENDED, - XML_ERROR_NOT_SUSPENDED, - XML_ERROR_ABORTED, - XML_ERROR_FINISHED, - XML_ERROR_SUSPEND_PE, - /* Added in 2.0. */ - XML_ERROR_RESERVED_PREFIX_XML, - XML_ERROR_RESERVED_PREFIX_XMLNS, - XML_ERROR_RESERVED_NAMESPACE_URI -}; - -enum XML_Content_Type { - XML_CTYPE_EMPTY = 1, - XML_CTYPE_ANY, - XML_CTYPE_MIXED, - XML_CTYPE_NAME, - XML_CTYPE_CHOICE, - XML_CTYPE_SEQ -}; - -enum XML_Content_Quant { - XML_CQUANT_NONE, - XML_CQUANT_OPT, - XML_CQUANT_REP, - XML_CQUANT_PLUS -}; - -/* If type == XML_CTYPE_EMPTY or XML_CTYPE_ANY, then quant will be - XML_CQUANT_NONE, and the other fields will be zero or NULL. - If type == XML_CTYPE_MIXED, then quant will be NONE or REP and - numchildren will contain number of elements that may be mixed in - and children point to an array of XML_Content cells that will be - all of XML_CTYPE_NAME type with no quantification. - - If type == XML_CTYPE_NAME, then the name points to the name, and - the numchildren field will be zero and children will be NULL. The - quant fields indicates any quantifiers placed on the name. - - CHOICE and SEQ will have name NULL, the number of children in - numchildren and children will point, recursively, to an array - of XML_Content cells. - - The EMPTY, ANY, and MIXED types will only occur at top level. -*/ - -typedef struct XML_cp XML_Content; - -struct XML_cp { - enum XML_Content_Type type; - enum XML_Content_Quant quant; - XML_Char * name; - unsigned int numchildren; - XML_Content * children; -}; - - -/* This is called for an element declaration. See above for - description of the model argument. It's the caller's responsibility - to free model when finished with it. -*/ -typedef void (XMLCALL *XML_ElementDeclHandler) (void *userData, - const XML_Char *name, - XML_Content *model); - -XMLPARSEAPI(void) -XML_SetElementDeclHandler(XML_Parser parser, - XML_ElementDeclHandler eldecl); - -/* The Attlist declaration handler is called for *each* attribute. So - a single Attlist declaration with multiple attributes declared will - generate multiple calls to this handler. The "default" parameter - may be NULL in the case of the "#IMPLIED" or "#REQUIRED" - keyword. The "isrequired" parameter will be true and the default - value will be NULL in the case of "#REQUIRED". If "isrequired" is - true and default is non-NULL, then this is a "#FIXED" default. -*/ -typedef void (XMLCALL *XML_AttlistDeclHandler) ( - void *userData, - const XML_Char *elname, - const XML_Char *attname, - const XML_Char *att_type, - const XML_Char *dflt, - int isrequired); - -XMLPARSEAPI(void) -XML_SetAttlistDeclHandler(XML_Parser parser, - XML_AttlistDeclHandler attdecl); - -/* The XML declaration handler is called for *both* XML declarations - and text declarations. The way to distinguish is that the version - parameter will be NULL for text declarations. The encoding - parameter may be NULL for XML declarations. The standalone - parameter will be -1, 0, or 1 indicating respectively that there - was no standalone parameter in the declaration, that it was given - as no, or that it was given as yes. -*/ -typedef void (XMLCALL *XML_XmlDeclHandler) (void *userData, - const XML_Char *version, - const XML_Char *encoding, - int standalone); - -XMLPARSEAPI(void) -XML_SetXmlDeclHandler(XML_Parser parser, - XML_XmlDeclHandler xmldecl); - - -typedef struct { - void *(*malloc_fcn)(size_t size); - void *(*realloc_fcn)(void *ptr, size_t size); - void (*free_fcn)(void *ptr); -} XML_Memory_Handling_Suite; - -/* Constructs a new parser; encoding is the encoding specified by the - external protocol or NULL if there is none specified. -*/ -XMLPARSEAPI(XML_Parser) -XML_ParserCreate(const XML_Char *encoding); - -/* Constructs a new parser and namespace processor. Element type - names and attribute names that belong to a namespace will be - expanded; unprefixed attribute names are never expanded; unprefixed - element type names are expanded only if there is a default - namespace. The expanded name is the concatenation of the namespace - URI, the namespace separator character, and the local part of the - name. If the namespace separator is '\0' then the namespace URI - and the local part will be concatenated without any separator. - It is a programming error to use the separator '\0' with namespace - triplets (see XML_SetReturnNSTriplet). -*/ -XMLPARSEAPI(XML_Parser) -XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator); - - -/* Constructs a new parser using the memory management suite referred to - by memsuite. If memsuite is NULL, then use the standard library memory - suite. If namespaceSeparator is non-NULL it creates a parser with - namespace processing as described above. The character pointed at - will serve as the namespace separator. - - All further memory operations used for the created parser will come from - the given suite. -*/ -XMLPARSEAPI(XML_Parser) -XML_ParserCreate_MM(const XML_Char *encoding, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *namespaceSeparator); - -/* Prepare a parser object to be re-used. This is particularly - valuable when memory allocation overhead is disproportionatly high, - such as when a large number of small documnents need to be parsed. - All handlers are cleared from the parser, except for the - unknownEncodingHandler. The parser's external state is re-initialized - except for the values of ns and ns_triplets. - - Added in Expat 1.95.3. -*/ -XMLPARSEAPI(XML_Bool) -XML_ParserReset(XML_Parser parser, const XML_Char *encoding); - -/* atts is array of name/value pairs, terminated by 0; - names and values are 0 terminated. -*/ -typedef void (XMLCALL *XML_StartElementHandler) (void *userData, - const XML_Char *name, - const XML_Char **atts); - -typedef void (XMLCALL *XML_EndElementHandler) (void *userData, - const XML_Char *name); - - -/* s is not 0 terminated. */ -typedef void (XMLCALL *XML_CharacterDataHandler) (void *userData, - const XML_Char *s, - int len); - -/* target and data are 0 terminated */ -typedef void (XMLCALL *XML_ProcessingInstructionHandler) ( - void *userData, - const XML_Char *target, - const XML_Char *data); - -/* data is 0 terminated */ -typedef void (XMLCALL *XML_CommentHandler) (void *userData, - const XML_Char *data); - -typedef void (XMLCALL *XML_StartCdataSectionHandler) (void *userData); -typedef void (XMLCALL *XML_EndCdataSectionHandler) (void *userData); - -/* This is called for any characters in the XML document for which - there is no applicable handler. This includes both characters that - are part of markup which is of a kind that is not reported - (comments, markup declarations), or characters that are part of a - construct which could be reported but for which no handler has been - supplied. The characters are passed exactly as they were in the XML - document except that they will be encoded in UTF-8 or UTF-16. - Line boundaries are not normalized. Note that a byte order mark - character is not passed to the default handler. There are no - guarantees about how characters are divided between calls to the - default handler: for example, a comment might be split between - multiple calls. -*/ -typedef void (XMLCALL *XML_DefaultHandler) (void *userData, - const XML_Char *s, - int len); - -/* This is called for the start of the DOCTYPE declaration, before - any DTD or internal subset is parsed. -*/ -typedef void (XMLCALL *XML_StartDoctypeDeclHandler) ( - void *userData, - const XML_Char *doctypeName, - const XML_Char *sysid, - const XML_Char *pubid, - int has_internal_subset); - -/* This is called for the start of the DOCTYPE declaration when the - closing > is encountered, but after processing any external - subset. -*/ -typedef void (XMLCALL *XML_EndDoctypeDeclHandler)(void *userData); - -/* This is called for entity declarations. The is_parameter_entity - argument will be non-zero if the entity is a parameter entity, zero - otherwise. - - For internal entities (<!ENTITY foo "bar">), value will - be non-NULL and systemId, publicID, and notationName will be NULL. - The value string is NOT nul-terminated; the length is provided in - the value_length argument. Since it is legal to have zero-length - values, do not use this argument to test for internal entities. - - For external entities, value will be NULL and systemId will be - non-NULL. The publicId argument will be NULL unless a public - identifier was provided. The notationName argument will have a - non-NULL value only for unparsed entity declarations. - - Note that is_parameter_entity can't be changed to XML_Bool, since - that would break binary compatibility. -*/ -typedef void (XMLCALL *XML_EntityDeclHandler) ( - void *userData, - const XML_Char *entityName, - int is_parameter_entity, - const XML_Char *value, - int value_length, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId, - const XML_Char *notationName); - -XMLPARSEAPI(void) -XML_SetEntityDeclHandler(XML_Parser parser, - XML_EntityDeclHandler handler); - -/* OBSOLETE -- OBSOLETE -- OBSOLETE - This handler has been superceded by the EntityDeclHandler above. - It is provided here for backward compatibility. - - This is called for a declaration of an unparsed (NDATA) entity. - The base argument is whatever was set by XML_SetBase. The - entityName, systemId and notationName arguments will never be - NULL. The other arguments may be. -*/ -typedef void (XMLCALL *XML_UnparsedEntityDeclHandler) ( - void *userData, - const XML_Char *entityName, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId, - const XML_Char *notationName); - -/* This is called for a declaration of notation. The base argument is - whatever was set by XML_SetBase. The notationName will never be - NULL. The other arguments can be. -*/ -typedef void (XMLCALL *XML_NotationDeclHandler) ( - void *userData, - const XML_Char *notationName, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId); - -/* When namespace processing is enabled, these are called once for - each namespace declaration. The call to the start and end element - handlers occur between the calls to the start and end namespace - declaration handlers. For an xmlns attribute, prefix will be - NULL. For an xmlns="" attribute, uri will be NULL. -*/ -typedef void (XMLCALL *XML_StartNamespaceDeclHandler) ( - void *userData, - const XML_Char *prefix, - const XML_Char *uri); - -typedef void (XMLCALL *XML_EndNamespaceDeclHandler) ( - void *userData, - const XML_Char *prefix); - -/* This is called if the document is not standalone, that is, it has an - external subset or a reference to a parameter entity, but does not - have standalone="yes". If this handler returns XML_STATUS_ERROR, - then processing will not continue, and the parser will return a - XML_ERROR_NOT_STANDALONE error. - If parameter entity parsing is enabled, then in addition to the - conditions above this handler will only be called if the referenced - entity was actually read. -*/ -typedef int (XMLCALL *XML_NotStandaloneHandler) (void *userData); - -/* This is called for a reference to an external parsed general - entity. The referenced entity is not automatically parsed. The - application can parse it immediately or later using - XML_ExternalEntityParserCreate. - - The parser argument is the parser parsing the entity containing the - reference; it can be passed as the parser argument to - XML_ExternalEntityParserCreate. The systemId argument is the - system identifier as specified in the entity declaration; it will - not be NULL. - - The base argument is the system identifier that should be used as - the base for resolving systemId if systemId was relative; this is - set by XML_SetBase; it may be NULL. - - The publicId argument is the public identifier as specified in the - entity declaration, or NULL if none was specified; the whitespace - in the public identifier will have been normalized as required by - the XML spec. - - The context argument specifies the parsing context in the format - expected by the context argument to XML_ExternalEntityParserCreate; - context is valid only until the handler returns, so if the - referenced entity is to be parsed later, it must be copied. - context is NULL only when the entity is a parameter entity. - - The handler should return XML_STATUS_ERROR if processing should not - continue because of a fatal error in the handling of the external - entity. In this case the calling parser will return an - XML_ERROR_EXTERNAL_ENTITY_HANDLING error. - - Note that unlike other handlers the first argument is the parser, - not userData. -*/ -typedef int (XMLCALL *XML_ExternalEntityRefHandler) ( - XML_Parser parser, - const XML_Char *context, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId); - -/* This is called in two situations: - 1) An entity reference is encountered for which no declaration - has been read *and* this is not an error. - 2) An internal entity reference is read, but not expanded, because - XML_SetDefaultHandler has been called. - Note: skipped parameter entities in declarations and skipped general - entities in attribute values cannot be reported, because - the event would be out of sync with the reporting of the - declarations or attribute values -*/ -typedef void (XMLCALL *XML_SkippedEntityHandler) ( - void *userData, - const XML_Char *entityName, - int is_parameter_entity); - -/* This structure is filled in by the XML_UnknownEncodingHandler to - provide information to the parser about encodings that are unknown - to the parser. - - The map[b] member gives information about byte sequences whose - first byte is b. - - If map[b] is c where c is >= 0, then b by itself encodes the - Unicode scalar value c. - - If map[b] is -1, then the byte sequence is malformed. - - If map[b] is -n, where n >= 2, then b is the first byte of an - n-byte sequence that encodes a single Unicode scalar value. - - The data member will be passed as the first argument to the convert - function. - - The convert function is used to convert multibyte sequences; s will - point to a n-byte sequence where map[(unsigned char)*s] == -n. The - convert function must return the Unicode scalar value represented - by this byte sequence or -1 if the byte sequence is malformed. - - The convert function may be NULL if the encoding is a single-byte - encoding, that is if map[b] >= -1 for all bytes b. - - When the parser is finished with the encoding, then if release is - not NULL, it will call release passing it the data member; once - release has been called, the convert function will not be called - again. - - Expat places certain restrictions on the encodings that are supported - using this mechanism. - - 1. Every ASCII character that can appear in a well-formed XML document, - other than the characters - - $@\^`{}~ - - must be represented by a single byte, and that byte must be the - same byte that represents that character in ASCII. - - 2. No character may require more than 4 bytes to encode. - - 3. All characters encoded must have Unicode scalar values <= - 0xFFFF, (i.e., characters that would be encoded by surrogates in - UTF-16 are not allowed). Note that this restriction doesn't - apply to the built-in support for UTF-8 and UTF-16. - - 4. No Unicode character may be encoded by more than one distinct - sequence of bytes. -*/ -typedef struct { - int map[256]; - void *data; - int (XMLCALL *convert)(void *data, const char *s); - void (XMLCALL *release)(void *data); -} XML_Encoding; - -/* This is called for an encoding that is unknown to the parser. - - The encodingHandlerData argument is that which was passed as the - second argument to XML_SetUnknownEncodingHandler. - - The name argument gives the name of the encoding as specified in - the encoding declaration. - - If the callback can provide information about the encoding, it must - fill in the XML_Encoding structure, and return XML_STATUS_OK. - Otherwise it must return XML_STATUS_ERROR. - - If info does not describe a suitable encoding, then the parser will - return an XML_UNKNOWN_ENCODING error. -*/ -typedef int (XMLCALL *XML_UnknownEncodingHandler) ( - void *encodingHandlerData, - const XML_Char *name, - XML_Encoding *info); - -XMLPARSEAPI(void) -XML_SetElementHandler(XML_Parser parser, - XML_StartElementHandler start, - XML_EndElementHandler end); - -XMLPARSEAPI(void) -XML_SetStartElementHandler(XML_Parser parser, - XML_StartElementHandler handler); - -XMLPARSEAPI(void) -XML_SetEndElementHandler(XML_Parser parser, - XML_EndElementHandler handler); - -XMLPARSEAPI(void) -XML_SetCharacterDataHandler(XML_Parser parser, - XML_CharacterDataHandler handler); - -XMLPARSEAPI(void) -XML_SetProcessingInstructionHandler(XML_Parser parser, - XML_ProcessingInstructionHandler handler); -XMLPARSEAPI(void) -XML_SetCommentHandler(XML_Parser parser, - XML_CommentHandler handler); - -XMLPARSEAPI(void) -XML_SetCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start, - XML_EndCdataSectionHandler end); - -XMLPARSEAPI(void) -XML_SetStartCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start); - -XMLPARSEAPI(void) -XML_SetEndCdataSectionHandler(XML_Parser parser, - XML_EndCdataSectionHandler end); - -/* This sets the default handler and also inhibits expansion of - internal entities. These entity references will be passed to the - default handler, or to the skipped entity handler, if one is set. -*/ -XMLPARSEAPI(void) -XML_SetDefaultHandler(XML_Parser parser, - XML_DefaultHandler handler); - -/* This sets the default handler but does not inhibit expansion of - internal entities. The entity reference will not be passed to the - default handler. -*/ -XMLPARSEAPI(void) -XML_SetDefaultHandlerExpand(XML_Parser parser, - XML_DefaultHandler handler); - -XMLPARSEAPI(void) -XML_SetDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start, - XML_EndDoctypeDeclHandler end); - -XMLPARSEAPI(void) -XML_SetStartDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start); - -XMLPARSEAPI(void) -XML_SetEndDoctypeDeclHandler(XML_Parser parser, - XML_EndDoctypeDeclHandler end); - -XMLPARSEAPI(void) -XML_SetUnparsedEntityDeclHandler(XML_Parser parser, - XML_UnparsedEntityDeclHandler handler); - -XMLPARSEAPI(void) -XML_SetNotationDeclHandler(XML_Parser parser, - XML_NotationDeclHandler handler); - -XMLPARSEAPI(void) -XML_SetNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start, - XML_EndNamespaceDeclHandler end); - -XMLPARSEAPI(void) -XML_SetStartNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start); - -XMLPARSEAPI(void) -XML_SetEndNamespaceDeclHandler(XML_Parser parser, - XML_EndNamespaceDeclHandler end); - -XMLPARSEAPI(void) -XML_SetNotStandaloneHandler(XML_Parser parser, - XML_NotStandaloneHandler handler); - -XMLPARSEAPI(void) -XML_SetExternalEntityRefHandler(XML_Parser parser, - XML_ExternalEntityRefHandler handler); - -/* If a non-NULL value for arg is specified here, then it will be - passed as the first argument to the external entity ref handler - instead of the parser object. -*/ -XMLPARSEAPI(void) -XML_SetExternalEntityRefHandlerArg(XML_Parser parser, - void *arg); - -XMLPARSEAPI(void) -XML_SetSkippedEntityHandler(XML_Parser parser, - XML_SkippedEntityHandler handler); - -XMLPARSEAPI(void) -XML_SetUnknownEncodingHandler(XML_Parser parser, - XML_UnknownEncodingHandler handler, - void *encodingHandlerData); - -/* This can be called within a handler for a start element, end - element, processing instruction or character data. It causes the - corresponding markup to be passed to the default handler. -*/ -XMLPARSEAPI(void) -XML_DefaultCurrent(XML_Parser parser); - -/* If do_nst is non-zero, and namespace processing is in effect, and - a name has a prefix (i.e. an explicit namespace qualifier) then - that name is returned as a triplet in a single string separated by - the separator character specified when the parser was created: URI - + sep + local_name + sep + prefix. - - If do_nst is zero, then namespace information is returned in the - default manner (URI + sep + local_name) whether or not the name - has a prefix. - - Note: Calling XML_SetReturnNSTriplet after XML_Parse or - XML_ParseBuffer has no effect. -*/ - -XMLPARSEAPI(void) -XML_SetReturnNSTriplet(XML_Parser parser, int do_nst); - -/* This value is passed as the userData argument to callbacks. */ -XMLPARSEAPI(void) -XML_SetUserData(XML_Parser parser, void *userData); - -/* Returns the last value set by XML_SetUserData or NULL. */ -#define XML_GetUserData(parser) (*(void **)(parser)) - -/* This is equivalent to supplying an encoding argument to - XML_ParserCreate. On success XML_SetEncoding returns non-zero, - zero otherwise. - Note: Calling XML_SetEncoding after XML_Parse or XML_ParseBuffer - has no effect and returns XML_STATUS_ERROR. -*/ -XMLPARSEAPI(enum XML_Status) -XML_SetEncoding(XML_Parser parser, const XML_Char *encoding); - -/* If this function is called, then the parser will be passed as the - first argument to callbacks instead of userData. The userData will - still be accessible using XML_GetUserData. -*/ -XMLPARSEAPI(void) -XML_UseParserAsHandlerArg(XML_Parser parser); - -/* If useDTD == XML_TRUE is passed to this function, then the parser - will assume that there is an external subset, even if none is - specified in the document. In such a case the parser will call the - externalEntityRefHandler with a value of NULL for the systemId - argument (the publicId and context arguments will be NULL as well). - Note: For the purpose of checking WFC: Entity Declared, passing - useDTD == XML_TRUE will make the parser behave as if the document - had a DTD with an external subset. - Note: If this function is called, then this must be done before - the first call to XML_Parse or XML_ParseBuffer, since it will - have no effect after that. Returns - XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING. - Note: If the document does not have a DOCTYPE declaration at all, - then startDoctypeDeclHandler and endDoctypeDeclHandler will not - be called, despite an external subset being parsed. - Note: If XML_DTD is not defined when Expat is compiled, returns - XML_ERROR_FEATURE_REQUIRES_XML_DTD. -*/ -XMLPARSEAPI(enum XML_Error) -XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD); - - -/* Sets the base to be used for resolving relative URIs in system - identifiers in declarations. Resolving relative identifiers is - left to the application: this value will be passed through as the - base argument to the XML_ExternalEntityRefHandler, - XML_NotationDeclHandler and XML_UnparsedEntityDeclHandler. The base - argument will be copied. Returns XML_STATUS_ERROR if out of memory, - XML_STATUS_OK otherwise. -*/ -XMLPARSEAPI(enum XML_Status) -XML_SetBase(XML_Parser parser, const XML_Char *base); - -XMLPARSEAPI(const XML_Char *) -XML_GetBase(XML_Parser parser); - -/* Returns the number of the attribute/value pairs passed in last call - to the XML_StartElementHandler that were specified in the start-tag - rather than defaulted. Each attribute/value pair counts as 2; thus - this correspondds to an index into the atts array passed to the - XML_StartElementHandler. -*/ -XMLPARSEAPI(int) -XML_GetSpecifiedAttributeCount(XML_Parser parser); - -/* Returns the index of the ID attribute passed in the last call to - XML_StartElementHandler, or -1 if there is no ID attribute. Each - attribute/value pair counts as 2; thus this correspondds to an - index into the atts array passed to the XML_StartElementHandler. -*/ -XMLPARSEAPI(int) -XML_GetIdAttributeIndex(XML_Parser parser); - -/* Parses some input. Returns XML_STATUS_ERROR if a fatal error is - detected. The last call to XML_Parse must have isFinal true; len - may be zero for this call (or any other). - - Though the return values for these functions has always been - described as a Boolean value, the implementation, at least for the - 1.95.x series, has always returned exactly one of the XML_Status - values. -*/ -XMLPARSEAPI(enum XML_Status) -XML_Parse(XML_Parser parser, const char *s, int len, int isFinal); - -XMLPARSEAPI(void *) -XML_GetBuffer(XML_Parser parser, int len); - -XMLPARSEAPI(enum XML_Status) -XML_ParseBuffer(XML_Parser parser, int len, int isFinal); - -/* Stops parsing, causing XML_Parse() or XML_ParseBuffer() to return. - Must be called from within a call-back handler, except when aborting - (resumable = 0) an already suspended parser. Some call-backs may - still follow because they would otherwise get lost. Examples: - - endElementHandler() for empty elements when stopped in - startElementHandler(), - - endNameSpaceDeclHandler() when stopped in endElementHandler(), - and possibly others. - - Can be called from most handlers, including DTD related call-backs, - except when parsing an external parameter entity and resumable != 0. - Returns XML_STATUS_OK when successful, XML_STATUS_ERROR otherwise. - Possible error codes: - - XML_ERROR_SUSPENDED: when suspending an already suspended parser. - - XML_ERROR_FINISHED: when the parser has already finished. - - XML_ERROR_SUSPEND_PE: when suspending while parsing an external PE. - - When resumable != 0 (true) then parsing is suspended, that is, - XML_Parse() and XML_ParseBuffer() return XML_STATUS_SUSPENDED. - Otherwise, parsing is aborted, that is, XML_Parse() and XML_ParseBuffer() - return XML_STATUS_ERROR with error code XML_ERROR_ABORTED. - - *Note*: - This will be applied to the current parser instance only, that is, if - there is a parent parser then it will continue parsing when the - externalEntityRefHandler() returns. It is up to the implementation of - the externalEntityRefHandler() to call XML_StopParser() on the parent - parser (recursively), if one wants to stop parsing altogether. - - When suspended, parsing can be resumed by calling XML_ResumeParser(). -*/ -XMLPARSEAPI(enum XML_Status) -XML_StopParser(XML_Parser parser, XML_Bool resumable); - -/* Resumes parsing after it has been suspended with XML_StopParser(). - Must not be called from within a handler call-back. Returns same - status codes as XML_Parse() or XML_ParseBuffer(). - Additional error code XML_ERROR_NOT_SUSPENDED possible. - - *Note*: - This must be called on the most deeply nested child parser instance - first, and on its parent parser only after the child parser has finished, - to be applied recursively until the document entity's parser is restarted. - That is, the parent parser will not resume by itself and it is up to the - application to call XML_ResumeParser() on it at the appropriate moment. -*/ -XMLPARSEAPI(enum XML_Status) -XML_ResumeParser(XML_Parser parser); - -enum XML_Parsing { - XML_INITIALIZED, - XML_PARSING, - XML_FINISHED, - XML_SUSPENDED -}; - -typedef struct { - enum XML_Parsing parsing; - XML_Bool finalBuffer; -} XML_ParsingStatus; - -/* Returns status of parser with respect to being initialized, parsing, - finished, or suspended and processing the final buffer. - XXX XML_Parse() and XML_ParseBuffer() should return XML_ParsingStatus, - XXX with XML_FINISHED_OK or XML_FINISHED_ERROR replacing XML_FINISHED -*/ -XMLPARSEAPI(void) -XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status); - -/* Creates an XML_Parser object that can parse an external general - entity; context is a '\0'-terminated string specifying the parse - context; encoding is a '\0'-terminated string giving the name of - the externally specified encoding, or NULL if there is no - externally specified encoding. The context string consists of a - sequence of tokens separated by formfeeds (\f); a token consisting - of a name specifies that the general entity of the name is open; a - token of the form prefix=uri specifies the namespace for a - particular prefix; a token of the form =uri specifies the default - namespace. This can be called at any point after the first call to - an ExternalEntityRefHandler so longer as the parser has not yet - been freed. The new parser is completely independent and may - safely be used in a separate thread. The handlers and userData are - initialized from the parser argument. Returns NULL if out of memory. - Otherwise returns a new XML_Parser object. -*/ -XMLPARSEAPI(XML_Parser) -XML_ExternalEntityParserCreate(XML_Parser parser, - const XML_Char *context, - const XML_Char *encoding); - -enum XML_ParamEntityParsing { - XML_PARAM_ENTITY_PARSING_NEVER, - XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE, - XML_PARAM_ENTITY_PARSING_ALWAYS -}; - -/* Controls parsing of parameter entities (including the external DTD - subset). If parsing of parameter entities is enabled, then - references to external parameter entities (including the external - DTD subset) will be passed to the handler set with - XML_SetExternalEntityRefHandler. The context passed will be 0. - - Unlike external general entities, external parameter entities can - only be parsed synchronously. If the external parameter entity is - to be parsed, it must be parsed during the call to the external - entity ref handler: the complete sequence of - XML_ExternalEntityParserCreate, XML_Parse/XML_ParseBuffer and - XML_ParserFree calls must be made during this call. After - XML_ExternalEntityParserCreate has been called to create the parser - for the external parameter entity (context must be 0 for this - call), it is illegal to make any calls on the old parser until - XML_ParserFree has been called on the newly created parser. - If the library has been compiled without support for parameter - entity parsing (ie without XML_DTD being defined), then - XML_SetParamEntityParsing will return 0 if parsing of parameter - entities is requested; otherwise it will return non-zero. - Note: If XML_SetParamEntityParsing is called after XML_Parse or - XML_ParseBuffer, then it has no effect and will always return 0. -*/ -XMLPARSEAPI(int) -XML_SetParamEntityParsing(XML_Parser parser, - enum XML_ParamEntityParsing parsing); - -/* If XML_Parse or XML_ParseBuffer have returned XML_STATUS_ERROR, then - XML_GetErrorCode returns information about the error. -*/ -XMLPARSEAPI(enum XML_Error) -XML_GetErrorCode(XML_Parser parser); - -/* These functions return information about the current parse - location. They may be called from any callback called to report - some parse event; in this case the location is the location of the - first of the sequence of characters that generated the event. When - called from callbacks generated by declarations in the document - prologue, the location identified isn't as neatly defined, but will - be within the relevant markup. When called outside of the callback - functions, the position indicated will be just past the last parse - event (regardless of whether there was an associated callback). - - They may also be called after returning from a call to XML_Parse - or XML_ParseBuffer. If the return value is XML_STATUS_ERROR then - the location is the location of the character at which the error - was detected; otherwise the location is the location of the last - parse event, as described above. -*/ -XMLPARSEAPI(XML_Size) XML_GetCurrentLineNumber(XML_Parser parser); -XMLPARSEAPI(XML_Size) XML_GetCurrentColumnNumber(XML_Parser parser); -XMLPARSEAPI(XML_Index) XML_GetCurrentByteIndex(XML_Parser parser); - -/* Return the number of bytes in the current event. - Returns 0 if the event is in an internal entity. -*/ -XMLPARSEAPI(int) -XML_GetCurrentByteCount(XML_Parser parser); - -/* If XML_CONTEXT_BYTES is defined, returns the input buffer, sets - the integer pointed to by offset to the offset within this buffer - of the current parse position, and sets the integer pointed to by size - to the size of this buffer (the number of input bytes). Otherwise - returns a NULL pointer. Also returns a NULL pointer if a parse isn't - active. - - NOTE: The character pointer returned should not be used outside - the handler that makes the call. -*/ -XMLPARSEAPI(const char *) -XML_GetInputContext(XML_Parser parser, - int *offset, - int *size); - -/* For backwards compatibility with previous versions. */ -#define XML_GetErrorLineNumber XML_GetCurrentLineNumber -#define XML_GetErrorColumnNumber XML_GetCurrentColumnNumber -#define XML_GetErrorByteIndex XML_GetCurrentByteIndex - -/* Frees the content model passed to the element declaration handler */ -XMLPARSEAPI(void) -XML_FreeContentModel(XML_Parser parser, XML_Content *model); - -/* Exposing the memory handling functions used in Expat */ -XMLPARSEAPI(void *) -XML_MemMalloc(XML_Parser parser, size_t size); - -XMLPARSEAPI(void *) -XML_MemRealloc(XML_Parser parser, void *ptr, size_t size); - -XMLPARSEAPI(void) -XML_MemFree(XML_Parser parser, void *ptr); - -/* Frees memory used by the parser. */ -XMLPARSEAPI(void) -XML_ParserFree(XML_Parser parser); - -/* Returns a string describing the error. */ -XMLPARSEAPI(const XML_LChar *) -XML_ErrorString(enum XML_Error code); - -/* Return a string containing the version number of this expat */ -XMLPARSEAPI(const XML_LChar *) -XML_ExpatVersion(void); - -typedef struct { - int major; - int minor; - int micro; -} XML_Expat_Version; - -/* Return an XML_Expat_Version structure containing numeric version - number information for this version of expat. -*/ -XMLPARSEAPI(XML_Expat_Version) -XML_ExpatVersionInfo(void); - -/* Added in Expat 1.95.5. */ -enum XML_FeatureEnum { - XML_FEATURE_END = 0, - XML_FEATURE_UNICODE, - XML_FEATURE_UNICODE_WCHAR_T, - XML_FEATURE_DTD, - XML_FEATURE_CONTEXT_BYTES, - XML_FEATURE_MIN_SIZE, - XML_FEATURE_SIZEOF_XML_CHAR, - XML_FEATURE_SIZEOF_XML_LCHAR, - XML_FEATURE_NS, - XML_FEATURE_LARGE_SIZE - /* Additional features must be added to the end of this enum. */ -}; - -typedef struct { - enum XML_FeatureEnum feature; - const XML_LChar *name; - long int value; -} XML_Feature; - -XMLPARSEAPI(const XML_Feature *) -XML_GetFeatureList(void); - - -/* Expat follows the GNU/Linux convention of odd number minor version for - beta/development releases and even number minor version for stable - releases. Micro is bumped with each release, and set to 0 with each - change to major or minor version. -*/ -#define XML_MAJOR_VERSION 2 -#define XML_MINOR_VERSION 0 -#define XML_MICRO_VERSION 1 - -#ifdef __cplusplus -} -#endif - -#endif /* not Expat_INCLUDED */ diff --git a/3rdParty/Expat/src/expat_external.h b/3rdParty/Expat/src/expat_external.h deleted file mode 100755 index 2c03284..0000000 --- a/3rdParty/Expat/src/expat_external.h +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#ifndef Expat_External_INCLUDED -#define Expat_External_INCLUDED 1 - -/* External API definitions */ - -#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__) -#define XML_USE_MSC_EXTENSIONS 1 -#endif - -/* Expat tries very hard to make the API boundary very specifically - defined. There are two macros defined to control this boundary; - each of these can be defined before including this header to - achieve some different behavior, but doing so it not recommended or - tested frequently. - - XMLCALL - The calling convention to use for all calls across the - "library boundary." This will default to cdecl, and - try really hard to tell the compiler that's what we - want. - - XMLIMPORT - Whatever magic is needed to note that a function is - to be imported from a dynamically loaded library - (.dll, .so, or .sl, depending on your platform). - - The XMLCALL macro was added in Expat 1.95.7. The only one which is - expected to be directly useful in client code is XMLCALL. - - Note that on at least some Unix versions, the Expat library must be - compiled with the cdecl calling convention as the default since - system headers may assume the cdecl convention. -*/ -#ifndef XMLCALL -#if defined(_MSC_VER) -#define XMLCALL __cdecl -#elif defined(__GNUC__) && defined(__i386) && !defined(__INTEL_COMPILER) -#define XMLCALL __attribute__((cdecl)) -#else -/* For any platform which uses this definition and supports more than - one calling convention, we need to extend this definition to - declare the convention used on that platform, if it's possible to - do so. - - If this is the case for your platform, please file a bug report - with information on how to identify your platform via the C - pre-processor and how to specify the same calling convention as the - platform's malloc() implementation. -*/ -#define XMLCALL -#endif -#endif /* not defined XMLCALL */ - - -#if !defined(XML_STATIC) && !defined(XMLIMPORT) -#ifndef XML_BUILDING_EXPAT -/* using Expat from an application */ - -#ifdef XML_USE_MSC_EXTENSIONS -#define XMLIMPORT __declspec(dllimport) -#endif - -#endif -#endif /* not defined XML_STATIC */ - - -/* If we didn't define it above, define it away: */ -#ifndef XMLIMPORT -#define XMLIMPORT -#endif - - -#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef XML_UNICODE_WCHAR_T -#define XML_UNICODE -#endif - -#ifdef XML_UNICODE /* Information is UTF-16 encoded. */ -#ifdef XML_UNICODE_WCHAR_T -typedef wchar_t XML_Char; -typedef wchar_t XML_LChar; -#else -typedef unsigned short XML_Char; -typedef char XML_LChar; -#endif /* XML_UNICODE_WCHAR_T */ -#else /* Information is UTF-8 encoded. */ -typedef char XML_Char; -typedef char XML_LChar; -#endif /* XML_UNICODE */ - -#ifdef XML_LARGE_SIZE /* Use large integers for file/stream positions. */ -#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400 -typedef __int64 XML_Index; -typedef unsigned __int64 XML_Size; -#else -typedef long long XML_Index; -typedef unsigned long long XML_Size; -#endif -#else -typedef long XML_Index; -typedef unsigned long XML_Size; -#endif /* XML_LARGE_SIZE */ - -#ifdef __cplusplus -} -#endif - -#endif /* not Expat_External_INCLUDED */ diff --git a/3rdParty/Expat/src/iasciitab.h b/3rdParty/Expat/src/iasciitab.h deleted file mode 100755 index 24a1d5c..0000000 --- a/3rdParty/Expat/src/iasciitab.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* Like asciitab.h, except that 0xD has code BT_S rather than BT_CR */ -/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, -/* 0x0C */ BT_NONXML, BT_S, BT_NONXML, BT_NONXML, -/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, -/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, -/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, -/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, -/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, -/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, -/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, -/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, -/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, -/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, -/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, -/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, diff --git a/3rdParty/Expat/src/internal.h b/3rdParty/Expat/src/internal.h deleted file mode 100755 index dd54548..0000000 --- a/3rdParty/Expat/src/internal.h +++ /dev/null @@ -1,73 +0,0 @@ -/* internal.h - - Internal definitions used by Expat. This is not needed to compile - client code. - - The following calling convention macros are defined for frequently - called functions: - - FASTCALL - Used for those internal functions that have a simple - body and a low number of arguments and local variables. - - PTRCALL - Used for functions called though function pointers. - - PTRFASTCALL - Like PTRCALL, but for low number of arguments. - - inline - Used for selected internal functions for which inlining - may improve performance on some platforms. - - Note: Use of these macros is based on judgement, not hard rules, - and therefore subject to change. -*/ - -#if defined(__GNUC__) && defined(__i386__) && !defined(__MINGW32__) -/* We'll use this version by default only where we know it helps. - - regparm() generates warnings on Solaris boxes. See SF bug #692878. - - Instability reported with egcs on a RedHat Linux 7.3. - Let's comment out: - #define FASTCALL __attribute__((stdcall, regparm(3))) - and let's try this: -*/ -#define FASTCALL __attribute__((regparm(3))) -#define PTRFASTCALL __attribute__((regparm(3))) -#endif - -/* Using __fastcall seems to have an unexpected negative effect under - MS VC++, especially for function pointers, so we won't use it for - now on that platform. It may be reconsidered for a future release - if it can be made more effective. - Likely reason: __fastcall on Windows is like stdcall, therefore - the compiler cannot perform stack optimizations for call clusters. -*/ - -/* Make sure all of these are defined if they aren't already. */ - -#ifndef FASTCALL -#define FASTCALL -#endif - -#ifndef PTRCALL -#define PTRCALL -#endif - -#ifndef PTRFASTCALL -#define PTRFASTCALL -#endif - -#ifndef XML_MIN_SIZE -#if !defined(__cplusplus) && !defined(inline) -#ifdef __GNUC__ -#define inline __inline -#endif /* __GNUC__ */ -#endif -#endif /* XML_MIN_SIZE */ - -#ifdef __cplusplus -#define inline inline -#else -#ifndef inline -#define inline -#endif -#endif diff --git a/3rdParty/Expat/src/latin1tab.h b/3rdParty/Expat/src/latin1tab.h deleted file mode 100755 index 53c25d7..0000000 --- a/3rdParty/Expat/src/latin1tab.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* 0x80 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x84 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x88 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x8C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x90 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x94 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x98 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0x9C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xA0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xA4 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xA8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, -/* 0xAC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xB0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xB4 */ BT_OTHER, BT_NMSTRT, BT_OTHER, BT_NAME, -/* 0xB8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, -/* 0xBC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, -/* 0xC0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xC4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xC8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xCC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xD0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xD4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0xD8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xDC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xE0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xE4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xE8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xEC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xF0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xF4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, -/* 0xF8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, -/* 0xFC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, diff --git a/3rdParty/Expat/src/nametab.h b/3rdParty/Expat/src/nametab.h deleted file mode 100755 index b05e62c..0000000 --- a/3rdParty/Expat/src/nametab.h +++ /dev/null @@ -1,150 +0,0 @@ -static const unsigned namingBitmap[] = { -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0x00000000, 0x04000000, 0x87FFFFFE, 0x07FFFFFE, -0x00000000, 0x00000000, 0xFF7FFFFF, 0xFF7FFFFF, -0xFFFFFFFF, 0x7FF3FFFF, 0xFFFFFDFE, 0x7FFFFFFF, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE00F, 0xFC31FFFF, -0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, -0xFFFFFFFF, 0xF80001FF, 0x00000003, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFD740, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, -0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, -0xFFFF0003, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, -0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, -0x0000007F, 0x00000000, 0xFFFF0000, 0x000707FF, -0x00000000, 0x07FFFFFE, 0x000007FE, 0xFFFE0000, -0xFFFFFFFF, 0x7CFFFFFF, 0x002F7FFF, 0x00000060, -0xFFFFFFE0, 0x23FFFFFF, 0xFF000000, 0x00000003, -0xFFF99FE0, 0x03C5FDFF, 0xB0000000, 0x00030003, -0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000, -0xFFFBAFE0, 0x23EDFDFF, 0x00000000, 0x00000001, -0xFFF99FE0, 0x23CDFDFF, 0xB0000000, 0x00000003, -0xD63DC7E0, 0x03BFC718, 0x00000000, 0x00000000, -0xFFFDDFE0, 0x03EFFDFF, 0x00000000, 0x00000003, -0xFFFDDFE0, 0x03EFFDFF, 0x40000000, 0x00000003, -0xFFFDDFE0, 0x03FFFDFF, 0x00000000, 0x00000003, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFE, 0x000D7FFF, 0x0000003F, 0x00000000, -0xFEF02596, 0x200D6CAE, 0x0000001F, 0x00000000, -0x00000000, 0x00000000, 0xFFFFFEFF, 0x000003FF, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0xFFFFFFFF, 0xFFFF003F, 0x007FFFFF, -0x0007DAED, 0x50000000, 0x82315001, 0x002C62AB, -0x40000000, 0xF580C900, 0x00000007, 0x02010800, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, -0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, -0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, -0x00000000, 0x00004C40, 0x00000000, 0x00000000, -0x00000007, 0x00000000, 0x00000000, 0x00000000, -0x00000080, 0x000003FE, 0xFFFFFFFE, 0xFFFFFFFF, -0x001FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x07FFFFFF, -0xFFFFFFE0, 0x00001FFF, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, -0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000, -0x00000000, 0x07FF6000, 0x87FFFFFE, 0x07FFFFFE, -0x00000000, 0x00800000, 0xFF7FFFFF, 0xFF7FFFFF, -0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, -0xFFFFFFFF, 0xF80001FF, 0x00030003, 0x00000000, -0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000003, -0xFFFFD7C0, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, -0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, -0xFFFF007B, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, -0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, -0xFFFE007F, 0xBBFFFFFB, 0xFFFF0016, 0x000707FF, -0x00000000, 0x07FFFFFE, 0x0007FFFF, 0xFFFF03FF, -0xFFFFFFFF, 0x7CFFFFFF, 0xFFEF7FFF, 0x03FF3DFF, -0xFFFFFFEE, 0xF3FFFFFF, 0xFF1E3FFF, 0x0000FFCF, -0xFFF99FEE, 0xD3C5FDFF, 0xB080399F, 0x0003FFCF, -0xFFF987E4, 0xD36DFDFF, 0x5E003987, 0x001FFFC0, -0xFFFBAFEE, 0xF3EDFDFF, 0x00003BBF, 0x0000FFC1, -0xFFF99FEE, 0xF3CDFDFF, 0xB0C0398F, 0x0000FFC3, -0xD63DC7EC, 0xC3BFC718, 0x00803DC7, 0x0000FF80, -0xFFFDDFEE, 0xC3EFFDFF, 0x00603DDF, 0x0000FFC3, -0xFFFDDFEC, 0xC3EFFDFF, 0x40603DDF, 0x0000FFC3, -0xFFFDDFEC, 0xC3FFFDFF, 0x00803DCF, 0x0000FFC3, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FFF, 0x00000000, -0xFEF02596, 0x3BFF6CAE, 0x03FF3F5F, 0x00000000, -0x03000000, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE03FF, -0xFEBF0FDF, 0x02FE3FFF, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x1FFF0000, 0x00000002, -0x000000A0, 0x003EFFFE, 0xFFFFFFFE, 0xFFFFFFFF, -0x661FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x77FFFFFF, -}; -static const unsigned char nmstrtPages[] = { -0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, -0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, -0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, -0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -static const unsigned char namePages[] = { -0x19, 0x03, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x00, -0x00, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, -0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, -0x26, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x27, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; diff --git a/3rdParty/Expat/src/utf8tab.h b/3rdParty/Expat/src/utf8tab.h deleted file mode 100755 index 7bb3e77..0000000 --- a/3rdParty/Expat/src/utf8tab.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - - -/* 0x80 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x84 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x88 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x8C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x90 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x94 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x98 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0x9C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xA0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xA4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xA8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xAC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xB0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xB4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xB8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xBC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, -/* 0xC0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xC4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xC8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xCC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xD0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xD4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xD8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xDC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, -/* 0xE0 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xE4 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xE8 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xEC */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, -/* 0xF0 */ BT_LEAD4, BT_LEAD4, BT_LEAD4, BT_LEAD4, -/* 0xF4 */ BT_LEAD4, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0xF8 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, -/* 0xFC */ BT_NONXML, BT_NONXML, BT_MALFORM, BT_MALFORM, diff --git a/3rdParty/Expat/src/xmlparse.c b/3rdParty/Expat/src/xmlparse.c deleted file mode 100755 index 94e31de..0000000 --- a/3rdParty/Expat/src/xmlparse.c +++ /dev/null @@ -1,6287 +0,0 @@ -/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include <stddef.h> -#include <string.h> /* memset(), memcpy() */ -#include <assert.h> - -#define XML_BUILDING_EXPAT 1 - -#ifdef COMPILED_FROM_DSP -#include "winconfig.h" -#elif defined(MACOS_CLASSIC) -#include "macconfig.h" -#elif defined(__amigaos4__) -#include "amigaconfig.h" -#elif defined(__WATCOMC__) -#include "watcomconfig.h" -#elif defined(HAVE_EXPAT_CONFIG_H) -#include <expat_config.h> -#endif /* ndef COMPILED_FROM_DSP */ - -#include "ascii.h" -#include "expat.h" - -#ifdef XML_UNICODE -#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX -#define XmlConvert XmlUtf16Convert -#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding -#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS -#define XmlEncode XmlUtf16Encode -/* Using pointer subtraction to convert to integer type. */ -#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((char *)(s) - (char *)NULL) & 1)) -typedef unsigned short ICHAR; -#else -#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX -#define XmlConvert XmlUtf8Convert -#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding -#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS -#define XmlEncode XmlUtf8Encode -#define MUST_CONVERT(enc, s) (!(enc)->isUtf8) -typedef char ICHAR; -#endif - - -#ifndef XML_NS - -#define XmlInitEncodingNS XmlInitEncoding -#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding -#undef XmlGetInternalEncodingNS -#define XmlGetInternalEncodingNS XmlGetInternalEncoding -#define XmlParseXmlDeclNS XmlParseXmlDecl - -#endif - -#ifdef XML_UNICODE - -#ifdef XML_UNICODE_WCHAR_T -#define XML_T(x) (const wchar_t)x -#define XML_L(x) L ## x -#else -#define XML_T(x) (const unsigned short)x -#define XML_L(x) x -#endif - -#else - -#define XML_T(x) x -#define XML_L(x) x - -#endif - -/* Round up n to be a multiple of sz, where sz is a power of 2. */ -#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1)) - -/* Handle the case where memmove() doesn't exist. */ -#ifndef HAVE_MEMMOVE -#ifdef HAVE_BCOPY -#define memmove(d,s,l) bcopy((s),(d),(l)) -#else -#error memmove does not exist on this platform, nor is a substitute available -#endif /* HAVE_BCOPY */ -#endif /* HAVE_MEMMOVE */ - -#include "internal.h" -#include "xmltok.h" -#include "xmlrole.h" - -typedef const XML_Char *KEY; - -typedef struct { - KEY name; -} NAMED; - -typedef struct { - NAMED **v; - unsigned char power; - size_t size; - size_t used; - const XML_Memory_Handling_Suite *mem; -} HASH_TABLE; - -/* Basic character hash algorithm, taken from Python's string hash: - h = h * 1000003 ^ character, the constant being a prime number. - -*/ -#ifdef XML_UNICODE -#define CHAR_HASH(h, c) \ - (((h) * 0xF4243) ^ (unsigned short)(c)) -#else -#define CHAR_HASH(h, c) \ - (((h) * 0xF4243) ^ (unsigned char)(c)) -#endif - -/* For probing (after a collision) we need a step size relative prime - to the hash table size, which is a power of 2. We use double-hashing, - since we can calculate a second hash value cheaply by taking those bits - of the first hash value that were discarded (masked out) when the table - index was calculated: index = hash & mask, where mask = table->size - 1. - We limit the maximum step size to table->size / 4 (mask >> 2) and make - it odd, since odd numbers are always relative prime to a power of 2. -*/ -#define SECOND_HASH(hash, mask, power) \ - ((((hash) & ~(mask)) >> ((power) - 1)) & ((mask) >> 2)) -#define PROBE_STEP(hash, mask, power) \ - ((unsigned char)((SECOND_HASH(hash, mask, power)) | 1)) - -typedef struct { - NAMED **p; - NAMED **end; -} HASH_TABLE_ITER; - -#define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ -#define INIT_DATA_BUF_SIZE 1024 -#define INIT_ATTS_SIZE 16 -#define INIT_ATTS_VERSION 0xFFFFFFFF -#define INIT_BLOCK_SIZE 1024 -#define INIT_BUFFER_SIZE 1024 - -#define EXPAND_SPARE 24 - -typedef struct binding { - struct prefix *prefix; - struct binding *nextTagBinding; - struct binding *prevPrefixBinding; - const struct attribute_id *attId; - XML_Char *uri; - int uriLen; - int uriAlloc; -} BINDING; - -typedef struct prefix { - const XML_Char *name; - BINDING *binding; -} PREFIX; - -typedef struct { - const XML_Char *str; - const XML_Char *localPart; - const XML_Char *prefix; - int strLen; - int uriLen; - int prefixLen; -} TAG_NAME; - -/* TAG represents an open element. - The name of the element is stored in both the document and API - encodings. The memory buffer 'buf' is a separately-allocated - memory area which stores the name. During the XML_Parse()/ - XMLParseBuffer() when the element is open, the memory for the 'raw' - version of the name (in the document encoding) is shared with the - document buffer. If the element is open across calls to - XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to - contain the 'raw' name as well. - - A parser re-uses these structures, maintaining a list of allocated - TAG objects in a free list. -*/ -typedef struct tag { - struct tag *parent; /* parent of this element */ - const char *rawName; /* tagName in the original encoding */ - int rawNameLength; - TAG_NAME name; /* tagName in the API encoding */ - char *buf; /* buffer for name components */ - char *bufEnd; /* end of the buffer */ - BINDING *bindings; -} TAG; - -typedef struct { - const XML_Char *name; - const XML_Char *textPtr; - int textLen; /* length in XML_Chars */ - int processed; /* # of processed bytes - when suspended */ - const XML_Char *systemId; - const XML_Char *base; - const XML_Char *publicId; - const XML_Char *notation; - XML_Bool open; - XML_Bool is_param; - XML_Bool is_internal; /* true if declared in internal subset outside PE */ -} ENTITY; - -typedef struct { - enum XML_Content_Type type; - enum XML_Content_Quant quant; - const XML_Char * name; - int firstchild; - int lastchild; - int childcnt; - int nextsib; -} CONTENT_SCAFFOLD; - -#define INIT_SCAFFOLD_ELEMENTS 32 - -typedef struct block { - struct block *next; - int size; - XML_Char s[1]; -} BLOCK; - -typedef struct { - BLOCK *blocks; - BLOCK *freeBlocks; - const XML_Char *end; - XML_Char *ptr; - XML_Char *start; - const XML_Memory_Handling_Suite *mem; -} STRING_POOL; - -/* The XML_Char before the name is used to determine whether - an attribute has been specified. */ -typedef struct attribute_id { - XML_Char *name; - PREFIX *prefix; - XML_Bool maybeTokenized; - XML_Bool xmlns; -} ATTRIBUTE_ID; - -typedef struct { - const ATTRIBUTE_ID *id; - XML_Bool isCdata; - const XML_Char *value; -} DEFAULT_ATTRIBUTE; - -typedef struct { - unsigned long version; - unsigned long hash; - const XML_Char *uriName; -} NS_ATT; - -typedef struct { - const XML_Char *name; - PREFIX *prefix; - const ATTRIBUTE_ID *idAtt; - int nDefaultAtts; - int allocDefaultAtts; - DEFAULT_ATTRIBUTE *defaultAtts; -} ELEMENT_TYPE; - -typedef struct { - HASH_TABLE generalEntities; - HASH_TABLE elementTypes; - HASH_TABLE attributeIds; - HASH_TABLE prefixes; - STRING_POOL pool; - STRING_POOL entityValuePool; - /* false once a parameter entity reference has been skipped */ - XML_Bool keepProcessing; - /* true once an internal or external PE reference has been encountered; - this includes the reference to an external subset */ - XML_Bool hasParamEntityRefs; - XML_Bool standalone; -#ifdef XML_DTD - /* indicates if external PE has been read */ - XML_Bool paramEntityRead; - HASH_TABLE paramEntities; -#endif /* XML_DTD */ - PREFIX defaultPrefix; - /* === scaffolding for building content model === */ - XML_Bool in_eldecl; - CONTENT_SCAFFOLD *scaffold; - unsigned contentStringLen; - unsigned scaffSize; - unsigned scaffCount; - int scaffLevel; - int *scaffIndex; -} DTD; - -typedef struct open_internal_entity { - const char *internalEventPtr; - const char *internalEventEndPtr; - struct open_internal_entity *next; - ENTITY *entity; - int startTagLevel; - XML_Bool betweenDecl; /* WFC: PE Between Declarations */ -} OPEN_INTERNAL_ENTITY; - -typedef enum XML_Error PTRCALL Processor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr); - -static Processor prologProcessor; -static Processor prologInitProcessor; -static Processor contentProcessor; -static Processor cdataSectionProcessor; -#ifdef XML_DTD -static Processor ignoreSectionProcessor; -static Processor externalParEntProcessor; -static Processor externalParEntInitProcessor; -static Processor entityValueProcessor; -static Processor entityValueInitProcessor; -#endif /* XML_DTD */ -static Processor epilogProcessor; -static Processor errorProcessor; -static Processor externalEntityInitProcessor; -static Processor externalEntityInitProcessor2; -static Processor externalEntityInitProcessor3; -static Processor externalEntityContentProcessor; -static Processor internalEntityProcessor; - -static enum XML_Error -handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName); -static enum XML_Error -processXmlDecl(XML_Parser parser, int isGeneralTextEntity, - const char *s, const char *next); -static enum XML_Error -initializeEncoding(XML_Parser parser); -static enum XML_Error -doProlog(XML_Parser parser, const ENCODING *enc, const char *s, - const char *end, int tok, const char *next, const char **nextPtr, - XML_Bool haveMore); -static enum XML_Error -processInternalEntity(XML_Parser parser, ENTITY *entity, - XML_Bool betweenDecl); -static enum XML_Error -doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, - const char *start, const char *end, const char **endPtr, - XML_Bool haveMore); -static enum XML_Error -doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, - const char *end, const char **nextPtr, XML_Bool haveMore); -#ifdef XML_DTD -static enum XML_Error -doIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr, - const char *end, const char **nextPtr, XML_Bool haveMore); -#endif /* XML_DTD */ - -static enum XML_Error -storeAtts(XML_Parser parser, const ENCODING *, const char *s, - TAG_NAME *tagNamePtr, BINDING **bindingsPtr); -static enum XML_Error -addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, - const XML_Char *uri, BINDING **bindingsPtr); -static int -defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata, - XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser); -static enum XML_Error -storeAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, - const char *, const char *, STRING_POOL *); -static enum XML_Error -appendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, - const char *, const char *, STRING_POOL *); -static ATTRIBUTE_ID * -getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); -static int -setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *); -static enum XML_Error -storeEntityValue(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); -static int -reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end); -static int -reportComment(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); -static void -reportDefault(XML_Parser parser, const ENCODING *enc, const char *start, - const char *end); - -static const XML_Char * getContext(XML_Parser parser); -static XML_Bool -setContext(XML_Parser parser, const XML_Char *context); - -static void FASTCALL normalizePublicId(XML_Char *s); - -static DTD * dtdCreate(const XML_Memory_Handling_Suite *ms); -/* do not call if parentParser != NULL */ -static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms); -static void -dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms); -static int -dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms); -static int -copyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *); - -static NAMED * -lookup(HASH_TABLE *table, KEY name, size_t createSize); -static void FASTCALL -hashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms); -static void FASTCALL hashTableClear(HASH_TABLE *); -static void FASTCALL hashTableDestroy(HASH_TABLE *); -static void FASTCALL -hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); -static NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *); - -static void FASTCALL -poolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms); -static void FASTCALL poolClear(STRING_POOL *); -static void FASTCALL poolDestroy(STRING_POOL *); -static XML_Char * -poolAppend(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end); -static XML_Char * -poolStoreString(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end); -static XML_Bool FASTCALL poolGrow(STRING_POOL *pool); -static const XML_Char * FASTCALL -poolCopyString(STRING_POOL *pool, const XML_Char *s); -static const XML_Char * -poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n); -static const XML_Char * FASTCALL -poolAppendString(STRING_POOL *pool, const XML_Char *s); - -static int FASTCALL nextScaffoldPart(XML_Parser parser); -static XML_Content * build_model(XML_Parser parser); -static ELEMENT_TYPE * -getElementType(XML_Parser parser, const ENCODING *enc, - const char *ptr, const char *end); - -static XML_Parser -parserCreate(const XML_Char *encodingName, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *nameSep, - DTD *dtd); -static void -parserInit(XML_Parser parser, const XML_Char *encodingName); - -#define poolStart(pool) ((pool)->start) -#define poolEnd(pool) ((pool)->ptr) -#define poolLength(pool) ((pool)->ptr - (pool)->start) -#define poolChop(pool) ((void)--(pool->ptr)) -#define poolLastChar(pool) (((pool)->ptr)[-1]) -#define poolDiscard(pool) ((pool)->ptr = (pool)->start) -#define poolFinish(pool) ((pool)->start = (pool)->ptr) -#define poolAppendChar(pool, c) \ - (((pool)->ptr == (pool)->end && !poolGrow(pool)) \ - ? 0 \ - : ((*((pool)->ptr)++ = c), 1)) - -struct XML_ParserStruct { - /* The first member must be userData so that the XML_GetUserData - macro works. */ - void *m_userData; - void *m_handlerArg; - char *m_buffer; - const XML_Memory_Handling_Suite m_mem; - /* first character to be parsed */ - const char *m_bufferPtr; - /* past last character to be parsed */ - char *m_bufferEnd; - /* allocated end of buffer */ - const char *m_bufferLim; - XML_Index m_parseEndByteIndex; - const char *m_parseEndPtr; - XML_Char *m_dataBuf; - XML_Char *m_dataBufEnd; - XML_StartElementHandler m_startElementHandler; - XML_EndElementHandler m_endElementHandler; - XML_CharacterDataHandler m_characterDataHandler; - XML_ProcessingInstructionHandler m_processingInstructionHandler; - XML_CommentHandler m_commentHandler; - XML_StartCdataSectionHandler m_startCdataSectionHandler; - XML_EndCdataSectionHandler m_endCdataSectionHandler; - XML_DefaultHandler m_defaultHandler; - XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler; - XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler; - XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler; - XML_NotationDeclHandler m_notationDeclHandler; - XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler; - XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler; - XML_NotStandaloneHandler m_notStandaloneHandler; - XML_ExternalEntityRefHandler m_externalEntityRefHandler; - XML_Parser m_externalEntityRefHandlerArg; - XML_SkippedEntityHandler m_skippedEntityHandler; - XML_UnknownEncodingHandler m_unknownEncodingHandler; - XML_ElementDeclHandler m_elementDeclHandler; - XML_AttlistDeclHandler m_attlistDeclHandler; - XML_EntityDeclHandler m_entityDeclHandler; - XML_XmlDeclHandler m_xmlDeclHandler; - const ENCODING *m_encoding; - INIT_ENCODING m_initEncoding; - const ENCODING *m_internalEncoding; - const XML_Char *m_protocolEncodingName; - XML_Bool m_ns; - XML_Bool m_ns_triplets; - void *m_unknownEncodingMem; - void *m_unknownEncodingData; - void *m_unknownEncodingHandlerData; - void (XMLCALL *m_unknownEncodingRelease)(void *); - PROLOG_STATE m_prologState; - Processor *m_processor; - enum XML_Error m_errorCode; - const char *m_eventPtr; - const char *m_eventEndPtr; - const char *m_positionPtr; - OPEN_INTERNAL_ENTITY *m_openInternalEntities; - OPEN_INTERNAL_ENTITY *m_freeInternalEntities; - XML_Bool m_defaultExpandInternalEntities; - int m_tagLevel; - ENTITY *m_declEntity; - const XML_Char *m_doctypeName; - const XML_Char *m_doctypeSysid; - const XML_Char *m_doctypePubid; - const XML_Char *m_declAttributeType; - const XML_Char *m_declNotationName; - const XML_Char *m_declNotationPublicId; - ELEMENT_TYPE *m_declElementType; - ATTRIBUTE_ID *m_declAttributeId; - XML_Bool m_declAttributeIsCdata; - XML_Bool m_declAttributeIsId; - DTD *m_dtd; - const XML_Char *m_curBase; - TAG *m_tagStack; - TAG *m_freeTagList; - BINDING *m_inheritedBindings; - BINDING *m_freeBindingList; - int m_attsSize; - int m_nSpecifiedAtts; - int m_idAttIndex; - ATTRIBUTE *m_atts; - NS_ATT *m_nsAtts; - unsigned long m_nsAttsVersion; - unsigned char m_nsAttsPower; - POSITION m_position; - STRING_POOL m_tempPool; - STRING_POOL m_temp2Pool; - char *m_groupConnector; - unsigned int m_groupSize; - XML_Char m_namespaceSeparator; - XML_Parser m_parentParser; - XML_ParsingStatus m_parsingStatus; -#ifdef XML_DTD - XML_Bool m_isParamEntity; - XML_Bool m_useForeignDTD; - enum XML_ParamEntityParsing m_paramEntityParsing; -#endif -}; - -#define MALLOC(s) (parser->m_mem.malloc_fcn((s))) -#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s))) -#define FREE(p) (parser->m_mem.free_fcn((p))) - -#define userData (parser->m_userData) -#define handlerArg (parser->m_handlerArg) -#define startElementHandler (parser->m_startElementHandler) -#define endElementHandler (parser->m_endElementHandler) -#define characterDataHandler (parser->m_characterDataHandler) -#define processingInstructionHandler \ - (parser->m_processingInstructionHandler) -#define commentHandler (parser->m_commentHandler) -#define startCdataSectionHandler \ - (parser->m_startCdataSectionHandler) -#define endCdataSectionHandler (parser->m_endCdataSectionHandler) -#define defaultHandler (parser->m_defaultHandler) -#define startDoctypeDeclHandler (parser->m_startDoctypeDeclHandler) -#define endDoctypeDeclHandler (parser->m_endDoctypeDeclHandler) -#define unparsedEntityDeclHandler \ - (parser->m_unparsedEntityDeclHandler) -#define notationDeclHandler (parser->m_notationDeclHandler) -#define startNamespaceDeclHandler \ - (parser->m_startNamespaceDeclHandler) -#define endNamespaceDeclHandler (parser->m_endNamespaceDeclHandler) -#define notStandaloneHandler (parser->m_notStandaloneHandler) -#define externalEntityRefHandler \ - (parser->m_externalEntityRefHandler) -#define externalEntityRefHandlerArg \ - (parser->m_externalEntityRefHandlerArg) -#define internalEntityRefHandler \ - (parser->m_internalEntityRefHandler) -#define skippedEntityHandler (parser->m_skippedEntityHandler) -#define unknownEncodingHandler (parser->m_unknownEncodingHandler) -#define elementDeclHandler (parser->m_elementDeclHandler) -#define attlistDeclHandler (parser->m_attlistDeclHandler) -#define entityDeclHandler (parser->m_entityDeclHandler) -#define xmlDeclHandler (parser->m_xmlDeclHandler) -#define encoding (parser->m_encoding) -#define initEncoding (parser->m_initEncoding) -#define internalEncoding (parser->m_internalEncoding) -#define unknownEncodingMem (parser->m_unknownEncodingMem) -#define unknownEncodingData (parser->m_unknownEncodingData) -#define unknownEncodingHandlerData \ - (parser->m_unknownEncodingHandlerData) -#define unknownEncodingRelease (parser->m_unknownEncodingRelease) -#define protocolEncodingName (parser->m_protocolEncodingName) -#define ns (parser->m_ns) -#define ns_triplets (parser->m_ns_triplets) -#define prologState (parser->m_prologState) -#define processor (parser->m_processor) -#define errorCode (parser->m_errorCode) -#define eventPtr (parser->m_eventPtr) -#define eventEndPtr (parser->m_eventEndPtr) -#define positionPtr (parser->m_positionPtr) -#define position (parser->m_position) -#define openInternalEntities (parser->m_openInternalEntities) -#define freeInternalEntities (parser->m_freeInternalEntities) -#define defaultExpandInternalEntities \ - (parser->m_defaultExpandInternalEntities) -#define tagLevel (parser->m_tagLevel) -#define buffer (parser->m_buffer) -#define bufferPtr (parser->m_bufferPtr) -#define bufferEnd (parser->m_bufferEnd) -#define parseEndByteIndex (parser->m_parseEndByteIndex) -#define parseEndPtr (parser->m_parseEndPtr) -#define bufferLim (parser->m_bufferLim) -#define dataBuf (parser->m_dataBuf) -#define dataBufEnd (parser->m_dataBufEnd) -#define _dtd (parser->m_dtd) -#define curBase (parser->m_curBase) -#define declEntity (parser->m_declEntity) -#define doctypeName (parser->m_doctypeName) -#define doctypeSysid (parser->m_doctypeSysid) -#define doctypePubid (parser->m_doctypePubid) -#define declAttributeType (parser->m_declAttributeType) -#define declNotationName (parser->m_declNotationName) -#define declNotationPublicId (parser->m_declNotationPublicId) -#define declElementType (parser->m_declElementType) -#define declAttributeId (parser->m_declAttributeId) -#define declAttributeIsCdata (parser->m_declAttributeIsCdata) -#define declAttributeIsId (parser->m_declAttributeIsId) -#define freeTagList (parser->m_freeTagList) -#define freeBindingList (parser->m_freeBindingList) -#define inheritedBindings (parser->m_inheritedBindings) -#define tagStack (parser->m_tagStack) -#define atts (parser->m_atts) -#define attsSize (parser->m_attsSize) -#define nSpecifiedAtts (parser->m_nSpecifiedAtts) -#define idAttIndex (parser->m_idAttIndex) -#define nsAtts (parser->m_nsAtts) -#define nsAttsVersion (parser->m_nsAttsVersion) -#define nsAttsPower (parser->m_nsAttsPower) -#define tempPool (parser->m_tempPool) -#define temp2Pool (parser->m_temp2Pool) -#define groupConnector (parser->m_groupConnector) -#define groupSize (parser->m_groupSize) -#define namespaceSeparator (parser->m_namespaceSeparator) -#define parentParser (parser->m_parentParser) -#define ps_parsing (parser->m_parsingStatus.parsing) -#define ps_finalBuffer (parser->m_parsingStatus.finalBuffer) -#ifdef XML_DTD -#define isParamEntity (parser->m_isParamEntity) -#define useForeignDTD (parser->m_useForeignDTD) -#define paramEntityParsing (parser->m_paramEntityParsing) -#endif /* XML_DTD */ - -XML_Parser XMLCALL -XML_ParserCreate(const XML_Char *encodingName) -{ - return XML_ParserCreate_MM(encodingName, NULL, NULL); -} - -XML_Parser XMLCALL -XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) -{ - XML_Char tmp[2]; - *tmp = nsSep; - return XML_ParserCreate_MM(encodingName, NULL, tmp); -} - -static const XML_Char implicitContext[] = { - ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, ASCII_t, ASCII_t, ASCII_p, - ASCII_COLON, ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w, - ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g, - ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9, - ASCII_9, ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e, - ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, '\0' -}; - -XML_Parser XMLCALL -XML_ParserCreate_MM(const XML_Char *encodingName, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *nameSep) -{ - XML_Parser parser = parserCreate(encodingName, memsuite, nameSep, NULL); - if (parser != NULL && ns) { - /* implicit context only set for root parser, since child - parsers (i.e. external entity parsers) will inherit it - */ - if (!setContext(parser, implicitContext)) { - XML_ParserFree(parser); - return NULL; - } - } - return parser; -} - -static XML_Parser -parserCreate(const XML_Char *encodingName, - const XML_Memory_Handling_Suite *memsuite, - const XML_Char *nameSep, - DTD *dtd) -{ - XML_Parser parser; - - if (memsuite) { - XML_Memory_Handling_Suite *mtemp; - parser = (XML_Parser) - memsuite->malloc_fcn(sizeof(struct XML_ParserStruct)); - if (parser != NULL) { - mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); - mtemp->malloc_fcn = memsuite->malloc_fcn; - mtemp->realloc_fcn = memsuite->realloc_fcn; - mtemp->free_fcn = memsuite->free_fcn; - } - } - else { - XML_Memory_Handling_Suite *mtemp; - parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct)); - if (parser != NULL) { - mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); - mtemp->malloc_fcn = malloc; - mtemp->realloc_fcn = realloc; - mtemp->free_fcn = free; - } - } - - if (!parser) - return parser; - - buffer = NULL; - bufferLim = NULL; - - attsSize = INIT_ATTS_SIZE; - atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE)); - if (atts == NULL) { - FREE(parser); - return NULL; - } - dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); - if (dataBuf == NULL) { - FREE(atts); - FREE(parser); - return NULL; - } - dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE; - - if (dtd) - _dtd = dtd; - else { - _dtd = dtdCreate(&parser->m_mem); - if (_dtd == NULL) { - FREE(dataBuf); - FREE(atts); - FREE(parser); - return NULL; - } - } - - freeBindingList = NULL; - freeTagList = NULL; - freeInternalEntities = NULL; - - groupSize = 0; - groupConnector = NULL; - - unknownEncodingHandler = NULL; - unknownEncodingHandlerData = NULL; - - namespaceSeparator = ASCII_EXCL; - ns = XML_FALSE; - ns_triplets = XML_FALSE; - - nsAtts = NULL; - nsAttsVersion = 0; - nsAttsPower = 0; - - poolInit(&tempPool, &(parser->m_mem)); - poolInit(&temp2Pool, &(parser->m_mem)); - parserInit(parser, encodingName); - - if (encodingName && !protocolEncodingName) { - XML_ParserFree(parser); - return NULL; - } - - if (nameSep) { - ns = XML_TRUE; - internalEncoding = XmlGetInternalEncodingNS(); - namespaceSeparator = *nameSep; - } - else { - internalEncoding = XmlGetInternalEncoding(); - } - - return parser; -} - -static void -parserInit(XML_Parser parser, const XML_Char *encodingName) -{ - processor = prologInitProcessor; - XmlPrologStateInit(&prologState); - protocolEncodingName = (encodingName != NULL - ? poolCopyString(&tempPool, encodingName) - : NULL); - curBase = NULL; - XmlInitEncoding(&initEncoding, &encoding, 0); - userData = NULL; - handlerArg = NULL; - startElementHandler = NULL; - endElementHandler = NULL; - characterDataHandler = NULL; - processingInstructionHandler = NULL; - commentHandler = NULL; - startCdataSectionHandler = NULL; - endCdataSectionHandler = NULL; - defaultHandler = NULL; - startDoctypeDeclHandler = NULL; - endDoctypeDeclHandler = NULL; - unparsedEntityDeclHandler = NULL; - notationDeclHandler = NULL; - startNamespaceDeclHandler = NULL; - endNamespaceDeclHandler = NULL; - notStandaloneHandler = NULL; - externalEntityRefHandler = NULL; - externalEntityRefHandlerArg = parser; - skippedEntityHandler = NULL; - elementDeclHandler = NULL; - attlistDeclHandler = NULL; - entityDeclHandler = NULL; - xmlDeclHandler = NULL; - bufferPtr = buffer; - bufferEnd = buffer; - parseEndByteIndex = 0; - parseEndPtr = NULL; - declElementType = NULL; - declAttributeId = NULL; - declEntity = NULL; - doctypeName = NULL; - doctypeSysid = NULL; - doctypePubid = NULL; - declAttributeType = NULL; - declNotationName = NULL; - declNotationPublicId = NULL; - declAttributeIsCdata = XML_FALSE; - declAttributeIsId = XML_FALSE; - memset(&position, 0, sizeof(POSITION)); - errorCode = XML_ERROR_NONE; - eventPtr = NULL; - eventEndPtr = NULL; - positionPtr = NULL; - openInternalEntities = NULL; - defaultExpandInternalEntities = XML_TRUE; - tagLevel = 0; - tagStack = NULL; - inheritedBindings = NULL; - nSpecifiedAtts = 0; - unknownEncodingMem = NULL; - unknownEncodingRelease = NULL; - unknownEncodingData = NULL; - parentParser = NULL; - ps_parsing = XML_INITIALIZED; -#ifdef XML_DTD - isParamEntity = XML_FALSE; - useForeignDTD = XML_FALSE; - paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; -#endif -} - -/* moves list of bindings to freeBindingList */ -static void FASTCALL -moveToFreeBindingList(XML_Parser parser, BINDING *bindings) -{ - while (bindings) { - BINDING *b = bindings; - bindings = bindings->nextTagBinding; - b->nextTagBinding = freeBindingList; - freeBindingList = b; - } -} - -XML_Bool XMLCALL -XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) -{ - TAG *tStk; - OPEN_INTERNAL_ENTITY *openEntityList; - if (parentParser) - return XML_FALSE; - /* move tagStack to freeTagList */ - tStk = tagStack; - while (tStk) { - TAG *tag = tStk; - tStk = tStk->parent; - tag->parent = freeTagList; - moveToFreeBindingList(parser, tag->bindings); - tag->bindings = NULL; - freeTagList = tag; - } - /* move openInternalEntities to freeInternalEntities */ - openEntityList = openInternalEntities; - while (openEntityList) { - OPEN_INTERNAL_ENTITY *openEntity = openEntityList; - openEntityList = openEntity->next; - openEntity->next = freeInternalEntities; - freeInternalEntities = openEntity; - } - moveToFreeBindingList(parser, inheritedBindings); - FREE(unknownEncodingMem); - if (unknownEncodingRelease) - unknownEncodingRelease(unknownEncodingData); - poolClear(&tempPool); - poolClear(&temp2Pool); - parserInit(parser, encodingName); - dtdReset(_dtd, &parser->m_mem); - return setContext(parser, implicitContext); -} - -enum XML_Status XMLCALL -XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) -{ - /* Block after XML_Parse()/XML_ParseBuffer() has been called. - XXX There's no way for the caller to determine which of the - XXX possible error cases caused the XML_STATUS_ERROR return. - */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return XML_STATUS_ERROR; - if (encodingName == NULL) - protocolEncodingName = NULL; - else { - protocolEncodingName = poolCopyString(&tempPool, encodingName); - if (!protocolEncodingName) - return XML_STATUS_ERROR; - } - return XML_STATUS_OK; -} - -XML_Parser XMLCALL -XML_ExternalEntityParserCreate(XML_Parser oldParser, - const XML_Char *context, - const XML_Char *encodingName) -{ - XML_Parser parser = oldParser; - DTD *newDtd = NULL; - DTD *oldDtd = _dtd; - XML_StartElementHandler oldStartElementHandler = startElementHandler; - XML_EndElementHandler oldEndElementHandler = endElementHandler; - XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler; - XML_ProcessingInstructionHandler oldProcessingInstructionHandler - = processingInstructionHandler; - XML_CommentHandler oldCommentHandler = commentHandler; - XML_StartCdataSectionHandler oldStartCdataSectionHandler - = startCdataSectionHandler; - XML_EndCdataSectionHandler oldEndCdataSectionHandler - = endCdataSectionHandler; - XML_DefaultHandler oldDefaultHandler = defaultHandler; - XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler - = unparsedEntityDeclHandler; - XML_NotationDeclHandler oldNotationDeclHandler = notationDeclHandler; - XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler - = startNamespaceDeclHandler; - XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler - = endNamespaceDeclHandler; - XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler; - XML_ExternalEntityRefHandler oldExternalEntityRefHandler - = externalEntityRefHandler; - XML_SkippedEntityHandler oldSkippedEntityHandler = skippedEntityHandler; - XML_UnknownEncodingHandler oldUnknownEncodingHandler - = unknownEncodingHandler; - XML_ElementDeclHandler oldElementDeclHandler = elementDeclHandler; - XML_AttlistDeclHandler oldAttlistDeclHandler = attlistDeclHandler; - XML_EntityDeclHandler oldEntityDeclHandler = entityDeclHandler; - XML_XmlDeclHandler oldXmlDeclHandler = xmlDeclHandler; - ELEMENT_TYPE * oldDeclElementType = declElementType; - - void *oldUserData = userData; - void *oldHandlerArg = handlerArg; - XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities; - XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg; -#ifdef XML_DTD - enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing; - int oldInEntityValue = prologState.inEntityValue; -#endif - XML_Bool oldns_triplets = ns_triplets; - -#ifdef XML_DTD - if (!context) - newDtd = oldDtd; -#endif /* XML_DTD */ - - /* Note that the magical uses of the pre-processor to make field - access look more like C++ require that `parser' be overwritten - here. This makes this function more painful to follow than it - would be otherwise. - */ - if (ns) { - XML_Char tmp[2]; - *tmp = namespaceSeparator; - parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd); - } - else { - parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd); - } - - if (!parser) - return NULL; - - startElementHandler = oldStartElementHandler; - endElementHandler = oldEndElementHandler; - characterDataHandler = oldCharacterDataHandler; - processingInstructionHandler = oldProcessingInstructionHandler; - commentHandler = oldCommentHandler; - startCdataSectionHandler = oldStartCdataSectionHandler; - endCdataSectionHandler = oldEndCdataSectionHandler; - defaultHandler = oldDefaultHandler; - unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler; - notationDeclHandler = oldNotationDeclHandler; - startNamespaceDeclHandler = oldStartNamespaceDeclHandler; - endNamespaceDeclHandler = oldEndNamespaceDeclHandler; - notStandaloneHandler = oldNotStandaloneHandler; - externalEntityRefHandler = oldExternalEntityRefHandler; - skippedEntityHandler = oldSkippedEntityHandler; - unknownEncodingHandler = oldUnknownEncodingHandler; - elementDeclHandler = oldElementDeclHandler; - attlistDeclHandler = oldAttlistDeclHandler; - entityDeclHandler = oldEntityDeclHandler; - xmlDeclHandler = oldXmlDeclHandler; - declElementType = oldDeclElementType; - userData = oldUserData; - if (oldUserData == oldHandlerArg) - handlerArg = userData; - else - handlerArg = parser; - if (oldExternalEntityRefHandlerArg != oldParser) - externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg; - defaultExpandInternalEntities = oldDefaultExpandInternalEntities; - ns_triplets = oldns_triplets; - parentParser = oldParser; -#ifdef XML_DTD - paramEntityParsing = oldParamEntityParsing; - prologState.inEntityValue = oldInEntityValue; - if (context) { -#endif /* XML_DTD */ - if (!dtdCopy(_dtd, oldDtd, &parser->m_mem) - || !setContext(parser, context)) { - XML_ParserFree(parser); - return NULL; - } - processor = externalEntityInitProcessor; -#ifdef XML_DTD - } - else { - /* The DTD instance referenced by _dtd is shared between the document's - root parser and external PE parsers, therefore one does not need to - call setContext. In addition, one also *must* not call setContext, - because this would overwrite existing prefix->binding pointers in - _dtd with ones that get destroyed with the external PE parser. - This would leave those prefixes with dangling pointers. - */ - isParamEntity = XML_TRUE; - XmlPrologStateInitExternalEntity(&prologState); - processor = externalParEntInitProcessor; - } -#endif /* XML_DTD */ - return parser; -} - -static void FASTCALL -destroyBindings(BINDING *bindings, XML_Parser parser) -{ - for (;;) { - BINDING *b = bindings; - if (!b) - break; - bindings = b->nextTagBinding; - FREE(b->uri); - FREE(b); - } -} - -void XMLCALL -XML_ParserFree(XML_Parser parser) -{ - TAG *tagList; - OPEN_INTERNAL_ENTITY *entityList; - if (parser == NULL) - return; - /* free tagStack and freeTagList */ - tagList = tagStack; - for (;;) { - TAG *p; - if (tagList == NULL) { - if (freeTagList == NULL) - break; - tagList = freeTagList; - freeTagList = NULL; - } - p = tagList; - tagList = tagList->parent; - FREE(p->buf); - destroyBindings(p->bindings, parser); - FREE(p); - } - /* free openInternalEntities and freeInternalEntities */ - entityList = openInternalEntities; - for (;;) { - OPEN_INTERNAL_ENTITY *openEntity; - if (entityList == NULL) { - if (freeInternalEntities == NULL) - break; - entityList = freeInternalEntities; - freeInternalEntities = NULL; - } - openEntity = entityList; - entityList = entityList->next; - FREE(openEntity); - } - - destroyBindings(freeBindingList, parser); - destroyBindings(inheritedBindings, parser); - poolDestroy(&tempPool); - poolDestroy(&temp2Pool); -#ifdef XML_DTD - /* external parameter entity parsers share the DTD structure - parser->m_dtd with the root parser, so we must not destroy it - */ - if (!isParamEntity && _dtd) -#else - if (_dtd) -#endif /* XML_DTD */ - dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem); - FREE((void *)atts); - FREE(groupConnector); - FREE(buffer); - FREE(dataBuf); - FREE(nsAtts); - FREE(unknownEncodingMem); - if (unknownEncodingRelease) - unknownEncodingRelease(unknownEncodingData); - FREE(parser); -} - -void XMLCALL -XML_UseParserAsHandlerArg(XML_Parser parser) -{ - handlerArg = parser; -} - -enum XML_Error XMLCALL -XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) -{ -#ifdef XML_DTD - /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING; - useForeignDTD = useDTD; - return XML_ERROR_NONE; -#else - return XML_ERROR_FEATURE_REQUIRES_XML_DTD; -#endif -} - -void XMLCALL -XML_SetReturnNSTriplet(XML_Parser parser, int do_nst) -{ - /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return; - ns_triplets = do_nst ? XML_TRUE : XML_FALSE; -} - -void XMLCALL -XML_SetUserData(XML_Parser parser, void *p) -{ - if (handlerArg == userData) - handlerArg = userData = p; - else - userData = p; -} - -enum XML_Status XMLCALL -XML_SetBase(XML_Parser parser, const XML_Char *p) -{ - if (p) { - p = poolCopyString(&_dtd->pool, p); - if (!p) - return XML_STATUS_ERROR; - curBase = p; - } - else - curBase = NULL; - return XML_STATUS_OK; -} - -const XML_Char * XMLCALL -XML_GetBase(XML_Parser parser) -{ - return curBase; -} - -int XMLCALL -XML_GetSpecifiedAttributeCount(XML_Parser parser) -{ - return nSpecifiedAtts; -} - -int XMLCALL -XML_GetIdAttributeIndex(XML_Parser parser) -{ - return idAttIndex; -} - -void XMLCALL -XML_SetElementHandler(XML_Parser parser, - XML_StartElementHandler start, - XML_EndElementHandler end) -{ - startElementHandler = start; - endElementHandler = end; -} - -void XMLCALL -XML_SetStartElementHandler(XML_Parser parser, - XML_StartElementHandler start) { - startElementHandler = start; -} - -void XMLCALL -XML_SetEndElementHandler(XML_Parser parser, - XML_EndElementHandler end) { - endElementHandler = end; -} - -void XMLCALL -XML_SetCharacterDataHandler(XML_Parser parser, - XML_CharacterDataHandler handler) -{ - characterDataHandler = handler; -} - -void XMLCALL -XML_SetProcessingInstructionHandler(XML_Parser parser, - XML_ProcessingInstructionHandler handler) -{ - processingInstructionHandler = handler; -} - -void XMLCALL -XML_SetCommentHandler(XML_Parser parser, - XML_CommentHandler handler) -{ - commentHandler = handler; -} - -void XMLCALL -XML_SetCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start, - XML_EndCdataSectionHandler end) -{ - startCdataSectionHandler = start; - endCdataSectionHandler = end; -} - -void XMLCALL -XML_SetStartCdataSectionHandler(XML_Parser parser, - XML_StartCdataSectionHandler start) { - startCdataSectionHandler = start; -} - -void XMLCALL -XML_SetEndCdataSectionHandler(XML_Parser parser, - XML_EndCdataSectionHandler end) { - endCdataSectionHandler = end; -} - -void XMLCALL -XML_SetDefaultHandler(XML_Parser parser, - XML_DefaultHandler handler) -{ - defaultHandler = handler; - defaultExpandInternalEntities = XML_FALSE; -} - -void XMLCALL -XML_SetDefaultHandlerExpand(XML_Parser parser, - XML_DefaultHandler handler) -{ - defaultHandler = handler; - defaultExpandInternalEntities = XML_TRUE; -} - -void XMLCALL -XML_SetDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start, - XML_EndDoctypeDeclHandler end) -{ - startDoctypeDeclHandler = start; - endDoctypeDeclHandler = end; -} - -void XMLCALL -XML_SetStartDoctypeDeclHandler(XML_Parser parser, - XML_StartDoctypeDeclHandler start) { - startDoctypeDeclHandler = start; -} - -void XMLCALL -XML_SetEndDoctypeDeclHandler(XML_Parser parser, - XML_EndDoctypeDeclHandler end) { - endDoctypeDeclHandler = end; -} - -void XMLCALL -XML_SetUnparsedEntityDeclHandler(XML_Parser parser, - XML_UnparsedEntityDeclHandler handler) -{ - unparsedEntityDeclHandler = handler; -} - -void XMLCALL -XML_SetNotationDeclHandler(XML_Parser parser, - XML_NotationDeclHandler handler) -{ - notationDeclHandler = handler; -} - -void XMLCALL -XML_SetNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start, - XML_EndNamespaceDeclHandler end) -{ - startNamespaceDeclHandler = start; - endNamespaceDeclHandler = end; -} - -void XMLCALL -XML_SetStartNamespaceDeclHandler(XML_Parser parser, - XML_StartNamespaceDeclHandler start) { - startNamespaceDeclHandler = start; -} - -void XMLCALL -XML_SetEndNamespaceDeclHandler(XML_Parser parser, - XML_EndNamespaceDeclHandler end) { - endNamespaceDeclHandler = end; -} - -void XMLCALL -XML_SetNotStandaloneHandler(XML_Parser parser, - XML_NotStandaloneHandler handler) -{ - notStandaloneHandler = handler; -} - -void XMLCALL -XML_SetExternalEntityRefHandler(XML_Parser parser, - XML_ExternalEntityRefHandler handler) -{ - externalEntityRefHandler = handler; -} - -void XMLCALL -XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg) -{ - if (arg) - externalEntityRefHandlerArg = (XML_Parser)arg; - else - externalEntityRefHandlerArg = parser; -} - -void XMLCALL -XML_SetSkippedEntityHandler(XML_Parser parser, - XML_SkippedEntityHandler handler) -{ - skippedEntityHandler = handler; -} - -void XMLCALL -XML_SetUnknownEncodingHandler(XML_Parser parser, - XML_UnknownEncodingHandler handler, - void *data) -{ - unknownEncodingHandler = handler; - unknownEncodingHandlerData = data; -} - -void XMLCALL -XML_SetElementDeclHandler(XML_Parser parser, - XML_ElementDeclHandler eldecl) -{ - elementDeclHandler = eldecl; -} - -void XMLCALL -XML_SetAttlistDeclHandler(XML_Parser parser, - XML_AttlistDeclHandler attdecl) -{ - attlistDeclHandler = attdecl; -} - -void XMLCALL -XML_SetEntityDeclHandler(XML_Parser parser, - XML_EntityDeclHandler handler) -{ - entityDeclHandler = handler; -} - -void XMLCALL -XML_SetXmlDeclHandler(XML_Parser parser, - XML_XmlDeclHandler handler) { - xmlDeclHandler = handler; -} - -int XMLCALL -XML_SetParamEntityParsing(XML_Parser parser, - enum XML_ParamEntityParsing peParsing) -{ - /* block after XML_Parse()/XML_ParseBuffer() has been called */ - if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED) - return 0; -#ifdef XML_DTD - paramEntityParsing = peParsing; - return 1; -#else - return peParsing == XML_PARAM_ENTITY_PARSING_NEVER; -#endif -} - -enum XML_Status XMLCALL -XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) -{ - switch (ps_parsing) { - case XML_SUSPENDED: - errorCode = XML_ERROR_SUSPENDED; - return XML_STATUS_ERROR; - case XML_FINISHED: - errorCode = XML_ERROR_FINISHED; - return XML_STATUS_ERROR; - default: - ps_parsing = XML_PARSING; - } - - if (len == 0) { - ps_finalBuffer = (XML_Bool)isFinal; - if (!isFinal) - return XML_STATUS_OK; - positionPtr = bufferPtr; - parseEndPtr = bufferEnd; - - /* If data are left over from last buffer, and we now know that these - data are the final chunk of input, then we have to check them again - to detect errors based on that fact. - */ - errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); - - if (errorCode == XML_ERROR_NONE) { - switch (ps_parsing) { - case XML_SUSPENDED: - XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); - positionPtr = bufferPtr; - return XML_STATUS_SUSPENDED; - case XML_INITIALIZED: - case XML_PARSING: - ps_parsing = XML_FINISHED; - /* fall through */ - default: - return XML_STATUS_OK; - } - } - eventEndPtr = eventPtr; - processor = errorProcessor; - return XML_STATUS_ERROR; - } -#ifndef XML_CONTEXT_BYTES - else if (bufferPtr == bufferEnd) { - const char *end; - int nLeftOver; - enum XML_Error result; - parseEndByteIndex += len; - positionPtr = s; - ps_finalBuffer = (XML_Bool)isFinal; - - errorCode = processor(parser, s, parseEndPtr = s + len, &end); - - if (errorCode != XML_ERROR_NONE) { - eventEndPtr = eventPtr; - processor = errorProcessor; - return XML_STATUS_ERROR; - } - else { - switch (ps_parsing) { - case XML_SUSPENDED: - result = XML_STATUS_SUSPENDED; - break; - case XML_INITIALIZED: - case XML_PARSING: - result = XML_STATUS_OK; - if (isFinal) { - ps_parsing = XML_FINISHED; - return result; - } - } - } - - XmlUpdatePosition(encoding, positionPtr, end, &position); - nLeftOver = s + len - end; - if (nLeftOver) { - if (buffer == NULL || nLeftOver > bufferLim - buffer) { - /* FIXME avoid integer overflow */ - char *temp; - temp = (buffer == NULL - ? (char *)MALLOC(len * 2) - : (char *)REALLOC(buffer, len * 2)); - if (temp == NULL) { - errorCode = XML_ERROR_NO_MEMORY; - return XML_STATUS_ERROR; - } - buffer = temp; - if (!buffer) { - errorCode = XML_ERROR_NO_MEMORY; - eventPtr = eventEndPtr = NULL; - processor = errorProcessor; - return XML_STATUS_ERROR; - } - bufferLim = buffer + len * 2; - } - memcpy(buffer, end, nLeftOver); - } - bufferPtr = buffer; - bufferEnd = buffer + nLeftOver; - positionPtr = bufferPtr; - parseEndPtr = bufferEnd; - eventPtr = bufferPtr; - eventEndPtr = bufferPtr; - return result; - } -#endif /* not defined XML_CONTEXT_BYTES */ - else { - void *buff = XML_GetBuffer(parser, len); - if (buff == NULL) - return XML_STATUS_ERROR; - else { - memcpy(buff, s, len); - return XML_ParseBuffer(parser, len, isFinal); - } - } -} - -enum XML_Status XMLCALL -XML_ParseBuffer(XML_Parser parser, int len, int isFinal) -{ - const char *start; - enum XML_Status result = XML_STATUS_OK; - - switch (ps_parsing) { - case XML_SUSPENDED: - errorCode = XML_ERROR_SUSPENDED; - return XML_STATUS_ERROR; - case XML_FINISHED: - errorCode = XML_ERROR_FINISHED; - return XML_STATUS_ERROR; - default: - ps_parsing = XML_PARSING; - } - - start = bufferPtr; - positionPtr = start; - bufferEnd += len; - parseEndPtr = bufferEnd; - parseEndByteIndex += len; - ps_finalBuffer = (XML_Bool)isFinal; - - errorCode = processor(parser, start, parseEndPtr, &bufferPtr); - - if (errorCode != XML_ERROR_NONE) { - eventEndPtr = eventPtr; - processor = errorProcessor; - return XML_STATUS_ERROR; - } - else { - switch (ps_parsing) { - case XML_SUSPENDED: - result = XML_STATUS_SUSPENDED; - break; - case XML_INITIALIZED: - case XML_PARSING: - if (isFinal) { - ps_parsing = XML_FINISHED; - return result; - } - default: ; /* should not happen */ - } - } - - XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); - positionPtr = bufferPtr; - return result; -} - -void * XMLCALL -XML_GetBuffer(XML_Parser parser, int len) -{ - switch (ps_parsing) { - case XML_SUSPENDED: - errorCode = XML_ERROR_SUSPENDED; - return NULL; - case XML_FINISHED: - errorCode = XML_ERROR_FINISHED; - return NULL; - default: ; - } - - if (len > bufferLim - bufferEnd) { - /* FIXME avoid integer overflow */ - int neededSize = len + (int)(bufferEnd - bufferPtr); -#ifdef XML_CONTEXT_BYTES - int keep = (int)(bufferPtr - buffer); - - if (keep > XML_CONTEXT_BYTES) - keep = XML_CONTEXT_BYTES; - neededSize += keep; -#endif /* defined XML_CONTEXT_BYTES */ - if (neededSize <= bufferLim - buffer) { -#ifdef XML_CONTEXT_BYTES - if (keep < bufferPtr - buffer) { - int offset = (int)(bufferPtr - buffer) - keep; - memmove(buffer, &buffer[offset], bufferEnd - bufferPtr + keep); - bufferEnd -= offset; - bufferPtr -= offset; - } -#else - memmove(buffer, bufferPtr, bufferEnd - bufferPtr); - bufferEnd = buffer + (bufferEnd - bufferPtr); - bufferPtr = buffer; -#endif /* not defined XML_CONTEXT_BYTES */ - } - else { - char *newBuf; - int bufferSize = (int)(bufferLim - bufferPtr); - if (bufferSize == 0) - bufferSize = INIT_BUFFER_SIZE; - do { - bufferSize *= 2; - } while (bufferSize < neededSize); - newBuf = (char *)MALLOC(bufferSize); - if (newBuf == 0) { - errorCode = XML_ERROR_NO_MEMORY; - return NULL; - } - bufferLim = newBuf + bufferSize; -#ifdef XML_CONTEXT_BYTES - if (bufferPtr) { - int keep = (int)(bufferPtr - buffer); - if (keep > XML_CONTEXT_BYTES) - keep = XML_CONTEXT_BYTES; - memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep); - FREE(buffer); - buffer = newBuf; - bufferEnd = buffer + (bufferEnd - bufferPtr) + keep; - bufferPtr = buffer + keep; - } - else { - bufferEnd = newBuf + (bufferEnd - bufferPtr); - bufferPtr = buffer = newBuf; - } -#else - if (bufferPtr) { - memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr); - FREE(buffer); - } - bufferEnd = newBuf + (bufferEnd - bufferPtr); - bufferPtr = buffer = newBuf; -#endif /* not defined XML_CONTEXT_BYTES */ - } - } - return bufferEnd; -} - -enum XML_Status XMLCALL -XML_StopParser(XML_Parser parser, XML_Bool resumable) -{ - switch (ps_parsing) { - case XML_SUSPENDED: - if (resumable) { - errorCode = XML_ERROR_SUSPENDED; - return XML_STATUS_ERROR; - } - ps_parsing = XML_FINISHED; - break; - case XML_FINISHED: - errorCode = XML_ERROR_FINISHED; - return XML_STATUS_ERROR; - default: - if (resumable) { -#ifdef XML_DTD - if (isParamEntity) { - errorCode = XML_ERROR_SUSPEND_PE; - return XML_STATUS_ERROR; - } -#endif - ps_parsing = XML_SUSPENDED; - } - else - ps_parsing = XML_FINISHED; - } - return XML_STATUS_OK; -} - -enum XML_Status XMLCALL -XML_ResumeParser(XML_Parser parser) -{ - enum XML_Status result = XML_STATUS_OK; - - if (ps_parsing != XML_SUSPENDED) { - errorCode = XML_ERROR_NOT_SUSPENDED; - return XML_STATUS_ERROR; - } - ps_parsing = XML_PARSING; - - errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr); - - if (errorCode != XML_ERROR_NONE) { - eventEndPtr = eventPtr; - processor = errorProcessor; - return XML_STATUS_ERROR; - } - else { - switch (ps_parsing) { - case XML_SUSPENDED: - result = XML_STATUS_SUSPENDED; - break; - case XML_INITIALIZED: - case XML_PARSING: - if (ps_finalBuffer) { - ps_parsing = XML_FINISHED; - return result; - } - default: ; - } - } - - XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); - positionPtr = bufferPtr; - return result; -} - -void XMLCALL -XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status) -{ - assert(status != NULL); - *status = parser->m_parsingStatus; -} - -enum XML_Error XMLCALL -XML_GetErrorCode(XML_Parser parser) -{ - return errorCode; -} - -XML_Index XMLCALL -XML_GetCurrentByteIndex(XML_Parser parser) -{ - if (eventPtr) - return parseEndByteIndex - (parseEndPtr - eventPtr); - return -1; -} - -int XMLCALL -XML_GetCurrentByteCount(XML_Parser parser) -{ - if (eventEndPtr && eventPtr) - return (int)(eventEndPtr - eventPtr); - return 0; -} - -const char * XMLCALL -XML_GetInputContext(XML_Parser parser, int *offset, int *size) -{ -#ifdef XML_CONTEXT_BYTES - if (eventPtr && buffer) { - *offset = (int)(eventPtr - buffer); - *size = (int)(bufferEnd - buffer); - return buffer; - } -#endif /* defined XML_CONTEXT_BYTES */ - return (char *) 0; -} - -XML_Size XMLCALL -XML_GetCurrentLineNumber(XML_Parser parser) -{ - if (eventPtr && eventPtr >= positionPtr) { - XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); - positionPtr = eventPtr; - } - return position.lineNumber + 1; -} - -XML_Size XMLCALL -XML_GetCurrentColumnNumber(XML_Parser parser) -{ - if (eventPtr && eventPtr >= positionPtr) { - XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); - positionPtr = eventPtr; - } - return position.columnNumber; -} - -void XMLCALL -XML_FreeContentModel(XML_Parser parser, XML_Content *model) -{ - FREE(model); -} - -void * XMLCALL -XML_MemMalloc(XML_Parser parser, size_t size) -{ - return MALLOC(size); -} - -void * XMLCALL -XML_MemRealloc(XML_Parser parser, void *ptr, size_t size) -{ - return REALLOC(ptr, size); -} - -void XMLCALL -XML_MemFree(XML_Parser parser, void *ptr) -{ - FREE(ptr); -} - -void XMLCALL -XML_DefaultCurrent(XML_Parser parser) -{ - if (defaultHandler) { - if (openInternalEntities) - reportDefault(parser, - internalEncoding, - openInternalEntities->internalEventPtr, - openInternalEntities->internalEventEndPtr); - else - reportDefault(parser, encoding, eventPtr, eventEndPtr); - } -} - -const XML_LChar * XMLCALL -XML_ErrorString(enum XML_Error code) -{ - static const XML_LChar* const message[] = { - 0, - XML_L("out of memory"), - XML_L("syntax error"), - XML_L("no element found"), - XML_L("not well-formed (invalid token)"), - XML_L("unclosed token"), - XML_L("partial character"), - XML_L("mismatched tag"), - XML_L("duplicate attribute"), - XML_L("junk after document element"), - XML_L("illegal parameter entity reference"), - XML_L("undefined entity"), - XML_L("recursive entity reference"), - XML_L("asynchronous entity"), - XML_L("reference to invalid character number"), - XML_L("reference to binary entity"), - XML_L("reference to external entity in attribute"), - XML_L("XML or text declaration not at start of entity"), - XML_L("unknown encoding"), - XML_L("encoding specified in XML declaration is incorrect"), - XML_L("unclosed CDATA section"), - XML_L("error in processing external entity reference"), - XML_L("document is not standalone"), - XML_L("unexpected parser state - please send a bug report"), - XML_L("entity declared in parameter entity"), - XML_L("requested feature requires XML_DTD support in Expat"), - XML_L("cannot change setting once parsing has begun"), - XML_L("unbound prefix"), - XML_L("must not undeclare prefix"), - XML_L("incomplete markup in parameter entity"), - XML_L("XML declaration not well-formed"), - XML_L("text declaration not well-formed"), - XML_L("illegal character(s) in public id"), - XML_L("parser suspended"), - XML_L("parser not suspended"), - XML_L("parsing aborted"), - XML_L("parsing finished"), - XML_L("cannot suspend in external parameter entity"), - XML_L("reserved prefix (xml) must not be undeclared or bound to another namespace name"), - XML_L("reserved prefix (xmlns) must not be declared or undeclared"), - XML_L("prefix must not be bound to one of the reserved namespace names") - }; - if (code > 0 && code < sizeof(message)/sizeof(message[0])) - return message[code]; - return NULL; -} - -const XML_LChar * XMLCALL -XML_ExpatVersion(void) { - - /* V1 is used to string-ize the version number. However, it would - string-ize the actual version macro *names* unless we get them - substituted before being passed to V1. CPP is defined to expand - a macro, then rescan for more expansions. Thus, we use V2 to expand - the version macros, then CPP will expand the resulting V1() macro - with the correct numerals. */ - /* ### I'm assuming cpp is portable in this respect... */ - -#define V1(a,b,c) XML_L(#a)XML_L(".")XML_L(#b)XML_L(".")XML_L(#c) -#define V2(a,b,c) XML_L("expat_")V1(a,b,c) - - return V2(XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION); - -#undef V1 -#undef V2 -} - -XML_Expat_Version XMLCALL -XML_ExpatVersionInfo(void) -{ - XML_Expat_Version version; - - version.major = XML_MAJOR_VERSION; - version.minor = XML_MINOR_VERSION; - version.micro = XML_MICRO_VERSION; - - return version; -} - -const XML_Feature * XMLCALL -XML_GetFeatureList(void) -{ - static const XML_Feature features[] = { - {XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)"), - sizeof(XML_Char)}, - {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"), - sizeof(XML_LChar)}, -#ifdef XML_UNICODE - {XML_FEATURE_UNICODE, XML_L("XML_UNICODE"), 0}, -#endif -#ifdef XML_UNICODE_WCHAR_T - {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T"), 0}, -#endif -#ifdef XML_DTD - {XML_FEATURE_DTD, XML_L("XML_DTD"), 0}, -#endif -#ifdef XML_CONTEXT_BYTES - {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"), - XML_CONTEXT_BYTES}, -#endif -#ifdef XML_MIN_SIZE - {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0}, -#endif -#ifdef XML_NS - {XML_FEATURE_NS, XML_L("XML_NS"), 0}, -#endif -#ifdef XML_LARGE_SIZE - {XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0}, -#endif - {XML_FEATURE_END, NULL, 0} - }; - - return features; -} - -/* Initially tag->rawName always points into the parse buffer; - for those TAG instances opened while the current parse buffer was - processed, and not yet closed, we need to store tag->rawName in a more - permanent location, since the parse buffer is about to be discarded. -*/ -static XML_Bool -storeRawNames(XML_Parser parser) -{ - TAG *tag = tagStack; - while (tag) { - int bufSize; - int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1); - char *rawNameBuf = tag->buf + nameLen; - /* Stop if already stored. Since tagStack is a stack, we can stop - at the first entry that has already been copied; everything - below it in the stack is already been accounted for in a - previous call to this function. - */ - if (tag->rawName == rawNameBuf) - break; - /* For re-use purposes we need to ensure that the - size of tag->buf is a multiple of sizeof(XML_Char). - */ - bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)); - if (bufSize > tag->bufEnd - tag->buf) { - char *temp = (char *)REALLOC(tag->buf, bufSize); - if (temp == NULL) - return XML_FALSE; - /* if tag->name.str points to tag->buf (only when namespace - processing is off) then we have to update it - */ - if (tag->name.str == (XML_Char *)tag->buf) - tag->name.str = (XML_Char *)temp; - /* if tag->name.localPart is set (when namespace processing is on) - then update it as well, since it will always point into tag->buf - */ - if (tag->name.localPart) - tag->name.localPart = (XML_Char *)temp + (tag->name.localPart - - (XML_Char *)tag->buf); - tag->buf = temp; - tag->bufEnd = temp + bufSize; - rawNameBuf = temp + nameLen; - } - memcpy(rawNameBuf, tag->rawName, tag->rawNameLength); - tag->rawName = rawNameBuf; - tag = tag->parent; - } - return XML_TRUE; -} - -static enum XML_Error PTRCALL -contentProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doContent(parser, 0, encoding, start, end, - endPtr, (XML_Bool)!ps_finalBuffer); - if (result == XML_ERROR_NONE) { - if (!storeRawNames(parser)) - return XML_ERROR_NO_MEMORY; - } - return result; -} - -static enum XML_Error PTRCALL -externalEntityInitProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = initializeEncoding(parser); - if (result != XML_ERROR_NONE) - return result; - processor = externalEntityInitProcessor2; - return externalEntityInitProcessor2(parser, start, end, endPtr); -} - -static enum XML_Error PTRCALL -externalEntityInitProcessor2(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - const char *next = start; /* XmlContentTok doesn't always set the last arg */ - int tok = XmlContentTok(encoding, start, end, &next); - switch (tok) { - case XML_TOK_BOM: - /* If we are at the end of the buffer, this would cause the next stage, - i.e. externalEntityInitProcessor3, to pass control directly to - doContent (by detecting XML_TOK_NONE) without processing any xml text - declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent. - */ - if (next == end && !ps_finalBuffer) { - *endPtr = next; - return XML_ERROR_NONE; - } - start = next; - break; - case XML_TOK_PARTIAL: - if (!ps_finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - eventPtr = start; - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (!ps_finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - eventPtr = start; - return XML_ERROR_PARTIAL_CHAR; - } - processor = externalEntityInitProcessor3; - return externalEntityInitProcessor3(parser, start, end, endPtr); -} - -static enum XML_Error PTRCALL -externalEntityInitProcessor3(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - int tok; - const char *next = start; /* XmlContentTok doesn't always set the last arg */ - eventPtr = start; - tok = XmlContentTok(encoding, start, end, &next); - eventEndPtr = next; - - switch (tok) { - case XML_TOK_XML_DECL: - { - enum XML_Error result; - result = processXmlDecl(parser, 1, start, next); - if (result != XML_ERROR_NONE) - return result; - switch (ps_parsing) { - case XML_SUSPENDED: - *endPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: - start = next; - } - } - break; - case XML_TOK_PARTIAL: - if (!ps_finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (!ps_finalBuffer) { - *endPtr = start; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - } - processor = externalEntityContentProcessor; - tagLevel = 1; - return externalEntityContentProcessor(parser, start, end, endPtr); -} - -static enum XML_Error PTRCALL -externalEntityContentProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doContent(parser, 1, encoding, start, end, - endPtr, (XML_Bool)!ps_finalBuffer); - if (result == XML_ERROR_NONE) { - if (!storeRawNames(parser)) - return XML_ERROR_NO_MEMORY; - } - return result; -} - -static enum XML_Error -doContent(XML_Parser parser, - int startTagLevel, - const ENCODING *enc, - const char *s, - const char *end, - const char **nextPtr, - XML_Bool haveMore) -{ - /* save one level of indirection */ - DTD * const dtd = _dtd; - - const char **eventPP; - const char **eventEndPP; - if (enc == encoding) { - eventPP = &eventPtr; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - *eventPP = s; - - for (;;) { - const char *next = s; /* XmlContentTok doesn't always set the last arg */ - int tok = XmlContentTok(enc, s, end, &next); - *eventEndPP = next; - switch (tok) { - case XML_TOK_TRAILING_CR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - *eventEndPP = end; - if (characterDataHandler) { - XML_Char c = 0xA; - characterDataHandler(handlerArg, &c, 1); - } - else if (defaultHandler) - reportDefault(parser, enc, s, end); - /* We are at the end of the final buffer, should we check for - XML_SUSPENDED, XML_FINISHED? - */ - if (startTagLevel == 0) - return XML_ERROR_NO_ELEMENTS; - if (tagLevel != startTagLevel) - return XML_ERROR_ASYNC_ENTITY; - *nextPtr = end; - return XML_ERROR_NONE; - case XML_TOK_NONE: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - if (startTagLevel > 0) { - if (tagLevel != startTagLevel) - return XML_ERROR_ASYNC_ENTITY; - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_NO_ELEMENTS; - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_ENTITY_REF: - { - const XML_Char *name; - ENTITY *entity; - XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (ch) { - if (characterDataHandler) - characterDataHandler(handlerArg, &ch, 1); - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - name = poolStoreString(&dtd->pool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) - return XML_ERROR_NO_MEMORY; - entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0); - poolDiscard(&dtd->pool); - /* First, determine if a check for an existing declaration is needed; - if yes, check that the entity exists, and that it is internal, - otherwise call the skipped entity or default handler. - */ - if (!dtd->hasParamEntityRefs || dtd->standalone) { - if (!entity) - return XML_ERROR_UNDEFINED_ENTITY; - else if (!entity->is_internal) - return XML_ERROR_ENTITY_DECLARED_IN_PE; - } - else if (!entity) { - if (skippedEntityHandler) - skippedEntityHandler(handlerArg, name, 0); - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - if (entity->open) - return XML_ERROR_RECURSIVE_ENTITY_REF; - if (entity->notation) - return XML_ERROR_BINARY_ENTITY_REF; - if (entity->textPtr) { - enum XML_Error result; - if (!defaultExpandInternalEntities) { - if (skippedEntityHandler) - skippedEntityHandler(handlerArg, entity->name, 0); - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - result = processInternalEntity(parser, entity, XML_FALSE); - if (result != XML_ERROR_NONE) - return result; - } - else if (externalEntityRefHandler) { - const XML_Char *context; - entity->open = XML_TRUE; - context = getContext(parser); - entity->open = XML_FALSE; - if (!context) - return XML_ERROR_NO_MEMORY; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - context, - entity->base, - entity->systemId, - entity->publicId)) - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - poolDiscard(&tempPool); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - case XML_TOK_START_TAG_NO_ATTS: - /* fall through */ - case XML_TOK_START_TAG_WITH_ATTS: - { - TAG *tag; - enum XML_Error result; - XML_Char *toPtr; - if (freeTagList) { - tag = freeTagList; - freeTagList = freeTagList->parent; - } - else { - tag = (TAG *)MALLOC(sizeof(TAG)); - if (!tag) - return XML_ERROR_NO_MEMORY; - tag->buf = (char *)MALLOC(INIT_TAG_BUF_SIZE); - if (!tag->buf) { - FREE(tag); - return XML_ERROR_NO_MEMORY; - } - tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; - } - tag->bindings = NULL; - tag->parent = tagStack; - tagStack = tag; - tag->name.localPart = NULL; - tag->name.prefix = NULL; - tag->rawName = s + enc->minBytesPerChar; - tag->rawNameLength = XmlNameLength(enc, tag->rawName); - ++tagLevel; - { - const char *rawNameEnd = tag->rawName + tag->rawNameLength; - const char *fromPtr = tag->rawName; - toPtr = (XML_Char *)tag->buf; - for (;;) { - int bufSize; - int convLen; - XmlConvert(enc, - &fromPtr, rawNameEnd, - (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1); - convLen = (int)(toPtr - (XML_Char *)tag->buf); - if (fromPtr == rawNameEnd) { - tag->name.strLen = convLen; - break; - } - bufSize = (int)(tag->bufEnd - tag->buf) << 1; - { - char *temp = (char *)REALLOC(tag->buf, bufSize); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - tag->buf = temp; - tag->bufEnd = temp + bufSize; - toPtr = (XML_Char *)temp + convLen; - } - } - } - tag->name.str = (XML_Char *)tag->buf; - *toPtr = XML_T('\0'); - result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings)); - if (result) - return result; - if (startElementHandler) - startElementHandler(handlerArg, tag->name.str, - (const XML_Char **)atts); - else if (defaultHandler) - reportDefault(parser, enc, s, next); - poolClear(&tempPool); - break; - } - case XML_TOK_EMPTY_ELEMENT_NO_ATTS: - /* fall through */ - case XML_TOK_EMPTY_ELEMENT_WITH_ATTS: - { - const char *rawName = s + enc->minBytesPerChar; - enum XML_Error result; - BINDING *bindings = NULL; - XML_Bool noElmHandlers = XML_TRUE; - TAG_NAME name; - name.str = poolStoreString(&tempPool, enc, rawName, - rawName + XmlNameLength(enc, rawName)); - if (!name.str) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - result = storeAtts(parser, enc, s, &name, &bindings); - if (result) - return result; - poolFinish(&tempPool); - if (startElementHandler) { - startElementHandler(handlerArg, name.str, (const XML_Char **)atts); - noElmHandlers = XML_FALSE; - } - if (endElementHandler) { - if (startElementHandler) - *eventPP = *eventEndPP; - endElementHandler(handlerArg, name.str); - noElmHandlers = XML_FALSE; - } - if (noElmHandlers && defaultHandler) - reportDefault(parser, enc, s, next); - poolClear(&tempPool); - while (bindings) { - BINDING *b = bindings; - if (endNamespaceDeclHandler) - endNamespaceDeclHandler(handlerArg, b->prefix->name); - bindings = bindings->nextTagBinding; - b->nextTagBinding = freeBindingList; - freeBindingList = b; - b->prefix->binding = b->prevPrefixBinding; - } - } - if (tagLevel == 0) - return epilogProcessor(parser, next, end, nextPtr); - break; - case XML_TOK_END_TAG: - if (tagLevel == startTagLevel) - return XML_ERROR_ASYNC_ENTITY; - else { - int len; - const char *rawName; - TAG *tag = tagStack; - tagStack = tag->parent; - tag->parent = freeTagList; - freeTagList = tag; - rawName = s + enc->minBytesPerChar*2; - len = XmlNameLength(enc, rawName); - if (len != tag->rawNameLength - || memcmp(tag->rawName, rawName, len) != 0) { - *eventPP = rawName; - return XML_ERROR_TAG_MISMATCH; - } - --tagLevel; - if (endElementHandler) { - const XML_Char *localPart; - const XML_Char *prefix; - XML_Char *uri; - localPart = tag->name.localPart; - if (ns && localPart) { - /* localPart and prefix may have been overwritten in - tag->name.str, since this points to the binding->uri - buffer which gets re-used; so we have to add them again - */ - uri = (XML_Char *)tag->name.str + tag->name.uriLen; - /* don't need to check for space - already done in storeAtts() */ - while (*localPart) *uri++ = *localPart++; - prefix = (XML_Char *)tag->name.prefix; - if (ns_triplets && prefix) { - *uri++ = namespaceSeparator; - while (*prefix) *uri++ = *prefix++; - } - *uri = XML_T('\0'); - } - endElementHandler(handlerArg, tag->name.str); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - while (tag->bindings) { - BINDING *b = tag->bindings; - if (endNamespaceDeclHandler) - endNamespaceDeclHandler(handlerArg, b->prefix->name); - tag->bindings = tag->bindings->nextTagBinding; - b->nextTagBinding = freeBindingList; - freeBindingList = b; - b->prefix->binding = b->prevPrefixBinding; - } - if (tagLevel == 0) - return epilogProcessor(parser, next, end, nextPtr); - } - break; - case XML_TOK_CHAR_REF: - { - int n = XmlCharRefNumber(enc, s); - if (n < 0) - return XML_ERROR_BAD_CHAR_REF; - if (characterDataHandler) { - XML_Char buf[XML_ENCODE_MAX]; - characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf)); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - } - break; - case XML_TOK_XML_DECL: - return XML_ERROR_MISPLACED_XML_PI; - case XML_TOK_DATA_NEWLINE: - if (characterDataHandler) { - XML_Char c = 0xA; - characterDataHandler(handlerArg, &c, 1); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - case XML_TOK_CDATA_SECT_OPEN: - { - enum XML_Error result; - if (startCdataSectionHandler) - startCdataSectionHandler(handlerArg); -#if 0 - /* Suppose you doing a transformation on a document that involves - changing only the character data. You set up a defaultHandler - and a characterDataHandler. The defaultHandler simply copies - characters through. The characterDataHandler does the - transformation and writes the characters out escaping them as - necessary. This case will fail to work if we leave out the - following two lines (because & and < inside CDATA sections will - be incorrectly escaped). - - However, now we have a start/endCdataSectionHandler, so it seems - easier to let the user deal with this. - */ - else if (characterDataHandler) - characterDataHandler(handlerArg, dataBuf, 0); -#endif - else if (defaultHandler) - reportDefault(parser, enc, s, next); - result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore); - if (result != XML_ERROR_NONE) - return result; - else if (!next) { - processor = cdataSectionProcessor; - return result; - } - } - break; - case XML_TOK_TRAILING_RSQB: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - if (characterDataHandler) { - if (MUST_CONVERT(enc, s)) { - ICHAR *dataPtr = (ICHAR *)dataBuf; - XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); - characterDataHandler(handlerArg, dataBuf, - (int)(dataPtr - (ICHAR *)dataBuf)); - } - else - characterDataHandler(handlerArg, - (XML_Char *)s, - (int)((XML_Char *)end - (XML_Char *)s)); - } - else if (defaultHandler) - reportDefault(parser, enc, s, end); - /* We are at the end of the final buffer, should we check for - XML_SUSPENDED, XML_FINISHED? - */ - if (startTagLevel == 0) { - *eventPP = end; - return XML_ERROR_NO_ELEMENTS; - } - if (tagLevel != startTagLevel) { - *eventPP = end; - return XML_ERROR_ASYNC_ENTITY; - } - *nextPtr = end; - return XML_ERROR_NONE; - case XML_TOK_DATA_CHARS: - { - XML_CharacterDataHandler charDataHandler = characterDataHandler; - if (charDataHandler) { - if (MUST_CONVERT(enc, s)) { - for (;;) { - ICHAR *dataPtr = (ICHAR *)dataBuf; - XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); - *eventEndPP = s; - charDataHandler(handlerArg, dataBuf, - (int)(dataPtr - (ICHAR *)dataBuf)); - if (s == next) - break; - *eventPP = s; - } - } - else - charDataHandler(handlerArg, - (XML_Char *)s, - (int)((XML_Char *)next - (XML_Char *)s)); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - } - break; - case XML_TOK_PI: - if (!reportProcessingInstruction(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_COMMENT: - if (!reportComment(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - break; - default: - if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - } - *eventPP = s = next; - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: ; - } - } - /* not reached */ -} - -/* Precondition: all arguments must be non-NULL; - Purpose: - - normalize attributes - - check attributes for well-formedness - - generate namespace aware attribute names (URI, prefix) - - build list of attributes for startElementHandler - - default attributes - - process namespace declarations (check and report them) - - generate namespace aware element name (URI, prefix) -*/ -static enum XML_Error -storeAtts(XML_Parser parser, const ENCODING *enc, - const char *attStr, TAG_NAME *tagNamePtr, - BINDING **bindingsPtr) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - ELEMENT_TYPE *elementType; - int nDefaultAtts; - const XML_Char **appAtts; /* the attribute list for the application */ - int attIndex = 0; - int prefixLen; - int i; - int n; - XML_Char *uri; - int nPrefixes = 0; - BINDING *binding; - const XML_Char *localPart; - - /* lookup the element type name */ - elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, tagNamePtr->str,0); - if (!elementType) { - const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str); - if (!name) - return XML_ERROR_NO_MEMORY; - elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, name, - sizeof(ELEMENT_TYPE)); - if (!elementType) - return XML_ERROR_NO_MEMORY; - if (ns && !setElementTypePrefix(parser, elementType)) - return XML_ERROR_NO_MEMORY; - } - nDefaultAtts = elementType->nDefaultAtts; - - /* get the attributes from the tokenizer */ - n = XmlGetAttributes(enc, attStr, attsSize, atts); - if (n + nDefaultAtts > attsSize) { - int oldAttsSize = attsSize; - ATTRIBUTE *temp; - attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; - temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE)); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - atts = temp; - if (n > oldAttsSize) - XmlGetAttributes(enc, attStr, n, atts); - } - - appAtts = (const XML_Char **)atts; - for (i = 0; i < n; i++) { - /* add the name and value to the attribute list */ - ATTRIBUTE_ID *attId = getAttributeId(parser, enc, atts[i].name, - atts[i].name - + XmlNameLength(enc, atts[i].name)); - if (!attId) - return XML_ERROR_NO_MEMORY; - /* Detect duplicate attributes by their QNames. This does not work when - namespace processing is turned on and different prefixes for the same - namespace are used. For this case we have a check further down. - */ - if ((attId->name)[-1]) { - if (enc == encoding) - eventPtr = atts[i].name; - return XML_ERROR_DUPLICATE_ATTRIBUTE; - } - (attId->name)[-1] = 1; - appAtts[attIndex++] = attId->name; - if (!atts[i].normalized) { - enum XML_Error result; - XML_Bool isCdata = XML_TRUE; - - /* figure out whether declared as other than CDATA */ - if (attId->maybeTokenized) { - int j; - for (j = 0; j < nDefaultAtts; j++) { - if (attId == elementType->defaultAtts[j].id) { - isCdata = elementType->defaultAtts[j].isCdata; - break; - } - } - } - - /* normalize the attribute value */ - result = storeAttributeValue(parser, enc, isCdata, - atts[i].valuePtr, atts[i].valueEnd, - &tempPool); - if (result) - return result; - appAtts[attIndex] = poolStart(&tempPool); - poolFinish(&tempPool); - } - else { - /* the value did not need normalizing */ - appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr, - atts[i].valueEnd); - if (appAtts[attIndex] == 0) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - } - /* handle prefixed attribute names */ - if (attId->prefix) { - if (attId->xmlns) { - /* deal with namespace declarations here */ - enum XML_Error result = addBinding(parser, attId->prefix, attId, - appAtts[attIndex], bindingsPtr); - if (result) - return result; - --attIndex; - } - else { - /* deal with other prefixed names later */ - attIndex++; - nPrefixes++; - (attId->name)[-1] = 2; - } - } - else - attIndex++; - } - - /* set-up for XML_GetSpecifiedAttributeCount and XML_GetIdAttributeIndex */ - nSpecifiedAtts = attIndex; - if (elementType->idAtt && (elementType->idAtt->name)[-1]) { - for (i = 0; i < attIndex; i += 2) - if (appAtts[i] == elementType->idAtt->name) { - idAttIndex = i; - break; - } - } - else - idAttIndex = -1; - - /* do attribute defaulting */ - for (i = 0; i < nDefaultAtts; i++) { - const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + i; - if (!(da->id->name)[-1] && da->value) { - if (da->id->prefix) { - if (da->id->xmlns) { - enum XML_Error result = addBinding(parser, da->id->prefix, da->id, - da->value, bindingsPtr); - if (result) - return result; - } - else { - (da->id->name)[-1] = 2; - nPrefixes++; - appAtts[attIndex++] = da->id->name; - appAtts[attIndex++] = da->value; - } - } - else { - (da->id->name)[-1] = 1; - appAtts[attIndex++] = da->id->name; - appAtts[attIndex++] = da->value; - } - } - } - appAtts[attIndex] = 0; - - /* expand prefixed attribute names, check for duplicates, - and clear flags that say whether attributes were specified */ - i = 0; - if (nPrefixes) { - int j; /* hash table index */ - unsigned long version = nsAttsVersion; - int nsAttsSize = (int)1 << nsAttsPower; - /* size of hash table must be at least 2 * (# of prefixed attributes) */ - if ((nPrefixes << 1) >> nsAttsPower) { /* true for nsAttsPower = 0 */ - NS_ATT *temp; - /* hash table size must also be a power of 2 and >= 8 */ - while (nPrefixes >> nsAttsPower++); - if (nsAttsPower < 3) - nsAttsPower = 3; - nsAttsSize = (int)1 << nsAttsPower; - temp = (NS_ATT *)REALLOC(nsAtts, nsAttsSize * sizeof(NS_ATT)); - if (!temp) - return XML_ERROR_NO_MEMORY; - nsAtts = temp; - version = 0; /* force re-initialization of nsAtts hash table */ - } - /* using a version flag saves us from initializing nsAtts every time */ - if (!version) { /* initialize version flags when version wraps around */ - version = INIT_ATTS_VERSION; - for (j = nsAttsSize; j != 0; ) - nsAtts[--j].version = version; - } - nsAttsVersion = --version; - - /* expand prefixed names and check for duplicates */ - for (; i < attIndex; i += 2) { - const XML_Char *s = appAtts[i]; - if (s[-1] == 2) { /* prefixed */ - ATTRIBUTE_ID *id; - const BINDING *b; - unsigned long uriHash = 0; - ((XML_Char *)s)[-1] = 0; /* clear flag */ - id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, s, 0); - b = id->prefix->binding; - if (!b) - return XML_ERROR_UNBOUND_PREFIX; - - /* as we expand the name we also calculate its hash value */ - for (j = 0; j < b->uriLen; j++) { - const XML_Char c = b->uri[j]; - if (!poolAppendChar(&tempPool, c)) - return XML_ERROR_NO_MEMORY; - uriHash = CHAR_HASH(uriHash, c); - } - while (*s++ != XML_T(ASCII_COLON)) - ; - do { /* copies null terminator */ - const XML_Char c = *s; - if (!poolAppendChar(&tempPool, *s)) - return XML_ERROR_NO_MEMORY; - uriHash = CHAR_HASH(uriHash, c); - } while (*s++); - - { /* Check hash table for duplicate of expanded name (uriName). - Derived from code in lookup(HASH_TABLE *table, ...). - */ - unsigned char step = 0; - unsigned long mask = nsAttsSize - 1; - j = uriHash & mask; /* index into hash table */ - while (nsAtts[j].version == version) { - /* for speed we compare stored hash values first */ - if (uriHash == nsAtts[j].hash) { - const XML_Char *s1 = poolStart(&tempPool); - const XML_Char *s2 = nsAtts[j].uriName; - /* s1 is null terminated, but not s2 */ - for (; *s1 == *s2 && *s1 != 0; s1++, s2++); - if (*s1 == 0) - return XML_ERROR_DUPLICATE_ATTRIBUTE; - } - if (!step) - step = PROBE_STEP(uriHash, mask, nsAttsPower); - j < step ? (j += nsAttsSize - step) : (j -= step); - } - } - - if (ns_triplets) { /* append namespace separator and prefix */ - tempPool.ptr[-1] = namespaceSeparator; - s = b->prefix->name; - do { - if (!poolAppendChar(&tempPool, *s)) - return XML_ERROR_NO_MEMORY; - } while (*s++); - } - - /* store expanded name in attribute list */ - s = poolStart(&tempPool); - poolFinish(&tempPool); - appAtts[i] = s; - - /* fill empty slot with new version, uriName and hash value */ - nsAtts[j].version = version; - nsAtts[j].hash = uriHash; - nsAtts[j].uriName = s; - - if (!--nPrefixes) { - i += 2; - break; - } - } - else /* not prefixed */ - ((XML_Char *)s)[-1] = 0; /* clear flag */ - } - } - /* clear flags for the remaining attributes */ - for (; i < attIndex; i += 2) - ((XML_Char *)(appAtts[i]))[-1] = 0; - for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding) - binding->attId->name[-1] = 0; - - if (!ns) - return XML_ERROR_NONE; - - /* expand the element type name */ - if (elementType->prefix) { - binding = elementType->prefix->binding; - if (!binding) - return XML_ERROR_UNBOUND_PREFIX; - localPart = tagNamePtr->str; - while (*localPart++ != XML_T(ASCII_COLON)) - ; - } - else if (dtd->defaultPrefix.binding) { - binding = dtd->defaultPrefix.binding; - localPart = tagNamePtr->str; - } - else - return XML_ERROR_NONE; - prefixLen = 0; - if (ns_triplets && binding->prefix->name) { - for (; binding->prefix->name[prefixLen++];) - ; /* prefixLen includes null terminator */ - } - tagNamePtr->localPart = localPart; - tagNamePtr->uriLen = binding->uriLen; - tagNamePtr->prefix = binding->prefix->name; - tagNamePtr->prefixLen = prefixLen; - for (i = 0; localPart[i++];) - ; /* i includes null terminator */ - n = i + binding->uriLen + prefixLen; - if (n > binding->uriAlloc) { - TAG *p; - uri = (XML_Char *)MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char)); - if (!uri) - return XML_ERROR_NO_MEMORY; - binding->uriAlloc = n + EXPAND_SPARE; - memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char)); - for (p = tagStack; p; p = p->parent) - if (p->name.str == binding->uri) - p->name.str = uri; - FREE(binding->uri); - binding->uri = uri; - } - /* if namespaceSeparator != '\0' then uri includes it already */ - uri = binding->uri + binding->uriLen; - memcpy(uri, localPart, i * sizeof(XML_Char)); - /* we always have a namespace separator between localPart and prefix */ - if (prefixLen) { - uri += i - 1; - *uri = namespaceSeparator; /* replace null terminator */ - memcpy(uri + 1, binding->prefix->name, prefixLen * sizeof(XML_Char)); - } - tagNamePtr->str = binding->uri; - return XML_ERROR_NONE; -} - -/* addBinding() overwrites the value of prefix->binding without checking. - Therefore one must keep track of the old value outside of addBinding(). -*/ -static enum XML_Error -addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, - const XML_Char *uri, BINDING **bindingsPtr) -{ - static const XML_Char xmlNamespace[] = { - ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, - ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, - ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, - ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, ASCII_SLASH, - ASCII_n, ASCII_a, ASCII_m, ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c, - ASCII_e, '\0' - }; - static const int xmlLen = - (int)sizeof(xmlNamespace)/sizeof(XML_Char) - 1; - static const XML_Char xmlnsNamespace[] = { - ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH, - ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, - ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_2, ASCII_0, ASCII_0, - ASCII_0, ASCII_SLASH, ASCII_x, ASCII_m, ASCII_l, ASCII_n, ASCII_s, - ASCII_SLASH, '\0' - }; - static const int xmlnsLen = - (int)sizeof(xmlnsNamespace)/sizeof(XML_Char) - 1; - - XML_Bool mustBeXML = XML_FALSE; - XML_Bool isXML = XML_TRUE; - XML_Bool isXMLNS = XML_TRUE; - - BINDING *b; - int len; - - /* empty URI is only valid for default namespace per XML NS 1.0 (not 1.1) */ - if (*uri == XML_T('\0') && prefix->name) - return XML_ERROR_UNDECLARING_PREFIX; - - if (prefix->name - && prefix->name[0] == XML_T(ASCII_x) - && prefix->name[1] == XML_T(ASCII_m) - && prefix->name[2] == XML_T(ASCII_l)) { - - /* Not allowed to bind xmlns */ - if (prefix->name[3] == XML_T(ASCII_n) - && prefix->name[4] == XML_T(ASCII_s) - && prefix->name[5] == XML_T('\0')) - return XML_ERROR_RESERVED_PREFIX_XMLNS; - - if (prefix->name[3] == XML_T('\0')) - mustBeXML = XML_TRUE; - } - - for (len = 0; uri[len]; len++) { - if (isXML && (len > xmlLen || uri[len] != xmlNamespace[len])) - isXML = XML_FALSE; - - if (!mustBeXML && isXMLNS - && (len > xmlnsLen || uri[len] != xmlnsNamespace[len])) - isXMLNS = XML_FALSE; - } - isXML = isXML && len == xmlLen; - isXMLNS = isXMLNS && len == xmlnsLen; - - if (mustBeXML != isXML) - return mustBeXML ? XML_ERROR_RESERVED_PREFIX_XML - : XML_ERROR_RESERVED_NAMESPACE_URI; - - if (isXMLNS) - return XML_ERROR_RESERVED_NAMESPACE_URI; - - if (namespaceSeparator) - len++; - if (freeBindingList) { - b = freeBindingList; - if (len > b->uriAlloc) { - XML_Char *temp = (XML_Char *)REALLOC(b->uri, - sizeof(XML_Char) * (len + EXPAND_SPARE)); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - b->uri = temp; - b->uriAlloc = len + EXPAND_SPARE; - } - freeBindingList = b->nextTagBinding; - } - else { - b = (BINDING *)MALLOC(sizeof(BINDING)); - if (!b) - return XML_ERROR_NO_MEMORY; - b->uri = (XML_Char *)MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE)); - if (!b->uri) { - FREE(b); - return XML_ERROR_NO_MEMORY; - } - b->uriAlloc = len + EXPAND_SPARE; - } - b->uriLen = len; - memcpy(b->uri, uri, len * sizeof(XML_Char)); - if (namespaceSeparator) - b->uri[len - 1] = namespaceSeparator; - b->prefix = prefix; - b->attId = attId; - b->prevPrefixBinding = prefix->binding; - /* NULL binding when default namespace undeclared */ - if (*uri == XML_T('\0') && prefix == &_dtd->defaultPrefix) - prefix->binding = NULL; - else - prefix->binding = b; - b->nextTagBinding = *bindingsPtr; - *bindingsPtr = b; - /* if attId == NULL then we are not starting a namespace scope */ - if (attId && startNamespaceDeclHandler) - startNamespaceDeclHandler(handlerArg, prefix->name, - prefix->binding ? uri : 0); - return XML_ERROR_NONE; -} - -/* The idea here is to avoid using stack for each CDATA section when - the whole file is parsed with one call. -*/ -static enum XML_Error PTRCALL -cdataSectionProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doCdataSection(parser, encoding, &start, end, - endPtr, (XML_Bool)!ps_finalBuffer); - if (result != XML_ERROR_NONE) - return result; - if (start) { - if (parentParser) { /* we are parsing an external entity */ - processor = externalEntityContentProcessor; - return externalEntityContentProcessor(parser, start, end, endPtr); - } - else { - processor = contentProcessor; - return contentProcessor(parser, start, end, endPtr); - } - } - return result; -} - -/* startPtr gets set to non-null if the section is closed, and to null if - the section is not yet closed. -*/ -static enum XML_Error -doCdataSection(XML_Parser parser, - const ENCODING *enc, - const char **startPtr, - const char *end, - const char **nextPtr, - XML_Bool haveMore) -{ - const char *s = *startPtr; - const char **eventPP; - const char **eventEndPP; - if (enc == encoding) { - eventPP = &eventPtr; - *eventPP = s; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - *eventPP = s; - *startPtr = NULL; - - for (;;) { - const char *next; - int tok = XmlCdataSectionTok(enc, s, end, &next); - *eventEndPP = next; - switch (tok) { - case XML_TOK_CDATA_SECT_CLOSE: - if (endCdataSectionHandler) - endCdataSectionHandler(handlerArg); -#if 0 - /* see comment under XML_TOK_CDATA_SECT_OPEN */ - else if (characterDataHandler) - characterDataHandler(handlerArg, dataBuf, 0); -#endif - else if (defaultHandler) - reportDefault(parser, enc, s, next); - *startPtr = next; - *nextPtr = next; - if (ps_parsing == XML_FINISHED) - return XML_ERROR_ABORTED; - else - return XML_ERROR_NONE; - case XML_TOK_DATA_NEWLINE: - if (characterDataHandler) { - XML_Char c = 0xA; - characterDataHandler(handlerArg, &c, 1); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - break; - case XML_TOK_DATA_CHARS: - { - XML_CharacterDataHandler charDataHandler = characterDataHandler; - if (charDataHandler) { - if (MUST_CONVERT(enc, s)) { - for (;;) { - ICHAR *dataPtr = (ICHAR *)dataBuf; - XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); - *eventEndPP = next; - charDataHandler(handlerArg, dataBuf, - (int)(dataPtr - (ICHAR *)dataBuf)); - if (s == next) - break; - *eventPP = s; - } - } - else - charDataHandler(handlerArg, - (XML_Char *)s, - (int)((XML_Char *)next - (XML_Char *)s)); - } - else if (defaultHandler) - reportDefault(parser, enc, s, next); - } - break; - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_PARTIAL: - case XML_TOK_NONE: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_CDATA_SECTION; - default: - *eventPP = next; - return XML_ERROR_UNEXPECTED_STATE; - } - - *eventPP = s = next; - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: ; - } - } - /* not reached */ -} - -#ifdef XML_DTD - -/* The idea here is to avoid using stack for each IGNORE section when - the whole file is parsed with one call. -*/ -static enum XML_Error PTRCALL -ignoreSectionProcessor(XML_Parser parser, - const char *start, - const char *end, - const char **endPtr) -{ - enum XML_Error result = doIgnoreSection(parser, encoding, &start, end, - endPtr, (XML_Bool)!ps_finalBuffer); - if (result != XML_ERROR_NONE) - return result; - if (start) { - processor = prologProcessor; - return prologProcessor(parser, start, end, endPtr); - } - return result; -} - -/* startPtr gets set to non-null is the section is closed, and to null - if the section is not yet closed. -*/ -static enum XML_Error -doIgnoreSection(XML_Parser parser, - const ENCODING *enc, - const char **startPtr, - const char *end, - const char **nextPtr, - XML_Bool haveMore) -{ - const char *next; - int tok; - const char *s = *startPtr; - const char **eventPP; - const char **eventEndPP; - if (enc == encoding) { - eventPP = &eventPtr; - *eventPP = s; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - *eventPP = s; - *startPtr = NULL; - tok = XmlIgnoreSectionTok(enc, s, end, &next); - *eventEndPP = next; - switch (tok) { - case XML_TOK_IGNORE_SECT: - if (defaultHandler) - reportDefault(parser, enc, s, next); - *startPtr = next; - *nextPtr = next; - if (ps_parsing == XML_FINISHED) - return XML_ERROR_ABORTED; - else - return XML_ERROR_NONE; - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_PARTIAL: - case XML_TOK_NONE: - if (haveMore) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */ - default: - *eventPP = next; - return XML_ERROR_UNEXPECTED_STATE; - } - /* not reached */ -} - -#endif /* XML_DTD */ - -static enum XML_Error -initializeEncoding(XML_Parser parser) -{ - const char *s; -#ifdef XML_UNICODE - char encodingBuf[128]; - if (!protocolEncodingName) - s = NULL; - else { - int i; - for (i = 0; protocolEncodingName[i]; i++) { - if (i == sizeof(encodingBuf) - 1 - || (protocolEncodingName[i] & ~0x7f) != 0) { - encodingBuf[0] = '\0'; - break; - } - encodingBuf[i] = (char)protocolEncodingName[i]; - } - encodingBuf[i] = '\0'; - s = encodingBuf; - } -#else - s = protocolEncodingName; -#endif - if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s)) - return XML_ERROR_NONE; - return handleUnknownEncoding(parser, protocolEncodingName); -} - -static enum XML_Error -processXmlDecl(XML_Parser parser, int isGeneralTextEntity, - const char *s, const char *next) -{ - const char *encodingName = NULL; - const XML_Char *storedEncName = NULL; - const ENCODING *newEncoding = NULL; - const char *version = NULL; - const char *versionend; - const XML_Char *storedversion = NULL; - int standalone = -1; - if (!(ns - ? XmlParseXmlDeclNS - : XmlParseXmlDecl)(isGeneralTextEntity, - encoding, - s, - next, - &eventPtr, - &version, - &versionend, - &encodingName, - &newEncoding, - &standalone)) { - if (isGeneralTextEntity) - return XML_ERROR_TEXT_DECL; - else - return XML_ERROR_XML_DECL; - } - if (!isGeneralTextEntity && standalone == 1) { - _dtd->standalone = XML_TRUE; -#ifdef XML_DTD - if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE) - paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; -#endif /* XML_DTD */ - } - if (xmlDeclHandler) { - if (encodingName != NULL) { - storedEncName = poolStoreString(&temp2Pool, - encoding, - encodingName, - encodingName - + XmlNameLength(encoding, encodingName)); - if (!storedEncName) - return XML_ERROR_NO_MEMORY; - poolFinish(&temp2Pool); - } - if (version) { - storedversion = poolStoreString(&temp2Pool, - encoding, - version, - versionend - encoding->minBytesPerChar); - if (!storedversion) - return XML_ERROR_NO_MEMORY; - } - xmlDeclHandler(handlerArg, storedversion, storedEncName, standalone); - } - else if (defaultHandler) - reportDefault(parser, encoding, s, next); - if (protocolEncodingName == NULL) { - if (newEncoding) { - if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) { - eventPtr = encodingName; - return XML_ERROR_INCORRECT_ENCODING; - } - encoding = newEncoding; - } - else if (encodingName) { - enum XML_Error result; - if (!storedEncName) { - storedEncName = poolStoreString( - &temp2Pool, encoding, encodingName, - encodingName + XmlNameLength(encoding, encodingName)); - if (!storedEncName) - return XML_ERROR_NO_MEMORY; - } - result = handleUnknownEncoding(parser, storedEncName); - poolClear(&temp2Pool); - if (result == XML_ERROR_UNKNOWN_ENCODING) - eventPtr = encodingName; - return result; - } - } - - if (storedEncName || storedversion) - poolClear(&temp2Pool); - - return XML_ERROR_NONE; -} - -static enum XML_Error -handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) -{ - if (unknownEncodingHandler) { - XML_Encoding info; - int i; - for (i = 0; i < 256; i++) - info.map[i] = -1; - info.convert = NULL; - info.data = NULL; - info.release = NULL; - if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName, - &info)) { - ENCODING *enc; - unknownEncodingMem = MALLOC(XmlSizeOfUnknownEncoding()); - if (!unknownEncodingMem) { - if (info.release) - info.release(info.data); - return XML_ERROR_NO_MEMORY; - } - enc = (ns - ? XmlInitUnknownEncodingNS - : XmlInitUnknownEncoding)(unknownEncodingMem, - info.map, - info.convert, - info.data); - if (enc) { - unknownEncodingData = info.data; - unknownEncodingRelease = info.release; - encoding = enc; - return XML_ERROR_NONE; - } - } - if (info.release != NULL) - info.release(info.data); - } - return XML_ERROR_UNKNOWN_ENCODING; -} - -static enum XML_Error PTRCALL -prologInitProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - enum XML_Error result = initializeEncoding(parser); - if (result != XML_ERROR_NONE) - return result; - processor = prologProcessor; - return prologProcessor(parser, s, end, nextPtr); -} - -#ifdef XML_DTD - -static enum XML_Error PTRCALL -externalParEntInitProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - enum XML_Error result = initializeEncoding(parser); - if (result != XML_ERROR_NONE) - return result; - - /* we know now that XML_Parse(Buffer) has been called, - so we consider the external parameter entity read */ - _dtd->paramEntityRead = XML_TRUE; - - if (prologState.inEntityValue) { - processor = entityValueInitProcessor; - return entityValueInitProcessor(parser, s, end, nextPtr); - } - else { - processor = externalParEntProcessor; - return externalParEntProcessor(parser, s, end, nextPtr); - } -} - -static enum XML_Error PTRCALL -entityValueInitProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - int tok; - const char *start = s; - const char *next = start; - eventPtr = start; - - for (;;) { - tok = XmlPrologTok(encoding, start, end, &next); - eventEndPtr = next; - if (tok <= 0) { - if (!ps_finalBuffer && tok != XML_TOK_INVALID) { - *nextPtr = s; - return XML_ERROR_NONE; - } - switch (tok) { - case XML_TOK_INVALID: - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ - default: - break; - } - /* found end of entity value - can store it now */ - return storeEntityValue(parser, encoding, s, end); - } - else if (tok == XML_TOK_XML_DECL) { - enum XML_Error result; - result = processXmlDecl(parser, 0, start, next); - if (result != XML_ERROR_NONE) - return result; - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: - *nextPtr = next; - } - /* stop scanning for text declaration - we found one */ - processor = entityValueProcessor; - return entityValueProcessor(parser, next, end, nextPtr); - } - /* If we are at the end of the buffer, this would cause XmlPrologTok to - return XML_TOK_NONE on the next call, which would then cause the - function to exit with *nextPtr set to s - that is what we want for other - tokens, but not for the BOM - we would rather like to skip it; - then, when this routine is entered the next time, XmlPrologTok will - return XML_TOK_INVALID, since the BOM is still in the buffer - */ - else if (tok == XML_TOK_BOM && next == end && !ps_finalBuffer) { - *nextPtr = next; - return XML_ERROR_NONE; - } - start = next; - eventPtr = start; - } -} - -static enum XML_Error PTRCALL -externalParEntProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - const char *next = s; - int tok; - - tok = XmlPrologTok(encoding, s, end, &next); - if (tok <= 0) { - if (!ps_finalBuffer && tok != XML_TOK_INVALID) { - *nextPtr = s; - return XML_ERROR_NONE; - } - switch (tok) { - case XML_TOK_INVALID: - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ - default: - break; - } - } - /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM. - However, when parsing an external subset, doProlog will not accept a BOM - as valid, and report a syntax error, so we have to skip the BOM - */ - else if (tok == XML_TOK_BOM) { - s = next; - tok = XmlPrologTok(encoding, s, end, &next); - } - - processor = prologProcessor; - return doProlog(parser, encoding, s, end, tok, next, - nextPtr, (XML_Bool)!ps_finalBuffer); -} - -static enum XML_Error PTRCALL -entityValueProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - const char *start = s; - const char *next = s; - const ENCODING *enc = encoding; - int tok; - - for (;;) { - tok = XmlPrologTok(enc, start, end, &next); - if (tok <= 0) { - if (!ps_finalBuffer && tok != XML_TOK_INVALID) { - *nextPtr = s; - return XML_ERROR_NONE; - } - switch (tok) { - case XML_TOK_INVALID: - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: /* start == end */ - default: - break; - } - /* found end of entity value - can store it now */ - return storeEntityValue(parser, enc, s, end); - } - start = next; - } -} - -#endif /* XML_DTD */ - -static enum XML_Error PTRCALL -prologProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - const char *next = s; - int tok = XmlPrologTok(encoding, s, end, &next); - return doProlog(parser, encoding, s, end, tok, next, - nextPtr, (XML_Bool)!ps_finalBuffer); -} - -static enum XML_Error -doProlog(XML_Parser parser, - const ENCODING *enc, - const char *s, - const char *end, - int tok, - const char *next, - const char **nextPtr, - XML_Bool haveMore) -{ -#ifdef XML_DTD - static const XML_Char externalSubsetName[] = { ASCII_HASH , '\0' }; -#endif /* XML_DTD */ - static const XML_Char atypeCDATA[] = - { ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; - static const XML_Char atypeID[] = { ASCII_I, ASCII_D, '\0' }; - static const XML_Char atypeIDREF[] = - { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; - static const XML_Char atypeIDREFS[] = - { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; - static const XML_Char atypeENTITY[] = - { ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; - static const XML_Char atypeENTITIES[] = { ASCII_E, ASCII_N, - ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, '\0' }; - static const XML_Char atypeNMTOKEN[] = { - ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; - static const XML_Char atypeNMTOKENS[] = { ASCII_N, ASCII_M, ASCII_T, - ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, '\0' }; - static const XML_Char notationPrefix[] = { ASCII_N, ASCII_O, ASCII_T, - ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0' }; - static const XML_Char enumValueSep[] = { ASCII_PIPE, '\0' }; - static const XML_Char enumValueStart[] = { ASCII_LPAREN, '\0' }; - - /* save one level of indirection */ - DTD * const dtd = _dtd; - - const char **eventPP; - const char **eventEndPP; - enum XML_Content_Quant quant; - - if (enc == encoding) { - eventPP = &eventPtr; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - - for (;;) { - int role; - XML_Bool handleDefault = XML_TRUE; - *eventPP = s; - *eventEndPP = next; - if (tok <= 0) { - if (haveMore && tok != XML_TOK_INVALID) { - *nextPtr = s; - return XML_ERROR_NONE; - } - switch (tok) { - case XML_TOK_INVALID: - *eventPP = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - return XML_ERROR_PARTIAL_CHAR; - case XML_TOK_NONE: -#ifdef XML_DTD - /* for internal PE NOT referenced between declarations */ - if (enc != encoding && !openInternalEntities->betweenDecl) { - *nextPtr = s; - return XML_ERROR_NONE; - } - /* WFC: PE Between Declarations - must check that PE contains - complete markup, not only for external PEs, but also for - internal PEs if the reference occurs between declarations. - */ - if (isParamEntity || enc != encoding) { - if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc) - == XML_ROLE_ERROR) - return XML_ERROR_INCOMPLETE_PE; - *nextPtr = s; - return XML_ERROR_NONE; - } -#endif /* XML_DTD */ - return XML_ERROR_NO_ELEMENTS; - default: - tok = -tok; - next = end; - break; - } - } - role = XmlTokenRole(&prologState, tok, s, next, enc); - switch (role) { - case XML_ROLE_XML_DECL: - { - enum XML_Error result = processXmlDecl(parser, 0, s, next); - if (result != XML_ERROR_NONE) - return result; - enc = encoding; - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_DOCTYPE_NAME: - if (startDoctypeDeclHandler) { - doctypeName = poolStoreString(&tempPool, enc, s, next); - if (!doctypeName) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - doctypePubid = NULL; - handleDefault = XML_FALSE; - } - doctypeSysid = NULL; /* always initialize to NULL */ - break; - case XML_ROLE_DOCTYPE_INTERNAL_SUBSET: - if (startDoctypeDeclHandler) { - startDoctypeDeclHandler(handlerArg, doctypeName, doctypeSysid, - doctypePubid, 1); - doctypeName = NULL; - poolClear(&tempPool); - handleDefault = XML_FALSE; - } - break; -#ifdef XML_DTD - case XML_ROLE_TEXT_DECL: - { - enum XML_Error result = processXmlDecl(parser, 1, s, next); - if (result != XML_ERROR_NONE) - return result; - enc = encoding; - handleDefault = XML_FALSE; - } - break; -#endif /* XML_DTD */ - case XML_ROLE_DOCTYPE_PUBLIC_ID: -#ifdef XML_DTD - useForeignDTD = XML_FALSE; - declEntity = (ENTITY *)lookup(&dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!declEntity) - return XML_ERROR_NO_MEMORY; -#endif /* XML_DTD */ - dtd->hasParamEntityRefs = XML_TRUE; - if (startDoctypeDeclHandler) { - if (!XmlIsPublicId(enc, s, next, eventPP)) - return XML_ERROR_PUBLICID; - doctypePubid = poolStoreString(&tempPool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!doctypePubid) - return XML_ERROR_NO_MEMORY; - normalizePublicId((XML_Char *)doctypePubid); - poolFinish(&tempPool); - handleDefault = XML_FALSE; - goto alreadyChecked; - } - /* fall through */ - case XML_ROLE_ENTITY_PUBLIC_ID: - if (!XmlIsPublicId(enc, s, next, eventPP)) - return XML_ERROR_PUBLICID; - alreadyChecked: - if (dtd->keepProcessing && declEntity) { - XML_Char *tem = poolStoreString(&dtd->pool, - enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!tem) - return XML_ERROR_NO_MEMORY; - normalizePublicId(tem); - declEntity->publicId = tem; - poolFinish(&dtd->pool); - if (entityDeclHandler) - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_DOCTYPE_CLOSE: - if (doctypeName) { - startDoctypeDeclHandler(handlerArg, doctypeName, - doctypeSysid, doctypePubid, 0); - poolClear(&tempPool); - handleDefault = XML_FALSE; - } - /* doctypeSysid will be non-NULL in the case of a previous - XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler - was not set, indicating an external subset - */ -#ifdef XML_DTD - if (doctypeSysid || useForeignDTD) { - XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; - dtd->hasParamEntityRefs = XML_TRUE; - if (paramEntityParsing && externalEntityRefHandler) { - ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!entity) - return XML_ERROR_NO_MEMORY; - if (useForeignDTD) - entity->base = curBase; - dtd->paramEntityRead = XML_FALSE; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - if (dtd->paramEntityRead) { - if (!dtd->standalone && - notStandaloneHandler && - !notStandaloneHandler(handlerArg)) - return XML_ERROR_NOT_STANDALONE; - } - /* if we didn't read the foreign DTD then this means that there - is no external subset and we must reset dtd->hasParamEntityRefs - */ - else if (!doctypeSysid) - dtd->hasParamEntityRefs = hadParamEntityRefs; - /* end of DTD - no need to update dtd->keepProcessing */ - } - useForeignDTD = XML_FALSE; - } -#endif /* XML_DTD */ - if (endDoctypeDeclHandler) { - endDoctypeDeclHandler(handlerArg); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_INSTANCE_START: -#ifdef XML_DTD - /* if there is no DOCTYPE declaration then now is the - last chance to read the foreign DTD - */ - if (useForeignDTD) { - XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs; - dtd->hasParamEntityRefs = XML_TRUE; - if (paramEntityParsing && externalEntityRefHandler) { - ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!entity) - return XML_ERROR_NO_MEMORY; - entity->base = curBase; - dtd->paramEntityRead = XML_FALSE; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - if (dtd->paramEntityRead) { - if (!dtd->standalone && - notStandaloneHandler && - !notStandaloneHandler(handlerArg)) - return XML_ERROR_NOT_STANDALONE; - } - /* if we didn't read the foreign DTD then this means that there - is no external subset and we must reset dtd->hasParamEntityRefs - */ - else - dtd->hasParamEntityRefs = hadParamEntityRefs; - /* end of DTD - no need to update dtd->keepProcessing */ - } - } -#endif /* XML_DTD */ - processor = contentProcessor; - return contentProcessor(parser, s, end, nextPtr); - case XML_ROLE_ATTLIST_ELEMENT_NAME: - declElementType = getElementType(parser, enc, s, next); - if (!declElementType) - return XML_ERROR_NO_MEMORY; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_NAME: - declAttributeId = getAttributeId(parser, enc, s, next); - if (!declAttributeId) - return XML_ERROR_NO_MEMORY; - declAttributeIsCdata = XML_FALSE; - declAttributeType = NULL; - declAttributeIsId = XML_FALSE; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_CDATA: - declAttributeIsCdata = XML_TRUE; - declAttributeType = atypeCDATA; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_ID: - declAttributeIsId = XML_TRUE; - declAttributeType = atypeID; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_IDREF: - declAttributeType = atypeIDREF; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_IDREFS: - declAttributeType = atypeIDREFS; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_ENTITY: - declAttributeType = atypeENTITY; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES: - declAttributeType = atypeENTITIES; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN: - declAttributeType = atypeNMTOKEN; - goto checkAttListDeclHandler; - case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS: - declAttributeType = atypeNMTOKENS; - checkAttListDeclHandler: - if (dtd->keepProcessing && attlistDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ATTRIBUTE_ENUM_VALUE: - case XML_ROLE_ATTRIBUTE_NOTATION_VALUE: - if (dtd->keepProcessing && attlistDeclHandler) { - const XML_Char *prefix; - if (declAttributeType) { - prefix = enumValueSep; - } - else { - prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE - ? notationPrefix - : enumValueStart); - } - if (!poolAppendString(&tempPool, prefix)) - return XML_ERROR_NO_MEMORY; - if (!poolAppend(&tempPool, enc, s, next)) - return XML_ERROR_NO_MEMORY; - declAttributeType = tempPool.start; - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE: - case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE: - if (dtd->keepProcessing) { - if (!defineAttribute(declElementType, declAttributeId, - declAttributeIsCdata, declAttributeIsId, - 0, parser)) - return XML_ERROR_NO_MEMORY; - if (attlistDeclHandler && declAttributeType) { - if (*declAttributeType == XML_T(ASCII_LPAREN) - || (*declAttributeType == XML_T(ASCII_N) - && declAttributeType[1] == XML_T(ASCII_O))) { - /* Enumerated or Notation type */ - if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN)) - || !poolAppendChar(&tempPool, XML_T('\0'))) - return XML_ERROR_NO_MEMORY; - declAttributeType = tempPool.start; - poolFinish(&tempPool); - } - *eventEndPP = s; - attlistDeclHandler(handlerArg, declElementType->name, - declAttributeId->name, declAttributeType, - 0, role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE); - poolClear(&tempPool); - handleDefault = XML_FALSE; - } - } - break; - case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE: - case XML_ROLE_FIXED_ATTRIBUTE_VALUE: - if (dtd->keepProcessing) { - const XML_Char *attVal; - enum XML_Error result = - storeAttributeValue(parser, enc, declAttributeIsCdata, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar, - &dtd->pool); - if (result) - return result; - attVal = poolStart(&dtd->pool); - poolFinish(&dtd->pool); - /* ID attributes aren't allowed to have a default */ - if (!defineAttribute(declElementType, declAttributeId, - declAttributeIsCdata, XML_FALSE, attVal, parser)) - return XML_ERROR_NO_MEMORY; - if (attlistDeclHandler && declAttributeType) { - if (*declAttributeType == XML_T(ASCII_LPAREN) - || (*declAttributeType == XML_T(ASCII_N) - && declAttributeType[1] == XML_T(ASCII_O))) { - /* Enumerated or Notation type */ - if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN)) - || !poolAppendChar(&tempPool, XML_T('\0'))) - return XML_ERROR_NO_MEMORY; - declAttributeType = tempPool.start; - poolFinish(&tempPool); - } - *eventEndPP = s; - attlistDeclHandler(handlerArg, declElementType->name, - declAttributeId->name, declAttributeType, - attVal, - role == XML_ROLE_FIXED_ATTRIBUTE_VALUE); - poolClear(&tempPool); - handleDefault = XML_FALSE; - } - } - break; - case XML_ROLE_ENTITY_VALUE: - if (dtd->keepProcessing) { - enum XML_Error result = storeEntityValue(parser, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (declEntity) { - declEntity->textPtr = poolStart(&dtd->entityValuePool); - declEntity->textLen = (int)(poolLength(&dtd->entityValuePool)); - poolFinish(&dtd->entityValuePool); - if (entityDeclHandler) { - *eventEndPP = s; - entityDeclHandler(handlerArg, - declEntity->name, - declEntity->is_param, - declEntity->textPtr, - declEntity->textLen, - curBase, 0, 0, 0); - handleDefault = XML_FALSE; - } - } - else - poolDiscard(&dtd->entityValuePool); - if (result != XML_ERROR_NONE) - return result; - } - break; - case XML_ROLE_DOCTYPE_SYSTEM_ID: -#ifdef XML_DTD - useForeignDTD = XML_FALSE; -#endif /* XML_DTD */ - dtd->hasParamEntityRefs = XML_TRUE; - if (startDoctypeDeclHandler) { - doctypeSysid = poolStoreString(&tempPool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (doctypeSysid == NULL) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - handleDefault = XML_FALSE; - } -#ifdef XML_DTD - else - /* use externalSubsetName to make doctypeSysid non-NULL - for the case where no startDoctypeDeclHandler is set */ - doctypeSysid = externalSubsetName; -#endif /* XML_DTD */ - if (!dtd->standalone -#ifdef XML_DTD - && !paramEntityParsing -#endif /* XML_DTD */ - && notStandaloneHandler - && !notStandaloneHandler(handlerArg)) - return XML_ERROR_NOT_STANDALONE; -#ifndef XML_DTD - break; -#else /* XML_DTD */ - if (!declEntity) { - declEntity = (ENTITY *)lookup(&dtd->paramEntities, - externalSubsetName, - sizeof(ENTITY)); - if (!declEntity) - return XML_ERROR_NO_MEMORY; - declEntity->publicId = NULL; - } - /* fall through */ -#endif /* XML_DTD */ - case XML_ROLE_ENTITY_SYSTEM_ID: - if (dtd->keepProcessing && declEntity) { - declEntity->systemId = poolStoreString(&dtd->pool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!declEntity->systemId) - return XML_ERROR_NO_MEMORY; - declEntity->base = curBase; - poolFinish(&dtd->pool); - if (entityDeclHandler) - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_ENTITY_COMPLETE: - if (dtd->keepProcessing && declEntity && entityDeclHandler) { - *eventEndPP = s; - entityDeclHandler(handlerArg, - declEntity->name, - declEntity->is_param, - 0,0, - declEntity->base, - declEntity->systemId, - declEntity->publicId, - 0); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_ENTITY_NOTATION_NAME: - if (dtd->keepProcessing && declEntity) { - declEntity->notation = poolStoreString(&dtd->pool, enc, s, next); - if (!declEntity->notation) - return XML_ERROR_NO_MEMORY; - poolFinish(&dtd->pool); - if (unparsedEntityDeclHandler) { - *eventEndPP = s; - unparsedEntityDeclHandler(handlerArg, - declEntity->name, - declEntity->base, - declEntity->systemId, - declEntity->publicId, - declEntity->notation); - handleDefault = XML_FALSE; - } - else if (entityDeclHandler) { - *eventEndPP = s; - entityDeclHandler(handlerArg, - declEntity->name, - 0,0,0, - declEntity->base, - declEntity->systemId, - declEntity->publicId, - declEntity->notation); - handleDefault = XML_FALSE; - } - } - break; - case XML_ROLE_GENERAL_ENTITY_NAME: - { - if (XmlPredefinedEntityName(enc, s, next)) { - declEntity = NULL; - break; - } - if (dtd->keepProcessing) { - const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); - if (!name) - return XML_ERROR_NO_MEMORY; - declEntity = (ENTITY *)lookup(&dtd->generalEntities, name, - sizeof(ENTITY)); - if (!declEntity) - return XML_ERROR_NO_MEMORY; - if (declEntity->name != name) { - poolDiscard(&dtd->pool); - declEntity = NULL; - } - else { - poolFinish(&dtd->pool); - declEntity->publicId = NULL; - declEntity->is_param = XML_FALSE; - /* if we have a parent parser or are reading an internal parameter - entity, then the entity declaration is not considered "internal" - */ - declEntity->is_internal = !(parentParser || openInternalEntities); - if (entityDeclHandler) - handleDefault = XML_FALSE; - } - } - else { - poolDiscard(&dtd->pool); - declEntity = NULL; - } - } - break; - case XML_ROLE_PARAM_ENTITY_NAME: -#ifdef XML_DTD - if (dtd->keepProcessing) { - const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); - if (!name) - return XML_ERROR_NO_MEMORY; - declEntity = (ENTITY *)lookup(&dtd->paramEntities, - name, sizeof(ENTITY)); - if (!declEntity) - return XML_ERROR_NO_MEMORY; - if (declEntity->name != name) { - poolDiscard(&dtd->pool); - declEntity = NULL; - } - else { - poolFinish(&dtd->pool); - declEntity->publicId = NULL; - declEntity->is_param = XML_TRUE; - /* if we have a parent parser or are reading an internal parameter - entity, then the entity declaration is not considered "internal" - */ - declEntity->is_internal = !(parentParser || openInternalEntities); - if (entityDeclHandler) - handleDefault = XML_FALSE; - } - } - else { - poolDiscard(&dtd->pool); - declEntity = NULL; - } -#else /* not XML_DTD */ - declEntity = NULL; -#endif /* XML_DTD */ - break; - case XML_ROLE_NOTATION_NAME: - declNotationPublicId = NULL; - declNotationName = NULL; - if (notationDeclHandler) { - declNotationName = poolStoreString(&tempPool, enc, s, next); - if (!declNotationName) - return XML_ERROR_NO_MEMORY; - poolFinish(&tempPool); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_NOTATION_PUBLIC_ID: - if (!XmlIsPublicId(enc, s, next, eventPP)) - return XML_ERROR_PUBLICID; - if (declNotationName) { /* means notationDeclHandler != NULL */ - XML_Char *tem = poolStoreString(&tempPool, - enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!tem) - return XML_ERROR_NO_MEMORY; - normalizePublicId(tem); - declNotationPublicId = tem; - poolFinish(&tempPool); - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_NOTATION_SYSTEM_ID: - if (declNotationName && notationDeclHandler) { - const XML_Char *systemId - = poolStoreString(&tempPool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!systemId) - return XML_ERROR_NO_MEMORY; - *eventEndPP = s; - notationDeclHandler(handlerArg, - declNotationName, - curBase, - systemId, - declNotationPublicId); - handleDefault = XML_FALSE; - } - poolClear(&tempPool); - break; - case XML_ROLE_NOTATION_NO_SYSTEM_ID: - if (declNotationPublicId && notationDeclHandler) { - *eventEndPP = s; - notationDeclHandler(handlerArg, - declNotationName, - curBase, - 0, - declNotationPublicId); - handleDefault = XML_FALSE; - } - poolClear(&tempPool); - break; - case XML_ROLE_ERROR: - switch (tok) { - case XML_TOK_PARAM_ENTITY_REF: - /* PE references in internal subset are - not allowed within declarations. */ - return XML_ERROR_PARAM_ENTITY_REF; - case XML_TOK_XML_DECL: - return XML_ERROR_MISPLACED_XML_PI; - default: - return XML_ERROR_SYNTAX; - } -#ifdef XML_DTD - case XML_ROLE_IGNORE_SECT: - { - enum XML_Error result; - if (defaultHandler) - reportDefault(parser, enc, s, next); - handleDefault = XML_FALSE; - result = doIgnoreSection(parser, enc, &next, end, nextPtr, haveMore); - if (result != XML_ERROR_NONE) - return result; - else if (!next) { - processor = ignoreSectionProcessor; - return result; - } - } - break; -#endif /* XML_DTD */ - case XML_ROLE_GROUP_OPEN: - if (prologState.level >= groupSize) { - if (groupSize) { - char *temp = (char *)REALLOC(groupConnector, groupSize *= 2); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - groupConnector = temp; - if (dtd->scaffIndex) { - int *temp = (int *)REALLOC(dtd->scaffIndex, - groupSize * sizeof(int)); - if (temp == NULL) - return XML_ERROR_NO_MEMORY; - dtd->scaffIndex = temp; - } - } - else { - groupConnector = (char *)MALLOC(groupSize = 32); - if (!groupConnector) - return XML_ERROR_NO_MEMORY; - } - } - groupConnector[prologState.level] = 0; - if (dtd->in_eldecl) { - int myindex = nextScaffoldPart(parser); - if (myindex < 0) - return XML_ERROR_NO_MEMORY; - dtd->scaffIndex[dtd->scaffLevel] = myindex; - dtd->scaffLevel++; - dtd->scaffold[myindex].type = XML_CTYPE_SEQ; - if (elementDeclHandler) - handleDefault = XML_FALSE; - } - break; - case XML_ROLE_GROUP_SEQUENCE: - if (groupConnector[prologState.level] == ASCII_PIPE) - return XML_ERROR_SYNTAX; - groupConnector[prologState.level] = ASCII_COMMA; - if (dtd->in_eldecl && elementDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_GROUP_CHOICE: - if (groupConnector[prologState.level] == ASCII_COMMA) - return XML_ERROR_SYNTAX; - if (dtd->in_eldecl - && !groupConnector[prologState.level] - && (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type - != XML_CTYPE_MIXED) - ) { - dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type - = XML_CTYPE_CHOICE; - if (elementDeclHandler) - handleDefault = XML_FALSE; - } - groupConnector[prologState.level] = ASCII_PIPE; - break; - case XML_ROLE_PARAM_ENTITY_REF: -#ifdef XML_DTD - case XML_ROLE_INNER_PARAM_ENTITY_REF: - dtd->hasParamEntityRefs = XML_TRUE; - if (!paramEntityParsing) - dtd->keepProcessing = dtd->standalone; - else { - const XML_Char *name; - ENTITY *entity; - name = poolStoreString(&dtd->pool, enc, - s + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) - return XML_ERROR_NO_MEMORY; - entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0); - poolDiscard(&dtd->pool); - /* first, determine if a check for an existing declaration is needed; - if yes, check that the entity exists, and that it is internal, - otherwise call the skipped entity handler - */ - if (prologState.documentEntity && - (dtd->standalone - ? !openInternalEntities - : !dtd->hasParamEntityRefs)) { - if (!entity) - return XML_ERROR_UNDEFINED_ENTITY; - else if (!entity->is_internal) - return XML_ERROR_ENTITY_DECLARED_IN_PE; - } - else if (!entity) { - dtd->keepProcessing = dtd->standalone; - /* cannot report skipped entities in declarations */ - if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) { - skippedEntityHandler(handlerArg, name, 1); - handleDefault = XML_FALSE; - } - break; - } - if (entity->open) - return XML_ERROR_RECURSIVE_ENTITY_REF; - if (entity->textPtr) { - enum XML_Error result; - XML_Bool betweenDecl = - (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE); - result = processInternalEntity(parser, entity, betweenDecl); - if (result != XML_ERROR_NONE) - return result; - handleDefault = XML_FALSE; - break; - } - if (externalEntityRefHandler) { - dtd->paramEntityRead = XML_FALSE; - entity->open = XML_TRUE; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) { - entity->open = XML_FALSE; - return XML_ERROR_EXTERNAL_ENTITY_HANDLING; - } - entity->open = XML_FALSE; - handleDefault = XML_FALSE; - if (!dtd->paramEntityRead) { - dtd->keepProcessing = dtd->standalone; - break; - } - } - else { - dtd->keepProcessing = dtd->standalone; - break; - } - } -#endif /* XML_DTD */ - if (!dtd->standalone && - notStandaloneHandler && - !notStandaloneHandler(handlerArg)) - return XML_ERROR_NOT_STANDALONE; - break; - - /* Element declaration stuff */ - - case XML_ROLE_ELEMENT_NAME: - if (elementDeclHandler) { - declElementType = getElementType(parser, enc, s, next); - if (!declElementType) - return XML_ERROR_NO_MEMORY; - dtd->scaffLevel = 0; - dtd->scaffCount = 0; - dtd->in_eldecl = XML_TRUE; - handleDefault = XML_FALSE; - } - break; - - case XML_ROLE_CONTENT_ANY: - case XML_ROLE_CONTENT_EMPTY: - if (dtd->in_eldecl) { - if (elementDeclHandler) { - XML_Content * content = (XML_Content *) MALLOC(sizeof(XML_Content)); - if (!content) - return XML_ERROR_NO_MEMORY; - content->quant = XML_CQUANT_NONE; - content->name = NULL; - content->numchildren = 0; - content->children = NULL; - content->type = ((role == XML_ROLE_CONTENT_ANY) ? - XML_CTYPE_ANY : - XML_CTYPE_EMPTY); - *eventEndPP = s; - elementDeclHandler(handlerArg, declElementType->name, content); - handleDefault = XML_FALSE; - } - dtd->in_eldecl = XML_FALSE; - } - break; - - case XML_ROLE_CONTENT_PCDATA: - if (dtd->in_eldecl) { - dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type - = XML_CTYPE_MIXED; - if (elementDeclHandler) - handleDefault = XML_FALSE; - } - break; - - case XML_ROLE_CONTENT_ELEMENT: - quant = XML_CQUANT_NONE; - goto elementContent; - case XML_ROLE_CONTENT_ELEMENT_OPT: - quant = XML_CQUANT_OPT; - goto elementContent; - case XML_ROLE_CONTENT_ELEMENT_REP: - quant = XML_CQUANT_REP; - goto elementContent; - case XML_ROLE_CONTENT_ELEMENT_PLUS: - quant = XML_CQUANT_PLUS; - elementContent: - if (dtd->in_eldecl) { - ELEMENT_TYPE *el; - const XML_Char *name; - int nameLen; - const char *nxt = (quant == XML_CQUANT_NONE - ? next - : next - enc->minBytesPerChar); - int myindex = nextScaffoldPart(parser); - if (myindex < 0) - return XML_ERROR_NO_MEMORY; - dtd->scaffold[myindex].type = XML_CTYPE_NAME; - dtd->scaffold[myindex].quant = quant; - el = getElementType(parser, enc, s, nxt); - if (!el) - return XML_ERROR_NO_MEMORY; - name = el->name; - dtd->scaffold[myindex].name = name; - nameLen = 0; - for (; name[nameLen++]; ); - dtd->contentStringLen += nameLen; - if (elementDeclHandler) - handleDefault = XML_FALSE; - } - break; - - case XML_ROLE_GROUP_CLOSE: - quant = XML_CQUANT_NONE; - goto closeGroup; - case XML_ROLE_GROUP_CLOSE_OPT: - quant = XML_CQUANT_OPT; - goto closeGroup; - case XML_ROLE_GROUP_CLOSE_REP: - quant = XML_CQUANT_REP; - goto closeGroup; - case XML_ROLE_GROUP_CLOSE_PLUS: - quant = XML_CQUANT_PLUS; - closeGroup: - if (dtd->in_eldecl) { - if (elementDeclHandler) - handleDefault = XML_FALSE; - dtd->scaffLevel--; - dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant; - if (dtd->scaffLevel == 0) { - if (!handleDefault) { - XML_Content *model = build_model(parser); - if (!model) - return XML_ERROR_NO_MEMORY; - *eventEndPP = s; - elementDeclHandler(handlerArg, declElementType->name, model); - } - dtd->in_eldecl = XML_FALSE; - dtd->contentStringLen = 0; - } - } - break; - /* End element declaration stuff */ - - case XML_ROLE_PI: - if (!reportProcessingInstruction(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - handleDefault = XML_FALSE; - break; - case XML_ROLE_COMMENT: - if (!reportComment(parser, enc, s, next)) - return XML_ERROR_NO_MEMORY; - handleDefault = XML_FALSE; - break; - case XML_ROLE_NONE: - switch (tok) { - case XML_TOK_BOM: - handleDefault = XML_FALSE; - break; - } - break; - case XML_ROLE_DOCTYPE_NONE: - if (startDoctypeDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ENTITY_NONE: - if (dtd->keepProcessing && entityDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_NOTATION_NONE: - if (notationDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ATTLIST_NONE: - if (dtd->keepProcessing && attlistDeclHandler) - handleDefault = XML_FALSE; - break; - case XML_ROLE_ELEMENT_NONE: - if (elementDeclHandler) - handleDefault = XML_FALSE; - break; - } /* end of big switch */ - - if (handleDefault && defaultHandler) - reportDefault(parser, enc, s, next); - - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: - s = next; - tok = XmlPrologTok(enc, s, end, &next); - } - } - /* not reached */ -} - -static enum XML_Error PTRCALL -epilogProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - processor = epilogProcessor; - eventPtr = s; - for (;;) { - const char *next = NULL; - int tok = XmlPrologTok(encoding, s, end, &next); - eventEndPtr = next; - switch (tok) { - /* report partial linebreak - it might be the last token */ - case -XML_TOK_PROLOG_S: - if (defaultHandler) { - reportDefault(parser, encoding, s, next); - if (ps_parsing == XML_FINISHED) - return XML_ERROR_ABORTED; - } - *nextPtr = next; - return XML_ERROR_NONE; - case XML_TOK_NONE: - *nextPtr = s; - return XML_ERROR_NONE; - case XML_TOK_PROLOG_S: - if (defaultHandler) - reportDefault(parser, encoding, s, next); - break; - case XML_TOK_PI: - if (!reportProcessingInstruction(parser, encoding, s, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_COMMENT: - if (!reportComment(parser, encoding, s, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_INVALID: - eventPtr = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - if (!ps_finalBuffer) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_UNCLOSED_TOKEN; - case XML_TOK_PARTIAL_CHAR: - if (!ps_finalBuffer) { - *nextPtr = s; - return XML_ERROR_NONE; - } - return XML_ERROR_PARTIAL_CHAR; - default: - return XML_ERROR_JUNK_AFTER_DOC_ELEMENT; - } - eventPtr = s = next; - switch (ps_parsing) { - case XML_SUSPENDED: - *nextPtr = next; - return XML_ERROR_NONE; - case XML_FINISHED: - return XML_ERROR_ABORTED; - default: ; - } - } -} - -static enum XML_Error -processInternalEntity(XML_Parser parser, ENTITY *entity, - XML_Bool betweenDecl) -{ - const char *textStart, *textEnd; - const char *next; - enum XML_Error result; - OPEN_INTERNAL_ENTITY *openEntity; - - if (freeInternalEntities) { - openEntity = freeInternalEntities; - freeInternalEntities = openEntity->next; - } - else { - openEntity = (OPEN_INTERNAL_ENTITY *)MALLOC(sizeof(OPEN_INTERNAL_ENTITY)); - if (!openEntity) - return XML_ERROR_NO_MEMORY; - } - entity->open = XML_TRUE; - entity->processed = 0; - openEntity->next = openInternalEntities; - openInternalEntities = openEntity; - openEntity->entity = entity; - openEntity->startTagLevel = tagLevel; - openEntity->betweenDecl = betweenDecl; - openEntity->internalEventPtr = NULL; - openEntity->internalEventEndPtr = NULL; - textStart = (char *)entity->textPtr; - textEnd = (char *)(entity->textPtr + entity->textLen); - -#ifdef XML_DTD - if (entity->is_param) { - int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); - result = doProlog(parser, internalEncoding, textStart, textEnd, tok, - next, &next, XML_FALSE); - } - else -#endif /* XML_DTD */ - result = doContent(parser, tagLevel, internalEncoding, textStart, - textEnd, &next, XML_FALSE); - - if (result == XML_ERROR_NONE) { - if (textEnd != next && ps_parsing == XML_SUSPENDED) { - entity->processed = (int)(next - textStart); - processor = internalEntityProcessor; - } - else { - entity->open = XML_FALSE; - openInternalEntities = openEntity->next; - /* put openEntity back in list of free instances */ - openEntity->next = freeInternalEntities; - freeInternalEntities = openEntity; - } - } - return result; -} - -static enum XML_Error PTRCALL -internalEntityProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - ENTITY *entity; - const char *textStart, *textEnd; - const char *next; - enum XML_Error result; - OPEN_INTERNAL_ENTITY *openEntity = openInternalEntities; - if (!openEntity) - return XML_ERROR_UNEXPECTED_STATE; - - entity = openEntity->entity; - textStart = ((char *)entity->textPtr) + entity->processed; - textEnd = (char *)(entity->textPtr + entity->textLen); - -#ifdef XML_DTD - if (entity->is_param) { - int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next); - result = doProlog(parser, internalEncoding, textStart, textEnd, tok, - next, &next, XML_FALSE); - } - else -#endif /* XML_DTD */ - result = doContent(parser, openEntity->startTagLevel, internalEncoding, - textStart, textEnd, &next, XML_FALSE); - - if (result != XML_ERROR_NONE) - return result; - else if (textEnd != next && ps_parsing == XML_SUSPENDED) { - entity->processed = (int)(next - (char *)entity->textPtr); - return result; - } - else { - entity->open = XML_FALSE; - openInternalEntities = openEntity->next; - /* put openEntity back in list of free instances */ - openEntity->next = freeInternalEntities; - freeInternalEntities = openEntity; - } - -#ifdef XML_DTD - if (entity->is_param) { - int tok; - processor = prologProcessor; - tok = XmlPrologTok(encoding, s, end, &next); - return doProlog(parser, encoding, s, end, tok, next, nextPtr, - (XML_Bool)!ps_finalBuffer); - } - else -#endif /* XML_DTD */ - { - processor = contentProcessor; - /* see externalEntityContentProcessor vs contentProcessor */ - return doContent(parser, parentParser ? 1 : 0, encoding, s, end, - nextPtr, (XML_Bool)!ps_finalBuffer); - } -} - -static enum XML_Error PTRCALL -errorProcessor(XML_Parser parser, - const char *s, - const char *end, - const char **nextPtr) -{ - return errorCode; -} - -static enum XML_Error -storeAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, - const char *ptr, const char *end, - STRING_POOL *pool) -{ - enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr, - end, pool); - if (result) - return result; - if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20) - poolChop(pool); - if (!poolAppendChar(pool, XML_T('\0'))) - return XML_ERROR_NO_MEMORY; - return XML_ERROR_NONE; -} - -static enum XML_Error -appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, - const char *ptr, const char *end, - STRING_POOL *pool) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - for (;;) { - const char *next; - int tok = XmlAttributeValueTok(enc, ptr, end, &next); - switch (tok) { - case XML_TOK_NONE: - return XML_ERROR_NONE; - case XML_TOK_INVALID: - if (enc == encoding) - eventPtr = next; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_PARTIAL: - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_INVALID_TOKEN; - case XML_TOK_CHAR_REF: - { - XML_Char buf[XML_ENCODE_MAX]; - int i; - int n = XmlCharRefNumber(enc, ptr); - if (n < 0) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_BAD_CHAR_REF; - } - if (!isCdata - && n == 0x20 /* space */ - && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) - break; - n = XmlEncode(n, (ICHAR *)buf); - if (!n) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_BAD_CHAR_REF; - } - for (i = 0; i < n; i++) { - if (!poolAppendChar(pool, buf[i])) - return XML_ERROR_NO_MEMORY; - } - } - break; - case XML_TOK_DATA_CHARS: - if (!poolAppend(pool, enc, ptr, next)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_TRAILING_CR: - next = ptr + enc->minBytesPerChar; - /* fall through */ - case XML_TOK_ATTRIBUTE_VALUE_S: - case XML_TOK_DATA_NEWLINE: - if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) - break; - if (!poolAppendChar(pool, 0x20)) - return XML_ERROR_NO_MEMORY; - break; - case XML_TOK_ENTITY_REF: - { - const XML_Char *name; - ENTITY *entity; - char checkEntityDecl; - XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, - ptr + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (ch) { - if (!poolAppendChar(pool, ch)) - return XML_ERROR_NO_MEMORY; - break; - } - name = poolStoreString(&temp2Pool, enc, - ptr + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) - return XML_ERROR_NO_MEMORY; - entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0); - poolDiscard(&temp2Pool); - /* First, determine if a check for an existing declaration is needed; - if yes, check that the entity exists, and that it is internal. - */ - if (pool == &dtd->pool) /* are we called from prolog? */ - checkEntityDecl = -#ifdef XML_DTD - prologState.documentEntity && -#endif /* XML_DTD */ - (dtd->standalone - ? !openInternalEntities - : !dtd->hasParamEntityRefs); - else /* if (pool == &tempPool): we are called from content */ - checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone; - if (checkEntityDecl) { - if (!entity) - return XML_ERROR_UNDEFINED_ENTITY; - else if (!entity->is_internal) - return XML_ERROR_ENTITY_DECLARED_IN_PE; - } - else if (!entity) { - /* Cannot report skipped entity here - see comments on - skippedEntityHandler. - if (skippedEntityHandler) - skippedEntityHandler(handlerArg, name, 0); - */ - /* Cannot call the default handler because this would be - out of sync with the call to the startElementHandler. - if ((pool == &tempPool) && defaultHandler) - reportDefault(parser, enc, ptr, next); - */ - break; - } - if (entity->open) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_RECURSIVE_ENTITY_REF; - } - if (entity->notation) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_BINARY_ENTITY_REF; - } - if (!entity->textPtr) { - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; - } - else { - enum XML_Error result; - const XML_Char *textEnd = entity->textPtr + entity->textLen; - entity->open = XML_TRUE; - result = appendAttributeValue(parser, internalEncoding, isCdata, - (char *)entity->textPtr, - (char *)textEnd, pool); - entity->open = XML_FALSE; - if (result) - return result; - } - } - break; - default: - if (enc == encoding) - eventPtr = ptr; - return XML_ERROR_UNEXPECTED_STATE; - } - ptr = next; - } - /* not reached */ -} - -static enum XML_Error -storeEntityValue(XML_Parser parser, - const ENCODING *enc, - const char *entityTextPtr, - const char *entityTextEnd) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - STRING_POOL *pool = &(dtd->entityValuePool); - enum XML_Error result = XML_ERROR_NONE; -#ifdef XML_DTD - int oldInEntityValue = prologState.inEntityValue; - prologState.inEntityValue = 1; -#endif /* XML_DTD */ - /* never return Null for the value argument in EntityDeclHandler, - since this would indicate an external entity; therefore we - have to make sure that entityValuePool.start is not null */ - if (!pool->blocks) { - if (!poolGrow(pool)) - return XML_ERROR_NO_MEMORY; - } - - for (;;) { - const char *next; - int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next); - switch (tok) { - case XML_TOK_PARAM_ENTITY_REF: -#ifdef XML_DTD - if (isParamEntity || enc != encoding) { - const XML_Char *name; - ENTITY *entity; - name = poolStoreString(&tempPool, enc, - entityTextPtr + enc->minBytesPerChar, - next - enc->minBytesPerChar); - if (!name) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0); - poolDiscard(&tempPool); - if (!entity) { - /* not a well-formedness error - see XML 1.0: WFC Entity Declared */ - /* cannot report skipped entity here - see comments on - skippedEntityHandler - if (skippedEntityHandler) - skippedEntityHandler(handlerArg, name, 0); - */ - dtd->keepProcessing = dtd->standalone; - goto endEntityValue; - } - if (entity->open) { - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_RECURSIVE_ENTITY_REF; - goto endEntityValue; - } - if (entity->systemId) { - if (externalEntityRefHandler) { - dtd->paramEntityRead = XML_FALSE; - entity->open = XML_TRUE; - if (!externalEntityRefHandler(externalEntityRefHandlerArg, - 0, - entity->base, - entity->systemId, - entity->publicId)) { - entity->open = XML_FALSE; - result = XML_ERROR_EXTERNAL_ENTITY_HANDLING; - goto endEntityValue; - } - entity->open = XML_FALSE; - if (!dtd->paramEntityRead) - dtd->keepProcessing = dtd->standalone; - } - else - dtd->keepProcessing = dtd->standalone; - } - else { - entity->open = XML_TRUE; - result = storeEntityValue(parser, - internalEncoding, - (char *)entity->textPtr, - (char *)(entity->textPtr - + entity->textLen)); - entity->open = XML_FALSE; - if (result) - goto endEntityValue; - } - break; - } -#endif /* XML_DTD */ - /* In the internal subset, PE references are not legal - within markup declarations, e.g entity values in this case. */ - eventPtr = entityTextPtr; - result = XML_ERROR_PARAM_ENTITY_REF; - goto endEntityValue; - case XML_TOK_NONE: - result = XML_ERROR_NONE; - goto endEntityValue; - case XML_TOK_ENTITY_REF: - case XML_TOK_DATA_CHARS: - if (!poolAppend(pool, enc, entityTextPtr, next)) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - break; - case XML_TOK_TRAILING_CR: - next = entityTextPtr + enc->minBytesPerChar; - /* fall through */ - case XML_TOK_DATA_NEWLINE: - if (pool->end == pool->ptr && !poolGrow(pool)) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - *(pool->ptr)++ = 0xA; - break; - case XML_TOK_CHAR_REF: - { - XML_Char buf[XML_ENCODE_MAX]; - int i; - int n = XmlCharRefNumber(enc, entityTextPtr); - if (n < 0) { - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_BAD_CHAR_REF; - goto endEntityValue; - } - n = XmlEncode(n, (ICHAR *)buf); - if (!n) { - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_BAD_CHAR_REF; - goto endEntityValue; - } - for (i = 0; i < n; i++) { - if (pool->end == pool->ptr && !poolGrow(pool)) { - result = XML_ERROR_NO_MEMORY; - goto endEntityValue; - } - *(pool->ptr)++ = buf[i]; - } - } - break; - case XML_TOK_PARTIAL: - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_INVALID_TOKEN; - goto endEntityValue; - case XML_TOK_INVALID: - if (enc == encoding) - eventPtr = next; - result = XML_ERROR_INVALID_TOKEN; - goto endEntityValue; - default: - if (enc == encoding) - eventPtr = entityTextPtr; - result = XML_ERROR_UNEXPECTED_STATE; - goto endEntityValue; - } - entityTextPtr = next; - } -endEntityValue: -#ifdef XML_DTD - prologState.inEntityValue = oldInEntityValue; -#endif /* XML_DTD */ - return result; -} - -static void FASTCALL -normalizeLines(XML_Char *s) -{ - XML_Char *p; - for (;; s++) { - if (*s == XML_T('\0')) - return; - if (*s == 0xD) - break; - } - p = s; - do { - if (*s == 0xD) { - *p++ = 0xA; - if (*++s == 0xA) - s++; - } - else - *p++ = *s++; - } while (*s); - *p = XML_T('\0'); -} - -static int -reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end) -{ - const XML_Char *target; - XML_Char *data; - const char *tem; - if (!processingInstructionHandler) { - if (defaultHandler) - reportDefault(parser, enc, start, end); - return 1; - } - start += enc->minBytesPerChar * 2; - tem = start + XmlNameLength(enc, start); - target = poolStoreString(&tempPool, enc, start, tem); - if (!target) - return 0; - poolFinish(&tempPool); - data = poolStoreString(&tempPool, enc, - XmlSkipS(enc, tem), - end - enc->minBytesPerChar*2); - if (!data) - return 0; - normalizeLines(data); - processingInstructionHandler(handlerArg, target, data); - poolClear(&tempPool); - return 1; -} - -static int -reportComment(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end) -{ - XML_Char *data; - if (!commentHandler) { - if (defaultHandler) - reportDefault(parser, enc, start, end); - return 1; - } - data = poolStoreString(&tempPool, - enc, - start + enc->minBytesPerChar * 4, - end - enc->minBytesPerChar * 3); - if (!data) - return 0; - normalizeLines(data); - commentHandler(handlerArg, data); - poolClear(&tempPool); - return 1; -} - -static void -reportDefault(XML_Parser parser, const ENCODING *enc, - const char *s, const char *end) -{ - if (MUST_CONVERT(enc, s)) { - const char **eventPP; - const char **eventEndPP; - if (enc == encoding) { - eventPP = &eventPtr; - eventEndPP = &eventEndPtr; - } - else { - eventPP = &(openInternalEntities->internalEventPtr); - eventEndPP = &(openInternalEntities->internalEventEndPtr); - } - do { - ICHAR *dataPtr = (ICHAR *)dataBuf; - XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); - *eventEndPP = s; - defaultHandler(handlerArg, dataBuf, (int)(dataPtr - (ICHAR *)dataBuf)); - *eventPP = s; - } while (s != end); - } - else - defaultHandler(handlerArg, (XML_Char *)s, (int)((XML_Char *)end - (XML_Char *)s)); -} - - -static int -defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, - XML_Bool isId, const XML_Char *value, XML_Parser parser) -{ - DEFAULT_ATTRIBUTE *att; - if (value || isId) { - /* The handling of default attributes gets messed up if we have - a default which duplicates a non-default. */ - int i; - for (i = 0; i < type->nDefaultAtts; i++) - if (attId == type->defaultAtts[i].id) - return 1; - if (isId && !type->idAtt && !attId->xmlns) - type->idAtt = attId; - } - if (type->nDefaultAtts == type->allocDefaultAtts) { - if (type->allocDefaultAtts == 0) { - type->allocDefaultAtts = 8; - type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(type->allocDefaultAtts - * sizeof(DEFAULT_ATTRIBUTE)); - if (!type->defaultAtts) - return 0; - } - else { - DEFAULT_ATTRIBUTE *temp; - int count = type->allocDefaultAtts * 2; - temp = (DEFAULT_ATTRIBUTE *) - REALLOC(type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE))); - if (temp == NULL) - return 0; - type->allocDefaultAtts = count; - type->defaultAtts = temp; - } - } - att = type->defaultAtts + type->nDefaultAtts; - att->id = attId; - att->value = value; - att->isCdata = isCdata; - if (!isCdata) - attId->maybeTokenized = XML_TRUE; - type->nDefaultAtts += 1; - return 1; -} - -static int -setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - const XML_Char *name; - for (name = elementType->name; *name; name++) { - if (*name == XML_T(ASCII_COLON)) { - PREFIX *prefix; - const XML_Char *s; - for (s = elementType->name; s != name; s++) { - if (!poolAppendChar(&dtd->pool, *s)) - return 0; - } - if (!poolAppendChar(&dtd->pool, XML_T('\0'))) - return 0; - prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool), - sizeof(PREFIX)); - if (!prefix) - return 0; - if (prefix->name == poolStart(&dtd->pool)) - poolFinish(&dtd->pool); - else - poolDiscard(&dtd->pool); - elementType->prefix = prefix; - - } - } - return 1; -} - -static ATTRIBUTE_ID * -getAttributeId(XML_Parser parser, const ENCODING *enc, - const char *start, const char *end) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - ATTRIBUTE_ID *id; - const XML_Char *name; - if (!poolAppendChar(&dtd->pool, XML_T('\0'))) - return NULL; - name = poolStoreString(&dtd->pool, enc, start, end); - if (!name) - return NULL; - /* skip quotation mark - its storage will be re-used (like in name[-1]) */ - ++name; - id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, name, sizeof(ATTRIBUTE_ID)); - if (!id) - return NULL; - if (id->name != name) - poolDiscard(&dtd->pool); - else { - poolFinish(&dtd->pool); - if (!ns) - ; - else if (name[0] == XML_T(ASCII_x) - && name[1] == XML_T(ASCII_m) - && name[2] == XML_T(ASCII_l) - && name[3] == XML_T(ASCII_n) - && name[4] == XML_T(ASCII_s) - && (name[5] == XML_T('\0') || name[5] == XML_T(ASCII_COLON))) { - if (name[5] == XML_T('\0')) - id->prefix = &dtd->defaultPrefix; - else - id->prefix = (PREFIX *)lookup(&dtd->prefixes, name + 6, sizeof(PREFIX)); - id->xmlns = XML_TRUE; - } - else { - int i; - for (i = 0; name[i]; i++) { - /* attributes without prefix are *not* in the default namespace */ - if (name[i] == XML_T(ASCII_COLON)) { - int j; - for (j = 0; j < i; j++) { - if (!poolAppendChar(&dtd->pool, name[j])) - return NULL; - } - if (!poolAppendChar(&dtd->pool, XML_T('\0'))) - return NULL; - id->prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool), - sizeof(PREFIX)); - if (id->prefix->name == poolStart(&dtd->pool)) - poolFinish(&dtd->pool); - else - poolDiscard(&dtd->pool); - break; - } - } - } - } - return id; -} - -#define CONTEXT_SEP XML_T(ASCII_FF) - -static const XML_Char * -getContext(XML_Parser parser) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - HASH_TABLE_ITER iter; - XML_Bool needSep = XML_FALSE; - - if (dtd->defaultPrefix.binding) { - int i; - int len; - if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS))) - return NULL; - len = dtd->defaultPrefix.binding->uriLen; - if (namespaceSeparator) - len--; - for (i = 0; i < len; i++) - if (!poolAppendChar(&tempPool, dtd->defaultPrefix.binding->uri[i])) - return NULL; - needSep = XML_TRUE; - } - - hashTableIterInit(&iter, &(dtd->prefixes)); - for (;;) { - int i; - int len; - const XML_Char *s; - PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter); - if (!prefix) - break; - if (!prefix->binding) - continue; - if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) - return NULL; - for (s = prefix->name; *s; s++) - if (!poolAppendChar(&tempPool, *s)) - return NULL; - if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS))) - return NULL; - len = prefix->binding->uriLen; - if (namespaceSeparator) - len--; - for (i = 0; i < len; i++) - if (!poolAppendChar(&tempPool, prefix->binding->uri[i])) - return NULL; - needSep = XML_TRUE; - } - - - hashTableIterInit(&iter, &(dtd->generalEntities)); - for (;;) { - const XML_Char *s; - ENTITY *e = (ENTITY *)hashTableIterNext(&iter); - if (!e) - break; - if (!e->open) - continue; - if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) - return NULL; - for (s = e->name; *s; s++) - if (!poolAppendChar(&tempPool, *s)) - return 0; - needSep = XML_TRUE; - } - - if (!poolAppendChar(&tempPool, XML_T('\0'))) - return NULL; - return tempPool.start; -} - -static XML_Bool -setContext(XML_Parser parser, const XML_Char *context) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - const XML_Char *s = context; - - while (*context != XML_T('\0')) { - if (*s == CONTEXT_SEP || *s == XML_T('\0')) { - ENTITY *e; - if (!poolAppendChar(&tempPool, XML_T('\0'))) - return XML_FALSE; - e = (ENTITY *)lookup(&dtd->generalEntities, poolStart(&tempPool), 0); - if (e) - e->open = XML_TRUE; - if (*s != XML_T('\0')) - s++; - context = s; - poolDiscard(&tempPool); - } - else if (*s == XML_T(ASCII_EQUALS)) { - PREFIX *prefix; - if (poolLength(&tempPool) == 0) - prefix = &dtd->defaultPrefix; - else { - if (!poolAppendChar(&tempPool, XML_T('\0'))) - return XML_FALSE; - prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&tempPool), - sizeof(PREFIX)); - if (!prefix) - return XML_FALSE; - if (prefix->name == poolStart(&tempPool)) { - prefix->name = poolCopyString(&dtd->pool, prefix->name); - if (!prefix->name) - return XML_FALSE; - } - poolDiscard(&tempPool); - } - for (context = s + 1; - *context != CONTEXT_SEP && *context != XML_T('\0'); - context++) - if (!poolAppendChar(&tempPool, *context)) - return XML_FALSE; - if (!poolAppendChar(&tempPool, XML_T('\0'))) - return XML_FALSE; - if (addBinding(parser, prefix, NULL, poolStart(&tempPool), - &inheritedBindings) != XML_ERROR_NONE) - return XML_FALSE; - poolDiscard(&tempPool); - if (*context != XML_T('\0')) - ++context; - s = context; - } - else { - if (!poolAppendChar(&tempPool, *s)) - return XML_FALSE; - s++; - } - } - return XML_TRUE; -} - -static void FASTCALL -normalizePublicId(XML_Char *publicId) -{ - XML_Char *p = publicId; - XML_Char *s; - for (s = publicId; *s; s++) { - switch (*s) { - case 0x20: - case 0xD: - case 0xA: - if (p != publicId && p[-1] != 0x20) - *p++ = 0x20; - break; - default: - *p++ = *s; - } - } - if (p != publicId && p[-1] == 0x20) - --p; - *p = XML_T('\0'); -} - -static DTD * -dtdCreate(const XML_Memory_Handling_Suite *ms) -{ - DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD)); - if (p == NULL) - return p; - poolInit(&(p->pool), ms); - poolInit(&(p->entityValuePool), ms); - hashTableInit(&(p->generalEntities), ms); - hashTableInit(&(p->elementTypes), ms); - hashTableInit(&(p->attributeIds), ms); - hashTableInit(&(p->prefixes), ms); -#ifdef XML_DTD - p->paramEntityRead = XML_FALSE; - hashTableInit(&(p->paramEntities), ms); -#endif /* XML_DTD */ - p->defaultPrefix.name = NULL; - p->defaultPrefix.binding = NULL; - - p->in_eldecl = XML_FALSE; - p->scaffIndex = NULL; - p->scaffold = NULL; - p->scaffLevel = 0; - p->scaffSize = 0; - p->scaffCount = 0; - p->contentStringLen = 0; - - p->keepProcessing = XML_TRUE; - p->hasParamEntityRefs = XML_FALSE; - p->standalone = XML_FALSE; - return p; -} - -static void -dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) -{ - HASH_TABLE_ITER iter; - hashTableIterInit(&iter, &(p->elementTypes)); - for (;;) { - ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (!e) - break; - if (e->allocDefaultAtts != 0) - ms->free_fcn(e->defaultAtts); - } - hashTableClear(&(p->generalEntities)); -#ifdef XML_DTD - p->paramEntityRead = XML_FALSE; - hashTableClear(&(p->paramEntities)); -#endif /* XML_DTD */ - hashTableClear(&(p->elementTypes)); - hashTableClear(&(p->attributeIds)); - hashTableClear(&(p->prefixes)); - poolClear(&(p->pool)); - poolClear(&(p->entityValuePool)); - p->defaultPrefix.name = NULL; - p->defaultPrefix.binding = NULL; - - p->in_eldecl = XML_FALSE; - - ms->free_fcn(p->scaffIndex); - p->scaffIndex = NULL; - ms->free_fcn(p->scaffold); - p->scaffold = NULL; - - p->scaffLevel = 0; - p->scaffSize = 0; - p->scaffCount = 0; - p->contentStringLen = 0; - - p->keepProcessing = XML_TRUE; - p->hasParamEntityRefs = XML_FALSE; - p->standalone = XML_FALSE; -} - -static void -dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) -{ - HASH_TABLE_ITER iter; - hashTableIterInit(&iter, &(p->elementTypes)); - for (;;) { - ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (!e) - break; - if (e->allocDefaultAtts != 0) - ms->free_fcn(e->defaultAtts); - } - hashTableDestroy(&(p->generalEntities)); -#ifdef XML_DTD - hashTableDestroy(&(p->paramEntities)); -#endif /* XML_DTD */ - hashTableDestroy(&(p->elementTypes)); - hashTableDestroy(&(p->attributeIds)); - hashTableDestroy(&(p->prefixes)); - poolDestroy(&(p->pool)); - poolDestroy(&(p->entityValuePool)); - if (isDocEntity) { - ms->free_fcn(p->scaffIndex); - ms->free_fcn(p->scaffold); - } - ms->free_fcn(p); -} - -/* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise. - The new DTD has already been initialized. -*/ -static int -dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) -{ - HASH_TABLE_ITER iter; - - /* Copy the prefix table. */ - - hashTableIterInit(&iter, &(oldDtd->prefixes)); - for (;;) { - const XML_Char *name; - const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter); - if (!oldP) - break; - name = poolCopyString(&(newDtd->pool), oldP->name); - if (!name) - return 0; - if (!lookup(&(newDtd->prefixes), name, sizeof(PREFIX))) - return 0; - } - - hashTableIterInit(&iter, &(oldDtd->attributeIds)); - - /* Copy the attribute id table. */ - - for (;;) { - ATTRIBUTE_ID *newA; - const XML_Char *name; - const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter); - - if (!oldA) - break; - /* Remember to allocate the scratch byte before the name. */ - if (!poolAppendChar(&(newDtd->pool), XML_T('\0'))) - return 0; - name = poolCopyString(&(newDtd->pool), oldA->name); - if (!name) - return 0; - ++name; - newA = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), name, - sizeof(ATTRIBUTE_ID)); - if (!newA) - return 0; - newA->maybeTokenized = oldA->maybeTokenized; - if (oldA->prefix) { - newA->xmlns = oldA->xmlns; - if (oldA->prefix == &oldDtd->defaultPrefix) - newA->prefix = &newDtd->defaultPrefix; - else - newA->prefix = (PREFIX *)lookup(&(newDtd->prefixes), - oldA->prefix->name, 0); - } - } - - /* Copy the element type table. */ - - hashTableIterInit(&iter, &(oldDtd->elementTypes)); - - for (;;) { - int i; - ELEMENT_TYPE *newE; - const XML_Char *name; - const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter); - if (!oldE) - break; - name = poolCopyString(&(newDtd->pool), oldE->name); - if (!name) - return 0; - newE = (ELEMENT_TYPE *)lookup(&(newDtd->elementTypes), name, - sizeof(ELEMENT_TYPE)); - if (!newE) - return 0; - if (oldE->nDefaultAtts) { - newE->defaultAtts = (DEFAULT_ATTRIBUTE *) - ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); - if (!newE->defaultAtts) { - ms->free_fcn(newE); - return 0; - } - } - if (oldE->idAtt) - newE->idAtt = (ATTRIBUTE_ID *) - lookup(&(newDtd->attributeIds), oldE->idAtt->name, 0); - newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; - if (oldE->prefix) - newE->prefix = (PREFIX *)lookup(&(newDtd->prefixes), - oldE->prefix->name, 0); - for (i = 0; i < newE->nDefaultAtts; i++) { - newE->defaultAtts[i].id = (ATTRIBUTE_ID *) - lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); - newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; - if (oldE->defaultAtts[i].value) { - newE->defaultAtts[i].value - = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); - if (!newE->defaultAtts[i].value) - return 0; - } - else - newE->defaultAtts[i].value = NULL; - } - } - - /* Copy the entity tables. */ - if (!copyEntityTable(&(newDtd->generalEntities), - &(newDtd->pool), - &(oldDtd->generalEntities))) - return 0; - -#ifdef XML_DTD - if (!copyEntityTable(&(newDtd->paramEntities), - &(newDtd->pool), - &(oldDtd->paramEntities))) - return 0; - newDtd->paramEntityRead = oldDtd->paramEntityRead; -#endif /* XML_DTD */ - - newDtd->keepProcessing = oldDtd->keepProcessing; - newDtd->hasParamEntityRefs = oldDtd->hasParamEntityRefs; - newDtd->standalone = oldDtd->standalone; - - /* Don't want deep copying for scaffolding */ - newDtd->in_eldecl = oldDtd->in_eldecl; - newDtd->scaffold = oldDtd->scaffold; - newDtd->contentStringLen = oldDtd->contentStringLen; - newDtd->scaffSize = oldDtd->scaffSize; - newDtd->scaffLevel = oldDtd->scaffLevel; - newDtd->scaffIndex = oldDtd->scaffIndex; - - return 1; -} /* End dtdCopy */ - -static int -copyEntityTable(HASH_TABLE *newTable, - STRING_POOL *newPool, - const HASH_TABLE *oldTable) -{ - HASH_TABLE_ITER iter; - const XML_Char *cachedOldBase = NULL; - const XML_Char *cachedNewBase = NULL; - - hashTableIterInit(&iter, oldTable); - - for (;;) { - ENTITY *newE; - const XML_Char *name; - const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter); - if (!oldE) - break; - name = poolCopyString(newPool, oldE->name); - if (!name) - return 0; - newE = (ENTITY *)lookup(newTable, name, sizeof(ENTITY)); - if (!newE) - return 0; - if (oldE->systemId) { - const XML_Char *tem = poolCopyString(newPool, oldE->systemId); - if (!tem) - return 0; - newE->systemId = tem; - if (oldE->base) { - if (oldE->base == cachedOldBase) - newE->base = cachedNewBase; - else { - cachedOldBase = oldE->base; - tem = poolCopyString(newPool, cachedOldBase); - if (!tem) - return 0; - cachedNewBase = newE->base = tem; - } - } - if (oldE->publicId) { - tem = poolCopyString(newPool, oldE->publicId); - if (!tem) - return 0; - newE->publicId = tem; - } - } - else { - const XML_Char *tem = poolCopyStringN(newPool, oldE->textPtr, - oldE->textLen); - if (!tem) - return 0; - newE->textPtr = tem; - newE->textLen = oldE->textLen; - } - if (oldE->notation) { - const XML_Char *tem = poolCopyString(newPool, oldE->notation); - if (!tem) - return 0; - newE->notation = tem; - } - newE->is_param = oldE->is_param; - newE->is_internal = oldE->is_internal; - } - return 1; -} - -#define INIT_POWER 6 - -static XML_Bool FASTCALL -keyeq(KEY s1, KEY s2) -{ - for (; *s1 == *s2; s1++, s2++) - if (*s1 == 0) - return XML_TRUE; - return XML_FALSE; -} - -static unsigned long FASTCALL -hash(KEY s) -{ - unsigned long h = 0; - while (*s) - h = CHAR_HASH(h, *s++); - return h; -} - -static NAMED * -lookup(HASH_TABLE *table, KEY name, size_t createSize) -{ - size_t i; - if (table->size == 0) { - size_t tsize; - if (!createSize) - return NULL; - table->power = INIT_POWER; - /* table->size is a power of 2 */ - table->size = (size_t)1 << INIT_POWER; - tsize = table->size * sizeof(NAMED *); - table->v = (NAMED **)table->mem->malloc_fcn(tsize); - if (!table->v) { - table->size = 0; - return NULL; - } - memset(table->v, 0, tsize); - i = hash(name) & ((unsigned long)table->size - 1); - } - else { - unsigned long h = hash(name); - unsigned long mask = (unsigned long)table->size - 1; - unsigned char step = 0; - i = h & mask; - while (table->v[i]) { - if (keyeq(name, table->v[i]->name)) - return table->v[i]; - if (!step) - step = PROBE_STEP(h, mask, table->power); - i < step ? (i += table->size - step) : (i -= step); - } - if (!createSize) - return NULL; - - /* check for overflow (table is half full) */ - if (table->used >> (table->power - 1)) { - unsigned char newPower = table->power + 1; - size_t newSize = (size_t)1 << newPower; - unsigned long newMask = (unsigned long)newSize - 1; - size_t tsize = newSize * sizeof(NAMED *); - NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize); - if (!newV) - return NULL; - memset(newV, 0, tsize); - for (i = 0; i < table->size; i++) - if (table->v[i]) { - unsigned long newHash = hash(table->v[i]->name); - size_t j = newHash & newMask; - step = 0; - while (newV[j]) { - if (!step) - step = PROBE_STEP(newHash, newMask, newPower); - j < step ? (j += newSize - step) : (j -= step); - } - newV[j] = table->v[i]; - } - table->mem->free_fcn(table->v); - table->v = newV; - table->power = newPower; - table->size = newSize; - i = h & newMask; - step = 0; - while (table->v[i]) { - if (!step) - step = PROBE_STEP(h, newMask, newPower); - i < step ? (i += newSize - step) : (i -= step); - } - } - } - table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize); - if (!table->v[i]) - return NULL; - memset(table->v[i], 0, createSize); - table->v[i]->name = name; - (table->used)++; - return table->v[i]; -} - -static void FASTCALL -hashTableClear(HASH_TABLE *table) -{ - size_t i; - for (i = 0; i < table->size; i++) { - table->mem->free_fcn(table->v[i]); - table->v[i] = NULL; - } - table->used = 0; -} - -static void FASTCALL -hashTableDestroy(HASH_TABLE *table) -{ - size_t i; - for (i = 0; i < table->size; i++) - table->mem->free_fcn(table->v[i]); - table->mem->free_fcn(table->v); -} - -static void FASTCALL -hashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms) -{ - p->power = 0; - p->size = 0; - p->used = 0; - p->v = NULL; - p->mem = ms; -} - -static void FASTCALL -hashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table) -{ - iter->p = table->v; - iter->end = iter->p + table->size; -} - -static NAMED * FASTCALL -hashTableIterNext(HASH_TABLE_ITER *iter) -{ - while (iter->p != iter->end) { - NAMED *tem = *(iter->p)++; - if (tem) - return tem; - } - return NULL; -} - -static void FASTCALL -poolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms) -{ - pool->blocks = NULL; - pool->freeBlocks = NULL; - pool->start = NULL; - pool->ptr = NULL; - pool->end = NULL; - pool->mem = ms; -} - -static void FASTCALL -poolClear(STRING_POOL *pool) -{ - if (!pool->freeBlocks) - pool->freeBlocks = pool->blocks; - else { - BLOCK *p = pool->blocks; - while (p) { - BLOCK *tem = p->next; - p->next = pool->freeBlocks; - pool->freeBlocks = p; - p = tem; - } - } - pool->blocks = NULL; - pool->start = NULL; - pool->ptr = NULL; - pool->end = NULL; -} - -static void FASTCALL -poolDestroy(STRING_POOL *pool) -{ - BLOCK *p = pool->blocks; - while (p) { - BLOCK *tem = p->next; - pool->mem->free_fcn(p); - p = tem; - } - p = pool->freeBlocks; - while (p) { - BLOCK *tem = p->next; - pool->mem->free_fcn(p); - p = tem; - } -} - -static XML_Char * -poolAppend(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end) -{ - if (!pool->ptr && !poolGrow(pool)) - return NULL; - for (;;) { - XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); - if (ptr == end) - break; - if (!poolGrow(pool)) - return NULL; - } - return pool->start; -} - -static const XML_Char * FASTCALL -poolCopyString(STRING_POOL *pool, const XML_Char *s) -{ - do { - if (!poolAppendChar(pool, *s)) - return NULL; - } while (*s++); - s = pool->start; - poolFinish(pool); - return s; -} - -static const XML_Char * -poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) -{ - if (!pool->ptr && !poolGrow(pool)) - return NULL; - for (; n > 0; --n, s++) { - if (!poolAppendChar(pool, *s)) - return NULL; - } - s = pool->start; - poolFinish(pool); - return s; -} - -static const XML_Char * FASTCALL -poolAppendString(STRING_POOL *pool, const XML_Char *s) -{ - while (*s) { - if (!poolAppendChar(pool, *s)) - return NULL; - s++; - } - return pool->start; -} - -static XML_Char * -poolStoreString(STRING_POOL *pool, const ENCODING *enc, - const char *ptr, const char *end) -{ - if (!poolAppend(pool, enc, ptr, end)) - return NULL; - if (pool->ptr == pool->end && !poolGrow(pool)) - return NULL; - *(pool->ptr)++ = 0; - return pool->start; -} - -static XML_Bool FASTCALL -poolGrow(STRING_POOL *pool) -{ - if (pool->freeBlocks) { - if (pool->start == 0) { - pool->blocks = pool->freeBlocks; - pool->freeBlocks = pool->freeBlocks->next; - pool->blocks->next = NULL; - pool->start = pool->blocks->s; - pool->end = pool->start + pool->blocks->size; - pool->ptr = pool->start; - return XML_TRUE; - } - if (pool->end - pool->start < pool->freeBlocks->size) { - BLOCK *tem = pool->freeBlocks->next; - pool->freeBlocks->next = pool->blocks; - pool->blocks = pool->freeBlocks; - pool->freeBlocks = tem; - memcpy(pool->blocks->s, pool->start, - (pool->end - pool->start) * sizeof(XML_Char)); - pool->ptr = pool->blocks->s + (pool->ptr - pool->start); - pool->start = pool->blocks->s; - pool->end = pool->start + pool->blocks->size; - return XML_TRUE; - } - } - if (pool->blocks && pool->start == pool->blocks->s) { - int blockSize = (int)(pool->end - pool->start)*2; - pool->blocks = (BLOCK *) - pool->mem->realloc_fcn(pool->blocks, - (offsetof(BLOCK, s) - + blockSize * sizeof(XML_Char))); - if (pool->blocks == NULL) - return XML_FALSE; - pool->blocks->size = blockSize; - pool->ptr = pool->blocks->s + (pool->ptr - pool->start); - pool->start = pool->blocks->s; - pool->end = pool->start + blockSize; - } - else { - BLOCK *tem; - int blockSize = (int)(pool->end - pool->start); - if (blockSize < INIT_BLOCK_SIZE) - blockSize = INIT_BLOCK_SIZE; - else - blockSize *= 2; - tem = (BLOCK *)pool->mem->malloc_fcn(offsetof(BLOCK, s) - + blockSize * sizeof(XML_Char)); - if (!tem) - return XML_FALSE; - tem->size = blockSize; - tem->next = pool->blocks; - pool->blocks = tem; - if (pool->ptr != pool->start) - memcpy(tem->s, pool->start, - (pool->ptr - pool->start) * sizeof(XML_Char)); - pool->ptr = tem->s + (pool->ptr - pool->start); - pool->start = tem->s; - pool->end = tem->s + blockSize; - } - return XML_TRUE; -} - -static int FASTCALL -nextScaffoldPart(XML_Parser parser) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - CONTENT_SCAFFOLD * me; - int next; - - if (!dtd->scaffIndex) { - dtd->scaffIndex = (int *)MALLOC(groupSize * sizeof(int)); - if (!dtd->scaffIndex) - return -1; - dtd->scaffIndex[0] = 0; - } - - if (dtd->scaffCount >= dtd->scaffSize) { - CONTENT_SCAFFOLD *temp; - if (dtd->scaffold) { - temp = (CONTENT_SCAFFOLD *) - REALLOC(dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD)); - if (temp == NULL) - return -1; - dtd->scaffSize *= 2; - } - else { - temp = (CONTENT_SCAFFOLD *)MALLOC(INIT_SCAFFOLD_ELEMENTS - * sizeof(CONTENT_SCAFFOLD)); - if (temp == NULL) - return -1; - dtd->scaffSize = INIT_SCAFFOLD_ELEMENTS; - } - dtd->scaffold = temp; - } - next = dtd->scaffCount++; - me = &dtd->scaffold[next]; - if (dtd->scaffLevel) { - CONTENT_SCAFFOLD *parent = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel-1]]; - if (parent->lastchild) { - dtd->scaffold[parent->lastchild].nextsib = next; - } - if (!parent->childcnt) - parent->firstchild = next; - parent->lastchild = next; - parent->childcnt++; - } - me->firstchild = me->lastchild = me->childcnt = me->nextsib = 0; - return next; -} - -static void -build_node(XML_Parser parser, - int src_node, - XML_Content *dest, - XML_Content **contpos, - XML_Char **strpos) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - dest->type = dtd->scaffold[src_node].type; - dest->quant = dtd->scaffold[src_node].quant; - if (dest->type == XML_CTYPE_NAME) { - const XML_Char *src; - dest->name = *strpos; - src = dtd->scaffold[src_node].name; - for (;;) { - *(*strpos)++ = *src; - if (!*src) - break; - src++; - } - dest->numchildren = 0; - dest->children = NULL; - } - else { - unsigned int i; - int cn; - dest->numchildren = dtd->scaffold[src_node].childcnt; - dest->children = *contpos; - *contpos += dest->numchildren; - for (i = 0, cn = dtd->scaffold[src_node].firstchild; - i < dest->numchildren; - i++, cn = dtd->scaffold[cn].nextsib) { - build_node(parser, cn, &(dest->children[i]), contpos, strpos); - } - dest->name = NULL; - } -} - -static XML_Content * -build_model (XML_Parser parser) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - XML_Content *ret; - XML_Content *cpos; - XML_Char * str; - int allocsize = (dtd->scaffCount * sizeof(XML_Content) - + (dtd->contentStringLen * sizeof(XML_Char))); - - ret = (XML_Content *)MALLOC(allocsize); - if (!ret) - return NULL; - - str = (XML_Char *) (&ret[dtd->scaffCount]); - cpos = &ret[1]; - - build_node(parser, 0, ret, &cpos, &str); - return ret; -} - -static ELEMENT_TYPE * -getElementType(XML_Parser parser, - const ENCODING *enc, - const char *ptr, - const char *end) -{ - DTD * const dtd = _dtd; /* save one level of indirection */ - const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end); - ELEMENT_TYPE *ret; - - if (!name) - return NULL; - ret = (ELEMENT_TYPE *) lookup(&dtd->elementTypes, name, sizeof(ELEMENT_TYPE)); - if (!ret) - return NULL; - if (ret->name != name) - poolDiscard(&dtd->pool); - else { - poolFinish(&dtd->pool); - if (!setElementTypePrefix(parser, ret)) - return NULL; - } - return ret; -} diff --git a/3rdParty/Expat/src/xmlrole.c b/3rdParty/Expat/src/xmlrole.c deleted file mode 100755 index 9c5e25b..0000000 --- a/3rdParty/Expat/src/xmlrole.c +++ /dev/null @@ -1,1336 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include <stddef.h> - -#ifdef COMPILED_FROM_DSP -#include "winconfig.h" -#elif defined(MACOS_CLASSIC) -#include "macconfig.h" -#elif defined(__amigaos4__) -#include "amigaconfig.h" -#elif defined(__WATCOMC__) -#include "watcomconfig.h" -#else -#ifdef HAVE_EXPAT_CONFIG_H -#include <expat_config.h> -#endif -#endif /* ndef COMPILED_FROM_DSP */ - -#include "expat_external.h" -#include "internal.h" -#include "xmlrole.h" -#include "ascii.h" - -/* Doesn't check: - - that ,| are not mixed in a model group - content of literals - -*/ - -static const char KW_ANY[] = { - ASCII_A, ASCII_N, ASCII_Y, '\0' }; -static const char KW_ATTLIST[] = { - ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' }; -static const char KW_CDATA[] = { - ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; -static const char KW_DOCTYPE[] = { - ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' }; -static const char KW_ELEMENT[] = { - ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' }; -static const char KW_EMPTY[] = { - ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' }; -static const char KW_ENTITIES[] = { - ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, - '\0' }; -static const char KW_ENTITY[] = { - ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; -static const char KW_FIXED[] = { - ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' }; -static const char KW_ID[] = { - ASCII_I, ASCII_D, '\0' }; -static const char KW_IDREF[] = { - ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; -static const char KW_IDREFS[] = { - ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; -#ifdef XML_DTD -static const char KW_IGNORE[] = { - ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' }; -#endif -static const char KW_IMPLIED[] = { - ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' }; -#ifdef XML_DTD -static const char KW_INCLUDE[] = { - ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' }; -#endif -static const char KW_NDATA[] = { - ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; -static const char KW_NMTOKEN[] = { - ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; -static const char KW_NMTOKENS[] = { - ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, - '\0' }; -static const char KW_NOTATION[] = - { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, - '\0' }; -static const char KW_PCDATA[] = { - ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; -static const char KW_PUBLIC[] = { - ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' }; -static const char KW_REQUIRED[] = { - ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D, - '\0' }; -static const char KW_SYSTEM[] = { - ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' }; - -#ifndef MIN_BYTES_PER_CHAR -#define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar) -#endif - -#ifdef XML_DTD -#define setTopLevel(state) \ - ((state)->handler = ((state)->documentEntity \ - ? internalSubset \ - : externalSubset1)) -#else /* not XML_DTD */ -#define setTopLevel(state) ((state)->handler = internalSubset) -#endif /* not XML_DTD */ - -typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc); - -static PROLOG_HANDLER - prolog0, prolog1, prolog2, - doctype0, doctype1, doctype2, doctype3, doctype4, doctype5, - internalSubset, - entity0, entity1, entity2, entity3, entity4, entity5, entity6, - entity7, entity8, entity9, entity10, - notation0, notation1, notation2, notation3, notation4, - attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6, - attlist7, attlist8, attlist9, - element0, element1, element2, element3, element4, element5, element6, - element7, -#ifdef XML_DTD - externalSubset0, externalSubset1, - condSect0, condSect1, condSect2, -#endif /* XML_DTD */ - declClose, - error; - -static int FASTCALL common(PROLOG_STATE *state, int tok); - -static int PTRCALL -prolog0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - state->handler = prolog1; - return XML_ROLE_NONE; - case XML_TOK_XML_DECL: - state->handler = prolog1; - return XML_ROLE_XML_DECL; - case XML_TOK_PI: - state->handler = prolog1; - return XML_ROLE_PI; - case XML_TOK_COMMENT: - state->handler = prolog1; - return XML_ROLE_COMMENT; - case XML_TOK_BOM: - return XML_ROLE_NONE; - case XML_TOK_DECL_OPEN: - if (!XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_DOCTYPE)) - break; - state->handler = doctype0; - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_INSTANCE_START: - state->handler = error; - return XML_ROLE_INSTANCE_START; - } - return common(state, tok); -} - -static int PTRCALL -prolog1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_PI: - return XML_ROLE_PI; - case XML_TOK_COMMENT: - return XML_ROLE_COMMENT; - case XML_TOK_BOM: - return XML_ROLE_NONE; - case XML_TOK_DECL_OPEN: - if (!XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_DOCTYPE)) - break; - state->handler = doctype0; - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_INSTANCE_START: - state->handler = error; - return XML_ROLE_INSTANCE_START; - } - return common(state, tok); -} - -static int PTRCALL -prolog2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_PI: - return XML_ROLE_PI; - case XML_TOK_COMMENT: - return XML_ROLE_COMMENT; - case XML_TOK_INSTANCE_START: - state->handler = error; - return XML_ROLE_INSTANCE_START; - } - return common(state, tok); -} - -static int PTRCALL -doctype0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = doctype1; - return XML_ROLE_DOCTYPE_NAME; - } - return common(state, tok); -} - -static int PTRCALL -doctype1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_OPEN_BRACKET: - state->handler = internalSubset; - return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; - case XML_TOK_DECL_CLOSE: - state->handler = prolog2; - return XML_ROLE_DOCTYPE_CLOSE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { - state->handler = doctype3; - return XML_ROLE_DOCTYPE_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { - state->handler = doctype2; - return XML_ROLE_DOCTYPE_NONE; - } - break; - } - return common(state, tok); -} - -static int PTRCALL -doctype2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_LITERAL: - state->handler = doctype3; - return XML_ROLE_DOCTYPE_PUBLIC_ID; - } - return common(state, tok); -} - -static int PTRCALL -doctype3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_LITERAL: - state->handler = doctype4; - return XML_ROLE_DOCTYPE_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -doctype4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_OPEN_BRACKET: - state->handler = internalSubset; - return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; - case XML_TOK_DECL_CLOSE: - state->handler = prolog2; - return XML_ROLE_DOCTYPE_CLOSE; - } - return common(state, tok); -} - -static int PTRCALL -doctype5(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_DECL_CLOSE: - state->handler = prolog2; - return XML_ROLE_DOCTYPE_CLOSE; - } - return common(state, tok); -} - -static int PTRCALL -internalSubset(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_DECL_OPEN: - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_ENTITY)) { - state->handler = entity0; - return XML_ROLE_ENTITY_NONE; - } - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_ATTLIST)) { - state->handler = attlist0; - return XML_ROLE_ATTLIST_NONE; - } - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_ELEMENT)) { - state->handler = element0; - return XML_ROLE_ELEMENT_NONE; - } - if (XmlNameMatchesAscii(enc, - ptr + 2 * MIN_BYTES_PER_CHAR(enc), - end, - KW_NOTATION)) { - state->handler = notation0; - return XML_ROLE_NOTATION_NONE; - } - break; - case XML_TOK_PI: - return XML_ROLE_PI; - case XML_TOK_COMMENT: - return XML_ROLE_COMMENT; - case XML_TOK_PARAM_ENTITY_REF: - return XML_ROLE_PARAM_ENTITY_REF; - case XML_TOK_CLOSE_BRACKET: - state->handler = doctype5; - return XML_ROLE_DOCTYPE_NONE; - case XML_TOK_NONE: - return XML_ROLE_NONE; - } - return common(state, tok); -} - -#ifdef XML_DTD - -static int PTRCALL -externalSubset0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - state->handler = externalSubset1; - if (tok == XML_TOK_XML_DECL) - return XML_ROLE_TEXT_DECL; - return externalSubset1(state, tok, ptr, end, enc); -} - -static int PTRCALL -externalSubset1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_COND_SECT_OPEN: - state->handler = condSect0; - return XML_ROLE_NONE; - case XML_TOK_COND_SECT_CLOSE: - if (state->includeLevel == 0) - break; - state->includeLevel -= 1; - return XML_ROLE_NONE; - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_CLOSE_BRACKET: - break; - case XML_TOK_NONE: - if (state->includeLevel) - break; - return XML_ROLE_NONE; - default: - return internalSubset(state, tok, ptr, end, enc); - } - return common(state, tok); -} - -#endif /* XML_DTD */ - -static int PTRCALL -entity0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_PERCENT: - state->handler = entity1; - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - state->handler = entity2; - return XML_ROLE_GENERAL_ENTITY_NAME; - } - return common(state, tok); -} - -static int PTRCALL -entity1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - state->handler = entity7; - return XML_ROLE_PARAM_ENTITY_NAME; - } - return common(state, tok); -} - -static int PTRCALL -entity2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { - state->handler = entity4; - return XML_ROLE_ENTITY_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { - state->handler = entity3; - return XML_ROLE_ENTITY_NONE; - } - break; - case XML_TOK_LITERAL: - state->handler = declClose; - state->role_none = XML_ROLE_ENTITY_NONE; - return XML_ROLE_ENTITY_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -entity3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_LITERAL: - state->handler = entity4; - return XML_ROLE_ENTITY_PUBLIC_ID; - } - return common(state, tok); -} - -static int PTRCALL -entity4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_LITERAL: - state->handler = entity5; - return XML_ROLE_ENTITY_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -entity5(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return XML_ROLE_ENTITY_COMPLETE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) { - state->handler = entity6; - return XML_ROLE_ENTITY_NONE; - } - break; - } - return common(state, tok); -} - -static int PTRCALL -entity6(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - state->handler = declClose; - state->role_none = XML_ROLE_ENTITY_NONE; - return XML_ROLE_ENTITY_NOTATION_NAME; - } - return common(state, tok); -} - -static int PTRCALL -entity7(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { - state->handler = entity9; - return XML_ROLE_ENTITY_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { - state->handler = entity8; - return XML_ROLE_ENTITY_NONE; - } - break; - case XML_TOK_LITERAL: - state->handler = declClose; - state->role_none = XML_ROLE_ENTITY_NONE; - return XML_ROLE_ENTITY_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -entity8(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_LITERAL: - state->handler = entity9; - return XML_ROLE_ENTITY_PUBLIC_ID; - } - return common(state, tok); -} - -static int PTRCALL -entity9(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_LITERAL: - state->handler = entity10; - return XML_ROLE_ENTITY_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -entity10(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ENTITY_NONE; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return XML_ROLE_ENTITY_COMPLETE; - } - return common(state, tok); -} - -static int PTRCALL -notation0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_NAME: - state->handler = notation1; - return XML_ROLE_NOTATION_NAME; - } - return common(state, tok); -} - -static int PTRCALL -notation1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { - state->handler = notation3; - return XML_ROLE_NOTATION_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { - state->handler = notation2; - return XML_ROLE_NOTATION_NONE; - } - break; - } - return common(state, tok); -} - -static int PTRCALL -notation2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_LITERAL: - state->handler = notation4; - return XML_ROLE_NOTATION_PUBLIC_ID; - } - return common(state, tok); -} - -static int PTRCALL -notation3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_LITERAL: - state->handler = declClose; - state->role_none = XML_ROLE_NOTATION_NONE; - return XML_ROLE_NOTATION_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -notation4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NOTATION_NONE; - case XML_TOK_LITERAL: - state->handler = declClose; - state->role_none = XML_ROLE_NOTATION_NONE; - return XML_ROLE_NOTATION_SYSTEM_ID; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return XML_ROLE_NOTATION_NO_SYSTEM_ID; - } - return common(state, tok); -} - -static int PTRCALL -attlist0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = attlist1; - return XML_ROLE_ATTLIST_ELEMENT_NAME; - } - return common(state, tok); -} - -static int PTRCALL -attlist1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = attlist2; - return XML_ROLE_ATTRIBUTE_NAME; - } - return common(state, tok); -} - -static int PTRCALL -attlist2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NAME: - { - static const char * const types[] = { - KW_CDATA, - KW_ID, - KW_IDREF, - KW_IDREFS, - KW_ENTITY, - KW_ENTITIES, - KW_NMTOKEN, - KW_NMTOKENS, - }; - int i; - for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++) - if (XmlNameMatchesAscii(enc, ptr, end, types[i])) { - state->handler = attlist8; - return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i; - } - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) { - state->handler = attlist5; - return XML_ROLE_ATTLIST_NONE; - } - break; - case XML_TOK_OPEN_PAREN: - state->handler = attlist3; - return XML_ROLE_ATTLIST_NONE; - } - return common(state, tok); -} - -static int PTRCALL -attlist3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NMTOKEN: - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = attlist4; - return XML_ROLE_ATTRIBUTE_ENUM_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -attlist4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_CLOSE_PAREN: - state->handler = attlist8; - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_OR: - state->handler = attlist3; - return XML_ROLE_ATTLIST_NONE; - } - return common(state, tok); -} - -static int PTRCALL -attlist5(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_OPEN_PAREN: - state->handler = attlist6; - return XML_ROLE_ATTLIST_NONE; - } - return common(state, tok); -} - -static int PTRCALL -attlist6(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_NAME: - state->handler = attlist7; - return XML_ROLE_ATTRIBUTE_NOTATION_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -attlist7(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_CLOSE_PAREN: - state->handler = attlist8; - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_OR: - state->handler = attlist6; - return XML_ROLE_ATTLIST_NONE; - } - return common(state, tok); -} - -/* default value */ -static int PTRCALL -attlist8(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_POUND_NAME: - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, - KW_IMPLIED)) { - state->handler = attlist1; - return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE; - } - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, - KW_REQUIRED)) { - state->handler = attlist1; - return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE; - } - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, - KW_FIXED)) { - state->handler = attlist9; - return XML_ROLE_ATTLIST_NONE; - } - break; - case XML_TOK_LITERAL: - state->handler = attlist1; - return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -attlist9(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ATTLIST_NONE; - case XML_TOK_LITERAL: - state->handler = attlist1; - return XML_ROLE_FIXED_ATTRIBUTE_VALUE; - } - return common(state, tok); -} - -static int PTRCALL -element0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = element1; - return XML_ROLE_ELEMENT_NAME; - } - return common(state, tok); -} - -static int PTRCALL -element1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_CONTENT_EMPTY; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_CONTENT_ANY; - } - break; - case XML_TOK_OPEN_PAREN: - state->handler = element2; - state->level = 1; - return XML_ROLE_GROUP_OPEN; - } - return common(state, tok); -} - -static int PTRCALL -element2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_POUND_NAME: - if (XmlNameMatchesAscii(enc, - ptr + MIN_BYTES_PER_CHAR(enc), - end, - KW_PCDATA)) { - state->handler = element3; - return XML_ROLE_CONTENT_PCDATA; - } - break; - case XML_TOK_OPEN_PAREN: - state->level = 2; - state->handler = element6; - return XML_ROLE_GROUP_OPEN; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT; - case XML_TOK_NAME_QUESTION: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_OPT; - case XML_TOK_NAME_ASTERISK: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_REP; - case XML_TOK_NAME_PLUS: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_PLUS; - } - return common(state, tok); -} - -static int PTRCALL -element3(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_CLOSE_PAREN: - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_GROUP_CLOSE; - case XML_TOK_CLOSE_PAREN_ASTERISK: - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_GROUP_CLOSE_REP; - case XML_TOK_OR: - state->handler = element4; - return XML_ROLE_ELEMENT_NONE; - } - return common(state, tok); -} - -static int PTRCALL -element4(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = element5; - return XML_ROLE_CONTENT_ELEMENT; - } - return common(state, tok); -} - -static int PTRCALL -element5(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_CLOSE_PAREN_ASTERISK: - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - return XML_ROLE_GROUP_CLOSE_REP; - case XML_TOK_OR: - state->handler = element4; - return XML_ROLE_ELEMENT_NONE; - } - return common(state, tok); -} - -static int PTRCALL -element6(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_OPEN_PAREN: - state->level += 1; - return XML_ROLE_GROUP_OPEN; - case XML_TOK_NAME: - case XML_TOK_PREFIXED_NAME: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT; - case XML_TOK_NAME_QUESTION: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_OPT; - case XML_TOK_NAME_ASTERISK: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_REP; - case XML_TOK_NAME_PLUS: - state->handler = element7; - return XML_ROLE_CONTENT_ELEMENT_PLUS; - } - return common(state, tok); -} - -static int PTRCALL -element7(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_ELEMENT_NONE; - case XML_TOK_CLOSE_PAREN: - state->level -= 1; - if (state->level == 0) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - } - return XML_ROLE_GROUP_CLOSE; - case XML_TOK_CLOSE_PAREN_ASTERISK: - state->level -= 1; - if (state->level == 0) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - } - return XML_ROLE_GROUP_CLOSE_REP; - case XML_TOK_CLOSE_PAREN_QUESTION: - state->level -= 1; - if (state->level == 0) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - } - return XML_ROLE_GROUP_CLOSE_OPT; - case XML_TOK_CLOSE_PAREN_PLUS: - state->level -= 1; - if (state->level == 0) { - state->handler = declClose; - state->role_none = XML_ROLE_ELEMENT_NONE; - } - return XML_ROLE_GROUP_CLOSE_PLUS; - case XML_TOK_COMMA: - state->handler = element6; - return XML_ROLE_GROUP_SEQUENCE; - case XML_TOK_OR: - state->handler = element6; - return XML_ROLE_GROUP_CHOICE; - } - return common(state, tok); -} - -#ifdef XML_DTD - -static int PTRCALL -condSect0(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_NAME: - if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) { - state->handler = condSect1; - return XML_ROLE_NONE; - } - if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) { - state->handler = condSect2; - return XML_ROLE_NONE; - } - break; - } - return common(state, tok); -} - -static int PTRCALL -condSect1(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_OPEN_BRACKET: - state->handler = externalSubset1; - state->includeLevel += 1; - return XML_ROLE_NONE; - } - return common(state, tok); -} - -static int PTRCALL -condSect2(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return XML_ROLE_NONE; - case XML_TOK_OPEN_BRACKET: - state->handler = externalSubset1; - return XML_ROLE_IGNORE_SECT; - } - return common(state, tok); -} - -#endif /* XML_DTD */ - -static int PTRCALL -declClose(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - switch (tok) { - case XML_TOK_PROLOG_S: - return state->role_none; - case XML_TOK_DECL_CLOSE: - setTopLevel(state); - return state->role_none; - } - return common(state, tok); -} - -static int PTRCALL -error(PROLOG_STATE *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc) -{ - return XML_ROLE_NONE; -} - -static int FASTCALL -common(PROLOG_STATE *state, int tok) -{ -#ifdef XML_DTD - if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF) - return XML_ROLE_INNER_PARAM_ENTITY_REF; -#endif - state->handler = error; - return XML_ROLE_ERROR; -} - -void -XmlPrologStateInit(PROLOG_STATE *state) -{ - state->handler = prolog0; -#ifdef XML_DTD - state->documentEntity = 1; - state->includeLevel = 0; - state->inEntityValue = 0; -#endif /* XML_DTD */ -} - -#ifdef XML_DTD - -void -XmlPrologStateInitExternalEntity(PROLOG_STATE *state) -{ - state->handler = externalSubset0; - state->documentEntity = 0; - state->includeLevel = 0; -} - -#endif /* XML_DTD */ diff --git a/3rdParty/Expat/src/xmlrole.h b/3rdParty/Expat/src/xmlrole.h deleted file mode 100755 index 4dd9f06..0000000 --- a/3rdParty/Expat/src/xmlrole.h +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#ifndef XmlRole_INCLUDED -#define XmlRole_INCLUDED 1 - -#ifdef __VMS -/* 0 1 2 3 0 1 2 3 - 1234567890123456789012345678901 1234567890123456789012345678901 */ -#define XmlPrologStateInitExternalEntity XmlPrologStateInitExternalEnt -#endif - -#include "xmltok.h" - -#ifdef __cplusplus -extern "C" { -#endif - -enum { - XML_ROLE_ERROR = -1, - XML_ROLE_NONE = 0, - XML_ROLE_XML_DECL, - XML_ROLE_INSTANCE_START, - XML_ROLE_DOCTYPE_NONE, - XML_ROLE_DOCTYPE_NAME, - XML_ROLE_DOCTYPE_SYSTEM_ID, - XML_ROLE_DOCTYPE_PUBLIC_ID, - XML_ROLE_DOCTYPE_INTERNAL_SUBSET, - XML_ROLE_DOCTYPE_CLOSE, - XML_ROLE_GENERAL_ENTITY_NAME, - XML_ROLE_PARAM_ENTITY_NAME, - XML_ROLE_ENTITY_NONE, - XML_ROLE_ENTITY_VALUE, - XML_ROLE_ENTITY_SYSTEM_ID, - XML_ROLE_ENTITY_PUBLIC_ID, - XML_ROLE_ENTITY_COMPLETE, - XML_ROLE_ENTITY_NOTATION_NAME, - XML_ROLE_NOTATION_NONE, - XML_ROLE_NOTATION_NAME, - XML_ROLE_NOTATION_SYSTEM_ID, - XML_ROLE_NOTATION_NO_SYSTEM_ID, - XML_ROLE_NOTATION_PUBLIC_ID, - XML_ROLE_ATTRIBUTE_NAME, - XML_ROLE_ATTRIBUTE_TYPE_CDATA, - XML_ROLE_ATTRIBUTE_TYPE_ID, - XML_ROLE_ATTRIBUTE_TYPE_IDREF, - XML_ROLE_ATTRIBUTE_TYPE_IDREFS, - XML_ROLE_ATTRIBUTE_TYPE_ENTITY, - XML_ROLE_ATTRIBUTE_TYPE_ENTITIES, - XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN, - XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS, - XML_ROLE_ATTRIBUTE_ENUM_VALUE, - XML_ROLE_ATTRIBUTE_NOTATION_VALUE, - XML_ROLE_ATTLIST_NONE, - XML_ROLE_ATTLIST_ELEMENT_NAME, - XML_ROLE_IMPLIED_ATTRIBUTE_VALUE, - XML_ROLE_REQUIRED_ATTRIBUTE_VALUE, - XML_ROLE_DEFAULT_ATTRIBUTE_VALUE, - XML_ROLE_FIXED_ATTRIBUTE_VALUE, - XML_ROLE_ELEMENT_NONE, - XML_ROLE_ELEMENT_NAME, - XML_ROLE_CONTENT_ANY, - XML_ROLE_CONTENT_EMPTY, - XML_ROLE_CONTENT_PCDATA, - XML_ROLE_GROUP_OPEN, - XML_ROLE_GROUP_CLOSE, - XML_ROLE_GROUP_CLOSE_REP, - XML_ROLE_GROUP_CLOSE_OPT, - XML_ROLE_GROUP_CLOSE_PLUS, - XML_ROLE_GROUP_CHOICE, - XML_ROLE_GROUP_SEQUENCE, - XML_ROLE_CONTENT_ELEMENT, - XML_ROLE_CONTENT_ELEMENT_REP, - XML_ROLE_CONTENT_ELEMENT_OPT, - XML_ROLE_CONTENT_ELEMENT_PLUS, - XML_ROLE_PI, - XML_ROLE_COMMENT, -#ifdef XML_DTD - XML_ROLE_TEXT_DECL, - XML_ROLE_IGNORE_SECT, - XML_ROLE_INNER_PARAM_ENTITY_REF, -#endif /* XML_DTD */ - XML_ROLE_PARAM_ENTITY_REF -}; - -typedef struct prolog_state { - int (PTRCALL *handler) (struct prolog_state *state, - int tok, - const char *ptr, - const char *end, - const ENCODING *enc); - unsigned level; - int role_none; -#ifdef XML_DTD - unsigned includeLevel; - int documentEntity; - int inEntityValue; -#endif /* XML_DTD */ -} PROLOG_STATE; - -void XmlPrologStateInit(PROLOG_STATE *); -#ifdef XML_DTD -void XmlPrologStateInitExternalEntity(PROLOG_STATE *); -#endif /* XML_DTD */ - -#define XmlTokenRole(state, tok, ptr, end, enc) \ - (((state)->handler)(state, tok, ptr, end, enc)) - -#ifdef __cplusplus -} -#endif - -#endif /* not XmlRole_INCLUDED */ diff --git a/3rdParty/Expat/src/xmltok.c b/3rdParty/Expat/src/xmltok.c deleted file mode 100755 index 068afde..0000000 --- a/3rdParty/Expat/src/xmltok.c +++ /dev/null @@ -1,1651 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#include <stddef.h> - -#ifdef COMPILED_FROM_DSP -#include "winconfig.h" -#elif defined(MACOS_CLASSIC) -#include "macconfig.h" -#elif defined(__amigaos4__) -#include "amigaconfig.h" -#elif defined(__WATCOMC__) -#include "watcomconfig.h" -#else -#ifdef HAVE_EXPAT_CONFIG_H -#include <expat_config.h> -#endif -#endif /* ndef COMPILED_FROM_DSP */ - -#include "expat_external.h" -#include "internal.h" -#include "xmltok.h" -#include "nametab.h" - -#ifdef XML_DTD -#define IGNORE_SECTION_TOK_VTABLE , PREFIX(ignoreSectionTok) -#else -#define IGNORE_SECTION_TOK_VTABLE /* as nothing */ -#endif - -#define VTABLE1 \ - { PREFIX(prologTok), PREFIX(contentTok), \ - PREFIX(cdataSectionTok) IGNORE_SECTION_TOK_VTABLE }, \ - { PREFIX(attributeValueTok), PREFIX(entityValueTok) }, \ - PREFIX(sameName), \ - PREFIX(nameMatchesAscii), \ - PREFIX(nameLength), \ - PREFIX(skipS), \ - PREFIX(getAtts), \ - PREFIX(charRefNumber), \ - PREFIX(predefinedEntityName), \ - PREFIX(updatePosition), \ - PREFIX(isPublicId) - -#define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16) - -#define UCS2_GET_NAMING(pages, hi, lo) \ - (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1 << ((lo) & 0x1F))) - -/* A 2 byte UTF-8 representation splits the characters 11 bits between - the bottom 5 and 6 bits of the bytes. We need 8 bits to index into - pages, 3 bits to add to that index and 5 bits to generate the mask. -*/ -#define UTF8_GET_NAMING2(pages, byte) \ - (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \ - + ((((byte)[0]) & 3) << 1) \ - + ((((byte)[1]) >> 5) & 1)] \ - & (1 << (((byte)[1]) & 0x1F))) - -/* A 3 byte UTF-8 representation splits the characters 16 bits between - the bottom 4, 6 and 6 bits of the bytes. We need 8 bits to index - into pages, 3 bits to add to that index and 5 bits to generate the - mask. -*/ -#define UTF8_GET_NAMING3(pages, byte) \ - (namingBitmap[((pages)[((((byte)[0]) & 0xF) << 4) \ - + ((((byte)[1]) >> 2) & 0xF)] \ - << 3) \ - + ((((byte)[1]) & 3) << 1) \ - + ((((byte)[2]) >> 5) & 1)] \ - & (1 << (((byte)[2]) & 0x1F))) - -#define UTF8_GET_NAMING(pages, p, n) \ - ((n) == 2 \ - ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \ - : ((n) == 3 \ - ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) \ - : 0)) - -/* Detection of invalid UTF-8 sequences is based on Table 3.1B - of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/ - with the additional restriction of not allowing the Unicode - code points 0xFFFF and 0xFFFE (sequences EF,BF,BF and EF,BF,BE). - Implementation details: - (A & 0x80) == 0 means A < 0x80 - and - (A & 0xC0) == 0xC0 means A > 0xBF -*/ - -#define UTF8_INVALID2(p) \ - ((*p) < 0xC2 || ((p)[1] & 0x80) == 0 || ((p)[1] & 0xC0) == 0xC0) - -#define UTF8_INVALID3(p) \ - (((p)[2] & 0x80) == 0 \ - || \ - ((*p) == 0xEF && (p)[1] == 0xBF \ - ? \ - (p)[2] > 0xBD \ - : \ - ((p)[2] & 0xC0) == 0xC0) \ - || \ - ((*p) == 0xE0 \ - ? \ - (p)[1] < 0xA0 || ((p)[1] & 0xC0) == 0xC0 \ - : \ - ((p)[1] & 0x80) == 0 \ - || \ - ((*p) == 0xED ? (p)[1] > 0x9F : ((p)[1] & 0xC0) == 0xC0))) - -#define UTF8_INVALID4(p) \ - (((p)[3] & 0x80) == 0 || ((p)[3] & 0xC0) == 0xC0 \ - || \ - ((p)[2] & 0x80) == 0 || ((p)[2] & 0xC0) == 0xC0 \ - || \ - ((*p) == 0xF0 \ - ? \ - (p)[1] < 0x90 || ((p)[1] & 0xC0) == 0xC0 \ - : \ - ((p)[1] & 0x80) == 0 \ - || \ - ((*p) == 0xF4 ? (p)[1] > 0x8F : ((p)[1] & 0xC0) == 0xC0))) - -static int PTRFASTCALL -isNever(const ENCODING *enc, const char *p) -{ - return 0; -} - -static int PTRFASTCALL -utf8_isName2(const ENCODING *enc, const char *p) -{ - return UTF8_GET_NAMING2(namePages, (const unsigned char *)p); -} - -static int PTRFASTCALL -utf8_isName3(const ENCODING *enc, const char *p) -{ - return UTF8_GET_NAMING3(namePages, (const unsigned char *)p); -} - -#define utf8_isName4 isNever - -static int PTRFASTCALL -utf8_isNmstrt2(const ENCODING *enc, const char *p) -{ - return UTF8_GET_NAMING2(nmstrtPages, (const unsigned char *)p); -} - -static int PTRFASTCALL -utf8_isNmstrt3(const ENCODING *enc, const char *p) -{ - return UTF8_GET_NAMING3(nmstrtPages, (const unsigned char *)p); -} - -#define utf8_isNmstrt4 isNever - -static int PTRFASTCALL -utf8_isInvalid2(const ENCODING *enc, const char *p) -{ - return UTF8_INVALID2((const unsigned char *)p); -} - -static int PTRFASTCALL -utf8_isInvalid3(const ENCODING *enc, const char *p) -{ - return UTF8_INVALID3((const unsigned char *)p); -} - -static int PTRFASTCALL -utf8_isInvalid4(const ENCODING *enc, const char *p) -{ - return UTF8_INVALID4((const unsigned char *)p); -} - -struct normal_encoding { - ENCODING enc; - unsigned char type[256]; -#ifdef XML_MIN_SIZE - int (PTRFASTCALL *byteType)(const ENCODING *, const char *); - int (PTRFASTCALL *isNameMin)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrtMin)(const ENCODING *, const char *); - int (PTRFASTCALL *byteToAscii)(const ENCODING *, const char *); - int (PTRCALL *charMatches)(const ENCODING *, const char *, int); -#endif /* XML_MIN_SIZE */ - int (PTRFASTCALL *isName2)(const ENCODING *, const char *); - int (PTRFASTCALL *isName3)(const ENCODING *, const char *); - int (PTRFASTCALL *isName4)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrt2)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrt3)(const ENCODING *, const char *); - int (PTRFASTCALL *isNmstrt4)(const ENCODING *, const char *); - int (PTRFASTCALL *isInvalid2)(const ENCODING *, const char *); - int (PTRFASTCALL *isInvalid3)(const ENCODING *, const char *); - int (PTRFASTCALL *isInvalid4)(const ENCODING *, const char *); -}; - -#define AS_NORMAL_ENCODING(enc) ((const struct normal_encoding *) (enc)) - -#ifdef XML_MIN_SIZE - -#define STANDARD_VTABLE(E) \ - E ## byteType, \ - E ## isNameMin, \ - E ## isNmstrtMin, \ - E ## byteToAscii, \ - E ## charMatches, - -#else - -#define STANDARD_VTABLE(E) /* as nothing */ - -#endif - -#define NORMAL_VTABLE(E) \ - E ## isName2, \ - E ## isName3, \ - E ## isName4, \ - E ## isNmstrt2, \ - E ## isNmstrt3, \ - E ## isNmstrt4, \ - E ## isInvalid2, \ - E ## isInvalid3, \ - E ## isInvalid4 - -static int FASTCALL checkCharRefNumber(int); - -#include "xmltok_impl.h" -#include "ascii.h" - -#ifdef XML_MIN_SIZE -#define sb_isNameMin isNever -#define sb_isNmstrtMin isNever -#endif - -#ifdef XML_MIN_SIZE -#define MINBPC(enc) ((enc)->minBytesPerChar) -#else -/* minimum bytes per character */ -#define MINBPC(enc) 1 -#endif - -#define SB_BYTE_TYPE(enc, p) \ - (((struct normal_encoding *)(enc))->type[(unsigned char)*(p)]) - -#ifdef XML_MIN_SIZE -static int PTRFASTCALL -sb_byteType(const ENCODING *enc, const char *p) -{ - return SB_BYTE_TYPE(enc, p); -} -#define BYTE_TYPE(enc, p) \ - (AS_NORMAL_ENCODING(enc)->byteType(enc, p)) -#else -#define BYTE_TYPE(enc, p) SB_BYTE_TYPE(enc, p) -#endif - -#ifdef XML_MIN_SIZE -#define BYTE_TO_ASCII(enc, p) \ - (AS_NORMAL_ENCODING(enc)->byteToAscii(enc, p)) -static int PTRFASTCALL -sb_byteToAscii(const ENCODING *enc, const char *p) -{ - return *p; -} -#else -#define BYTE_TO_ASCII(enc, p) (*(p)) -#endif - -#define IS_NAME_CHAR(enc, p, n) \ - (AS_NORMAL_ENCODING(enc)->isName ## n(enc, p)) -#define IS_NMSTRT_CHAR(enc, p, n) \ - (AS_NORMAL_ENCODING(enc)->isNmstrt ## n(enc, p)) -#define IS_INVALID_CHAR(enc, p, n) \ - (AS_NORMAL_ENCODING(enc)->isInvalid ## n(enc, p)) - -#ifdef XML_MIN_SIZE -#define IS_NAME_CHAR_MINBPC(enc, p) \ - (AS_NORMAL_ENCODING(enc)->isNameMin(enc, p)) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) \ - (AS_NORMAL_ENCODING(enc)->isNmstrtMin(enc, p)) -#else -#define IS_NAME_CHAR_MINBPC(enc, p) (0) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) (0) -#endif - -#ifdef XML_MIN_SIZE -#define CHAR_MATCHES(enc, p, c) \ - (AS_NORMAL_ENCODING(enc)->charMatches(enc, p, c)) -static int PTRCALL -sb_charMatches(const ENCODING *enc, const char *p, int c) -{ - return *p == c; -} -#else -/* c is an ASCII character */ -#define CHAR_MATCHES(enc, p, c) (*(p) == c) -#endif - -#define PREFIX(ident) normal_ ## ident -#define XML_TOK_IMPL_C -#include "xmltok_impl.c" -#undef XML_TOK_IMPL_C - -#undef MINBPC -#undef BYTE_TYPE -#undef BYTE_TO_ASCII -#undef CHAR_MATCHES -#undef IS_NAME_CHAR -#undef IS_NAME_CHAR_MINBPC -#undef IS_NMSTRT_CHAR -#undef IS_NMSTRT_CHAR_MINBPC -#undef IS_INVALID_CHAR - -enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */ - UTF8_cval1 = 0x00, - UTF8_cval2 = 0xc0, - UTF8_cval3 = 0xe0, - UTF8_cval4 = 0xf0 -}; - -static void PTRCALL -utf8_toUtf8(const ENCODING *enc, - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ - char *to; - const char *from; - if (fromLim - *fromP > toLim - *toP) { - /* Avoid copying partial characters. */ - for (fromLim = *fromP + (toLim - *toP); fromLim > *fromP; fromLim--) - if (((unsigned char)fromLim[-1] & 0xc0) != 0x80) - break; - } - for (to = *toP, from = *fromP; from != fromLim; from++, to++) - *to = *from; - *fromP = from; - *toP = to; -} - -static void PTRCALL -utf8_toUtf16(const ENCODING *enc, - const char **fromP, const char *fromLim, - unsigned short **toP, const unsigned short *toLim) -{ - unsigned short *to = *toP; - const char *from = *fromP; - while (from != fromLim && to != toLim) { - switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) { - case BT_LEAD2: - *to++ = (unsigned short)(((from[0] & 0x1f) << 6) | (from[1] & 0x3f)); - from += 2; - break; - case BT_LEAD3: - *to++ = (unsigned short)(((from[0] & 0xf) << 12) - | ((from[1] & 0x3f) << 6) | (from[2] & 0x3f)); - from += 3; - break; - case BT_LEAD4: - { - unsigned long n; - if (to + 1 == toLim) - goto after; - n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12) - | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f); - n -= 0x10000; - to[0] = (unsigned short)((n >> 10) | 0xD800); - to[1] = (unsigned short)((n & 0x3FF) | 0xDC00); - to += 2; - from += 4; - } - break; - default: - *to++ = *from++; - break; - } - } -after: - *fromP = from; - *toP = to; -} - -#ifdef XML_NS -static const struct normal_encoding utf8_encoding_ns = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#include "asciitab.h" -#include "utf8tab.h" - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; -#endif - -static const struct normal_encoding utf8_encoding = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#define BT_COLON BT_NMSTRT -#include "asciitab.h" -#undef BT_COLON -#include "utf8tab.h" - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; - -#ifdef XML_NS - -static const struct normal_encoding internal_utf8_encoding_ns = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#include "iasciitab.h" -#include "utf8tab.h" - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; - -#endif - -static const struct normal_encoding internal_utf8_encoding = { - { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, - { -#define BT_COLON BT_NMSTRT -#include "iasciitab.h" -#undef BT_COLON -#include "utf8tab.h" - }, - STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) -}; - -static void PTRCALL -latin1_toUtf8(const ENCODING *enc, - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ - for (;;) { - unsigned char c; - if (*fromP == fromLim) - break; - c = (unsigned char)**fromP; - if (c & 0x80) { - if (toLim - *toP < 2) - break; - *(*toP)++ = (char)((c >> 6) | UTF8_cval2); - *(*toP)++ = (char)((c & 0x3f) | 0x80); - (*fromP)++; - } - else { - if (*toP == toLim) - break; - *(*toP)++ = *(*fromP)++; - } - } -} - -static void PTRCALL -latin1_toUtf16(const ENCODING *enc, - const char **fromP, const char *fromLim, - unsigned short **toP, const unsigned short *toLim) -{ - while (*fromP != fromLim && *toP != toLim) - *(*toP)++ = (unsigned char)*(*fromP)++; -} - -#ifdef XML_NS - -static const struct normal_encoding latin1_encoding_ns = { - { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, - { -#include "asciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(sb_) -}; - -#endif - -static const struct normal_encoding latin1_encoding = { - { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, - { -#define BT_COLON BT_NMSTRT -#include "asciitab.h" -#undef BT_COLON -#include "latin1tab.h" - }, - STANDARD_VTABLE(sb_) -}; - -static void PTRCALL -ascii_toUtf8(const ENCODING *enc, - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ - while (*fromP != fromLim && *toP != toLim) - *(*toP)++ = *(*fromP)++; -} - -#ifdef XML_NS - -static const struct normal_encoding ascii_encoding_ns = { - { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, - { -#include "asciitab.h" -/* BT_NONXML == 0 */ - }, - STANDARD_VTABLE(sb_) -}; - -#endif - -static const struct normal_encoding ascii_encoding = { - { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, - { -#define BT_COLON BT_NMSTRT -#include "asciitab.h" -#undef BT_COLON -/* BT_NONXML == 0 */ - }, - STANDARD_VTABLE(sb_) -}; - -static int PTRFASTCALL -unicode_byte_type(char hi, char lo) -{ - switch ((unsigned char)hi) { - case 0xD8: case 0xD9: case 0xDA: case 0xDB: - return BT_LEAD4; - case 0xDC: case 0xDD: case 0xDE: case 0xDF: - return BT_TRAIL; - case 0xFF: - switch ((unsigned char)lo) { - case 0xFF: - case 0xFE: - return BT_NONXML; - } - break; - } - return BT_NONASCII; -} - -#define DEFINE_UTF16_TO_UTF8(E) \ -static void PTRCALL \ -E ## toUtf8(const ENCODING *enc, \ - const char **fromP, const char *fromLim, \ - char **toP, const char *toLim) \ -{ \ - const char *from; \ - for (from = *fromP; from != fromLim; from += 2) { \ - int plane; \ - unsigned char lo2; \ - unsigned char lo = GET_LO(from); \ - unsigned char hi = GET_HI(from); \ - switch (hi) { \ - case 0: \ - if (lo < 0x80) { \ - if (*toP == toLim) { \ - *fromP = from; \ - return; \ - } \ - *(*toP)++ = lo; \ - break; \ - } \ - /* fall through */ \ - case 0x1: case 0x2: case 0x3: \ - case 0x4: case 0x5: case 0x6: case 0x7: \ - if (toLim - *toP < 2) { \ - *fromP = from; \ - return; \ - } \ - *(*toP)++ = ((lo >> 6) | (hi << 2) | UTF8_cval2); \ - *(*toP)++ = ((lo & 0x3f) | 0x80); \ - break; \ - default: \ - if (toLim - *toP < 3) { \ - *fromP = from; \ - return; \ - } \ - /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \ - *(*toP)++ = ((hi >> 4) | UTF8_cval3); \ - *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \ - *(*toP)++ = ((lo & 0x3f) | 0x80); \ - break; \ - case 0xD8: case 0xD9: case 0xDA: case 0xDB: \ - if (toLim - *toP < 4) { \ - *fromP = from; \ - return; \ - } \ - plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \ - *(*toP)++ = ((plane >> 2) | UTF8_cval4); \ - *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \ - from += 2; \ - lo2 = GET_LO(from); \ - *(*toP)++ = (((lo & 0x3) << 4) \ - | ((GET_HI(from) & 0x3) << 2) \ - | (lo2 >> 6) \ - | 0x80); \ - *(*toP)++ = ((lo2 & 0x3f) | 0x80); \ - break; \ - } \ - } \ - *fromP = from; \ -} - -#define DEFINE_UTF16_TO_UTF16(E) \ -static void PTRCALL \ -E ## toUtf16(const ENCODING *enc, \ - const char **fromP, const char *fromLim, \ - unsigned short **toP, const unsigned short *toLim) \ -{ \ - /* Avoid copying first half only of surrogate */ \ - if (fromLim - *fromP > ((toLim - *toP) << 1) \ - && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) \ - fromLim -= 2; \ - for (; *fromP != fromLim && *toP != toLim; *fromP += 2) \ - *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \ -} - -#define SET2(ptr, ch) \ - (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8))) -#define GET_LO(ptr) ((unsigned char)(ptr)[0]) -#define GET_HI(ptr) ((unsigned char)(ptr)[1]) - -DEFINE_UTF16_TO_UTF8(little2_) -DEFINE_UTF16_TO_UTF16(little2_) - -#undef SET2 -#undef GET_LO -#undef GET_HI - -#define SET2(ptr, ch) \ - (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch) & 0xFF))) -#define GET_LO(ptr) ((unsigned char)(ptr)[1]) -#define GET_HI(ptr) ((unsigned char)(ptr)[0]) - -DEFINE_UTF16_TO_UTF8(big2_) -DEFINE_UTF16_TO_UTF16(big2_) - -#undef SET2 -#undef GET_LO -#undef GET_HI - -#define LITTLE2_BYTE_TYPE(enc, p) \ - ((p)[1] == 0 \ - ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \ - : unicode_byte_type((p)[1], (p)[0])) -#define LITTLE2_BYTE_TO_ASCII(enc, p) ((p)[1] == 0 ? (p)[0] : -1) -#define LITTLE2_CHAR_MATCHES(enc, p, c) ((p)[1] == 0 && (p)[0] == c) -#define LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) \ - UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0]) -#define LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ - UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[1], (unsigned char)p[0]) - -#ifdef XML_MIN_SIZE - -static int PTRFASTCALL -little2_byteType(const ENCODING *enc, const char *p) -{ - return LITTLE2_BYTE_TYPE(enc, p); -} - -static int PTRFASTCALL -little2_byteToAscii(const ENCODING *enc, const char *p) -{ - return LITTLE2_BYTE_TO_ASCII(enc, p); -} - -static int PTRCALL -little2_charMatches(const ENCODING *enc, const char *p, int c) -{ - return LITTLE2_CHAR_MATCHES(enc, p, c); -} - -static int PTRFASTCALL -little2_isNameMin(const ENCODING *enc, const char *p) -{ - return LITTLE2_IS_NAME_CHAR_MINBPC(enc, p); -} - -static int PTRFASTCALL -little2_isNmstrtMin(const ENCODING *enc, const char *p) -{ - return LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p); -} - -#undef VTABLE -#define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16 - -#else /* not XML_MIN_SIZE */ - -#undef PREFIX -#define PREFIX(ident) little2_ ## ident -#define MINBPC(enc) 2 -/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ -#define BYTE_TYPE(enc, p) LITTLE2_BYTE_TYPE(enc, p) -#define BYTE_TO_ASCII(enc, p) LITTLE2_BYTE_TO_ASCII(enc, p) -#define CHAR_MATCHES(enc, p, c) LITTLE2_CHAR_MATCHES(enc, p, c) -#define IS_NAME_CHAR(enc, p, n) 0 -#define IS_NAME_CHAR_MINBPC(enc, p) LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) -#define IS_NMSTRT_CHAR(enc, p, n) (0) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) - -#define XML_TOK_IMPL_C -#include "xmltok_impl.c" -#undef XML_TOK_IMPL_C - -#undef MINBPC -#undef BYTE_TYPE -#undef BYTE_TO_ASCII -#undef CHAR_MATCHES -#undef IS_NAME_CHAR -#undef IS_NAME_CHAR_MINBPC -#undef IS_NMSTRT_CHAR -#undef IS_NMSTRT_CHAR_MINBPC -#undef IS_INVALID_CHAR - -#endif /* not XML_MIN_SIZE */ - -#ifdef XML_NS - -static const struct normal_encoding little2_encoding_ns = { - { VTABLE, 2, 0, -#if BYTEORDER == 1234 - 1 -#else - 0 -#endif - }, - { -#include "asciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(little2_) -}; - -#endif - -static const struct normal_encoding little2_encoding = { - { VTABLE, 2, 0, -#if BYTEORDER == 1234 - 1 -#else - 0 -#endif - }, - { -#define BT_COLON BT_NMSTRT -#include "asciitab.h" -#undef BT_COLON -#include "latin1tab.h" - }, - STANDARD_VTABLE(little2_) -}; - -#if BYTEORDER != 4321 - -#ifdef XML_NS - -static const struct normal_encoding internal_little2_encoding_ns = { - { VTABLE, 2, 0, 1 }, - { -#include "iasciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(little2_) -}; - -#endif - -static const struct normal_encoding internal_little2_encoding = { - { VTABLE, 2, 0, 1 }, - { -#define BT_COLON BT_NMSTRT -#include "iasciitab.h" -#undef BT_COLON -#include "latin1tab.h" - }, - STANDARD_VTABLE(little2_) -}; - -#endif - - -#define BIG2_BYTE_TYPE(enc, p) \ - ((p)[0] == 0 \ - ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \ - : unicode_byte_type((p)[0], (p)[1])) -#define BIG2_BYTE_TO_ASCII(enc, p) ((p)[0] == 0 ? (p)[1] : -1) -#define BIG2_CHAR_MATCHES(enc, p, c) ((p)[0] == 0 && (p)[1] == c) -#define BIG2_IS_NAME_CHAR_MINBPC(enc, p) \ - UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1]) -#define BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ - UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[0], (unsigned char)p[1]) - -#ifdef XML_MIN_SIZE - -static int PTRFASTCALL -big2_byteType(const ENCODING *enc, const char *p) -{ - return BIG2_BYTE_TYPE(enc, p); -} - -static int PTRFASTCALL -big2_byteToAscii(const ENCODING *enc, const char *p) -{ - return BIG2_BYTE_TO_ASCII(enc, p); -} - -static int PTRCALL -big2_charMatches(const ENCODING *enc, const char *p, int c) -{ - return BIG2_CHAR_MATCHES(enc, p, c); -} - -static int PTRFASTCALL -big2_isNameMin(const ENCODING *enc, const char *p) -{ - return BIG2_IS_NAME_CHAR_MINBPC(enc, p); -} - -static int PTRFASTCALL -big2_isNmstrtMin(const ENCODING *enc, const char *p) -{ - return BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p); -} - -#undef VTABLE -#define VTABLE VTABLE1, big2_toUtf8, big2_toUtf16 - -#else /* not XML_MIN_SIZE */ - -#undef PREFIX -#define PREFIX(ident) big2_ ## ident -#define MINBPC(enc) 2 -/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ -#define BYTE_TYPE(enc, p) BIG2_BYTE_TYPE(enc, p) -#define BYTE_TO_ASCII(enc, p) BIG2_BYTE_TO_ASCII(enc, p) -#define CHAR_MATCHES(enc, p, c) BIG2_CHAR_MATCHES(enc, p, c) -#define IS_NAME_CHAR(enc, p, n) 0 -#define IS_NAME_CHAR_MINBPC(enc, p) BIG2_IS_NAME_CHAR_MINBPC(enc, p) -#define IS_NMSTRT_CHAR(enc, p, n) (0) -#define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) - -#define XML_TOK_IMPL_C -#include "xmltok_impl.c" -#undef XML_TOK_IMPL_C - -#undef MINBPC -#undef BYTE_TYPE -#undef BYTE_TO_ASCII -#undef CHAR_MATCHES -#undef IS_NAME_CHAR -#undef IS_NAME_CHAR_MINBPC -#undef IS_NMSTRT_CHAR -#undef IS_NMSTRT_CHAR_MINBPC -#undef IS_INVALID_CHAR - -#endif /* not XML_MIN_SIZE */ - -#ifdef XML_NS - -static const struct normal_encoding big2_encoding_ns = { - { VTABLE, 2, 0, -#if BYTEORDER == 4321 - 1 -#else - 0 -#endif - }, - { -#include "asciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(big2_) -}; - -#endif - -static const struct normal_encoding big2_encoding = { - { VTABLE, 2, 0, -#if BYTEORDER == 4321 - 1 -#else - 0 -#endif - }, - { -#define BT_COLON BT_NMSTRT -#include "asciitab.h" -#undef BT_COLON -#include "latin1tab.h" - }, - STANDARD_VTABLE(big2_) -}; - -#if BYTEORDER != 1234 - -#ifdef XML_NS - -static const struct normal_encoding internal_big2_encoding_ns = { - { VTABLE, 2, 0, 1 }, - { -#include "iasciitab.h" -#include "latin1tab.h" - }, - STANDARD_VTABLE(big2_) -}; - -#endif - -static const struct normal_encoding internal_big2_encoding = { - { VTABLE, 2, 0, 1 }, - { -#define BT_COLON BT_NMSTRT -#include "iasciitab.h" -#undef BT_COLON -#include "latin1tab.h" - }, - STANDARD_VTABLE(big2_) -}; - -#endif - -#undef PREFIX - -static int FASTCALL -streqci(const char *s1, const char *s2) -{ - for (;;) { - char c1 = *s1++; - char c2 = *s2++; - if (ASCII_a <= c1 && c1 <= ASCII_z) - c1 += ASCII_A - ASCII_a; - if (ASCII_a <= c2 && c2 <= ASCII_z) - c2 += ASCII_A - ASCII_a; - if (c1 != c2) - return 0; - if (!c1) - break; - } - return 1; -} - -static void PTRCALL -initUpdatePosition(const ENCODING *enc, const char *ptr, - const char *end, POSITION *pos) -{ - normal_updatePosition(&utf8_encoding.enc, ptr, end, pos); -} - -static int -toAscii(const ENCODING *enc, const char *ptr, const char *end) -{ - char buf[1]; - char *p = buf; - XmlUtf8Convert(enc, &ptr, end, &p, p + 1); - if (p == buf) - return -1; - else - return buf[0]; -} - -static int FASTCALL -isSpace(int c) -{ - switch (c) { - case 0x20: - case 0xD: - case 0xA: - case 0x9: - return 1; - } - return 0; -} - -/* Return 1 if there's just optional white space or there's an S - followed by name=val. -*/ -static int -parsePseudoAttribute(const ENCODING *enc, - const char *ptr, - const char *end, - const char **namePtr, - const char **nameEndPtr, - const char **valPtr, - const char **nextTokPtr) -{ - int c; - char open; - if (ptr == end) { - *namePtr = NULL; - return 1; - } - if (!isSpace(toAscii(enc, ptr, end))) { - *nextTokPtr = ptr; - return 0; - } - do { - ptr += enc->minBytesPerChar; - } while (isSpace(toAscii(enc, ptr, end))); - if (ptr == end) { - *namePtr = NULL; - return 1; - } - *namePtr = ptr; - for (;;) { - c = toAscii(enc, ptr, end); - if (c == -1) { - *nextTokPtr = ptr; - return 0; - } - if (c == ASCII_EQUALS) { - *nameEndPtr = ptr; - break; - } - if (isSpace(c)) { - *nameEndPtr = ptr; - do { - ptr += enc->minBytesPerChar; - } while (isSpace(c = toAscii(enc, ptr, end))); - if (c != ASCII_EQUALS) { - *nextTokPtr = ptr; - return 0; - } - break; - } - ptr += enc->minBytesPerChar; - } - if (ptr == *namePtr) { - *nextTokPtr = ptr; - return 0; - } - ptr += enc->minBytesPerChar; - c = toAscii(enc, ptr, end); - while (isSpace(c)) { - ptr += enc->minBytesPerChar; - c = toAscii(enc, ptr, end); - } - if (c != ASCII_QUOT && c != ASCII_APOS) { - *nextTokPtr = ptr; - return 0; - } - open = (char)c; - ptr += enc->minBytesPerChar; - *valPtr = ptr; - for (;; ptr += enc->minBytesPerChar) { - c = toAscii(enc, ptr, end); - if (c == open) - break; - if (!(ASCII_a <= c && c <= ASCII_z) - && !(ASCII_A <= c && c <= ASCII_Z) - && !(ASCII_0 <= c && c <= ASCII_9) - && c != ASCII_PERIOD - && c != ASCII_MINUS - && c != ASCII_UNDERSCORE) { - *nextTokPtr = ptr; - return 0; - } - } - *nextTokPtr = ptr + enc->minBytesPerChar; - return 1; -} - -static const char KW_version[] = { - ASCII_v, ASCII_e, ASCII_r, ASCII_s, ASCII_i, ASCII_o, ASCII_n, '\0' -}; - -static const char KW_encoding[] = { - ASCII_e, ASCII_n, ASCII_c, ASCII_o, ASCII_d, ASCII_i, ASCII_n, ASCII_g, '\0' -}; - -static const char KW_standalone[] = { - ASCII_s, ASCII_t, ASCII_a, ASCII_n, ASCII_d, ASCII_a, ASCII_l, ASCII_o, - ASCII_n, ASCII_e, '\0' -}; - -static const char KW_yes[] = { - ASCII_y, ASCII_e, ASCII_s, '\0' -}; - -static const char KW_no[] = { - ASCII_n, ASCII_o, '\0' -}; - -static int -doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *, - const char *, - const char *), - int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingName, - const ENCODING **encoding, - int *standalone) -{ - const char *val = NULL; - const char *name = NULL; - const char *nameEnd = NULL; - ptr += 5 * enc->minBytesPerChar; - end -= 2 * enc->minBytesPerChar; - if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr) - || !name) { - *badPtr = ptr; - return 0; - } - if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_version)) { - if (!isGeneralTextEntity) { - *badPtr = name; - return 0; - } - } - else { - if (versionPtr) - *versionPtr = val; - if (versionEndPtr) - *versionEndPtr = ptr; - if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { - *badPtr = ptr; - return 0; - } - if (!name) { - if (isGeneralTextEntity) { - /* a TextDecl must have an EncodingDecl */ - *badPtr = ptr; - return 0; - } - return 1; - } - } - if (XmlNameMatchesAscii(enc, name, nameEnd, KW_encoding)) { - int c = toAscii(enc, val, end); - if (!(ASCII_a <= c && c <= ASCII_z) && !(ASCII_A <= c && c <= ASCII_Z)) { - *badPtr = val; - return 0; - } - if (encodingName) - *encodingName = val; - if (encoding) - *encoding = encodingFinder(enc, val, ptr - enc->minBytesPerChar); - if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { - *badPtr = ptr; - return 0; - } - if (!name) - return 1; - } - if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_standalone) - || isGeneralTextEntity) { - *badPtr = name; - return 0; - } - if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_yes)) { - if (standalone) - *standalone = 1; - } - else if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_no)) { - if (standalone) - *standalone = 0; - } - else { - *badPtr = val; - return 0; - } - while (isSpace(toAscii(enc, ptr, end))) - ptr += enc->minBytesPerChar; - if (ptr != end) { - *badPtr = ptr; - return 0; - } - return 1; -} - -static int FASTCALL -checkCharRefNumber(int result) -{ - switch (result >> 8) { - case 0xD8: case 0xD9: case 0xDA: case 0xDB: - case 0xDC: case 0xDD: case 0xDE: case 0xDF: - return -1; - case 0: - if (latin1_encoding.type[result] == BT_NONXML) - return -1; - break; - case 0xFF: - if (result == 0xFFFE || result == 0xFFFF) - return -1; - break; - } - return result; -} - -int FASTCALL -XmlUtf8Encode(int c, char *buf) -{ - enum { - /* minN is minimum legal resulting value for N byte sequence */ - min2 = 0x80, - min3 = 0x800, - min4 = 0x10000 - }; - - if (c < 0) - return 0; - if (c < min2) { - buf[0] = (char)(c | UTF8_cval1); - return 1; - } - if (c < min3) { - buf[0] = (char)((c >> 6) | UTF8_cval2); - buf[1] = (char)((c & 0x3f) | 0x80); - return 2; - } - if (c < min4) { - buf[0] = (char)((c >> 12) | UTF8_cval3); - buf[1] = (char)(((c >> 6) & 0x3f) | 0x80); - buf[2] = (char)((c & 0x3f) | 0x80); - return 3; - } - if (c < 0x110000) { - buf[0] = (char)((c >> 18) | UTF8_cval4); - buf[1] = (char)(((c >> 12) & 0x3f) | 0x80); - buf[2] = (char)(((c >> 6) & 0x3f) | 0x80); - buf[3] = (char)((c & 0x3f) | 0x80); - return 4; - } - return 0; -} - -int FASTCALL -XmlUtf16Encode(int charNum, unsigned short *buf) -{ - if (charNum < 0) - return 0; - if (charNum < 0x10000) { - buf[0] = (unsigned short)charNum; - return 1; - } - if (charNum < 0x110000) { - charNum -= 0x10000; - buf[0] = (unsigned short)((charNum >> 10) + 0xD800); - buf[1] = (unsigned short)((charNum & 0x3FF) + 0xDC00); - return 2; - } - return 0; -} - -struct unknown_encoding { - struct normal_encoding normal; - CONVERTER convert; - void *userData; - unsigned short utf16[256]; - char utf8[256][4]; -}; - -#define AS_UNKNOWN_ENCODING(enc) ((const struct unknown_encoding *) (enc)) - -int -XmlSizeOfUnknownEncoding(void) -{ - return sizeof(struct unknown_encoding); -} - -static int PTRFASTCALL -unknown_isName(const ENCODING *enc, const char *p) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - int c = uenc->convert(uenc->userData, p); - if (c & ~0xFFFF) - return 0; - return UCS2_GET_NAMING(namePages, c >> 8, c & 0xFF); -} - -static int PTRFASTCALL -unknown_isNmstrt(const ENCODING *enc, const char *p) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - int c = uenc->convert(uenc->userData, p); - if (c & ~0xFFFF) - return 0; - return UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xFF); -} - -static int PTRFASTCALL -unknown_isInvalid(const ENCODING *enc, const char *p) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - int c = uenc->convert(uenc->userData, p); - return (c & ~0xFFFF) || checkCharRefNumber(c) < 0; -} - -static void PTRCALL -unknown_toUtf8(const ENCODING *enc, - const char **fromP, const char *fromLim, - char **toP, const char *toLim) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - char buf[XML_UTF8_ENCODE_MAX]; - for (;;) { - const char *utf8; - int n; - if (*fromP == fromLim) - break; - utf8 = uenc->utf8[(unsigned char)**fromP]; - n = *utf8++; - if (n == 0) { - int c = uenc->convert(uenc->userData, *fromP); - n = XmlUtf8Encode(c, buf); - if (n > toLim - *toP) - break; - utf8 = buf; - *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] - - (BT_LEAD2 - 2)); - } - else { - if (n > toLim - *toP) - break; - (*fromP)++; - } - do { - *(*toP)++ = *utf8++; - } while (--n != 0); - } -} - -static void PTRCALL -unknown_toUtf16(const ENCODING *enc, - const char **fromP, const char *fromLim, - unsigned short **toP, const unsigned short *toLim) -{ - const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); - while (*fromP != fromLim && *toP != toLim) { - unsigned short c = uenc->utf16[(unsigned char)**fromP]; - if (c == 0) { - c = (unsigned short) - uenc->convert(uenc->userData, *fromP); - *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] - - (BT_LEAD2 - 2)); - } - else - (*fromP)++; - *(*toP)++ = c; - } -} - -ENCODING * -XmlInitUnknownEncoding(void *mem, - int *table, - CONVERTER convert, - void *userData) -{ - int i; - struct unknown_encoding *e = (struct unknown_encoding *)mem; - for (i = 0; i < (int)sizeof(struct normal_encoding); i++) - ((char *)mem)[i] = ((char *)&latin1_encoding)[i]; - for (i = 0; i < 128; i++) - if (latin1_encoding.type[i] != BT_OTHER - && latin1_encoding.type[i] != BT_NONXML - && table[i] != i) - return 0; - for (i = 0; i < 256; i++) { - int c = table[i]; - if (c == -1) { - e->normal.type[i] = BT_MALFORM; - /* This shouldn't really get used. */ - e->utf16[i] = 0xFFFF; - e->utf8[i][0] = 1; - e->utf8[i][1] = 0; - } - else if (c < 0) { - if (c < -4) - return 0; - e->normal.type[i] = (unsigned char)(BT_LEAD2 - (c + 2)); - e->utf8[i][0] = 0; - e->utf16[i] = 0; - } - else if (c < 0x80) { - if (latin1_encoding.type[c] != BT_OTHER - && latin1_encoding.type[c] != BT_NONXML - && c != i) - return 0; - e->normal.type[i] = latin1_encoding.type[c]; - e->utf8[i][0] = 1; - e->utf8[i][1] = (char)c; - e->utf16[i] = (unsigned short)(c == 0 ? 0xFFFF : c); - } - else if (checkCharRefNumber(c) < 0) { - e->normal.type[i] = BT_NONXML; - /* This shouldn't really get used. */ - e->utf16[i] = 0xFFFF; - e->utf8[i][0] = 1; - e->utf8[i][1] = 0; - } - else { - if (c > 0xFFFF) - return 0; - if (UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xff)) - e->normal.type[i] = BT_NMSTRT; - else if (UCS2_GET_NAMING(namePages, c >> 8, c & 0xff)) - e->normal.type[i] = BT_NAME; - else - e->normal.type[i] = BT_OTHER; - e->utf8[i][0] = (char)XmlUtf8Encode(c, e->utf8[i] + 1); - e->utf16[i] = (unsigned short)c; - } - } - e->userData = userData; - e->convert = convert; - if (convert) { - e->normal.isName2 = unknown_isName; - e->normal.isName3 = unknown_isName; - e->normal.isName4 = unknown_isName; - e->normal.isNmstrt2 = unknown_isNmstrt; - e->normal.isNmstrt3 = unknown_isNmstrt; - e->normal.isNmstrt4 = unknown_isNmstrt; - e->normal.isInvalid2 = unknown_isInvalid; - e->normal.isInvalid3 = unknown_isInvalid; - e->normal.isInvalid4 = unknown_isInvalid; - } - e->normal.enc.utf8Convert = unknown_toUtf8; - e->normal.enc.utf16Convert = unknown_toUtf16; - return &(e->normal.enc); -} - -/* If this enumeration is changed, getEncodingIndex and encodings -must also be changed. */ -enum { - UNKNOWN_ENC = -1, - ISO_8859_1_ENC = 0, - US_ASCII_ENC, - UTF_8_ENC, - UTF_16_ENC, - UTF_16BE_ENC, - UTF_16LE_ENC, - /* must match encodingNames up to here */ - NO_ENC -}; - -static const char KW_ISO_8859_1[] = { - ASCII_I, ASCII_S, ASCII_O, ASCII_MINUS, ASCII_8, ASCII_8, ASCII_5, ASCII_9, - ASCII_MINUS, ASCII_1, '\0' -}; -static const char KW_US_ASCII[] = { - ASCII_U, ASCII_S, ASCII_MINUS, ASCII_A, ASCII_S, ASCII_C, ASCII_I, ASCII_I, - '\0' -}; -static const char KW_UTF_8[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_8, '\0' -}; -static const char KW_UTF_16[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, '\0' -}; -static const char KW_UTF_16BE[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_B, ASCII_E, - '\0' -}; -static const char KW_UTF_16LE[] = { - ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_L, ASCII_E, - '\0' -}; - -static int FASTCALL -getEncodingIndex(const char *name) -{ - static const char * const encodingNames[] = { - KW_ISO_8859_1, - KW_US_ASCII, - KW_UTF_8, - KW_UTF_16, - KW_UTF_16BE, - KW_UTF_16LE, - }; - int i; - if (name == NULL) - return NO_ENC; - for (i = 0; i < (int)(sizeof(encodingNames)/sizeof(encodingNames[0])); i++) - if (streqci(name, encodingNames[i])) - return i; - return UNKNOWN_ENC; -} - -/* For binary compatibility, we store the index of the encoding - specified at initialization in the isUtf16 member. -*/ - -#define INIT_ENC_INDEX(enc) ((int)(enc)->initEnc.isUtf16) -#define SET_INIT_ENC_INDEX(enc, i) ((enc)->initEnc.isUtf16 = (char)i) - -/* This is what detects the encoding. encodingTable maps from - encoding indices to encodings; INIT_ENC_INDEX(enc) is the index of - the external (protocol) specified encoding; state is - XML_CONTENT_STATE if we're parsing an external text entity, and - XML_PROLOG_STATE otherwise. -*/ - - -static int -initScan(const ENCODING * const *encodingTable, - const INIT_ENCODING *enc, - int state, - const char *ptr, - const char *end, - const char **nextTokPtr) -{ - const ENCODING **encPtr; - - if (ptr == end) - return XML_TOK_NONE; - encPtr = enc->encPtr; - if (ptr + 1 == end) { - /* only a single byte available for auto-detection */ -#ifndef XML_DTD /* FIXME */ - /* a well-formed document entity must have more than one byte */ - if (state != XML_CONTENT_STATE) - return XML_TOK_PARTIAL; -#endif - /* so we're parsing an external text entity... */ - /* if UTF-16 was externally specified, then we need at least 2 bytes */ - switch (INIT_ENC_INDEX(enc)) { - case UTF_16_ENC: - case UTF_16LE_ENC: - case UTF_16BE_ENC: - return XML_TOK_PARTIAL; - } - switch ((unsigned char)*ptr) { - case 0xFE: - case 0xFF: - case 0xEF: /* possibly first byte of UTF-8 BOM */ - if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC - && state == XML_CONTENT_STATE) - break; - /* fall through */ - case 0x00: - case 0x3C: - return XML_TOK_PARTIAL; - } - } - else { - switch (((unsigned char)ptr[0] << 8) | (unsigned char)ptr[1]) { - case 0xFEFF: - if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC - && state == XML_CONTENT_STATE) - break; - *nextTokPtr = ptr + 2; - *encPtr = encodingTable[UTF_16BE_ENC]; - return XML_TOK_BOM; - /* 00 3C is handled in the default case */ - case 0x3C00: - if ((INIT_ENC_INDEX(enc) == UTF_16BE_ENC - || INIT_ENC_INDEX(enc) == UTF_16_ENC) - && state == XML_CONTENT_STATE) - break; - *encPtr = encodingTable[UTF_16LE_ENC]; - return XmlTok(*encPtr, state, ptr, end, nextTokPtr); - case 0xFFFE: - if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC - && state == XML_CONTENT_STATE) - break; - *nextTokPtr = ptr + 2; - *encPtr = encodingTable[UTF_16LE_ENC]; - return XML_TOK_BOM; - case 0xEFBB: - /* Maybe a UTF-8 BOM (EF BB BF) */ - /* If there's an explicitly specified (external) encoding - of ISO-8859-1 or some flavour of UTF-16 - and this is an external text entity, - don't look for the BOM, - because it might be a legal data. - */ - if (state == XML_CONTENT_STATE) { - int e = INIT_ENC_INDEX(enc); - if (e == ISO_8859_1_ENC || e == UTF_16BE_ENC - || e == UTF_16LE_ENC || e == UTF_16_ENC) - break; - } - if (ptr + 2 == end) - return XML_TOK_PARTIAL; - if ((unsigned char)ptr[2] == 0xBF) { - *nextTokPtr = ptr + 3; - *encPtr = encodingTable[UTF_8_ENC]; - return XML_TOK_BOM; - } - break; - default: - if (ptr[0] == '\0') { - /* 0 isn't a legal data character. Furthermore a document - entity can only start with ASCII characters. So the only - way this can fail to be big-endian UTF-16 if it it's an - external parsed general entity that's labelled as - UTF-16LE. - */ - if (state == XML_CONTENT_STATE && INIT_ENC_INDEX(enc) == UTF_16LE_ENC) - break; - *encPtr = encodingTable[UTF_16BE_ENC]; - return XmlTok(*encPtr, state, ptr, end, nextTokPtr); - } - else if (ptr[1] == '\0') { - /* We could recover here in the case: - - parsing an external entity - - second byte is 0 - - no externally specified encoding - - no encoding declaration - by assuming UTF-16LE. But we don't, because this would mean when - presented just with a single byte, we couldn't reliably determine - whether we needed further bytes. - */ - if (state == XML_CONTENT_STATE) - break; - *encPtr = encodingTable[UTF_16LE_ENC]; - return XmlTok(*encPtr, state, ptr, end, nextTokPtr); - } - break; - } - } - *encPtr = encodingTable[INIT_ENC_INDEX(enc)]; - return XmlTok(*encPtr, state, ptr, end, nextTokPtr); -} - - -#define NS(x) x -#define ns(x) x -#define XML_TOK_NS_C -#include "xmltok_ns.c" -#undef XML_TOK_NS_C -#undef NS -#undef ns - -#ifdef XML_NS - -#define NS(x) x ## NS -#define ns(x) x ## _ns - -#define XML_TOK_NS_C -#include "xmltok_ns.c" -#undef XML_TOK_NS_C - -#undef NS -#undef ns - -ENCODING * -XmlInitUnknownEncodingNS(void *mem, - int *table, - CONVERTER convert, - void *userData) -{ - ENCODING *enc = XmlInitUnknownEncoding(mem, table, convert, userData); - if (enc) - ((struct normal_encoding *)enc)->type[ASCII_COLON] = BT_COLON; - return enc; -} - -#endif /* XML_NS */ diff --git a/3rdParty/Expat/src/xmltok.h b/3rdParty/Expat/src/xmltok.h deleted file mode 100755 index ca867aa..0000000 --- a/3rdParty/Expat/src/xmltok.h +++ /dev/null @@ -1,316 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -#ifndef XmlTok_INCLUDED -#define XmlTok_INCLUDED 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* The following token may be returned by XmlContentTok */ -#define XML_TOK_TRAILING_RSQB -5 /* ] or ]] at the end of the scan; might be - start of illegal ]]> sequence */ -/* The following tokens may be returned by both XmlPrologTok and - XmlContentTok. -*/ -#define XML_TOK_NONE -4 /* The string to be scanned is empty */ -#define XML_TOK_TRAILING_CR -3 /* A CR at the end of the scan; - might be part of CRLF sequence */ -#define XML_TOK_PARTIAL_CHAR -2 /* only part of a multibyte sequence */ -#define XML_TOK_PARTIAL -1 /* only part of a token */ -#define XML_TOK_INVALID 0 - -/* The following tokens are returned by XmlContentTok; some are also - returned by XmlAttributeValueTok, XmlEntityTok, XmlCdataSectionTok. -*/ -#define XML_TOK_START_TAG_WITH_ATTS 1 -#define XML_TOK_START_TAG_NO_ATTS 2 -#define XML_TOK_EMPTY_ELEMENT_WITH_ATTS 3 /* empty element tag <e/> */ -#define XML_TOK_EMPTY_ELEMENT_NO_ATTS 4 -#define XML_TOK_END_TAG 5 -#define XML_TOK_DATA_CHARS 6 -#define XML_TOK_DATA_NEWLINE 7 -#define XML_TOK_CDATA_SECT_OPEN 8 -#define XML_TOK_ENTITY_REF 9 -#define XML_TOK_CHAR_REF 10 /* numeric character reference */ - -/* The following tokens may be returned by both XmlPrologTok and - XmlContentTok. -*/ -#define XML_TOK_PI 11 /* processing instruction */ -#define XML_TOK_XML_DECL 12 /* XML decl or text decl */ -#define XML_TOK_COMMENT 13 -#define XML_TOK_BOM 14 /* Byte order mark */ - -/* The following tokens are returned only by XmlPrologTok */ -#define XML_TOK_PROLOG_S 15 -#define XML_TOK_DECL_OPEN 16 /* <!foo */ -#define XML_TOK_DECL_CLOSE 17 /* > */ -#define XML_TOK_NAME 18 -#define XML_TOK_NMTOKEN 19 -#define XML_TOK_POUND_NAME 20 /* #name */ -#define XML_TOK_OR 21 /* | */ -#define XML_TOK_PERCENT 22 -#define XML_TOK_OPEN_PAREN 23 -#define XML_TOK_CLOSE_PAREN 24 -#define XML_TOK_OPEN_BRACKET 25 -#define XML_TOK_CLOSE_BRACKET 26 -#define XML_TOK_LITERAL 27 -#define XML_TOK_PARAM_ENTITY_REF 28 -#define XML_TOK_INSTANCE_START 29 - -/* The following occur only in element type declarations */ -#define XML_TOK_NAME_QUESTION 30 /* name? */ -#define XML_TOK_NAME_ASTERISK 31 /* name* */ -#define XML_TOK_NAME_PLUS 32 /* name+ */ -#define XML_TOK_COND_SECT_OPEN 33 /* <![ */ -#define XML_TOK_COND_SECT_CLOSE 34 /* ]]> */ -#define XML_TOK_CLOSE_PAREN_QUESTION 35 /* )? */ -#define XML_TOK_CLOSE_PAREN_ASTERISK 36 /* )* */ -#define XML_TOK_CLOSE_PAREN_PLUS 37 /* )+ */ -#define XML_TOK_COMMA 38 - -/* The following token is returned only by XmlAttributeValueTok */ -#define XML_TOK_ATTRIBUTE_VALUE_S 39 - -/* The following token is returned only by XmlCdataSectionTok */ -#define XML_TOK_CDATA_SECT_CLOSE 40 - -/* With namespace processing this is returned by XmlPrologTok for a - name with a colon. -*/ -#define XML_TOK_PREFIXED_NAME 41 - -#ifdef XML_DTD -#define XML_TOK_IGNORE_SECT 42 -#endif /* XML_DTD */ - -#ifdef XML_DTD -#define XML_N_STATES 4 -#else /* not XML_DTD */ -#define XML_N_STATES 3 -#endif /* not XML_DTD */ - -#define XML_PROLOG_STATE 0 -#define XML_CONTENT_STATE 1 -#define XML_CDATA_SECTION_STATE 2 -#ifdef XML_DTD -#define XML_IGNORE_SECTION_STATE 3 -#endif /* XML_DTD */ - -#define XML_N_LITERAL_TYPES 2 -#define XML_ATTRIBUTE_VALUE_LITERAL 0 -#define XML_ENTITY_VALUE_LITERAL 1 - -/* The size of the buffer passed to XmlUtf8Encode must be at least this. */ -#define XML_UTF8_ENCODE_MAX 4 -/* The size of the buffer passed to XmlUtf16Encode must be at least this. */ -#define XML_UTF16_ENCODE_MAX 2 - -typedef struct position { - /* first line and first column are 0 not 1 */ - XML_Size lineNumber; - XML_Size columnNumber; -} POSITION; - -typedef struct { - const char *name; - const char *valuePtr; - const char *valueEnd; - char normalized; -} ATTRIBUTE; - -struct encoding; -typedef struct encoding ENCODING; - -typedef int (PTRCALL *SCANNER)(const ENCODING *, - const char *, - const char *, - const char **); - -struct encoding { - SCANNER scanners[XML_N_STATES]; - SCANNER literalScanners[XML_N_LITERAL_TYPES]; - int (PTRCALL *sameName)(const ENCODING *, - const char *, - const char *); - int (PTRCALL *nameMatchesAscii)(const ENCODING *, - const char *, - const char *, - const char *); - int (PTRFASTCALL *nameLength)(const ENCODING *, const char *); - const char *(PTRFASTCALL *skipS)(const ENCODING *, const char *); - int (PTRCALL *getAtts)(const ENCODING *enc, - const char *ptr, - int attsMax, - ATTRIBUTE *atts); - int (PTRFASTCALL *charRefNumber)(const ENCODING *enc, const char *ptr); - int (PTRCALL *predefinedEntityName)(const ENCODING *, - const char *, - const char *); - void (PTRCALL *updatePosition)(const ENCODING *, - const char *ptr, - const char *end, - POSITION *); - int (PTRCALL *isPublicId)(const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr); - void (PTRCALL *utf8Convert)(const ENCODING *enc, - const char **fromP, - const char *fromLim, - char **toP, - const char *toLim); - void (PTRCALL *utf16Convert)(const ENCODING *enc, - const char **fromP, - const char *fromLim, - unsigned short **toP, - const unsigned short *toLim); - int minBytesPerChar; - char isUtf8; - char isUtf16; -}; - -/* Scan the string starting at ptr until the end of the next complete - token, but do not scan past eptr. Return an integer giving the - type of token. - - Return XML_TOK_NONE when ptr == eptr; nextTokPtr will not be set. - - Return XML_TOK_PARTIAL when the string does not contain a complete - token; nextTokPtr will not be set. - - Return XML_TOK_INVALID when the string does not start a valid - token; nextTokPtr will be set to point to the character which made - the token invalid. - - Otherwise the string starts with a valid token; nextTokPtr will be - set to point to the character following the end of that token. - - Each data character counts as a single token, but adjacent data - characters may be returned together. Similarly for characters in - the prolog outside literals, comments and processing instructions. -*/ - - -#define XmlTok(enc, state, ptr, end, nextTokPtr) \ - (((enc)->scanners[state])(enc, ptr, end, nextTokPtr)) - -#define XmlPrologTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_PROLOG_STATE, ptr, end, nextTokPtr) - -#define XmlContentTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_CONTENT_STATE, ptr, end, nextTokPtr) - -#define XmlCdataSectionTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_CDATA_SECTION_STATE, ptr, end, nextTokPtr) - -#ifdef XML_DTD - -#define XmlIgnoreSectionTok(enc, ptr, end, nextTokPtr) \ - XmlTok(enc, XML_IGNORE_SECTION_STATE, ptr, end, nextTokPtr) - -#endif /* XML_DTD */ - -/* This is used for performing a 2nd-level tokenization on the content - of a literal that has already been returned by XmlTok. -*/ -#define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \ - (((enc)->literalScanners[literalType])(enc, ptr, end, nextTokPtr)) - -#define XmlAttributeValueTok(enc, ptr, end, nextTokPtr) \ - XmlLiteralTok(enc, XML_ATTRIBUTE_VALUE_LITERAL, ptr, end, nextTokPtr) - -#define XmlEntityValueTok(enc, ptr, end, nextTokPtr) \ - XmlLiteralTok(enc, XML_ENTITY_VALUE_LITERAL, ptr, end, nextTokPtr) - -#define XmlSameName(enc, ptr1, ptr2) (((enc)->sameName)(enc, ptr1, ptr2)) - -#define XmlNameMatchesAscii(enc, ptr1, end1, ptr2) \ - (((enc)->nameMatchesAscii)(enc, ptr1, end1, ptr2)) - -#define XmlNameLength(enc, ptr) \ - (((enc)->nameLength)(enc, ptr)) - -#define XmlSkipS(enc, ptr) \ - (((enc)->skipS)(enc, ptr)) - -#define XmlGetAttributes(enc, ptr, attsMax, atts) \ - (((enc)->getAtts)(enc, ptr, attsMax, atts)) - -#define XmlCharRefNumber(enc, ptr) \ - (((enc)->charRefNumber)(enc, ptr)) - -#define XmlPredefinedEntityName(enc, ptr, end) \ - (((enc)->predefinedEntityName)(enc, ptr, end)) - -#define XmlUpdatePosition(enc, ptr, end, pos) \ - (((enc)->updatePosition)(enc, ptr, end, pos)) - -#define XmlIsPublicId(enc, ptr, end, badPtr) \ - (((enc)->isPublicId)(enc, ptr, end, badPtr)) - -#define XmlUtf8Convert(enc, fromP, fromLim, toP, toLim) \ - (((enc)->utf8Convert)(enc, fromP, fromLim, toP, toLim)) - -#define XmlUtf16Convert(enc, fromP, fromLim, toP, toLim) \ - (((enc)->utf16Convert)(enc, fromP, fromLim, toP, toLim)) - -typedef struct { - ENCODING initEnc; - const ENCODING **encPtr; -} INIT_ENCODING; - -int XmlParseXmlDecl(int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingNamePtr, - const ENCODING **namedEncodingPtr, - int *standalonePtr); - -int XmlInitEncoding(INIT_ENCODING *, const ENCODING **, const char *name); -const ENCODING *XmlGetUtf8InternalEncoding(void); -const ENCODING *XmlGetUtf16InternalEncoding(void); -int FASTCALL XmlUtf8Encode(int charNumber, char *buf); -int FASTCALL XmlUtf16Encode(int charNumber, unsigned short *buf); -int XmlSizeOfUnknownEncoding(void); - - -typedef int (XMLCALL *CONVERTER) (void *userData, const char *p); - -ENCODING * -XmlInitUnknownEncoding(void *mem, - int *table, - CONVERTER convert, - void *userData); - -int XmlParseXmlDeclNS(int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingNamePtr, - const ENCODING **namedEncodingPtr, - int *standalonePtr); - -int XmlInitEncodingNS(INIT_ENCODING *, const ENCODING **, const char *name); -const ENCODING *XmlGetUtf8InternalEncodingNS(void); -const ENCODING *XmlGetUtf16InternalEncodingNS(void); -ENCODING * -XmlInitUnknownEncodingNS(void *mem, - int *table, - CONVERTER convert, - void *userData); -#ifdef __cplusplus -} -#endif - -#endif /* not XmlTok_INCLUDED */ diff --git a/3rdParty/Expat/src/xmltok_impl.c b/3rdParty/Expat/src/xmltok_impl.c deleted file mode 100755 index 1268819..0000000 --- a/3rdParty/Expat/src/xmltok_impl.c +++ /dev/null @@ -1,1783 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* This file is included! */ -#ifdef XML_TOK_IMPL_C - -#ifndef IS_INVALID_CHAR -#define IS_INVALID_CHAR(enc, ptr, n) (0) -#endif - -#define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (IS_INVALID_CHAR(enc, ptr, n)) { \ - *(nextTokPtr) = (ptr); \ - return XML_TOK_INVALID; \ - } \ - ptr += n; \ - break; - -#define INVALID_CASES(ptr, nextTokPtr) \ - INVALID_LEAD_CASE(2, ptr, nextTokPtr) \ - INVALID_LEAD_CASE(3, ptr, nextTokPtr) \ - INVALID_LEAD_CASE(4, ptr, nextTokPtr) \ - case BT_NONXML: \ - case BT_MALFORM: \ - case BT_TRAIL: \ - *(nextTokPtr) = (ptr); \ - return XML_TOK_INVALID; - -#define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (!IS_NAME_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - ptr += n; \ - break; - -#define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \ - case BT_NONASCII: \ - if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - case BT_NMSTRT: \ - case BT_HEX: \ - case BT_DIGIT: \ - case BT_NAME: \ - case BT_MINUS: \ - ptr += MINBPC(enc); \ - break; \ - CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \ - CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \ - CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr) - -#define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - ptr += n; \ - break; - -#define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \ - case BT_NONASCII: \ - if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; \ - } \ - case BT_NMSTRT: \ - case BT_HEX: \ - ptr += MINBPC(enc); \ - break; \ - CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \ - CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \ - CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr) - -#ifndef PREFIX -#define PREFIX(ident) ident -#endif - -/* ptr points to character following "<!-" */ - -static int PTRCALL -PREFIX(scanComment)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - if (ptr != end) { - if (!CHAR_MATCHES(enc, ptr, ASCII_MINUS)) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - ptr += MINBPC(enc); - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - INVALID_CASES(ptr, nextTokPtr) - case BT_MINUS: - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) { - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_COMMENT; - } - break; - default: - ptr += MINBPC(enc); - break; - } - } - } - return XML_TOK_PARTIAL; -} - -/* ptr points to character following "<!" */ - -static int PTRCALL -PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - case BT_MINUS: - return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_LSQB: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_COND_SECT_OPEN; - case BT_NMSTRT: - case BT_HEX: - ptr += MINBPC(enc); - break; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_PERCNT: - if (ptr + MINBPC(enc) == end) - return XML_TOK_PARTIAL; - /* don't allow <!ENTITY% foo "whatever"> */ - switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) { - case BT_S: case BT_CR: case BT_LF: case BT_PERCNT: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - /* fall through */ - case BT_S: case BT_CR: case BT_LF: - *nextTokPtr = ptr; - return XML_TOK_DECL_OPEN; - case BT_NMSTRT: - case BT_HEX: - ptr += MINBPC(enc); - break; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -static int PTRCALL -PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, - const char *end, int *tokPtr) -{ - int upper = 0; - *tokPtr = XML_TOK_PI; - if (end - ptr != MINBPC(enc)*3) - return 1; - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_x: - break; - case ASCII_X: - upper = 1; - break; - default: - return 1; - } - ptr += MINBPC(enc); - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_m: - break; - case ASCII_M: - upper = 1; - break; - default: - return 1; - } - ptr += MINBPC(enc); - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_l: - break; - case ASCII_L: - upper = 1; - break; - default: - return 1; - } - if (upper) - return 0; - *tokPtr = XML_TOK_XML_DECL; - return 1; -} - -/* ptr points to character following "<?" */ - -static int PTRCALL -PREFIX(scanPi)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - int tok; - const char *target = ptr; - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_S: case BT_CR: case BT_LF: - if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - ptr += MINBPC(enc); - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - INVALID_CASES(ptr, nextTokPtr) - case BT_QUEST: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { - *nextTokPtr = ptr + MINBPC(enc); - return tok; - } - break; - default: - ptr += MINBPC(enc); - break; - } - } - return XML_TOK_PARTIAL; - case BT_QUEST: - if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { - *nextTokPtr = ptr + MINBPC(enc); - return tok; - } - /* fall through */ - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -static int PTRCALL -PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - static const char CDATA_LSQB[] = { ASCII_C, ASCII_D, ASCII_A, - ASCII_T, ASCII_A, ASCII_LSQB }; - int i; - /* CDATA[ */ - if (end - ptr < 6 * MINBPC(enc)) - return XML_TOK_PARTIAL; - for (i = 0; i < 6; i++, ptr += MINBPC(enc)) { - if (!CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - *nextTokPtr = ptr; - return XML_TOK_CDATA_SECT_OPEN; -} - -static int PTRCALL -PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - if (ptr == end) - return XML_TOK_NONE; - if (MINBPC(enc) > 1) { - size_t n = end - ptr; - if (n & (MINBPC(enc) - 1)) { - n &= ~(MINBPC(enc) - 1); - if (n == 0) - return XML_TOK_PARTIAL; - end = ptr + n; - } - } - switch (BYTE_TYPE(enc, ptr)) { - case BT_RSQB: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) - break; - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { - ptr -= MINBPC(enc); - break; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CDATA_SECT_CLOSE; - case BT_CR: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - *nextTokPtr = ptr; - return XML_TOK_DATA_NEWLINE; - case BT_LF: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DATA_NEWLINE; - INVALID_CASES(ptr, nextTokPtr) - default: - ptr += MINBPC(enc); - break; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_DATA_CHARS; \ - } \ - ptr += n; \ - break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_NONXML: - case BT_MALFORM: - case BT_TRAIL: - case BT_CR: - case BT_LF: - case BT_RSQB: - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - default: - ptr += MINBPC(enc); - break; - } - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; -} - -/* ptr points to character following "</" */ - -static int PTRCALL -PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_S: case BT_CR: case BT_LF: - for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_S: case BT_CR: case BT_LF: - break; - case BT_GT: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_END_TAG; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -#ifdef XML_NS - case BT_COLON: - /* no need to check qname syntax here, - since end-tag must match exactly */ - ptr += MINBPC(enc); - break; -#endif - case BT_GT: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_END_TAG; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -/* ptr points to character following "&#X" */ - -static int PTRCALL -PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - if (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_DIGIT: - case BT_HEX: - break; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_DIGIT: - case BT_HEX: - break; - case BT_SEMI: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CHAR_REF; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - } - return XML_TOK_PARTIAL; -} - -/* ptr points to character following "&#" */ - -static int PTRCALL -PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - if (ptr != end) { - if (CHAR_MATCHES(enc, ptr, ASCII_x)) - return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); - switch (BYTE_TYPE(enc, ptr)) { - case BT_DIGIT: - break; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_DIGIT: - break; - case BT_SEMI: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CHAR_REF; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - } - return XML_TOK_PARTIAL; -} - -/* ptr points to character following "&" */ - -static int PTRCALL -PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - case BT_NUM: - return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_SEMI: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_ENTITY_REF; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -/* ptr points to character following first character of attribute name */ - -static int PTRCALL -PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ -#ifdef XML_NS - int hadColon = 0; -#endif - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) -#ifdef XML_NS - case BT_COLON: - if (hadColon) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - hadColon = 1; - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - break; -#endif - case BT_S: case BT_CR: case BT_LF: - for (;;) { - int t; - - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - t = BYTE_TYPE(enc, ptr); - if (t == BT_EQUALS) - break; - switch (t) { - case BT_S: - case BT_LF: - case BT_CR: - break; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - /* fall through */ - case BT_EQUALS: - { - int open; -#ifdef XML_NS - hadColon = 0; -#endif - for (;;) { - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - open = BYTE_TYPE(enc, ptr); - if (open == BT_QUOT || open == BT_APOS) - break; - switch (open) { - case BT_S: - case BT_LF: - case BT_CR: - break; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - ptr += MINBPC(enc); - /* in attribute value */ - for (;;) { - int t; - if (ptr == end) - return XML_TOK_PARTIAL; - t = BYTE_TYPE(enc, ptr); - if (t == open) - break; - switch (t) { - INVALID_CASES(ptr, nextTokPtr) - case BT_AMP: - { - int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr); - if (tok <= 0) { - if (tok == XML_TOK_INVALID) - *nextTokPtr = ptr; - return tok; - } - break; - } - case BT_LT: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - default: - ptr += MINBPC(enc); - break; - } - } - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - case BT_S: - case BT_CR: - case BT_LF: - break; - case BT_SOL: - goto sol; - case BT_GT: - goto gt; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - /* ptr points to closing quote */ - for (;;) { - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - case BT_S: case BT_CR: case BT_LF: - continue; - case BT_GT: - gt: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_START_TAG_WITH_ATTS; - case BT_SOL: - sol: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_EMPTY_ELEMENT_WITH_ATTS; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - break; - } - break; - } - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -/* ptr points to character following "<" */ - -static int PTRCALL -PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ -#ifdef XML_NS - int hadColon; -#endif - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - case BT_EXCL: - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - case BT_MINUS: - return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_LSQB: - return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), - end, nextTokPtr); - } - *nextTokPtr = ptr; - return XML_TOK_INVALID; - case BT_QUEST: - return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_SOL: - return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr); - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } -#ifdef XML_NS - hadColon = 0; -#endif - /* we have a start-tag */ - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) -#ifdef XML_NS - case BT_COLON: - if (hadColon) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - hadColon = 1; - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - break; -#endif - case BT_S: case BT_CR: case BT_LF: - { - ptr += MINBPC(enc); - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - case BT_GT: - goto gt; - case BT_SOL: - goto sol; - case BT_S: case BT_CR: case BT_LF: - ptr += MINBPC(enc); - continue; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr); - } - return XML_TOK_PARTIAL; - } - case BT_GT: - gt: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_START_TAG_NO_ATTS; - case BT_SOL: - sol: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_EMPTY_ELEMENT_NO_ATTS; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -static int PTRCALL -PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - if (ptr == end) - return XML_TOK_NONE; - if (MINBPC(enc) > 1) { - size_t n = end - ptr; - if (n & (MINBPC(enc) - 1)) { - n &= ~(MINBPC(enc) - 1); - if (n == 0) - return XML_TOK_PARTIAL; - end = ptr + n; - } - } - switch (BYTE_TYPE(enc, ptr)) { - case BT_LT: - return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_AMP: - return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_CR: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_CR; - if (BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - *nextTokPtr = ptr; - return XML_TOK_DATA_NEWLINE; - case BT_LF: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DATA_NEWLINE; - case BT_RSQB: - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_RSQB; - if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) - break; - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_RSQB; - if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { - ptr -= MINBPC(enc); - break; - } - *nextTokPtr = ptr; - return XML_TOK_INVALID; - INVALID_CASES(ptr, nextTokPtr) - default: - ptr += MINBPC(enc); - break; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ - *nextTokPtr = ptr; \ - return XML_TOK_DATA_CHARS; \ - } \ - ptr += n; \ - break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_RSQB: - if (ptr + MINBPC(enc) != end) { - if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) { - ptr += MINBPC(enc); - break; - } - if (ptr + 2*MINBPC(enc) != end) { - if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), ASCII_GT)) { - ptr += MINBPC(enc); - break; - } - *nextTokPtr = ptr + 2*MINBPC(enc); - return XML_TOK_INVALID; - } - } - /* fall through */ - case BT_AMP: - case BT_LT: - case BT_NONXML: - case BT_MALFORM: - case BT_TRAIL: - case BT_CR: - case BT_LF: - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - default: - ptr += MINBPC(enc); - break; - } - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; -} - -/* ptr points to character following "%" */ - -static int PTRCALL -PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - if (ptr == end) - return -XML_TOK_PERCENT; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - case BT_S: case BT_LF: case BT_CR: case BT_PERCNT: - *nextTokPtr = ptr; - return XML_TOK_PERCENT; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_SEMI: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_PARAM_ENTITY_REF; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return XML_TOK_PARTIAL; -} - -static int PTRCALL -PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_CR: case BT_LF: case BT_S: - case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR: - *nextTokPtr = ptr; - return XML_TOK_POUND_NAME; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return -XML_TOK_POUND_NAME; -} - -static int PTRCALL -PREFIX(scanLit)(int open, const ENCODING *enc, - const char *ptr, const char *end, - const char **nextTokPtr) -{ - while (ptr != end) { - int t = BYTE_TYPE(enc, ptr); - switch (t) { - INVALID_CASES(ptr, nextTokPtr) - case BT_QUOT: - case BT_APOS: - ptr += MINBPC(enc); - if (t != open) - break; - if (ptr == end) - return -XML_TOK_LITERAL; - *nextTokPtr = ptr; - switch (BYTE_TYPE(enc, ptr)) { - case BT_S: case BT_CR: case BT_LF: - case BT_GT: case BT_PERCNT: case BT_LSQB: - return XML_TOK_LITERAL; - default: - return XML_TOK_INVALID; - } - default: - ptr += MINBPC(enc); - break; - } - } - return XML_TOK_PARTIAL; -} - -static int PTRCALL -PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - int tok; - if (ptr == end) - return XML_TOK_NONE; - if (MINBPC(enc) > 1) { - size_t n = end - ptr; - if (n & (MINBPC(enc) - 1)) { - n &= ~(MINBPC(enc) - 1); - if (n == 0) - return XML_TOK_PARTIAL; - end = ptr + n; - } - } - switch (BYTE_TYPE(enc, ptr)) { - case BT_QUOT: - return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_APOS: - return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_LT: - { - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_PARTIAL; - switch (BYTE_TYPE(enc, ptr)) { - case BT_EXCL: - return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_QUEST: - return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_NMSTRT: - case BT_HEX: - case BT_NONASCII: - case BT_LEAD2: - case BT_LEAD3: - case BT_LEAD4: - *nextTokPtr = ptr - MINBPC(enc); - return XML_TOK_INSTANCE_START; - } - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - case BT_CR: - if (ptr + MINBPC(enc) == end) { - *nextTokPtr = end; - /* indicate that this might be part of a CR/LF pair */ - return -XML_TOK_PROLOG_S; - } - /* fall through */ - case BT_S: case BT_LF: - for (;;) { - ptr += MINBPC(enc); - if (ptr == end) - break; - switch (BYTE_TYPE(enc, ptr)) { - case BT_S: case BT_LF: - break; - case BT_CR: - /* don't split CR/LF pair */ - if (ptr + MINBPC(enc) != end) - break; - /* fall through */ - default: - *nextTokPtr = ptr; - return XML_TOK_PROLOG_S; - } - } - *nextTokPtr = ptr; - return XML_TOK_PROLOG_S; - case BT_PERCNT: - return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr); - case BT_COMMA: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_COMMA; - case BT_LSQB: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_OPEN_BRACKET; - case BT_RSQB: - ptr += MINBPC(enc); - if (ptr == end) - return -XML_TOK_CLOSE_BRACKET; - if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { - if (ptr + MINBPC(enc) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) { - *nextTokPtr = ptr + 2*MINBPC(enc); - return XML_TOK_COND_SECT_CLOSE; - } - } - *nextTokPtr = ptr; - return XML_TOK_CLOSE_BRACKET; - case BT_LPAR: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_OPEN_PAREN; - case BT_RPAR: - ptr += MINBPC(enc); - if (ptr == end) - return -XML_TOK_CLOSE_PAREN; - switch (BYTE_TYPE(enc, ptr)) { - case BT_AST: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CLOSE_PAREN_ASTERISK; - case BT_QUEST: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CLOSE_PAREN_QUESTION; - case BT_PLUS: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_CLOSE_PAREN_PLUS; - case BT_CR: case BT_LF: case BT_S: - case BT_GT: case BT_COMMA: case BT_VERBAR: - case BT_RPAR: - *nextTokPtr = ptr; - return XML_TOK_CLOSE_PAREN; - } - *nextTokPtr = ptr; - return XML_TOK_INVALID; - case BT_VERBAR: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_OR; - case BT_GT: - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DECL_CLOSE; - case BT_NUM: - return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr); -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (end - ptr < n) \ - return XML_TOK_PARTIAL_CHAR; \ - if (IS_NMSTRT_CHAR(enc, ptr, n)) { \ - ptr += n; \ - tok = XML_TOK_NAME; \ - break; \ - } \ - if (IS_NAME_CHAR(enc, ptr, n)) { \ - ptr += n; \ - tok = XML_TOK_NMTOKEN; \ - break; \ - } \ - *nextTokPtr = ptr; \ - return XML_TOK_INVALID; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_NMSTRT: - case BT_HEX: - tok = XML_TOK_NAME; - ptr += MINBPC(enc); - break; - case BT_DIGIT: - case BT_NAME: - case BT_MINUS: -#ifdef XML_NS - case BT_COLON: -#endif - tok = XML_TOK_NMTOKEN; - ptr += MINBPC(enc); - break; - case BT_NONASCII: - if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { - ptr += MINBPC(enc); - tok = XML_TOK_NAME; - break; - } - if (IS_NAME_CHAR_MINBPC(enc, ptr)) { - ptr += MINBPC(enc); - tok = XML_TOK_NMTOKEN; - break; - } - /* fall through */ - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - case BT_GT: case BT_RPAR: case BT_COMMA: - case BT_VERBAR: case BT_LSQB: case BT_PERCNT: - case BT_S: case BT_CR: case BT_LF: - *nextTokPtr = ptr; - return tok; -#ifdef XML_NS - case BT_COLON: - ptr += MINBPC(enc); - switch (tok) { - case XML_TOK_NAME: - if (ptr == end) - return XML_TOK_PARTIAL; - tok = XML_TOK_PREFIXED_NAME; - switch (BYTE_TYPE(enc, ptr)) { - CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) - default: - tok = XML_TOK_NMTOKEN; - break; - } - break; - case XML_TOK_PREFIXED_NAME: - tok = XML_TOK_NMTOKEN; - break; - } - break; -#endif - case BT_PLUS: - if (tok == XML_TOK_NMTOKEN) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_NAME_PLUS; - case BT_AST: - if (tok == XML_TOK_NMTOKEN) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_NAME_ASTERISK; - case BT_QUEST: - if (tok == XML_TOK_NMTOKEN) { - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_NAME_QUESTION; - default: - *nextTokPtr = ptr; - return XML_TOK_INVALID; - } - } - return -tok; -} - -static int PTRCALL -PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - const char *start; - if (ptr == end) - return XML_TOK_NONE; - start = ptr; - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: ptr += n; break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_AMP: - if (ptr == start) - return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_LT: - /* this is for inside entity references */ - *nextTokPtr = ptr; - return XML_TOK_INVALID; - case BT_LF: - if (ptr == start) { - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DATA_NEWLINE; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_CR: - if (ptr == start) { - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_CR; - if (BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - *nextTokPtr = ptr; - return XML_TOK_DATA_NEWLINE; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_S: - if (ptr == start) { - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_ATTRIBUTE_VALUE_S; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - default: - ptr += MINBPC(enc); - break; - } - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; -} - -static int PTRCALL -PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - const char *start; - if (ptr == end) - return XML_TOK_NONE; - start = ptr; - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: ptr += n; break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_AMP: - if (ptr == start) - return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_PERCNT: - if (ptr == start) { - int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), - end, nextTokPtr); - return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_LF: - if (ptr == start) { - *nextTokPtr = ptr + MINBPC(enc); - return XML_TOK_DATA_NEWLINE; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - case BT_CR: - if (ptr == start) { - ptr += MINBPC(enc); - if (ptr == end) - return XML_TOK_TRAILING_CR; - if (BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - *nextTokPtr = ptr; - return XML_TOK_DATA_NEWLINE; - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; - default: - ptr += MINBPC(enc); - break; - } - } - *nextTokPtr = ptr; - return XML_TOK_DATA_CHARS; -} - -#ifdef XML_DTD - -static int PTRCALL -PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, - const char *end, const char **nextTokPtr) -{ - int level = 0; - if (MINBPC(enc) > 1) { - size_t n = end - ptr; - if (n & (MINBPC(enc) - 1)) { - n &= ~(MINBPC(enc) - 1); - end = ptr + n; - } - } - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { - INVALID_CASES(ptr, nextTokPtr) - case BT_LT: - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) { - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) { - ++level; - ptr += MINBPC(enc); - } - } - break; - case BT_RSQB: - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { - if ((ptr += MINBPC(enc)) == end) - return XML_TOK_PARTIAL; - if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { - ptr += MINBPC(enc); - if (level == 0) { - *nextTokPtr = ptr; - return XML_TOK_IGNORE_SECT; - } - --level; - } - } - break; - default: - ptr += MINBPC(enc); - break; - } - } - return XML_TOK_PARTIAL; -} - -#endif /* XML_DTD */ - -static int PTRCALL -PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, - const char **badPtr) -{ - ptr += MINBPC(enc); - end -= MINBPC(enc); - for (; ptr != end; ptr += MINBPC(enc)) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_DIGIT: - case BT_HEX: - case BT_MINUS: - case BT_APOS: - case BT_LPAR: - case BT_RPAR: - case BT_PLUS: - case BT_COMMA: - case BT_SOL: - case BT_EQUALS: - case BT_QUEST: - case BT_CR: - case BT_LF: - case BT_SEMI: - case BT_EXCL: - case BT_AST: - case BT_PERCNT: - case BT_NUM: -#ifdef XML_NS - case BT_COLON: -#endif - break; - case BT_S: - if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) { - *badPtr = ptr; - return 0; - } - break; - case BT_NAME: - case BT_NMSTRT: - if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f)) - break; - default: - switch (BYTE_TO_ASCII(enc, ptr)) { - case 0x24: /* $ */ - case 0x40: /* @ */ - break; - default: - *badPtr = ptr; - return 0; - } - break; - } - } - return 1; -} - -/* This must only be called for a well-formed start-tag or empty - element tag. Returns the number of attributes. Pointers to the - first attsMax attributes are stored in atts. -*/ - -static int PTRCALL -PREFIX(getAtts)(const ENCODING *enc, const char *ptr, - int attsMax, ATTRIBUTE *atts) -{ - enum { other, inName, inValue } state = inName; - int nAtts = 0; - int open = 0; /* defined when state == inValue; - initialization just to shut up compilers */ - - for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) { - switch (BYTE_TYPE(enc, ptr)) { -#define START_NAME \ - if (state == other) { \ - if (nAtts < attsMax) { \ - atts[nAtts].name = ptr; \ - atts[nAtts].normalized = 1; \ - } \ - state = inName; \ - } -#define LEAD_CASE(n) \ - case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_NONASCII: - case BT_NMSTRT: - case BT_HEX: - START_NAME - break; -#undef START_NAME - case BT_QUOT: - if (state != inValue) { - if (nAtts < attsMax) - atts[nAtts].valuePtr = ptr + MINBPC(enc); - state = inValue; - open = BT_QUOT; - } - else if (open == BT_QUOT) { - state = other; - if (nAtts < attsMax) - atts[nAtts].valueEnd = ptr; - nAtts++; - } - break; - case BT_APOS: - if (state != inValue) { - if (nAtts < attsMax) - atts[nAtts].valuePtr = ptr + MINBPC(enc); - state = inValue; - open = BT_APOS; - } - else if (open == BT_APOS) { - state = other; - if (nAtts < attsMax) - atts[nAtts].valueEnd = ptr; - nAtts++; - } - break; - case BT_AMP: - if (nAtts < attsMax) - atts[nAtts].normalized = 0; - break; - case BT_S: - if (state == inName) - state = other; - else if (state == inValue - && nAtts < attsMax - && atts[nAtts].normalized - && (ptr == atts[nAtts].valuePtr - || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE - || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE - || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open)) - atts[nAtts].normalized = 0; - break; - case BT_CR: case BT_LF: - /* This case ensures that the first attribute name is counted - Apart from that we could just change state on the quote. */ - if (state == inName) - state = other; - else if (state == inValue && nAtts < attsMax) - atts[nAtts].normalized = 0; - break; - case BT_GT: - case BT_SOL: - if (state != inValue) - return nAtts; - break; - default: - break; - } - } - /* not reached */ -} - -static int PTRFASTCALL -PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) -{ - int result = 0; - /* skip &# */ - ptr += 2*MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_x)) { - for (ptr += MINBPC(enc); - !CHAR_MATCHES(enc, ptr, ASCII_SEMI); - ptr += MINBPC(enc)) { - int c = BYTE_TO_ASCII(enc, ptr); - switch (c) { - case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4: - case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9: - result <<= 4; - result |= (c - ASCII_0); - break; - case ASCII_A: case ASCII_B: case ASCII_C: - case ASCII_D: case ASCII_E: case ASCII_F: - result <<= 4; - result += 10 + (c - ASCII_A); - break; - case ASCII_a: case ASCII_b: case ASCII_c: - case ASCII_d: case ASCII_e: case ASCII_f: - result <<= 4; - result += 10 + (c - ASCII_a); - break; - } - if (result >= 0x110000) - return -1; - } - } - else { - for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) { - int c = BYTE_TO_ASCII(enc, ptr); - result *= 10; - result += (c - ASCII_0); - if (result >= 0x110000) - return -1; - } - } - return checkCharRefNumber(result); -} - -static int PTRCALL -PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, - const char *end) -{ - switch ((end - ptr)/MINBPC(enc)) { - case 2: - if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) { - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_l: - return ASCII_LT; - case ASCII_g: - return ASCII_GT; - } - } - break; - case 3: - if (CHAR_MATCHES(enc, ptr, ASCII_a)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_m)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_p)) - return ASCII_AMP; - } - } - break; - case 4: - switch (BYTE_TO_ASCII(enc, ptr)) { - case ASCII_q: - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_u)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_o)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_t)) - return ASCII_QUOT; - } - } - break; - case ASCII_a: - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_p)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_o)) { - ptr += MINBPC(enc); - if (CHAR_MATCHES(enc, ptr, ASCII_s)) - return ASCII_APOS; - } - } - break; - } - } - return 0; -} - -static int PTRCALL -PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2) -{ - for (;;) { - switch (BYTE_TYPE(enc, ptr1)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - if (*ptr1++ != *ptr2++) \ - return 0; - LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2) -#undef LEAD_CASE - /* fall through */ - if (*ptr1++ != *ptr2++) - return 0; - break; - case BT_NONASCII: - case BT_NMSTRT: -#ifdef XML_NS - case BT_COLON: -#endif - case BT_HEX: - case BT_DIGIT: - case BT_NAME: - case BT_MINUS: - if (*ptr2++ != *ptr1++) - return 0; - if (MINBPC(enc) > 1) { - if (*ptr2++ != *ptr1++) - return 0; - if (MINBPC(enc) > 2) { - if (*ptr2++ != *ptr1++) - return 0; - if (MINBPC(enc) > 3) { - if (*ptr2++ != *ptr1++) - return 0; - } - } - } - break; - default: - if (MINBPC(enc) == 1 && *ptr1 == *ptr2) - return 1; - switch (BYTE_TYPE(enc, ptr2)) { - case BT_LEAD2: - case BT_LEAD3: - case BT_LEAD4: - case BT_NONASCII: - case BT_NMSTRT: -#ifdef XML_NS - case BT_COLON: -#endif - case BT_HEX: - case BT_DIGIT: - case BT_NAME: - case BT_MINUS: - return 0; - default: - return 1; - } - } - } - /* not reached */ -} - -static int PTRCALL -PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1, - const char *end1, const char *ptr2) -{ - for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) { - if (ptr1 == end1) - return 0; - if (!CHAR_MATCHES(enc, ptr1, *ptr2)) - return 0; - } - return ptr1 == end1; -} - -static int PTRFASTCALL -PREFIX(nameLength)(const ENCODING *enc, const char *ptr) -{ - const char *start = ptr; - for (;;) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: ptr += n; break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_NONASCII: - case BT_NMSTRT: -#ifdef XML_NS - case BT_COLON: -#endif - case BT_HEX: - case BT_DIGIT: - case BT_NAME: - case BT_MINUS: - ptr += MINBPC(enc); - break; - default: - return (int)(ptr - start); - } - } -} - -static const char * PTRFASTCALL -PREFIX(skipS)(const ENCODING *enc, const char *ptr) -{ - for (;;) { - switch (BYTE_TYPE(enc, ptr)) { - case BT_LF: - case BT_CR: - case BT_S: - ptr += MINBPC(enc); - break; - default: - return ptr; - } - } -} - -static void PTRCALL -PREFIX(updatePosition)(const ENCODING *enc, - const char *ptr, - const char *end, - POSITION *pos) -{ - while (ptr != end) { - switch (BYTE_TYPE(enc, ptr)) { -#define LEAD_CASE(n) \ - case BT_LEAD ## n: \ - ptr += n; \ - break; - LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) -#undef LEAD_CASE - case BT_LF: - pos->columnNumber = (XML_Size)-1; - pos->lineNumber++; - ptr += MINBPC(enc); - break; - case BT_CR: - pos->lineNumber++; - ptr += MINBPC(enc); - if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF) - ptr += MINBPC(enc); - pos->columnNumber = (XML_Size)-1; - break; - default: - ptr += MINBPC(enc); - break; - } - pos->columnNumber++; - } -} - -#undef DO_LEAD_CASE -#undef MULTIBYTE_CASES -#undef INVALID_CASES -#undef CHECK_NAME_CASE -#undef CHECK_NAME_CASES -#undef CHECK_NMSTRT_CASE -#undef CHECK_NMSTRT_CASES - -#endif /* XML_TOK_IMPL_C */ diff --git a/3rdParty/Expat/src/xmltok_impl.h b/3rdParty/Expat/src/xmltok_impl.h deleted file mode 100755 index da0ea60..0000000 --- a/3rdParty/Expat/src/xmltok_impl.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd -See the file COPYING for copying permission. -*/ - -enum { - BT_NONXML, - BT_MALFORM, - BT_LT, - BT_AMP, - BT_RSQB, - BT_LEAD2, - BT_LEAD3, - BT_LEAD4, - BT_TRAIL, - BT_CR, - BT_LF, - BT_GT, - BT_QUOT, - BT_APOS, - BT_EQUALS, - BT_QUEST, - BT_EXCL, - BT_SOL, - BT_SEMI, - BT_NUM, - BT_LSQB, - BT_S, - BT_NMSTRT, - BT_COLON, - BT_HEX, - BT_DIGIT, - BT_NAME, - BT_MINUS, - BT_OTHER, /* known not to be a name or name start character */ - BT_NONASCII, /* might be a name or name start character */ - BT_PERCNT, - BT_LPAR, - BT_RPAR, - BT_AST, - BT_PLUS, - BT_COMMA, - BT_VERBAR -}; - -#include <stddef.h> diff --git a/3rdParty/Expat/src/xmltok_ns.c b/3rdParty/Expat/src/xmltok_ns.c deleted file mode 100755 index c3b88fd..0000000 --- a/3rdParty/Expat/src/xmltok_ns.c +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd - See the file COPYING for copying permission. -*/ - -/* This file is included! */ -#ifdef XML_TOK_NS_C - -const ENCODING * -NS(XmlGetUtf8InternalEncoding)(void) -{ - return &ns(internal_utf8_encoding).enc; -} - -const ENCODING * -NS(XmlGetUtf16InternalEncoding)(void) -{ -#if BYTEORDER == 1234 - return &ns(internal_little2_encoding).enc; -#elif BYTEORDER == 4321 - return &ns(internal_big2_encoding).enc; -#else - const short n = 1; - return (*(const char *)&n - ? &ns(internal_little2_encoding).enc - : &ns(internal_big2_encoding).enc); -#endif -} - -static const ENCODING * const NS(encodings)[] = { - &ns(latin1_encoding).enc, - &ns(ascii_encoding).enc, - &ns(utf8_encoding).enc, - &ns(big2_encoding).enc, - &ns(big2_encoding).enc, - &ns(little2_encoding).enc, - &ns(utf8_encoding).enc /* NO_ENC */ -}; - -static int PTRCALL -NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - return initScan(NS(encodings), (const INIT_ENCODING *)enc, - XML_PROLOG_STATE, ptr, end, nextTokPtr); -} - -static int PTRCALL -NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end, - const char **nextTokPtr) -{ - return initScan(NS(encodings), (const INIT_ENCODING *)enc, - XML_CONTENT_STATE, ptr, end, nextTokPtr); -} - -int -NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr, - const char *name) -{ - int i = getEncodingIndex(name); - if (i == UNKNOWN_ENC) - return 0; - SET_INIT_ENC_INDEX(p, i); - p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog); - p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent); - p->initEnc.updatePosition = initUpdatePosition; - p->encPtr = encPtr; - *encPtr = &(p->initEnc); - return 1; -} - -static const ENCODING * -NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) -{ -#define ENCODING_MAX 128 - char buf[ENCODING_MAX]; - char *p = buf; - int i; - XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1); - if (ptr != end) - return 0; - *p = 0; - if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2) - return enc; - i = getEncodingIndex(buf); - if (i == UNKNOWN_ENC) - return 0; - return NS(encodings)[i]; -} - -int -NS(XmlParseXmlDecl)(int isGeneralTextEntity, - const ENCODING *enc, - const char *ptr, - const char *end, - const char **badPtr, - const char **versionPtr, - const char **versionEndPtr, - const char **encodingName, - const ENCODING **encoding, - int *standalone) -{ - return doParseXmlDecl(NS(findEncoding), - isGeneralTextEntity, - enc, - ptr, - end, - badPtr, - versionPtr, - versionEndPtr, - encodingName, - encoding, - standalone); -} - -#endif /* XML_TOK_NS_C */ diff --git a/3rdParty/LCov b/3rdParty/LCov new file mode 160000 +Subproject b851fd65b7ca12fcdfa824358612cf1138f5b73 diff --git a/3rdParty/LCov/gendesc b/3rdParty/LCov/gendesc deleted file mode 100755 index e7a8113..0000000 --- a/3rdParty/LCov/gendesc +++ /dev/null @@ -1,223 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (c) International Business Machines Corp., 2002 -# -# 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 -# -# -# gendesc -# -# This script creates a description file as understood by genhtml. -# Input file format: -# -# For each test case: -# <test name><optional whitespace> -# <at least one whitespace character (blank/tab)><test description> -# -# Actual description may consist of several lines. By default, output is -# written to stdout. Test names consist of alphanumeric characters -# including _ and -. -# -# -# History: -# 2002-09-02: created by Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> -# - -use strict; -use File::Basename; -use Getopt::Long; - - -# Constants -our $lcov_version = "LCOV version 1.7"; -our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; -our $tool_name = basename($0); - - -# Prototypes -sub print_usage(*); -sub gen_desc(); -sub warn_handler($); -sub die_handler($); - - -# Global variables -our $help; -our $version; -our $output_filename; -our $input_filename; - - -# -# Code entry point -# - -$SIG{__WARN__} = \&warn_handler; -$SIG{__DIE__} = \&die_handler; - -# Parse command line options -if (!GetOptions("output-filename=s" => \$output_filename, - "version" =>\$version, - "help|?" => \$help - )) -{ - print(STDERR "Use $tool_name --help to get usage information\n"); - exit(1); -} - -$input_filename = $ARGV[0]; - -# Check for help option -if ($help) -{ - print_usage(*STDOUT); - exit(0); -} - -# Check for version option -if ($version) -{ - print("$tool_name: $lcov_version\n"); - exit(0); -} - - -# Check for input filename -if (!$input_filename) -{ - die("No input filename specified\n". - "Use $tool_name --help to get usage information\n"); -} - -# Do something -gen_desc(); - - -# -# print_usage(handle) -# -# Write out command line usage information to given filehandle. -# - -sub print_usage(*) -{ - local *HANDLE = $_[0]; - - print(HANDLE <<END_OF_USAGE) -Usage: $tool_name [OPTIONS] INPUTFILE - -Convert a test case description file into a format as understood by genhtml. - - -h, --help Print this help, then exit - -v, --version Print version number, then exit - -o, --output-filename FILENAME Write description to FILENAME - -For more information see: $lcov_url -END_OF_USAGE - ; -} - - -# -# gen_desc() -# -# Read text file INPUT_FILENAME and convert the contained description to a -# format as understood by genhtml, i.e. -# -# TN:<test name> -# TD:<test description> -# -# If defined, write output to OUTPUT_FILENAME, otherwise to stdout. -# -# Die on error. -# - -sub gen_desc() -{ - local *INPUT_HANDLE; - local *OUTPUT_HANDLE; - my $empty_line = "ignore"; - - open(INPUT_HANDLE, $input_filename) - or die("ERROR: cannot open $input_filename!\n"); - - # Open output file for writing - if ($output_filename) - { - open(OUTPUT_HANDLE, ">$output_filename") - or die("ERROR: cannot create $output_filename!\n"); - } - else - { - *OUTPUT_HANDLE = *STDOUT; - } - - # Process all lines in input file - while (<INPUT_HANDLE>) - { - chomp($_); - - if (/^\s*(\w[\w-]*)(\s*)$/) - { - # Matched test name - # Name starts with alphanum or _, continues with - # alphanum, _ or - - print(OUTPUT_HANDLE "TN: $1\n"); - $empty_line = "ignore"; - } - elsif (/^(\s+)(\S.*?)\s*$/) - { - # Matched test description - if ($empty_line eq "insert") - { - # Write preserved empty line - print(OUTPUT_HANDLE "TD: \n"); - } - print(OUTPUT_HANDLE "TD: $2\n"); - $empty_line = "observe"; - } - elsif (/^\s*$/) - { - # Matched empty line to preserve paragraph separation - # inside description text - if ($empty_line eq "observe") - { - $empty_line = "insert"; - } - } - } - - # Close output file if defined - if ($output_filename) - { - close(OUTPUT_HANDLE); - } - - close(INPUT_HANDLE); -} - -sub warn_handler($) -{ - my ($msg) = @_; - - warn("$tool_name: $msg"); -} - -sub die_handler($) -{ - my ($msg) = @_; - - die("$tool_name: $msg"); -} diff --git a/3rdParty/LCov/genhtml b/3rdParty/LCov/genhtml deleted file mode 100755 index 497363b..0000000 --- a/3rdParty/LCov/genhtml +++ /dev/null @@ -1,4819 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (c) International Business Machines Corp., 2002 -# -# 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 -# -# -# genhtml -# -# This script generates HTML output from .info files as created by the -# geninfo script. Call it with --help and refer to the genhtml man page -# to get information on usage and available options. -# -# -# History: -# 2002-08-23 created by Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> -# IBM Lab Boeblingen -# based on code by Manoj Iyer <manjo@mail.utexas.edu> and -# Megan Bock <mbock@us.ibm.com> -# IBM Austin -# 2002-08-27 / Peter Oberparleiter: implemented frame view -# 2002-08-29 / Peter Oberparleiter: implemented test description filtering -# so that by default only descriptions for test cases which -# actually hit some source lines are kept -# 2002-09-05 / Peter Oberparleiter: implemented --no-sourceview -# 2002-09-05 / Mike Kobler: One of my source file paths includes a "+" in -# the directory name. I found that genhtml.pl died when it -# encountered it. I was able to fix the problem by modifying -# the string with the escape character before parsing it. -# 2002-10-26 / Peter Oberparleiter: implemented --num-spaces -# 2003-04-07 / Peter Oberparleiter: fixed bug which resulted in an error -# when trying to combine .info files containing data without -# a test name -# 2003-04-10 / Peter Oberparleiter: extended fix by Mike to also cover -# other special characters -# 2003-04-30 / Peter Oberparleiter: made info write to STDERR, not STDOUT -# 2003-07-10 / Peter Oberparleiter: added line checksum support -# 2004-08-09 / Peter Oberparleiter: added configuration file support -# 2005-03-04 / Cal Pierog: added legend to HTML output, fixed coloring of -# "good coverage" background -# 2006-03-18 / Marcus Boerger: added --custom-intro, --custom-outro and -# overwrite --no-prefix if --prefix is present -# 2006-03-20 / Peter Oberparleiter: changes to custom_* function (rename -# to html_prolog/_epilog, minor modifications to implementation), -# changed prefix/noprefix handling to be consistent with current -# logic -# 2006-03-20 / Peter Oberparleiter: added --html-extension option -# 2008-07-14 / Tom Zoerner: added --function-coverage command line option; -# added function table to source file page -# 2008-08-13 / Peter Oberparleiter: modified function coverage -# implementation (now enabled per default), -# introduced sorting option (enabled per default) -# - -use strict; -use File::Basename; -use Getopt::Long; -use Digest::MD5 qw(md5_base64); - - -# Global constants -our $title = "LCOV - code coverage report"; -our $lcov_version = "LCOV version 1.7"; -our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; -our $tool_name = basename($0); - -# Specify coverage rate limits (in %) for classifying file entries -# HI: $hi_limit <= rate <= 100 graph color: green -# MED: $med_limit <= rate < $hi_limit graph color: orange -# LO: 0 <= rate < $med_limit graph color: red - -# For line coverage -our $hi_limit = 50; -our $med_limit = 15; - -# For function coverage -our $fn_hi_limit = 90; -our $fn_med_limit = 75; - -# Width of overview image -our $overview_width = 80; - -# Resolution of overview navigation: this number specifies the maximum -# difference in lines between the position a user selected from the overview -# and the position the source code window is scrolled to. -our $nav_resolution = 4; - -# Clicking a line in the overview image should show the source code view at -# a position a bit further up so that the requested line is not the first -# line in the window. This number specifies that offset in lines. -our $nav_offset = 10; - -# Clicking on a function name should show the source code at a position a -# few lines before the first line of code of that function. This number -# specifies that offset in lines. -our $func_offset = 2; - -our $overview_title = "directory"; - -# Data related prototypes -sub print_usage(*); -sub gen_html(); -sub html_create($$); -sub process_dir($); -sub process_file($$$); -sub info(@); -sub read_info_file($); -sub get_info_entry($); -sub set_info_entry($$$$$$$;$$$$); -sub get_prefix(@); -sub shorten_prefix($); -sub get_dir_list(@); -sub get_relative_base_path($); -sub read_testfile($); -sub get_date_string(); -sub split_filename($); -sub create_sub_dir($); -sub subtract_counts($$); -sub add_counts($$); -sub apply_baseline($$); -sub remove_unused_descriptions(); -sub get_found_and_hit($); -sub get_affecting_tests($$); -sub combine_info_files($$); -sub merge_checksums($$$); -sub combine_info_entries($$$); -sub apply_prefix($$); -sub system_no_output($@); -sub read_config($); -sub apply_config($); -sub get_html_prolog($); -sub get_html_epilog($); - - -# HTML related prototypes -sub escape_html($); -sub get_bar_graph_code($$$); - -sub write_png_files(); -sub write_htaccess_file(); -sub write_css_file(); -sub write_description_file($$$$$); -sub write_function_rable(*$$$); - -sub write_html(*$); -sub write_html_prolog(*$$); -sub write_html_epilog(*$;$); - -sub write_header(*$$$$$$$$); -sub write_header_prolog(*$); -sub write_header_line(*$@); -sub write_header_epilog(*$); - -sub write_file_table(*$$$$$$); -sub write_file_table_prolog(*$$$); -sub write_file_table_entry(*$$$$$$$); -sub write_file_table_detail_heading(*$$$); -sub write_file_table_detail_entry(*$$$$$); -sub write_file_table_epilog(*); - -sub write_test_table_prolog(*$); -sub write_test_table_entry(*$$); -sub write_test_table_epilog(*); - -sub write_source($$$$$$); -sub write_source_prolog(*); -sub write_source_line(*$$$$$); -sub write_source_epilog(*); - -sub write_frameset(*$$$); -sub write_overview_line(*$$$); -sub write_overview(*$$$$); - -# External prototype (defined in genpng) -sub gen_png($$$@); - - -# Global variables & initialization -our %info_data; # Hash containing all data from .info file -our $dir_prefix; # Prefix to remove from all sub directories -our %test_description; # Hash containing test descriptions if available -our $date = get_date_string(); - -our @info_filenames; # List of .info files to use as data source -our $test_title; # Title for output as written to each page header -our $output_directory; # Name of directory in which to store output -our $base_filename; # Optional name of file containing baseline data -our $desc_filename; # Name of file containing test descriptions -our $css_filename; # Optional name of external stylesheet file to use -our $quiet; # If set, suppress information messages -our $help; # Help option flag -our $version; # Version option flag -our $show_details; # If set, generate detailed directory view -our $no_prefix; # If set, do not remove filename prefix -our $func_coverage = 1; # If set, generate function coverage statistics -our $no_func_coverage; # Disable func_coverage -our $sort = 1; # If set, provide directory listings with sorted entries -our $no_sort; # Disable sort -our $frames; # If set, use frames for source code view -our $keep_descriptions; # If set, do not remove unused test case descriptions -our $no_sourceview; # If set, do not create a source code view for each file -our $highlight; # If set, highlight lines covered by converted data only -our $legend; # If set, include legend in output -our $tab_size = 8; # Number of spaces to use in place of tab -our $config; # Configuration file contents -our $html_prolog_file; # Custom HTML prolog file (up to and including <body>) -our $html_epilog_file; # Custom HTML epilog file (from </body> onwards) -our $html_prolog; # Actual HTML prolog -our $html_epilog; # Actual HTML epilog -our $html_ext = "html"; # Extension for generated HTML files -our $html_gzip = 0; # Compress with gzip -our @fileview_sortlist; -our @fileview_sortname = ("", "-sort-l", "-sort-f"); -our @funcview_sortlist; -our @rate_name = ("Lo", "Med", "Hi"); -our @rate_png = ("ruby.png", "amber.png", "emerald.png"); - -our $cwd = `pwd`; # Current working directory -chomp($cwd); -our $tool_dir = dirname($0); # Directory where genhtml tool is installed - - -# -# Code entry point -# - -$SIG{__WARN__} = \&warn_handler; -$SIG{__DIE__} = \&die_handler; - -# Add current working directory if $tool_dir is not already an absolute path -if (! ($tool_dir =~ /^\/(.*)$/)) -{ - $tool_dir = "$cwd/$tool_dir"; -} - -# Read configuration file if available -if (-r $ENV{"HOME"}."/.lcovrc") -{ - $config = read_config($ENV{"HOME"}."/.lcovrc"); -} -elsif (-r "/etc/lcovrc") -{ - $config = read_config("/etc/lcovrc"); -} - -if ($config) -{ - # Copy configuration file values to variables - apply_config({ - "genhtml_css_file" => \$css_filename, - "genhtml_hi_limit" => \$hi_limit, - "genhtml_med_limit" => \$med_limit, - "genhtml_overview_width" => \$overview_width, - "genhtml_nav_resolution" => \$nav_resolution, - "genhtml_nav_offset" => \$nav_offset, - "genhtml_keep_descriptions" => \$keep_descriptions, - "genhtml_no_prefix" => \$no_prefix, - "genhtml_no_source" => \$no_sourceview, - "genhtml_num_spaces" => \$tab_size, - "genhtml_highlight" => \$highlight, - "genhtml_legend" => \$legend, - "genhtml_html_prolog" => \$html_prolog_file, - "genhtml_html_epilog" => \$html_epilog_file, - "genhtml_html_extension" => \$html_ext, - "genhtml_html_gzip" => \$html_gzip, - "genhtml_function_hi_limit" => \$fn_hi_limit, - "genhtml_function_med_limit" => \$fn_med_limit, - "genhtml_function_coverage" => \$func_coverage, - "genhtml_sort" => \$sort, - }); -} - -# Parse command line options -if (!GetOptions("output-directory=s" => \$output_directory, - "title=s" => \$test_title, - "description-file=s" => \$desc_filename, - "keep-descriptions" => \$keep_descriptions, - "css-file=s" => \$css_filename, - "baseline-file=s" => \$base_filename, - "prefix=s" => \$dir_prefix, - "num-spaces=i" => \$tab_size, - "no-prefix" => \$no_prefix, - "no-sourceview" => \$no_sourceview, - "show-details" => \$show_details, - "frames" => \$frames, - "highlight" => \$highlight, - "legend" => \$legend, - "quiet" => \$quiet, - "help|h|?" => \$help, - "version" => \$version, - "html-prolog=s" => \$html_prolog_file, - "html-epilog=s" => \$html_epilog_file, - "html-extension=s" => \$html_ext, - "html-gzip" => \$html_gzip, - "function-coverage" => \$func_coverage, - "no-function-coverage" => \$no_func_coverage, - "sort" => \$sort, - "no-sort" => \$no_sort, - )) -{ - print(STDERR "Use $tool_name --help to get usage information\n"); - exit(1); -} else { - # Merge options - if ($no_func_coverage) { - $func_coverage = 0; - } - - # Merge sort options - if ($no_sort) { - $sort = 0; - } -} - -@info_filenames = @ARGV; - -# Check for help option -if ($help) -{ - print_usage(*STDOUT); - exit(0); -} - -# Check for version option -if ($version) -{ - print("$tool_name: $lcov_version\n"); - exit(0); -} - -# Check for info filename -if (!@info_filenames) -{ - die("No filename specified\n". - "Use $tool_name --help to get usage information\n"); -} - -# Generate a title if none is specified -if (!$test_title) -{ - if (scalar(@info_filenames) == 1) - { - # Only one filename specified, use it as title - $test_title = basename($info_filenames[0]); - } - else - { - # More than one filename specified, used default title - $test_title = "unnamed"; - } -} - -# Make sure css_filename is an absolute path (in case we're changing -# directories) -if ($css_filename) -{ - if (!($css_filename =~ /^\/(.*)$/)) - { - $css_filename = $cwd."/".$css_filename; - } -} - -# Make sure tab_size is within valid range -if ($tab_size < 1) -{ - print(STDERR "ERROR: invalid number of spaces specified: ". - "$tab_size!\n"); - exit(1); -} - -# Get HTML prolog and epilog -$html_prolog = get_html_prolog($html_prolog_file); -$html_epilog = get_html_epilog($html_epilog_file); - -# Issue a warning if --no-sourceview is enabled together with --frames -if ($no_sourceview && defined($frames)) -{ - warn("WARNING: option --frames disabled because --no-sourceview ". - "was specified!\n"); - $frames = undef; -} - -# Issue a warning if --no-prefix is enabled together with --prefix -if ($no_prefix && defined($dir_prefix)) -{ - warn("WARNING: option --prefix disabled because --no-prefix was ". - "specified!\n"); - $dir_prefix = undef; -} - -if ($sort) { - @funcview_sortlist = (0, 1); - if ($func_coverage) { - @fileview_sortlist = (0, 1, 2); - } else { - @fileview_sortlist = (0, 1); - } -} else { - @fileview_sortlist = (0); - @funcview_sortlist = (0); -} - -if ($frames) -{ - # Include genpng code needed for overview image generation - do("$tool_dir/genpng"); -} - -# Make sure output_directory exists, create it if necessary -if ($output_directory) -{ - stat($output_directory); - - if (! -e _) - { - system("mkdir", "-p", $output_directory) - and die("ERROR: cannot create directory $_!\n"); - } -} - -# Do something -gen_html(); - -exit(0); - - - -# -# print_usage(handle) -# -# Print usage information. -# - -sub print_usage(*) -{ - local *HANDLE = $_[0]; - - print(HANDLE <<END_OF_USAGE); -Usage: $tool_name [OPTIONS] INFOFILE(S) - -Create HTML output for coverage data found in INFOFILE. Note that INFOFILE -may also be a list of filenames. - -Misc: - -h, --help Print this help, then exit - -v, --version Print version number, then exit - -q, --quiet Do not print progress messages - -Operation: - -o, --output-directory OUTDIR Write HTML output to OUTDIR - -s, --show-details Generate detailed directory view - -d, --description-file DESCFILE Read test case descriptions from DESCFILE - -k, --keep-descriptions Do not remove unused test descriptions - -b, --baseline-file BASEFILE Use BASEFILE as baseline file - -p, --prefix PREFIX Remove PREFIX from all directory names - --no-prefix Do not remove prefix from directory names - --(no-)function-coverage Enable (disable) function coverage display - -HTML output: - -f, --frames Use HTML frames for source code view - -t, --title TITLE Display TITLE in header of all pages - -c, --css-file CSSFILE Use external style sheet file CSSFILE - --no-source Do not create source code view - --num-spaces NUM Replace tabs with NUM spaces in source view - --highlight Highlight lines with converted-only data - --legend Include color legend in HTML output - --html-prolog FILE Use FILE as HTML prolog for generated pages - --html-epilog FILE Use FILE as HTML epilog for generated pages - --html-extension EXT Use EXT as filename extension for pages - --html-gzip Use gzip to compress HTML - --(no-)sort Enable (disable) sorted coverage views - -For more information see: $lcov_url -END_OF_USAGE - ; -} - - -# -# get_rate(found, hit) -# -# Return a relative value for the specified found&hit values -# which is used for sorting the corresponding entries in a -# file list. -# - -sub get_rate($$) -{ - my ($found, $hit) = @_; - - if ($found == 0) { - return 10000; - } - return int($hit * 1000 / $found) * 10 + 2 - (1 / $found); -} - - -# -# gen_html() -# -# Generate a set of HTML pages from contents of .info file INFO_FILENAME. -# Files will be written to the current directory. If provided, test case -# descriptions will be read from .tests file TEST_FILENAME and included -# in ouput. -# -# Die on error. -# - -sub gen_html() -{ - local *HTML_HANDLE; - my %overview; - my %base_data; - my $lines_found; - my $lines_hit; - my $fn_found; - my $fn_hit; - my $overall_found = 0; - my $overall_hit = 0; - my $total_fn_found = 0; - my $total_fn_hit = 0; - my $dir_name; - my $link_name; - my @dir_list; - my %new_info; - - # Read in all specified .info files - foreach (@info_filenames) - { - %new_info = %{read_info_file($_)}; - - # Combine %new_info with %info_data - %info_data = %{combine_info_files(\%info_data, \%new_info)}; - } - - info("Found %d entries.\n", scalar(keys(%info_data))); - - # Read and apply baseline data if specified - if ($base_filename) - { - # Read baseline file - info("Reading baseline file $base_filename\n"); - %base_data = %{read_info_file($base_filename)}; - info("Found %d entries.\n", scalar(keys(%base_data))); - - # Apply baseline - info("Subtracting baseline data.\n"); - %info_data = %{apply_baseline(\%info_data, \%base_data)}; - } - - @dir_list = get_dir_list(keys(%info_data)); - - if ($no_prefix) - { - # User requested that we leave filenames alone - info("User asked not to remove filename prefix\n"); - } - elsif (!defined($dir_prefix)) - { - # Get prefix common to most directories in list - $dir_prefix = get_prefix(@dir_list); - - if ($dir_prefix) - { - info("Found common filename prefix \"$dir_prefix\"\n"); - } - else - { - info("No common filename prefix found!\n"); - $no_prefix=1; - } - } - else - { - info("Using user-specified filename prefix \"". - "$dir_prefix\"\n"); - } - - # Read in test description file if specified - if ($desc_filename) - { - info("Reading test description file $desc_filename\n"); - %test_description = %{read_testfile($desc_filename)}; - - # Remove test descriptions which are not referenced - # from %info_data if user didn't tell us otherwise - if (!$keep_descriptions) - { - remove_unused_descriptions(); - } - } - - # Change to output directory if specified - if ($output_directory) - { - chdir($output_directory) - or die("ERROR: cannot change to directory ". - "$output_directory!\n"); - } - - info("Writing .css and .png files.\n"); - write_css_file(); - write_png_files(); - - if ($html_gzip) - { - info("Writing .htaccess file.\n"); - write_htaccess_file(); - } - - info("Generating output.\n"); - - # Process each subdirectory and collect overview information - foreach $dir_name (@dir_list) - { - ($lines_found, $lines_hit, $fn_found, $fn_hit) - = process_dir($dir_name); - - # Remove prefix if applicable - if (!$no_prefix && $dir_prefix) - { - # Match directory names beginning with $dir_prefix - $dir_name = apply_prefix($dir_name, $dir_prefix); - } - - # Generate name for directory overview HTML page - if ($dir_name =~ /^\/(.*)$/) - { - $link_name = substr($dir_name, 1)."/index.$html_ext"; - } - else - { - $link_name = $dir_name."/index.$html_ext"; - } - - $overview{$dir_name} = [$lines_found, $lines_hit, $fn_found, - $fn_hit, $link_name, - get_rate($lines_found, $lines_hit), - get_rate($fn_found, $fn_hit)]; - $overall_found += $lines_found; - $overall_hit += $lines_hit; - $total_fn_found += $fn_found; - $total_fn_hit += $fn_hit; - } - - # Generate overview page - info("Writing directory view page.\n"); - - # Create sorted pages - foreach (@fileview_sortlist) { - write_dir_page($fileview_sortname[$_], ".", "", $test_title, - undef, $overall_found, $overall_hit, - $total_fn_found, $total_fn_hit, \%overview, - {}, {}, 0, $_); - } - - # Check if there are any test case descriptions to write out - if (%test_description) - { - info("Writing test case description file.\n"); - write_description_file( \%test_description, - $overall_found, $overall_hit, - $total_fn_found, $total_fn_hit); - } - - chdir($cwd); - - info("Overall coverage rate:\n"); - - if ($overall_found == 0) - { - info(" lines......: no data found\n"); - return; - } - info(" lines......: %.1f%% (%d of %d lines)\n", - $overall_hit * 100 / $overall_found, $overall_hit, - $overall_found,); - - if ($func_coverage) - { - if ($total_fn_found == 0) - { - info(" functions..: no data found\n"); - } - else - { - info(" functions..: %.1f%% (%d of %d functions)\n", - $total_fn_hit * 100 / $total_fn_found, - $total_fn_hit, $total_fn_found); - - } - } - -} - -# -# html_create(handle, filename) -# - -sub html_create($$) -{ - my $handle = $_[0]; - my $filename = $_[1]; - - if ($html_gzip) - { - open($handle, "|gzip -c >$filename") - or die("ERROR: cannot open $filename for writing ". - "(gzip)!\n"); - } - else - { - open($handle, ">$filename") - or die("ERROR: cannot open $filename for writing!\n"); - } -} - -sub write_dir_page($$$$$$$$$$$$$$) -{ - my ($name, $rel_dir, $base_dir, $title, $trunc_dir, $overall_found, - $overall_hit, $total_fn_found, $total_fn_hit, $overview, - $testhash, $testfnchash, $view_type, $sort_type) = @_; - - # Generate directory overview page including details - html_create(*HTML_HANDLE, "$rel_dir/index$name.$html_ext"); - if (!defined($trunc_dir)) { - $trunc_dir = ""; - } - write_html_prolog(*HTML_HANDLE, $base_dir, "LCOV - $title$trunc_dir"); - write_header(*HTML_HANDLE, $view_type, $trunc_dir, $rel_dir, - $overall_found, $overall_hit, $total_fn_found, - $total_fn_hit, $sort_type); - write_file_table(*HTML_HANDLE, $base_dir, $overview, $testhash, - $testfnchash, $view_type, $sort_type); - write_html_epilog(*HTML_HANDLE, $base_dir); - close(*HTML_HANDLE); -} - - -# -# process_dir(dir_name) -# - -sub process_dir($) -{ - my $abs_dir = $_[0]; - my $trunc_dir; - my $rel_dir = $abs_dir; - my $base_dir; - my $filename; - my %overview; - my $lines_found; - my $lines_hit; - my $fn_found; - my $fn_hit; - my $overall_found=0; - my $overall_hit=0; - my $total_fn_found=0; - my $total_fn_hit=0; - my $base_name; - my $extension; - my $testdata; - my %testhash; - my $testfncdata; - my %testfnchash; - my @sort_list; - local *HTML_HANDLE; - - # Remove prefix if applicable - if (!$no_prefix) - { - # Match directory name beginning with $dir_prefix - $rel_dir = apply_prefix($rel_dir, $dir_prefix); - } - - $trunc_dir = $rel_dir; - - # Remove leading / - if ($rel_dir =~ /^\/(.*)$/) - { - $rel_dir = substr($rel_dir, 1); - } - - $base_dir = get_relative_base_path($rel_dir); - - create_sub_dir($rel_dir); - - # Match filenames which specify files in this directory, not including - # sub-directories - foreach $filename (grep(/^\Q$abs_dir\E\/[^\/]*$/,keys(%info_data))) - { - my $page_link; - my $func_link; - - ($lines_found, $lines_hit, $fn_found, $fn_hit, $testdata, - $testfncdata) = process_file($trunc_dir, $rel_dir, $filename); - - $base_name = basename($filename); - - if ($no_sourceview) { - $page_link = ""; - } elsif ($frames) { - # Link to frameset page - $page_link = "$base_name.gcov.frameset.$html_ext"; - } else { - # Link directory to source code view page - $page_link = "$base_name.gcov.$html_ext"; - } - $overview{$base_name} = [$lines_found, $lines_hit, $fn_found, - $fn_hit, $page_link, - get_rate($lines_found, $lines_hit), - get_rate($fn_found, $fn_hit)]; - - $testhash{$base_name} = $testdata; - $testfnchash{$base_name} = $testfncdata; - - $overall_found += $lines_found; - $overall_hit += $lines_hit; - - $total_fn_found += $fn_found; - $total_fn_hit += $fn_hit; - } - - # Create sorted pages - foreach (@fileview_sortlist) { - # Generate directory overview page (without details) - write_dir_page($fileview_sortname[$_], $rel_dir, $base_dir, - $test_title, $trunc_dir, $overall_found, - $overall_hit, $total_fn_found, $total_fn_hit, - \%overview, {}, {}, 1, $_); - if (!$show_details) { - next; - } - # Generate directory overview page including details - write_dir_page("-detail".$fileview_sortname[$_], $rel_dir, - $base_dir, $test_title, $trunc_dir, - $overall_found, $overall_hit, $total_fn_found, - $total_fn_hit, \%overview, \%testhash, - \%testfnchash, 1, $_); - } - - # Calculate resulting line counts - return ($overall_found, $overall_hit, $total_fn_found, $total_fn_hit); -} - - -# -# get_converted_lines(testdata) -# -# Return hash of line numbers of those lines which were only covered in -# converted data sets. -# - -sub get_converted_lines($) -{ - my $testdata = $_[0]; - my $testcount; - my %converted; - my %nonconverted; - my $hash; - my $testcase; - my $line; - my %result; - - - # Get a hash containing line numbers with positive counts both for - # converted and original data sets - foreach $testcase (keys(%{$testdata})) - { - # Check to see if this is a converted data set - if ($testcase =~ /,diff$/) - { - $hash = \%converted; - } - else - { - $hash = \%nonconverted; - } - - $testcount = $testdata->{$testcase}; - # Add lines with a positive count to hash - foreach $line (keys%{$testcount}) - { - if ($testcount->{$line} > 0) - { - $hash->{$line} = 1; - } - } - } - - # Combine both hashes to resulting list - foreach $line (keys(%converted)) - { - if (!defined($nonconverted{$line})) - { - $result{$line} = 1; - } - } - - return \%result; -} - - -sub write_function_page($$$$$$$$$$$$$$) -{ - my ($base_dir, $rel_dir, $trunc_dir, $base_name, $title, - $lines_found, $lines_hit, $fn_found, $fn_hit, - $sumcount, $funcdata, $sumfnccount, $testfncdata, $sort_type) = @_; - my $pagetitle; - my $filename; - - # Generate function table for this file - if ($sort_type == 0) { - $filename = "$rel_dir/$base_name.func.$html_ext"; - } else { - $filename = "$rel_dir/$base_name.func-sort-c.$html_ext"; - } - html_create(*HTML_HANDLE, $filename); - $pagetitle = "LCOV - $title - $trunc_dir/$base_name - functions"; - write_html_prolog(*HTML_HANDLE, $base_dir, $pagetitle); - write_header(*HTML_HANDLE, 4, "$trunc_dir/$base_name", - "$rel_dir/$base_name", $lines_found, $lines_hit, - $fn_found, $fn_hit, $sort_type); - write_function_table(*HTML_HANDLE, "$base_name.gcov.$html_ext", - $sumcount, $funcdata, - $sumfnccount, $testfncdata, $base_name, - $base_dir, $sort_type); - write_html_epilog(*HTML_HANDLE, $base_dir, 1); - close(*HTML_HANDLE); -} - - -# -# process_file(trunc_dir, rel_dir, filename) -# - -sub process_file($$$) -{ - info("Processing file ".apply_prefix($_[2], $dir_prefix)."\n"); - - my $trunc_dir = $_[0]; - my $rel_dir = $_[1]; - my $filename = $_[2]; - my $base_name = basename($filename); - my $base_dir = get_relative_base_path($rel_dir); - my $testdata; - my $testcount; - my $sumcount; - my $funcdata; - my $checkdata; - my $testfncdata; - my $sumfnccount; - my $lines_found; - my $lines_hit; - my $fn_found; - my $fn_hit; - my $converted; - my @source; - my $pagetitle; - local *HTML_HANDLE; - - ($testdata, $sumcount, $funcdata, $checkdata, $testfncdata, - $sumfnccount, $lines_found, $lines_hit, $fn_found, $fn_hit) - = get_info_entry($info_data{$filename}); - - # Return after this point in case user asked us not to generate - # source code view - if ($no_sourceview) - { - return ($lines_found, $lines_hit, - $fn_found, $fn_hit, $testdata); - } - - $converted = get_converted_lines($testdata); - # Generate source code view for this file - html_create(*HTML_HANDLE, "$rel_dir/$base_name.gcov.$html_ext"); - $pagetitle = "LCOV - $test_title - $trunc_dir/$base_name"; - write_html_prolog(*HTML_HANDLE, $base_dir, $pagetitle); - write_header(*HTML_HANDLE, 2, "$trunc_dir/$base_name", - "$rel_dir/$base_name", $lines_found, $lines_hit, - $fn_found, $fn_hit, 0); - @source = write_source(*HTML_HANDLE, $filename, $sumcount, $checkdata, - $converted, $funcdata); - - write_html_epilog(*HTML_HANDLE, $base_dir, 1); - close(*HTML_HANDLE); - - if ($func_coverage) { - # Create function tables - foreach (@funcview_sortlist) { - write_function_page($base_dir, $rel_dir, $trunc_dir, - $base_name, $test_title, - $lines_found, $lines_hit, - $fn_found, $fn_hit, $sumcount, - $funcdata, $sumfnccount, - $testfncdata, $_); - } - } - - # Additional files are needed in case of frame output - if (!$frames) - { - return ($lines_found, $lines_hit, - $fn_found, $fn_hit, $testdata); - } - - # Create overview png file - gen_png("$rel_dir/$base_name.gcov.png", $overview_width, $tab_size, - @source); - - # Create frameset page - html_create(*HTML_HANDLE, - "$rel_dir/$base_name.gcov.frameset.$html_ext"); - write_frameset(*HTML_HANDLE, $base_dir, $base_name, $pagetitle); - close(*HTML_HANDLE); - - # Write overview frame - html_create(*HTML_HANDLE, - "$rel_dir/$base_name.gcov.overview.$html_ext"); - write_overview(*HTML_HANDLE, $base_dir, $base_name, $pagetitle, - scalar(@source)); - close(*HTML_HANDLE); - - return ($lines_found, $lines_hit, $fn_found, $fn_hit, $testdata, - $testfncdata); -} - - -# -# read_info_file(info_filename) -# -# Read in the contents of the .info file specified by INFO_FILENAME. Data will -# be returned as a reference to a hash containing the following mappings: -# -# %result: for each filename found in file -> \%data -# -# %data: "test" -> \%testdata -# "sum" -> \%sumcount -# "func" -> \%funcdata -# "found" -> $lines_found (number of instrumented lines found in file) -# "hit" -> $lines_hit (number of executed lines in file) -# "check" -> \%checkdata -# "testfnc" -> \%testfncdata -# "sumfnc" -> \%sumfnccount -# -# %testdata : name of test affecting this file -> \%testcount -# %testfncdata: name of test affecting this file -> \%testfnccount -# -# %testcount : line number -> execution count for a single test -# %testfnccount: function name -> execution count for a single test -# %sumcount : line number -> execution count for all tests -# %sumfnccount : function name -> execution count for all tests -# %funcdata : function name -> line number -# %checkdata : line number -> checksum of source code line -# -# Note that .info file sections referring to the same file and test name -# will automatically be combined by adding all execution counts. -# -# Note that if INFO_FILENAME ends with ".gz", it is assumed that the file -# is compressed using GZIP. If available, GUNZIP will be used to decompress -# this file. -# -# Die on error. -# - -sub read_info_file($) -{ - my $tracefile = $_[0]; # Name of tracefile - my %result; # Resulting hash: file -> data - my $data; # Data handle for current entry - my $testdata; # " " - my $testcount; # " " - my $sumcount; # " " - my $funcdata; # " " - my $checkdata; # " " - my $testfncdata; - my $testfnccount; - my $sumfnccount; - my $line; # Current line read from .info file - my $testname; # Current test name - my $filename; # Current filename - my $hitcount; # Count for lines hit - my $count; # Execution count of current line - my $negative; # If set, warn about negative counts - my $changed_testname; # If set, warn about changed testname - my $line_checksum; # Checksum of current line - local *INFO_HANDLE; # Filehandle for .info file - - info("Reading data file $tracefile\n"); - - # Check if file exists and is readable - stat($_[0]); - if (!(-r _)) - { - die("ERROR: cannot read file $_[0]!\n"); - } - - # Check if this is really a plain file - if (!(-f _)) - { - die("ERROR: not a plain file: $_[0]!\n"); - } - - # Check for .gz extension - if ($_[0] =~ /\.gz$/) - { - # Check for availability of GZIP tool - system_no_output(1, "gunzip" ,"-h") - and die("ERROR: gunzip command not available!\n"); - - # Check integrity of compressed file - system_no_output(1, "gunzip", "-t", $_[0]) - and die("ERROR: integrity check failed for ". - "compressed file $_[0]!\n"); - - # Open compressed file - open(INFO_HANDLE, "gunzip -c $_[0]|") - or die("ERROR: cannot start gunzip to decompress ". - "file $_[0]!\n"); - } - else - { - # Open decompressed file - open(INFO_HANDLE, $_[0]) - or die("ERROR: cannot read file $_[0]!\n"); - } - - $testname = ""; - while (<INFO_HANDLE>) - { - chomp($_); - $line = $_; - - # Switch statement - foreach ($line) - { - /^TN:([^,]*)/ && do - { - # Test name information found - $testname = defined($1) ? $1 : ""; - if ($testname =~ s/\W/_/g) - { - $changed_testname = 1; - } - last; - }; - - /^[SK]F:(.*)/ && do - { - # Filename information found - # Retrieve data for new entry - $filename = $1; - - $data = $result{$filename}; - ($testdata, $sumcount, $funcdata, $checkdata, - $testfncdata, $sumfnccount) = - get_info_entry($data); - - if (defined($testname)) - { - $testcount = $testdata->{$testname}; - $testfnccount = $testfncdata->{$testname}; - } - else - { - $testcount = {}; - $testfnccount = {}; - } - last; - }; - - /^DA:(\d+),(-?\d+)(,[^,\s]+)?/ && do - { - # Fix negative counts - $count = $2 < 0 ? 0 : $2; - if ($2 < 0) - { - $negative = 1; - } - # Execution count found, add to structure - # Add summary counts - $sumcount->{$1} += $count; - - # Add test-specific counts - if (defined($testname)) - { - $testcount->{$1} += $count; - } - - # Store line checksum if available - if (defined($3)) - { - $line_checksum = substr($3, 1); - - # Does it match a previous definition - if (defined($checkdata->{$1}) && - ($checkdata->{$1} ne - $line_checksum)) - { - die("ERROR: checksum mismatch ". - "at $filename:$1\n"); - } - - $checkdata->{$1} = $line_checksum; - } - last; - }; - - /^FN:(\d+),([^,]+)/ && do - { - # Function data found, add to structure - $funcdata->{$2} = $1; - - # Also initialize function call data - if (!defined($sumfnccount->{$2})) { - $sumfnccount->{$2} = 0; - } - if (defined($testname)) - { - if (!defined($testfnccount->{$2})) { - $testfnccount->{$2} = 0; - } - } - last; - }; - - /^FNDA:(\d+),([^,]+)/ && do - { - # Function call count found, add to structure - # Add summary counts - $sumfnccount->{$2} += $1; - - # Add test-specific counts - if (defined($testname)) - { - $testfnccount->{$2} += $1; - } - last; - }; - /^end_of_record/ && do - { - # Found end of section marker - if ($filename) - { - # Store current section data - if (defined($testname)) - { - $testdata->{$testname} = - $testcount; - $testfncdata->{$testname} = - $testfnccount; - } - - set_info_entry($data, $testdata, - $sumcount, $funcdata, - $checkdata, $testfncdata, - $sumfnccount); - $result{$filename} = $data; - last; - } - }; - - # default - last; - } - } - close(INFO_HANDLE); - - # Calculate lines_found and lines_hit for each file - foreach $filename (keys(%result)) - { - $data = $result{$filename}; - - ($testdata, $sumcount, undef, undef, $testfncdata, - $sumfnccount) = get_info_entry($data); - - # Filter out empty files - if (scalar(keys(%{$sumcount})) == 0) - { - delete($result{$filename}); - next; - } - # Filter out empty test cases - foreach $testname (keys(%{$testdata})) - { - if (!defined($testdata->{$testname}) || - scalar(keys(%{$testdata->{$testname}})) == 0) - { - delete($testdata->{$testname}); - delete($testfncdata->{$testname}); - } - } - - $data->{"found"} = scalar(keys(%{$sumcount})); - $hitcount = 0; - - foreach (keys(%{$sumcount})) - { - if ($sumcount->{$_} > 0) { $hitcount++; } - } - - $data->{"hit"} = $hitcount; - - # Get found/hit values for function call data - $data->{"f_found"} = scalar(keys(%{$sumfnccount})); - $hitcount = 0; - - foreach (keys(%{$sumfnccount})) { - if ($sumfnccount->{$_} > 0) { - $hitcount++; - } - } - $data->{"f_hit"} = $hitcount; - } - - if (scalar(keys(%result)) == 0) - { - die("ERROR: no valid records found in tracefile $tracefile\n"); - } - if ($negative) - { - warn("WARNING: negative counts found in tracefile ". - "$tracefile\n"); - } - if ($changed_testname) - { - warn("WARNING: invalid characters removed from testname in ". - "tracefile $tracefile\n"); - } - - return(\%result); -} - - -# -# get_info_entry(hash_ref) -# -# Retrieve data from an entry of the structure generated by read_info_file(). -# Return a list of references to hashes: -# (test data hash ref, sum count hash ref, funcdata hash ref, checkdata hash -# ref, testfncdata hash ref, sumfnccount hash ref, lines found, lines hit, -# functions found, functions hit) -# - -sub get_info_entry($) -{ - my $testdata_ref = $_[0]->{"test"}; - my $sumcount_ref = $_[0]->{"sum"}; - my $funcdata_ref = $_[0]->{"func"}; - my $checkdata_ref = $_[0]->{"check"}; - my $testfncdata = $_[0]->{"testfnc"}; - my $sumfnccount = $_[0]->{"sumfnc"}; - my $lines_found = $_[0]->{"found"}; - my $lines_hit = $_[0]->{"hit"}; - my $fn_found = $_[0]->{"f_found"}; - my $fn_hit = $_[0]->{"f_hit"}; - - return ($testdata_ref, $sumcount_ref, $funcdata_ref, $checkdata_ref, - $testfncdata, $sumfnccount, $lines_found, $lines_hit, - $fn_found, $fn_hit); -} - - -# -# set_info_entry(hash_ref, testdata_ref, sumcount_ref, funcdata_ref, -# checkdata_ref, testfncdata_ref, sumfcncount_ref[,lines_found, -# lines_hit, f_found, f_hit]) -# -# Update the hash referenced by HASH_REF with the provided data references. -# - -sub set_info_entry($$$$$$$;$$$$) -{ - my $data_ref = $_[0]; - - $data_ref->{"test"} = $_[1]; - $data_ref->{"sum"} = $_[2]; - $data_ref->{"func"} = $_[3]; - $data_ref->{"check"} = $_[4]; - $data_ref->{"testfnc"} = $_[5]; - $data_ref->{"sumfnc"} = $_[6]; - - if (defined($_[7])) { $data_ref->{"found"} = $_[7]; } - if (defined($_[8])) { $data_ref->{"hit"} = $_[8]; } - if (defined($_[9])) { $data_ref->{"f_found"} = $_[9]; } - if (defined($_[10])) { $data_ref->{"f_hit"} = $_[10]; } -} - - -# -# add_counts(data1_ref, data2_ref) -# -# DATA1_REF and DATA2_REF are references to hashes containing a mapping -# -# line number -> execution count -# -# Return a list (RESULT_REF, LINES_FOUND, LINES_HIT) where RESULT_REF -# is a reference to a hash containing the combined mapping in which -# execution counts are added. -# - -sub add_counts($$) -{ - my %data1 = %{$_[0]}; # Hash 1 - my %data2 = %{$_[1]}; # Hash 2 - my %result; # Resulting hash - my $line; # Current line iteration scalar - my $data1_count; # Count of line in hash1 - my $data2_count; # Count of line in hash2 - my $found = 0; # Total number of lines found - my $hit = 0; # Number of lines with a count > 0 - - foreach $line (keys(%data1)) - { - $data1_count = $data1{$line}; - $data2_count = $data2{$line}; - - # Add counts if present in both hashes - if (defined($data2_count)) { $data1_count += $data2_count; } - - # Store sum in %result - $result{$line} = $data1_count; - - $found++; - if ($data1_count > 0) { $hit++; } - } - - # Add lines unique to data2 - foreach $line (keys(%data2)) - { - # Skip lines already in data1 - if (defined($data1{$line})) { next; } - - # Copy count from data2 - $result{$line} = $data2{$line}; - - $found++; - if ($result{$line} > 0) { $hit++; } - } - - return (\%result, $found, $hit); -} - - -# -# merge_checksums(ref1, ref2, filename) -# -# REF1 and REF2 are references to hashes containing a mapping -# -# line number -> checksum -# -# Merge checksum lists defined in REF1 and REF2 and return reference to -# resulting hash. Die if a checksum for a line is defined in both hashes -# but does not match. -# - -sub merge_checksums($$$) -{ - my $ref1 = $_[0]; - my $ref2 = $_[1]; - my $filename = $_[2]; - my %result; - my $line; - - foreach $line (keys(%{$ref1})) - { - if (defined($ref2->{$line}) && - ($ref1->{$line} ne $ref2->{$line})) - { - die("ERROR: checksum mismatch at $filename:$line\n"); - } - $result{$line} = $ref1->{$line}; - } - - foreach $line (keys(%{$ref2})) - { - $result{$line} = $ref2->{$line}; - } - - return \%result; -} - - -# -# merge_func_data(funcdata1, funcdata2, filename) -# - -sub merge_func_data($$$) -{ - my ($funcdata1, $funcdata2, $filename) = @_; - my %result; - my $func; - - %result = %{$funcdata1}; - - foreach $func (keys(%{$funcdata2})) { - my $line1 = $result{$func}; - my $line2 = $funcdata2->{$func}; - - if (defined($line1) && ($line1 != $line2)) { - warn("WARNING: function data mismatch at ". - "$filename:$line2\n"); - next; - } - $result{$func} = $line2; - } - - return \%result; -} - - -# -# add_fnccount(fnccount1, fnccount2) -# -# Add function call count data. Return list (fnccount_added, f_found, f_hit) -# - -sub add_fnccount($$) -{ - my ($fnccount1, $fnccount2) = @_; - my %result; - my $fn_found; - my $fn_hit; - my $function; - - %result = %{$fnccount1}; - foreach $function (keys(%{$fnccount2})) { - $result{$function} += $fnccount2->{$function}; - } - $fn_found = scalar(keys(%result)); - $fn_hit = 0; - foreach $function (keys(%result)) { - if ($result{$function} > 0) { - $fn_hit++; - } - } - - return (\%result, $fn_found, $fn_hit); -} - -# -# add_testfncdata(testfncdata1, testfncdata2) -# -# Add function call count data for several tests. Return reference to -# added_testfncdata. -# - -sub add_testfncdata($$) -{ - my ($testfncdata1, $testfncdata2) = @_; - my %result; - my $testname; - - foreach $testname (keys(%{$testfncdata1})) { - if (defined($testfncdata2->{$testname})) { - my $fnccount; - - # Function call count data for this testname exists - # in both data sets: add - ($fnccount) = add_fnccount( - $testfncdata1->{$testname}, - $testfncdata2->{$testname}); - $result{$testname} = $fnccount; - next; - } - # Function call count data for this testname is unique to - # data set 1: copy - $result{$testname} = $testfncdata1->{$testname}; - } - - # Add count data for testnames unique to data set 2 - foreach $testname (keys(%{$testfncdata2})) { - if (!defined($result{$testname})) { - $result{$testname} = $testfncdata2->{$testname}; - } - } - return \%result; -} - -# -# combine_info_entries(entry_ref1, entry_ref2, filename) -# -# Combine .info data entry hashes referenced by ENTRY_REF1 and ENTRY_REF2. -# Return reference to resulting hash. -# - -sub combine_info_entries($$$) -{ - my $entry1 = $_[0]; # Reference to hash containing first entry - my $testdata1; - my $sumcount1; - my $funcdata1; - my $checkdata1; - my $testfncdata1; - my $sumfnccount1; - - my $entry2 = $_[1]; # Reference to hash containing second entry - my $testdata2; - my $sumcount2; - my $funcdata2; - my $checkdata2; - my $testfncdata2; - my $sumfnccount2; - - my %result; # Hash containing combined entry - my %result_testdata; - my $result_sumcount = {}; - my $result_funcdata; - my $result_testfncdata; - my $result_sumfnccount; - my $lines_found; - my $lines_hit; - my $fn_found; - my $fn_hit; - - my $testname; - my $filename = $_[2]; - - # Retrieve data - ($testdata1, $sumcount1, $funcdata1, $checkdata1, $testfncdata1, - $sumfnccount1) = get_info_entry($entry1); - ($testdata2, $sumcount2, $funcdata2, $checkdata2, $testfncdata2, - $sumfnccount2) = get_info_entry($entry2); - - # Merge checksums - $checkdata1 = merge_checksums($checkdata1, $checkdata2, $filename); - - # Combine funcdata - $result_funcdata = merge_func_data($funcdata1, $funcdata2, $filename); - - # Combine function call count data - $result_testfncdata = add_testfncdata($testfncdata1, $testfncdata2); - ($result_sumfnccount, $fn_found, $fn_hit) = - add_fnccount($sumfnccount1, $sumfnccount2); - - # Combine testdata - foreach $testname (keys(%{$testdata1})) - { - if (defined($testdata2->{$testname})) - { - # testname is present in both entries, requires - # combination - ($result_testdata{$testname}) = - add_counts($testdata1->{$testname}, - $testdata2->{$testname}); - } - else - { - # testname only present in entry1, add to result - $result_testdata{$testname} = $testdata1->{$testname}; - } - - # update sum count hash - ($result_sumcount, $lines_found, $lines_hit) = - add_counts($result_sumcount, - $result_testdata{$testname}); - } - - foreach $testname (keys(%{$testdata2})) - { - # Skip testnames already covered by previous iteration - if (defined($testdata1->{$testname})) { next; } - - # testname only present in entry2, add to result hash - $result_testdata{$testname} = $testdata2->{$testname}; - - # update sum count hash - ($result_sumcount, $lines_found, $lines_hit) = - add_counts($result_sumcount, - $result_testdata{$testname}); - } - - # Calculate resulting sumcount - - # Store result - set_info_entry(\%result, \%result_testdata, $result_sumcount, - $result_funcdata, $checkdata1, $result_testfncdata, - $result_sumfnccount, $lines_found, $lines_hit, - $fn_found, $fn_hit); - - return(\%result); -} - - -# -# combine_info_files(info_ref1, info_ref2) -# -# Combine .info data in hashes referenced by INFO_REF1 and INFO_REF2. Return -# reference to resulting hash. -# - -sub combine_info_files($$) -{ - my %hash1 = %{$_[0]}; - my %hash2 = %{$_[1]}; - my $filename; - - foreach $filename (keys(%hash2)) - { - if ($hash1{$filename}) - { - # Entry already exists in hash1, combine them - $hash1{$filename} = - combine_info_entries($hash1{$filename}, - $hash2{$filename}, - $filename); - } - else - { - # Entry is unique in both hashes, simply add to - # resulting hash - $hash1{$filename} = $hash2{$filename}; - } - } - - return(\%hash1); -} - - -# -# get_prefix(filename_list) -# -# Search FILENAME_LIST for a directory prefix which is common to as many -# list entries as possible, so that removing this prefix will minimize the -# sum of the lengths of all resulting shortened filenames. -# - -sub get_prefix(@) -{ - my @filename_list = @_; # provided list of filenames - my %prefix; # mapping: prefix -> sum of lengths - my $current; # Temporary iteration variable - - # Find list of prefixes - foreach (@filename_list) - { - # Need explicit assignment to get a copy of $_ so that - # shortening the contained prefix does not affect the list - $current = shorten_prefix($_); - while ($current = shorten_prefix($current)) - { - # Skip rest if the remaining prefix has already been - # added to hash - if ($prefix{$current}) { last; } - - # Initialize with 0 - $prefix{$current}="0"; - } - - } - - # Calculate sum of lengths for all prefixes - foreach $current (keys(%prefix)) - { - foreach (@filename_list) - { - # Add original length - $prefix{$current} += length($_); - - # Check whether prefix matches - if (substr($_, 0, length($current)) eq $current) - { - # Subtract prefix length for this filename - $prefix{$current} -= length($current); - } - } - } - - # Find and return prefix with minimal sum - $current = (keys(%prefix))[0]; - - foreach (keys(%prefix)) - { - if ($prefix{$_} < $prefix{$current}) - { - $current = $_; - } - } - - return($current); -} - - -# -# shorten_prefix(prefix) -# -# Return PREFIX shortened by last directory component. -# - -sub shorten_prefix($) -{ - my @list = split("/", $_[0]); - - pop(@list); - return join("/", @list); -} - - - -# -# get_dir_list(filename_list) -# -# Return sorted list of directories for each entry in given FILENAME_LIST. -# - -sub get_dir_list(@) -{ - my %result; - - foreach (@_) - { - $result{shorten_prefix($_)} = ""; - } - - return(sort(keys(%result))); -} - - -# -# get_relative_base_path(subdirectory) -# -# Return a relative path string which references the base path when applied -# in SUBDIRECTORY. -# -# Example: get_relative_base_path("fs/mm") -> "../../" -# - -sub get_relative_base_path($) -{ - my $result = ""; - my $index; - - # Make an empty directory path a special case - if (!$_[0]) { return(""); } - - # Count number of /s in path - $index = ($_[0] =~ s/\//\//g); - - # Add a ../ to $result for each / in the directory path + 1 - for (; $index>=0; $index--) - { - $result .= "../"; - } - - return $result; -} - - -# -# read_testfile(test_filename) -# -# Read in file TEST_FILENAME which contains test descriptions in the format: -# -# TN:<whitespace><test name> -# TD:<whitespace><test description> -# -# for each test case. Return a reference to a hash containing a mapping -# -# test name -> test description. -# -# Die on error. -# - -sub read_testfile($) -{ - my %result; - my $test_name; - my $changed_testname; - local *TEST_HANDLE; - - open(TEST_HANDLE, "<".$_[0]) - or die("ERROR: cannot open $_[0]!\n"); - - while (<TEST_HANDLE>) - { - chomp($_); - - # Match lines beginning with TN:<whitespace(s)> - if (/^TN:\s+(.*?)\s*$/) - { - # Store name for later use - $test_name = $1; - if ($test_name =~ s/\W/_/g) - { - $changed_testname = 1; - } - } - - # Match lines beginning with TD:<whitespace(s)> - if (/^TD:\s+(.*?)\s*$/) - { - # Check for empty line - if ($1) - { - # Add description to hash - $result{$test_name} .= " $1"; - } - else - { - # Add empty line - $result{$test_name} .= "\n\n"; - } - } - } - - close(TEST_HANDLE); - - if ($changed_testname) - { - warn("WARNING: invalid characters removed from testname in ". - "descriptions file $_[0]\n"); - } - - return \%result; -} - - -# -# escape_html(STRING) -# -# Return a copy of STRING in which all occurrences of HTML special characters -# are escaped. -# - -sub escape_html($) -{ - my $string = $_[0]; - - if (!$string) { return ""; } - - $string =~ s/&/&/g; # & -> & - $string =~ s/</</g; # < -> < - $string =~ s/>/>/g; # > -> > - $string =~ s/\"/"/g; # " -> " - - while ($string =~ /^([^\t]*)(\t)/) - { - my $replacement = " "x($tab_size - (length($1) % $tab_size)); - $string =~ s/^([^\t]*)(\t)/$1$replacement/; - } - - $string =~ s/\n/<br>/g; # \n -> <br> - - return $string; -} - - -# -# get_date_string() -# -# Return the current date in the form: yyyy-mm-dd -# - -sub get_date_string() -{ - my $year; - my $month; - my $day; - - ($year, $month, $day) = (localtime())[5, 4, 3]; - - return sprintf("%d-%02d-%02d", $year+1900, $month+1, $day); -} - - -# -# create_sub_dir(dir_name) -# -# Create subdirectory DIR_NAME if it does not already exist, including all its -# parent directories. -# -# Die on error. -# - -sub create_sub_dir($) -{ - system("mkdir", "-p" ,$_[0]) - and die("ERROR: cannot create directory $_!\n"); -} - - -# -# write_description_file(descriptions, overall_found, overall_hit, -# total_fn_found, total_fn_hit) -# -# Write HTML file containing all test case descriptions. DESCRIPTIONS is a -# reference to a hash containing a mapping -# -# test case name -> test case description -# -# Die on error. -# - -sub write_description_file($$$$$) -{ - my %description = %{$_[0]}; - my $found = $_[1]; - my $hit = $_[2]; - my $fn_found = $_[3]; - my $fn_hit = $_[4]; - my $test_name; - local *HTML_HANDLE; - - html_create(*HTML_HANDLE,"descriptions.$html_ext"); - write_html_prolog(*HTML_HANDLE, "", "LCOV - test case descriptions"); - write_header(*HTML_HANDLE, 3, "", "", $found, $hit, $fn_found, - $fn_hit, 0); - - write_test_table_prolog(*HTML_HANDLE, - "Test case descriptions - alphabetical list"); - - foreach $test_name (sort(keys(%description))) - { - write_test_table_entry(*HTML_HANDLE, $test_name, - escape_html($description{$test_name})); - } - - write_test_table_epilog(*HTML_HANDLE); - write_html_epilog(*HTML_HANDLE, ""); - - close(*HTML_HANDLE); -} - - - -# -# write_png_files() -# -# Create all necessary .png files for the HTML-output in the current -# directory. .png-files are used as bar graphs. -# -# Die on error. -# - -sub write_png_files() -{ - my %data; - local *PNG_HANDLE; - - $data{"ruby.png"} = - [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, - 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x25, - 0xdb, 0x56, 0xca, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, - 0x45, 0x07, 0xd2, 0x07, 0x11, 0x0f, 0x18, 0x10, 0x5d, 0x57, - 0x34, 0x6e, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, - 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, - 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, - 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, - 0x00, 0x00, 0x06, 0x50, 0x4c, 0x54, 0x45, 0xff, 0x35, 0x2f, - 0x00, 0x00, 0x00, 0xd0, 0x33, 0x9a, 0x9d, 0x00, 0x00, 0x00, - 0x0a, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x01, 0xe5, 0x27, 0xde, 0xfc, 0x00, - 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, - 0x82]; - $data{"amber.png"} = - [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, - 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x25, - 0xdb, 0x56, 0xca, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, - 0x45, 0x07, 0xd2, 0x07, 0x11, 0x0f, 0x28, 0x04, 0x98, 0xcb, - 0xd6, 0xe0, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, - 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, - 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, - 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, - 0x00, 0x00, 0x06, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xe0, 0x50, - 0x00, 0x00, 0x00, 0xa2, 0x7a, 0xda, 0x7e, 0x00, 0x00, 0x00, - 0x0a, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x01, 0xe5, 0x27, 0xde, 0xfc, 0x00, - 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, - 0x82]; - $data{"emerald.png"} = - [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, - 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x25, - 0xdb, 0x56, 0xca, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, - 0x45, 0x07, 0xd2, 0x07, 0x11, 0x0f, 0x22, 0x2b, 0xc9, 0xf5, - 0x03, 0x33, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, - 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, - 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, - 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, - 0x00, 0x00, 0x06, 0x50, 0x4c, 0x54, 0x45, 0x1b, 0xea, 0x59, - 0x0a, 0x0a, 0x0a, 0x0f, 0xba, 0x50, 0x83, 0x00, 0x00, 0x00, - 0x0a, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x01, 0xe5, 0x27, 0xde, 0xfc, 0x00, - 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, - 0x82]; - $data{"snow.png"} = - [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, - 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x25, - 0xdb, 0x56, 0xca, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, - 0x45, 0x07, 0xd2, 0x07, 0x11, 0x0f, 0x1e, 0x1d, 0x75, 0xbc, - 0xef, 0x55, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, - 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, - 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, - 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, - 0x00, 0x00, 0x06, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x55, 0xc2, 0xd3, 0x7e, 0x00, 0x00, 0x00, - 0x0a, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x01, 0xe5, 0x27, 0xde, 0xfc, 0x00, - 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, - 0x82]; - $data{"glass.png"} = - [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, - 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x25, - 0xdb, 0x56, 0xca, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, - 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, - 0x00, 0x00, 0x06, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x55, 0xc2, 0xd3, 0x7e, 0x00, 0x00, 0x00, - 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, - 0x00, 0x00, 0x00, 0x01, 0x62, 0x4b, 0x47, 0x44, 0x00, 0x88, - 0x05, 0x1d, 0x48, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, - 0x73, 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, - 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, - 0x4d, 0x45, 0x07, 0xd2, 0x07, 0x13, 0x0f, 0x08, 0x19, 0xc4, - 0x40, 0x56, 0x10, 0x00, 0x00, 0x00, 0x0a, 0x49, 0x44, 0x41, - 0x54, 0x78, 0x9c, 0x63, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x01, 0x48, 0xaf, 0xa4, 0x71, 0x00, 0x00, 0x00, 0x00, 0x49, - 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82]; - $data{"updown.png"} = - [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, - 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0a, - 0x00, 0x00, 0x00, 0x0e, 0x08, 0x06, 0x00, 0x00, 0x00, 0x16, - 0xa3, 0x8d, 0xab, 0x00, 0x00, 0x00, 0x3c, 0x49, 0x44, 0x41, - 0x54, 0x28, 0xcf, 0x63, 0x60, 0x40, 0x03, 0xff, 0xa1, 0x00, - 0x5d, 0x9c, 0x11, 0x5d, 0x11, 0x8a, 0x24, 0x23, 0x23, 0x23, - 0x86, 0x42, 0x6c, 0xa6, 0x20, 0x2b, 0x66, 0xc4, 0xa7, 0x08, - 0x59, 0x31, 0x23, 0x21, 0x45, 0x30, 0xc0, 0xc4, 0x30, 0x60, - 0x80, 0xfa, 0x6e, 0x24, 0x3e, 0x78, 0x48, 0x0a, 0x70, 0x62, - 0xa2, 0x90, 0x81, 0xd8, 0x44, 0x01, 0x00, 0xe9, 0x5c, 0x2f, - 0xf5, 0xe2, 0x9d, 0x0f, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x49, - 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82] if ($sort); - foreach (keys(%data)) - { - open(PNG_HANDLE, ">".$_) - or die("ERROR: cannot create $_!\n"); - binmode(PNG_HANDLE); - print(PNG_HANDLE map(chr,@{$data{$_}})); - close(PNG_HANDLE); - } -} - - -# -# write_htaccess_file() -# - -sub write_htaccess_file() -{ - local *HTACCESS_HANDLE; - my $htaccess_data; - - open(*HTACCESS_HANDLE, ">.htaccess") - or die("ERROR: cannot open .htaccess for writing!\n"); - - $htaccess_data = (<<"END_OF_HTACCESS") -AddEncoding x-gzip .html -END_OF_HTACCESS - ; - - print(HTACCESS_HANDLE $htaccess_data); - close(*HTACCESS_HANDLE); -} - - -# -# write_css_file() -# -# Write the cascading style sheet file gcov.css to the current directory. -# This file defines basic layout attributes of all generated HTML pages. -# - -sub write_css_file() -{ - local *CSS_HANDLE; - - # Check for a specified external style sheet file - if ($css_filename) - { - # Simply copy that file - system("cp", $css_filename, "gcov.css") - and die("ERROR: cannot copy file $css_filename!\n"); - return; - } - - open(CSS_HANDLE, ">gcov.css") - or die ("ERROR: cannot open gcov.css for writing!\n"); - - - # ************************************************************* - - my $css_data = ($_=<<"END_OF_CSS") - /* All views: initial background and text color */ - body - { - color: #000000; - background-color: #FFFFFF; - } - - /* All views: standard link format*/ - a:link - { - color: #284FA8; - text-decoration: underline; - } - - /* All views: standard link - visited format */ - a:visited - { - color: #00CB40; - text-decoration: underline; - } - - /* All views: standard link - activated format */ - a:active - { - color: #FF0040; - text-decoration: underline; - } - - /* All views: main title format */ - td.title - { - text-align: center; - padding-bottom: 10px; - font-family: sans-serif; - font-size: 20pt; - font-style: italic; - font-weight: bold; - } - - /* All views: header item format */ - td.headerItem - { - text-align: right; - padding-right: 6px; - font-family: sans-serif; - font-weight: bold; - vertical-align: top; - white-space: nowrap; - } - - /* All views: header item value format */ - td.headerValue - { - text-align: left; - color: #284FA8; - font-family: sans-serif; - font-weight: bold; - white-space: nowrap; - } - - /* All views: header item coverage table heading */ - td.headerCovTableHead - { - text-align: center; - padding-right: 6px; - padding-left: 6px; - padding-bottom: 0px; - font-family: sans-serif; - font-size: 80%; - white-space: nowrap; - } - - /* All views: header item coverage table entry */ - td.headerCovTableEntry - { - text-align: right; - color: #284FA8; - font-family: sans-serif; - font-weight: bold; - white-space: nowrap; - padding-left: 12px; - padding-right: 4px; - background-color: #DAE7FE; - } - - /* All views: header item coverage table entry for high coverage rate */ - td.headerCovTableEntryHi - { - text-align: right; - color: #000000; - font-family: sans-serif; - font-weight: bold; - white-space: nowrap; - padding-left: 12px; - padding-right: 4px; - background-color: #A7FC9D; - } - - /* All views: header item coverage table entry for medium coverage rate */ - td.headerCovTableEntryMed - { - text-align: right; - color: #000000; - font-family: sans-serif; - font-weight: bold; - white-space: nowrap; - padding-left: 12px; - padding-right: 4px; - background-color: #FFEA20; - } - - /* All views: header item coverage table entry for ow coverage rate */ - td.headerCovTableEntryLo - { - text-align: right; - color: #000000; - font-family: sans-serif; - font-weight: bold; - white-space: nowrap; - padding-left: 12px; - padding-right: 4px; - background-color: #FF0000; - } - - /* All views: header legend item for legend entry */ - td.headerItemLeg - { - text-align: right; - padding-right: 6px; - font-family: sans-serif; - font-weight: bold; - vertical-align: bottom; - white-space: nowrap; - } - - /* All views: header legend value for legend entry */ - td.headerValueLeg - { - text-align: left; - color: #000000; - font-family: sans-serif; - font-size: 80%; - white-space: nowrap; - padding-top: 4px; - } - - /* All views: color of horizontal ruler */ - td.ruler - { - background-color: #6688D4; - } - - /* All views: version string format */ - td.versionInfo - { - text-align: center; - padding-top: 2px; - font-family: sans-serif; - font-style: italic; - } - - /* Directory view/File view (all)/Test case descriptions: - table headline format */ - td.tableHead - { - text-align: center; - color: #FFFFFF; - background-color: #6688D4; - font-family: sans-serif; - font-size: 120%; - font-weight: bold; - white-space: nowrap; - padding-left: 4px; - padding-right: 4px; - } - - span.tableHeadSort - { - padding-right: 4px; - } - - /* Directory view/File view (all): filename entry format */ - td.coverFile - { - text-align: left; - padding-left: 10px; - padding-right: 20px; - color: #284FA8; - background-color: #DAE7FE; - font-family: monospace; - } - - /* Directory view/File view (all): bar-graph entry format*/ - td.coverBar - { - padding-left: 10px; - padding-right: 10px; - background-color: #DAE7FE; - } - - /* Directory view/File view (all): bar-graph outline color */ - td.coverBarOutline - { - background-color: #000000; - } - - /* Directory view/File view (all): percentage entry for files with - high coverage rate */ - td.coverPerHi - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #A7FC9D; - font-weight: bold; - } - - /* Directory view/File view (all): line count entry for files with - high coverage rate */ - td.coverNumHi - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #A7FC9D; - white-space: nowrap; - } - - /* Directory view/File view (all): legend entry for high coverage - rate */ - span.coverLegendHi - { - padding-left: 10px; - padding-right: 10px; - padding-bottom: 2px; - background-color: #A7FC9D; - } - - /* Directory view/File view (all): percentage entry for files with - medium coverage rate */ - td.coverPerMed - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #FFEA20; - font-weight: bold; - } - - /* Directory view/File view (all): line count entry for files with - medium coverage rate */ - td.coverNumMed - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #FFEA20; - white-space: nowrap; - } - - /* Directory view/File view (all): legend entry for medium coverage - rate */ - span.coverLegendMed - { - padding-left: 10px; - padding-right: 10px; - padding-bottom: 2px; - background-color: #FFEA20; - } - - /* Directory view/File view (all): percentage entry for files with - low coverage rate */ - td.coverPerLo - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #FF0000; - font-weight: bold; - } - - /* Directory view/File view (all): line count entry for files with - low coverage rate */ - td.coverNumLo - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #FF0000; - white-space: nowrap; - } - - /* Directory view/File view (all): legend entry for low coverage - rate */ - span.coverLegendLo - { - padding-left: 10px; - padding-right: 10px; - padding-bottom: 2px; - background-color: #FF0000; - } - - /* File view (all): "show/hide details" link format */ - a.detail:link - { - color: #B8D0FF; - } - - /* File view (all): "show/hide details" link - visited format */ - a.detail:visited - { - color: #B8D0FF; - } - - /* File view (all): "show/hide details" link - activated format */ - a.detail:active - { - color: #FFFFFF; - } - - /* File view (detail): test name table headline format */ - td.testNameHead - { - text-align: right; - padding-right: 10px; - background-color: #DAE7FE; - font-family: sans-serif; - font-weight: bold; - } - - /* File view (detail): test lines table headline format */ - td.testLinesHead - { - text-align: center; - background-color: #DAE7FE; - font-family: sans-serif; - font-weight: bold; - } - - /* File view (detail): test name entry */ - td.testName - { - text-align: right; - padding-right: 10px; - background-color: #DAE7FE; - } - - /* File view (detail): test percentage entry */ - td.testPer - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #DAE7FE; - } - - /* File view (detail): test lines count entry */ - td.testNum - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #DAE7FE; - } - - /* Test case descriptions: test name format*/ - dt - { - font-family: sans-serif; - font-weight: bold; - } - - /* Test case descriptions: description table body */ - td.testDescription - { - padding-top: 10px; - padding-left: 30px; - padding-bottom: 10px; - padding-right: 30px; - background-color: #DAE7FE; - } - - /* Source code view: function entry */ - td.coverFn - { - text-align: left; - padding-left: 10px; - padding-right: 20px; - color: #284FA8; - background-color: #DAE7FE; - font-family: monospace; - } - - /* Source code view: function entry zero count*/ - td.coverFnLo - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #FF0000; - font-weight: bold; - } - - /* Source code view: function entry nonzero count*/ - td.coverFnHi - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #DAE7FE; - font-weight: bold; - } - - /* Source code view: source code format */ - /* Source code view: source code format */ - pre.source - { - font-family: monospace; - white-space: pre; - } - - /* Source code view: line number format */ - span.lineNum - { - background-color: #EFE383; - } - - /* Source code view: format for lines which were executed */ - td.lineCov, - span.lineCov - { - background-color: #CAD7FE; - } - - /* Source code view: format for Cov legend */ - span.coverLegendCov - { - padding-left: 10px; - padding-right: 10px; - padding-bottom: 2px; - background-color: #CAD7FE; - } - - /* Source code view: format for lines which were not executed */ - td.lineNoCov, - span.lineNoCov - { - background-color: #FF6230; - } - - /* Source code view: format for NoCov legend */ - span.coverLegendNoCov - { - padding-left: 10px; - padding-right: 10px; - padding-bottom: 2px; - background-color: #FF0000; - } - - /* Source code view (function table): standard link - visited format */ - td.lineNoCov > a:visited, - td.lineCov > a:visited - { - color: black; - text-decoration: underline; - } - - /* Source code view: format for lines which were executed only in a - previous version */ - span.lineDiffCov - { - background-color: #B5F7AF; - } - - /* Source code view: format for DiffCov legend */ - span.LegendDiffCov - { - text-align: center; - padding-left: 10px; - padding-right: 10px; - background-color: #B5F7AF; - } -END_OF_CSS - ; - - # ************************************************************* - - - # Remove leading tab from all lines - $css_data =~ s/^\t//gm; - - print(CSS_HANDLE $css_data); - - close(CSS_HANDLE); -} - - -# -# get_bar_graph_code(base_dir, cover_found, cover_hit) -# -# Return a string containing HTML code which implements a bar graph display -# for a coverage rate of cover_hit * 100 / cover_found. -# - -sub get_bar_graph_code($$$) -{ - my $rate; - my $alt; - my $width; - my $remainder; - my $png_name; - my $graph_code; - - # Check number of instrumented lines - if ($_[1] == 0) { return ""; } - - $rate = $_[2] * 100 / $_[1]; - $alt = sprintf("%.1f", $rate)."%"; - $width = sprintf("%.0f", $rate); - $remainder = sprintf("%d", 100-$width); - - # Decide which .png file to use - $png_name = $rate_png[classify_rate($_[1], $_[2], $med_limit, - $hi_limit)]; - - if ($width == 0) - { - # Zero coverage - $graph_code = (<<END_OF_HTML) - <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="$_[0]snow.png" width=100 height=10 alt="$alt"></td></tr></table> -END_OF_HTML - ; - } - elsif ($width == 100) - { - # Full coverage - $graph_code = (<<END_OF_HTML) - <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="$_[0]$png_name" width=100 height=10 alt="$alt"></td></tr></table> -END_OF_HTML - ; - } - else - { - # Positive coverage - $graph_code = (<<END_OF_HTML) - <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="$_[0]$png_name" width=$width height=10 alt="$alt"><img src="$_[0]snow.png" width=$remainder height=10 alt="$alt"></td></tr></table> -END_OF_HTML - ; - } - - # Remove leading tabs from all lines - $graph_code =~ s/^\t+//gm; - chomp($graph_code); - - return($graph_code); -} - -# -# sub classify_rate(found, hit, med_limit, high_limit) -# -# Return 0 for low rate, 1 for medium rate and 2 for hi rate. -# - -sub classify_rate($$$$) -{ - my ($found, $hit, $med, $hi) = @_; - my $rate; - - if ($found == 0) { - return 2; - } - $rate = $hit * 100 / $found; - if ($rate < $med) { - return 0; - } elsif ($rate < $hi) { - return 1; - } - return 2; -} - - -# -# write_html(filehandle, html_code) -# -# Write out HTML_CODE to FILEHANDLE while removing a leading tabulator mark -# in each line of HTML_CODE. -# - -sub write_html(*$) -{ - local *HTML_HANDLE = $_[0]; - my $html_code = $_[1]; - - # Remove leading tab from all lines - $html_code =~ s/^\t//gm; - - print(HTML_HANDLE $html_code) - or die("ERROR: cannot write HTML data ($!)\n"); -} - - -# -# write_html_prolog(filehandle, base_dir, pagetitle) -# -# Write an HTML prolog common to all HTML files to FILEHANDLE. PAGETITLE will -# be used as HTML page title. BASE_DIR contains a relative path which points -# to the base directory. -# - -sub write_html_prolog(*$$) -{ - my $basedir = $_[1]; - my $pagetitle = $_[2]; - my $prolog; - - $prolog = $html_prolog; - $prolog =~ s/\@pagetitle\@/$pagetitle/g; - $prolog =~ s/\@basedir\@/$basedir/g; - - write_html($_[0], $prolog); -} - - -# -# write_header_prolog(filehandle, base_dir) -# -# Write beginning of page header HTML code. -# - -sub write_header_prolog(*$) -{ - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <table width="100%" border=0 cellspacing=0 cellpadding=0> - <tr><td class="title">$title</td></tr> - <tr><td class="ruler"><img src="$_[1]glass.png" width=3 height=3 alt=""></td></tr> - - <tr> - <td width="100%"> - <table cellpadding=1 border=0 width="100%"> -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_header_line(filehandle, type, additional params..) -# -# Write a header line. -# - -sub write_header_line(*$@) -{ - my $HANDLE = shift; - my $type = shift; - my @args = @_; - - # Reduce indentation by using gotos - if ($type eq 0) { - goto header; - } elsif ($type eq 1) { - goto body; - } elsif ($type eq 2) { - goto legend_dir; - } elsif ($type eq 3) { - goto legend_source; - } elsif ($type eq 4) { - goto half_body; - } - -header: - # ************************************************************* - write_html($HANDLE, <<END_OF_HTML); - <tr> - <td width="5%"></td> - <td width="10%" class="headerItem">$args[0]</td> - <td width="35%" class="headerValue">$args[1]</td> - <td width="10%"></td> - <td width="10%" class="headerCovTableHead">$args[2]</td> - <td width="10%" class="headerCovTableHead">$args[3]</td> - <td width="15%" class="headerCovTableHead">$args[4]</td> - <td width="5%"></td> - </tr> -END_OF_HTML - # ************************************************************* - return; - -body: - # ************************************************************* - write_html($HANDLE, <<END_OF_HTML); - <tr> - <td></td> - <td class="headerItem">$args[0]</td> - <td class="headerValue">$args[1]</td> - <td class="headerItem">$args[2]</td> - <td class="headerCovTableEntry">$args[3]</td> - <td class="headerCovTableEntry">$args[4]</td> - <td class="headerCovTableEntry$args[5]">$args[6]</td> - </tr> -END_OF_HTML - # ************************************************************* - return; - -half_body: - # ************************************************************* - write_html($HANDLE, <<END_OF_HTML); - <tr> - <td></td> - <td class="headerItem">$args[0]</td> - <td class="headerValue">$args[1]</td> - </tr> -END_OF_HTML - # ************************************************************* - return; - -legend_dir: - # ************************************************************* - write_html($HANDLE, <<END_OF_HTML); - <tr> - <td></td> - <td class="headerItemLeg">$args[0]</td> - <td class="headerValueLeg"> -$args[1] </td> - <td></td> - <td class="headerValueLeg" colspan=3> -$args[2] </td> - </tr> -END_OF_HTML - # ************************************************************* - return; - -legend_source: - # ************************************************************* - write_html($HANDLE, <<END_OF_HTML); - <tr> - <td></td> - <td class="headerItem">$args[0]</td> - <td class="headerValueLeg" colspan=5> - <span class="coverLegendNoCov">$args[1]</span> - <span class="coverLegendCov">$args[2]</span> - </td> - </tr> -END_OF_HTML - # ************************************************************* -} - - -# -# write_header_epilog(filehandle, base_dir) -# -# Write end of page header HTML code. -# - -sub write_header_epilog(*$) -{ - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <tr><td><img src="$_[1]glass.png" width=3 height=3 alt=""></td></tr> - </table> - </td> - </tr> - <tr><td class="ruler"><img src="$_[1]glass.png" width=3 height=3 alt=""></td></tr> - </table> - -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_file_table_prolog(filehandle, file_heading, lines_heading, func_heading) -# -# Write heading for file table. -# - -sub write_file_table_prolog(*$$$) -{ - # ************************************************************* - - if ($func_coverage) - { - write_html($_[0], <<END_OF_HTML) - <center> - <table width="80%" cellpadding=1 cellspacing=1 border=0> - - <tr> - <td width="45%"><br></td> - <td width="15%"></td> - <td width="10%"></td> - <td width="10%"></td> - <td width="10%"></td> - <td width="10%"></td> - </tr> - - <tr> - <td class="tableHead">$_[1]</td> - <td class="tableHead" colspan=3>$_[2]</td> - <td class="tableHead" colspan=2>$_[3]</td> - </tr> - -END_OF_HTML - ; - } - else - { - write_html($_[0], <<END_OF_HTML) - <center> - <table width="80%" cellpadding=1 cellspacing=1 border=0> - - <tr> - <td width="50%"><br></td> - <td width="15%"></td> - <td width="15%"></td> - <td width="20%"></td> - </tr> - - <tr> - <td class="tableHead">$_[1]</td> - <td class="tableHead" colspan=3>$_[2]</td> - </tr> - -END_OF_HTML - ; - } - - # ************************************************************* -} - - -# -# write_file_table_entry(filehandle, cover_filename, cover_bar_graph, -# cover_found, cover_hit, fn_found, fn_hit, -# page_link, func_link) -# -# Write an entry of the file table. -# - -sub write_file_table_entry(*$$$$$$$) -{ - local *HANDLE = shift; - my ($filename, $bar_graph, $found, $hit, $fn_found, $fn_hit, - $page_link) = @_; - my $rate; - my $rate_string; - my $funcs_string; - my $class_lines = "Lo"; - my $class_funcs = "Hi"; - my $file_code; - - # Add link to source if provided - if (defined($page_link) && $page_link ne "") { - $file_code = "<a href=\"$page_link\">$filename</a>"; - } else { - $file_code = $filename; - } - - # Get line coverage rate - if ($found > 0) - { - $rate = $hit * 100 / $found; - $rate_string = sprintf("%.1f", $rate)." %"; - - $class_lines = $rate_name[classify_rate($found, $hit, - $med_limit, $hi_limit)]; - } - else - { - $rate_string = "-"; - } - - # Get function coverage rate - if ($fn_found > 0) - { - $rate = $fn_hit * 100 / $fn_found; - $class_funcs = $rate_name[classify_rate($fn_found, $fn_hit, - $fn_med_limit, $fn_hi_limit)]; - $funcs_string = sprintf("%.1f", $rate)." %"; - } - else - { - # Define 0 of 0 functions as 100% - $rate = 100; - $funcs_string = "-"; - } - - # ************************************************************* - - write_html(*HANDLE, <<END_OF_HTML) - <tr> - <td class="coverFile">$file_code</td> - <td class="coverBar" align="center"> - $bar_graph - </td> - <td class="coverPer$class_lines">$rate_string</td> - <td class="coverNum$class_lines">$hit / $found</td> -END_OF_HTML - ; - - if ($func_coverage) - { - write_html(*HANDLE, <<END_OF_HTML) - <td class="coverPer$class_funcs">$funcs_string</td> - <td class="coverNum$class_funcs">$fn_hit / $fn_found</td> -END_OF_HTML - ; - } - write_html(*HANDLE, <<END_OF_HTML) - </tr> -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_file_table_detail_heading(filehandle, left_heading, right_heading) -# -# Write heading for detail section in file table. -# - -sub write_file_table_detail_heading(*$$$) -{ - my $func_rows = ""; - - if ($func_coverage) - { - $func_rows = "<td class=\"testLinesHead\" colspan=2>$_[3]</td>"; - } - - # ************************************************************* - write_html($_[0], <<END_OF_HTML) - <tr> - <td class="testNameHead" colspan=2>$_[1]</td> - <td class="testLinesHead" colspan=2>$_[2]</td> - $func_rows - </tr> - -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_file_table_detail_entry(filehandle, test_name, -# cover_found, cover_hit, func_found, func_hit) -# -# Write entry for detail section in file table. -# - -sub write_file_table_detail_entry(*$$$$$) -{ - my $rate; - my $func_rate; - my $name = $_[1]; - - if ($_[2]>0) - { - $rate = sprintf("%.1f", $_[3]*100/$_[2])." %"; - } - else - { - $rate = "-"; - } - - if ($_[4]>0) - { - $func_rate = sprintf("%.1f", $_[5]*100/$_[4])." %"; - } - else - { - $func_rate = "-"; - } - - if ($name =~ /^(.*),diff$/) - { - $name = $1." (converted)"; - } - - if ($name eq "") - { - $name = "<span style=\"font-style:italic\"><unnamed></span>"; - } - - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <tr> - <td class="testName" colspan=2>$name</td> - <td class="testPer">$rate</td> - <td class="testNum">$_[3] / $_[2] lines</td> -END_OF_HTML - ; - if ($func_coverage) - { - write_html($_[0], <<END_OF_HTML) - <td class="testPer">$func_rate</td> - <td class="testNum">$_[5] / $_[4]</td> -END_OF_HTML - ; - } - write_html($_[0], <<END_OF_HTML) - </tr> - -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_file_table_epilog(filehandle) -# -# Write end of file table HTML code. -# - -sub write_file_table_epilog(*) -{ - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - </table> - </center> - <br> - -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_test_table_prolog(filehandle, table_heading) -# -# Write heading for test case description table. -# - -sub write_test_table_prolog(*$) -{ - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <center> - <table width="80%" cellpadding=2 cellspacing=1 border=0> - - <tr> - <td><br></td> - </tr> - - <tr> - <td class="tableHead">$_[1]</td> - </tr> - - <tr> - <td class="testDescription"> - <dl> -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_test_table_entry(filehandle, test_name, test_description) -# -# Write entry for the test table. -# - -sub write_test_table_entry(*$$) -{ - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <dt>$_[1]<a name="$_[1]"> </a></dt> - <dd>$_[2]<br><br></dd> -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_test_table_epilog(filehandle) -# -# Write end of test description table HTML code. -# - -sub write_test_table_epilog(*) -{ - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - </dl> - </td> - </tr> - </table> - </center> - <br> - -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_source_prolog(filehandle) -# -# Write start of source code table. -# - -sub write_source_prolog(*) -{ - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <table cellpadding=0 cellspacing=0 border=0> - <tr> - <td><br></td> - </tr> - <tr> - <td><pre class="source"> -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_source_line(filehandle, line_num, source, hit_count, converted, -# add_anchor) -# -# Write formatted source code line. Return a line in a format as needed -# by gen_png() -# - -sub write_source_line(*$$$$$) -{ - my $source_format; - my $count; - my $result; - my $anchor_start = ""; - my $anchor_end = ""; - - if (!(defined$_[3])) - { - $result = ""; - $source_format = ""; - $count = " "x15; - } - elsif ($_[3] == 0) - { - $result = $_[3]; - $source_format = '<span class="lineNoCov">'; - $count = sprintf("%15d", $_[3]); - } - elsif ($_[4] && defined($highlight)) - { - $result = "*".$_[3]; - $source_format = '<span class="lineDiffCov">'; - $count = sprintf("%15d", $_[3]); - } - else - { - $result = $_[3]; - $source_format = '<span class="lineCov">'; - $count = sprintf("%15d", $_[3]); - } - - $result .= ":".$_[2]; - - # Write out a line number navigation anchor every $nav_resolution - # lines if necessary - if ($_[5]) - { - $anchor_start = "<a name=\"$_[1]\">"; - $anchor_end = "</a>"; - } - - - # ************************************************************* - - write_html($_[0], - $anchor_start. - '<span class="lineNum">'.sprintf("%8d", $_[1]). - " </span>$source_format$count : ". - escape_html($_[2]).($source_format?"</span>":""). - $anchor_end."\n"); - - # ************************************************************* - - return($result); -} - - -# -# write_source_epilog(filehandle) -# -# Write end of source code table. -# - -sub write_source_epilog(*) -{ - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - </pre> - </td> - </tr> - </table> - <br> - -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_html_epilog(filehandle, base_dir[, break_frames]) -# -# Write HTML page footer to FILEHANDLE. BREAK_FRAMES should be set when -# this page is embedded in a frameset, clicking the URL link will then -# break this frameset. -# - -sub write_html_epilog(*$;$) -{ - my $basedir = $_[1]; - my $break_code = ""; - my $epilog; - - if (defined($_[2])) - { - $break_code = " target=\"_parent\""; - } - - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <table width="100%" border=0 cellspacing=0 cellpadding=0> - <tr><td class="ruler"><img src="$_[1]glass.png" width=3 height=3 alt=""></td></tr> - <tr><td class="versionInfo">Generated by: <a href="$lcov_url"$break_code>$lcov_version</a></td></tr> - </table> - <br> -END_OF_HTML - ; - - $epilog = $html_epilog; - $epilog =~ s/\@basedir\@/$basedir/g; - - write_html($_[0], $epilog); -} - - -# -# write_frameset(filehandle, basedir, basename, pagetitle) -# -# - -sub write_frameset(*$$$) -{ - my $frame_width = $overview_width + 40; - - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"> - - <html lang="en"> - - <head> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <title>$_[3]</title> - <link rel="stylesheet" type="text/css" href="$_[1]gcov.css"> - </head> - - <frameset cols="$frame_width,*"> - <frame src="$_[2].gcov.overview.$html_ext" name="overview"> - <frame src="$_[2].gcov.$html_ext" name="source"> - <noframes> - <center>Frames not supported by your browser!<br></center> - </noframes> - </frameset> - - </html> -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# sub write_overview_line(filehandle, basename, line, link) -# -# - -sub write_overview_line(*$$$) -{ - my $y1 = $_[2] - 1; - my $y2 = $y1 + $nav_resolution - 1; - my $x2 = $overview_width - 1; - - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <area shape="rect" coords="0,$y1,$x2,$y2" href="$_[1].gcov.$html_ext#$_[3]" target="source" alt="overview"> -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_overview(filehandle, basedir, basename, pagetitle, lines) -# -# - -sub write_overview(*$$$$) -{ - my $index; - my $max_line = $_[4] - 1; - my $offset; - - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> - - <html lang="en"> - - <head> - <title>$_[3]</title> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <link rel="stylesheet" type="text/css" href="$_[1]gcov.css"> - </head> - - <body> - <map name="overview"> -END_OF_HTML - ; - - # ************************************************************* - - # Make $offset the next higher multiple of $nav_resolution - $offset = ($nav_offset + $nav_resolution - 1) / $nav_resolution; - $offset = sprintf("%d", $offset ) * $nav_resolution; - - # Create image map for overview image - for ($index = 1; $index <= $_[4]; $index += $nav_resolution) - { - # Enforce nav_offset - if ($index < $offset + 1) - { - write_overview_line($_[0], $_[2], $index, 1); - } - else - { - write_overview_line($_[0], $_[2], $index, $index - $offset); - } - } - - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - </map> - - <center> - <a href="$_[2].gcov.$html_ext#top" target="source">Top</a><br><br> - <img src="$_[2].gcov.png" width=$overview_width height=$max_line alt="Overview" border=0 usemap="#overview"> - </center> - </body> - </html> -END_OF_HTML - ; - - # ************************************************************* -} - - -# rate_to_col(found, hit) -# -# Return Lo, Med or Hi, depending on the coverage rate. -# - -sub rate_to_col($$) -{ - my ($found, $hit) = @_; - my $rate; - - if ($found == 0) { - return "Hi"; - } - $rate = 100 * $hit / $found; - if ($rate < $med_limit) { - return "Lo"; - } elsif ($rate < $hi_limit) { - return "Med"; - } - return "Hi"; -} - -# format_rate(found, hit) -# -# Return formatted percent string for coverage rate. -# - -sub format_rate($$) -{ - return $_[0] == 0 ? "-" : sprintf("%.1f", $_[1] * 100 / $_[0])." %"; -} - -sub get_legend_code($$$) -{ - my ($text, $med, $hi) = @_; - my $result; - - $result = <<EOF; - $text<br> - <span class="coverLegendLo">0% to $med%</span> - <span class="coverLegendMed">$med% to $hi%</span> - <span class="coverLegendHi">$hi% to 100%</span> -EOF - return $result; -} - -# -# write_header(filehandle, type, trunc_file_name, rel_file_name, lines_found, -# lines_hit, funcs_found, funcs_hit, sort_type) -# -# Write a complete standard page header. TYPE may be (0, 1, 2, 3, 4) -# corresponding to (directory view header, file view header, source view -# header, test case description header, function view header) -# - -sub write_header(*$$$$$$$$) -{ - local *HTML_HANDLE = $_[0]; - my $type = $_[1]; - my $trunc_name = $_[2]; - my $rel_filename = $_[3]; - my $lines_found = $_[4]; - my $lines_hit = $_[5]; - my $fn_found = $_[6]; - my $fn_hit = $_[7]; - my $sort_type = $_[8]; - my $base_dir; - my $view; - my $test; - my $base_name; - - $base_name = basename($rel_filename); - - # Prepare text for "current view" field - if ($type == 0) - { - # Main overview - $base_dir = ""; - $view = $overview_title; - } - elsif ($type == 1) - { - # Directory overview - $base_dir = get_relative_base_path($rel_filename); - $view = "<a href=\"$base_dir"."index.$html_ext\">". - "$overview_title</a> - $trunc_name"; - } - elsif ($type == 2 || $type == 4) - { - # File view - my $dir_name = dirname($rel_filename); - - $base_dir = get_relative_base_path($dir_name); - if ($frames) - { - # Need to break frameset when clicking any of these - # links - $view = "<a href=\"$base_dir"."index.$html_ext\" ". - "target=\"_parent\">$overview_title</a> - ". - "<a href=\"index.$html_ext\" target=\"_parent\">". - "$dir_name</a> - $base_name"; - } - else - { - $view = "<a href=\"$base_dir"."index.$html_ext\">". - "$overview_title</a> - ". - "<a href=\"index.$html_ext\">". - "$dir_name</a> - $base_name"; - } - - # Add function suffix - if ($func_coverage) { - if ($type == 2) { - $view .= " (source / <a href=\"$base_name.func.$html_ext\">functions</a>)"; - } elsif ($type == 4) { - $view .= " (<a href=\"$base_name.gcov.$html_ext\">source</a> / functions)"; - } - } - } - elsif ($type == 3) - { - # Test description header - $base_dir = ""; - $view = "<a href=\"$base_dir"."index.$html_ext\">". - "$overview_title</a> - test case descriptions"; - } - - # Prepare text for "test" field - $test = escape_html($test_title); - - # Append link to test description page if available - if (%test_description && ($type != 3)) - { - if ($frames && ($type == 2 || $type == 4)) - { - # Need to break frameset when clicking this link - $test .= " ( <a href=\"$base_dir". - "descriptions.$html_ext\" target=\"_parent\">". - "view descriptions</a> )"; - } - else - { - $test .= " ( <a href=\"$base_dir". - "descriptions.$html_ext\">". - "view descriptions</a> )"; - } - } - - # Write header - write_header_prolog(*HTML_HANDLE, $base_dir); - write_header_line(*HTML_HANDLE, 0, "Current view:", $view, - "Found", "Hit", "Coverage"); - write_header_line(*HTML_HANDLE, 1, "Test:", $test, "Lines:", - $lines_found, $lines_hit, - $rate_name[classify_rate($lines_found, $lines_hit, - $med_limit, $hi_limit)], - format_rate($lines_found, $lines_hit)); - if ($func_coverage) { - write_header_line(*HTML_HANDLE, 1, "Date:", $date, "Functions:", - $fn_found, $fn_hit, - $rate_name[classify_rate($fn_found, - $fn_hit, - $fn_med_limit, - $fn_hi_limit)], - format_rate($fn_found, $fn_hit)); - } else { - write_header_line(*HTML_HANDLE, 4, "Date:", $date); - } - if ($legend) { - if ($type == 0 || $type == 1) { - my $line_code = get_legend_code("Line coverage:", - $med_limit, $hi_limit); - my $func_code = ""; - - if ($func_coverage) { - $func_code = get_legend_code( - "Function coverage:", - $fn_med_limit, - $fn_hi_limit); - } - write_header_line(*HTML_HANDLE, 2, "Colors:", - $line_code, $func_code); - } elsif ($type == 2 || $type == 4) { - write_header_line(*HTML_HANDLE, 3, "Colors:", - "not hit", "hit"); - } - } - write_header_epilog(*HTML_HANDLE, $base_dir); -} - - -# -# split_filename(filename) -# -# Return (path, filename, extension) for a given FILENAME. -# - -sub split_filename($) -{ - if (!$_[0]) { return(); } - my @path_components = split('/', $_[0]); - my @file_components = split('\.', pop(@path_components)); - my $extension = pop(@file_components); - - return (join("/",@path_components), join(".",@file_components), - $extension); -} - -# -# get_sorted_keys(hash_ref, sort_type) -# - -sub get_sorted_keys($$) -{ - my ($hash, $type) = @_; - - if ($type == 0) { - # Sort by name - return sort(keys(%{$hash})); - } elsif ($type == 1) { - # Sort by line coverage - return sort({$hash->{$a}[5] <=> $hash->{$b}[5]} keys(%{$hash})); - } elsif ($type == 2) { - # Sort by function coverage; - return sort({$hash->{$a}[6] <=> $hash->{$b}[6]} keys(%{$hash})); - } -} - -sub get_sort_code($$$) -{ - my ($link, $alt, $base) = @_; - my $png; - my $link_start; - my $link_end; - - if (!defined($link)) { - $png = "glass.png"; - $link_start = ""; - $link_end = ""; - } else { - $png = "updown.png"; - $link_start = '<a href="'.$link.'">'; - $link_end = "</a>"; - } - - return ' <span class="tableHeadSort">'.$link_start. - '<img src="'.$base.$png.'" width=10 height=14 '. - 'alt="'.$alt.'" title="'.$alt.'" border=0>'.$link_end.'</span>'; -} - -sub get_file_code($$$$) -{ - my ($type, $text, $sort_button, $base) = @_; - my $result = $text; - my $link; - - if ($sort_button) { - if ($type == 1) { - $link = "index.$html_ext"; - } else { - $link = "index-detail.$html_ext"; - } - } - $result .= get_sort_code($link, "Sort by name", $base); - - return $result; -} - -sub get_line_code($$$$$) -{ - my ($type, $sort_type, $text, $sort_button, $base) = @_; - my $result = $text; - my $sort_link; - - if ($type == 1) { - # Just text - if ($sort_button) { - $sort_link = "index-sort-l.$html_ext"; - } - } elsif ($type == 2) { - # Text + link to detail view - $result .= ' ( <a class="detail" href="index-detail'. - $fileview_sortname[$sort_type].'.'.$html_ext. - '">show details</a> )'; - if ($sort_button) { - $sort_link = "index-sort-l.$html_ext"; - } - } else { - # Text + link to standard view - $result .= ' ( <a class="detail" href="index'. - $fileview_sortname[$sort_type].'.'.$html_ext. - '">hide details</a> )'; - if ($sort_button) { - $sort_link = "index-detail-sort-l.$html_ext"; - } - } - # Add sort button - $result .= get_sort_code($sort_link, "Sort by line coverage", $base); - - return $result; -} - -sub get_func_code($$$$) -{ - my ($type, $text, $sort_button, $base) = @_; - my $result = $text; - my $link; - - if ($sort_button) { - if ($type == 1) { - $link = "index-sort-f.$html_ext"; - } else { - $link = "index-detail-sort-f.$html_ext"; - } - } - $result .= get_sort_code($link, "Sort by function coverage", $base); - return $result; -} - -# -# write_file_table(filehandle, base_dir, overview, testhash, testfnchash, -# fileview, sort_type) -# -# Write a complete file table. OVERVIEW is a reference to a hash containing -# the following mapping: -# -# filename -> "lines_found,lines_hit,funcs_found,funcs_hit,page_link, -# func_link" -# -# TESTHASH is a reference to the following hash: -# -# filename -> \%testdata -# %testdata: name of test affecting this file -> \%testcount -# %testcount: line number -> execution count for a single test -# -# Heading of first column is "Filename" if FILEVIEW is true, "Directory name" -# otherwise. -# - -sub write_file_table(*$$$$$$) -{ - local *HTML_HANDLE = $_[0]; - my $base_dir = $_[1]; - my $overview = $_[2]; - my $testhash = $_[3]; - my $testfnchash = $_[4]; - my $fileview = $_[5]; - my $sort_type = $_[6]; - my $filename; - my $bar_graph; - my $hit; - my $found; - my $fn_found; - my $fn_hit; - my $page_link; - my $testname; - my $testdata; - my $testfncdata; - my $testcount; - my $testfnccount; - my %affecting_tests; - my $line_code = ""; - my $func_code; - my $file_code; - - # Determine HTML code for column headings - if (($base_dir ne "") && $show_details) - { - my $detailed = keys(%{$testhash}); - - $file_code = get_file_code($detailed ? 2 : 1, - $fileview ? "Filename" : "Directory", - $sort && $sort_type != 0, $base_dir); - $line_code = get_line_code($detailed ? 3 : 2, $sort_type, - "Line Coverage", - $sort && $sort_type != 1, $base_dir); - $func_code = get_func_code($detailed ? 2 : 1, "Functions", - $sort && $sort_type != 2, $base_dir); - } else { - $file_code = get_file_code(1, - $fileview ? "Filename" : "Directory", - $sort && $sort_type != 0, $base_dir); - $line_code = get_line_code(1, $sort_type, "Line Coverage", - $sort && $sort_type != 1, $base_dir); - $func_code = get_func_code(1, "Functions", - $sort && $sort_type != 2, $base_dir); - } - - write_file_table_prolog(*HTML_HANDLE, $file_code, $line_code, - $func_code); - - foreach $filename (get_sorted_keys($overview, $sort_type)) - { - ($found, $hit, $fn_found, $fn_hit, $page_link) - = @{$overview->{$filename}}; - $bar_graph = get_bar_graph_code($base_dir, $found, $hit); - - $testdata = $testhash->{$filename}; - $testfncdata = $testfnchash->{$filename}; - - write_file_table_entry(*HTML_HANDLE, $filename, $bar_graph, - $found, $hit, $fn_found, $fn_hit, - $page_link); - - # Check whether we should write test specific coverage - # as well - if (!($show_details && $testdata)) { next; } - - # Filter out those tests that actually affect this file - %affecting_tests = %{ get_affecting_tests($testdata, - $testfncdata) }; - - # Does any of the tests affect this file at all? - if (!%affecting_tests) { next; } - - # Write test details for this entry - write_file_table_detail_heading(*HTML_HANDLE, "Test name", - "Lines hit", "Functions hit"); - - foreach $testname (keys(%affecting_tests)) - { - ($found, $hit, $fn_found, $fn_hit) = - split(",", $affecting_tests{$testname}); - - # Insert link to description of available - if ($test_description{$testname}) - { - $testname = "<a href=\"$base_dir". - "descriptions.$html_ext#$testname\">". - "$testname</a>"; - } - - write_file_table_detail_entry(*HTML_HANDLE, $testname, - $found, $hit, $fn_found, $fn_hit); - } - } - - write_file_table_epilog(*HTML_HANDLE); -} - - -# -# get_found_and_hit(hash) -# -# Return the count for entries (found) and entries with an execution count -# greater than zero (hit) in a hash (linenumber -> execution count) as -# a list (found, hit) -# - -sub get_found_and_hit($) -{ - my %hash = %{$_[0]}; - my $found = 0; - my $hit = 0; - - # Calculate sum - $found = 0; - $hit = 0; - - foreach (keys(%hash)) - { - $found++; - if ($hash{$_}>0) { $hit++; } - } - - return ($found, $hit); -} - - -# -# get_func_found_and_hit(sumfnccount) -# -# Return (f_found, f_hit) for sumfnccount -# - -sub get_func_found_and_hit($) -{ - my ($sumfnccount) = @_; - my $function; - my $fn_found; - my $fn_hit; - - $fn_found = scalar(keys(%{$sumfnccount})); - $fn_hit = 0; - foreach $function (keys(%{$sumfnccount})) { - if ($sumfnccount->{$function} > 0) { - $fn_hit++; - } - } - return ($fn_found, $fn_hit); -} - - -# -# get_affecting_tests(testdata, testfncdata) -# -# HASHREF contains a mapping filename -> (linenumber -> exec count). Return -# a hash containing mapping filename -> "lines found, lines hit" for each -# filename which has a nonzero hit count. -# - -sub get_affecting_tests($$) -{ - my $testdata = $_[0]; - my $testfncdata = $_[1]; - my $testname; - my $testcount; - my $testfnccount; - my %result; - my $found; - my $hit; - my $fn_found; - my $fn_hit; - - foreach $testname (keys(%{$testdata})) - { - # Get (line number -> count) hash for this test case - $testcount = $testdata->{$testname}; - $testfnccount = $testfncdata->{$testname}; - - # Calculate sum - ($found, $hit) = get_found_and_hit($testcount); - ($fn_found, $fn_hit) = get_func_found_and_hit($testfnccount); - - if ($hit>0) - { - $result{$testname} = "$found,$hit,$fn_found,$fn_hit"; - } - } - - return(\%result); -} - - -sub get_hash_reverse($) -{ - my ($hash) = @_; - my %result; - - foreach (keys(%{$hash})) { - $result{$hash->{$_}} = $_; - } - - return \%result; -} - -# -# write_source(filehandle, source_filename, count_data, checksum_data, -# converted_data, func_data) -# -# Write an HTML view of a source code file. Returns a list containing -# data as needed by gen_png(). -# -# Die on error. -# - -sub write_source($$$$$$) -{ - local *HTML_HANDLE = $_[0]; - local *SOURCE_HANDLE; - my $source_filename = $_[1]; - my %count_data; - my $line_number; - my @result; - my $checkdata = $_[3]; - my $converted = $_[4]; - my $funcdata = $_[5]; - my $datafunc = get_hash_reverse($funcdata); - my $add_anchor; - - if ($_[2]) - { - %count_data = %{$_[2]}; - } - - open(SOURCE_HANDLE, "<".$source_filename) - or die("ERROR: cannot open $source_filename for reading!\n"); - - write_source_prolog(*HTML_HANDLE); - - for ($line_number = 1; <SOURCE_HANDLE> ; $line_number++) - { - chomp($_); - - # Source code matches coverage data? - if (defined($checkdata->{$line_number}) && - ($checkdata->{$line_number} ne md5_base64($_))) - { - die("ERROR: checksum mismatch at $source_filename:". - "$line_number\n"); - } - - $add_anchor = 0; - if ($frames) { - if (($line_number - 1) % $nav_resolution == 0) { - $add_anchor = 1; - } - } - if ($func_coverage) { - if ($line_number == 1) { - $add_anchor = 1; - } elsif (defined($datafunc->{$line_number + - $func_offset})) { - $add_anchor = 1; - } - } - push (@result, - write_source_line(HTML_HANDLE, $line_number, - $_, $count_data{$line_number}, - $converted->{$line_number}, - $add_anchor)); - } - - close(SOURCE_HANDLE); - write_source_epilog(*HTML_HANDLE); - return(@result); -} - - -sub funcview_get_func_code($$$) -{ - my ($name, $base, $type) = @_; - my $result; - my $link; - - if ($sort && $type == 1) { - $link = "$name.func.$html_ext"; - } - $result = "Function Name"; - $result .= get_sort_code($link, "Sort by function name", $base); - - return $result; -} - -sub funcview_get_count_code($$$) -{ - my ($name, $base, $type) = @_; - my $result; - my $link; - - if ($sort && $type == 0) { - $link = "$name.func-sort-c.$html_ext"; - } - $result = "Hit count"; - $result .= get_sort_code($link, "Sort by hit count", $base); - - return $result; -} - -# -# funcview_get_sorted(funcdata, sumfncdata, sort_type) -# -# Depending on the value of sort_type, return a list of functions sorted -# by name (type 0) or by the associated call count (type 1). -# - -sub funcview_get_sorted($$$) -{ - my ($funcdata, $sumfncdata, $type) = @_; - - if ($type == 0) { - return sort(keys(%{$funcdata})); - } - return sort({$sumfncdata->{$b} <=> $sumfncdata->{$a}} - keys(%{$sumfncdata})); -} - -# -# write_function_table(filehandle, source_file, sumcount, funcdata, -# sumfnccount, testfncdata) -# -# Write an HTML table listing all functions in a source file, including -# also function call counts and line coverages inside of each function. -# -# Die on error. -# - -sub write_function_table(*$$$$$$$$) -{ - local *HTML_HANDLE = $_[0]; - my $source = $_[1]; - my $sumcount = $_[2]; - my $funcdata = $_[3]; - my $sumfncdata = $_[4]; - my $testfncdata = $_[5]; - my $name = $_[6]; - my $base = $_[7]; - my $type = $_[8]; - my $func; - my $func_code; - my $count_code; - - # Get HTML code for headings - $func_code = funcview_get_func_code($name, $base, $type); - $count_code = funcview_get_count_code($name, $base, $type); - write_html(*HTML_HANDLE, <<END_OF_HTML) - <center> - <table width="60%" cellpadding=1 cellspacing=1 border=0> - <tr><td><br></td></tr> - <tr> - <td width="80%" class="tableHead">$func_code</td> - <td width="20%" class="tableHead">$count_code</td> - </tr> -END_OF_HTML - ; - - # Get a sorted table - foreach $func (funcview_get_sorted($funcdata, $sumfncdata, $type)) { - my $startline = $funcdata->{$func} - $func_offset; - my $name = escape_html($func); - my $count = $sumfncdata->{$name}; - my $countstyle; - - if ($startline < 1) { - $startline = 1; - } - if ($count == 0) { - $countstyle = "coverFnLo"; - } else { - $countstyle = "coverFnHi"; - } - - write_html(*HTML_HANDLE, <<END_OF_HTML) - <tr> - <td class="coverFn"><a href="$source#$startline">$name</a></td> - <td class="$countstyle">$count</td> - </tr> -END_OF_HTML - ; - } - write_html(*HTML_HANDLE, <<END_OF_HTML) - </table> - <br> - </center> -END_OF_HTML - ; -} - - -# -# info(printf_parameter) -# -# Use printf to write PRINTF_PARAMETER to stdout only when the $quiet flag -# is not set. -# - -sub info(@) -{ - if (!$quiet) - { - # Print info string - printf(@_); - } -} - - -# -# subtract_counts(data_ref, base_ref) -# - -sub subtract_counts($$) -{ - my %data = %{$_[0]}; - my %base = %{$_[1]}; - my $line; - my $data_count; - my $base_count; - my $hit = 0; - my $found = 0; - - foreach $line (keys(%data)) - { - $found++; - $data_count = $data{$line}; - $base_count = $base{$line}; - - if (defined($base_count)) - { - $data_count -= $base_count; - - # Make sure we don't get negative numbers - if ($data_count<0) { $data_count = 0; } - } - - $data{$line} = $data_count; - if ($data_count > 0) { $hit++; } - } - - return (\%data, $found, $hit); -} - - -# -# subtract_fnccounts(data, base) -# -# Subtract function call counts found in base from those in data. -# Return (data, f_found, f_hit). -# - -sub subtract_fnccounts($$) -{ - my %data = %{$_[0]}; - my %base = %{$_[1]}; - my $func; - my $data_count; - my $base_count; - my $fn_hit = 0; - my $fn_found = 0; - - foreach $func (keys(%data)) { - $fn_found++; - $data_count = $data{$func}; - $base_count = $base{$func}; - - if (defined($base_count)) { - $data_count -= $base_count; - - # Make sure we don't get negative numbers - if ($data_count < 0) { - $data_count = 0; - } - } - - $data{$func} = $data_count; - if ($data_count > 0) { - $fn_hit++; - } - } - - return (\%data, $fn_found, $fn_hit); -} - - -# -# apply_baseline(data_ref, baseline_ref) -# -# Subtract the execution counts found in the baseline hash referenced by -# BASELINE_REF from actual data in DATA_REF. -# - -sub apply_baseline($$) -{ - my %data_hash = %{$_[0]}; - my %base_hash = %{$_[1]}; - my $filename; - my $testname; - my $data; - my $data_testdata; - my $data_funcdata; - my $data_checkdata; - my $data_testfncdata; - my $data_count; - my $data_testfnccount; - my $base; - my $base_checkdata; - my $base_sumfnccount; - my $base_count; - my $sumcount; - my $sumfnccount; - my $found; - my $hit; - my $fn_found; - my $fn_hit; - - foreach $filename (keys(%data_hash)) - { - # Get data set for data and baseline - $data = $data_hash{$filename}; - $base = $base_hash{$filename}; - - # Skip data entries for which no base entry exists - if (!defined($base)) - { - next; - } - - # Get set entries for data and baseline - ($data_testdata, undef, $data_funcdata, $data_checkdata, - $data_testfncdata) = get_info_entry($data); - (undef, $base_count, undef, $base_checkdata, undef, - $base_sumfnccount) = get_info_entry($base); - - # Check for compatible checksums - merge_checksums($data_checkdata, $base_checkdata, $filename); - - # sumcount has to be calculated anew - $sumcount = {}; - $sumfnccount = {}; - - # For each test case, subtract test specific counts - foreach $testname (keys(%{$data_testdata})) - { - # Get counts of both data and baseline - $data_count = $data_testdata->{$testname}; - $data_testfnccount = $data_testfncdata->{$testname}; - - ($data_count, undef, $hit) = - subtract_counts($data_count, $base_count); - ($data_testfnccount) = - subtract_fnccounts($data_testfnccount, - $base_sumfnccount); - - # Check whether this test case did hit any line at all - if ($hit > 0) - { - # Write back resulting hash - $data_testdata->{$testname} = $data_count; - $data_testfncdata->{$testname} = - $data_testfnccount; - } - else - { - # Delete test case which did not impact this - # file - delete($data_testdata->{$testname}); - delete($data_testfncdata->{$testname}); - } - - # Add counts to sum of counts - ($sumcount, $found, $hit) = - add_counts($sumcount, $data_count); - ($sumfnccount, $fn_found, $fn_hit) = - add_fnccounts($sumfnccount, $data_testfnccount); - } - - # Write back resulting entry - set_info_entry($data, $data_testdata, $sumcount, $data_funcdata, - $data_checkdata, $data_testfncdata, $sumfnccount, - $found, $hit, $fn_found, $fn_hit); - - $data_hash{$filename} = $data; - } - - return (\%data_hash); -} - - -# -# remove_unused_descriptions() -# -# Removes all test descriptions from the global hash %test_description which -# are not present in %info_data. -# - -sub remove_unused_descriptions() -{ - my $filename; # The current filename - my %test_list; # Hash containing found test names - my $test_data; # Reference to hash test_name -> count_data - my $before; # Initial number of descriptions - my $after; # Remaining number of descriptions - - $before = scalar(keys(%test_description)); - - foreach $filename (keys(%info_data)) - { - ($test_data) = get_info_entry($info_data{$filename}); - foreach (keys(%{$test_data})) - { - $test_list{$_} = ""; - } - } - - # Remove descriptions for tests which are not in our list - foreach (keys(%test_description)) - { - if (!defined($test_list{$_})) - { - delete($test_description{$_}); - } - } - - $after = scalar(keys(%test_description)); - if ($after < $before) - { - info("Removed ".($before - $after). - " unused descriptions, $after remaining.\n"); - } -} - - -# -# apply_prefix(filename, prefix) -# -# If FILENAME begins with PREFIX, remove PREFIX from FILENAME and return -# resulting string, otherwise return FILENAME. -# - -sub apply_prefix($$) -{ - my $filename = $_[0]; - my $prefix = $_[1]; - - if (defined($prefix) && ($prefix ne "")) - { - if ($filename =~ /^\Q$prefix\E\/(.*)$/) - { - return substr($filename, length($prefix) + 1); - } - } - - return $filename; -} - - -# -# system_no_output(mode, parameters) -# -# Call an external program using PARAMETERS while suppressing depending on -# the value of MODE: -# -# MODE & 1: suppress STDOUT -# MODE & 2: suppress STDERR -# -# Return 0 on success, non-zero otherwise. -# - -sub system_no_output($@) -{ - my $mode = shift; - my $result; - local *OLD_STDERR; - local *OLD_STDOUT; - - # Save old stdout and stderr handles - ($mode & 1) && open(OLD_STDOUT, ">>&STDOUT"); - ($mode & 2) && open(OLD_STDERR, ">>&STDERR"); - - # Redirect to /dev/null - ($mode & 1) && open(STDOUT, ">/dev/null"); - ($mode & 2) && open(STDERR, ">/dev/null"); - - system(@_); - $result = $?; - - # Close redirected handles - ($mode & 1) && close(STDOUT); - ($mode & 2) && close(STDERR); - - # Restore old handles - ($mode & 1) && open(STDOUT, ">>&OLD_STDOUT"); - ($mode & 2) && open(STDERR, ">>&OLD_STDERR"); - - return $result; -} - - -# -# read_config(filename) -# -# Read configuration file FILENAME and return a reference to a hash containing -# all valid key=value pairs found. -# - -sub read_config($) -{ - my $filename = $_[0]; - my %result; - my $key; - my $value; - local *HANDLE; - - if (!open(HANDLE, "<$filename")) - { - warn("WARNING: cannot read configuration file $filename\n"); - return undef; - } - while (<HANDLE>) - { - chomp; - # Skip comments - s/#.*//; - # Remove leading blanks - s/^\s+//; - # Remove trailing blanks - s/\s+$//; - next unless length; - ($key, $value) = split(/\s*=\s*/, $_, 2); - if (defined($key) && defined($value)) - { - $result{$key} = $value; - } - else - { - warn("WARNING: malformed statement in line $. ". - "of configuration file $filename\n"); - } - } - close(HANDLE); - return \%result; -} - - -# -# apply_config(REF) -# -# REF is a reference to a hash containing the following mapping: -# -# key_string => var_ref -# -# where KEY_STRING is a keyword and VAR_REF is a reference to an associated -# variable. If the global configuration hash CONFIG contains a value for -# keyword KEY_STRING, VAR_REF will be assigned the value for that keyword. -# - -sub apply_config($) -{ - my $ref = $_[0]; - - foreach (keys(%{$ref})) - { - if (defined($config->{$_})) - { - ${$ref->{$_}} = $config->{$_}; - } - } -} - - -# -# get_html_prolog(FILENAME) -# -# If FILENAME is defined, return contents of file. Otherwise return default -# HTML prolog. Die on error. -# - -sub get_html_prolog($) -{ - my $filename = $_[0]; - my $result = ""; - - if (defined($filename)) - { - local *HANDLE; - - open(HANDLE, "<".$filename) - or die("ERROR: cannot open html prolog $filename!\n"); - while (<HANDLE>) - { - $result .= $_; - } - close(HANDLE); - } - else - { - $result = <<END_OF_HTML -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> - -<html lang="en"> - -<head> - <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <title>\@pagetitle\@</title> - <link rel="stylesheet" type="text/css" href="\@basedir\@gcov.css"> -</head> - -<body> - -END_OF_HTML - ; - } - - return $result; -} - - -# -# get_html_epilog(FILENAME) -# -# If FILENAME is defined, return contents of file. Otherwise return default -# HTML epilog. Die on error. -# -sub get_html_epilog($) -{ - my $filename = $_[0]; - my $result = ""; - - if (defined($filename)) - { - local *HANDLE; - - open(HANDLE, "<".$filename) - or die("ERROR: cannot open html epilog $filename!\n"); - while (<HANDLE>) - { - $result .= $_; - } - close(HANDLE); - } - else - { - $result = <<END_OF_HTML - -</body> -</html> -END_OF_HTML - ; - } - - return $result; - -} - -sub warn_handler($) -{ - my ($msg) = @_; - - warn("$tool_name: $msg"); -} - -sub die_handler($) -{ - my ($msg) = @_; - - die("$tool_name: $msg"); -} diff --git a/3rdParty/LCov/geninfo b/3rdParty/LCov/geninfo deleted file mode 100755 index 055641b..0000000 --- a/3rdParty/LCov/geninfo +++ /dev/null @@ -1,2178 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (c) International Business Machines Corp., 2002,2007 -# -# 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 -# -# -# geninfo -# -# This script generates .info files from data files as created by code -# instrumented with gcc's built-in profiling mechanism. Call it with -# --help and refer to the geninfo man page to get information on usage -# and available options. -# -# -# Authors: -# 2002-08-23 created by Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> -# IBM Lab Boeblingen -# based on code by Manoj Iyer <manjo@mail.utexas.edu> and -# Megan Bock <mbock@us.ibm.com> -# IBM Austin -# 2002-09-05 / Peter Oberparleiter: implemented option that allows file list -# 2003-04-16 / Peter Oberparleiter: modified read_gcov so that it can also -# parse the new gcov format which is to be introduced in gcc 3.3 -# 2003-04-30 / Peter Oberparleiter: made info write to STDERR, not STDOUT -# 2003-07-03 / Peter Oberparleiter: added line checksum support, added -# --no-checksum -# 2003-09-18 / Nigel Hinds: capture branch coverage data from GCOV -# 2003-12-11 / Laurent Deniel: added --follow option -# workaround gcov (<= 3.2.x) bug with empty .da files -# 2004-01-03 / Laurent Deniel: Ignore empty .bb files -# 2004-02-16 / Andreas Krebbel: Added support for .gcno/.gcda files and -# gcov versioning -# 2004-08-09 / Peter Oberparleiter: added configuration file support -# 2008-07-14 / Tom Zoerner: added --function-coverage command line option -# 2008-08-13 / Peter Oberparleiter: modified function coverage -# implementation (now enabled per default) -# - -use strict; -use File::Basename; -use Getopt::Long; -use Digest::MD5 qw(md5_base64); - - -# Constants -our $lcov_version = "LCOV version 1.7"; -our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; -our $gcov_tool = "gcov"; -our $tool_name = basename($0); - -our $GCOV_VERSION_3_4_0 = 0x30400; -our $GCOV_VERSION_3_3_0 = 0x30300; -our $GCNO_FUNCTION_TAG = 0x01000000; -our $GCNO_LINES_TAG = 0x01450000; -our $GCNO_FILE_MAGIC = 0x67636e6f; -our $BBG_FILE_MAGIC = 0x67626267; - -our $COMPAT_HAMMER = "hammer"; - -our $ERROR_GCOV = 0; -our $ERROR_SOURCE = 1; - -# Prototypes -sub print_usage(*); -sub gen_info($); -sub process_dafile($); -sub match_filename($@); -sub solve_ambiguous_match($$$); -sub split_filename($); -sub solve_relative_path($$); -sub get_dir($); -sub read_gcov_header($); -sub read_gcov_file($); -sub read_bb_file($$); -sub read_string(*$); -sub read_gcno_file($$); -sub read_gcno_string(*$); -sub read_hammer_bbg_file($$); -sub read_hammer_bbg_string(*$); -sub unpack_int32($$); -sub info(@); -sub get_gcov_version(); -sub system_no_output($@); -sub read_config($); -sub apply_config($); -sub gen_initial_info($); -sub process_graphfile($); -sub warn_handler($); -sub die_handler($); - -# Global variables -our $gcov_version; -our $graph_file_extension; -our $data_file_extension; -our @data_directory; -our $test_name = ""; -our $quiet; -our $help; -our $output_filename; -our $base_directory; -our $version; -our $follow; -our $checksum; -our $no_checksum; -our $preserve_paths; -our $compat_libtool; -our $no_compat_libtool; -our $adjust_testname; -our $config; # Configuration file contents -our $compatibility; # Compatibility version flag - used to indicate - # non-standard GCOV data format versions -our @ignore_errors; # List of errors to ignore (parameter) -our @ignore; # List of errors to ignore (array) -our $initial; -our $no_recursion = 0; -our $maxdepth; - -our $cwd = `pwd`; -chomp($cwd); - - -# -# Code entry point -# - -# Register handler routine to be called when interrupted -$SIG{"INT"} = \&int_handler; -$SIG{__WARN__} = \&warn_handler; -$SIG{__DIE__} = \&die_handler; - -# Read configuration file if available -if (-r $ENV{"HOME"}."/.lcovrc") -{ - $config = read_config($ENV{"HOME"}."/.lcovrc"); -} -elsif (-r "/etc/lcovrc") -{ - $config = read_config("/etc/lcovrc"); -} - -if ($config) -{ - # Copy configuration file values to variables - apply_config({ - "geninfo_gcov_tool" => \$gcov_tool, - "geninfo_adjust_testname" => \$adjust_testname, - "geninfo_checksum" => \$checksum, - "geninfo_no_checksum" => \$no_checksum, # deprecated - "geninfo_compat_libtool" => \$compat_libtool}); - - # Merge options - if (defined($no_checksum)) - { - $checksum = ($no_checksum ? 0 : 1); - $no_checksum = undef; - } -} - -# Parse command line options -if (!GetOptions("test-name=s" => \$test_name, - "output-filename=s" => \$output_filename, - "checksum" => \$checksum, - "no-checksum" => \$no_checksum, - "base-directory=s" => \$base_directory, - "version" =>\$version, - "quiet" => \$quiet, - "help|?" => \$help, - "follow" => \$follow, - "compat-libtool" => \$compat_libtool, - "no-compat-libtool" => \$no_compat_libtool, - "gcov-tool=s" => \$gcov_tool, - "ignore-errors=s" => \@ignore_errors, - "initial|i" => \$initial, - "no-recursion" => \$no_recursion, - )) -{ - print(STDERR "Use $tool_name --help to get usage information\n"); - exit(1); -} -else -{ - # Merge options - if (defined($no_checksum)) - { - $checksum = ($no_checksum ? 0 : 1); - $no_checksum = undef; - } - - if (defined($no_compat_libtool)) - { - $compat_libtool = ($no_compat_libtool ? 0 : 1); - $no_compat_libtool = undef; - } -} - -@data_directory = @ARGV; - -# Check for help option -if ($help) -{ - print_usage(*STDOUT); - exit(0); -} - -# Check for version option -if ($version) -{ - print("$tool_name: $lcov_version\n"); - exit(0); -} - -# Make sure test names only contain valid characters -if ($test_name =~ s/\W/_/g) -{ - warn("WARNING: invalid characters removed from testname!\n"); -} - -# Adjust test name to include uname output if requested -if ($adjust_testname) -{ - $test_name .= "__".`uname -a`; - $test_name =~ s/\W/_/g; -} - -# Make sure base_directory contains an absolute path specification -if ($base_directory) -{ - $base_directory = solve_relative_path($cwd, $base_directory); -} - -# Check for follow option -if ($follow) -{ - $follow = "-follow" -} -else -{ - $follow = ""; -} - -# Determine checksum mode -if (defined($checksum)) -{ - # Normalize to boolean - $checksum = ($checksum ? 1 : 0); -} -else -{ - # Default is off - $checksum = 0; -} - -# Determine libtool compatibility mode -if (defined($compat_libtool)) -{ - $compat_libtool = ($compat_libtool? 1 : 0); -} -else -{ - # Default is on - $compat_libtool = 1; -} - -# Determine max depth for recursion -if ($no_recursion) -{ - $maxdepth = "-maxdepth 1"; -} -else -{ - $maxdepth = ""; -} - -# Check for directory name -if (!@data_directory) -{ - die("No directory specified\n". - "Use $tool_name --help to get usage information\n"); -} -else -{ - foreach (@data_directory) - { - stat($_); - if (!-r _) - { - die("ERROR: cannot read $_!\n"); - } - } -} - -if (@ignore_errors) -{ - my @expanded; - my $error; - - # Expand comma-separated entries - foreach (@ignore_errors) { - if (/,/) - { - push(@expanded, split(",", $_)); - } - else - { - push(@expanded, $_); - } - } - - foreach (@expanded) - { - /^gcov$/ && do { $ignore[$ERROR_GCOV] = 1; next; } ; - /^source$/ && do { $ignore[$ERROR_SOURCE] = 1; next; }; - die("ERROR: unknown argument for --ignore-errors: $_\n"); - } -} - -if (system_no_output(3, $gcov_tool, "--help") == -1) -{ - die("ERROR: need tool $gcov_tool!\n"); -} - -$gcov_version = get_gcov_version(); - -if ($gcov_version < $GCOV_VERSION_3_4_0) -{ - if (defined($compatibility) && $compatibility eq $COMPAT_HAMMER) - { - $data_file_extension = ".da"; - $graph_file_extension = ".bbg"; - } - else - { - $data_file_extension = ".da"; - $graph_file_extension = ".bb"; - } -} -else -{ - $data_file_extension = ".gcda"; - $graph_file_extension = ".gcno"; -} - -# Check for availability of --preserve-paths option of gcov -if (`$gcov_tool --help` =~ /--preserve-paths/) -{ - $preserve_paths = "--preserve-paths"; -} - -# Check output filename -if (defined($output_filename) && ($output_filename ne "-")) -{ - # Initially create output filename, data is appended - # for each data file processed - local *DUMMY_HANDLE; - open(DUMMY_HANDLE, ">$output_filename") - or die("ERROR: cannot create $output_filename!\n"); - close(DUMMY_HANDLE); - - # Make $output_filename an absolute path because we're going - # to change directories while processing files - if (!($output_filename =~ /^\/(.*)$/)) - { - $output_filename = $cwd."/".$output_filename; - } -} - -# Do something -if ($initial) -{ - foreach (@data_directory) - { - gen_initial_info($_); - } -} -else -{ - foreach (@data_directory) - { - gen_info($_); - } -} -info("Finished .info-file creation\n"); - -exit(0); - - - -# -# print_usage(handle) -# -# Print usage information. -# - -sub print_usage(*) -{ - local *HANDLE = $_[0]; - - print(HANDLE <<END_OF_USAGE); -Usage: $tool_name [OPTIONS] DIRECTORY - -Traverse DIRECTORY and create a .info file for each data file found. Note -that you may specify more than one directory, all of which are then processed -sequentially. - - -h, --help Print this help, then exit - -v, --version Print version number, then exit - -q, --quiet Do not print progress messages - -i, --initial Capture initial zero coverage data - -t, --test-name NAME Use test case name NAME for resulting data - -o, --output-filename OUTFILE Write data only to OUTFILE - -f, --follow Follow links when searching .da/.gcda files - -b, --base-directory DIR Use DIR as base directory for relative paths - --(no-)checksum Enable (disable) line checksumming - --(no-)compat-libtool Enable (disable) libtool compatibility mode - --gcov-tool TOOL Specify gcov tool location - --ignore-errors ERROR Continue after ERROR (gcov, source) - --no-recursion Exlude subdirectories from processing - --function-coverage Capture function call counts - -For more information see: $lcov_url -END_OF_USAGE - ; -} - - -# -# gen_info(directory) -# -# Traverse DIRECTORY and create a .info file for each data file found. -# The .info file contains TEST_NAME in the following format: -# -# TN:<test name> -# -# For each source file name referenced in the data file, there is a section -# containing source code and coverage data: -# -# SF:<absolute path to the source file> -# FN:<line number of function start>,<function name> for each function -# DA:<line number>,<execution count> for each instrumented line -# LH:<number of lines with an execution count> greater than 0 -# LF:<number of instrumented lines> -# -# Sections are separated by: -# -# end_of_record -# -# In addition to the main source code file there are sections for each -# #included file containing executable code. Note that the absolute path -# of a source file is generated by interpreting the contents of the respective -# graph file. Relative filenames are prefixed with the directory in which the -# graph file is found. Note also that symbolic links to the graph file will be -# resolved so that the actual file path is used instead of the path to a link. -# This approach is necessary for the mechanism to work with the /proc/gcov -# files. -# -# Die on error. -# - -sub gen_info($) -{ - my $directory = $_[0]; - my @file_list; - - if (-d $directory) - { - info("Scanning $directory for $data_file_extension ". - "files ...\n"); - - @file_list = `find "$directory" $maxdepth $follow -name \\*$data_file_extension -type f 2>/dev/null`; - chomp(@file_list); - @file_list or die("ERROR: no $data_file_extension files found ". - "in $directory!\n"); - info("Found %d data files in %s\n", $#file_list+1, $directory); - } - else - { - @file_list = ($directory); - } - - # Process all files in list - foreach (@file_list) { process_dafile($_); } -} - - -# -# process_dafile(da_filename) -# -# Create a .info file for a single data file. -# -# Die on error. -# - -sub process_dafile($) -{ - info("Processing %s\n", $_[0]); - - my $da_filename; # Name of data file to process - my $da_dir; # Directory of data file - my $source_dir; # Directory of source file - my $da_basename; # data filename without ".da/.gcda" extension - my $bb_filename; # Name of respective graph file - my %bb_content; # Contents of graph file - my $gcov_error; # Error code of gcov tool - my $object_dir; # Directory containing all object files - my $source_filename; # Name of a source code file - my $gcov_file; # Name of a .gcov file - my @gcov_content; # Content of a .gcov file - my @gcov_branches; # Branch content of a .gcov file - my @gcov_functions; # Function calls of a .gcov file - my @gcov_list; # List of generated .gcov files - my $line_number; # Line number count - my $lines_hit; # Number of instrumented lines hit - my $lines_found; # Number of instrumented lines found - my $funcs_hit; # Number of instrumented functions hit - my $funcs_found; # Number of instrumented functions found - my $source; # gcov source header information - my $object; # gcov object header information - my @matches; # List of absolute paths matching filename - my @unprocessed; # List of unprocessed source code files - my $base_dir; # Base directory for current file - my @result; - my $index; - my $da_renamed; # If data file is to be renamed - local *INFO_HANDLE; - - # Get path to data file in absolute and normalized form (begins with /, - # contains no more ../ or ./) - $da_filename = solve_relative_path($cwd, $_[0]); - - # Get directory and basename of data file - ($da_dir, $da_basename) = split_filename($da_filename); - - # avoid files from .libs dirs - if ($compat_libtool && $da_dir =~ m/(.*)\/\.libs$/) { - $source_dir = $1; - } else { - $source_dir = $da_dir; - } - - if (-z $da_filename) - { - $da_renamed = 1; - } - else - { - $da_renamed = 0; - } - - # Construct base_dir for current file - if ($base_directory) - { - $base_dir = $base_directory; - } - else - { - $base_dir = $source_dir; - } - - # Check for writable $base_dir (gcov will try to write files there) - stat($base_dir); - if (!-w _) - { - die("ERROR: cannot write to directory $base_dir!\n"); - } - - # Construct name of graph file - $bb_filename = $da_dir."/".$da_basename.$graph_file_extension; - - # Find out the real location of graph file in case we're just looking at - # a link - while (readlink($bb_filename)) - { - my $last_dir = dirname($bb_filename); - - $bb_filename = readlink($bb_filename); - $bb_filename = solve_relative_path($last_dir, $bb_filename); - } - - # Ignore empty graph file (e.g. source file with no statement) - if (-z $bb_filename) - { - warn("WARNING: empty $bb_filename (skipped)\n"); - return; - } - - # Read contents of graph file into hash. We need it later to find out - # the absolute path to each .gcov file created as well as for - # information about functions and their source code positions. - if ($gcov_version < $GCOV_VERSION_3_4_0) - { - if (defined($compatibility) && $compatibility eq $COMPAT_HAMMER) - { - %bb_content = read_hammer_bbg_file($bb_filename, - $base_dir); - } - else - { - %bb_content = read_bb_file($bb_filename, $base_dir); - } - } - else - { - %bb_content = read_gcno_file($bb_filename, $base_dir); - } - - # Set $object_dir to real location of object files. This may differ - # from $da_dir if the graph file is just a link to the "real" object - # file location. - $object_dir = dirname($bb_filename); - - # Is the data file in a different directory? (this happens e.g. with - # the gcov-kernel patch) - if ($object_dir ne $da_dir) - { - # Need to create link to data file in $object_dir - system("ln", "-s", $da_filename, - "$object_dir/$da_basename$data_file_extension") - and die ("ERROR: cannot create link $object_dir/". - "$da_basename$data_file_extension!\n"); - } - - # Change to directory containing data files and apply GCOV - chdir($base_dir); - - if ($da_renamed) - { - # Need to rename empty data file to workaround - # gcov <= 3.2.x bug (Abort) - system_no_output(3, "mv", "$da_filename", "$da_filename.ori") - and die ("ERROR: cannot rename $da_filename\n"); - } - - # Execute gcov command and suppress standard output - if ($preserve_paths) - { - $gcov_error = system_no_output(1, $gcov_tool, $da_filename, - "-o", $object_dir, - "--preserve-paths", - "-b"); - } - else - { - $gcov_error = system_no_output(1, $gcov_tool, $da_filename, - "-o", $object_dir, - "-b"); - } - - if ($da_renamed) - { - system_no_output(3, "mv", "$da_filename.ori", "$da_filename") - and die ("ERROR: cannot rename $da_filename.ori"); - } - - # Clean up link - if ($object_dir ne $da_dir) - { - unlink($object_dir."/".$da_basename.$data_file_extension); - } - - if ($gcov_error) - { - if ($ignore[$ERROR_GCOV]) - { - warn("WARNING: GCOV failed for $da_filename!\n"); - return; - } - die("ERROR: GCOV failed for $da_filename!\n"); - } - - # Collect data from resulting .gcov files and create .info file - @gcov_list = glob("*.gcov"); - - # Check for files - if (!@gcov_list) - { - warn("WARNING: gcov did not create any files for ". - "$da_filename!\n"); - } - - # Check whether we're writing to a single file - if ($output_filename) - { - if ($output_filename eq "-") - { - *INFO_HANDLE = *STDOUT; - } - else - { - # Append to output file - open(INFO_HANDLE, ">>$output_filename") - or die("ERROR: cannot write to ". - "$output_filename!\n"); - } - } - else - { - # Open .info file for output - open(INFO_HANDLE, ">$da_filename.info") - or die("ERROR: cannot create $da_filename.info!\n"); - } - - # Write test name - printf(INFO_HANDLE "TN:%s\n", $test_name); - - # Traverse the list of generated .gcov files and combine them into a - # single .info file - @unprocessed = keys(%bb_content); - foreach $gcov_file (@gcov_list) - { - ($source, $object) = read_gcov_header($gcov_file); - - if (defined($source)) - { - $source = solve_relative_path($base_dir, $source); - } - - # gcov will happily create output even if there's no source code - # available - this interferes with checksum creation so we need - # to pull the emergency brake here. - if (defined($source) && ! -r $source && $checksum) - { - if ($ignore[$ERROR_SOURCE]) - { - warn("WARNING: could not read source file ". - "$source\n"); - next; - } - die("ERROR: could not read source file $source\n"); - } - - @matches = match_filename(defined($source) ? $source : - $gcov_file, keys(%bb_content)); - - # Skip files that are not mentioned in the graph file - if (!@matches) - { - warn("WARNING: cannot find an entry for ".$gcov_file. - " in $graph_file_extension file, skipping ". - "file!\n"); - unlink($gcov_file); - next; - } - - # Read in contents of gcov file - @result = read_gcov_file($gcov_file); - @gcov_content = @{$result[0]}; - @gcov_branches = @{$result[1]}; - @gcov_functions = @{$result[2]}; - - # Skip empty files - if (!@gcov_content) - { - warn("WARNING: skipping empty file ".$gcov_file."\n"); - unlink($gcov_file); - next; - } - - if (scalar(@matches) == 1) - { - # Just one match - $source_filename = $matches[0]; - } - else - { - # Try to solve the ambiguity - $source_filename = solve_ambiguous_match($gcov_file, - \@matches, \@gcov_content); - } - - # Remove processed file from list - for ($index = scalar(@unprocessed) - 1; $index >= 0; $index--) - { - if ($unprocessed[$index] eq $source_filename) - { - splice(@unprocessed, $index, 1); - last; - } - } - - # Write absolute path of source file - printf(INFO_HANDLE "SF:%s\n", $source_filename); - - # Write function-related information - if (defined($bb_content{$source_filename})) - { - foreach (split(",",$bb_content{$source_filename})) - { - my ($fn, $line) = split("=", $_); - - if ($fn eq "") { - next; - } - - # Normalize function name - $fn =~ s/\W/_/g; - - print(INFO_HANDLE "FN:$line,$fn\n"); - } - } - - #-- - #-- FNDA: <call-count>, <function-name> - #-- FNF: overall count of functions - #-- FNH: overall count of functions with non-zero call count - #-- - $funcs_found = 0; - $funcs_hit = 0; - while (@gcov_functions) - { - printf(INFO_HANDLE "FNDA:%s,%s\n", - $gcov_functions[0], - $gcov_functions[1]); - $funcs_found++; - $funcs_hit++ if $gcov_functions[0]; - splice(@gcov_functions,0,2); - } - if ($funcs_found > 0) { - printf(INFO_HANDLE "FNF:%s\n", $funcs_found); - printf(INFO_HANDLE "FNH:%s\n", $funcs_hit); - } - - # Reset line counters - $line_number = 0; - $lines_found = 0; - $lines_hit = 0; - - # Write coverage information for each instrumented line - # Note: @gcov_content contains a list of (flag, count, source) - # tuple for each source code line - while (@gcov_content) - { - $line_number++; - - # Check for instrumented line - if ($gcov_content[0]) - { - $lines_found++; - printf(INFO_HANDLE "DA:".$line_number.",". - $gcov_content[1].($checksum ? - ",". md5_base64($gcov_content[2]) : ""). - "\n"); - - # Increase $lines_hit in case of an execution - # count>0 - if ($gcov_content[1] > 0) { $lines_hit++; } - } - - # Remove already processed data from array - splice(@gcov_content,0,3); - } - - #-- - #-- BA: <code-line>, <branch-coverage> - #-- - #-- print one BA line for every branch of a - #-- conditional. <branch-coverage> values - #-- are: - #-- 0 - not executed - #-- 1 - executed but not taken - #-- 2 - executed and taken - #-- - while (@gcov_branches) - { - if ($gcov_branches[0]) - { - printf(INFO_HANDLE "BA:%s,%s\n", - $gcov_branches[0], - $gcov_branches[1]); - } - splice(@gcov_branches,0,2); - } - - # Write line statistics and section separator - printf(INFO_HANDLE "LF:%s\n", $lines_found); - printf(INFO_HANDLE "LH:%s\n", $lines_hit); - print(INFO_HANDLE "end_of_record\n"); - - # Remove .gcov file after processing - unlink($gcov_file); - } - - # Check for files which show up in the graph file but were never - # processed - if (@unprocessed && @gcov_list) - { - foreach (@unprocessed) - { - warn("WARNING: no data found for $_\n"); - } - } - - if (!($output_filename && ($output_filename eq "-"))) - { - close(INFO_HANDLE); - } - - # Change back to initial directory - chdir($cwd); -} - - -# -# solve_relative_path(path, dir) -# -# Solve relative path components of DIR which, if not absolute, resides in PATH. -# - -sub solve_relative_path($$) -{ - my $path = $_[0]; - my $dir = $_[1]; - my $result; - - $result = $dir; - # Prepend path if not absolute - if ($dir =~ /^[^\/]/) - { - $result = "$path/$result"; - } - - # Remove // - $result =~ s/\/\//\//g; - - # Remove . - $result =~ s/\/\.\//\//g; - - # Solve .. - while ($result =~ s/\/[^\/]+\/\.\.\//\//) - { - } - - # Remove preceding .. - $result =~ s/^\/\.\.\//\//g; - - return $result; -} - - -# -# match_filename(gcov_filename, list) -# -# Return a list of those entries of LIST which match the relative filename -# GCOV_FILENAME. -# - -sub match_filename($@) -{ - my $filename = shift; - my @list = @_; - my @result; - - $filename =~ s/^(.*).gcov$/$1/; - - if ($filename =~ /^\/(.*)$/) - { - $filename = "$1"; - } - - foreach (@list) - { - if (/\/\Q$filename\E(.*)$/ && $1 eq "") - { - @result = (@result, $_); - } - } - return @result; -} - - -# -# solve_ambiguous_match(rel_filename, matches_ref, gcov_content_ref) -# -# Try to solve ambiguous matches of mapping (gcov file) -> (source code) file -# by comparing source code provided in the GCOV file with that of the files -# in MATCHES. REL_FILENAME identifies the relative filename of the gcov -# file. -# -# Return the one real match or die if there is none. -# - -sub solve_ambiguous_match($$$) -{ - my $rel_name = $_[0]; - my $matches = $_[1]; - my $content = $_[2]; - my $filename; - my $index; - my $no_match; - local *SOURCE; - - # Check the list of matches - foreach $filename (@$matches) - { - - # Compare file contents - open(SOURCE, $filename) - or die("ERROR: cannot read $filename!\n"); - - $no_match = 0; - for ($index = 2; <SOURCE>; $index += 3) - { - chomp; - - if ($_ ne @$content[$index]) - { - $no_match = 1; - last; - } - } - - close(SOURCE); - - if (!$no_match) - { - info("Solved source file ambiguity for $rel_name\n"); - return $filename; - } - } - - die("ERROR: could not match gcov data for $rel_name!\n"); -} - - -# -# split_filename(filename) -# -# Return (path, filename, extension) for a given FILENAME. -# - -sub split_filename($) -{ - my @path_components = split('/', $_[0]); - my @file_components = split('\.', pop(@path_components)); - my $extension = pop(@file_components); - - return (join("/",@path_components), join(".",@file_components), - $extension); -} - - -# -# get_dir(filename); -# -# Return the directory component of a given FILENAME. -# - -sub get_dir($) -{ - my @components = split("/", $_[0]); - pop(@components); - - return join("/", @components); -} - - -# -# read_gcov_header(gcov_filename) -# -# Parse file GCOV_FILENAME and return a list containing the following -# information: -# -# (source, object) -# -# where: -# -# source: complete relative path of the source code file (gcc >= 3.3 only) -# object: name of associated graph file -# -# Die on error. -# - -sub read_gcov_header($) -{ - my $source; - my $object; - local *INPUT; - - if (!open(INPUT, $_[0])) - { - if ($ignore_errors[$ERROR_GCOV]) - { - warn("WARNING: cannot read $_[0]!\n"); - return (undef,undef); - } - die("ERROR: cannot read $_[0]!\n"); - } - - while (<INPUT>) - { - chomp($_); - - if (/^\s+-:\s+0:Source:(.*)$/) - { - # Source: header entry - $source = $1; - } - elsif (/^\s+-:\s+0:Object:(.*)$/) - { - # Object: header entry - $object = $1; - } - else - { - last; - } - } - - close(INPUT); - - return ($source, $object); -} - - -# -# read_gcov_file(gcov_filename) -# -# Parse file GCOV_FILENAME (.gcov file format) and return the list: -# (reference to gcov_content, reference to gcov_branch, reference to gcov_func) -# -# gcov_content is a list of 3 elements -# (flag, count, source) for each source code line: -# -# $result[($line_number-1)*3+0] = instrumentation flag for line $line_number -# $result[($line_number-1)*3+1] = execution count for line $line_number -# $result[($line_number-1)*3+2] = source code text for line $line_number -# -# gcov_branch is a list of 2 elements -# (linenumber, branch result) for each branch -# -# gcov_func is a list of 2 elements -# (number of calls, function name) for each function -# -# Die on error. -# - -sub read_gcov_file($) -{ - my $filename = $_[0]; - my @result = (); - my @branches = (); - my @functions = (); - my $number; - local *INPUT; - - open(INPUT, $filename) - or die("ERROR: cannot read $filename!\n"); - - if ($gcov_version < $GCOV_VERSION_3_3_0) - { - # Expect gcov format as used in gcc < 3.3 - while (<INPUT>) - { - chomp($_); - - if (/^\t\t(.*)$/) - { - # Uninstrumented line - push(@result, 0); - push(@result, 0); - push(@result, $1); - } - elsif (/^branch/) - { - # Branch execution data - push(@branches, scalar(@result) / 3); - if (/^branch \d+ never executed$/) - { - push(@branches, 0); - } - elsif (/^branch \d+ taken = 0%/) - { - push(@branches, 1); - } - else - { - push(@branches, 2); - } - } - elsif (/^call/ || /^function/) - { - # Function call return data - } - else - { - # Source code execution data - $number = (split(" ",substr($_, 0, 16)))[0]; - - # Check for zero count which is indicated - # by ###### - if ($number eq "######") { $number = 0; } - - push(@result, 1); - push(@result, $number); - push(@result, substr($_, 16)); - } - } - } - else - { - # Expect gcov format as used in gcc >= 3.3 - while (<INPUT>) - { - chomp($_); - - if (/^branch\s+\d+\s+(\S+)\s+(\S+)/) - { - # Branch execution data - push(@branches, scalar(@result) / 3); - if ($1 eq "never") - { - push(@branches, 0); - } - elsif ($2 eq "0%") - { - push(@branches, 1); - } - else - { - push(@branches, 2); - } - } - elsif (/^function\s+(\S+)\s+called\s+(\d+)/) - { - push(@functions, $2, $1); - } - elsif (/^call/) - { - # Function call return data - } - elsif (/^\s*([^:]+):\s*([^:]+):(.*)$/) - { - # <exec count>:<line number>:<source code> - if ($2 eq "0") - { - # Extra data - } - elsif ($1 eq "-") - { - # Uninstrumented line - push(@result, 0); - push(@result, 0); - push(@result, $3); - } - else - { - # Source code execution data - $number = $1; - - # Check for zero count - if ($number eq "#####") { $number = 0; } - - push(@result, 1); - push(@result, $number); - push(@result, $3); - } - } - } - } - - close(INPUT); - return(\@result, \@branches, \@functions); -} - - -# -# read_bb_file(bb_filename, base_dir) -# -# Read .bb file BB_FILENAME and return a hash containing the following -# mapping: -# -# filename -> comma-separated list of pairs (function name=starting -# line number) to indicate the starting line of a function or -# =name to indicate an instrumented line -# -# for each entry in the .bb file. Filenames are absolute, i.e. relative -# filenames are prefixed with BASE_DIR. -# -# Die on error. -# - -sub read_bb_file($$) -{ - my $bb_filename = $_[0]; - my $base_dir = $_[1]; - my %result; - my $filename; - my $function_name; - my $minus_one = sprintf("%d", 0x80000001); - my $minus_two = sprintf("%d", 0x80000002); - my $value; - my $packed_word; - local *INPUT; - - open(INPUT, $bb_filename) - or die("ERROR: cannot read $bb_filename!\n"); - - binmode(INPUT); - - # Read data in words of 4 bytes - while (read(INPUT, $packed_word, 4) == 4) - { - # Decode integer in intel byteorder - $value = unpack_int32($packed_word, 0); - - # Note: the .bb file format is documented in GCC info pages - if ($value == $minus_one) - { - # Filename follows - $filename = read_string(*INPUT, $minus_one) - or die("ERROR: incomplete filename in ". - "$bb_filename!\n"); - - # Make path absolute - $filename = solve_relative_path($base_dir, $filename); - - # Insert into hash if not yet present. - # This is necessary because functions declared as - # "inline" are not listed as actual functions in - # .bb files - if (!$result{$filename}) - { - $result{$filename}=""; - } - } - elsif ($value == $minus_two) - { - # Function name follows - $function_name = read_string(*INPUT, $minus_two) - or die("ERROR: incomplete function ". - "name in $bb_filename!\n"); - $function_name =~ s/\W/_/g; - } - elsif ($value > 0) - { - if (defined($filename)) - { - $result{$filename} .= - ($result{$filename} ? "," : ""). - "=$value"; - } - else - { - warn("WARNING: unassigned line". - " number in .bb file ". - "$bb_filename\n"); - } - if ($function_name) - { - # Got a full entry filename, funcname, lineno - # Add to resulting hash - - $result{$filename}.= - ($result{$filename} ? "," : ""). - join("=",($function_name,$value)); - undef($function_name); - } - } - } - close(INPUT); - - if (!scalar(keys(%result))) - { - die("ERROR: no data found in $bb_filename!\n"); - } - return %result; -} - - -# -# read_string(handle, delimiter); -# -# Read and return a string in 4-byte chunks from HANDLE until DELIMITER -# is found. -# -# Return empty string on error. -# - -sub read_string(*$) -{ - my $HANDLE = $_[0]; - my $delimiter = $_[1]; - my $string = ""; - my $packed_word; - my $value; - - while (read($HANDLE,$packed_word,4) == 4) - { - $value = unpack_int32($packed_word, 0); - - if ($value == $delimiter) - { - # Remove trailing nil bytes - $/="\0"; - while (chomp($string)) {}; - $/="\n"; - return($string); - } - - $string = $string.$packed_word; - } - return(""); -} - - -# -# read_gcno_file(bb_filename, base_dir) -# -# Read .gcno file BB_FILENAME and return a hash containing the following -# mapping: -# -# filename -> comma-separated list of pairs (function name=starting -# line number) to indicate the starting line of a function or -# =name to indicate an instrumented line -# -# for each entry in the .gcno file. Filenames are absolute, i.e. relative -# filenames are prefixed with BASE_DIR. -# -# Die on error. -# - -sub read_gcno_file($$) -{ - my $gcno_filename = $_[0]; - my $base_dir = $_[1]; - my %result; - my $filename; - my $function_name; - my $lineno; - my $length; - my $value; - my $endianness; - my $blocks; - my $packed_word; - my $string; - local *INPUT; - - open(INPUT, $gcno_filename) - or die("ERROR: cannot read $gcno_filename!\n"); - - binmode(INPUT); - - read(INPUT, $packed_word, 4) == 4 - or die("ERROR: Invalid gcno file format\n"); - - $value = unpack_int32($packed_word, 0); - $endianness = !($value == $GCNO_FILE_MAGIC); - - unpack_int32($packed_word, $endianness) == $GCNO_FILE_MAGIC - or die("ERROR: gcno file magic does not match\n"); - - seek(INPUT, 8, 1); - - # Read data in words of 4 bytes - while (read(INPUT, $packed_word, 4) == 4) - { - # Decode integer in intel byteorder - $value = unpack_int32($packed_word, $endianness); - - if ($value == $GCNO_FUNCTION_TAG) - { - # skip length, ident and checksum - seek(INPUT, 12, 1); - (undef, $function_name) = - read_gcno_string(*INPUT, $endianness); - $function_name =~ s/\W/_/g; - (undef, $filename) = - read_gcno_string(*INPUT, $endianness); - $filename = solve_relative_path($base_dir, $filename); - - read(INPUT, $packed_word, 4); - $lineno = unpack_int32($packed_word, $endianness); - - $result{$filename}.= - ($result{$filename} ? "," : ""). - join("=",($function_name,$lineno)); - } - elsif ($value == $GCNO_LINES_TAG) - { - # Check for names of files containing inlined code - # included in this file - read(INPUT, $packed_word, 4); - $length = unpack_int32($packed_word, $endianness); - if ($length > 0) - { - # Block number - read(INPUT, $packed_word, 4); - $length--; - } - while ($length > 0) - { - read(INPUT, $packed_word, 4); - $lineno = unpack_int32($packed_word, - $endianness); - $length--; - if ($lineno != 0) - { - if (defined($filename)) - { - $result{$filename} .= - ($result{$filename} ? "," : ""). - "=$lineno"; - } - else - { - warn("WARNING: unassigned line". - " number in .gcno file ". - "$gcno_filename\n"); - } - next; - } - last if ($length == 0); - ($blocks, $string) = - read_gcno_string(*INPUT, $endianness); - if (defined($string)) - { - $filename = $string; - } - if ($blocks > 1) - { - $filename = solve_relative_path( - $base_dir, $filename); - if (!defined($result{$filename})) - { - $result{$filename} = ""; - } - } - $length -= $blocks; - } - } - else - { - read(INPUT, $packed_word, 4); - $length = unpack_int32($packed_word, $endianness); - seek(INPUT, 4 * $length, 1); - } - } - close(INPUT); - - if (!scalar(keys(%result))) - { - die("ERROR: no data found in $gcno_filename!\n"); - } - return %result; -} - - -# -# read_gcno_string(handle, endianness); -# -# Read a string in 4-byte chunks from HANDLE. -# -# Return (number of 4-byte chunks read, string). -# - -sub read_gcno_string(*$) -{ - my $handle = $_[0]; - my $endianness = $_[1]; - my $number_of_blocks = 0; - my $string = ""; - my $packed_word; - - read($handle, $packed_word, 4) == 4 - or die("ERROR: reading string\n"); - - $number_of_blocks = unpack_int32($packed_word, $endianness); - - if ($number_of_blocks == 0) - { - return (1, undef); - } - - if (read($handle, $packed_word, 4 * $number_of_blocks) != - 4 * $number_of_blocks) - { - my $msg = "invalid string size ".(4 * $number_of_blocks)." in ". - "gcno file at position ".tell($handle)."\n"; - if ($ignore[$ERROR_SOURCE]) - { - warn("WARNING: $msg"); - return (1, undef); - } - else - { - die("ERROR: $msg"); - } - } - - $string = $string . $packed_word; - - # Remove trailing nil bytes - $/="\0"; - while (chomp($string)) {}; - $/="\n"; - - return(1 + $number_of_blocks, $string); -} - - -# -# read_hammer_bbg_file(bb_filename, base_dir) -# -# Read .bbg file BB_FILENAME and return a hash containing the following -# mapping: -# -# filename -> comma-separated list of pairs (function name=starting -# line number) to indicate the starting line of a function or -# =name to indicate an instrumented line -# -# for each entry in the .bbg file. Filenames are absolute, i.e. relative -# filenames are prefixed with BASE_DIR. -# -# Die on error. -# - -sub read_hammer_bbg_file($$) -{ - my $bbg_filename = $_[0]; - my $base_dir = $_[1]; - my %result; - my $filename; - my $function_name; - my $first_line; - my $lineno; - my $length; - my $value; - my $endianness; - my $blocks; - my $packed_word; - local *INPUT; - - open(INPUT, $bbg_filename) - or die("ERROR: cannot read $bbg_filename!\n"); - - binmode(INPUT); - - # Read magic - read(INPUT, $packed_word, 4) == 4 - or die("ERROR: invalid bbg file format\n"); - - $endianness = 1; - - unpack_int32($packed_word, $endianness) == $BBG_FILE_MAGIC - or die("ERROR: bbg file magic does not match\n"); - - # Skip version - seek(INPUT, 4, 1); - - # Read data in words of 4 bytes - while (read(INPUT, $packed_word, 4) == 4) - { - # Get record tag - $value = unpack_int32($packed_word, $endianness); - - # Get record length - read(INPUT, $packed_word, 4); - $length = unpack_int32($packed_word, $endianness); - - if ($value == $GCNO_FUNCTION_TAG) - { - # Get function name - ($value, $function_name) = - read_hammer_bbg_string(*INPUT, $endianness); - $function_name =~ s/\W/_/g; - $filename = undef; - $first_line = undef; - - seek(INPUT, $length - $value * 4, 1); - } - elsif ($value == $GCNO_LINES_TAG) - { - # Get linenumber and filename - # Skip block number - seek(INPUT, 4, 1); - $length -= 4; - - while ($length > 0) - { - read(INPUT, $packed_word, 4); - $lineno = unpack_int32($packed_word, - $endianness); - $length -= 4; - if ($lineno != 0) - { - if (!defined($first_line)) - { - $first_line = $lineno; - } - if (defined($filename)) - { - $result{$filename} .= - ($result{$filename} ? "," : ""). - "=$lineno"; - } - else - { - warn("WARNING: unassigned line". - " number in .bbg file ". - "$bbg_filename\n"); - } - next; - } - ($blocks, $value) = - read_hammer_bbg_string( - *INPUT, $endianness); - # Add all filenames to result list - if (defined($value)) - { - $value = solve_relative_path( - $base_dir, $value); - if (!defined($result{$value})) - { - $result{$value} = undef; - } - if (!defined($filename)) - { - $filename = $value; - } - } - $length -= $blocks * 4; - - # Got a complete data set? - if (defined($filename) && - defined($first_line) && - defined($function_name)) - { - # Add it to our result hash - if (defined($result{$filename})) - { - $result{$filename} .= - ",$function_name=$first_line"; - } - else - { - $result{$filename} = - "$function_name=$first_line"; - } - $function_name = undef; - $filename = undef; - $first_line = undef; - } - } - } - else - { - # Skip other records - seek(INPUT, $length, 1); - } - } - close(INPUT); - - if (!scalar(keys(%result))) - { - die("ERROR: no data found in $bbg_filename!\n"); - } - return %result; -} - - -# -# read_hammer_bbg_string(handle, endianness); -# -# Read a string in 4-byte chunks from HANDLE. -# -# Return (number of 4-byte chunks read, string). -# - -sub read_hammer_bbg_string(*$) -{ - my $handle = $_[0]; - my $endianness = $_[1]; - my $length = 0; - my $string = ""; - my $packed_word; - my $pad; - - read($handle, $packed_word, 4) == 4 - or die("ERROR: reading string\n"); - - $length = unpack_int32($packed_word, $endianness); - $pad = 4 - $length % 4; - - if ($length == 0) - { - return (1, undef); - } - - read($handle, $string, $length) == - $length or die("ERROR: reading string\n"); - seek($handle, $pad, 1); - - return(1 + ($length + $pad) / 4, $string); -} - -# -# unpack_int32(word, endianness) -# -# Interpret 4-byte binary string WORD as signed 32 bit integer in -# endian encoding defined by ENDIANNESS (0=little, 1=big) and return its -# value. -# - -sub unpack_int32($$) -{ - return sprintf("%d", unpack($_[1] ? "N" : "V",$_[0])); -} - - -# -# Get the GCOV tool version. Return an integer number which represents the -# GCOV version. Version numbers can be compared using standard integer -# operations. -# - -sub get_gcov_version() -{ - local *HANDLE; - my $version_string; - my $result; - - open(GCOV_PIPE, "$gcov_tool -v |") - or die("ERROR: cannot retrieve gcov version!\n"); - $version_string = <GCOV_PIPE>; - close(GCOV_PIPE); - - $result = 0; - if ($version_string =~ /(\d+)\.(\d+)(\.(\d+))?/) - { - if (defined($4)) - { - info("Found gcov version: $1.$2.$4\n"); - $result = $1 << 16 | $2 << 8 | $4; - } - else - { - info("Found gcov version: $1.$2\n"); - $result = $1 << 16 | $2 << 8; - } - } - if ($version_string =~ /suse/i && $result == 0x30303 || - $version_string =~ /mandrake/i && $result == 0x30302) - { - info("Using compatibility mode for GCC 3.3 (hammer)\n"); - $compatibility = $COMPAT_HAMMER; - } - return $result; -} - - -# -# info(printf_parameter) -# -# Use printf to write PRINTF_PARAMETER to stdout only when the $quiet flag -# is not set. -# - -sub info(@) -{ - if (!$quiet) - { - # Print info string - if (defined($output_filename) && ($output_filename eq "-")) - { - # Don't interfere with the .info output to STDOUT - printf(STDERR @_); - } - else - { - printf(@_); - } - } -} - - -# -# int_handler() -# -# Called when the script was interrupted by an INT signal (e.g. CTRl-C) -# - -sub int_handler() -{ - if ($cwd) { chdir($cwd); } - info("Aborted.\n"); - exit(1); -} - - -# -# system_no_output(mode, parameters) -# -# Call an external program using PARAMETERS while suppressing depending on -# the value of MODE: -# -# MODE & 1: suppress STDOUT -# MODE & 2: suppress STDERR -# -# Return 0 on success, non-zero otherwise. -# - -sub system_no_output($@) -{ - my $mode = shift; - my $result; - local *OLD_STDERR; - local *OLD_STDOUT; - - # Save old stdout and stderr handles - ($mode & 1) && open(OLD_STDOUT, ">>&STDOUT"); - ($mode & 2) && open(OLD_STDERR, ">>&STDERR"); - - # Redirect to /dev/null - ($mode & 1) && open(STDOUT, ">/dev/null"); - ($mode & 2) && open(STDERR, ">/dev/null"); - - system(@_); - $result = $?; - - # Close redirected handles - ($mode & 1) && close(STDOUT); - ($mode & 2) && close(STDERR); - - # Restore old handles - ($mode & 1) && open(STDOUT, ">>&OLD_STDOUT"); - ($mode & 2) && open(STDERR, ">>&OLD_STDERR"); - - return $result; -} - - -# -# read_config(filename) -# -# Read configuration file FILENAME and return a reference to a hash containing -# all valid key=value pairs found. -# - -sub read_config($) -{ - my $filename = $_[0]; - my %result; - my $key; - my $value; - local *HANDLE; - - if (!open(HANDLE, "<$filename")) - { - warn("WARNING: cannot read configuration file $filename\n"); - return undef; - } - while (<HANDLE>) - { - chomp; - # Skip comments - s/#.*//; - # Remove leading blanks - s/^\s+//; - # Remove trailing blanks - s/\s+$//; - next unless length; - ($key, $value) = split(/\s*=\s*/, $_, 2); - if (defined($key) && defined($value)) - { - $result{$key} = $value; - } - else - { - warn("WARNING: malformed statement in line $. ". - "of configuration file $filename\n"); - } - } - close(HANDLE); - return \%result; -} - - -# -# apply_config(REF) -# -# REF is a reference to a hash containing the following mapping: -# -# key_string => var_ref -# -# where KEY_STRING is a keyword and VAR_REF is a reference to an associated -# variable. If the global configuration hash CONFIG contains a value for -# keyword KEY_STRING, VAR_REF will be assigned the value for that keyword. -# - -sub apply_config($) -{ - my $ref = $_[0]; - - foreach (keys(%{$ref})) - { - if (defined($config->{$_})) - { - ${$ref->{$_}} = $config->{$_}; - } - } -} - - -sub gen_initial_info($) -{ - my $directory = $_[0]; - my @file_list; - - if (-d $directory) - { - info("Scanning $directory for $graph_file_extension ". - "files ...\n"); - - @file_list = `find "$directory" $maxdepth $follow -name \\*$graph_file_extension -type f 2>/dev/null`; - chomp(@file_list); - @file_list or die("ERROR: no $graph_file_extension files ". - "found in $directory!\n"); - info("Found %d graph files in %s\n", $#file_list+1, $directory); - } - else - { - @file_list = ($directory); - } - - # Process all files in list - foreach (@file_list) { process_graphfile($_); } -} - -sub process_graphfile($) -{ - my $graph_filename = $_[0]; - my $graph_dir; - my $graph_basename; - my $source_dir; - my $base_dir; - my %graph_data; - my $filename; - local *INFO_HANDLE; - - info("Processing $_[0]\n"); - - # Get path to data file in absolute and normalized form (begins with /, - # contains no more ../ or ./) - $graph_filename = solve_relative_path($cwd, $graph_filename); - - # Get directory and basename of data file - ($graph_dir, $graph_basename) = split_filename($graph_filename); - - # avoid files from .libs dirs - if ($compat_libtool && $graph_dir =~ m/(.*)\/\.libs$/) { - $source_dir = $1; - } else { - $source_dir = $graph_dir; - } - - # Construct base_dir for current file - if ($base_directory) - { - $base_dir = $base_directory; - } - else - { - $base_dir = $source_dir; - } - - if ($gcov_version < $GCOV_VERSION_3_4_0) - { - if (defined($compatibility) && $compatibility eq $COMPAT_HAMMER) - { - %graph_data = read_hammer_bbg_file($graph_filename, - $base_dir); - } - else - { - %graph_data = read_bb_file($graph_filename, $base_dir); - } - } - else - { - %graph_data = read_gcno_file($graph_filename, $base_dir); - } - - # Check whether we're writing to a single file - if ($output_filename) - { - if ($output_filename eq "-") - { - *INFO_HANDLE = *STDOUT; - } - else - { - # Append to output file - open(INFO_HANDLE, ">>$output_filename") - or die("ERROR: cannot write to ". - "$output_filename!\n"); - } - } - else - { - # Open .info file for output - open(INFO_HANDLE, ">$graph_filename.info") - or die("ERROR: cannot create $graph_filename.info!\n"); - } - - # Write test name - printf(INFO_HANDLE "TN:%s\n", $test_name); - foreach $filename (keys(%graph_data)) - { - my %lines; - my $count = 0; - my @functions; - - print(INFO_HANDLE "SF:$filename\n"); - - # Write function related data - foreach (split(",",$graph_data{$filename})) - { - my ($fn, $line) = split("=", $_); - - if ($fn eq "") - { - $lines{$line} = ""; - next; - } - - # Normalize function name - $fn =~ s/\W/_/g; - - print(INFO_HANDLE "FN:$line,$fn\n"); - push(@functions, $fn); - } - foreach (@functions) { - print(INFO_HANDLE "FNDA:$_,0\n"); - } - print(INFO_HANDLE "FNF:".scalar(@functions)."\n"); - print(INFO_HANDLE "FNH:0\n"); - - # Write line related data - foreach (sort {$a <=> $b } keys(%lines)) - { - print(INFO_HANDLE "DA:$_,0\n"); - $count++; - } - print(INFO_HANDLE "LH:0\n"); - print(INFO_HANDLE "LF:$count\n"); - print(INFO_HANDLE "end_of_record\n"); - } - if (!($output_filename && ($output_filename eq "-"))) - { - close(INFO_HANDLE); - } -} - -sub warn_handler($) -{ - my ($msg) = @_; - - warn("$tool_name: $msg"); -} - -sub die_handler($) -{ - my ($msg) = @_; - - die("$tool_name: $msg"); -} diff --git a/3rdParty/LCov/genpng b/3rdParty/LCov/genpng deleted file mode 100755 index b4d90c2..0000000 --- a/3rdParty/LCov/genpng +++ /dev/null @@ -1,381 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (c) International Business Machines Corp., 2002 -# -# 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 -# -# -# genpng -# -# This script creates an overview PNG image of a source code file by -# representing each source code character by a single pixel. -# -# Note that the PERL module GD.pm is required for this script to work. -# It may be obtained from http://www.cpan.org -# -# History: -# 2002-08-26: created by Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> -# - -use strict; -use File::Basename; -use Getopt::Long; - - -# Constants -our $lcov_version = "LCOV version 1.7"; -our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; -our $tool_name = basename($0); - - -# Prototypes -sub gen_png($$$@); -sub check_and_load_module($); -sub genpng_print_usage(*); -sub genpng_process_file($$$$); -sub warn_handler($); -sub die_handler($); - - -# -# Code entry point -# - -# Check whether required module GD.pm is installed -if (check_and_load_module("GD")) -{ - # Note: cannot use die() to print this message because inserting this - # code into another script via do() would not fail as required! - print(STDERR <<END_OF_TEXT) -ERROR: required module GD.pm not found on this system (see www.cpan.org). -END_OF_TEXT - ; - exit(2); -} - -# Check whether we're called from the command line or from another script -if (!caller) -{ - my $filename; - my $tab_size = 4; - my $width = 80; - my $out_filename; - my $help; - my $version; - - $SIG{__WARN__} = \&warn_handler; - $SIG{__DIE__} = \&die_handler; - - # Parse command line options - if (!GetOptions("tab-size=i" => \$tab_size, - "width=i" => \$width, - "output-filename=s" => \$out_filename, - "help" => \$help, - "version" => \$version)) - { - print(STDERR "Use $tool_name --help to get usage ". - "information\n"); - exit(1); - } - - $filename = $ARGV[0]; - - # Check for help flag - if ($help) - { - genpng_print_usage(*STDOUT); - exit(0); - } - - # Check for version flag - if ($version) - { - print("$tool_name: $lcov_version\n"); - exit(0); - } - - # Check options - if (!$filename) - { - die("No filename specified\n"); - } - - # Check for output filename - if (!$out_filename) - { - $out_filename = "$filename.png"; - } - - genpng_process_file($filename, $out_filename, $width, $tab_size); - exit(0); -} - - -# -# genpng_print_usage(handle) -# -# Write out command line usage information to given filehandle. -# - -sub genpng_print_usage(*) -{ - local *HANDLE = $_[0]; - - print(HANDLE <<END_OF_USAGE) -Usage: $tool_name [OPTIONS] SOURCEFILE - -Create an overview image for a given source code file of either plain text -or .gcov file format. - - -h, --help Print this help, then exit - -v, --version Print version number, then exit - -t, --tab-size TABSIZE Use TABSIZE spaces in place of tab - -w, --width WIDTH Set width of output image to WIDTH pixel - -o, --output-filename FILENAME Write image to FILENAME - -For more information see: $lcov_url -END_OF_USAGE - ; -} - - -# -# check_and_load_module(module_name) -# -# Check whether a module by the given name is installed on this system -# and make it known to the interpreter if available. Return undefined if it -# is installed, an error message otherwise. -# - -sub check_and_load_module($) -{ - eval("use $_[0];"); - return $@; -} - - -# -# genpng_process_file(filename, out_filename, width, tab_size) -# - -sub genpng_process_file($$$$) -{ - my $filename = $_[0]; - my $out_filename = $_[1]; - my $width = $_[2]; - my $tab_size = $_[3]; - local *HANDLE; - my @source; - - open(HANDLE, "<$filename") - or die("ERROR: cannot open $filename!\n"); - - # Check for .gcov filename extension - if ($filename =~ /^(.*).gcov$/) - { - # Assume gcov text format - while (<HANDLE>) - { - if (/^\t\t(.*)$/) - { - # Uninstrumented line - push(@source, ":$1"); - } - elsif (/^ ###### (.*)$/) - { - # Line with zero execution count - push(@source, "0:$1"); - } - elsif (/^( *)(\d*) (.*)$/) - { - # Line with positive execution count - push(@source, "$2:$3"); - } - } - } - else - { - # Plain text file - while (<HANDLE>) { push(@source, ":$_"); } - } - close(HANDLE); - - gen_png($out_filename, $width, $tab_size, @source); -} - - -# -# gen_png(filename, width, tab_size, source) -# -# Write an overview PNG file to FILENAME. Source code is defined by SOURCE -# which is a list of lines <count>:<source code> per source code line. -# The output image will be made up of one pixel per character of source, -# coloring will be done according to execution counts. WIDTH defines the -# image width. TAB_SIZE specifies the number of spaces to use as replacement -# string for tabulator signs in source code text. -# -# Die on error. -# - -sub gen_png($$$@) -{ - my $filename = shift(@_); # Filename for PNG file - my $overview_width = shift(@_); # Imagewidth for image - my $tab_size = shift(@_); # Replacement string for tab signs - my @source = @_; # Source code as passed via argument 2 - my $height = scalar(@source); # Height as define by source size - my $overview; # Source code overview image data - my $col_plain_back; # Color for overview background - my $col_plain_text; # Color for uninstrumented text - my $col_cov_back; # Color for background of covered lines - my $col_cov_text; # Color for text of covered lines - my $col_nocov_back; # Color for background of lines which - # were not covered (count == 0) - my $col_nocov_text; # Color for test of lines which were not - # covered (count == 0) - my $col_hi_back; # Color for background of highlighted lines - my $col_hi_text; # Color for text of highlighted lines - my $line; # Current line during iteration - my $row = 0; # Current row number during iteration - my $column; # Current column number during iteration - my $color_text; # Current text color during iteration - my $color_back; # Current background color during iteration - my $last_count; # Count of last processed line - my $count; # Count of current line - my $source; # Source code of current line - my $replacement; # Replacement string for tabulator chars - local *PNG_HANDLE; # Handle for output PNG file - - # Create image - $overview = new GD::Image($overview_width, $height) - or die("ERROR: cannot allocate overview image!\n"); - - # Define colors - $col_plain_back = $overview->colorAllocate(0xff, 0xff, 0xff); - $col_plain_text = $overview->colorAllocate(0xaa, 0xaa, 0xaa); - $col_cov_back = $overview->colorAllocate(0xaa, 0xa7, 0xef); - $col_cov_text = $overview->colorAllocate(0x5d, 0x5d, 0xea); - $col_nocov_back = $overview->colorAllocate(0xff, 0x00, 0x00); - $col_nocov_text = $overview->colorAllocate(0xaa, 0x00, 0x00); - $col_hi_back = $overview->colorAllocate(0x00, 0xff, 0x00); - $col_hi_text = $overview->colorAllocate(0x00, 0xaa, 0x00); - - # Visualize each line - foreach $line (@source) - { - # Replace tabs with spaces to keep consistent with source - # code view - while ($line =~ /^([^\t]*)(\t)/) - { - $replacement = " "x($tab_size - ((length($1) - 1) % - $tab_size)); - $line =~ s/^([^\t]*)(\t)/$1$replacement/; - } - - # Skip lines which do not follow the <count>:<line> - # specification, otherwise $1 = count, $2 = source code - if (!($line =~ /(\*?)(\d*):(.*)$/)) { next; } - $count = $2; - $source = $3; - - # Decide which color pair to use - - # If this line was not instrumented but the one before was, - # take the color of that line to widen color areas in - # resulting image - if (($count eq "") && defined($last_count) && - ($last_count ne "")) - { - $count = $last_count; - } - - if ($count eq "") - { - # Line was not instrumented - $color_text = $col_plain_text; - $color_back = $col_plain_back; - } - elsif ($count == 0) - { - # Line was instrumented but not executed - $color_text = $col_nocov_text; - $color_back = $col_nocov_back; - } - elsif ($1 eq "*") - { - # Line was highlighted - $color_text = $col_hi_text; - $color_back = $col_hi_back; - } - else - { - # Line was instrumented and executed - $color_text = $col_cov_text; - $color_back = $col_cov_back; - } - - # Write one pixel for each source character - $column = 0; - foreach (split("", $source)) - { - # Check for width - if ($column >= $overview_width) { last; } - - if ($_ eq " ") - { - # Space - $overview->setPixel($column++, $row, - $color_back); - } - else - { - # Text - $overview->setPixel($column++, $row, - $color_text); - } - } - - # Fill rest of line - while ($column < $overview_width) - { - $overview->setPixel($column++, $row, $color_back); - } - - $last_count = $2; - - $row++; - } - - # Write PNG file - open (PNG_HANDLE, ">$filename") - or die("ERROR: cannot write png file $filename!\n"); - binmode(*PNG_HANDLE); - print(PNG_HANDLE $overview->png()); - close(PNG_HANDLE); -} - -sub warn_handler($) -{ - my ($msg) = @_; - - warn("$tool_name: $msg"); -} - -sub die_handler($) -{ - my ($msg) = @_; - - die("$tool_name: $msg"); -} diff --git a/3rdParty/LCov/lcov b/3rdParty/LCov/lcov deleted file mode 100755 index 6304d75..0000000 --- a/3rdParty/LCov/lcov +++ /dev/null @@ -1,2699 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (c) International Business Machines Corp., 2002,2007 -# -# 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 -# -# -# lcov -# -# This is a wrapper script which provides a single interface for accessing -# LCOV coverage data. -# -# -# History: -# 2002-08-29 created by Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> -# IBM Lab Boeblingen -# 2002-09-05 / Peter Oberparleiter: implemented --kernel-directory + -# multiple directories -# 2002-10-16 / Peter Oberparleiter: implemented --add-tracefile option -# 2002-10-17 / Peter Oberparleiter: implemented --extract option -# 2002-11-04 / Peter Oberparleiter: implemented --list option -# 2003-03-07 / Paul Larson: Changed to make it work with the latest gcov -# kernel patch. This will break it with older gcov-kernel -# patches unless you change the value of $gcovmod in this script -# 2003-04-07 / Peter Oberparleiter: fixed bug which resulted in an error -# when trying to combine .info files containing data without -# a test name -# 2003-04-10 / Peter Oberparleiter: extended Paul's change so that LCOV -# works both with the new and the old gcov-kernel patch -# 2003-04-10 / Peter Oberparleiter: added $gcov_dir constant in anticipation -# of a possible move of the gcov kernel directory to another -# file system in a future version of the gcov-kernel patch -# 2003-04-15 / Paul Larson: make info write to STDERR, not STDOUT -# 2003-04-15 / Paul Larson: added --remove option -# 2003-04-30 / Peter Oberparleiter: renamed --reset to --zerocounters -# to remove naming ambiguity with --remove -# 2003-04-30 / Peter Oberparleiter: adjusted help text to include --remove -# 2003-06-27 / Peter Oberparleiter: implemented --diff -# 2003-07-03 / Peter Oberparleiter: added line checksum support, added -# --no-checksum -# 2003-12-11 / Laurent Deniel: added --follow option -# 2004-03-29 / Peter Oberparleiter: modified --diff option to better cope with -# ambiguous patch file entries, modified --capture option to use -# modprobe before insmod (needed for 2.6) -# 2004-03-30 / Peter Oberparleiter: added --path option -# 2004-08-09 / Peter Oberparleiter: added configuration file support -# 2008-08-13 / Peter Oberparleiter: added function coverage support -# - -use strict; -use File::Basename; -use Getopt::Long; - - -# Global constants -our $lcov_version = "LCOV version 1.7"; -our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; -our $tool_name = basename($0); - -# Names of the GCOV kernel module -our @gcovmod = ("gcov-prof", "gcov-proc"); - -# Directory containing gcov kernel files -our $gcov_dir = "/proc/gcov"; - -# The location of the insmod tool -our $insmod_tool = "/sbin/insmod"; - -# The location of the modprobe tool -our $modprobe_tool = "/sbin/modprobe"; - -# The location of the rmmod tool -our $rmmod_tool = "/sbin/rmmod"; - -# Where to create temporary directories -our $tmp_dir = "/tmp"; - -# How to prefix a temporary directory name -our $tmp_prefix = "tmpdir"; - - -# Prototypes -sub print_usage(*); -sub check_options(); -sub userspace_reset(); -sub userspace_capture(); -sub kernel_reset(); -sub kernel_capture(); -sub add_traces(); -sub read_info_file($); -sub get_info_entry($); -sub set_info_entry($$$$$$$;$$$$); -sub add_counts($$); -sub merge_checksums($$$); -sub combine_info_entries($$$); -sub combine_info_files($$); -sub write_info_file(*$); -sub extract(); -sub remove(); -sub list(); -sub get_common_filename($$); -sub read_diff($); -sub diff(); -sub system_no_output($@); -sub read_config($); -sub apply_config($); -sub info(@); -sub unload_module($); -sub check_and_load_kernel_module(); -sub create_temp_dir(); -sub transform_pattern($); -sub warn_handler($); -sub die_handler($); - - -# Global variables & initialization -our @directory; # Specifies where to get coverage data from -our @kernel_directory; # If set, captures only from specified kernel subdirs -our @add_tracefile; # If set, reads in and combines all files in list -our $list; # If set, list contents of tracefile -our $extract; # If set, extracts parts of tracefile -our $remove; # If set, removes parts of tracefile -our $diff; # If set, modifies tracefile according to diff -our $reset; # If set, reset all coverage data to zero -our $capture; # If set, capture data -our $output_filename; # Name for file to write coverage data to -our $test_name = ""; # Test case name -our $quiet = ""; # If set, suppress information messages -our $help; # Help option flag -our $version; # Version option flag -our $convert_filenames; # If set, convert filenames when applying diff -our $strip; # If set, strip leading directories when applying diff -our $need_unload; # If set, unload gcov kernel module -our $temp_dir_name; # Name of temporary directory -our $cwd = `pwd`; # Current working directory -our $to_file; # If set, indicates that output is written to a file -our $follow; # If set, indicates that find shall follow links -our $diff_path = ""; # Path removed from tracefile when applying diff -our $base_directory; # Base directory (cwd of gcc during compilation) -our $checksum; # If set, calculate a checksum for each line -our $no_checksum; # If set, don't calculate a checksum for each line -our $compat_libtool; # If set, indicates that libtool mode is to be enabled -our $no_compat_libtool; # If set, indicates that libtool mode is to be disabled -our $gcov_tool; -our $ignore_errors; -our $initial; -our $no_recursion = 0; -our $maxdepth; -our $config; # Configuration file contents -chomp($cwd); -our $tool_dir = dirname($0); # Directory where genhtml tool is installed - - -# -# Code entry point -# - -$SIG{__WARN__} = \&warn_handler; -$SIG{__DIE__} = \&die_handler; - -# Add current working directory if $tool_dir is not already an absolute path -if (! ($tool_dir =~ /^\/(.*)$/)) -{ - $tool_dir = "$cwd/$tool_dir"; -} - -# Read configuration file if available -if (-r $ENV{"HOME"}."/.lcovrc") -{ - $config = read_config($ENV{"HOME"}."/.lcovrc"); -} -elsif (-r "/etc/lcovrc") -{ - $config = read_config("/etc/lcovrc"); -} - -if ($config) -{ - # Copy configuration file values to variables - apply_config({ - "lcov_gcov_dir" => \$gcov_dir, - "lcov_insmod_tool" => \$insmod_tool, - "lcov_modprobe_tool" => \$modprobe_tool, - "lcov_rmmod_tool" => \$rmmod_tool, - "lcov_tmp_dir" => \$tmp_dir}); -} - -# Parse command line options -if (!GetOptions("directory|d|di=s" => \@directory, - "add-tracefile=s" => \@add_tracefile, - "list=s" => \$list, - "kernel-directory=s" => \@kernel_directory, - "extract=s" => \$extract, - "remove=s" => \$remove, - "diff=s" => \$diff, - "convert-filenames" => \$convert_filenames, - "strip=i" => \$strip, - "capture|c" => \$capture, - "output-file=s" => \$output_filename, - "test-name=s" => \$test_name, - "zerocounters" => \$reset, - "quiet" => \$quiet, - "help|?" => \$help, - "version" => \$version, - "follow" => \$follow, - "path=s" => \$diff_path, - "base-directory=s" => \$base_directory, - "checksum" => \$checksum, - "no-checksum" => \$no_checksum, - "compat-libtool" => \$compat_libtool, - "no-compat-libtool" => \$no_compat_libtool, - "gcov-tool=s" => \$gcov_tool, - "ignore-errors=s" => \$ignore_errors, - "initial|i" => \$initial, - "no-recursion" => \$no_recursion - )) -{ - print(STDERR "Use $tool_name --help to get usage information\n"); - exit(1); -} -else -{ - # Merge options - if (defined($no_checksum)) - { - $checksum = ($no_checksum ? 0 : 1); - $no_checksum = undef; - } - - if (defined($no_compat_libtool)) - { - $compat_libtool = ($no_compat_libtool ? 0 : 1); - $no_compat_libtool = undef; - } -} - -# Check for help option -if ($help) -{ - print_usage(*STDOUT); - exit(0); -} - -# Check for version option -if ($version) -{ - print("$tool_name: $lcov_version\n"); - exit(0); -} - -# Normalize --path text -$diff_path =~ s/\/$//; - -if ($follow) -{ - $follow = "-follow"; -} -else -{ - $follow = ""; -} - -if ($no_recursion) -{ - $maxdepth = "-maxdepth 1"; -} -else -{ - $maxdepth = ""; -} - -# Check for valid options -check_options(); - -# Only --extract, --remove and --diff allow unnamed parameters -if (@ARGV && !($extract || $remove || $diff)) -{ - die("Extra parameter found\n". - "Use $tool_name --help to get usage information\n"); -} - -# Check for output filename -$to_file = ($output_filename && ($output_filename ne "-")); - -if ($capture) -{ - if (!$to_file) - { - # Option that tells geninfo to write to stdout - $output_filename = "-"; - } -} -else -{ - if ($initial) - { - die("Option --initial is only valid when capturing data (-c)\n". - "Use $tool_name --help to get usage information\n"); - } -} - -# Check for requested functionality -if ($reset) -{ - # Differentiate between user space and kernel reset - if (@directory) - { - userspace_reset(); - } - else - { - kernel_reset(); - } -} -elsif ($capture) -{ - # Differentiate between user space and kernel - if (@directory) - { - userspace_capture(); - } - else - { - kernel_capture(); - } -} -elsif (@add_tracefile) -{ - add_traces(); -} -elsif ($remove) -{ - remove(); -} -elsif ($extract) -{ - extract(); -} -elsif ($list) -{ - list(); -} -elsif ($diff) -{ - if (scalar(@ARGV) != 1) - { - die("ERROR: option --diff requires one additional argument!\n". - "Use $tool_name --help to get usage information\n"); - } - diff(); -} - -info("Done.\n"); -exit(0); - -# -# print_usage(handle) -# -# Print usage information. -# - -sub print_usage(*) -{ - local *HANDLE = $_[0]; - - print(HANDLE <<END_OF_USAGE); -Usage: $tool_name [OPTIONS] - -Use lcov to collect coverage data from either the currently running Linux -kernel or from a user space application. Specify the --directory option to -get coverage data for a user space program. - -Misc: - -h, --help Print this help, then exit - -v, --version Print version number, then exit - -q, --quiet Do not print progress messages - -Operation: - -z, --zerocounters Reset all execution counts to zero - -c, --capture Capture coverage data - -a, --add-tracefile FILE Add contents of tracefiles - -e, --extract FILE PATTERN Extract files matching PATTERN from FILE - -r, --remove FILE PATTERN Remove files matching PATTERN from FILE - -l, --list FILE List contents of tracefile FILE - --diff FILE DIFF Transform tracefile FILE according to DIFF - -Options: - -i, --initial Capture initial zero coverage data - -t, --test-name NAME Specify test name to be stored with data - -o, --output-file FILENAME Write data to FILENAME instead of stdout - -d, --directory DIR Use .da files in DIR instead of kernel - -f, --follow Follow links when searching .da files - -k, --kernel-directory KDIR Capture kernel coverage data only from KDIR - -b, --base-directory DIR Use DIR as base directory for relative paths - --convert-filenames Convert filenames when applying diff - --strip DEPTH Strip initial DEPTH directory levels in diff - --path PATH Strip PATH from tracefile when applying diff - --(no-)checksum Enable (disable) line checksumming - --(no-)compat-libtool Enable (disable) libtool compatibility mode - --gcov-tool TOOL Specify gcov tool location - --ignore-errors ERRORS Continue after ERRORS (gcov, source) - --no-recursion Exlude subdirectories from processing - -For more information see: $lcov_url -END_OF_USAGE - ; -} - - -# -# check_options() -# -# Check for valid combination of command line options. Die on error. -# - -sub check_options() -{ - my $i = 0; - - # Count occurrence of mutually exclusive options - $reset && $i++; - $capture && $i++; - @add_tracefile && $i++; - $extract && $i++; - $remove && $i++; - $list && $i++; - $diff && $i++; - - if ($i == 0) - { - die("Need one of the options -z, -c, -a, -e, -r, -l or ". - "--diff\n". - "Use $tool_name --help to get usage information\n"); - } - elsif ($i > 1) - { - die("ERROR: only one of -z, -c, -a, -e, -r, -l or ". - "--diff allowed!\n". - "Use $tool_name --help to get usage information\n"); - } -} - - -# -# userspace_reset() -# -# Reset coverage data found in DIRECTORY by deleting all contained .da files. -# -# Die on error. -# - -sub userspace_reset() -{ - my $current_dir; - my @file_list; - - foreach $current_dir (@directory) - { - info("Deleting all .da files in $current_dir". - ($no_recursion?"\n":" and subdirectories\n")); - @file_list = `find "$current_dir" $maxdepth $follow -name \\*\\.da -o -name \\*\\.gcda -type f 2>/dev/null`; - chomp(@file_list); - foreach (@file_list) - { - unlink($_) or die("ERROR: cannot remove file $_!\n"); - } - } -} - - -# -# userspace_capture() -# -# Capture coverage data found in DIRECTORY and write it to OUTPUT_FILENAME -# if specified, otherwise to STDOUT. -# -# Die on error. -# - -sub userspace_capture() -{ - my @param; - my $file_list = join(" ", @directory); - - info("Capturing coverage data from $file_list\n"); - @param = ("$tool_dir/geninfo", @directory); - if ($output_filename) - { - @param = (@param, "--output-filename", $output_filename); - } - if ($test_name) - { - @param = (@param, "--test-name", $test_name); - } - if ($follow) - { - @param = (@param, "--follow"); - } - if ($quiet) - { - @param = (@param, "--quiet"); - } - if (defined($checksum)) - { - if ($checksum) - { - @param = (@param, "--checksum"); - } - else - { - @param = (@param, "--no-checksum"); - } - } - if ($base_directory) - { - @param = (@param, "--base-directory", $base_directory); - } - if ($no_compat_libtool) - { - @param = (@param, "--no-compat-libtool"); - } - elsif ($compat_libtool) - { - @param = (@param, "--compat-libtool"); - } - if ($gcov_tool) - { - @param = (@param, "--gcov-tool", $gcov_tool); - } - if ($ignore_errors) - { - @param = (@param, "--ignore-errors", $ignore_errors); - } - if ($initial) - { - @param = (@param, "--initial"); - } - if ($no_recursion) - { - @param = (@param, "--no-recursion"); - } - - system(@param); - exit($? >> 8); -} - - -# -# kernel_reset() -# -# Reset kernel coverage. -# -# Die on error. -# - -sub kernel_reset() -{ - local *HANDLE; - check_and_load_kernel_module(); - - info("Resetting kernel execution counters\n"); - open(HANDLE, ">$gcov_dir/vmlinux") or - die("ERROR: cannot write to $gcov_dir/vmlinux!\n"); - print(HANDLE "0"); - close(HANDLE); - - # Unload module if we loaded it in the first place - if ($need_unload) - { - unload_module($need_unload); - } -} - - -# -# kernel_capture() -# -# Capture kernel coverage data and write it to OUTPUT_FILENAME if specified, -# otherwise stdout. -# - -sub kernel_capture() -{ - my @param; - - check_and_load_kernel_module(); - - # Make sure the temporary directory is removed upon script termination - END - { - if ($temp_dir_name) - { - stat($temp_dir_name); - if (-r _) - { - info("Removing temporary directory ". - "$temp_dir_name\n"); - - # Remove temporary directory - system("rm", "-rf", $temp_dir_name) - and warn("WARNING: cannot remove ". - "temporary directory ". - "$temp_dir_name!\n"); - } - } - } - - # Get temporary directory - $temp_dir_name = create_temp_dir(); - - info("Copying kernel data to temporary directory $temp_dir_name\n"); - - if (!@kernel_directory) - { - # Copy files from gcov kernel directory - system("cp", "-dr", $gcov_dir, $temp_dir_name) - and die("ERROR: cannot copy files from $gcov_dir!\n"); - } - else - { - # Prefix list of kernel sub-directories with the gcov kernel - # directory - @kernel_directory = map("$gcov_dir/$_", @kernel_directory); - - # Copy files from gcov kernel directory - system("cp", "-dr", @kernel_directory, $temp_dir_name) - and die("ERROR: cannot copy files from ". - join(" ", @kernel_directory)."!\n"); - } - - # Make directories writable - system("find", $temp_dir_name, "-type", "d", "-exec", "chmod", "u+w", - "{}", ";") - and die("ERROR: cannot modify access rights for ". - "$temp_dir_name!\n"); - - # Make files writable - system("find", $temp_dir_name, "-type", "f", "-exec", "chmod", "u+w", - "{}", ";") - and die("ERROR: cannot modify access rights for ". - "$temp_dir_name!\n"); - - # Capture data - info("Capturing coverage data from $temp_dir_name\n"); - @param = ("$tool_dir/geninfo", $temp_dir_name); - if ($output_filename) - { - @param = (@param, "--output-filename", $output_filename); - } - if ($test_name) - { - @param = (@param, "--test-name", $test_name); - } - if ($follow) - { - @param = (@param, "--follow"); - } - if ($quiet) - { - @param = (@param, "--quiet"); - } - if (defined($checksum)) - { - if ($checksum) - { - @param = (@param, "--checksum"); - } - else - { - @param = (@param, "--no-checksum"); - } - } - if ($base_directory) - { - @param = (@param, "--base-directory", $base_directory); - } - if ($no_compat_libtool) - { - @param = (@param, "--no-compat-libtool"); - } - elsif ($compat_libtool) - { - @param = (@param, "--compat-libtool"); - } - if ($gcov_tool) - { - @param = (@param, "--gcov-tool", $gcov_tool); - } - if ($ignore_errors) - { - @param = (@param, "--ignore-errors", $ignore_errors); - } - if ($initial) - { - @param = (@param, "--initial"); - } - system(@param) and exit($? >> 8); - - - # Unload module if we loaded it in the first place - if ($need_unload) - { - unload_module($need_unload); - } -} - - -# -# info(printf_parameter) -# -# Use printf to write PRINTF_PARAMETER to stdout only when the $quiet flag -# is not set. -# - -sub info(@) -{ - if (!$quiet) - { - # Print info string - if ($to_file) - { - print(@_) - } - else - { - # Don't interfer with the .info output to STDOUT - printf(STDERR @_); - } - } -} - - -# -# Check if the gcov kernel module is loaded. If it is, exit, if not, try -# to load it. -# -# Die on error. -# - -sub check_and_load_kernel_module() -{ - my $module_name; - - # Is it loaded already? - stat("$gcov_dir"); - if (-r _) { return(); } - - info("Loading required gcov kernel module.\n"); - - # Do we have access to the insmod tool? - stat($insmod_tool); - if (!-x _) - { - die("ERROR: need insmod tool ($insmod_tool) to access kernel ". - "coverage data!\n"); - } - # Do we have access to the modprobe tool? - stat($modprobe_tool); - if (!-x _) - { - die("ERROR: need modprobe tool ($modprobe_tool) to access ". - "kernel coverage data!\n"); - } - - # Try some possibilities of where the gcov kernel module may be found - foreach $module_name (@gcovmod) - { - # Try to load module from system wide module directory - # /lib/modules - if (system_no_output(3, $modprobe_tool, $module_name) == 0) - { - # Succeeded - $need_unload = $module_name; - return(); - } - - # Try to load linux 2.5/2.6 module from tool directory - if (system_no_output(3, $insmod_tool, - "$tool_dir/$module_name.ko") == 0) - { - # Succeeded - $need_unload = $module_name; - return(); - } - - # Try to load linux 2.4 module from tool directory - if (system_no_output(3, $insmod_tool, - "$tool_dir/$module_name.o") == 0) - { - # Succeeded - $need_unload = $module_name; - return(); - } - } - - # Hm, loading failed - maybe we aren't root? - if ($> != 0) - { - die("ERROR: need root access to load kernel module!\n"); - } - - die("ERROR: cannot load required gcov kernel module!\n"); -} - - -# -# unload_module() -# -# Unload the gcov kernel module. -# - -sub unload_module($) -{ - my $module = $_[0]; - - info("Unloading kernel module $module\n"); - - # Do we have access to the rmmod tool? - stat($rmmod_tool); - if (!-x _) - { - warn("WARNING: cannot execute rmmod tool at $rmmod_tool - ". - "gcov module still loaded!\n"); - } - - # Unload gcov kernel module - system_no_output(1, $rmmod_tool, $module) - and warn("WARNING: cannot unload gcov kernel module ". - "$module!\n"); -} - - -# -# create_temp_dir() -# -# Create a temporary directory and return its path. -# -# Die on error. -# - -sub create_temp_dir() -{ - my $dirname; - my $number = sprintf("%d", rand(1000)); - - # Endless loops are evil - while ($number++ < 1000) - { - $dirname = "$tmp_dir/$tmp_prefix$number"; - stat($dirname); - if (-e _) { next; } - - mkdir($dirname) - or die("ERROR: cannot create temporary directory ". - "$dirname!\n"); - - return($dirname); - } - - die("ERROR: cannot create temporary directory in $tmp_dir!\n"); -} - - -# -# read_info_file(info_filename) -# -# Read in the contents of the .info file specified by INFO_FILENAME. Data will -# be returned as a reference to a hash containing the following mappings: -# -# %result: for each filename found in file -> \%data -# -# %data: "test" -> \%testdata -# "sum" -> \%sumcount -# "func" -> \%funcdata -# "found" -> $lines_found (number of instrumented lines found in file) -# "hit" -> $lines_hit (number of executed lines in file) -# "check" -> \%checkdata -# "testfnc" -> \%testfncdata -# "sumfnc" -> \%sumfnccount -# -# %testdata : name of test affecting this file -> \%testcount -# %testfncdata: name of test affecting this file -> \%testfnccount -# -# %testcount : line number -> execution count for a single test -# %testfnccount: function name -> execution count for a single test -# %sumcount : line number -> execution count for all tests -# %sumfnccount : function name -> execution count for all tests -# %funcdata : function name -> line number -# %checkdata : line number -> checksum of source code line -# -# Note that .info file sections referring to the same file and test name -# will automatically be combined by adding all execution counts. -# -# Note that if INFO_FILENAME ends with ".gz", it is assumed that the file -# is compressed using GZIP. If available, GUNZIP will be used to decompress -# this file. -# -# Die on error. -# - -sub read_info_file($) -{ - my $tracefile = $_[0]; # Name of tracefile - my %result; # Resulting hash: file -> data - my $data; # Data handle for current entry - my $testdata; # " " - my $testcount; # " " - my $sumcount; # " " - my $funcdata; # " " - my $checkdata; # " " - my $testfncdata; - my $testfnccount; - my $sumfnccount; - my $line; # Current line read from .info file - my $testname; # Current test name - my $filename; # Current filename - my $hitcount; # Count for lines hit - my $count; # Execution count of current line - my $negative; # If set, warn about negative counts - my $changed_testname; # If set, warn about changed testname - my $line_checksum; # Checksum of current line - local *INFO_HANDLE; # Filehandle for .info file - - info("Reading tracefile $tracefile\n"); - - # Check if file exists and is readable - stat($_[0]); - if (!(-r _)) - { - die("ERROR: cannot read file $_[0]!\n"); - } - - # Check if this is really a plain file - if (!(-f _)) - { - die("ERROR: not a plain file: $_[0]!\n"); - } - - # Check for .gz extension - if ($_[0] =~ /\.gz$/) - { - # Check for availability of GZIP tool - system_no_output(1, "gunzip" ,"-h") - and die("ERROR: gunzip command not available!\n"); - - # Check integrity of compressed file - system_no_output(1, "gunzip", "-t", $_[0]) - and die("ERROR: integrity check failed for ". - "compressed file $_[0]!\n"); - - # Open compressed file - open(INFO_HANDLE, "gunzip -c $_[0]|") - or die("ERROR: cannot start gunzip to decompress ". - "file $_[0]!\n"); - } - else - { - # Open decompressed file - open(INFO_HANDLE, $_[0]) - or die("ERROR: cannot read file $_[0]!\n"); - } - - $testname = ""; - while (<INFO_HANDLE>) - { - chomp($_); - $line = $_; - - # Switch statement - foreach ($line) - { - /^TN:([^,]*)/ && do - { - # Test name information found - $testname = defined($1) ? $1 : ""; - if ($testname =~ s/\W/_/g) - { - $changed_testname = 1; - } - last; - }; - - /^[SK]F:(.*)/ && do - { - # Filename information found - # Retrieve data for new entry - $filename = $1; - - $data = $result{$filename}; - ($testdata, $sumcount, $funcdata, $checkdata, - $testfncdata, $sumfnccount) = - get_info_entry($data); - - if (defined($testname)) - { - $testcount = $testdata->{$testname}; - $testfnccount = $testfncdata->{$testname}; - } - else - { - $testcount = {}; - $testfnccount = {}; - } - last; - }; - - /^DA:(\d+),(-?\d+)(,[^,\s]+)?/ && do - { - # Fix negative counts - $count = $2 < 0 ? 0 : $2; - if ($2 < 0) - { - $negative = 1; - } - # Execution count found, add to structure - # Add summary counts - $sumcount->{$1} += $count; - - # Add test-specific counts - if (defined($testname)) - { - $testcount->{$1} += $count; - } - - # Store line checksum if available - if (defined($3)) - { - $line_checksum = substr($3, 1); - - # Does it match a previous definition - if (defined($checkdata->{$1}) && - ($checkdata->{$1} ne - $line_checksum)) - { - die("ERROR: checksum mismatch ". - "at $filename:$1\n"); - } - - $checkdata->{$1} = $line_checksum; - } - last; - }; - - /^FN:(\d+),([^,]+)/ && do - { - # Function data found, add to structure - $funcdata->{$2} = $1; - - # Also initialize function call data - if (!defined($sumfnccount->{$2})) { - $sumfnccount->{$2} = 0; - } - if (defined($testname)) - { - if (!defined($testfnccount->{$2})) { - $testfnccount->{$2} = 0; - } - } - last; - }; - - /^FNDA:(\d+),([^,]+)/ && do - { - # Function call count found, add to structure - # Add summary counts - $sumfnccount->{$2} += $1; - - # Add test-specific counts - if (defined($testname)) - { - $testfnccount->{$2} += $1; - } - last; - }; - /^end_of_record/ && do - { - # Found end of section marker - if ($filename) - { - # Store current section data - if (defined($testname)) - { - $testdata->{$testname} = - $testcount; - $testfncdata->{$testname} = - $testfnccount; - } - - set_info_entry($data, $testdata, - $sumcount, $funcdata, - $checkdata, $testfncdata, - $sumfnccount); - $result{$filename} = $data; - last; - } - }; - - # default - last; - } - } - close(INFO_HANDLE); - - # Calculate hit and found values for lines and functions of each file - foreach $filename (keys(%result)) - { - $data = $result{$filename}; - - ($testdata, $sumcount, undef, undef, $testfncdata, - $sumfnccount) = get_info_entry($data); - - # Filter out empty files - if (scalar(keys(%{$sumcount})) == 0) - { - delete($result{$filename}); - next; - } - # Filter out empty test cases - foreach $testname (keys(%{$testdata})) - { - if (!defined($testdata->{$testname}) || - scalar(keys(%{$testdata->{$testname}})) == 0) - { - delete($testdata->{$testname}); - delete($testfncdata->{$testname}); - } - } - - $data->{"found"} = scalar(keys(%{$sumcount})); - $hitcount = 0; - - foreach (keys(%{$sumcount})) - { - if ($sumcount->{$_} > 0) { $hitcount++; } - } - - $data->{"hit"} = $hitcount; - - # Get found/hit values for function call data - $data->{"f_found"} = scalar(keys(%{$sumfnccount})); - $hitcount = 0; - - foreach (keys(%{$sumfnccount})) { - if ($sumfnccount->{$_} > 0) { - $hitcount++; - } - } - $data->{"f_hit"} = $hitcount; - } - - if (scalar(keys(%result)) == 0) - { - die("ERROR: no valid records found in tracefile $tracefile\n"); - } - if ($negative) - { - warn("WARNING: negative counts found in tracefile ". - "$tracefile\n"); - } - if ($changed_testname) - { - warn("WARNING: invalid characters removed from testname in ". - "tracefile $tracefile\n"); - } - - return(\%result); -} - - -# -# get_info_entry(hash_ref) -# -# Retrieve data from an entry of the structure generated by read_info_file(). -# Return a list of references to hashes: -# (test data hash ref, sum count hash ref, funcdata hash ref, checkdata hash -# ref, testfncdata hash ref, sumfnccount hash ref, lines found, lines hit, -# functions found, functions hit) -# - -sub get_info_entry($) -{ - my $testdata_ref = $_[0]->{"test"}; - my $sumcount_ref = $_[0]->{"sum"}; - my $funcdata_ref = $_[0]->{"func"}; - my $checkdata_ref = $_[0]->{"check"}; - my $testfncdata = $_[0]->{"testfnc"}; - my $sumfnccount = $_[0]->{"sumfnc"}; - my $lines_found = $_[0]->{"found"}; - my $lines_hit = $_[0]->{"hit"}; - my $f_found = $_[0]->{"f_found"}; - my $f_hit = $_[0]->{"f_hit"}; - - return ($testdata_ref, $sumcount_ref, $funcdata_ref, $checkdata_ref, - $testfncdata, $sumfnccount, $lines_found, $lines_hit, - $f_found, $f_hit); -} - - -# -# set_info_entry(hash_ref, testdata_ref, sumcount_ref, funcdata_ref, -# checkdata_ref, testfncdata_ref, sumfcncount_ref[,lines_found, -# lines_hit, f_found, f_hit]) -# -# Update the hash referenced by HASH_REF with the provided data references. -# - -sub set_info_entry($$$$$$$;$$$$) -{ - my $data_ref = $_[0]; - - $data_ref->{"test"} = $_[1]; - $data_ref->{"sum"} = $_[2]; - $data_ref->{"func"} = $_[3]; - $data_ref->{"check"} = $_[4]; - $data_ref->{"testfnc"} = $_[5]; - $data_ref->{"sumfnc"} = $_[6]; - - if (defined($_[7])) { $data_ref->{"found"} = $_[7]; } - if (defined($_[8])) { $data_ref->{"hit"} = $_[8]; } - if (defined($_[9])) { $data_ref->{"f_found"} = $_[9]; } - if (defined($_[10])) { $data_ref->{"f_hit"} = $_[10]; } -} - - -# -# add_counts(data1_ref, data2_ref) -# -# DATA1_REF and DATA2_REF are references to hashes containing a mapping -# -# line number -> execution count -# -# Return a list (RESULT_REF, LINES_FOUND, LINES_HIT) where RESULT_REF -# is a reference to a hash containing the combined mapping in which -# execution counts are added. -# - -sub add_counts($$) -{ - my %data1 = %{$_[0]}; # Hash 1 - my %data2 = %{$_[1]}; # Hash 2 - my %result; # Resulting hash - my $line; # Current line iteration scalar - my $data1_count; # Count of line in hash1 - my $data2_count; # Count of line in hash2 - my $found = 0; # Total number of lines found - my $hit = 0; # Number of lines with a count > 0 - - foreach $line (keys(%data1)) - { - $data1_count = $data1{$line}; - $data2_count = $data2{$line}; - - # Add counts if present in both hashes - if (defined($data2_count)) { $data1_count += $data2_count; } - - # Store sum in %result - $result{$line} = $data1_count; - - $found++; - if ($data1_count > 0) { $hit++; } - } - - # Add lines unique to data2 - foreach $line (keys(%data2)) - { - # Skip lines already in data1 - if (defined($data1{$line})) { next; } - - # Copy count from data2 - $result{$line} = $data2{$line}; - - $found++; - if ($result{$line} > 0) { $hit++; } - } - - return (\%result, $found, $hit); -} - - -# -# merge_checksums(ref1, ref2, filename) -# -# REF1 and REF2 are references to hashes containing a mapping -# -# line number -> checksum -# -# Merge checksum lists defined in REF1 and REF2 and return reference to -# resulting hash. Die if a checksum for a line is defined in both hashes -# but does not match. -# - -sub merge_checksums($$$) -{ - my $ref1 = $_[0]; - my $ref2 = $_[1]; - my $filename = $_[2]; - my %result; - my $line; - - foreach $line (keys(%{$ref1})) - { - if (defined($ref2->{$line}) && - ($ref1->{$line} ne $ref2->{$line})) - { - die("ERROR: checksum mismatch at $filename:$line\n"); - } - $result{$line} = $ref1->{$line}; - } - - foreach $line (keys(%{$ref2})) - { - $result{$line} = $ref2->{$line}; - } - - return \%result; -} - - -# -# merge_func_data(funcdata1, funcdata2, filename) -# - -sub merge_func_data($$$) -{ - my ($funcdata1, $funcdata2, $filename) = @_; - my %result; - my $func; - - %result = %{$funcdata1}; - - foreach $func (keys(%{$funcdata2})) { - my $line1 = $result{$func}; - my $line2 = $funcdata2->{$func}; - - if (defined($line1) && ($line1 != $line2)) { - warn("WARNING: function data mismatch at ". - "$filename:$line2\n"); - next; - } - $result{$func} = $line2; - } - - return \%result; -} - - -# -# add_fnccount(fnccount1, fnccount2) -# -# Add function call count data. Return list (fnccount_added, f_found, f_hit) -# - -sub add_fnccount($$) -{ - my ($fnccount1, $fnccount2) = @_; - my %result; - my $f_found; - my $f_hit; - my $function; - - %result = %{$fnccount1}; - foreach $function (keys(%{$fnccount2})) { - $result{$function} += $fnccount2->{$function}; - } - $f_found = scalar(keys(%result)); - $f_hit = 0; - foreach $function (keys(%result)) { - if ($result{$function} > 0) { - $f_hit++; - } - } - - return (\%result, $f_found, $f_hit); -} - -# -# add_testfncdata(testfncdata1, testfncdata2) -# -# Add function call count data for several tests. Return reference to -# added_testfncdata. -# - -sub add_testfncdata($$) -{ - my ($testfncdata1, $testfncdata2) = @_; - my %result; - my $testname; - - foreach $testname (keys(%{$testfncdata1})) { - if (defined($testfncdata2->{$testname})) { - my $fnccount; - - # Function call count data for this testname exists - # in both data sets: merge - ($fnccount) = add_fnccount( - $testfncdata1->{$testname}, - $testfncdata2->{$testname}); - $result{$testname} = $fnccount; - next; - } - # Function call count data for this testname is unique to - # data set 1: copy - $result{$testname} = $testfncdata1->{$testname}; - } - - # Add count data for testnames unique to data set 2 - foreach $testname (keys(%{$testfncdata2})) { - if (!defined($result{$testname})) { - $result{$testname} = $testfncdata2->{$testname}; - } - } - return \%result; -} - -# -# combine_info_entries(entry_ref1, entry_ref2, filename) -# -# Combine .info data entry hashes referenced by ENTRY_REF1 and ENTRY_REF2. -# Return reference to resulting hash. -# - -sub combine_info_entries($$$) -{ - my $entry1 = $_[0]; # Reference to hash containing first entry - my $testdata1; - my $sumcount1; - my $funcdata1; - my $checkdata1; - my $testfncdata1; - my $sumfnccount1; - - my $entry2 = $_[1]; # Reference to hash containing second entry - my $testdata2; - my $sumcount2; - my $funcdata2; - my $checkdata2; - my $testfncdata2; - my $sumfnccount2; - - my %result; # Hash containing combined entry - my %result_testdata; - my $result_sumcount = {}; - my $result_funcdata; - my $result_testfncdata; - my $result_sumfnccount; - my $lines_found; - my $lines_hit; - my $f_found; - my $f_hit; - - my $testname; - my $filename = $_[2]; - - # Retrieve data - ($testdata1, $sumcount1, $funcdata1, $checkdata1, $testfncdata1, - $sumfnccount1) = get_info_entry($entry1); - ($testdata2, $sumcount2, $funcdata2, $checkdata2, $testfncdata2, - $sumfnccount2) = get_info_entry($entry2); - - # Merge checksums - $checkdata1 = merge_checksums($checkdata1, $checkdata2, $filename); - - # Combine funcdata - $result_funcdata = merge_func_data($funcdata1, $funcdata2, $filename); - - # Combine function call count data - $result_testfncdata = add_testfncdata($testfncdata1, $testfncdata2); - ($result_sumfnccount, $f_found, $f_hit) = - add_fnccount($sumfnccount1, $sumfnccount2); - - # Combine testdata - foreach $testname (keys(%{$testdata1})) - { - if (defined($testdata2->{$testname})) - { - # testname is present in both entries, requires - # combination - ($result_testdata{$testname}) = - add_counts($testdata1->{$testname}, - $testdata2->{$testname}); - } - else - { - # testname only present in entry1, add to result - $result_testdata{$testname} = $testdata1->{$testname}; - } - - # update sum count hash - ($result_sumcount, $lines_found, $lines_hit) = - add_counts($result_sumcount, - $result_testdata{$testname}); - } - - foreach $testname (keys(%{$testdata2})) - { - # Skip testnames already covered by previous iteration - if (defined($testdata1->{$testname})) { next; } - - # testname only present in entry2, add to result hash - $result_testdata{$testname} = $testdata2->{$testname}; - - # update sum count hash - ($result_sumcount, $lines_found, $lines_hit) = - add_counts($result_sumcount, - $result_testdata{$testname}); - } - - # Calculate resulting sumcount - - # Store result - set_info_entry(\%result, \%result_testdata, $result_sumcount, - $result_funcdata, $checkdata1, $result_testfncdata, - $result_sumfnccount, $lines_found, $lines_hit, - $f_found, $f_hit); - - return(\%result); -} - - -# -# combine_info_files(info_ref1, info_ref2) -# -# Combine .info data in hashes referenced by INFO_REF1 and INFO_REF2. Return -# reference to resulting hash. -# - -sub combine_info_files($$) -{ - my %hash1 = %{$_[0]}; - my %hash2 = %{$_[1]}; - my $filename; - - foreach $filename (keys(%hash2)) - { - if ($hash1{$filename}) - { - # Entry already exists in hash1, combine them - $hash1{$filename} = - combine_info_entries($hash1{$filename}, - $hash2{$filename}, - $filename); - } - else - { - # Entry is unique in both hashes, simply add to - # resulting hash - $hash1{$filename} = $hash2{$filename}; - } - } - - return(\%hash1); -} - - -# -# add_traces() -# - -sub add_traces() -{ - my $total_trace; - my $current_trace; - my $tracefile; - local *INFO_HANDLE; - - info("Combining tracefiles.\n"); - - foreach $tracefile (@add_tracefile) - { - $current_trace = read_info_file($tracefile); - if ($total_trace) - { - $total_trace = combine_info_files($total_trace, - $current_trace); - } - else - { - $total_trace = $current_trace; - } - } - - # Write combined data - if ($to_file) - { - info("Writing data to $output_filename\n"); - open(INFO_HANDLE, ">$output_filename") - or die("ERROR: cannot write to $output_filename!\n"); - write_info_file(*INFO_HANDLE, $total_trace); - close(*INFO_HANDLE); - } - else - { - write_info_file(*STDOUT, $total_trace); - } -} - - -# -# write_info_file(filehandle, data) -# - -sub write_info_file(*$) -{ - local *INFO_HANDLE = $_[0]; - my %data = %{$_[1]}; - my $source_file; - my $entry; - my $testdata; - my $sumcount; - my $funcdata; - my $checkdata; - my $testfncdata; - my $sumfnccount; - my $testname; - my $line; - my $func; - my $testcount; - my $testfnccount; - my $found; - my $hit; - my $f_found; - my $f_hit; - - foreach $source_file (keys(%data)) - { - $entry = $data{$source_file}; - ($testdata, $sumcount, $funcdata, $checkdata, $testfncdata, - $sumfnccount) = get_info_entry($entry); - foreach $testname (keys(%{$testdata})) - { - $testcount = $testdata->{$testname}; - $testfnccount = $testfncdata->{$testname}; - $found = 0; - $hit = 0; - - print(INFO_HANDLE "TN:$testname\n"); - print(INFO_HANDLE "SF:$source_file\n"); - - # Write function related data - foreach $func ( - sort({$funcdata->{$a} <=> $funcdata->{$b}} - keys(%{$funcdata}))) - { - print(INFO_HANDLE "FN:".$funcdata->{$func}. - ",$func\n"); - } - foreach $func (keys(%{$testfnccount})) { - print(INFO_HANDLE "FNDA:". - $testfnccount->{$func}. - ",$func\n"); - } - ($f_found, $f_hit) = - get_func_found_and_hit($testfnccount); - print(INFO_HANDLE "FNF:$f_found\n"); - print(INFO_HANDLE "FNH:$f_hit\n"); - - # Write line related data - foreach $line (sort({$a <=> $b} keys(%{$testcount}))) - { - print(INFO_HANDLE "DA:$line,". - $testcount->{$line}. - (defined($checkdata->{$line}) && - $checksum ? - ",".$checkdata->{$line} : "")."\n"); - $found++; - if ($testcount->{$line} > 0) - { - $hit++; - } - - } - print(INFO_HANDLE "LF:$found\n"); - print(INFO_HANDLE "LH:$hit\n"); - print(INFO_HANDLE "end_of_record\n"); - } - } -} - - -# -# transform_pattern(pattern) -# -# Transform shell wildcard expression to equivalent PERL regular expression. -# Return transformed pattern. -# - -sub transform_pattern($) -{ - my $pattern = $_[0]; - - # Escape special chars - - $pattern =~ s/\\/\\\\/g; - $pattern =~ s/\//\\\//g; - $pattern =~ s/\^/\\\^/g; - $pattern =~ s/\$/\\\$/g; - $pattern =~ s/\(/\\\(/g; - $pattern =~ s/\)/\\\)/g; - $pattern =~ s/\[/\\\[/g; - $pattern =~ s/\]/\\\]/g; - $pattern =~ s/\{/\\\{/g; - $pattern =~ s/\}/\\\}/g; - $pattern =~ s/\./\\\./g; - $pattern =~ s/\,/\\\,/g; - $pattern =~ s/\|/\\\|/g; - $pattern =~ s/\+/\\\+/g; - $pattern =~ s/\!/\\\!/g; - - # Transform ? => (.) and * => (.*) - - $pattern =~ s/\*/\(\.\*\)/g; - $pattern =~ s/\?/\(\.\)/g; - - return $pattern; -} - - -# -# extract() -# - -sub extract() -{ - my $data = read_info_file($extract); - my $filename; - my $keep; - my $pattern; - my @pattern_list; - my $extracted = 0; - local *INFO_HANDLE; - - # Need perlreg expressions instead of shell pattern - @pattern_list = map({ transform_pattern($_); } @ARGV); - - # Filter out files which do not match any pattern - foreach $filename (sort(keys(%{$data}))) - { - $keep = 0; - - foreach $pattern (@pattern_list) - { - $keep ||= ($filename =~ (/^$pattern$/)); - } - - - if (!$keep) - { - delete($data->{$filename}); - } - else - { - info("Extracting $filename\n"), - $extracted++; - } - } - - # Write extracted data - if ($to_file) - { - info("Extracted $extracted files\n"); - info("Writing data to $output_filename\n"); - open(INFO_HANDLE, ">$output_filename") - or die("ERROR: cannot write to $output_filename!\n"); - write_info_file(*INFO_HANDLE, $data); - close(*INFO_HANDLE); - } - else - { - write_info_file(*STDOUT, $data); - } -} - - -# -# remove() -# - -sub remove() -{ - my $data = read_info_file($remove); - my $filename; - my $match_found; - my $pattern; - my @pattern_list; - my $removed = 0; - local *INFO_HANDLE; - - # Need perlreg expressions instead of shell pattern - @pattern_list = map({ transform_pattern($_); } @ARGV); - - # Filter out files that match the pattern - foreach $filename (sort(keys(%{$data}))) - { - $match_found = 0; - - foreach $pattern (@pattern_list) - { - $match_found ||= ($filename =~ (/$pattern$/)); - } - - - if ($match_found) - { - delete($data->{$filename}); - info("Removing $filename\n"), - $removed++; - } - } - - # Write data - if ($to_file) - { - info("Deleted $removed files\n"); - info("Writing data to $output_filename\n"); - open(INFO_HANDLE, ">$output_filename") - or die("ERROR: cannot write to $output_filename!\n"); - write_info_file(*INFO_HANDLE, $data); - close(*INFO_HANDLE); - } - else - { - write_info_file(*STDOUT, $data); - } -} - - -# -# list() -# - -sub list() -{ - my $data = read_info_file($list); - my $filename; - my $found; - my $hit; - my $entry; - - info("Listing contents of $list:\n"); - - # List all files - foreach $filename (sort(keys(%{$data}))) - { - $entry = $data->{$filename}; - (undef, undef, undef, undef, undef, undef, $found, $hit) = - get_info_entry($entry); - printf("$filename: $hit of $found lines hit\n"); - } -} - - -# -# get_common_filename(filename1, filename2) -# -# Check for filename components which are common to FILENAME1 and FILENAME2. -# Upon success, return -# -# (common, path1, path2) -# -# or 'undef' in case there are no such parts. -# - -sub get_common_filename($$) -{ - my @list1 = split("/", $_[0]); - my @list2 = split("/", $_[1]); - my @result; - - # Work in reverse order, i.e. beginning with the filename itself - while (@list1 && @list2 && ($list1[$#list1] eq $list2[$#list2])) - { - unshift(@result, pop(@list1)); - pop(@list2); - } - - # Did we find any similarities? - if (scalar(@result) > 0) - { - return (join("/", @result), join("/", @list1), - join("/", @list2)); - } - else - { - return undef; - } -} - - -# -# strip_directories($path, $depth) -# -# Remove DEPTH leading directory levels from PATH. -# - -sub strip_directories($$) -{ - my $filename = $_[0]; - my $depth = $_[1]; - my $i; - - if (!defined($depth) || ($depth < 1)) - { - return $filename; - } - for ($i = 0; $i < $depth; $i++) - { - $filename =~ s/^[^\/]*\/+(.*)$/$1/; - } - return $filename; -} - - -# -# read_diff(filename) -# -# Read diff output from FILENAME to memory. The diff file has to follow the -# format generated by 'diff -u'. Returns a list of hash references: -# -# (mapping, path mapping) -# -# mapping: filename -> reference to line hash -# line hash: line number in new file -> corresponding line number in old file -# -# path mapping: filename -> old filename -# -# Die in case of error. -# - -sub read_diff($) -{ - my $diff_file = $_[0]; # Name of diff file - my %diff; # Resulting mapping filename -> line hash - my %paths; # Resulting mapping old path -> new path - my $mapping; # Reference to current line hash - my $line; # Contents of current line - my $num_old; # Current line number in old file - my $num_new; # Current line number in new file - my $file_old; # Name of old file in diff section - my $file_new; # Name of new file in diff section - my $filename; # Name of common filename of diff section - my $in_block = 0; # Non-zero while we are inside a diff block - local *HANDLE; # File handle for reading the diff file - - info("Reading diff $diff_file\n"); - - # Check if file exists and is readable - stat($diff_file); - if (!(-r _)) - { - die("ERROR: cannot read file $diff_file!\n"); - } - - # Check if this is really a plain file - if (!(-f _)) - { - die("ERROR: not a plain file: $diff_file!\n"); - } - - # Check for .gz extension - if ($diff_file =~ /\.gz$/) - { - # Check for availability of GZIP tool - system_no_output(1, "gunzip", "-h") - and die("ERROR: gunzip command not available!\n"); - - # Check integrity of compressed file - system_no_output(1, "gunzip", "-t", $diff_file) - and die("ERROR: integrity check failed for ". - "compressed file $diff_file!\n"); - - # Open compressed file - open(HANDLE, "gunzip -c $diff_file|") - or die("ERROR: cannot start gunzip to decompress ". - "file $_[0]!\n"); - } - else - { - # Open decompressed file - open(HANDLE, $diff_file) - or die("ERROR: cannot read file $_[0]!\n"); - } - - # Parse diff file line by line - while (<HANDLE>) - { - chomp($_); - $line = $_; - - foreach ($line) - { - # Filename of old file: - # --- <filename> <date> - /^--- (\S+)/ && do - { - $file_old = strip_directories($1, $strip); - last; - }; - # Filename of new file: - # +++ <filename> <date> - /^\+\+\+ (\S+)/ && do - { - # Add last file to resulting hash - if ($filename) - { - my %new_hash; - $diff{$filename} = $mapping; - $mapping = \%new_hash; - } - $file_new = strip_directories($1, $strip); - $filename = $file_old; - $paths{$filename} = $file_new; - $num_old = 1; - $num_new = 1; - last; - }; - # Start of diff block: - # @@ -old_start,old_num, +new_start,new_num @@ - /^\@\@\s+-(\d+),(\d+)\s+\+(\d+),(\d+)\s+\@\@$/ && do - { - $in_block = 1; - while ($num_old < $1) - { - $mapping->{$num_new} = $num_old; - $num_old++; - $num_new++; - } - last; - }; - # Unchanged line - # <line starts with blank> - /^ / && do - { - if ($in_block == 0) - { - last; - } - $mapping->{$num_new} = $num_old; - $num_old++; - $num_new++; - last; - }; - # Line as seen in old file - # <line starts with '-'> - /^-/ && do - { - if ($in_block == 0) - { - last; - } - $num_old++; - last; - }; - # Line as seen in new file - # <line starts with '+'> - /^\+/ && do - { - if ($in_block == 0) - { - last; - } - $num_new++; - last; - }; - # Empty line - /^$/ && do - { - if ($in_block == 0) - { - last; - } - $mapping->{$num_new} = $num_old; - $num_old++; - $num_new++; - last; - }; - } - } - - close(HANDLE); - - # Add final diff file section to resulting hash - if ($filename) - { - $diff{$filename} = $mapping; - } - - if (!%diff) - { - die("ERROR: no valid diff data found in $diff_file!\n". - "Make sure to use 'diff -u' when generating the diff ". - "file.\n"); - } - return (\%diff, \%paths); -} - - -# -# apply_diff($count_data, $line_hash) -# -# Transform count data using a mapping of lines: -# -# $count_data: reference to hash: line number -> data -# $line_hash: reference to hash: line number new -> line number old -# -# Return a reference to transformed count data. -# - -sub apply_diff($$) -{ - my $count_data = $_[0]; # Reference to data hash: line -> hash - my $line_hash = $_[1]; # Reference to line hash: new line -> old line - my %result; # Resulting hash - my $last_new = 0; # Last new line number found in line hash - my $last_old = 0; # Last old line number found in line hash - - # Iterate all new line numbers found in the diff - foreach (sort({$a <=> $b} keys(%{$line_hash}))) - { - $last_new = $_; - $last_old = $line_hash->{$last_new}; - - # Is there data associated with the corresponding old line? - if (defined($count_data->{$line_hash->{$_}})) - { - # Copy data to new hash with a new line number - $result{$_} = $count_data->{$line_hash->{$_}}; - } - } - # Transform all other lines which come after the last diff entry - foreach (sort({$a <=> $b} keys(%{$count_data}))) - { - if ($_ <= $last_old) - { - # Skip lines which were covered by line hash - next; - } - # Copy data to new hash with an offset - $result{$_ + ($last_new - $last_old)} = $count_data->{$_}; - } - - return \%result; -} - - -# -# get_hash_max(hash_ref) -# -# Return the highest integer key from hash. -# - -sub get_hash_max($) -{ - my ($hash) = @_; - my $max; - - foreach (keys(%{$hash})) { - if (!defined($max)) { - $max = $_; - } elsif ($hash->{$_} > $max) { - $max = $_; - } - } - return $max; -} - -sub get_hash_reverse($) -{ - my ($hash) = @_; - my %result; - - foreach (keys(%{$hash})) { - $result{$hash->{$_}} = $_; - } - - return \%result; -} - -# -# apply_diff_to_funcdata(funcdata, line_hash) -# - -sub apply_diff_to_funcdata($$) -{ - my ($funcdata, $linedata) = @_; - my $last_new = get_hash_max($linedata); - my $last_old = $linedata->{$last_new}; - my $func; - my %result; - my $line_diff = get_hash_reverse($linedata); - - foreach $func (keys(%{$funcdata})) { - my $line = $funcdata->{$func}; - - if (defined($line_diff->{$line})) { - $result{$func} = $line_diff->{$line}; - } elsif ($line > $last_old) { - $result{$func} = $line + $last_new - $last_old; - } - } - - return \%result; -} - - -# -# get_line_hash($filename, $diff_data, $path_data) -# -# Find line hash in DIFF_DATA which matches FILENAME. On success, return list -# line hash. or undef in case of no match. Die if more than one line hashes in -# DIFF_DATA match. -# - -sub get_line_hash($$$) -{ - my $filename = $_[0]; - my $diff_data = $_[1]; - my $path_data = $_[2]; - my $conversion; - my $old_path; - my $new_path; - my $diff_name; - my $common; - my $old_depth; - my $new_depth; - - foreach (keys(%{$diff_data})) - { - # Try to match diff filename with filename - if ($filename =~ /^\Q$diff_path\E\/$_$/) - { - if ($diff_name) - { - # Two files match, choose the more specific one - # (the one with more path components) - $old_depth = ($diff_name =~ tr/\///); - $new_depth = (tr/\///); - if ($old_depth == $new_depth) - { - die("ERROR: diff file contains ". - "ambiguous entries for ". - "$filename\n"); - } - elsif ($new_depth > $old_depth) - { - $diff_name = $_; - } - } - else - { - $diff_name = $_; - } - }; - } - if ($diff_name) - { - # Get converted path - if ($filename =~ /^(.*)$diff_name$/) - { - ($common, $old_path, $new_path) = - get_common_filename($filename, - $1.$path_data->{$diff_name}); - } - return ($diff_data->{$diff_name}, $old_path, $new_path); - } - else - { - return undef; - } -} - - -# -# convert_paths(trace_data, path_conversion_data) -# -# Rename all paths in TRACE_DATA which show up in PATH_CONVERSION_DATA. -# - -sub convert_paths($$) -{ - my $trace_data = $_[0]; - my $path_conversion_data = $_[1]; - my $filename; - my $new_path; - - if (scalar(keys(%{$path_conversion_data})) == 0) - { - info("No path conversion data available.\n"); - return; - } - - # Expand path conversion list - foreach $filename (keys(%{$path_conversion_data})) - { - $new_path = $path_conversion_data->{$filename}; - while (($filename =~ s/^(.*)\/[^\/]+$/$1/) && - ($new_path =~ s/^(.*)\/[^\/]+$/$1/) && - ($filename ne $new_path)) - { - $path_conversion_data->{$filename} = $new_path; - } - } - - # Adjust paths - FILENAME: foreach $filename (keys(%{$trace_data})) - { - # Find a path in our conversion table that matches, starting - # with the longest path - foreach (sort({length($b) <=> length($a)} - keys(%{$path_conversion_data}))) - { - # Is this path a prefix of our filename? - if (!($filename =~ /^$_(.*)$/)) - { - next; - } - $new_path = $path_conversion_data->{$_}.$1; - - # Make sure not to overwrite an existing entry under - # that path name - if ($trace_data->{$new_path}) - { - # Need to combine entries - $trace_data->{$new_path} = - combine_info_entries( - $trace_data->{$filename}, - $trace_data->{$new_path}, - $filename); - } - else - { - # Simply rename entry - $trace_data->{$new_path} = - $trace_data->{$filename}; - } - delete($trace_data->{$filename}); - next FILENAME; - } - info("No conversion available for filename $filename\n"); - } -} - -# -# sub adjust_fncdata(funcdata, testfncdata, sumfnccount) -# -# Remove function call count data from testfncdata and sumfnccount which -# is no longer present in funcdata. -# - -sub adjust_fncdata($$$) -{ - my ($funcdata, $testfncdata, $sumfnccount) = @_; - my $testname; - my $func; - my $f_found; - my $f_hit; - - # Remove count data in testfncdata for functions which are no longer - # in funcdata - foreach $testname (%{$testfncdata}) { - my $fnccount = $testfncdata->{$testname}; - - foreach $func (%{$fnccount}) { - if (!defined($funcdata->{$func})) { - delete($fnccount->{$func}); - } - } - } - # Remove count data in sumfnccount for functions which are no longer - # in funcdata - foreach $func (%{$sumfnccount}) { - if (!defined($funcdata->{$func})) { - delete($sumfnccount->{$func}); - } - } -} - -# -# get_func_found_and_hit(sumfnccount) -# -# Return (f_found, f_hit) for sumfnccount -# - -sub get_func_found_and_hit($) -{ - my ($sumfnccount) = @_; - my $function; - my $f_found; - my $f_hit; - - $f_found = scalar(keys(%{$sumfnccount})); - $f_hit = 0; - foreach $function (keys(%{$sumfnccount})) { - if ($sumfnccount->{$function} > 0) { - $f_hit++; - } - } - return ($f_found, $f_hit); -} - -# -# diff() -# - -sub diff() -{ - my $trace_data = read_info_file($diff); - my $diff_data; - my $path_data; - my $old_path; - my $new_path; - my %path_conversion_data; - my $filename; - my $line_hash; - my $new_name; - my $entry; - my $testdata; - my $testname; - my $sumcount; - my $funcdata; - my $checkdata; - my $testfncdata; - my $sumfnccount; - my $found; - my $hit; - my $f_found; - my $f_hit; - my $converted = 0; - my $unchanged = 0; - local *INFO_HANDLE; - - ($diff_data, $path_data) = read_diff($ARGV[0]); - - foreach $filename (sort(keys(%{$trace_data}))) - { - # Find a diff section corresponding to this file - ($line_hash, $old_path, $new_path) = - get_line_hash($filename, $diff_data, $path_data); - if (!$line_hash) - { - # There's no diff section for this file - $unchanged++; - next; - } - $converted++; - if ($old_path && $new_path && ($old_path ne $new_path)) - { - $path_conversion_data{$old_path} = $new_path; - } - # Check for deleted files - if (scalar(keys(%{$line_hash})) == 0) - { - info("Removing $filename\n"); - delete($trace_data->{$filename}); - next; - } - info("Converting $filename\n"); - $entry = $trace_data->{$filename}; - ($testdata, $sumcount, $funcdata, $checkdata, $testfncdata, - $sumfnccount) = get_info_entry($entry); - # Convert test data - foreach $testname (keys(%{$testdata})) - { - $testdata->{$testname} = - apply_diff($testdata->{$testname}, $line_hash); - # Remove empty sets of test data - if (scalar(keys(%{$testdata->{$testname}})) == 0) - { - delete($testdata->{$testname}); - delete($testfncdata->{$testname}); - } - } - # Rename test data to indicate conversion - foreach $testname (keys(%{$testdata})) - { - # Skip testnames which already contain an extension - if ($testname =~ /,[^,]+$/) - { - next; - } - # Check for name conflict - if (defined($testdata->{$testname.",diff"})) - { - # Add counts - ($testdata->{$testname}) = add_counts( - $testdata->{$testname}, - $testdata->{$testname.",diff"}); - delete($testdata->{$testname.",diff"}); - # Add function call counts - ($testfncdata->{$testname}) = add_fnccount( - $testfncdata->{$testname}, - $testfncdata->{$testname.",diff"}); - delete($testfncdata->{$testname.",diff"}); - } - # Move test data to new testname - $testdata->{$testname.",diff"} = $testdata->{$testname}; - delete($testdata->{$testname}); - # Move function call count data to new testname - $testfncdata->{$testname.",diff"} = - $testfncdata->{$testname}; - delete($testfncdata->{$testname}); - } - # Convert summary of test data - $sumcount = apply_diff($sumcount, $line_hash); - # Convert function data - $funcdata = apply_diff_to_funcdata($funcdata, $line_hash); - # Convert checksum data - $checkdata = apply_diff($checkdata, $line_hash); - # Convert function call count data - adjust_fncdata($funcdata, $testfncdata, $sumfnccount); - ($f_found, $f_hit) = get_func_found_and_hit($sumfnccount); - # Update found/hit numbers - $found = 0; - $hit = 0; - foreach (keys(%{$sumcount})) - { - $found++; - if ($sumcount->{$_} > 0) - { - $hit++; - } - } - if ($found > 0) - { - # Store converted entry - set_info_entry($entry, $testdata, $sumcount, $funcdata, - $checkdata, $testfncdata, $sumfnccount, - $found, $hit, $f_found, $f_hit); - } - else - { - # Remove empty data set - delete($trace_data->{$filename}); - } - } - - # Convert filenames as well if requested - if ($convert_filenames) - { - convert_paths($trace_data, \%path_conversion_data); - } - - info("$converted entr".($converted != 1 ? "ies" : "y")." converted, ". - "$unchanged entr".($unchanged != 1 ? "ies" : "y")." left ". - "unchanged.\n"); - - # Write data - if ($to_file) - { - info("Writing data to $output_filename\n"); - open(INFO_HANDLE, ">$output_filename") - or die("ERROR: cannot write to $output_filename!\n"); - write_info_file(*INFO_HANDLE, $trace_data); - close(*INFO_HANDLE); - } - else - { - write_info_file(*STDOUT, $trace_data); - } -} - - -# -# system_no_output(mode, parameters) -# -# Call an external program using PARAMETERS while suppressing depending on -# the value of MODE: -# -# MODE & 1: suppress STDOUT -# MODE & 2: suppress STDERR -# -# Return 0 on success, non-zero otherwise. -# - -sub system_no_output($@) -{ - my $mode = shift; - my $result; - local *OLD_STDERR; - local *OLD_STDOUT; - - # Save old stdout and stderr handles - ($mode & 1) && open(OLD_STDOUT, ">>&STDOUT"); - ($mode & 2) && open(OLD_STDERR, ">>&STDERR"); - - # Redirect to /dev/null - ($mode & 1) && open(STDOUT, ">/dev/null"); - ($mode & 2) && open(STDERR, ">/dev/null"); - - system(@_); - $result = $?; - - # Close redirected handles - ($mode & 1) && close(STDOUT); - ($mode & 2) && close(STDERR); - - # Restore old handles - ($mode & 1) && open(STDOUT, ">>&OLD_STDOUT"); - ($mode & 2) && open(STDERR, ">>&OLD_STDERR"); - - return $result; -} - - -# -# read_config(filename) -# -# Read configuration file FILENAME and return a reference to a hash containing -# all valid key=value pairs found. -# - -sub read_config($) -{ - my $filename = $_[0]; - my %result; - my $key; - my $value; - local *HANDLE; - - if (!open(HANDLE, "<$filename")) - { - warn("WARNING: cannot read configuration file $filename\n"); - return undef; - } - while (<HANDLE>) - { - chomp; - # Skip comments - s/#.*//; - # Remove leading blanks - s/^\s+//; - # Remove trailing blanks - s/\s+$//; - next unless length; - ($key, $value) = split(/\s*=\s*/, $_, 2); - if (defined($key) && defined($value)) - { - $result{$key} = $value; - } - else - { - warn("WARNING: malformed statement in line $. ". - "of configuration file $filename\n"); - } - } - close(HANDLE); - return \%result; -} - - -# -# apply_config(REF) -# -# REF is a reference to a hash containing the following mapping: -# -# key_string => var_ref -# -# where KEY_STRING is a keyword and VAR_REF is a reference to an associated -# variable. If the global configuration hash CONFIG contains a value for -# keyword KEY_STRING, VAR_REF will be assigned the value for that keyword. -# - -sub apply_config($) -{ - my $ref = $_[0]; - - foreach (keys(%{$ref})) - { - if (defined($config->{$_})) - { - ${$ref->{$_}} = $config->{$_}; - } - } -} - -sub warn_handler($) -{ - my ($msg) = @_; - - warn("$tool_name: $msg"); -} - -sub die_handler($) -{ - my ($msg) = @_; - - die("$tool_name: $msg"); -} diff --git a/3rdParty/LibIDN b/3rdParty/LibIDN new file mode 160000 +Subproject 5a4274b7eb5923c2b8e6c1aee279a47c8e05662 diff --git a/3rdParty/LibIDN/SConscript b/3rdParty/LibIDN/SConscript deleted file mode 100644 index fa8f870..0000000 --- a/3rdParty/LibIDN/SConscript +++ /dev/null @@ -1,45 +0,0 @@ -Import(["env", "conf_env"]) - -env["LIBIDN_FLAGS"] = { - "CPPDEFINES": ["IDNA_STATIC"], - "CPPPATH": [Dir("src")], - "LIBPATH": [Dir(".")], - "LIBS": ["IDN"], - } - -myenv = env.Clone() - -# Remove warn flags -myenv.Replace(CCFLAGS = [flag for flag in env["CCFLAGS"] if flag not in ["-W", "-Wall"]]) - -# Check for strcasecmp() or replacement -conf = Configure(conf_env) -if not conf.CheckFunc('strcasecmp') : - if conf.CheckFunc("stricmp") : - myenv.Append(CPPDEFINES = [("strcasecmp", "stricmp")]) - else : - print "Error: Cannot find strcasecmp() or stricmp()" - Exit(1) -if not conf.CheckFunc('strncasecmp') : - if conf.CheckFunc("strnicmp") : - myenv.Append(CPPDEFINES = [("strncasecmp", "strnicmp")]) - else : - print "Error: Cannot find strncasecmp() or strnicmp()" - Exit(1) -conf.Finish() - -myenv.Append(CPPDEFINES = "IDNA_STATIC") -myenv.Append(CPPPATH = ["src", "stubs"]) -if myenv["PLATFORM"] == "win32" : - myenv.Append(CPPPATH = "stubs/win32") - env["LIBIDN_FLAGS"]["CPPPATH"] += [Dir("stubs/win32")] - -myenv.StaticLibrary("IDN", [ - "src/stringprep.c", - "src/profiles.c", - "src/rfc3454.c", - "src/punycode.c", - "src/idna.c", - "src/toutf8.c", - "src/nfkc.c" - ]) diff --git a/3rdParty/LibIDN/src/gunicomp.h b/3rdParty/LibIDN/src/gunicomp.h deleted file mode 100644 index b5fa880..0000000 --- a/3rdParty/LibIDN/src/gunicomp.h +++ /dev/null @@ -1,661 +0,0 @@ -/* This file is automatically generated. DO NOT EDIT! - Instead, edit gen-unicode-tables.pl and re-run. */ - -#define COMPOSE_FIRST_START 1 -#define COMPOSE_FIRST_SINGLE_START 147 -#define COMPOSE_SECOND_START 357 -#define COMPOSE_SECOND_SINGLE_START 388 - -#define COMPOSE_TABLE_LAST 48 - -static const guint16 compose_data[][256] = { - { /* page 0, index 0 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 148, 149, 0, 0, 1, 2, 3, 4, 5, - 150, 6, 7, 8, 151, 9, 10, 11, 12, 13, 14, 0, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 152, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, 47, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 153, 154, - 50, 155, 0, 0, 51, 0, 0, 0, 0, 156, 0, 0, 0, 0, 52, 53, 157, 0, 158, 0, - 0, 0, 54, 0, 0, 0, 0, 0, 55, 0, 159, 160, 56, 161, 0, 0, 57, 0, 0, 0, 0, - 162, 0, 0, 0, 0, 58, 59, 163, 0, 164, 0, 0, 0, 60, 0, 0, 0 - }, - { /* page 1, index 1 */ - 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, 166, 0, - 0, 0, 0, 167, 168, 0, 0, 0, 0, 0, 0, 169, 170, 171, 172, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, - 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 0, 0, 0, 0, 0, 0, 174, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 175, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0 - }, - { /* page 2, index 2 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 178, 179, 180, 0, 0, 0, 0, - 181, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 3, index 3 */ - 357, 358, 359, 360, 361, 0, 362, 363, 364, 365, 366, 367, 368, 0, 0, 369, - 0, 370, 0, 371, 372, 0, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 0, 374, - 375, 376, 377, 378, 379, 0, 0, 0, 0, 380, 381, 0, 382, 383, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 384, 0, 0, 385, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, - 72, 0, 73, 0, 74, 0, 0, 0, 0, 0, 75, 0, 184, 0, 0, 0, 76, 0, 0, 0, 77, 0, - 0, 185, 0, 186, 0, 0, 78, 0, 0, 0, 79, 0, 80, 0, 81, 0, 0, 0, 0, 0, 82, - 0, 83, 0, 0, 0, 84, 0, 0, 0, 85, 86, 87, 0, 0, 187, 0, 0, 0, 88, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 4, index 4 */ - 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 189, 0, 90, - 91, 190, 92, 0, 191, 0, 0, 0, 192, 0, 0, 0, 0, 93, 0, 0, 0, 193, 0, 0, 0, - 194, 0, 195, 0, 0, 94, 0, 0, 196, 0, 95, 96, 197, 97, 0, 198, 0, 0, 0, - 199, 0, 0, 0, 0, 98, 0, 0, 0, 200, 0, 0, 0, 201, 0, 202, 0, 0, 0, 0, 0, - 0, 0, 0, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 207, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 208, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 6, index 5 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 210, 0, 211, 0, 0, 0, 0, 0, 0, 0, 0, 388, 389, 390, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213, 0, - 0, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 9, index 6 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, - 216, 0, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 391, - 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 11, index 7 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 393, 0, 0, 0, 0, 0, 0, 0, 0, - 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 394, 395, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 396, 0, 0, 0, 0, 0, 0, 0, 102, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 12, index 8 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, - 0, 0, 398, 0, 0, 0, 103, 0, 0, 0, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, - 400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 13, index 9 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 401, 0, 0, 0, 0, 0, 0, 0, 104, - 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 105, 0, 0, 224, 0, 0, 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 16, index 10 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 30, index 11 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 226, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 229, 0, 0, - 0, 0, 0, 0, 230, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 233, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 235, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 31, index 12 */ - 108, 109, 236, 237, 238, 239, 240, 241, 110, 111, 242, 243, 244, 245, - 246, 247, 112, 113, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 116, - 117, 248, 249, 250, 251, 252, 253, 118, 119, 254, 255, 256, 257, 258, - 259, 120, 121, 0, 0, 0, 0, 0, 0, 122, 123, 0, 0, 0, 0, 0, 0, 124, 125, 0, - 0, 0, 0, 0, 0, 126, 127, 0, 0, 0, 0, 0, 0, 128, 129, 0, 0, 0, 0, 0, 0, 0, - 130, 0, 0, 0, 0, 0, 0, 131, 132, 260, 261, 262, 263, 264, 265, 133, 134, - 266, 267, 268, 269, 270, 271, 272, 0, 0, 0, 273, 0, 0, 0, 0, 0, 0, 0, - 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 135, 0, 0, 0, - 0, 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 277, 0, 0, 0, 0, 0, 0, 0, 136, 0 - }, - { /* page 33, index 13 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 0, 279, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 0, 282, 0, - 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 34, index 14 */ - 0, 0, 0, 284, 0, 0, 0, 0, 285, 0, 0, 286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 288, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, 0, 0, 0, 0, 0, 290, - 0, 291, 0, 0, 292, 0, 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 294, 0, 0, 295, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 297, 298, 0, 0, 299, 300, 0, 0, 301, 302, 303, 304, 0, 0, 0, 0, - 305, 306, 0, 0, 307, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 310, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 311, 0, 0, 0, 0, 0, 312, 313, 0, 314, - 0, 0, 0, 0, 0, 0, 315, 316, 317, 318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 48, index 15 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319, 0, - 0, 0, 0, 320, 0, 321, 0, 322, 0, 323, 0, 324, 0, 325, 0, 326, 0, 327, 0, - 328, 0, 329, 0, 330, 0, 331, 0, 0, 332, 0, 333, 0, 334, 0, 0, 0, 0, 0, 0, - 137, 0, 0, 138, 0, 0, 139, 0, 0, 140, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, 387, - 0, 0, 335, 0, 0, 0, 0, 0, 0, 0, 0, 336, 0, 0, 0, 0, 337, 0, 338, 0, 339, - 0, 340, 0, 341, 0, 342, 0, 343, 0, 344, 0, 345, 0, 346, 0, 347, 0, 348, - 0, 0, 349, 0, 350, 0, 351, 0, 0, 0, 0, 0, 0, 142, 0, 0, 143, 0, 0, 144, - 0, 0, 145, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 352, 353, 354, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 356, 0, 0 - } -}; - -static const gint16 compose_table[COMPOSE_TABLE_LAST + 1] = { - 0 /* page 0 */, - 1 /* page 1 */, - 2 /* page 2 */, - 3 /* page 3 */, - 4 /* page 4 */, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 5 /* page 6 */, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 6 /* page 9 */, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 7 /* page 11 */, - 8 /* page 12 */, - 9 /* page 13 */, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 10 /* page 16 */, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 11 /* page 30 */, - 12 /* page 31 */, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 13 /* page 33 */, - 14 /* page 34 */, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 15 /* page 48 */ -}; - -static const guint16 compose_first_single[][2] = { - { 0x0338, 0x226e }, - { 0x0338, 0x2260 }, - { 0x0338, 0x226f }, - { 0x0307, 0x1e1e }, - { 0x0302, 0x0134 }, - { 0x0307, 0x1e1f }, - { 0x0304, 0x01de }, - { 0x0301, 0x01fa }, - { 0x0301, 0x1e08 }, - { 0x0301, 0x1e2e }, - { 0x0304, 0x022a }, - { 0x0301, 0x01fe }, - { 0x0304, 0x01df }, - { 0x0301, 0x01fb }, - { 0x0301, 0x1e09 }, - { 0x0301, 0x1e2f }, - { 0x0304, 0x022b }, - { 0x0301, 0x01ff }, - { 0x0307, 0x1e64 }, - { 0x0307, 0x1e65 }, - { 0x0307, 0x1e66 }, - { 0x0307, 0x1e67 }, - { 0x0301, 0x1e78 }, - { 0x0301, 0x1e79 }, - { 0x0308, 0x1e7a }, - { 0x0308, 0x1e7b }, - { 0x0307, 0x1e9b }, - { 0x030c, 0x01ee }, - { 0x0304, 0x01ec }, - { 0x0304, 0x01ed }, - { 0x0304, 0x01e0 }, - { 0x0304, 0x01e1 }, - { 0x0306, 0x1e1c }, - { 0x0306, 0x1e1d }, - { 0x0304, 0x0230 }, - { 0x0304, 0x0231 }, - { 0x030c, 0x01ef }, - { 0x0314, 0x1fec }, - { 0x0345, 0x1fb4 }, - { 0x0345, 0x1fc4 }, - { 0x0345, 0x1ff4 }, - { 0x0308, 0x0407 }, - { 0x0301, 0x0403 }, - { 0x0308, 0x04de }, - { 0x0301, 0x040c }, - { 0x0308, 0x04e6 }, - { 0x0308, 0x04f4 }, - { 0x0308, 0x04f8 }, - { 0x0308, 0x04ec }, - { 0x0301, 0x0453 }, - { 0x0308, 0x04df }, - { 0x0301, 0x045c }, - { 0x0308, 0x04e7 }, - { 0x0308, 0x04f5 }, - { 0x0308, 0x04f9 }, - { 0x0308, 0x04ed }, - { 0x0308, 0x0457 }, - { 0x030f, 0x0476 }, - { 0x030f, 0x0477 }, - { 0x0308, 0x04da }, - { 0x0308, 0x04db }, - { 0x0308, 0x04ea }, - { 0x0308, 0x04eb }, - { 0x0654, 0x0624 }, - { 0x0654, 0x0626 }, - { 0x0654, 0x06c2 }, - { 0x0654, 0x06d3 }, - { 0x0654, 0x06c0 }, - { 0x093c, 0x0929 }, - { 0x093c, 0x0931 }, - { 0x093c, 0x0934 }, - { 0x0bd7, 0x0b94 }, - { 0x0bbe, 0x0bcb }, - { 0x0c56, 0x0c48 }, - { 0x0cd5, 0x0cc0 }, - { 0x0cd5, 0x0ccb }, - { 0x0d3e, 0x0d4b }, - { 0x0dca, 0x0ddd }, - { 0x102e, 0x1026 }, - { 0x0304, 0x1e38 }, - { 0x0304, 0x1e39 }, - { 0x0304, 0x1e5c }, - { 0x0304, 0x1e5d }, - { 0x0307, 0x1e68 }, - { 0x0307, 0x1e69 }, - { 0x0302, 0x1ec6 }, - { 0x0302, 0x1ec7 }, - { 0x0302, 0x1ed8 }, - { 0x0302, 0x1ed9 }, - { 0x0345, 0x1f82 }, - { 0x0345, 0x1f83 }, - { 0x0345, 0x1f84 }, - { 0x0345, 0x1f85 }, - { 0x0345, 0x1f86 }, - { 0x0345, 0x1f87 }, - { 0x0345, 0x1f8a }, - { 0x0345, 0x1f8b }, - { 0x0345, 0x1f8c }, - { 0x0345, 0x1f8d }, - { 0x0345, 0x1f8e }, - { 0x0345, 0x1f8f }, - { 0x0345, 0x1f92 }, - { 0x0345, 0x1f93 }, - { 0x0345, 0x1f94 }, - { 0x0345, 0x1f95 }, - { 0x0345, 0x1f96 }, - { 0x0345, 0x1f97 }, - { 0x0345, 0x1f9a }, - { 0x0345, 0x1f9b }, - { 0x0345, 0x1f9c }, - { 0x0345, 0x1f9d }, - { 0x0345, 0x1f9e }, - { 0x0345, 0x1f9f }, - { 0x0345, 0x1fa2 }, - { 0x0345, 0x1fa3 }, - { 0x0345, 0x1fa4 }, - { 0x0345, 0x1fa5 }, - { 0x0345, 0x1fa6 }, - { 0x0345, 0x1fa7 }, - { 0x0345, 0x1faa }, - { 0x0345, 0x1fab }, - { 0x0345, 0x1fac }, - { 0x0345, 0x1fad }, - { 0x0345, 0x1fae }, - { 0x0345, 0x1faf }, - { 0x0345, 0x1fb2 }, - { 0x0345, 0x1fc2 }, - { 0x0345, 0x1ff2 }, - { 0x0345, 0x1fb7 }, - { 0x0345, 0x1fc7 }, - { 0x0345, 0x1ff7 }, - { 0x0338, 0x219a }, - { 0x0338, 0x219b }, - { 0x0338, 0x21ae }, - { 0x0338, 0x21cd }, - { 0x0338, 0x21cf }, - { 0x0338, 0x21ce }, - { 0x0338, 0x2204 }, - { 0x0338, 0x2209 }, - { 0x0338, 0x220c }, - { 0x0338, 0x2224 }, - { 0x0338, 0x2226 }, - { 0x0338, 0x2241 }, - { 0x0338, 0x2244 }, - { 0x0338, 0x2247 }, - { 0x0338, 0x2249 }, - { 0x0338, 0x226d }, - { 0x0338, 0x2262 }, - { 0x0338, 0x2270 }, - { 0x0338, 0x2271 }, - { 0x0338, 0x2274 }, - { 0x0338, 0x2275 }, - { 0x0338, 0x2278 }, - { 0x0338, 0x2279 }, - { 0x0338, 0x2280 }, - { 0x0338, 0x2281 }, - { 0x0338, 0x22e0 }, - { 0x0338, 0x22e1 }, - { 0x0338, 0x2284 }, - { 0x0338, 0x2285 }, - { 0x0338, 0x2288 }, - { 0x0338, 0x2289 }, - { 0x0338, 0x22e2 }, - { 0x0338, 0x22e3 }, - { 0x0338, 0x22ac }, - { 0x0338, 0x22ad }, - { 0x0338, 0x22ae }, - { 0x0338, 0x22af }, - { 0x0338, 0x22ea }, - { 0x0338, 0x22eb }, - { 0x0338, 0x22ec }, - { 0x0338, 0x22ed }, - { 0x3099, 0x3094 }, - { 0x3099, 0x304c }, - { 0x3099, 0x304e }, - { 0x3099, 0x3050 }, - { 0x3099, 0x3052 }, - { 0x3099, 0x3054 }, - { 0x3099, 0x3056 }, - { 0x3099, 0x3058 }, - { 0x3099, 0x305a }, - { 0x3099, 0x305c }, - { 0x3099, 0x305e }, - { 0x3099, 0x3060 }, - { 0x3099, 0x3062 }, - { 0x3099, 0x3065 }, - { 0x3099, 0x3067 }, - { 0x3099, 0x3069 }, - { 0x3099, 0x309e }, - { 0x3099, 0x30f4 }, - { 0x3099, 0x30ac }, - { 0x3099, 0x30ae }, - { 0x3099, 0x30b0 }, - { 0x3099, 0x30b2 }, - { 0x3099, 0x30b4 }, - { 0x3099, 0x30b6 }, - { 0x3099, 0x30b8 }, - { 0x3099, 0x30ba }, - { 0x3099, 0x30bc }, - { 0x3099, 0x30be }, - { 0x3099, 0x30c0 }, - { 0x3099, 0x30c2 }, - { 0x3099, 0x30c5 }, - { 0x3099, 0x30c7 }, - { 0x3099, 0x30c9 }, - { 0x3099, 0x30f7 }, - { 0x3099, 0x30f8 }, - { 0x3099, 0x30f9 }, - { 0x3099, 0x30fa }, - { 0x3099, 0x30fe } -}; -static const guint16 compose_second_single[][2] = { - { 0x0627, 0x0622 }, - { 0x0627, 0x0623 }, - { 0x0627, 0x0625 }, - { 0x09c7, 0x09cb }, - { 0x09c7, 0x09cc }, - { 0x0b47, 0x0b4b }, - { 0x0b47, 0x0b48 }, - { 0x0b47, 0x0b4c }, - { 0x0bc6, 0x0bca }, - { 0x0bc6, 0x0bcc }, - { 0x0cc6, 0x0cca }, - { 0x0cc6, 0x0cc7 }, - { 0x0cc6, 0x0cc8 }, - { 0x0d46, 0x0d4a }, - { 0x0d46, 0x0d4c }, - { 0x0dd9, 0x0dda }, - { 0x0dd9, 0x0ddc }, - { 0x0dd9, 0x0dde } -}; -static const guint16 compose_array[146][31] = { - { 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x0100, 0x0102, 0x0226, 0x00c4, 0x1ea2, 0x00c5, 0, 0x01cd, 0x0200, 0x0202, 0, 0, 0, 0x1ea0, 0, 0x1e00, 0, 0, 0x0104, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0x1e02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e04, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e06, 0, 0, 0, 0 }, - { 0, 0x0106, 0x0108, 0, 0, 0, 0x010a, 0, 0, 0, 0, 0x010c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00c7, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0x1e0a, 0, 0, 0, 0, 0x010e, 0, 0, 0, 0, 0, 0x1e0c, 0, 0, 0, 0x1e10, 0, 0x1e12, 0, 0, 0x1e0e, 0, 0, 0, 0 }, - { 0x00c8, 0x00c9, 0x00ca, 0x1ebc, 0x0112, 0x0114, 0x0116, 0x00cb, 0x1eba, 0, 0, 0x011a, 0x0204, 0x0206, 0, 0, 0, 0x1eb8, 0, 0, 0, 0x0228, 0x0118, 0x1e18, 0, 0x1e1a, 0, 0, 0, 0, 0 }, - { 0, 0x01f4, 0x011c, 0, 0x1e20, 0x011e, 0x0120, 0, 0, 0, 0, 0x01e6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0122, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0x0124, 0, 0, 0, 0x1e22, 0x1e26, 0, 0, 0, 0x021e, 0, 0, 0, 0, 0, 0x1e24, 0, 0, 0, 0x1e28, 0, 0, 0x1e2a, 0, 0, 0, 0, 0, 0 }, - { 0x00cc, 0x00cd, 0x00ce, 0x0128, 0x012a, 0x012c, 0x0130, 0x00cf, 0x1ec8, 0, 0, 0x01cf, 0x0208, 0x020a, 0, 0, 0, 0x1eca, 0, 0, 0, 0, 0x012e, 0, 0, 0x1e2c, 0, 0, 0, 0, 0 }, - { 0, 0x1e30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01e8, 0, 0, 0, 0, 0, 0x1e32, 0, 0, 0, 0x0136, 0, 0, 0, 0, 0x1e34, 0, 0, 0, 0 }, - { 0, 0x0139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x013d, 0, 0, 0, 0, 0, 0x1e36, 0, 0, 0, 0x013b, 0, 0x1e3c, 0, 0, 0x1e3a, 0, 0, 0, 0 }, - { 0, 0x1e3e, 0, 0, 0, 0, 0x1e40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x01f8, 0x0143, 0, 0x00d1, 0, 0, 0x1e44, 0, 0, 0, 0, 0x0147, 0, 0, 0, 0, 0, 0x1e46, 0, 0, 0, 0x0145, 0, 0x1e4a, 0, 0, 0x1e48, 0, 0, 0, 0 }, - { 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x014c, 0x014e, 0x022e, 0x00d6, 0x1ece, 0, 0x0150, 0x01d1, 0x020c, 0x020e, 0, 0, 0x01a0, 0x1ecc, 0, 0, 0, 0, 0x01ea, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0x1e54, 0, 0, 0, 0, 0x1e56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0x0154, 0, 0, 0, 0, 0x1e58, 0, 0, 0, 0, 0x0158, 0x0210, 0x0212, 0, 0, 0, 0x1e5a, 0, 0, 0, 0x0156, 0, 0, 0, 0, 0x1e5e, 0, 0, 0, 0 }, - { 0, 0x015a, 0x015c, 0, 0, 0, 0x1e60, 0, 0, 0, 0, 0x0160, 0, 0, 0, 0, 0, 0x1e62, 0, 0, 0x0218, 0x015e, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0x1e6a, 0, 0, 0, 0, 0x0164, 0, 0, 0, 0, 0, 0x1e6c, 0, 0, 0x021a, 0x0162, 0, 0x1e70, 0, 0, 0x1e6e, 0, 0, 0, 0 }, - { 0x00d9, 0x00da, 0x00db, 0x0168, 0x016a, 0x016c, 0, 0x00dc, 0x1ee6, 0x016e, 0x0170, 0x01d3, 0x0214, 0x0216, 0, 0, 0x01af, 0x1ee4, 0x1e72, 0, 0, 0, 0x0172, 0x1e76, 0, 0x1e74, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0x1e7c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e7e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1e80, 0x1e82, 0x0174, 0, 0, 0, 0x1e86, 0x1e84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0x1e8a, 0x1e8c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1ef2, 0x00dd, 0x0176, 0x1ef8, 0x0232, 0, 0x1e8e, 0x0178, 0x1ef6, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0x0179, 0x1e90, 0, 0, 0, 0x017b, 0, 0, 0, 0, 0x017d, 0, 0, 0, 0, 0, 0x1e92, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e94, 0, 0, 0, 0 }, - { 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x0101, 0x0103, 0x0227, 0x00e4, 0x1ea3, 0x00e5, 0, 0x01ce, 0x0201, 0x0203, 0, 0, 0, 0x1ea1, 0, 0x1e01, 0, 0, 0x0105, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0x1e03, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e05, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e07, 0, 0, 0, 0 }, - { 0, 0x0107, 0x0109, 0, 0, 0, 0x010b, 0, 0, 0, 0, 0x010d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00e7, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0x1e0b, 0, 0, 0, 0, 0x010f, 0, 0, 0, 0, 0, 0x1e0d, 0, 0, 0, 0x1e11, 0, 0x1e13, 0, 0, 0x1e0f, 0, 0, 0, 0 }, - { 0x00e8, 0x00e9, 0x00ea, 0x1ebd, 0x0113, 0x0115, 0x0117, 0x00eb, 0x1ebb, 0, 0, 0x011b, 0x0205, 0x0207, 0, 0, 0, 0x1eb9, 0, 0, 0, 0x0229, 0x0119, 0x1e19, 0, 0x1e1b, 0, 0, 0, 0, 0 }, - { 0, 0x01f5, 0x011d, 0, 0x1e21, 0x011f, 0x0121, 0, 0, 0, 0, 0x01e7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0123, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0x0125, 0, 0, 0, 0x1e23, 0x1e27, 0, 0, 0, 0x021f, 0, 0, 0, 0, 0, 0x1e25, 0, 0, 0, 0x1e29, 0, 0, 0x1e2b, 0, 0x1e96, 0, 0, 0, 0 }, - { 0x00ec, 0x00ed, 0x00ee, 0x0129, 0x012b, 0x012d, 0, 0x00ef, 0x1ec9, 0, 0, 0x01d0, 0x0209, 0x020b, 0, 0, 0, 0x1ecb, 0, 0, 0, 0, 0x012f, 0, 0, 0x1e2d, 0, 0, 0, 0, 0 }, - { 0, 0, 0x0135, 0, 0, 0, 0, 0, 0, 0, 0, 0x01f0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0x1e31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01e9, 0, 0, 0, 0, 0, 0x1e33, 0, 0, 0, 0x0137, 0, 0, 0, 0, 0x1e35, 0, 0, 0, 0 }, - { 0, 0x013a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x013e, 0, 0, 0, 0, 0, 0x1e37, 0, 0, 0, 0x013c, 0, 0x1e3d, 0, 0, 0x1e3b, 0, 0, 0, 0 }, - { 0, 0x1e3f, 0, 0, 0, 0, 0x1e41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x01f9, 0x0144, 0, 0x00f1, 0, 0, 0x1e45, 0, 0, 0, 0, 0x0148, 0, 0, 0, 0, 0, 0x1e47, 0, 0, 0, 0x0146, 0, 0x1e4b, 0, 0, 0x1e49, 0, 0, 0, 0 }, - { 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x014d, 0x014f, 0x022f, 0x00f6, 0x1ecf, 0, 0x0151, 0x01d2, 0x020d, 0x020f, 0, 0, 0x01a1, 0x1ecd, 0, 0, 0, 0, 0x01eb, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0x1e55, 0, 0, 0, 0, 0x1e57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0x0155, 0, 0, 0, 0, 0x1e59, 0, 0, 0, 0, 0x0159, 0x0211, 0x0213, 0, 0, 0, 0x1e5b, 0, 0, 0, 0x0157, 0, 0, 0, 0, 0x1e5f, 0, 0, 0, 0 }, - { 0, 0x015b, 0x015d, 0, 0, 0, 0x1e61, 0, 0, 0, 0, 0x0161, 0, 0, 0, 0, 0, 0x1e63, 0, 0, 0x0219, 0x015f, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0x1e6b, 0x1e97, 0, 0, 0, 0x0165, 0, 0, 0, 0, 0, 0x1e6d, 0, 0, 0x021b, 0x0163, 0, 0x1e71, 0, 0, 0x1e6f, 0, 0, 0, 0 }, - { 0x00f9, 0x00fa, 0x00fb, 0x0169, 0x016b, 0x016d, 0, 0x00fc, 0x1ee7, 0x016f, 0x0171, 0x01d4, 0x0215, 0x0217, 0, 0, 0x01b0, 0x1ee5, 0x1e73, 0, 0, 0, 0x0173, 0x1e77, 0, 0x1e75, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0x1e7d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e7f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1e81, 0x1e83, 0x0175, 0, 0, 0, 0x1e87, 0x1e85, 0, 0x1e98, 0, 0, 0, 0, 0, 0, 0, 0x1e89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0x1e8b, 0x1e8d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1ef3, 0x00fd, 0x0177, 0x1ef9, 0x0233, 0, 0x1e8f, 0x00ff, 0x1ef7, 0x1e99, 0, 0, 0, 0, 0, 0, 0, 0x1ef5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0x017a, 0x1e91, 0, 0, 0, 0x017c, 0, 0, 0, 0, 0x017e, 0, 0, 0, 0, 0, 0x1e93, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e95, 0, 0, 0, 0 }, - { 0x1fed, 0x0385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fc1, 0, 0, 0 }, - { 0x1ea6, 0x1ea4, 0, 0x1eaa, 0, 0, 0, 0, 0x1ea8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0x01fc, 0, 0, 0x01e2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1ec0, 0x1ebe, 0, 0x1ec4, 0, 0, 0, 0, 0x1ec2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1ed2, 0x1ed0, 0, 0x1ed6, 0, 0, 0, 0, 0x1ed4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0x1e4c, 0, 0, 0x022c, 0, 0, 0x1e4e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x01db, 0x01d7, 0, 0, 0x01d5, 0, 0, 0, 0, 0, 0, 0x01d9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1ea7, 0x1ea5, 0, 0x1eab, 0, 0, 0, 0, 0x1ea9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0x01fd, 0, 0, 0x01e3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1ec1, 0x1ebf, 0, 0x1ec5, 0, 0, 0, 0, 0x1ec3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1ed3, 0x1ed1, 0, 0x1ed7, 0, 0, 0, 0, 0x1ed5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0x1e4d, 0, 0, 0x022d, 0, 0, 0x1e4f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x01dc, 0x01d8, 0, 0, 0x01d6, 0, 0, 0, 0, 0, 0, 0x01da, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1eb0, 0x1eae, 0, 0x1eb4, 0, 0, 0, 0, 0x1eb2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1eb1, 0x1eaf, 0, 0x1eb5, 0, 0, 0, 0, 0x1eb3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1e14, 0x1e16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1e15, 0x1e17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1e50, 0x1e52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1e51, 0x1e53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1edc, 0x1eda, 0, 0x1ee0, 0, 0, 0, 0, 0x1ede, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ee2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1edd, 0x1edb, 0, 0x1ee1, 0, 0, 0, 0, 0x1edf, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ee3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1eea, 0x1ee8, 0, 0x1eee, 0, 0, 0, 0, 0x1eec, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1eeb, 0x1ee9, 0, 0x1eef, 0, 0, 0, 0, 0x1eed, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1fba, 0x0386, 0, 0, 0x1fb9, 0x1fb8, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f08, 0x1f09, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fbc, 0, 0 }, - { 0x1fc8, 0x0388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f18, 0x1f19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1fca, 0x0389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f28, 0x1f29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fcc, 0, 0 }, - { 0x1fda, 0x038a, 0, 0, 0x1fd9, 0x1fd8, 0, 0x03aa, 0, 0, 0, 0, 0, 0, 0x1f38, 0x1f39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1ff8, 0x038c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f48, 0x1f49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1fea, 0x038e, 0, 0, 0x1fe9, 0x1fe8, 0, 0x03ab, 0, 0, 0, 0, 0, 0, 0, 0x1f59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1ffa, 0x038f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f68, 0x1f69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ffc, 0, 0 }, - { 0x1f70, 0x03ac, 0, 0, 0x1fb1, 0x1fb0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f00, 0x1f01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fb6, 0x1fb3, 0, 0 }, - { 0x1f72, 0x03ad, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f10, 0x1f11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1f74, 0x03ae, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f20, 0x1f21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fc6, 0x1fc3, 0, 0 }, - { 0x1f76, 0x03af, 0, 0, 0x1fd1, 0x1fd0, 0, 0x03ca, 0, 0, 0, 0, 0, 0, 0x1f30, 0x1f31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fd6, 0, 0, 0 }, - { 0x1f78, 0x03cc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f40, 0x1f41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe4, 0x1fe5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1f7a, 0x03cd, 0, 0, 0x1fe1, 0x1fe0, 0, 0x03cb, 0, 0, 0, 0, 0, 0, 0x1f50, 0x1f51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe6, 0, 0, 0 }, - { 0x1f7c, 0x03ce, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f60, 0x1f61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ff6, 0x1ff3, 0, 0 }, - { 0x1fd2, 0x0390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fd7, 0, 0, 0 }, - { 0x1fe2, 0x03b0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe7, 0, 0, 0 }, - { 0, 0x03d3, 0, 0, 0, 0, 0, 0x03d4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0x04d0, 0, 0x04d2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x0400, 0, 0, 0, 0, 0x04d6, 0, 0x0401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0x04c1, 0, 0x04dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x040d, 0, 0, 0, 0x04e2, 0x0419, 0, 0x04e4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0x04ee, 0x040e, 0, 0x04f0, 0, 0, 0x04f2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0x04d1, 0, 0x04d3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x0450, 0, 0, 0, 0, 0x04d7, 0, 0x0451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0x04c2, 0, 0x04dd, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x045d, 0, 0, 0, 0x04e3, 0x0439, 0, 0x04e5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0x04ef, 0x045e, 0, 0x04f1, 0, 0, 0x04f3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0x1eac, 0, 0, 0x1eb6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0x1ead, 0, 0, 0x1eb7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1f02, 0x1f04, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f06, 0x1f80, 0, 0 }, - { 0x1f03, 0x1f05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f07, 0x1f81, 0, 0 }, - { 0x1f0a, 0x1f0c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f0e, 0x1f88, 0, 0 }, - { 0x1f0b, 0x1f0d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f0f, 0x1f89, 0, 0 }, - { 0x1f12, 0x1f14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1f13, 0x1f15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1f1a, 0x1f1c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1f1b, 0x1f1d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1f22, 0x1f24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f26, 0x1f90, 0, 0 }, - { 0x1f23, 0x1f25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f27, 0x1f91, 0, 0 }, - { 0x1f2a, 0x1f2c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f2e, 0x1f98, 0, 0 }, - { 0x1f2b, 0x1f2d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f2f, 0x1f99, 0, 0 }, - { 0x1f32, 0x1f34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f36, 0, 0, 0 }, - { 0x1f33, 0x1f35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f37, 0, 0, 0 }, - { 0x1f3a, 0x1f3c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f3e, 0, 0, 0 }, - { 0x1f3b, 0x1f3d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f3f, 0, 0, 0 }, - { 0x1f42, 0x1f44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1f43, 0x1f45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1f4a, 0x1f4c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1f4b, 0x1f4d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0x1f52, 0x1f54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f56, 0, 0, 0 }, - { 0x1f53, 0x1f55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f57, 0, 0, 0 }, - { 0x1f5b, 0x1f5d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f5f, 0, 0, 0 }, - { 0x1f62, 0x1f64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f66, 0x1fa0, 0, 0 }, - { 0x1f63, 0x1f65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f67, 0x1fa1, 0, 0 }, - { 0x1f6a, 0x1f6c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f6e, 0x1fa8, 0, 0 }, - { 0x1f6b, 0x1f6d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f6f, 0x1fa9, 0, 0 }, - { 0x1fcd, 0x1fce, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fcf, 0, 0, 0 }, - { 0x1fdd, 0x1fde, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fdf, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3070, 0x3071 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3073, 0x3074 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3076, 0x3077 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3079, 0x307a }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x307c, 0x307d }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d0, 0x30d1 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d3, 0x30d4 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d6, 0x30d7 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d9, 0x30da }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30dc, 0x30dd } -}; diff --git a/3rdParty/LibIDN/src/gunidecomp.h b/3rdParty/LibIDN/src/gunidecomp.h deleted file mode 100644 index 1c48c21..0000000 --- a/3rdParty/LibIDN/src/gunidecomp.h +++ /dev/null @@ -1,10363 +0,0 @@ -/* This file is automatically generated. DO NOT EDIT! - Instead, edit gen-unicode-tables.pl and re-run. */ - -#ifndef DECOMP_H -#define DECOMP_H - -#define G_UNICODE_LAST_CHAR 0x10ffff - -#define G_UNICODE_MAX_TABLE_INDEX (0x110000 / 256) - -#define G_UNICODE_LAST_CHAR_PART1 0x2FAFF - -#define G_UNICODE_LAST_PAGE_PART1 762 - -#define G_UNICODE_NOT_PRESENT_OFFSET 65535 - -static const guchar cclass_data[][256] = { - { /* page 3, index 0 */ - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 232, 220, 220, 220, 220, 232, 216, - 220, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, 202, 202, 220, - 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 1, 1, 1, 1, 1, 220, - 220, 220, 220, 230, 230, 230, 230, 230, 230, 230, 230, 240, 230, 220, - 220, 220, 230, 230, 230, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 234, 234, 233, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0 - }, - { /* page 4, index 1 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 5, index 2 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 220, 230, 230, 230, 230, 220, 230, 230, 230, 222, 220, 230, 230, 230, - 230, 230, 230, 0, 220, 220, 220, 220, 220, 230, 230, 220, 230, 230, 222, - 228, 230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 20, 21, 22, 0, 23, - 0, 24, 25, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 6, index 3 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 230, 230, 220, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 0, 230, 230, 230, 230, 220, - 230, 0, 0, 230, 230, 0, 220, 230, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 7, index 4 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 220, 230, 230, 220, 230, 230, 220, 220, 220, 230, 220, 220, 230, - 220, 230, 230, 230, 220, 230, 220, 230, 220, 230, 220, 230, 230, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 9, index 5 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 10, index 6 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 11, index 7 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 12, index 8 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 84, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 13, index 9 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 14, index 10 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 103, 103, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 118, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 122, 122, 122, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 15, index 11 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 220, 0, 220, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, - 132, 0, 0, 0, 0, 0, 130, 130, 130, 130, 0, 0, 130, 0, 230, 230, 9, 0, - 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 - }, - { /* page 16, index 12 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 23, index 13 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 24, index 14 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 32, index 15 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 1, 1, 230, 230, - 230, 230, 1, 1, 1, 230, 230, 0, 0, 0, 0, 230, 0, 0, 0, 1, 1, 230, 220, - 230, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 48, index 16 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 228, 232, 222, - 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 251, index 17 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 254, index 18 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }, - { /* page 465, index 19 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 216, 216, 1, 1, 1, 0, 0, 0, 226, 216, 216, 216, 216, 216, - 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 220, 220, 220, 220, 220, 0, 0, - 230, 230, 230, 230, 230, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0 - } -}; - -static const gint16 combining_class_table_part1[763] = { - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 /* page 3 */, - 1 /* page 4 */, - 2 /* page 5 */, - 3 /* page 6 */, - 4 /* page 7 */, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 5 /* page 9 */, - 6 /* page 10 */, - 7 /* page 11 */, - 8 /* page 12 */, - 9 /* page 13 */, - 10 /* page 14 */, - 11 /* page 15 */, - 12 /* page 16 */, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 13 /* page 23 */, - 14 /* page 24 */, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 15 /* page 32 */, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 16 /* page 48 */, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 17 /* page 251 */, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 18 /* page 254 */, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 19 /* page 465 */, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX -}; - -static const gint16 combining_class_table_part2[768] = { - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX, - 0 + G_UNICODE_MAX_TABLE_INDEX -}; - -typedef struct -{ - gunichar ch; - guint16 canon_offset; - guint16 compat_offset; -} decomposition; - -static const decomposition decomp_table[] = -{ - { 0x00a0, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, - { 0x00a8, G_UNICODE_NOT_PRESENT_OFFSET, 2 }, - { 0x00aa, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, - { 0x00af, G_UNICODE_NOT_PRESENT_OFFSET, 8 }, - { 0x00b2, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, - { 0x00b3, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, - { 0x00b4, G_UNICODE_NOT_PRESENT_OFFSET, 16 }, - { 0x00b5, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, - { 0x00b8, G_UNICODE_NOT_PRESENT_OFFSET, 23 }, - { 0x00b9, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, - { 0x00ba, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, - { 0x00bc, G_UNICODE_NOT_PRESENT_OFFSET, 31 }, - { 0x00bd, G_UNICODE_NOT_PRESENT_OFFSET, 37 }, - { 0x00be, G_UNICODE_NOT_PRESENT_OFFSET, 43 }, - { 0x00c0, 49, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00c1, 53, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00c2, 57, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00c3, 61, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00c4, 65, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00c5, 69, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00c7, 73, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00c8, 77, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00c9, 81, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00ca, 85, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00cb, 89, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00cc, 93, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00cd, 97, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00ce, 101, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00cf, 105, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00d1, 109, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00d2, 113, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00d3, 117, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00d4, 121, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00d5, 125, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00d6, 129, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00d9, 133, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00da, 137, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00db, 141, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00dc, 145, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00dd, 149, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00e0, 153, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00e1, 157, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00e2, 161, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00e3, 165, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00e4, 169, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00e5, 173, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00e7, 177, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00e8, 181, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00e9, 185, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00ea, 189, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00eb, 193, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00ec, 197, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00ed, 201, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00ee, 205, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00ef, 209, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00f1, 213, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00f2, 217, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00f3, 221, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00f4, 225, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00f5, 229, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00f6, 233, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00f9, 237, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00fa, 241, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00fb, 245, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00fc, 249, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00fd, 253, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x00ff, 257, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0100, 261, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0101, 265, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0102, 269, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0103, 273, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0104, 277, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0105, 281, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0106, 285, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0107, 289, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0108, 293, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0109, 297, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x010a, 301, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x010b, 305, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x010c, 309, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x010d, 313, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x010e, 317, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x010f, 321, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0112, 325, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0113, 329, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0114, 333, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0115, 337, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0116, 341, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0117, 345, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0118, 349, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0119, 353, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x011a, 357, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x011b, 361, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x011c, 365, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x011d, 369, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x011e, 373, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x011f, 377, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0120, 381, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0121, 385, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0122, 389, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0123, 393, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0124, 397, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0125, 401, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0128, 405, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0129, 409, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x012a, 413, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x012b, 417, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x012c, 421, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x012d, 425, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x012e, 429, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x012f, 433, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0130, 437, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0132, G_UNICODE_NOT_PRESENT_OFFSET, 441 }, - { 0x0133, G_UNICODE_NOT_PRESENT_OFFSET, 444 }, - { 0x0134, 447, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0135, 451, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0136, 455, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0137, 459, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0139, 463, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x013a, 467, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x013b, 471, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x013c, 475, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x013d, 479, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x013e, 483, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x013f, G_UNICODE_NOT_PRESENT_OFFSET, 487 }, - { 0x0140, G_UNICODE_NOT_PRESENT_OFFSET, 491 }, - { 0x0143, 495, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0144, 499, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0145, 503, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0146, 507, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0147, 511, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0148, 515, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0149, G_UNICODE_NOT_PRESENT_OFFSET, 519 }, - { 0x014c, 523, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x014d, 527, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x014e, 531, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x014f, 535, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0150, 539, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0151, 543, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0154, 547, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0155, 551, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0156, 555, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0157, 559, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0158, 563, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0159, 567, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x015a, 571, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x015b, 575, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x015c, 579, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x015d, 583, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x015e, 587, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x015f, 591, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0160, 595, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0161, 599, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0162, 603, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0163, 607, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0164, 611, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0165, 615, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0168, 619, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0169, 623, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x016a, 627, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x016b, 631, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x016c, 635, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x016d, 639, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x016e, 643, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x016f, 647, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0170, 651, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0171, 655, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0172, 659, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0173, 663, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0174, 667, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0175, 671, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0176, 675, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0177, 679, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0178, 683, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0179, 687, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x017a, 691, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x017b, 695, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x017c, 699, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x017d, 703, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x017e, 707, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x017f, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, - { 0x01a0, 713, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01a1, 717, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01af, 721, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01b0, 725, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01c4, G_UNICODE_NOT_PRESENT_OFFSET, 729 }, - { 0x01c5, G_UNICODE_NOT_PRESENT_OFFSET, 734 }, - { 0x01c6, G_UNICODE_NOT_PRESENT_OFFSET, 739 }, - { 0x01c7, G_UNICODE_NOT_PRESENT_OFFSET, 744 }, - { 0x01c8, G_UNICODE_NOT_PRESENT_OFFSET, 747 }, - { 0x01c9, G_UNICODE_NOT_PRESENT_OFFSET, 750 }, - { 0x01ca, G_UNICODE_NOT_PRESENT_OFFSET, 753 }, - { 0x01cb, G_UNICODE_NOT_PRESENT_OFFSET, 756 }, - { 0x01cc, G_UNICODE_NOT_PRESENT_OFFSET, 759 }, - { 0x01cd, 762, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01ce, 766, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01cf, 770, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01d0, 774, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01d1, 778, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01d2, 782, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01d3, 786, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01d4, 790, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01d5, 794, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01d6, 800, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01d7, 806, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01d8, 812, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01d9, 818, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01da, 824, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01db, 830, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01dc, 836, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01de, 842, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01df, 848, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01e0, 854, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01e1, 860, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01e2, 866, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01e3, 871, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01e6, 876, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01e7, 880, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01e8, 884, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01e9, 888, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01ea, 892, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01eb, 896, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01ec, 900, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01ed, 906, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01ee, 912, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01ef, 917, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01f0, 922, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01f1, G_UNICODE_NOT_PRESENT_OFFSET, 926 }, - { 0x01f2, G_UNICODE_NOT_PRESENT_OFFSET, 929 }, - { 0x01f3, G_UNICODE_NOT_PRESENT_OFFSET, 932 }, - { 0x01f4, 935, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01f5, 939, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01f8, 943, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01f9, 947, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01fa, 951, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01fb, 957, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01fc, 963, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01fd, 968, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01fe, 973, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x01ff, 978, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0200, 983, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0201, 987, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0202, 991, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0203, 995, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0204, 999, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0205, 1003, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0206, 1007, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0207, 1011, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0208, 1015, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0209, 1019, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x020a, 1023, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x020b, 1027, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x020c, 1031, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x020d, 1035, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x020e, 1039, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x020f, 1043, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0210, 1047, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0211, 1051, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0212, 1055, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0213, 1059, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0214, 1063, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0215, 1067, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0216, 1071, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0217, 1075, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0218, 1079, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0219, 1083, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x021a, 1087, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x021b, 1091, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x021e, 1095, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x021f, 1099, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0226, 1103, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0227, 1107, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0228, 1111, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0229, 1115, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x022a, 1119, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x022b, 1125, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x022c, 1131, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x022d, 1137, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x022e, 1143, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x022f, 1147, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0230, 1151, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0231, 1157, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0232, 1163, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0233, 1167, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x02b0, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, - { 0x02b1, G_UNICODE_NOT_PRESENT_OFFSET, 1173 }, - { 0x02b2, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, - { 0x02b3, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, - { 0x02b4, G_UNICODE_NOT_PRESENT_OFFSET, 1180 }, - { 0x02b5, G_UNICODE_NOT_PRESENT_OFFSET, 1183 }, - { 0x02b6, G_UNICODE_NOT_PRESENT_OFFSET, 1186 }, - { 0x02b7, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, - { 0x02b8, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, - { 0x02d8, G_UNICODE_NOT_PRESENT_OFFSET, 1193 }, - { 0x02d9, G_UNICODE_NOT_PRESENT_OFFSET, 1197 }, - { 0x02da, G_UNICODE_NOT_PRESENT_OFFSET, 1201 }, - { 0x02db, G_UNICODE_NOT_PRESENT_OFFSET, 1205 }, - { 0x02dc, G_UNICODE_NOT_PRESENT_OFFSET, 1209 }, - { 0x02dd, G_UNICODE_NOT_PRESENT_OFFSET, 1213 }, - { 0x02e0, G_UNICODE_NOT_PRESENT_OFFSET, 1217 }, - { 0x02e1, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, - { 0x02e2, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, - { 0x02e3, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, - { 0x02e4, G_UNICODE_NOT_PRESENT_OFFSET, 1224 }, - { 0x0340, 1227, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0341, 1230, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0343, 1233, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0344, 1236, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0374, 1241, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x037a, G_UNICODE_NOT_PRESENT_OFFSET, 1244 }, - { 0x037e, 1248, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0384, G_UNICODE_NOT_PRESENT_OFFSET, 16 }, - { 0x0385, 1250, 1255 }, - { 0x0386, 1261, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0387, 1266, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0388, 1269, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0389, 1274, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x038a, 1279, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x038c, 1284, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x038e, 1289, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x038f, 1294, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0390, 1299, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x03aa, 1306, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x03ab, 1311, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x03ac, 1316, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x03ad, 1321, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x03ae, 1326, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x03af, 1331, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x03b0, 1336, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x03ca, 1343, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x03cb, 1348, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x03cc, 1353, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x03cd, 1358, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x03ce, 1363, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x03d0, G_UNICODE_NOT_PRESENT_OFFSET, 1368 }, - { 0x03d1, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, - { 0x03d2, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, - { 0x03d3, 1377, 1289 }, - { 0x03d4, 1382, 1311 }, - { 0x03d5, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, - { 0x03d6, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, - { 0x03f0, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, - { 0x03f1, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, - { 0x03f2, G_UNICODE_NOT_PRESENT_OFFSET, 1399 }, - { 0x03f4, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, - { 0x03f5, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, - { 0x0400, 1408, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0401, 1413, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0403, 1418, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0407, 1423, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x040c, 1428, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x040d, 1433, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x040e, 1438, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0419, 1443, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0439, 1448, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0450, 1453, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0451, 1458, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0453, 1463, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0457, 1468, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x045c, 1473, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x045d, 1478, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x045e, 1483, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0476, 1488, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0477, 1493, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04c1, 1498, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04c2, 1503, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04d0, 1508, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04d1, 1513, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04d2, 1518, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04d3, 1523, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04d6, 1528, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04d7, 1533, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04da, 1538, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04db, 1543, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04dc, 1548, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04dd, 1553, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04de, 1558, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04df, 1563, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04e2, 1568, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04e3, 1573, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04e4, 1578, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04e5, 1583, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04e6, 1588, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04e7, 1593, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04ea, 1598, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04eb, 1603, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04ec, 1608, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04ed, 1613, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04ee, 1618, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04ef, 1623, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04f0, 1628, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04f1, 1633, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04f2, 1638, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04f3, 1643, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04f4, 1648, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04f5, 1653, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04f8, 1658, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x04f9, 1663, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0587, G_UNICODE_NOT_PRESENT_OFFSET, 1668 }, - { 0x0622, 1673, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0623, 1678, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0624, 1683, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0625, 1688, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0626, 1693, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0675, G_UNICODE_NOT_PRESENT_OFFSET, 1698 }, - { 0x0676, G_UNICODE_NOT_PRESENT_OFFSET, 1703 }, - { 0x0677, G_UNICODE_NOT_PRESENT_OFFSET, 1708 }, - { 0x0678, G_UNICODE_NOT_PRESENT_OFFSET, 1713 }, - { 0x06c0, 1718, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x06c2, 1723, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x06d3, 1728, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0929, 1733, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0931, 1740, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0934, 1747, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0958, 1754, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0959, 1761, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x095a, 1768, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x095b, 1775, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x095c, 1782, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x095d, 1789, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x095e, 1796, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x095f, 1803, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x09cb, 1810, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x09cc, 1817, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x09dc, 1824, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x09dd, 1831, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x09df, 1838, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0a33, 1845, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0a36, 1852, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0a59, 1859, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0a5a, 1866, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0a5b, 1873, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0a5e, 1880, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0b48, 1887, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0b4b, 1894, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0b4c, 1901, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0b5c, 1908, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0b5d, 1915, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0b94, 1922, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0bca, 1929, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0bcb, 1936, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0bcc, 1943, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0c48, 1950, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0cc0, 1957, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0cc7, 1964, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0cc8, 1971, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0cca, 1978, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0ccb, 1985, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0d4a, 1995, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0d4b, 2002, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0d4c, 2009, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0dda, 2016, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0ddc, 2023, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0ddd, 2030, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0dde, 2040, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0e33, G_UNICODE_NOT_PRESENT_OFFSET, 2047 }, - { 0x0eb3, G_UNICODE_NOT_PRESENT_OFFSET, 2054 }, - { 0x0edc, G_UNICODE_NOT_PRESENT_OFFSET, 2061 }, - { 0x0edd, G_UNICODE_NOT_PRESENT_OFFSET, 2068 }, - { 0x0f0c, G_UNICODE_NOT_PRESENT_OFFSET, 2075 }, - { 0x0f43, 2079, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0f4d, 2086, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0f52, 2093, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0f57, 2100, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0f5c, 2107, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0f69, 2114, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0f73, 2121, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0f75, 2128, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0f76, 2135, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0f77, G_UNICODE_NOT_PRESENT_OFFSET, 2142 }, - { 0x0f78, 2152, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0f79, G_UNICODE_NOT_PRESENT_OFFSET, 2159 }, - { 0x0f81, 2169, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0f93, 2176, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0f9d, 2183, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0fa2, 2190, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0fa7, 2197, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0fac, 2204, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x0fb9, 2211, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1026, 2218, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e00, 2225, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e01, 2229, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e02, 2233, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e03, 2237, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e04, 2241, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e05, 2245, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e06, 2249, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e07, 2253, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e08, 2257, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e09, 2263, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e0a, 2269, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e0b, 2273, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e0c, 2277, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e0d, 2281, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e0e, 2285, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e0f, 2289, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e10, 2293, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e11, 2297, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e12, 2301, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e13, 2305, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e14, 2309, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e15, 2315, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e16, 2321, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e17, 2327, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e18, 2333, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e19, 2337, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e1a, 2341, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e1b, 2345, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e1c, 2349, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e1d, 2355, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e1e, 2361, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e1f, 2365, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e20, 2369, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e21, 2373, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e22, 2377, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e23, 2381, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e24, 2385, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e25, 2389, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e26, 2393, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e27, 2397, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e28, 2401, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e29, 2405, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e2a, 2409, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e2b, 2413, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e2c, 2417, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e2d, 2421, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e2e, 2425, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e2f, 2431, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e30, 2437, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e31, 2441, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e32, 2445, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e33, 2449, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e34, 2453, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e35, 2457, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e36, 2461, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e37, 2465, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e38, 2469, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e39, 2475, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e3a, 2481, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e3b, 2485, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e3c, 2489, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e3d, 2493, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e3e, 2497, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e3f, 2501, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e40, 2505, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e41, 2509, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e42, 2513, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e43, 2517, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e44, 2521, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e45, 2525, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e46, 2529, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e47, 2533, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e48, 2537, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e49, 2541, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e4a, 2545, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e4b, 2549, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e4c, 2553, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e4d, 2559, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e4e, 2565, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e4f, 2571, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e50, 2577, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e51, 2583, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e52, 2589, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e53, 2595, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e54, 2601, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e55, 2605, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e56, 2609, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e57, 2613, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e58, 2617, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e59, 2621, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e5a, 2625, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e5b, 2629, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e5c, 2633, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e5d, 2639, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e5e, 2645, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e5f, 2649, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e60, 2653, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e61, 2657, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e62, 2661, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e63, 2665, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e64, 2669, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e65, 2675, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e66, 2681, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e67, 2687, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e68, 2693, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e69, 2699, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e6a, 2705, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e6b, 2709, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e6c, 2713, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e6d, 2717, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e6e, 2721, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e6f, 2725, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e70, 2729, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e71, 2733, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e72, 2737, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e73, 2741, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e74, 2745, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e75, 2749, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e76, 2753, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e77, 2757, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e78, 2761, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e79, 2767, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e7a, 2773, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e7b, 2779, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e7c, 2785, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e7d, 2789, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e7e, 2793, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e7f, 2797, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e80, 2801, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e81, 2805, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e82, 2809, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e83, 2813, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e84, 2817, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e85, 2821, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e86, 2825, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e87, 2829, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e88, 2833, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e89, 2837, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e8a, 2841, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e8b, 2845, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e8c, 2849, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e8d, 2853, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e8e, 2857, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e8f, 2861, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e90, 2865, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e91, 2869, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e92, 2873, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e93, 2877, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e94, 2881, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e95, 2885, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e96, 2889, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e97, 2893, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e98, 2897, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e99, 2901, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1e9a, G_UNICODE_NOT_PRESENT_OFFSET, 2905 }, - { 0x1e9b, 2909, 2657 }, - { 0x1ea0, 2914, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ea1, 2918, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ea2, 2922, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ea3, 2926, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ea4, 2930, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ea5, 2936, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ea6, 2942, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ea7, 2948, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ea8, 2954, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ea9, 2960, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eaa, 2966, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eab, 2972, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eac, 2978, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ead, 2984, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eae, 2990, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eaf, 2996, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eb0, 3002, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eb1, 3008, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eb2, 3014, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eb3, 3020, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eb4, 3026, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eb5, 3032, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eb6, 3038, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eb7, 3044, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eb8, 3050, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eb9, 3054, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eba, 3058, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ebb, 3062, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ebc, 3066, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ebd, 3070, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ebe, 3074, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ebf, 3080, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ec0, 3086, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ec1, 3092, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ec2, 3098, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ec3, 3104, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ec4, 3110, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ec5, 3116, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ec6, 3122, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ec7, 3128, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ec8, 3134, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ec9, 3138, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eca, 3142, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ecb, 3146, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ecc, 3150, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ecd, 3154, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ece, 3158, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ecf, 3162, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ed0, 3166, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ed1, 3172, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ed2, 3178, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ed3, 3184, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ed4, 3190, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ed5, 3196, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ed6, 3202, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ed7, 3208, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ed8, 3214, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ed9, 3220, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eda, 3226, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1edb, 3232, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1edc, 3238, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1edd, 3244, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ede, 3250, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1edf, 3256, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ee0, 3262, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ee1, 3268, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ee2, 3274, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ee3, 3280, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ee4, 3286, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ee5, 3290, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ee6, 3294, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ee7, 3298, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ee8, 3302, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ee9, 3308, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eea, 3314, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eeb, 3320, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eec, 3326, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eed, 3332, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eee, 3338, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1eef, 3344, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ef0, 3350, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ef1, 3356, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ef2, 3362, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ef3, 3366, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ef4, 3370, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ef5, 3374, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ef6, 3378, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ef7, 3382, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ef8, 3386, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ef9, 3390, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f00, 3394, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f01, 3399, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f02, 3404, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f03, 3411, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f04, 3418, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f05, 3425, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f06, 3432, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f07, 3439, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f08, 3446, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f09, 3451, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f0a, 3456, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f0b, 3463, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f0c, 3470, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f0d, 3477, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f0e, 3484, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f0f, 3491, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f10, 3498, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f11, 3503, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f12, 3508, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f13, 3515, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f14, 3522, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f15, 3529, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f18, 3536, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f19, 3541, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f1a, 3546, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f1b, 3553, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f1c, 3560, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f1d, 3567, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f20, 3574, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f21, 3579, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f22, 3584, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f23, 3591, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f24, 3598, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f25, 3605, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f26, 3612, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f27, 3619, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f28, 3626, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f29, 3631, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f2a, 3636, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f2b, 3643, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f2c, 3650, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f2d, 3657, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f2e, 3664, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f2f, 3671, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f30, 3678, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f31, 3683, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f32, 3688, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f33, 3695, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f34, 3702, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f35, 3709, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f36, 3716, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f37, 3723, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f38, 3730, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f39, 3735, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f3a, 3740, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f3b, 3747, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f3c, 3754, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f3d, 3761, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f3e, 3768, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f3f, 3775, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f40, 3782, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f41, 3787, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f42, 3792, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f43, 3799, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f44, 3806, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f45, 3813, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f48, 3820, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f49, 3825, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f4a, 3830, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f4b, 3837, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f4c, 3844, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f4d, 3851, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f50, 3858, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f51, 3863, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f52, 3868, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f53, 3875, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f54, 3882, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f55, 3889, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f56, 3896, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f57, 3903, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f59, 3910, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f5b, 3915, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f5d, 3922, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f5f, 3929, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f60, 3936, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f61, 3941, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f62, 3946, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f63, 3953, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f64, 3960, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f65, 3967, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f66, 3974, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f67, 3981, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f68, 3988, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f69, 3993, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f6a, 3998, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f6b, 4005, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f6c, 4012, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f6d, 4019, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f6e, 4026, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f6f, 4033, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f70, 4040, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f71, 1316, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f72, 4045, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f73, 1321, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f74, 4050, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f75, 1326, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f76, 4055, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f77, 1331, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f78, 4060, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f79, 1353, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f7a, 4065, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f7b, 1358, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f7c, 4070, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f7d, 1363, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f80, 4075, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f81, 4082, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f82, 4089, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f83, 4098, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f84, 4107, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f85, 4116, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f86, 4125, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f87, 4134, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f88, 4143, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f89, 4150, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f8a, 4157, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f8b, 4166, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f8c, 4175, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f8d, 4184, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f8e, 4193, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f8f, 4202, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f90, 4211, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f91, 4218, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f92, 4225, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f93, 4234, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f94, 4243, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f95, 4252, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f96, 4261, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f97, 4270, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f98, 4279, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f99, 4286, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f9a, 4293, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f9b, 4302, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f9c, 4311, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f9d, 4320, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f9e, 4329, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1f9f, 4338, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fa0, 4347, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fa1, 4354, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fa2, 4361, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fa3, 4370, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fa4, 4379, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fa5, 4388, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fa6, 4397, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fa7, 4406, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fa8, 4415, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fa9, 4422, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1faa, 4429, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fab, 4438, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fac, 4447, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fad, 4456, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fae, 4465, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1faf, 4474, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fb0, 4483, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fb1, 4488, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fb2, 4493, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fb3, 4500, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fb4, 4505, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fb6, 4512, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fb7, 4517, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fb8, 4524, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fb9, 4529, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fba, 4534, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fbb, 1261, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fbc, 4539, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fbd, G_UNICODE_NOT_PRESENT_OFFSET, 4544 }, - { 0x1fbe, 4548, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fbf, G_UNICODE_NOT_PRESENT_OFFSET, 4544 }, - { 0x1fc0, G_UNICODE_NOT_PRESENT_OFFSET, 4551 }, - { 0x1fc1, 4555, 4560 }, - { 0x1fc2, 4566, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fc3, 4573, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fc4, 4578, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fc6, 4585, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fc7, 4590, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fc8, 4597, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fc9, 1269, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fca, 4602, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fcb, 1274, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fcc, 4607, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fcd, 4612, 4618 }, - { 0x1fce, 4624, 4630 }, - { 0x1fcf, 4636, 4642 }, - { 0x1fd0, 4648, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fd1, 4653, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fd2, 4658, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fd3, 1299, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fd6, 4665, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fd7, 4670, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fd8, 4677, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fd9, 4682, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fda, 4687, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fdb, 1279, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fdd, 4692, 4698 }, - { 0x1fde, 4704, 4710 }, - { 0x1fdf, 4716, 4722 }, - { 0x1fe0, 4728, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fe1, 4733, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fe2, 4738, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fe3, 1336, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fe4, 4745, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fe5, 4750, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fe6, 4755, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fe7, 4760, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fe8, 4767, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fe9, 4772, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fea, 4777, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1feb, 1289, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fec, 4782, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1fed, 4787, 4792 }, - { 0x1fee, 1250, 1255 }, - { 0x1fef, 4798, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ff2, 4800, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ff3, 4807, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ff4, 4812, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ff6, 4819, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ff7, 4824, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ff8, 4831, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ff9, 1284, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ffa, 4836, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ffb, 1294, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ffc, 4841, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1ffd, 4846, 16 }, - { 0x1ffe, G_UNICODE_NOT_PRESENT_OFFSET, 4849 }, - { 0x2000, 4853, 0 }, - { 0x2001, 4857, 0 }, - { 0x2002, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, - { 0x2003, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, - { 0x2004, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, - { 0x2005, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, - { 0x2006, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, - { 0x2007, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, - { 0x2008, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, - { 0x2009, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, - { 0x200a, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, - { 0x2011, G_UNICODE_NOT_PRESENT_OFFSET, 4861 }, - { 0x2017, G_UNICODE_NOT_PRESENT_OFFSET, 4865 }, - { 0x2024, G_UNICODE_NOT_PRESENT_OFFSET, 4869 }, - { 0x2025, G_UNICODE_NOT_PRESENT_OFFSET, 4871 }, - { 0x2026, G_UNICODE_NOT_PRESENT_OFFSET, 4874 }, - { 0x202f, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, - { 0x2033, G_UNICODE_NOT_PRESENT_OFFSET, 4878 }, - { 0x2034, G_UNICODE_NOT_PRESENT_OFFSET, 4885 }, - { 0x2036, G_UNICODE_NOT_PRESENT_OFFSET, 4895 }, - { 0x2037, G_UNICODE_NOT_PRESENT_OFFSET, 4902 }, - { 0x203c, G_UNICODE_NOT_PRESENT_OFFSET, 4912 }, - { 0x203e, G_UNICODE_NOT_PRESENT_OFFSET, 4915 }, - { 0x2047, G_UNICODE_NOT_PRESENT_OFFSET, 4919 }, - { 0x2048, G_UNICODE_NOT_PRESENT_OFFSET, 4922 }, - { 0x2049, G_UNICODE_NOT_PRESENT_OFFSET, 4925 }, - { 0x2057, G_UNICODE_NOT_PRESENT_OFFSET, 4928 }, - { 0x205f, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, - { 0x2070, G_UNICODE_NOT_PRESENT_OFFSET, 4941 }, - { 0x2071, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x2074, G_UNICODE_NOT_PRESENT_OFFSET, 4945 }, - { 0x2075, G_UNICODE_NOT_PRESENT_OFFSET, 4947 }, - { 0x2076, G_UNICODE_NOT_PRESENT_OFFSET, 4949 }, - { 0x2077, G_UNICODE_NOT_PRESENT_OFFSET, 4951 }, - { 0x2078, G_UNICODE_NOT_PRESENT_OFFSET, 4953 }, - { 0x2079, G_UNICODE_NOT_PRESENT_OFFSET, 4955 }, - { 0x207a, G_UNICODE_NOT_PRESENT_OFFSET, 4957 }, - { 0x207b, G_UNICODE_NOT_PRESENT_OFFSET, 4959 }, - { 0x207c, G_UNICODE_NOT_PRESENT_OFFSET, 4963 }, - { 0x207d, G_UNICODE_NOT_PRESENT_OFFSET, 4965 }, - { 0x207e, G_UNICODE_NOT_PRESENT_OFFSET, 4967 }, - { 0x207f, G_UNICODE_NOT_PRESENT_OFFSET, 4969 }, - { 0x2080, G_UNICODE_NOT_PRESENT_OFFSET, 4941 }, - { 0x2081, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, - { 0x2082, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, - { 0x2083, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, - { 0x2084, G_UNICODE_NOT_PRESENT_OFFSET, 4945 }, - { 0x2085, G_UNICODE_NOT_PRESENT_OFFSET, 4947 }, - { 0x2086, G_UNICODE_NOT_PRESENT_OFFSET, 4949 }, - { 0x2087, G_UNICODE_NOT_PRESENT_OFFSET, 4951 }, - { 0x2088, G_UNICODE_NOT_PRESENT_OFFSET, 4953 }, - { 0x2089, G_UNICODE_NOT_PRESENT_OFFSET, 4955 }, - { 0x208a, G_UNICODE_NOT_PRESENT_OFFSET, 4957 }, - { 0x208b, G_UNICODE_NOT_PRESENT_OFFSET, 4959 }, - { 0x208c, G_UNICODE_NOT_PRESENT_OFFSET, 4963 }, - { 0x208d, G_UNICODE_NOT_PRESENT_OFFSET, 4965 }, - { 0x208e, G_UNICODE_NOT_PRESENT_OFFSET, 4967 }, - { 0x20a8, G_UNICODE_NOT_PRESENT_OFFSET, 4971 }, - { 0x2100, G_UNICODE_NOT_PRESENT_OFFSET, 4974 }, - { 0x2101, G_UNICODE_NOT_PRESENT_OFFSET, 4978 }, - { 0x2102, G_UNICODE_NOT_PRESENT_OFFSET, 4982 }, - { 0x2103, G_UNICODE_NOT_PRESENT_OFFSET, 4984 }, - { 0x2105, G_UNICODE_NOT_PRESENT_OFFSET, 4988 }, - { 0x2106, G_UNICODE_NOT_PRESENT_OFFSET, 4992 }, - { 0x2107, G_UNICODE_NOT_PRESENT_OFFSET, 4996 }, - { 0x2109, G_UNICODE_NOT_PRESENT_OFFSET, 4999 }, - { 0x210a, G_UNICODE_NOT_PRESENT_OFFSET, 5003 }, - { 0x210b, G_UNICODE_NOT_PRESENT_OFFSET, 5005 }, - { 0x210c, G_UNICODE_NOT_PRESENT_OFFSET, 5005 }, - { 0x210d, G_UNICODE_NOT_PRESENT_OFFSET, 5005 }, - { 0x210e, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, - { 0x210f, G_UNICODE_NOT_PRESENT_OFFSET, 5007 }, - { 0x2110, G_UNICODE_NOT_PRESENT_OFFSET, 5010 }, - { 0x2111, G_UNICODE_NOT_PRESENT_OFFSET, 5010 }, - { 0x2112, G_UNICODE_NOT_PRESENT_OFFSET, 5012 }, - { 0x2113, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, - { 0x2115, G_UNICODE_NOT_PRESENT_OFFSET, 5014 }, - { 0x2116, G_UNICODE_NOT_PRESENT_OFFSET, 5016 }, - { 0x2119, G_UNICODE_NOT_PRESENT_OFFSET, 5019 }, - { 0x211a, G_UNICODE_NOT_PRESENT_OFFSET, 5021 }, - { 0x211b, G_UNICODE_NOT_PRESENT_OFFSET, 5023 }, - { 0x211c, G_UNICODE_NOT_PRESENT_OFFSET, 5023 }, - { 0x211d, G_UNICODE_NOT_PRESENT_OFFSET, 5023 }, - { 0x2120, G_UNICODE_NOT_PRESENT_OFFSET, 5025 }, - { 0x2121, G_UNICODE_NOT_PRESENT_OFFSET, 5028 }, - { 0x2122, G_UNICODE_NOT_PRESENT_OFFSET, 5032 }, - { 0x2124, G_UNICODE_NOT_PRESENT_OFFSET, 5035 }, - { 0x2126, 5037, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2128, G_UNICODE_NOT_PRESENT_OFFSET, 5035 }, - { 0x212a, 5040, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x212b, 69, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x212c, G_UNICODE_NOT_PRESENT_OFFSET, 5042 }, - { 0x212d, G_UNICODE_NOT_PRESENT_OFFSET, 4982 }, - { 0x212f, G_UNICODE_NOT_PRESENT_OFFSET, 5044 }, - { 0x2130, G_UNICODE_NOT_PRESENT_OFFSET, 5046 }, - { 0x2131, G_UNICODE_NOT_PRESENT_OFFSET, 5048 }, - { 0x2133, G_UNICODE_NOT_PRESENT_OFFSET, 5050 }, - { 0x2134, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, - { 0x2135, G_UNICODE_NOT_PRESENT_OFFSET, 5052 }, - { 0x2136, G_UNICODE_NOT_PRESENT_OFFSET, 5055 }, - { 0x2137, G_UNICODE_NOT_PRESENT_OFFSET, 5058 }, - { 0x2138, G_UNICODE_NOT_PRESENT_OFFSET, 5061 }, - { 0x2139, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x213d, G_UNICODE_NOT_PRESENT_OFFSET, 5064 }, - { 0x213e, G_UNICODE_NOT_PRESENT_OFFSET, 5067 }, - { 0x213f, G_UNICODE_NOT_PRESENT_OFFSET, 5070 }, - { 0x2140, G_UNICODE_NOT_PRESENT_OFFSET, 5073 }, - { 0x2145, G_UNICODE_NOT_PRESENT_OFFSET, 5077 }, - { 0x2146, G_UNICODE_NOT_PRESENT_OFFSET, 5079 }, - { 0x2147, G_UNICODE_NOT_PRESENT_OFFSET, 5044 }, - { 0x2148, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x2149, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, - { 0x2153, G_UNICODE_NOT_PRESENT_OFFSET, 5081 }, - { 0x2154, G_UNICODE_NOT_PRESENT_OFFSET, 5087 }, - { 0x2155, G_UNICODE_NOT_PRESENT_OFFSET, 5093 }, - { 0x2156, G_UNICODE_NOT_PRESENT_OFFSET, 5099 }, - { 0x2157, G_UNICODE_NOT_PRESENT_OFFSET, 5105 }, - { 0x2158, G_UNICODE_NOT_PRESENT_OFFSET, 5111 }, - { 0x2159, G_UNICODE_NOT_PRESENT_OFFSET, 5117 }, - { 0x215a, G_UNICODE_NOT_PRESENT_OFFSET, 5123 }, - { 0x215b, G_UNICODE_NOT_PRESENT_OFFSET, 5129 }, - { 0x215c, G_UNICODE_NOT_PRESENT_OFFSET, 5135 }, - { 0x215d, G_UNICODE_NOT_PRESENT_OFFSET, 5141 }, - { 0x215e, G_UNICODE_NOT_PRESENT_OFFSET, 5147 }, - { 0x215f, G_UNICODE_NOT_PRESENT_OFFSET, 5153 }, - { 0x2160, G_UNICODE_NOT_PRESENT_OFFSET, 5010 }, - { 0x2161, G_UNICODE_NOT_PRESENT_OFFSET, 5158 }, - { 0x2162, G_UNICODE_NOT_PRESENT_OFFSET, 5161 }, - { 0x2163, G_UNICODE_NOT_PRESENT_OFFSET, 5165 }, - { 0x2164, G_UNICODE_NOT_PRESENT_OFFSET, 5168 }, - { 0x2165, G_UNICODE_NOT_PRESENT_OFFSET, 5170 }, - { 0x2166, G_UNICODE_NOT_PRESENT_OFFSET, 5173 }, - { 0x2167, G_UNICODE_NOT_PRESENT_OFFSET, 5177 }, - { 0x2168, G_UNICODE_NOT_PRESENT_OFFSET, 5182 }, - { 0x2169, G_UNICODE_NOT_PRESENT_OFFSET, 5185 }, - { 0x216a, G_UNICODE_NOT_PRESENT_OFFSET, 5187 }, - { 0x216b, G_UNICODE_NOT_PRESENT_OFFSET, 5190 }, - { 0x216c, G_UNICODE_NOT_PRESENT_OFFSET, 5012 }, - { 0x216d, G_UNICODE_NOT_PRESENT_OFFSET, 4982 }, - { 0x216e, G_UNICODE_NOT_PRESENT_OFFSET, 5077 }, - { 0x216f, G_UNICODE_NOT_PRESENT_OFFSET, 5050 }, - { 0x2170, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x2171, G_UNICODE_NOT_PRESENT_OFFSET, 5194 }, - { 0x2172, G_UNICODE_NOT_PRESENT_OFFSET, 5197 }, - { 0x2173, G_UNICODE_NOT_PRESENT_OFFSET, 5201 }, - { 0x2174, G_UNICODE_NOT_PRESENT_OFFSET, 5204 }, - { 0x2175, G_UNICODE_NOT_PRESENT_OFFSET, 5206 }, - { 0x2176, G_UNICODE_NOT_PRESENT_OFFSET, 5209 }, - { 0x2177, G_UNICODE_NOT_PRESENT_OFFSET, 5213 }, - { 0x2178, G_UNICODE_NOT_PRESENT_OFFSET, 5218 }, - { 0x2179, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, - { 0x217a, G_UNICODE_NOT_PRESENT_OFFSET, 5221 }, - { 0x217b, G_UNICODE_NOT_PRESENT_OFFSET, 5224 }, - { 0x217c, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, - { 0x217d, G_UNICODE_NOT_PRESENT_OFFSET, 5228 }, - { 0x217e, G_UNICODE_NOT_PRESENT_OFFSET, 5079 }, - { 0x217f, G_UNICODE_NOT_PRESENT_OFFSET, 5230 }, - { 0x219a, 5232, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x219b, 5238, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x21ae, 5244, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x21cd, 5250, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x21ce, 5256, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x21cf, 5262, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2204, 5268, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2209, 5274, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x220c, 5280, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2224, 5286, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2226, 5292, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x222c, G_UNICODE_NOT_PRESENT_OFFSET, 5298 }, - { 0x222d, G_UNICODE_NOT_PRESENT_OFFSET, 5305 }, - { 0x222f, G_UNICODE_NOT_PRESENT_OFFSET, 5315 }, - { 0x2230, G_UNICODE_NOT_PRESENT_OFFSET, 5322 }, - { 0x2241, 5332, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2244, 5338, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2247, 5344, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2249, 5350, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2260, 5356, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2262, 5360, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x226d, 5366, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x226e, 5372, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x226f, 5376, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2270, 5380, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2271, 5386, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2274, 5392, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2275, 5398, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2278, 5404, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2279, 5410, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2280, 5416, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2281, 5422, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2284, 5428, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2285, 5434, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2288, 5440, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2289, 5446, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x22ac, 5452, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x22ad, 5458, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x22ae, 5464, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x22af, 5470, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x22e0, 5476, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x22e1, 5482, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x22e2, 5488, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x22e3, 5494, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x22ea, 5500, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x22eb, 5506, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x22ec, 5512, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x22ed, 5518, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2329, 5524, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x232a, 5528, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2460, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, - { 0x2461, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, - { 0x2462, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, - { 0x2463, G_UNICODE_NOT_PRESENT_OFFSET, 4945 }, - { 0x2464, G_UNICODE_NOT_PRESENT_OFFSET, 4947 }, - { 0x2465, G_UNICODE_NOT_PRESENT_OFFSET, 4949 }, - { 0x2466, G_UNICODE_NOT_PRESENT_OFFSET, 4951 }, - { 0x2467, G_UNICODE_NOT_PRESENT_OFFSET, 4953 }, - { 0x2468, G_UNICODE_NOT_PRESENT_OFFSET, 4955 }, - { 0x2469, G_UNICODE_NOT_PRESENT_OFFSET, 5532 }, - { 0x246a, G_UNICODE_NOT_PRESENT_OFFSET, 5535 }, - { 0x246b, G_UNICODE_NOT_PRESENT_OFFSET, 5538 }, - { 0x246c, G_UNICODE_NOT_PRESENT_OFFSET, 5541 }, - { 0x246d, G_UNICODE_NOT_PRESENT_OFFSET, 5544 }, - { 0x246e, G_UNICODE_NOT_PRESENT_OFFSET, 5547 }, - { 0x246f, G_UNICODE_NOT_PRESENT_OFFSET, 5550 }, - { 0x2470, G_UNICODE_NOT_PRESENT_OFFSET, 5553 }, - { 0x2471, G_UNICODE_NOT_PRESENT_OFFSET, 5556 }, - { 0x2472, G_UNICODE_NOT_PRESENT_OFFSET, 5559 }, - { 0x2473, G_UNICODE_NOT_PRESENT_OFFSET, 5562 }, - { 0x2474, G_UNICODE_NOT_PRESENT_OFFSET, 5565 }, - { 0x2475, G_UNICODE_NOT_PRESENT_OFFSET, 5569 }, - { 0x2476, G_UNICODE_NOT_PRESENT_OFFSET, 5573 }, - { 0x2477, G_UNICODE_NOT_PRESENT_OFFSET, 5577 }, - { 0x2478, G_UNICODE_NOT_PRESENT_OFFSET, 5581 }, - { 0x2479, G_UNICODE_NOT_PRESENT_OFFSET, 5585 }, - { 0x247a, G_UNICODE_NOT_PRESENT_OFFSET, 5589 }, - { 0x247b, G_UNICODE_NOT_PRESENT_OFFSET, 5593 }, - { 0x247c, G_UNICODE_NOT_PRESENT_OFFSET, 5597 }, - { 0x247d, G_UNICODE_NOT_PRESENT_OFFSET, 5601 }, - { 0x247e, G_UNICODE_NOT_PRESENT_OFFSET, 5606 }, - { 0x247f, G_UNICODE_NOT_PRESENT_OFFSET, 5611 }, - { 0x2480, G_UNICODE_NOT_PRESENT_OFFSET, 5616 }, - { 0x2481, G_UNICODE_NOT_PRESENT_OFFSET, 5621 }, - { 0x2482, G_UNICODE_NOT_PRESENT_OFFSET, 5626 }, - { 0x2483, G_UNICODE_NOT_PRESENT_OFFSET, 5631 }, - { 0x2484, G_UNICODE_NOT_PRESENT_OFFSET, 5636 }, - { 0x2485, G_UNICODE_NOT_PRESENT_OFFSET, 5641 }, - { 0x2486, G_UNICODE_NOT_PRESENT_OFFSET, 5646 }, - { 0x2487, G_UNICODE_NOT_PRESENT_OFFSET, 5651 }, - { 0x2488, G_UNICODE_NOT_PRESENT_OFFSET, 5656 }, - { 0x2489, G_UNICODE_NOT_PRESENT_OFFSET, 5659 }, - { 0x248a, G_UNICODE_NOT_PRESENT_OFFSET, 5662 }, - { 0x248b, G_UNICODE_NOT_PRESENT_OFFSET, 5665 }, - { 0x248c, G_UNICODE_NOT_PRESENT_OFFSET, 5668 }, - { 0x248d, G_UNICODE_NOT_PRESENT_OFFSET, 5671 }, - { 0x248e, G_UNICODE_NOT_PRESENT_OFFSET, 5674 }, - { 0x248f, G_UNICODE_NOT_PRESENT_OFFSET, 5677 }, - { 0x2490, G_UNICODE_NOT_PRESENT_OFFSET, 5680 }, - { 0x2491, G_UNICODE_NOT_PRESENT_OFFSET, 5683 }, - { 0x2492, G_UNICODE_NOT_PRESENT_OFFSET, 5687 }, - { 0x2493, G_UNICODE_NOT_PRESENT_OFFSET, 5691 }, - { 0x2494, G_UNICODE_NOT_PRESENT_OFFSET, 5695 }, - { 0x2495, G_UNICODE_NOT_PRESENT_OFFSET, 5699 }, - { 0x2496, G_UNICODE_NOT_PRESENT_OFFSET, 5703 }, - { 0x2497, G_UNICODE_NOT_PRESENT_OFFSET, 5707 }, - { 0x2498, G_UNICODE_NOT_PRESENT_OFFSET, 5711 }, - { 0x2499, G_UNICODE_NOT_PRESENT_OFFSET, 5715 }, - { 0x249a, G_UNICODE_NOT_PRESENT_OFFSET, 5719 }, - { 0x249b, G_UNICODE_NOT_PRESENT_OFFSET, 5723 }, - { 0x249c, G_UNICODE_NOT_PRESENT_OFFSET, 5727 }, - { 0x249d, G_UNICODE_NOT_PRESENT_OFFSET, 5731 }, - { 0x249e, G_UNICODE_NOT_PRESENT_OFFSET, 5735 }, - { 0x249f, G_UNICODE_NOT_PRESENT_OFFSET, 5739 }, - { 0x24a0, G_UNICODE_NOT_PRESENT_OFFSET, 5743 }, - { 0x24a1, G_UNICODE_NOT_PRESENT_OFFSET, 5747 }, - { 0x24a2, G_UNICODE_NOT_PRESENT_OFFSET, 5751 }, - { 0x24a3, G_UNICODE_NOT_PRESENT_OFFSET, 5755 }, - { 0x24a4, G_UNICODE_NOT_PRESENT_OFFSET, 5759 }, - { 0x24a5, G_UNICODE_NOT_PRESENT_OFFSET, 5763 }, - { 0x24a6, G_UNICODE_NOT_PRESENT_OFFSET, 5767 }, - { 0x24a7, G_UNICODE_NOT_PRESENT_OFFSET, 5771 }, - { 0x24a8, G_UNICODE_NOT_PRESENT_OFFSET, 5775 }, - { 0x24a9, G_UNICODE_NOT_PRESENT_OFFSET, 5779 }, - { 0x24aa, G_UNICODE_NOT_PRESENT_OFFSET, 5783 }, - { 0x24ab, G_UNICODE_NOT_PRESENT_OFFSET, 5787 }, - { 0x24ac, G_UNICODE_NOT_PRESENT_OFFSET, 5791 }, - { 0x24ad, G_UNICODE_NOT_PRESENT_OFFSET, 5795 }, - { 0x24ae, G_UNICODE_NOT_PRESENT_OFFSET, 5799 }, - { 0x24af, G_UNICODE_NOT_PRESENT_OFFSET, 5803 }, - { 0x24b0, G_UNICODE_NOT_PRESENT_OFFSET, 5807 }, - { 0x24b1, G_UNICODE_NOT_PRESENT_OFFSET, 5811 }, - { 0x24b2, G_UNICODE_NOT_PRESENT_OFFSET, 5815 }, - { 0x24b3, G_UNICODE_NOT_PRESENT_OFFSET, 5819 }, - { 0x24b4, G_UNICODE_NOT_PRESENT_OFFSET, 5823 }, - { 0x24b5, G_UNICODE_NOT_PRESENT_OFFSET, 5827 }, - { 0x24b6, G_UNICODE_NOT_PRESENT_OFFSET, 5831 }, - { 0x24b7, G_UNICODE_NOT_PRESENT_OFFSET, 5042 }, - { 0x24b8, G_UNICODE_NOT_PRESENT_OFFSET, 4982 }, - { 0x24b9, G_UNICODE_NOT_PRESENT_OFFSET, 5077 }, - { 0x24ba, G_UNICODE_NOT_PRESENT_OFFSET, 5046 }, - { 0x24bb, G_UNICODE_NOT_PRESENT_OFFSET, 5048 }, - { 0x24bc, G_UNICODE_NOT_PRESENT_OFFSET, 5833 }, - { 0x24bd, G_UNICODE_NOT_PRESENT_OFFSET, 5005 }, - { 0x24be, G_UNICODE_NOT_PRESENT_OFFSET, 5010 }, - { 0x24bf, G_UNICODE_NOT_PRESENT_OFFSET, 5835 }, - { 0x24c0, G_UNICODE_NOT_PRESENT_OFFSET, 5040 }, - { 0x24c1, G_UNICODE_NOT_PRESENT_OFFSET, 5012 }, - { 0x24c2, G_UNICODE_NOT_PRESENT_OFFSET, 5050 }, - { 0x24c3, G_UNICODE_NOT_PRESENT_OFFSET, 5014 }, - { 0x24c4, G_UNICODE_NOT_PRESENT_OFFSET, 5837 }, - { 0x24c5, G_UNICODE_NOT_PRESENT_OFFSET, 5019 }, - { 0x24c6, G_UNICODE_NOT_PRESENT_OFFSET, 5021 }, - { 0x24c7, G_UNICODE_NOT_PRESENT_OFFSET, 5023 }, - { 0x24c8, G_UNICODE_NOT_PRESENT_OFFSET, 5839 }, - { 0x24c9, G_UNICODE_NOT_PRESENT_OFFSET, 5841 }, - { 0x24ca, G_UNICODE_NOT_PRESENT_OFFSET, 5843 }, - { 0x24cb, G_UNICODE_NOT_PRESENT_OFFSET, 5168 }, - { 0x24cc, G_UNICODE_NOT_PRESENT_OFFSET, 5845 }, - { 0x24cd, G_UNICODE_NOT_PRESENT_OFFSET, 5185 }, - { 0x24ce, G_UNICODE_NOT_PRESENT_OFFSET, 5847 }, - { 0x24cf, G_UNICODE_NOT_PRESENT_OFFSET, 5035 }, - { 0x24d0, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, - { 0x24d1, G_UNICODE_NOT_PRESENT_OFFSET, 5849 }, - { 0x24d2, G_UNICODE_NOT_PRESENT_OFFSET, 5228 }, - { 0x24d3, G_UNICODE_NOT_PRESENT_OFFSET, 5079 }, - { 0x24d4, G_UNICODE_NOT_PRESENT_OFFSET, 5044 }, - { 0x24d5, G_UNICODE_NOT_PRESENT_OFFSET, 5851 }, - { 0x24d6, G_UNICODE_NOT_PRESENT_OFFSET, 5003 }, - { 0x24d7, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, - { 0x24d8, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x24d9, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, - { 0x24da, G_UNICODE_NOT_PRESENT_OFFSET, 5853 }, - { 0x24db, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, - { 0x24dc, G_UNICODE_NOT_PRESENT_OFFSET, 5230 }, - { 0x24dd, G_UNICODE_NOT_PRESENT_OFFSET, 4969 }, - { 0x24de, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, - { 0x24df, G_UNICODE_NOT_PRESENT_OFFSET, 5855 }, - { 0x24e0, G_UNICODE_NOT_PRESENT_OFFSET, 5857 }, - { 0x24e1, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, - { 0x24e2, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, - { 0x24e3, G_UNICODE_NOT_PRESENT_OFFSET, 5859 }, - { 0x24e4, G_UNICODE_NOT_PRESENT_OFFSET, 5861 }, - { 0x24e5, G_UNICODE_NOT_PRESENT_OFFSET, 5204 }, - { 0x24e6, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, - { 0x24e7, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, - { 0x24e8, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, - { 0x24e9, G_UNICODE_NOT_PRESENT_OFFSET, 5863 }, - { 0x24ea, G_UNICODE_NOT_PRESENT_OFFSET, 4941 }, - { 0x2a0c, G_UNICODE_NOT_PRESENT_OFFSET, 5865 }, - { 0x2a74, G_UNICODE_NOT_PRESENT_OFFSET, 5878 }, - { 0x2a75, G_UNICODE_NOT_PRESENT_OFFSET, 5882 }, - { 0x2a76, G_UNICODE_NOT_PRESENT_OFFSET, 5885 }, - { 0x2adc, 5889, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2e9f, G_UNICODE_NOT_PRESENT_OFFSET, 5895 }, - { 0x2ef3, G_UNICODE_NOT_PRESENT_OFFSET, 5899 }, - { 0x2f00, G_UNICODE_NOT_PRESENT_OFFSET, 5903 }, - { 0x2f01, G_UNICODE_NOT_PRESENT_OFFSET, 5907 }, - { 0x2f02, G_UNICODE_NOT_PRESENT_OFFSET, 5911 }, - { 0x2f03, G_UNICODE_NOT_PRESENT_OFFSET, 5915 }, - { 0x2f04, G_UNICODE_NOT_PRESENT_OFFSET, 5919 }, - { 0x2f05, G_UNICODE_NOT_PRESENT_OFFSET, 5923 }, - { 0x2f06, G_UNICODE_NOT_PRESENT_OFFSET, 5927 }, - { 0x2f07, G_UNICODE_NOT_PRESENT_OFFSET, 5931 }, - { 0x2f08, G_UNICODE_NOT_PRESENT_OFFSET, 5935 }, - { 0x2f09, G_UNICODE_NOT_PRESENT_OFFSET, 5939 }, - { 0x2f0a, G_UNICODE_NOT_PRESENT_OFFSET, 5943 }, - { 0x2f0b, G_UNICODE_NOT_PRESENT_OFFSET, 5947 }, - { 0x2f0c, G_UNICODE_NOT_PRESENT_OFFSET, 5951 }, - { 0x2f0d, G_UNICODE_NOT_PRESENT_OFFSET, 5955 }, - { 0x2f0e, G_UNICODE_NOT_PRESENT_OFFSET, 5959 }, - { 0x2f0f, G_UNICODE_NOT_PRESENT_OFFSET, 5963 }, - { 0x2f10, G_UNICODE_NOT_PRESENT_OFFSET, 5967 }, - { 0x2f11, G_UNICODE_NOT_PRESENT_OFFSET, 5971 }, - { 0x2f12, G_UNICODE_NOT_PRESENT_OFFSET, 5975 }, - { 0x2f13, G_UNICODE_NOT_PRESENT_OFFSET, 5979 }, - { 0x2f14, G_UNICODE_NOT_PRESENT_OFFSET, 5983 }, - { 0x2f15, G_UNICODE_NOT_PRESENT_OFFSET, 5987 }, - { 0x2f16, G_UNICODE_NOT_PRESENT_OFFSET, 5991 }, - { 0x2f17, G_UNICODE_NOT_PRESENT_OFFSET, 5995 }, - { 0x2f18, G_UNICODE_NOT_PRESENT_OFFSET, 5999 }, - { 0x2f19, G_UNICODE_NOT_PRESENT_OFFSET, 6003 }, - { 0x2f1a, G_UNICODE_NOT_PRESENT_OFFSET, 6007 }, - { 0x2f1b, G_UNICODE_NOT_PRESENT_OFFSET, 6011 }, - { 0x2f1c, G_UNICODE_NOT_PRESENT_OFFSET, 6015 }, - { 0x2f1d, G_UNICODE_NOT_PRESENT_OFFSET, 6019 }, - { 0x2f1e, G_UNICODE_NOT_PRESENT_OFFSET, 6023 }, - { 0x2f1f, G_UNICODE_NOT_PRESENT_OFFSET, 6027 }, - { 0x2f20, G_UNICODE_NOT_PRESENT_OFFSET, 6031 }, - { 0x2f21, G_UNICODE_NOT_PRESENT_OFFSET, 6035 }, - { 0x2f22, G_UNICODE_NOT_PRESENT_OFFSET, 6039 }, - { 0x2f23, G_UNICODE_NOT_PRESENT_OFFSET, 6043 }, - { 0x2f24, G_UNICODE_NOT_PRESENT_OFFSET, 6047 }, - { 0x2f25, G_UNICODE_NOT_PRESENT_OFFSET, 6051 }, - { 0x2f26, G_UNICODE_NOT_PRESENT_OFFSET, 6055 }, - { 0x2f27, G_UNICODE_NOT_PRESENT_OFFSET, 6059 }, - { 0x2f28, G_UNICODE_NOT_PRESENT_OFFSET, 6063 }, - { 0x2f29, G_UNICODE_NOT_PRESENT_OFFSET, 6067 }, - { 0x2f2a, G_UNICODE_NOT_PRESENT_OFFSET, 6071 }, - { 0x2f2b, G_UNICODE_NOT_PRESENT_OFFSET, 6075 }, - { 0x2f2c, G_UNICODE_NOT_PRESENT_OFFSET, 6079 }, - { 0x2f2d, G_UNICODE_NOT_PRESENT_OFFSET, 6083 }, - { 0x2f2e, G_UNICODE_NOT_PRESENT_OFFSET, 6087 }, - { 0x2f2f, G_UNICODE_NOT_PRESENT_OFFSET, 6091 }, - { 0x2f30, G_UNICODE_NOT_PRESENT_OFFSET, 6095 }, - { 0x2f31, G_UNICODE_NOT_PRESENT_OFFSET, 6099 }, - { 0x2f32, G_UNICODE_NOT_PRESENT_OFFSET, 6103 }, - { 0x2f33, G_UNICODE_NOT_PRESENT_OFFSET, 6107 }, - { 0x2f34, G_UNICODE_NOT_PRESENT_OFFSET, 6111 }, - { 0x2f35, G_UNICODE_NOT_PRESENT_OFFSET, 6115 }, - { 0x2f36, G_UNICODE_NOT_PRESENT_OFFSET, 6119 }, - { 0x2f37, G_UNICODE_NOT_PRESENT_OFFSET, 6123 }, - { 0x2f38, G_UNICODE_NOT_PRESENT_OFFSET, 6127 }, - { 0x2f39, G_UNICODE_NOT_PRESENT_OFFSET, 6131 }, - { 0x2f3a, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, - { 0x2f3b, G_UNICODE_NOT_PRESENT_OFFSET, 6139 }, - { 0x2f3c, G_UNICODE_NOT_PRESENT_OFFSET, 6143 }, - { 0x2f3d, G_UNICODE_NOT_PRESENT_OFFSET, 6147 }, - { 0x2f3e, G_UNICODE_NOT_PRESENT_OFFSET, 6151 }, - { 0x2f3f, G_UNICODE_NOT_PRESENT_OFFSET, 6155 }, - { 0x2f40, G_UNICODE_NOT_PRESENT_OFFSET, 6159 }, - { 0x2f41, G_UNICODE_NOT_PRESENT_OFFSET, 6163 }, - { 0x2f42, G_UNICODE_NOT_PRESENT_OFFSET, 6167 }, - { 0x2f43, G_UNICODE_NOT_PRESENT_OFFSET, 6171 }, - { 0x2f44, G_UNICODE_NOT_PRESENT_OFFSET, 6175 }, - { 0x2f45, G_UNICODE_NOT_PRESENT_OFFSET, 6179 }, - { 0x2f46, G_UNICODE_NOT_PRESENT_OFFSET, 6183 }, - { 0x2f47, G_UNICODE_NOT_PRESENT_OFFSET, 6187 }, - { 0x2f48, G_UNICODE_NOT_PRESENT_OFFSET, 6191 }, - { 0x2f49, G_UNICODE_NOT_PRESENT_OFFSET, 6195 }, - { 0x2f4a, G_UNICODE_NOT_PRESENT_OFFSET, 6199 }, - { 0x2f4b, G_UNICODE_NOT_PRESENT_OFFSET, 6203 }, - { 0x2f4c, G_UNICODE_NOT_PRESENT_OFFSET, 6207 }, - { 0x2f4d, G_UNICODE_NOT_PRESENT_OFFSET, 6211 }, - { 0x2f4e, G_UNICODE_NOT_PRESENT_OFFSET, 6215 }, - { 0x2f4f, G_UNICODE_NOT_PRESENT_OFFSET, 6219 }, - { 0x2f50, G_UNICODE_NOT_PRESENT_OFFSET, 6223 }, - { 0x2f51, G_UNICODE_NOT_PRESENT_OFFSET, 6227 }, - { 0x2f52, G_UNICODE_NOT_PRESENT_OFFSET, 6231 }, - { 0x2f53, G_UNICODE_NOT_PRESENT_OFFSET, 6235 }, - { 0x2f54, G_UNICODE_NOT_PRESENT_OFFSET, 6239 }, - { 0x2f55, G_UNICODE_NOT_PRESENT_OFFSET, 6243 }, - { 0x2f56, G_UNICODE_NOT_PRESENT_OFFSET, 6247 }, - { 0x2f57, G_UNICODE_NOT_PRESENT_OFFSET, 6251 }, - { 0x2f58, G_UNICODE_NOT_PRESENT_OFFSET, 6255 }, - { 0x2f59, G_UNICODE_NOT_PRESENT_OFFSET, 6259 }, - { 0x2f5a, G_UNICODE_NOT_PRESENT_OFFSET, 6263 }, - { 0x2f5b, G_UNICODE_NOT_PRESENT_OFFSET, 6267 }, - { 0x2f5c, G_UNICODE_NOT_PRESENT_OFFSET, 6271 }, - { 0x2f5d, G_UNICODE_NOT_PRESENT_OFFSET, 6275 }, - { 0x2f5e, G_UNICODE_NOT_PRESENT_OFFSET, 6279 }, - { 0x2f5f, G_UNICODE_NOT_PRESENT_OFFSET, 6283 }, - { 0x2f60, G_UNICODE_NOT_PRESENT_OFFSET, 6287 }, - { 0x2f61, G_UNICODE_NOT_PRESENT_OFFSET, 6291 }, - { 0x2f62, G_UNICODE_NOT_PRESENT_OFFSET, 6295 }, - { 0x2f63, G_UNICODE_NOT_PRESENT_OFFSET, 6299 }, - { 0x2f64, G_UNICODE_NOT_PRESENT_OFFSET, 6303 }, - { 0x2f65, G_UNICODE_NOT_PRESENT_OFFSET, 6307 }, - { 0x2f66, G_UNICODE_NOT_PRESENT_OFFSET, 6311 }, - { 0x2f67, G_UNICODE_NOT_PRESENT_OFFSET, 6315 }, - { 0x2f68, G_UNICODE_NOT_PRESENT_OFFSET, 6319 }, - { 0x2f69, G_UNICODE_NOT_PRESENT_OFFSET, 6323 }, - { 0x2f6a, G_UNICODE_NOT_PRESENT_OFFSET, 6327 }, - { 0x2f6b, G_UNICODE_NOT_PRESENT_OFFSET, 6331 }, - { 0x2f6c, G_UNICODE_NOT_PRESENT_OFFSET, 6335 }, - { 0x2f6d, G_UNICODE_NOT_PRESENT_OFFSET, 6339 }, - { 0x2f6e, G_UNICODE_NOT_PRESENT_OFFSET, 6343 }, - { 0x2f6f, G_UNICODE_NOT_PRESENT_OFFSET, 6347 }, - { 0x2f70, G_UNICODE_NOT_PRESENT_OFFSET, 6351 }, - { 0x2f71, G_UNICODE_NOT_PRESENT_OFFSET, 6355 }, - { 0x2f72, G_UNICODE_NOT_PRESENT_OFFSET, 6359 }, - { 0x2f73, G_UNICODE_NOT_PRESENT_OFFSET, 6363 }, - { 0x2f74, G_UNICODE_NOT_PRESENT_OFFSET, 6367 }, - { 0x2f75, G_UNICODE_NOT_PRESENT_OFFSET, 6371 }, - { 0x2f76, G_UNICODE_NOT_PRESENT_OFFSET, 6375 }, - { 0x2f77, G_UNICODE_NOT_PRESENT_OFFSET, 6379 }, - { 0x2f78, G_UNICODE_NOT_PRESENT_OFFSET, 6383 }, - { 0x2f79, G_UNICODE_NOT_PRESENT_OFFSET, 6387 }, - { 0x2f7a, G_UNICODE_NOT_PRESENT_OFFSET, 6391 }, - { 0x2f7b, G_UNICODE_NOT_PRESENT_OFFSET, 6395 }, - { 0x2f7c, G_UNICODE_NOT_PRESENT_OFFSET, 6399 }, - { 0x2f7d, G_UNICODE_NOT_PRESENT_OFFSET, 6403 }, - { 0x2f7e, G_UNICODE_NOT_PRESENT_OFFSET, 6407 }, - { 0x2f7f, G_UNICODE_NOT_PRESENT_OFFSET, 6411 }, - { 0x2f80, G_UNICODE_NOT_PRESENT_OFFSET, 6415 }, - { 0x2f81, G_UNICODE_NOT_PRESENT_OFFSET, 6419 }, - { 0x2f82, G_UNICODE_NOT_PRESENT_OFFSET, 6423 }, - { 0x2f83, G_UNICODE_NOT_PRESENT_OFFSET, 6427 }, - { 0x2f84, G_UNICODE_NOT_PRESENT_OFFSET, 6431 }, - { 0x2f85, G_UNICODE_NOT_PRESENT_OFFSET, 6435 }, - { 0x2f86, G_UNICODE_NOT_PRESENT_OFFSET, 6439 }, - { 0x2f87, G_UNICODE_NOT_PRESENT_OFFSET, 6443 }, - { 0x2f88, G_UNICODE_NOT_PRESENT_OFFSET, 6447 }, - { 0x2f89, G_UNICODE_NOT_PRESENT_OFFSET, 6451 }, - { 0x2f8a, G_UNICODE_NOT_PRESENT_OFFSET, 6455 }, - { 0x2f8b, G_UNICODE_NOT_PRESENT_OFFSET, 6459 }, - { 0x2f8c, G_UNICODE_NOT_PRESENT_OFFSET, 6463 }, - { 0x2f8d, G_UNICODE_NOT_PRESENT_OFFSET, 6467 }, - { 0x2f8e, G_UNICODE_NOT_PRESENT_OFFSET, 6471 }, - { 0x2f8f, G_UNICODE_NOT_PRESENT_OFFSET, 6475 }, - { 0x2f90, G_UNICODE_NOT_PRESENT_OFFSET, 6479 }, - { 0x2f91, G_UNICODE_NOT_PRESENT_OFFSET, 6483 }, - { 0x2f92, G_UNICODE_NOT_PRESENT_OFFSET, 6487 }, - { 0x2f93, G_UNICODE_NOT_PRESENT_OFFSET, 6491 }, - { 0x2f94, G_UNICODE_NOT_PRESENT_OFFSET, 6495 }, - { 0x2f95, G_UNICODE_NOT_PRESENT_OFFSET, 6499 }, - { 0x2f96, G_UNICODE_NOT_PRESENT_OFFSET, 6503 }, - { 0x2f97, G_UNICODE_NOT_PRESENT_OFFSET, 6507 }, - { 0x2f98, G_UNICODE_NOT_PRESENT_OFFSET, 6511 }, - { 0x2f99, G_UNICODE_NOT_PRESENT_OFFSET, 6515 }, - { 0x2f9a, G_UNICODE_NOT_PRESENT_OFFSET, 6519 }, - { 0x2f9b, G_UNICODE_NOT_PRESENT_OFFSET, 6523 }, - { 0x2f9c, G_UNICODE_NOT_PRESENT_OFFSET, 6527 }, - { 0x2f9d, G_UNICODE_NOT_PRESENT_OFFSET, 6531 }, - { 0x2f9e, G_UNICODE_NOT_PRESENT_OFFSET, 6535 }, - { 0x2f9f, G_UNICODE_NOT_PRESENT_OFFSET, 6539 }, - { 0x2fa0, G_UNICODE_NOT_PRESENT_OFFSET, 6543 }, - { 0x2fa1, G_UNICODE_NOT_PRESENT_OFFSET, 6547 }, - { 0x2fa2, G_UNICODE_NOT_PRESENT_OFFSET, 6551 }, - { 0x2fa3, G_UNICODE_NOT_PRESENT_OFFSET, 6555 }, - { 0x2fa4, G_UNICODE_NOT_PRESENT_OFFSET, 6559 }, - { 0x2fa5, G_UNICODE_NOT_PRESENT_OFFSET, 6563 }, - { 0x2fa6, G_UNICODE_NOT_PRESENT_OFFSET, 6567 }, - { 0x2fa7, G_UNICODE_NOT_PRESENT_OFFSET, 6571 }, - { 0x2fa8, G_UNICODE_NOT_PRESENT_OFFSET, 6575 }, - { 0x2fa9, G_UNICODE_NOT_PRESENT_OFFSET, 6579 }, - { 0x2faa, G_UNICODE_NOT_PRESENT_OFFSET, 6583 }, - { 0x2fab, G_UNICODE_NOT_PRESENT_OFFSET, 6587 }, - { 0x2fac, G_UNICODE_NOT_PRESENT_OFFSET, 6591 }, - { 0x2fad, G_UNICODE_NOT_PRESENT_OFFSET, 6595 }, - { 0x2fae, G_UNICODE_NOT_PRESENT_OFFSET, 6599 }, - { 0x2faf, G_UNICODE_NOT_PRESENT_OFFSET, 6603 }, - { 0x2fb0, G_UNICODE_NOT_PRESENT_OFFSET, 6607 }, - { 0x2fb1, G_UNICODE_NOT_PRESENT_OFFSET, 6611 }, - { 0x2fb2, G_UNICODE_NOT_PRESENT_OFFSET, 6615 }, - { 0x2fb3, G_UNICODE_NOT_PRESENT_OFFSET, 6619 }, - { 0x2fb4, G_UNICODE_NOT_PRESENT_OFFSET, 6623 }, - { 0x2fb5, G_UNICODE_NOT_PRESENT_OFFSET, 6627 }, - { 0x2fb6, G_UNICODE_NOT_PRESENT_OFFSET, 6631 }, - { 0x2fb7, G_UNICODE_NOT_PRESENT_OFFSET, 6635 }, - { 0x2fb8, G_UNICODE_NOT_PRESENT_OFFSET, 6639 }, - { 0x2fb9, G_UNICODE_NOT_PRESENT_OFFSET, 6643 }, - { 0x2fba, G_UNICODE_NOT_PRESENT_OFFSET, 6647 }, - { 0x2fbb, G_UNICODE_NOT_PRESENT_OFFSET, 6651 }, - { 0x2fbc, G_UNICODE_NOT_PRESENT_OFFSET, 6655 }, - { 0x2fbd, G_UNICODE_NOT_PRESENT_OFFSET, 6659 }, - { 0x2fbe, G_UNICODE_NOT_PRESENT_OFFSET, 6663 }, - { 0x2fbf, G_UNICODE_NOT_PRESENT_OFFSET, 6667 }, - { 0x2fc0, G_UNICODE_NOT_PRESENT_OFFSET, 6671 }, - { 0x2fc1, G_UNICODE_NOT_PRESENT_OFFSET, 6675 }, - { 0x2fc2, G_UNICODE_NOT_PRESENT_OFFSET, 6679 }, - { 0x2fc3, G_UNICODE_NOT_PRESENT_OFFSET, 6683 }, - { 0x2fc4, G_UNICODE_NOT_PRESENT_OFFSET, 6687 }, - { 0x2fc5, G_UNICODE_NOT_PRESENT_OFFSET, 6691 }, - { 0x2fc6, G_UNICODE_NOT_PRESENT_OFFSET, 6695 }, - { 0x2fc7, G_UNICODE_NOT_PRESENT_OFFSET, 6699 }, - { 0x2fc8, G_UNICODE_NOT_PRESENT_OFFSET, 6703 }, - { 0x2fc9, G_UNICODE_NOT_PRESENT_OFFSET, 6707 }, - { 0x2fca, G_UNICODE_NOT_PRESENT_OFFSET, 6711 }, - { 0x2fcb, G_UNICODE_NOT_PRESENT_OFFSET, 6715 }, - { 0x2fcc, G_UNICODE_NOT_PRESENT_OFFSET, 6719 }, - { 0x2fcd, G_UNICODE_NOT_PRESENT_OFFSET, 6723 }, - { 0x2fce, G_UNICODE_NOT_PRESENT_OFFSET, 6727 }, - { 0x2fcf, G_UNICODE_NOT_PRESENT_OFFSET, 6731 }, - { 0x2fd0, G_UNICODE_NOT_PRESENT_OFFSET, 6735 }, - { 0x2fd1, G_UNICODE_NOT_PRESENT_OFFSET, 6739 }, - { 0x2fd2, G_UNICODE_NOT_PRESENT_OFFSET, 6743 }, - { 0x2fd3, G_UNICODE_NOT_PRESENT_OFFSET, 6747 }, - { 0x2fd4, G_UNICODE_NOT_PRESENT_OFFSET, 6751 }, - { 0x2fd5, G_UNICODE_NOT_PRESENT_OFFSET, 6755 }, - { 0x3000, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, - { 0x3036, G_UNICODE_NOT_PRESENT_OFFSET, 6759 }, - { 0x3038, G_UNICODE_NOT_PRESENT_OFFSET, 5995 }, - { 0x3039, G_UNICODE_NOT_PRESENT_OFFSET, 6763 }, - { 0x303a, G_UNICODE_NOT_PRESENT_OFFSET, 6767 }, - { 0x304c, 6771, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x304e, 6778, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3050, 6785, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3052, 6792, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3054, 6799, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3056, 6806, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3058, 6813, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x305a, 6820, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x305c, 6827, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x305e, 6834, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3060, 6841, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3062, 6848, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3065, 6855, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3067, 6862, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3069, 6869, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3070, 6876, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3071, 6883, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3073, 6890, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3074, 6897, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3076, 6904, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3077, 6911, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3079, 6918, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x307a, 6925, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x307c, 6932, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x307d, 6939, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x3094, 6946, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x309b, G_UNICODE_NOT_PRESENT_OFFSET, 6953 }, - { 0x309c, G_UNICODE_NOT_PRESENT_OFFSET, 6958 }, - { 0x309e, 6963, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x309f, G_UNICODE_NOT_PRESENT_OFFSET, 6970 }, - { 0x30ac, 6977, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30ae, 6984, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30b0, 6991, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30b2, 6998, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30b4, 7005, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30b6, 7012, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30b8, 7019, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30ba, 7026, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30bc, 7033, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30be, 7040, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30c0, 7047, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30c2, 7054, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30c5, 7061, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30c7, 7068, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30c9, 7075, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30d0, 7082, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30d1, 7089, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30d3, 7096, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30d4, 7103, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30d6, 7110, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30d7, 7117, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30d9, 7124, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30da, 7131, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30dc, 7138, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30dd, 7145, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30f4, 7152, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30f7, 7159, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30f8, 7166, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30f9, 7173, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30fa, 7180, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30fe, 7187, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x30ff, G_UNICODE_NOT_PRESENT_OFFSET, 7194 }, - { 0x3131, G_UNICODE_NOT_PRESENT_OFFSET, 7201 }, - { 0x3132, G_UNICODE_NOT_PRESENT_OFFSET, 7205 }, - { 0x3133, G_UNICODE_NOT_PRESENT_OFFSET, 7209 }, - { 0x3134, G_UNICODE_NOT_PRESENT_OFFSET, 7213 }, - { 0x3135, G_UNICODE_NOT_PRESENT_OFFSET, 7217 }, - { 0x3136, G_UNICODE_NOT_PRESENT_OFFSET, 7221 }, - { 0x3137, G_UNICODE_NOT_PRESENT_OFFSET, 7225 }, - { 0x3138, G_UNICODE_NOT_PRESENT_OFFSET, 7229 }, - { 0x3139, G_UNICODE_NOT_PRESENT_OFFSET, 7233 }, - { 0x313a, G_UNICODE_NOT_PRESENT_OFFSET, 7237 }, - { 0x313b, G_UNICODE_NOT_PRESENT_OFFSET, 7241 }, - { 0x313c, G_UNICODE_NOT_PRESENT_OFFSET, 7245 }, - { 0x313d, G_UNICODE_NOT_PRESENT_OFFSET, 7249 }, - { 0x313e, G_UNICODE_NOT_PRESENT_OFFSET, 7253 }, - { 0x313f, G_UNICODE_NOT_PRESENT_OFFSET, 7257 }, - { 0x3140, G_UNICODE_NOT_PRESENT_OFFSET, 7261 }, - { 0x3141, G_UNICODE_NOT_PRESENT_OFFSET, 7265 }, - { 0x3142, G_UNICODE_NOT_PRESENT_OFFSET, 7269 }, - { 0x3143, G_UNICODE_NOT_PRESENT_OFFSET, 7273 }, - { 0x3144, G_UNICODE_NOT_PRESENT_OFFSET, 7277 }, - { 0x3145, G_UNICODE_NOT_PRESENT_OFFSET, 7281 }, - { 0x3146, G_UNICODE_NOT_PRESENT_OFFSET, 7285 }, - { 0x3147, G_UNICODE_NOT_PRESENT_OFFSET, 7289 }, - { 0x3148, G_UNICODE_NOT_PRESENT_OFFSET, 7293 }, - { 0x3149, G_UNICODE_NOT_PRESENT_OFFSET, 7297 }, - { 0x314a, G_UNICODE_NOT_PRESENT_OFFSET, 7301 }, - { 0x314b, G_UNICODE_NOT_PRESENT_OFFSET, 7305 }, - { 0x314c, G_UNICODE_NOT_PRESENT_OFFSET, 7309 }, - { 0x314d, G_UNICODE_NOT_PRESENT_OFFSET, 7313 }, - { 0x314e, G_UNICODE_NOT_PRESENT_OFFSET, 7317 }, - { 0x314f, G_UNICODE_NOT_PRESENT_OFFSET, 7321 }, - { 0x3150, G_UNICODE_NOT_PRESENT_OFFSET, 7325 }, - { 0x3151, G_UNICODE_NOT_PRESENT_OFFSET, 7329 }, - { 0x3152, G_UNICODE_NOT_PRESENT_OFFSET, 7333 }, - { 0x3153, G_UNICODE_NOT_PRESENT_OFFSET, 7337 }, - { 0x3154, G_UNICODE_NOT_PRESENT_OFFSET, 7341 }, - { 0x3155, G_UNICODE_NOT_PRESENT_OFFSET, 7345 }, - { 0x3156, G_UNICODE_NOT_PRESENT_OFFSET, 7349 }, - { 0x3157, G_UNICODE_NOT_PRESENT_OFFSET, 7353 }, - { 0x3158, G_UNICODE_NOT_PRESENT_OFFSET, 7357 }, - { 0x3159, G_UNICODE_NOT_PRESENT_OFFSET, 7361 }, - { 0x315a, G_UNICODE_NOT_PRESENT_OFFSET, 7365 }, - { 0x315b, G_UNICODE_NOT_PRESENT_OFFSET, 7369 }, - { 0x315c, G_UNICODE_NOT_PRESENT_OFFSET, 7373 }, - { 0x315d, G_UNICODE_NOT_PRESENT_OFFSET, 7377 }, - { 0x315e, G_UNICODE_NOT_PRESENT_OFFSET, 7381 }, - { 0x315f, G_UNICODE_NOT_PRESENT_OFFSET, 7385 }, - { 0x3160, G_UNICODE_NOT_PRESENT_OFFSET, 7389 }, - { 0x3161, G_UNICODE_NOT_PRESENT_OFFSET, 7393 }, - { 0x3162, G_UNICODE_NOT_PRESENT_OFFSET, 7397 }, - { 0x3163, G_UNICODE_NOT_PRESENT_OFFSET, 7401 }, - { 0x3164, G_UNICODE_NOT_PRESENT_OFFSET, 7405 }, - { 0x3165, G_UNICODE_NOT_PRESENT_OFFSET, 7409 }, - { 0x3166, G_UNICODE_NOT_PRESENT_OFFSET, 7413 }, - { 0x3167, G_UNICODE_NOT_PRESENT_OFFSET, 7417 }, - { 0x3168, G_UNICODE_NOT_PRESENT_OFFSET, 7421 }, - { 0x3169, G_UNICODE_NOT_PRESENT_OFFSET, 7425 }, - { 0x316a, G_UNICODE_NOT_PRESENT_OFFSET, 7429 }, - { 0x316b, G_UNICODE_NOT_PRESENT_OFFSET, 7433 }, - { 0x316c, G_UNICODE_NOT_PRESENT_OFFSET, 7437 }, - { 0x316d, G_UNICODE_NOT_PRESENT_OFFSET, 7441 }, - { 0x316e, G_UNICODE_NOT_PRESENT_OFFSET, 7445 }, - { 0x316f, G_UNICODE_NOT_PRESENT_OFFSET, 7449 }, - { 0x3170, G_UNICODE_NOT_PRESENT_OFFSET, 7453 }, - { 0x3171, G_UNICODE_NOT_PRESENT_OFFSET, 7457 }, - { 0x3172, G_UNICODE_NOT_PRESENT_OFFSET, 7461 }, - { 0x3173, G_UNICODE_NOT_PRESENT_OFFSET, 7465 }, - { 0x3174, G_UNICODE_NOT_PRESENT_OFFSET, 7469 }, - { 0x3175, G_UNICODE_NOT_PRESENT_OFFSET, 7473 }, - { 0x3176, G_UNICODE_NOT_PRESENT_OFFSET, 7477 }, - { 0x3177, G_UNICODE_NOT_PRESENT_OFFSET, 7481 }, - { 0x3178, G_UNICODE_NOT_PRESENT_OFFSET, 7485 }, - { 0x3179, G_UNICODE_NOT_PRESENT_OFFSET, 7489 }, - { 0x317a, G_UNICODE_NOT_PRESENT_OFFSET, 7493 }, - { 0x317b, G_UNICODE_NOT_PRESENT_OFFSET, 7497 }, - { 0x317c, G_UNICODE_NOT_PRESENT_OFFSET, 7501 }, - { 0x317d, G_UNICODE_NOT_PRESENT_OFFSET, 7505 }, - { 0x317e, G_UNICODE_NOT_PRESENT_OFFSET, 7509 }, - { 0x317f, G_UNICODE_NOT_PRESENT_OFFSET, 7513 }, - { 0x3180, G_UNICODE_NOT_PRESENT_OFFSET, 7517 }, - { 0x3181, G_UNICODE_NOT_PRESENT_OFFSET, 7521 }, - { 0x3182, G_UNICODE_NOT_PRESENT_OFFSET, 7525 }, - { 0x3183, G_UNICODE_NOT_PRESENT_OFFSET, 7529 }, - { 0x3184, G_UNICODE_NOT_PRESENT_OFFSET, 7533 }, - { 0x3185, G_UNICODE_NOT_PRESENT_OFFSET, 7537 }, - { 0x3186, G_UNICODE_NOT_PRESENT_OFFSET, 7541 }, - { 0x3187, G_UNICODE_NOT_PRESENT_OFFSET, 7545 }, - { 0x3188, G_UNICODE_NOT_PRESENT_OFFSET, 7549 }, - { 0x3189, G_UNICODE_NOT_PRESENT_OFFSET, 7553 }, - { 0x318a, G_UNICODE_NOT_PRESENT_OFFSET, 7557 }, - { 0x318b, G_UNICODE_NOT_PRESENT_OFFSET, 7561 }, - { 0x318c, G_UNICODE_NOT_PRESENT_OFFSET, 7565 }, - { 0x318d, G_UNICODE_NOT_PRESENT_OFFSET, 7569 }, - { 0x318e, G_UNICODE_NOT_PRESENT_OFFSET, 7573 }, - { 0x3192, G_UNICODE_NOT_PRESENT_OFFSET, 5903 }, - { 0x3193, G_UNICODE_NOT_PRESENT_OFFSET, 5927 }, - { 0x3194, G_UNICODE_NOT_PRESENT_OFFSET, 7577 }, - { 0x3195, G_UNICODE_NOT_PRESENT_OFFSET, 7581 }, - { 0x3196, G_UNICODE_NOT_PRESENT_OFFSET, 7585 }, - { 0x3197, G_UNICODE_NOT_PRESENT_OFFSET, 7589 }, - { 0x3198, G_UNICODE_NOT_PRESENT_OFFSET, 7593 }, - { 0x3199, G_UNICODE_NOT_PRESENT_OFFSET, 7597 }, - { 0x319a, G_UNICODE_NOT_PRESENT_OFFSET, 5919 }, - { 0x319b, G_UNICODE_NOT_PRESENT_OFFSET, 7601 }, - { 0x319c, G_UNICODE_NOT_PRESENT_OFFSET, 7605 }, - { 0x319d, G_UNICODE_NOT_PRESENT_OFFSET, 7609 }, - { 0x319e, G_UNICODE_NOT_PRESENT_OFFSET, 7613 }, - { 0x319f, G_UNICODE_NOT_PRESENT_OFFSET, 5935 }, - { 0x3200, G_UNICODE_NOT_PRESENT_OFFSET, 7617 }, - { 0x3201, G_UNICODE_NOT_PRESENT_OFFSET, 7623 }, - { 0x3202, G_UNICODE_NOT_PRESENT_OFFSET, 7629 }, - { 0x3203, G_UNICODE_NOT_PRESENT_OFFSET, 7635 }, - { 0x3204, G_UNICODE_NOT_PRESENT_OFFSET, 7641 }, - { 0x3205, G_UNICODE_NOT_PRESENT_OFFSET, 7647 }, - { 0x3206, G_UNICODE_NOT_PRESENT_OFFSET, 7653 }, - { 0x3207, G_UNICODE_NOT_PRESENT_OFFSET, 7659 }, - { 0x3208, G_UNICODE_NOT_PRESENT_OFFSET, 7665 }, - { 0x3209, G_UNICODE_NOT_PRESENT_OFFSET, 7671 }, - { 0x320a, G_UNICODE_NOT_PRESENT_OFFSET, 7677 }, - { 0x320b, G_UNICODE_NOT_PRESENT_OFFSET, 7683 }, - { 0x320c, G_UNICODE_NOT_PRESENT_OFFSET, 7689 }, - { 0x320d, G_UNICODE_NOT_PRESENT_OFFSET, 7695 }, - { 0x320e, G_UNICODE_NOT_PRESENT_OFFSET, 7701 }, - { 0x320f, G_UNICODE_NOT_PRESENT_OFFSET, 7710 }, - { 0x3210, G_UNICODE_NOT_PRESENT_OFFSET, 7719 }, - { 0x3211, G_UNICODE_NOT_PRESENT_OFFSET, 7728 }, - { 0x3212, G_UNICODE_NOT_PRESENT_OFFSET, 7737 }, - { 0x3213, G_UNICODE_NOT_PRESENT_OFFSET, 7746 }, - { 0x3214, G_UNICODE_NOT_PRESENT_OFFSET, 7755 }, - { 0x3215, G_UNICODE_NOT_PRESENT_OFFSET, 7764 }, - { 0x3216, G_UNICODE_NOT_PRESENT_OFFSET, 7773 }, - { 0x3217, G_UNICODE_NOT_PRESENT_OFFSET, 7782 }, - { 0x3218, G_UNICODE_NOT_PRESENT_OFFSET, 7791 }, - { 0x3219, G_UNICODE_NOT_PRESENT_OFFSET, 7800 }, - { 0x321a, G_UNICODE_NOT_PRESENT_OFFSET, 7809 }, - { 0x321b, G_UNICODE_NOT_PRESENT_OFFSET, 7818 }, - { 0x321c, G_UNICODE_NOT_PRESENT_OFFSET, 7827 }, - { 0x3220, G_UNICODE_NOT_PRESENT_OFFSET, 7836 }, - { 0x3221, G_UNICODE_NOT_PRESENT_OFFSET, 7842 }, - { 0x3222, G_UNICODE_NOT_PRESENT_OFFSET, 7848 }, - { 0x3223, G_UNICODE_NOT_PRESENT_OFFSET, 7854 }, - { 0x3224, G_UNICODE_NOT_PRESENT_OFFSET, 7860 }, - { 0x3225, G_UNICODE_NOT_PRESENT_OFFSET, 7866 }, - { 0x3226, G_UNICODE_NOT_PRESENT_OFFSET, 7872 }, - { 0x3227, G_UNICODE_NOT_PRESENT_OFFSET, 7878 }, - { 0x3228, G_UNICODE_NOT_PRESENT_OFFSET, 7884 }, - { 0x3229, G_UNICODE_NOT_PRESENT_OFFSET, 7890 }, - { 0x322a, G_UNICODE_NOT_PRESENT_OFFSET, 7896 }, - { 0x322b, G_UNICODE_NOT_PRESENT_OFFSET, 7902 }, - { 0x322c, G_UNICODE_NOT_PRESENT_OFFSET, 7908 }, - { 0x322d, G_UNICODE_NOT_PRESENT_OFFSET, 7914 }, - { 0x322e, G_UNICODE_NOT_PRESENT_OFFSET, 7920 }, - { 0x322f, G_UNICODE_NOT_PRESENT_OFFSET, 7926 }, - { 0x3230, G_UNICODE_NOT_PRESENT_OFFSET, 7932 }, - { 0x3231, G_UNICODE_NOT_PRESENT_OFFSET, 7938 }, - { 0x3232, G_UNICODE_NOT_PRESENT_OFFSET, 7944 }, - { 0x3233, G_UNICODE_NOT_PRESENT_OFFSET, 7950 }, - { 0x3234, G_UNICODE_NOT_PRESENT_OFFSET, 7956 }, - { 0x3235, G_UNICODE_NOT_PRESENT_OFFSET, 7962 }, - { 0x3236, G_UNICODE_NOT_PRESENT_OFFSET, 7968 }, - { 0x3237, G_UNICODE_NOT_PRESENT_OFFSET, 7974 }, - { 0x3238, G_UNICODE_NOT_PRESENT_OFFSET, 7980 }, - { 0x3239, G_UNICODE_NOT_PRESENT_OFFSET, 7986 }, - { 0x323a, G_UNICODE_NOT_PRESENT_OFFSET, 7992 }, - { 0x323b, G_UNICODE_NOT_PRESENT_OFFSET, 7998 }, - { 0x323c, G_UNICODE_NOT_PRESENT_OFFSET, 8004 }, - { 0x323d, G_UNICODE_NOT_PRESENT_OFFSET, 8010 }, - { 0x323e, G_UNICODE_NOT_PRESENT_OFFSET, 8016 }, - { 0x323f, G_UNICODE_NOT_PRESENT_OFFSET, 8022 }, - { 0x3240, G_UNICODE_NOT_PRESENT_OFFSET, 8028 }, - { 0x3241, G_UNICODE_NOT_PRESENT_OFFSET, 8034 }, - { 0x3242, G_UNICODE_NOT_PRESENT_OFFSET, 8040 }, - { 0x3243, G_UNICODE_NOT_PRESENT_OFFSET, 8046 }, - { 0x3251, G_UNICODE_NOT_PRESENT_OFFSET, 8052 }, - { 0x3252, G_UNICODE_NOT_PRESENT_OFFSET, 8055 }, - { 0x3253, G_UNICODE_NOT_PRESENT_OFFSET, 8058 }, - { 0x3254, G_UNICODE_NOT_PRESENT_OFFSET, 8061 }, - { 0x3255, G_UNICODE_NOT_PRESENT_OFFSET, 8064 }, - { 0x3256, G_UNICODE_NOT_PRESENT_OFFSET, 8067 }, - { 0x3257, G_UNICODE_NOT_PRESENT_OFFSET, 8070 }, - { 0x3258, G_UNICODE_NOT_PRESENT_OFFSET, 8073 }, - { 0x3259, G_UNICODE_NOT_PRESENT_OFFSET, 8076 }, - { 0x325a, G_UNICODE_NOT_PRESENT_OFFSET, 8079 }, - { 0x325b, G_UNICODE_NOT_PRESENT_OFFSET, 8082 }, - { 0x325c, G_UNICODE_NOT_PRESENT_OFFSET, 8085 }, - { 0x325d, G_UNICODE_NOT_PRESENT_OFFSET, 8088 }, - { 0x325e, G_UNICODE_NOT_PRESENT_OFFSET, 8091 }, - { 0x325f, G_UNICODE_NOT_PRESENT_OFFSET, 8094 }, - { 0x3260, G_UNICODE_NOT_PRESENT_OFFSET, 7201 }, - { 0x3261, G_UNICODE_NOT_PRESENT_OFFSET, 7213 }, - { 0x3262, G_UNICODE_NOT_PRESENT_OFFSET, 7225 }, - { 0x3263, G_UNICODE_NOT_PRESENT_OFFSET, 7233 }, - { 0x3264, G_UNICODE_NOT_PRESENT_OFFSET, 7265 }, - { 0x3265, G_UNICODE_NOT_PRESENT_OFFSET, 7269 }, - { 0x3266, G_UNICODE_NOT_PRESENT_OFFSET, 7281 }, - { 0x3267, G_UNICODE_NOT_PRESENT_OFFSET, 7289 }, - { 0x3268, G_UNICODE_NOT_PRESENT_OFFSET, 7293 }, - { 0x3269, G_UNICODE_NOT_PRESENT_OFFSET, 7301 }, - { 0x326a, G_UNICODE_NOT_PRESENT_OFFSET, 7305 }, - { 0x326b, G_UNICODE_NOT_PRESENT_OFFSET, 7309 }, - { 0x326c, G_UNICODE_NOT_PRESENT_OFFSET, 7313 }, - { 0x326d, G_UNICODE_NOT_PRESENT_OFFSET, 7317 }, - { 0x326e, G_UNICODE_NOT_PRESENT_OFFSET, 8097 }, - { 0x326f, G_UNICODE_NOT_PRESENT_OFFSET, 8104 }, - { 0x3270, G_UNICODE_NOT_PRESENT_OFFSET, 8111 }, - { 0x3271, G_UNICODE_NOT_PRESENT_OFFSET, 8118 }, - { 0x3272, G_UNICODE_NOT_PRESENT_OFFSET, 8125 }, - { 0x3273, G_UNICODE_NOT_PRESENT_OFFSET, 8132 }, - { 0x3274, G_UNICODE_NOT_PRESENT_OFFSET, 8139 }, - { 0x3275, G_UNICODE_NOT_PRESENT_OFFSET, 8146 }, - { 0x3276, G_UNICODE_NOT_PRESENT_OFFSET, 8153 }, - { 0x3277, G_UNICODE_NOT_PRESENT_OFFSET, 8160 }, - { 0x3278, G_UNICODE_NOT_PRESENT_OFFSET, 8167 }, - { 0x3279, G_UNICODE_NOT_PRESENT_OFFSET, 8174 }, - { 0x327a, G_UNICODE_NOT_PRESENT_OFFSET, 8181 }, - { 0x327b, G_UNICODE_NOT_PRESENT_OFFSET, 8188 }, - { 0x3280, G_UNICODE_NOT_PRESENT_OFFSET, 5903 }, - { 0x3281, G_UNICODE_NOT_PRESENT_OFFSET, 5927 }, - { 0x3282, G_UNICODE_NOT_PRESENT_OFFSET, 7577 }, - { 0x3283, G_UNICODE_NOT_PRESENT_OFFSET, 7581 }, - { 0x3284, G_UNICODE_NOT_PRESENT_OFFSET, 8195 }, - { 0x3285, G_UNICODE_NOT_PRESENT_OFFSET, 8199 }, - { 0x3286, G_UNICODE_NOT_PRESENT_OFFSET, 8203 }, - { 0x3287, G_UNICODE_NOT_PRESENT_OFFSET, 5947 }, - { 0x3288, G_UNICODE_NOT_PRESENT_OFFSET, 8207 }, - { 0x3289, G_UNICODE_NOT_PRESENT_OFFSET, 5995 }, - { 0x328a, G_UNICODE_NOT_PRESENT_OFFSET, 6195 }, - { 0x328b, G_UNICODE_NOT_PRESENT_OFFSET, 6243 }, - { 0x328c, G_UNICODE_NOT_PRESENT_OFFSET, 6239 }, - { 0x328d, G_UNICODE_NOT_PRESENT_OFFSET, 6199 }, - { 0x328e, G_UNICODE_NOT_PRESENT_OFFSET, 6567 }, - { 0x328f, G_UNICODE_NOT_PRESENT_OFFSET, 6027 }, - { 0x3290, G_UNICODE_NOT_PRESENT_OFFSET, 6187 }, - { 0x3291, G_UNICODE_NOT_PRESENT_OFFSET, 8211 }, - { 0x3292, G_UNICODE_NOT_PRESENT_OFFSET, 8215 }, - { 0x3293, G_UNICODE_NOT_PRESENT_OFFSET, 8219 }, - { 0x3294, G_UNICODE_NOT_PRESENT_OFFSET, 8223 }, - { 0x3295, G_UNICODE_NOT_PRESENT_OFFSET, 8227 }, - { 0x3296, G_UNICODE_NOT_PRESENT_OFFSET, 8231 }, - { 0x3297, G_UNICODE_NOT_PRESENT_OFFSET, 8235 }, - { 0x3298, G_UNICODE_NOT_PRESENT_OFFSET, 8239 }, - { 0x3299, G_UNICODE_NOT_PRESENT_OFFSET, 8243 }, - { 0x329a, G_UNICODE_NOT_PRESENT_OFFSET, 8247 }, - { 0x329b, G_UNICODE_NOT_PRESENT_OFFSET, 6051 }, - { 0x329c, G_UNICODE_NOT_PRESENT_OFFSET, 8251 }, - { 0x329d, G_UNICODE_NOT_PRESENT_OFFSET, 8255 }, - { 0x329e, G_UNICODE_NOT_PRESENT_OFFSET, 8259 }, - { 0x329f, G_UNICODE_NOT_PRESENT_OFFSET, 8263 }, - { 0x32a0, G_UNICODE_NOT_PRESENT_OFFSET, 8267 }, - { 0x32a1, G_UNICODE_NOT_PRESENT_OFFSET, 8271 }, - { 0x32a2, G_UNICODE_NOT_PRESENT_OFFSET, 8275 }, - { 0x32a3, G_UNICODE_NOT_PRESENT_OFFSET, 8279 }, - { 0x32a4, G_UNICODE_NOT_PRESENT_OFFSET, 7585 }, - { 0x32a5, G_UNICODE_NOT_PRESENT_OFFSET, 7589 }, - { 0x32a6, G_UNICODE_NOT_PRESENT_OFFSET, 7593 }, - { 0x32a7, G_UNICODE_NOT_PRESENT_OFFSET, 8283 }, - { 0x32a8, G_UNICODE_NOT_PRESENT_OFFSET, 8287 }, - { 0x32a9, G_UNICODE_NOT_PRESENT_OFFSET, 8291 }, - { 0x32aa, G_UNICODE_NOT_PRESENT_OFFSET, 8295 }, - { 0x32ab, G_UNICODE_NOT_PRESENT_OFFSET, 8299 }, - { 0x32ac, G_UNICODE_NOT_PRESENT_OFFSET, 8303 }, - { 0x32ad, G_UNICODE_NOT_PRESENT_OFFSET, 8307 }, - { 0x32ae, G_UNICODE_NOT_PRESENT_OFFSET, 8311 }, - { 0x32af, G_UNICODE_NOT_PRESENT_OFFSET, 8315 }, - { 0x32b0, G_UNICODE_NOT_PRESENT_OFFSET, 8319 }, - { 0x32b1, G_UNICODE_NOT_PRESENT_OFFSET, 8323 }, - { 0x32b2, G_UNICODE_NOT_PRESENT_OFFSET, 8326 }, - { 0x32b3, G_UNICODE_NOT_PRESENT_OFFSET, 8329 }, - { 0x32b4, G_UNICODE_NOT_PRESENT_OFFSET, 8332 }, - { 0x32b5, G_UNICODE_NOT_PRESENT_OFFSET, 8335 }, - { 0x32b6, G_UNICODE_NOT_PRESENT_OFFSET, 8338 }, - { 0x32b7, G_UNICODE_NOT_PRESENT_OFFSET, 8341 }, - { 0x32b8, G_UNICODE_NOT_PRESENT_OFFSET, 8344 }, - { 0x32b9, G_UNICODE_NOT_PRESENT_OFFSET, 8347 }, - { 0x32ba, G_UNICODE_NOT_PRESENT_OFFSET, 8350 }, - { 0x32bb, G_UNICODE_NOT_PRESENT_OFFSET, 8353 }, - { 0x32bc, G_UNICODE_NOT_PRESENT_OFFSET, 8356 }, - { 0x32bd, G_UNICODE_NOT_PRESENT_OFFSET, 8359 }, - { 0x32be, G_UNICODE_NOT_PRESENT_OFFSET, 8362 }, - { 0x32bf, G_UNICODE_NOT_PRESENT_OFFSET, 8365 }, - { 0x32c0, G_UNICODE_NOT_PRESENT_OFFSET, 8368 }, - { 0x32c1, G_UNICODE_NOT_PRESENT_OFFSET, 8373 }, - { 0x32c2, G_UNICODE_NOT_PRESENT_OFFSET, 8378 }, - { 0x32c3, G_UNICODE_NOT_PRESENT_OFFSET, 8383 }, - { 0x32c4, G_UNICODE_NOT_PRESENT_OFFSET, 8388 }, - { 0x32c5, G_UNICODE_NOT_PRESENT_OFFSET, 8393 }, - { 0x32c6, G_UNICODE_NOT_PRESENT_OFFSET, 8398 }, - { 0x32c7, G_UNICODE_NOT_PRESENT_OFFSET, 8403 }, - { 0x32c8, G_UNICODE_NOT_PRESENT_OFFSET, 8408 }, - { 0x32c9, G_UNICODE_NOT_PRESENT_OFFSET, 8413 }, - { 0x32ca, G_UNICODE_NOT_PRESENT_OFFSET, 8419 }, - { 0x32cb, G_UNICODE_NOT_PRESENT_OFFSET, 8425 }, - { 0x32d0, G_UNICODE_NOT_PRESENT_OFFSET, 8431 }, - { 0x32d1, G_UNICODE_NOT_PRESENT_OFFSET, 8435 }, - { 0x32d2, G_UNICODE_NOT_PRESENT_OFFSET, 8439 }, - { 0x32d3, G_UNICODE_NOT_PRESENT_OFFSET, 8443 }, - { 0x32d4, G_UNICODE_NOT_PRESENT_OFFSET, 8447 }, - { 0x32d5, G_UNICODE_NOT_PRESENT_OFFSET, 8451 }, - { 0x32d6, G_UNICODE_NOT_PRESENT_OFFSET, 8455 }, - { 0x32d7, G_UNICODE_NOT_PRESENT_OFFSET, 8459 }, - { 0x32d8, G_UNICODE_NOT_PRESENT_OFFSET, 8463 }, - { 0x32d9, G_UNICODE_NOT_PRESENT_OFFSET, 8467 }, - { 0x32da, G_UNICODE_NOT_PRESENT_OFFSET, 8471 }, - { 0x32db, G_UNICODE_NOT_PRESENT_OFFSET, 8475 }, - { 0x32dc, G_UNICODE_NOT_PRESENT_OFFSET, 8479 }, - { 0x32dd, G_UNICODE_NOT_PRESENT_OFFSET, 8483 }, - { 0x32de, G_UNICODE_NOT_PRESENT_OFFSET, 8487 }, - { 0x32df, G_UNICODE_NOT_PRESENT_OFFSET, 8491 }, - { 0x32e0, G_UNICODE_NOT_PRESENT_OFFSET, 8495 }, - { 0x32e1, G_UNICODE_NOT_PRESENT_OFFSET, 8499 }, - { 0x32e2, G_UNICODE_NOT_PRESENT_OFFSET, 8503 }, - { 0x32e3, G_UNICODE_NOT_PRESENT_OFFSET, 8507 }, - { 0x32e4, G_UNICODE_NOT_PRESENT_OFFSET, 8511 }, - { 0x32e5, G_UNICODE_NOT_PRESENT_OFFSET, 8515 }, - { 0x32e6, G_UNICODE_NOT_PRESENT_OFFSET, 8519 }, - { 0x32e7, G_UNICODE_NOT_PRESENT_OFFSET, 8523 }, - { 0x32e8, G_UNICODE_NOT_PRESENT_OFFSET, 8527 }, - { 0x32e9, G_UNICODE_NOT_PRESENT_OFFSET, 8531 }, - { 0x32ea, G_UNICODE_NOT_PRESENT_OFFSET, 8535 }, - { 0x32eb, G_UNICODE_NOT_PRESENT_OFFSET, 8539 }, - { 0x32ec, G_UNICODE_NOT_PRESENT_OFFSET, 8543 }, - { 0x32ed, G_UNICODE_NOT_PRESENT_OFFSET, 8547 }, - { 0x32ee, G_UNICODE_NOT_PRESENT_OFFSET, 8551 }, - { 0x32ef, G_UNICODE_NOT_PRESENT_OFFSET, 8555 }, - { 0x32f0, G_UNICODE_NOT_PRESENT_OFFSET, 8559 }, - { 0x32f1, G_UNICODE_NOT_PRESENT_OFFSET, 8563 }, - { 0x32f2, G_UNICODE_NOT_PRESENT_OFFSET, 8567 }, - { 0x32f3, G_UNICODE_NOT_PRESENT_OFFSET, 8571 }, - { 0x32f4, G_UNICODE_NOT_PRESENT_OFFSET, 8575 }, - { 0x32f5, G_UNICODE_NOT_PRESENT_OFFSET, 8579 }, - { 0x32f6, G_UNICODE_NOT_PRESENT_OFFSET, 8583 }, - { 0x32f7, G_UNICODE_NOT_PRESENT_OFFSET, 8587 }, - { 0x32f8, G_UNICODE_NOT_PRESENT_OFFSET, 8591 }, - { 0x32f9, G_UNICODE_NOT_PRESENT_OFFSET, 8595 }, - { 0x32fa, G_UNICODE_NOT_PRESENT_OFFSET, 8599 }, - { 0x32fb, G_UNICODE_NOT_PRESENT_OFFSET, 8603 }, - { 0x32fc, G_UNICODE_NOT_PRESENT_OFFSET, 8607 }, - { 0x32fd, G_UNICODE_NOT_PRESENT_OFFSET, 8611 }, - { 0x32fe, G_UNICODE_NOT_PRESENT_OFFSET, 8615 }, - { 0x3300, G_UNICODE_NOT_PRESENT_OFFSET, 8619 }, - { 0x3301, G_UNICODE_NOT_PRESENT_OFFSET, 8635 }, - { 0x3302, G_UNICODE_NOT_PRESENT_OFFSET, 8648 }, - { 0x3303, G_UNICODE_NOT_PRESENT_OFFSET, 8664 }, - { 0x3304, G_UNICODE_NOT_PRESENT_OFFSET, 8674 }, - { 0x3305, G_UNICODE_NOT_PRESENT_OFFSET, 8690 }, - { 0x3306, G_UNICODE_NOT_PRESENT_OFFSET, 8700 }, - { 0x3307, G_UNICODE_NOT_PRESENT_OFFSET, 8710 }, - { 0x3308, G_UNICODE_NOT_PRESENT_OFFSET, 8729 }, - { 0x3309, G_UNICODE_NOT_PRESENT_OFFSET, 8742 }, - { 0x330a, G_UNICODE_NOT_PRESENT_OFFSET, 8752 }, - { 0x330b, G_UNICODE_NOT_PRESENT_OFFSET, 8762 }, - { 0x330c, G_UNICODE_NOT_PRESENT_OFFSET, 8772 }, - { 0x330d, G_UNICODE_NOT_PRESENT_OFFSET, 8785 }, - { 0x330e, G_UNICODE_NOT_PRESENT_OFFSET, 8798 }, - { 0x330f, G_UNICODE_NOT_PRESENT_OFFSET, 8811 }, - { 0x3310, G_UNICODE_NOT_PRESENT_OFFSET, 8824 }, - { 0x3311, G_UNICODE_NOT_PRESENT_OFFSET, 8837 }, - { 0x3312, G_UNICODE_NOT_PRESENT_OFFSET, 8850 }, - { 0x3313, G_UNICODE_NOT_PRESENT_OFFSET, 8863 }, - { 0x3314, G_UNICODE_NOT_PRESENT_OFFSET, 8882 }, - { 0x3315, G_UNICODE_NOT_PRESENT_OFFSET, 8889 }, - { 0x3316, G_UNICODE_NOT_PRESENT_OFFSET, 8908 }, - { 0x3317, G_UNICODE_NOT_PRESENT_OFFSET, 8927 }, - { 0x3318, G_UNICODE_NOT_PRESENT_OFFSET, 8943 }, - { 0x3319, G_UNICODE_NOT_PRESENT_OFFSET, 8956 }, - { 0x331a, G_UNICODE_NOT_PRESENT_OFFSET, 8975 }, - { 0x331b, G_UNICODE_NOT_PRESENT_OFFSET, 8994 }, - { 0x331c, G_UNICODE_NOT_PRESENT_OFFSET, 9007 }, - { 0x331d, G_UNICODE_NOT_PRESENT_OFFSET, 9017 }, - { 0x331e, G_UNICODE_NOT_PRESENT_OFFSET, 9027 }, - { 0x331f, G_UNICODE_NOT_PRESENT_OFFSET, 9040 }, - { 0x3320, G_UNICODE_NOT_PRESENT_OFFSET, 9053 }, - { 0x3321, G_UNICODE_NOT_PRESENT_OFFSET, 9069 }, - { 0x3322, G_UNICODE_NOT_PRESENT_OFFSET, 9085 }, - { 0x3323, G_UNICODE_NOT_PRESENT_OFFSET, 9095 }, - { 0x3324, G_UNICODE_NOT_PRESENT_OFFSET, 9105 }, - { 0x3325, G_UNICODE_NOT_PRESENT_OFFSET, 9118 }, - { 0x3326, G_UNICODE_NOT_PRESENT_OFFSET, 9128 }, - { 0x3327, G_UNICODE_NOT_PRESENT_OFFSET, 9138 }, - { 0x3328, G_UNICODE_NOT_PRESENT_OFFSET, 9145 }, - { 0x3329, G_UNICODE_NOT_PRESENT_OFFSET, 9152 }, - { 0x332a, G_UNICODE_NOT_PRESENT_OFFSET, 9162 }, - { 0x332b, G_UNICODE_NOT_PRESENT_OFFSET, 9172 }, - { 0x332c, G_UNICODE_NOT_PRESENT_OFFSET, 9191 }, - { 0x332d, G_UNICODE_NOT_PRESENT_OFFSET, 9204 }, - { 0x332e, G_UNICODE_NOT_PRESENT_OFFSET, 9220 }, - { 0x332f, G_UNICODE_NOT_PRESENT_OFFSET, 9239 }, - { 0x3330, G_UNICODE_NOT_PRESENT_OFFSET, 9252 }, - { 0x3331, G_UNICODE_NOT_PRESENT_OFFSET, 9262 }, - { 0x3332, G_UNICODE_NOT_PRESENT_OFFSET, 9272 }, - { 0x3333, G_UNICODE_NOT_PRESENT_OFFSET, 9291 }, - { 0x3334, G_UNICODE_NOT_PRESENT_OFFSET, 9304 }, - { 0x3335, G_UNICODE_NOT_PRESENT_OFFSET, 9323 }, - { 0x3336, G_UNICODE_NOT_PRESENT_OFFSET, 9333 }, - { 0x3337, G_UNICODE_NOT_PRESENT_OFFSET, 9349 }, - { 0x3338, G_UNICODE_NOT_PRESENT_OFFSET, 9359 }, - { 0x3339, G_UNICODE_NOT_PRESENT_OFFSET, 9372 }, - { 0x333a, G_UNICODE_NOT_PRESENT_OFFSET, 9382 }, - { 0x333b, G_UNICODE_NOT_PRESENT_OFFSET, 9395 }, - { 0x333c, G_UNICODE_NOT_PRESENT_OFFSET, 9411 }, - { 0x333d, G_UNICODE_NOT_PRESENT_OFFSET, 9424 }, - { 0x333e, G_UNICODE_NOT_PRESENT_OFFSET, 9440 }, - { 0x333f, G_UNICODE_NOT_PRESENT_OFFSET, 9453 }, - { 0x3340, G_UNICODE_NOT_PRESENT_OFFSET, 9460 }, - { 0x3341, G_UNICODE_NOT_PRESENT_OFFSET, 9476 }, - { 0x3342, G_UNICODE_NOT_PRESENT_OFFSET, 9486 }, - { 0x3343, G_UNICODE_NOT_PRESENT_OFFSET, 9496 }, - { 0x3344, G_UNICODE_NOT_PRESENT_OFFSET, 9509 }, - { 0x3345, G_UNICODE_NOT_PRESENT_OFFSET, 9519 }, - { 0x3346, G_UNICODE_NOT_PRESENT_OFFSET, 9529 }, - { 0x3347, G_UNICODE_NOT_PRESENT_OFFSET, 9539 }, - { 0x3348, G_UNICODE_NOT_PRESENT_OFFSET, 9555 }, - { 0x3349, G_UNICODE_NOT_PRESENT_OFFSET, 9568 }, - { 0x334a, G_UNICODE_NOT_PRESENT_OFFSET, 9575 }, - { 0x334b, G_UNICODE_NOT_PRESENT_OFFSET, 9594 }, - { 0x334c, G_UNICODE_NOT_PRESENT_OFFSET, 9604 }, - { 0x334d, G_UNICODE_NOT_PRESENT_OFFSET, 9620 }, - { 0x334e, G_UNICODE_NOT_PRESENT_OFFSET, 9633 }, - { 0x334f, G_UNICODE_NOT_PRESENT_OFFSET, 9646 }, - { 0x3350, G_UNICODE_NOT_PRESENT_OFFSET, 9656 }, - { 0x3351, G_UNICODE_NOT_PRESENT_OFFSET, 9666 }, - { 0x3352, G_UNICODE_NOT_PRESENT_OFFSET, 9679 }, - { 0x3353, G_UNICODE_NOT_PRESENT_OFFSET, 9686 }, - { 0x3354, G_UNICODE_NOT_PRESENT_OFFSET, 9699 }, - { 0x3355, G_UNICODE_NOT_PRESENT_OFFSET, 9715 }, - { 0x3356, G_UNICODE_NOT_PRESENT_OFFSET, 9722 }, - { 0x3357, G_UNICODE_NOT_PRESENT_OFFSET, 9741 }, - { 0x3358, G_UNICODE_NOT_PRESENT_OFFSET, 9751 }, - { 0x3359, G_UNICODE_NOT_PRESENT_OFFSET, 9756 }, - { 0x335a, G_UNICODE_NOT_PRESENT_OFFSET, 9761 }, - { 0x335b, G_UNICODE_NOT_PRESENT_OFFSET, 9766 }, - { 0x335c, G_UNICODE_NOT_PRESENT_OFFSET, 9771 }, - { 0x335d, G_UNICODE_NOT_PRESENT_OFFSET, 9776 }, - { 0x335e, G_UNICODE_NOT_PRESENT_OFFSET, 9781 }, - { 0x335f, G_UNICODE_NOT_PRESENT_OFFSET, 9786 }, - { 0x3360, G_UNICODE_NOT_PRESENT_OFFSET, 9791 }, - { 0x3361, G_UNICODE_NOT_PRESENT_OFFSET, 9796 }, - { 0x3362, G_UNICODE_NOT_PRESENT_OFFSET, 9801 }, - { 0x3363, G_UNICODE_NOT_PRESENT_OFFSET, 9807 }, - { 0x3364, G_UNICODE_NOT_PRESENT_OFFSET, 9813 }, - { 0x3365, G_UNICODE_NOT_PRESENT_OFFSET, 9819 }, - { 0x3366, G_UNICODE_NOT_PRESENT_OFFSET, 9825 }, - { 0x3367, G_UNICODE_NOT_PRESENT_OFFSET, 9831 }, - { 0x3368, G_UNICODE_NOT_PRESENT_OFFSET, 9837 }, - { 0x3369, G_UNICODE_NOT_PRESENT_OFFSET, 9843 }, - { 0x336a, G_UNICODE_NOT_PRESENT_OFFSET, 9849 }, - { 0x336b, G_UNICODE_NOT_PRESENT_OFFSET, 9855 }, - { 0x336c, G_UNICODE_NOT_PRESENT_OFFSET, 9861 }, - { 0x336d, G_UNICODE_NOT_PRESENT_OFFSET, 9867 }, - { 0x336e, G_UNICODE_NOT_PRESENT_OFFSET, 9873 }, - { 0x336f, G_UNICODE_NOT_PRESENT_OFFSET, 9879 }, - { 0x3370, G_UNICODE_NOT_PRESENT_OFFSET, 9885 }, - { 0x3371, G_UNICODE_NOT_PRESENT_OFFSET, 9891 }, - { 0x3372, G_UNICODE_NOT_PRESENT_OFFSET, 9895 }, - { 0x3373, G_UNICODE_NOT_PRESENT_OFFSET, 9898 }, - { 0x3374, G_UNICODE_NOT_PRESENT_OFFSET, 9901 }, - { 0x3375, G_UNICODE_NOT_PRESENT_OFFSET, 9905 }, - { 0x3376, G_UNICODE_NOT_PRESENT_OFFSET, 9908 }, - { 0x337b, G_UNICODE_NOT_PRESENT_OFFSET, 9911 }, - { 0x337c, G_UNICODE_NOT_PRESENT_OFFSET, 9918 }, - { 0x337d, G_UNICODE_NOT_PRESENT_OFFSET, 9925 }, - { 0x337e, G_UNICODE_NOT_PRESENT_OFFSET, 9932 }, - { 0x337f, G_UNICODE_NOT_PRESENT_OFFSET, 9939 }, - { 0x3380, G_UNICODE_NOT_PRESENT_OFFSET, 9952 }, - { 0x3381, G_UNICODE_NOT_PRESENT_OFFSET, 9955 }, - { 0x3382, G_UNICODE_NOT_PRESENT_OFFSET, 9958 }, - { 0x3383, G_UNICODE_NOT_PRESENT_OFFSET, 9962 }, - { 0x3384, G_UNICODE_NOT_PRESENT_OFFSET, 9965 }, - { 0x3385, G_UNICODE_NOT_PRESENT_OFFSET, 9968 }, - { 0x3386, G_UNICODE_NOT_PRESENT_OFFSET, 9971 }, - { 0x3387, G_UNICODE_NOT_PRESENT_OFFSET, 9974 }, - { 0x3388, G_UNICODE_NOT_PRESENT_OFFSET, 9977 }, - { 0x3389, G_UNICODE_NOT_PRESENT_OFFSET, 9981 }, - { 0x338a, G_UNICODE_NOT_PRESENT_OFFSET, 9986 }, - { 0x338b, G_UNICODE_NOT_PRESENT_OFFSET, 9989 }, - { 0x338c, G_UNICODE_NOT_PRESENT_OFFSET, 9992 }, - { 0x338d, G_UNICODE_NOT_PRESENT_OFFSET, 9996 }, - { 0x338e, G_UNICODE_NOT_PRESENT_OFFSET, 10000 }, - { 0x338f, G_UNICODE_NOT_PRESENT_OFFSET, 10003 }, - { 0x3390, G_UNICODE_NOT_PRESENT_OFFSET, 10006 }, - { 0x3391, G_UNICODE_NOT_PRESENT_OFFSET, 10009 }, - { 0x3392, G_UNICODE_NOT_PRESENT_OFFSET, 10013 }, - { 0x3393, G_UNICODE_NOT_PRESENT_OFFSET, 10017 }, - { 0x3394, G_UNICODE_NOT_PRESENT_OFFSET, 10021 }, - { 0x3395, G_UNICODE_NOT_PRESENT_OFFSET, 10025 }, - { 0x3396, G_UNICODE_NOT_PRESENT_OFFSET, 10029 }, - { 0x3397, G_UNICODE_NOT_PRESENT_OFFSET, 10032 }, - { 0x3398, G_UNICODE_NOT_PRESENT_OFFSET, 10035 }, - { 0x3399, G_UNICODE_NOT_PRESENT_OFFSET, 10038 }, - { 0x339a, G_UNICODE_NOT_PRESENT_OFFSET, 10041 }, - { 0x339b, G_UNICODE_NOT_PRESENT_OFFSET, 10044 }, - { 0x339c, G_UNICODE_NOT_PRESENT_OFFSET, 10048 }, - { 0x339d, G_UNICODE_NOT_PRESENT_OFFSET, 10051 }, - { 0x339e, G_UNICODE_NOT_PRESENT_OFFSET, 10054 }, - { 0x339f, G_UNICODE_NOT_PRESENT_OFFSET, 10057 }, - { 0x33a0, G_UNICODE_NOT_PRESENT_OFFSET, 10061 }, - { 0x33a1, G_UNICODE_NOT_PRESENT_OFFSET, 10065 }, - { 0x33a2, G_UNICODE_NOT_PRESENT_OFFSET, 10068 }, - { 0x33a3, G_UNICODE_NOT_PRESENT_OFFSET, 10072 }, - { 0x33a4, G_UNICODE_NOT_PRESENT_OFFSET, 10076 }, - { 0x33a5, G_UNICODE_NOT_PRESENT_OFFSET, 10080 }, - { 0x33a6, G_UNICODE_NOT_PRESENT_OFFSET, 10083 }, - { 0x33a7, G_UNICODE_NOT_PRESENT_OFFSET, 10087 }, - { 0x33a8, G_UNICODE_NOT_PRESENT_OFFSET, 10093 }, - { 0x33a9, G_UNICODE_NOT_PRESENT_OFFSET, 10100 }, - { 0x33aa, G_UNICODE_NOT_PRESENT_OFFSET, 10103 }, - { 0x33ab, G_UNICODE_NOT_PRESENT_OFFSET, 10107 }, - { 0x33ac, G_UNICODE_NOT_PRESENT_OFFSET, 10111 }, - { 0x33ad, G_UNICODE_NOT_PRESENT_OFFSET, 10115 }, - { 0x33ae, G_UNICODE_NOT_PRESENT_OFFSET, 10119 }, - { 0x33af, G_UNICODE_NOT_PRESENT_OFFSET, 10127 }, - { 0x33b0, G_UNICODE_NOT_PRESENT_OFFSET, 10136 }, - { 0x33b1, G_UNICODE_NOT_PRESENT_OFFSET, 10139 }, - { 0x33b2, G_UNICODE_NOT_PRESENT_OFFSET, 10142 }, - { 0x33b3, G_UNICODE_NOT_PRESENT_OFFSET, 10146 }, - { 0x33b4, G_UNICODE_NOT_PRESENT_OFFSET, 10149 }, - { 0x33b5, G_UNICODE_NOT_PRESENT_OFFSET, 10152 }, - { 0x33b6, G_UNICODE_NOT_PRESENT_OFFSET, 10155 }, - { 0x33b7, G_UNICODE_NOT_PRESENT_OFFSET, 10159 }, - { 0x33b8, G_UNICODE_NOT_PRESENT_OFFSET, 10162 }, - { 0x33b9, G_UNICODE_NOT_PRESENT_OFFSET, 10165 }, - { 0x33ba, G_UNICODE_NOT_PRESENT_OFFSET, 10168 }, - { 0x33bb, G_UNICODE_NOT_PRESENT_OFFSET, 10171 }, - { 0x33bc, G_UNICODE_NOT_PRESENT_OFFSET, 10174 }, - { 0x33bd, G_UNICODE_NOT_PRESENT_OFFSET, 10178 }, - { 0x33be, G_UNICODE_NOT_PRESENT_OFFSET, 10181 }, - { 0x33bf, G_UNICODE_NOT_PRESENT_OFFSET, 10184 }, - { 0x33c0, G_UNICODE_NOT_PRESENT_OFFSET, 10187 }, - { 0x33c1, G_UNICODE_NOT_PRESENT_OFFSET, 10191 }, - { 0x33c2, G_UNICODE_NOT_PRESENT_OFFSET, 10195 }, - { 0x33c3, G_UNICODE_NOT_PRESENT_OFFSET, 10200 }, - { 0x33c4, G_UNICODE_NOT_PRESENT_OFFSET, 10203 }, - { 0x33c5, G_UNICODE_NOT_PRESENT_OFFSET, 10206 }, - { 0x33c6, G_UNICODE_NOT_PRESENT_OFFSET, 10209 }, - { 0x33c7, G_UNICODE_NOT_PRESENT_OFFSET, 10216 }, - { 0x33c8, G_UNICODE_NOT_PRESENT_OFFSET, 10220 }, - { 0x33c9, G_UNICODE_NOT_PRESENT_OFFSET, 10223 }, - { 0x33ca, G_UNICODE_NOT_PRESENT_OFFSET, 10226 }, - { 0x33cb, G_UNICODE_NOT_PRESENT_OFFSET, 10229 }, - { 0x33cc, G_UNICODE_NOT_PRESENT_OFFSET, 10232 }, - { 0x33cd, G_UNICODE_NOT_PRESENT_OFFSET, 10235 }, - { 0x33ce, G_UNICODE_NOT_PRESENT_OFFSET, 10238 }, - { 0x33cf, G_UNICODE_NOT_PRESENT_OFFSET, 10241 }, - { 0x33d0, G_UNICODE_NOT_PRESENT_OFFSET, 10244 }, - { 0x33d1, G_UNICODE_NOT_PRESENT_OFFSET, 10247 }, - { 0x33d2, G_UNICODE_NOT_PRESENT_OFFSET, 10250 }, - { 0x33d3, G_UNICODE_NOT_PRESENT_OFFSET, 10254 }, - { 0x33d4, G_UNICODE_NOT_PRESENT_OFFSET, 10257 }, - { 0x33d5, G_UNICODE_NOT_PRESENT_OFFSET, 10260 }, - { 0x33d6, G_UNICODE_NOT_PRESENT_OFFSET, 10264 }, - { 0x33d7, G_UNICODE_NOT_PRESENT_OFFSET, 10268 }, - { 0x33d8, G_UNICODE_NOT_PRESENT_OFFSET, 10271 }, - { 0x33d9, G_UNICODE_NOT_PRESENT_OFFSET, 10276 }, - { 0x33da, G_UNICODE_NOT_PRESENT_OFFSET, 10280 }, - { 0x33db, G_UNICODE_NOT_PRESENT_OFFSET, 10283 }, - { 0x33dc, G_UNICODE_NOT_PRESENT_OFFSET, 10286 }, - { 0x33dd, G_UNICODE_NOT_PRESENT_OFFSET, 10289 }, - { 0x33e0, G_UNICODE_NOT_PRESENT_OFFSET, 10292 }, - { 0x33e1, G_UNICODE_NOT_PRESENT_OFFSET, 10297 }, - { 0x33e2, G_UNICODE_NOT_PRESENT_OFFSET, 10302 }, - { 0x33e3, G_UNICODE_NOT_PRESENT_OFFSET, 10307 }, - { 0x33e4, G_UNICODE_NOT_PRESENT_OFFSET, 10312 }, - { 0x33e5, G_UNICODE_NOT_PRESENT_OFFSET, 10317 }, - { 0x33e6, G_UNICODE_NOT_PRESENT_OFFSET, 10322 }, - { 0x33e7, G_UNICODE_NOT_PRESENT_OFFSET, 10327 }, - { 0x33e8, G_UNICODE_NOT_PRESENT_OFFSET, 10332 }, - { 0x33e9, G_UNICODE_NOT_PRESENT_OFFSET, 10337 }, - { 0x33ea, G_UNICODE_NOT_PRESENT_OFFSET, 10343 }, - { 0x33eb, G_UNICODE_NOT_PRESENT_OFFSET, 10349 }, - { 0x33ec, G_UNICODE_NOT_PRESENT_OFFSET, 10355 }, - { 0x33ed, G_UNICODE_NOT_PRESENT_OFFSET, 10361 }, - { 0x33ee, G_UNICODE_NOT_PRESENT_OFFSET, 10367 }, - { 0x33ef, G_UNICODE_NOT_PRESENT_OFFSET, 10373 }, - { 0x33f0, G_UNICODE_NOT_PRESENT_OFFSET, 10379 }, - { 0x33f1, G_UNICODE_NOT_PRESENT_OFFSET, 10385 }, - { 0x33f2, G_UNICODE_NOT_PRESENT_OFFSET, 10391 }, - { 0x33f3, G_UNICODE_NOT_PRESENT_OFFSET, 10397 }, - { 0x33f4, G_UNICODE_NOT_PRESENT_OFFSET, 10403 }, - { 0x33f5, G_UNICODE_NOT_PRESENT_OFFSET, 10409 }, - { 0x33f6, G_UNICODE_NOT_PRESENT_OFFSET, 10415 }, - { 0x33f7, G_UNICODE_NOT_PRESENT_OFFSET, 10421 }, - { 0x33f8, G_UNICODE_NOT_PRESENT_OFFSET, 10427 }, - { 0x33f9, G_UNICODE_NOT_PRESENT_OFFSET, 10433 }, - { 0x33fa, G_UNICODE_NOT_PRESENT_OFFSET, 10439 }, - { 0x33fb, G_UNICODE_NOT_PRESENT_OFFSET, 10445 }, - { 0x33fc, G_UNICODE_NOT_PRESENT_OFFSET, 10451 }, - { 0x33fd, G_UNICODE_NOT_PRESENT_OFFSET, 10457 }, - { 0x33fe, G_UNICODE_NOT_PRESENT_OFFSET, 10463 }, - { 0xf900, 10469, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf901, 10473, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf902, 6535, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf903, 10477, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf904, 10481, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf905, 10485, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf906, 10489, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf907, 6751, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf908, 6751, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf909, 10493, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf90a, 6567, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf90b, 10497, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf90c, 10501, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf90d, 10505, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf90e, 10509, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf90f, 10513, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf910, 10517, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf911, 10521, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf912, 10525, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf913, 10529, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf914, 10533, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf915, 10537, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf916, 10541, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf917, 10545, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf918, 10549, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf919, 10553, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf91a, 10557, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf91b, 10561, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf91c, 10565, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf91d, 10569, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf91e, 10573, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf91f, 10577, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf920, 10581, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf921, 10585, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf922, 10589, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf923, 10593, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf924, 10597, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf925, 10601, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf926, 10605, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf927, 10609, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf928, 10613, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf929, 10617, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf92a, 10621, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf92b, 10625, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf92c, 10629, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf92d, 10633, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf92e, 10637, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf92f, 10641, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf930, 10645, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf931, 10649, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf932, 10653, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf933, 10657, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf934, 6399, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf935, 10661, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf936, 10665, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf937, 10669, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf938, 10673, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf939, 10677, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf93a, 10681, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf93b, 10685, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf93c, 10689, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf93d, 10693, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf93e, 10697, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf93f, 10701, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf940, 6691, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf941, 10705, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf942, 10709, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf943, 10713, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf944, 10717, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf945, 10721, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf946, 10725, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf947, 10729, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf948, 10733, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf949, 10737, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf94a, 10741, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf94b, 10745, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf94c, 10749, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf94d, 10753, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf94e, 10757, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf94f, 10761, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf950, 10765, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf951, 10769, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf952, 10773, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf953, 10777, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf954, 10781, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf955, 10785, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf956, 10789, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf957, 10793, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf958, 10797, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf959, 10801, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf95a, 10805, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf95b, 10809, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf95c, 10533, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf95d, 10813, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf95e, 10817, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf95f, 10821, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf960, 10825, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf961, 10829, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf962, 10833, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf963, 10837, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf964, 10841, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf965, 10845, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf966, 10849, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf967, 10853, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf968, 10857, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf969, 10861, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf96a, 10865, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf96b, 10869, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf96c, 10873, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf96d, 10877, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf96e, 10881, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf96f, 10885, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf970, 10889, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf971, 6543, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf972, 10893, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf973, 10897, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf974, 10901, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf975, 10905, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf976, 10909, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf977, 10913, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf978, 10917, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf979, 10921, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf97a, 10925, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf97b, 10929, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf97c, 10933, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf97d, 10937, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf97e, 10941, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf97f, 10945, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf980, 10949, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf981, 6051, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf982, 10953, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf983, 10957, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf984, 10961, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf985, 10965, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf986, 10969, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf987, 10973, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf988, 10977, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf989, 10981, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf98a, 5975, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf98b, 10985, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf98c, 10989, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf98d, 10993, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf98e, 10997, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf98f, 11001, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf990, 11005, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf991, 11009, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf992, 11013, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf993, 11017, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf994, 11021, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf995, 11025, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf996, 11029, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf997, 11033, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf998, 11037, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf999, 11041, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf99a, 11045, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf99b, 11049, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf99c, 11053, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf99d, 11057, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf99e, 11061, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf99f, 11065, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9a0, 11069, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9a1, 10885, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9a2, 11073, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9a3, 11077, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9a4, 11081, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9a5, 11085, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9a6, 11089, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9a7, 11093, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9a8, 11097, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9a9, 11101, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9aa, 10821, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9ab, 11105, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9ac, 11109, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9ad, 11113, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9ae, 11117, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9af, 11121, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9b0, 11125, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9b1, 11129, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9b2, 11133, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9b3, 11137, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9b4, 11141, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9b5, 11145, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9b6, 11149, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9b7, 11153, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9b8, 11157, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9b9, 11161, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9ba, 11165, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9bb, 11169, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9bc, 11173, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9bd, 11177, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9be, 11181, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9bf, 10533, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9c0, 11185, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9c1, 11189, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9c2, 11193, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9c3, 11197, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9c4, 6747, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9c5, 11201, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9c6, 11205, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9c7, 11209, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9c8, 11213, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9c9, 11217, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9ca, 11221, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9cb, 11225, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9cc, 11229, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9cd, 11233, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9ce, 11237, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9cf, 11241, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9d0, 11245, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9d1, 8199, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9d2, 11249, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9d3, 11253, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9d4, 11257, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9d5, 11261, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9d6, 11265, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9d7, 11269, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9d8, 11273, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9d9, 11277, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9da, 11281, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9db, 10829, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9dc, 11285, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9dd, 11289, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9de, 11293, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9df, 11297, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9e0, 11301, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9e1, 11305, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9e2, 11309, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9e3, 11313, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9e4, 11317, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9e5, 11321, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9e6, 11325, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9e7, 11329, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9e8, 11333, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9e9, 6563, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9ea, 11337, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9eb, 11341, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9ec, 11345, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9ed, 11349, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9ee, 11353, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9ef, 11357, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9f0, 11361, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9f1, 11365, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9f2, 11369, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9f3, 11373, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9f4, 11377, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9f5, 11381, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9f6, 11385, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9f7, 6367, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9f8, 11389, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9f9, 11393, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9fa, 11397, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9fb, 11401, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9fc, 11405, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9fd, 11409, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9fe, 11413, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xf9ff, 11417, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa00, 11421, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa01, 11425, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa02, 11429, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa03, 11433, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa04, 11437, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa05, 11441, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa06, 11445, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa07, 11449, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa08, 6475, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa09, 11453, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa0a, 6487, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa0b, 11457, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa0c, 11461, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa0d, 11465, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa10, 11469, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa12, 11473, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa15, 11477, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa16, 11481, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa17, 11485, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa18, 11489, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa19, 11493, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa1a, 11497, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa1b, 11501, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa1c, 11505, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa1d, 11509, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa1e, 6395, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa20, 11513, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa22, 11517, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa25, 11521, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa26, 11525, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa2a, 11529, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa2b, 11533, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa2c, 11537, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa2d, 11541, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa30, 11545, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa31, 11549, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa32, 11553, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa33, 11557, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa34, 11561, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa35, 11565, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa36, 11569, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa37, 11573, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa38, 11577, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa39, 11581, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa3a, 11585, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa3b, 11589, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa3c, 6079, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa3d, 11593, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa3e, 11597, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa3f, 11601, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa40, 11605, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa41, 11609, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa42, 11613, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa43, 11617, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa44, 11621, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa45, 11625, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa46, 11629, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa47, 11633, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa48, 11637, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa49, 11641, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa4a, 11645, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa4b, 11649, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa4c, 8219, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa4d, 11653, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa4e, 11657, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa4f, 11661, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa50, 11665, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa51, 8235, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa52, 11669, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa53, 11673, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa54, 11677, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa55, 11681, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa56, 11685, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa57, 11029, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa58, 11689, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa59, 11693, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa5a, 11697, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa5b, 11701, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa5c, 11705, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa5d, 11709, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa5e, 11709, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa5f, 11713, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa60, 11717, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa61, 11721, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa62, 11725, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa63, 11729, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa64, 11733, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa65, 11737, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa66, 11741, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa67, 11521, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa68, 11745, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa69, 11749, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfa6a, 11753, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb00, G_UNICODE_NOT_PRESENT_OFFSET, 11757 }, - { 0xfb01, G_UNICODE_NOT_PRESENT_OFFSET, 11760 }, - { 0xfb02, G_UNICODE_NOT_PRESENT_OFFSET, 11763 }, - { 0xfb03, G_UNICODE_NOT_PRESENT_OFFSET, 11766 }, - { 0xfb04, G_UNICODE_NOT_PRESENT_OFFSET, 11770 }, - { 0xfb05, G_UNICODE_NOT_PRESENT_OFFSET, 11774 }, - { 0xfb06, G_UNICODE_NOT_PRESENT_OFFSET, 11774 }, - { 0xfb13, G_UNICODE_NOT_PRESENT_OFFSET, 11777 }, - { 0xfb14, G_UNICODE_NOT_PRESENT_OFFSET, 11782 }, - { 0xfb15, G_UNICODE_NOT_PRESENT_OFFSET, 11787 }, - { 0xfb16, G_UNICODE_NOT_PRESENT_OFFSET, 11792 }, - { 0xfb17, G_UNICODE_NOT_PRESENT_OFFSET, 11797 }, - { 0xfb1d, 11802, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb1f, 11807, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb20, G_UNICODE_NOT_PRESENT_OFFSET, 11812 }, - { 0xfb21, G_UNICODE_NOT_PRESENT_OFFSET, 5052 }, - { 0xfb22, G_UNICODE_NOT_PRESENT_OFFSET, 5061 }, - { 0xfb23, G_UNICODE_NOT_PRESENT_OFFSET, 11815 }, - { 0xfb24, G_UNICODE_NOT_PRESENT_OFFSET, 11818 }, - { 0xfb25, G_UNICODE_NOT_PRESENT_OFFSET, 11821 }, - { 0xfb26, G_UNICODE_NOT_PRESENT_OFFSET, 11824 }, - { 0xfb27, G_UNICODE_NOT_PRESENT_OFFSET, 11827 }, - { 0xfb28, G_UNICODE_NOT_PRESENT_OFFSET, 11830 }, - { 0xfb29, G_UNICODE_NOT_PRESENT_OFFSET, 4957 }, - { 0xfb2a, 11833, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb2b, 11838, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb2c, 11843, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb2d, 11850, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb2e, 11857, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb2f, 11862, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb30, 11867, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb31, 11872, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb32, 11877, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb33, 11882, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb34, 11887, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb35, 11892, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb36, 11897, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb38, 11902, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb39, 11907, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb3a, 11912, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb3b, 11917, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb3c, 11922, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb3e, 11927, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb40, 11932, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb41, 11937, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb43, 11942, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb44, 11947, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb46, 11952, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb47, 11957, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb48, 11962, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb49, 11967, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb4a, 11972, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb4b, 11977, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb4c, 11982, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb4d, 11987, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb4e, 11992, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0xfb4f, G_UNICODE_NOT_PRESENT_OFFSET, 11997 }, - { 0xfb50, G_UNICODE_NOT_PRESENT_OFFSET, 12002 }, - { 0xfb51, G_UNICODE_NOT_PRESENT_OFFSET, 12002 }, - { 0xfb52, G_UNICODE_NOT_PRESENT_OFFSET, 12005 }, - { 0xfb53, G_UNICODE_NOT_PRESENT_OFFSET, 12005 }, - { 0xfb54, G_UNICODE_NOT_PRESENT_OFFSET, 12005 }, - { 0xfb55, G_UNICODE_NOT_PRESENT_OFFSET, 12005 }, - { 0xfb56, G_UNICODE_NOT_PRESENT_OFFSET, 12008 }, - { 0xfb57, G_UNICODE_NOT_PRESENT_OFFSET, 12008 }, - { 0xfb58, G_UNICODE_NOT_PRESENT_OFFSET, 12008 }, - { 0xfb59, G_UNICODE_NOT_PRESENT_OFFSET, 12008 }, - { 0xfb5a, G_UNICODE_NOT_PRESENT_OFFSET, 12011 }, - { 0xfb5b, G_UNICODE_NOT_PRESENT_OFFSET, 12011 }, - { 0xfb5c, G_UNICODE_NOT_PRESENT_OFFSET, 12011 }, - { 0xfb5d, G_UNICODE_NOT_PRESENT_OFFSET, 12011 }, - { 0xfb5e, G_UNICODE_NOT_PRESENT_OFFSET, 12014 }, - { 0xfb5f, G_UNICODE_NOT_PRESENT_OFFSET, 12014 }, - { 0xfb60, G_UNICODE_NOT_PRESENT_OFFSET, 12014 }, - { 0xfb61, G_UNICODE_NOT_PRESENT_OFFSET, 12014 }, - { 0xfb62, G_UNICODE_NOT_PRESENT_OFFSET, 12017 }, - { 0xfb63, G_UNICODE_NOT_PRESENT_OFFSET, 12017 }, - { 0xfb64, G_UNICODE_NOT_PRESENT_OFFSET, 12017 }, - { 0xfb65, G_UNICODE_NOT_PRESENT_OFFSET, 12017 }, - { 0xfb66, G_UNICODE_NOT_PRESENT_OFFSET, 12020 }, - { 0xfb67, G_UNICODE_NOT_PRESENT_OFFSET, 12020 }, - { 0xfb68, G_UNICODE_NOT_PRESENT_OFFSET, 12020 }, - { 0xfb69, G_UNICODE_NOT_PRESENT_OFFSET, 12020 }, - { 0xfb6a, G_UNICODE_NOT_PRESENT_OFFSET, 12023 }, - { 0xfb6b, G_UNICODE_NOT_PRESENT_OFFSET, 12023 }, - { 0xfb6c, G_UNICODE_NOT_PRESENT_OFFSET, 12023 }, - { 0xfb6d, G_UNICODE_NOT_PRESENT_OFFSET, 12023 }, - { 0xfb6e, G_UNICODE_NOT_PRESENT_OFFSET, 12026 }, - { 0xfb6f, G_UNICODE_NOT_PRESENT_OFFSET, 12026 }, - { 0xfb70, G_UNICODE_NOT_PRESENT_OFFSET, 12026 }, - { 0xfb71, G_UNICODE_NOT_PRESENT_OFFSET, 12026 }, - { 0xfb72, G_UNICODE_NOT_PRESENT_OFFSET, 12029 }, - { 0xfb73, G_UNICODE_NOT_PRESENT_OFFSET, 12029 }, - { 0xfb74, G_UNICODE_NOT_PRESENT_OFFSET, 12029 }, - { 0xfb75, G_UNICODE_NOT_PRESENT_OFFSET, 12029 }, - { 0xfb76, G_UNICODE_NOT_PRESENT_OFFSET, 12032 }, - { 0xfb77, G_UNICODE_NOT_PRESENT_OFFSET, 12032 }, - { 0xfb78, G_UNICODE_NOT_PRESENT_OFFSET, 12032 }, - { 0xfb79, G_UNICODE_NOT_PRESENT_OFFSET, 12032 }, - { 0xfb7a, G_UNICODE_NOT_PRESENT_OFFSET, 12035 }, - { 0xfb7b, G_UNICODE_NOT_PRESENT_OFFSET, 12035 }, - { 0xfb7c, G_UNICODE_NOT_PRESENT_OFFSET, 12035 }, - { 0xfb7d, G_UNICODE_NOT_PRESENT_OFFSET, 12035 }, - { 0xfb7e, G_UNICODE_NOT_PRESENT_OFFSET, 12038 }, - { 0xfb7f, G_UNICODE_NOT_PRESENT_OFFSET, 12038 }, - { 0xfb80, G_UNICODE_NOT_PRESENT_OFFSET, 12038 }, - { 0xfb81, G_UNICODE_NOT_PRESENT_OFFSET, 12038 }, - { 0xfb82, G_UNICODE_NOT_PRESENT_OFFSET, 12041 }, - { 0xfb83, G_UNICODE_NOT_PRESENT_OFFSET, 12041 }, - { 0xfb84, G_UNICODE_NOT_PRESENT_OFFSET, 12044 }, - { 0xfb85, G_UNICODE_NOT_PRESENT_OFFSET, 12044 }, - { 0xfb86, G_UNICODE_NOT_PRESENT_OFFSET, 12047 }, - { 0xfb87, G_UNICODE_NOT_PRESENT_OFFSET, 12047 }, - { 0xfb88, G_UNICODE_NOT_PRESENT_OFFSET, 12050 }, - { 0xfb89, G_UNICODE_NOT_PRESENT_OFFSET, 12050 }, - { 0xfb8a, G_UNICODE_NOT_PRESENT_OFFSET, 12053 }, - { 0xfb8b, G_UNICODE_NOT_PRESENT_OFFSET, 12053 }, - { 0xfb8c, G_UNICODE_NOT_PRESENT_OFFSET, 12056 }, - { 0xfb8d, G_UNICODE_NOT_PRESENT_OFFSET, 12056 }, - { 0xfb8e, G_UNICODE_NOT_PRESENT_OFFSET, 12059 }, - { 0xfb8f, G_UNICODE_NOT_PRESENT_OFFSET, 12059 }, - { 0xfb90, G_UNICODE_NOT_PRESENT_OFFSET, 12059 }, - { 0xfb91, G_UNICODE_NOT_PRESENT_OFFSET, 12059 }, - { 0xfb92, G_UNICODE_NOT_PRESENT_OFFSET, 12062 }, - { 0xfb93, G_UNICODE_NOT_PRESENT_OFFSET, 12062 }, - { 0xfb94, G_UNICODE_NOT_PRESENT_OFFSET, 12062 }, - { 0xfb95, G_UNICODE_NOT_PRESENT_OFFSET, 12062 }, - { 0xfb96, G_UNICODE_NOT_PRESENT_OFFSET, 12065 }, - { 0xfb97, G_UNICODE_NOT_PRESENT_OFFSET, 12065 }, - { 0xfb98, G_UNICODE_NOT_PRESENT_OFFSET, 12065 }, - { 0xfb99, G_UNICODE_NOT_PRESENT_OFFSET, 12065 }, - { 0xfb9a, G_UNICODE_NOT_PRESENT_OFFSET, 12068 }, - { 0xfb9b, G_UNICODE_NOT_PRESENT_OFFSET, 12068 }, - { 0xfb9c, G_UNICODE_NOT_PRESENT_OFFSET, 12068 }, - { 0xfb9d, G_UNICODE_NOT_PRESENT_OFFSET, 12068 }, - { 0xfb9e, G_UNICODE_NOT_PRESENT_OFFSET, 12071 }, - { 0xfb9f, G_UNICODE_NOT_PRESENT_OFFSET, 12071 }, - { 0xfba0, G_UNICODE_NOT_PRESENT_OFFSET, 12074 }, - { 0xfba1, G_UNICODE_NOT_PRESENT_OFFSET, 12074 }, - { 0xfba2, G_UNICODE_NOT_PRESENT_OFFSET, 12074 }, - { 0xfba3, G_UNICODE_NOT_PRESENT_OFFSET, 12074 }, - { 0xfba4, G_UNICODE_NOT_PRESENT_OFFSET, 1718 }, - { 0xfba5, G_UNICODE_NOT_PRESENT_OFFSET, 1718 }, - { 0xfba6, G_UNICODE_NOT_PRESENT_OFFSET, 12077 }, - { 0xfba7, G_UNICODE_NOT_PRESENT_OFFSET, 12077 }, - { 0xfba8, G_UNICODE_NOT_PRESENT_OFFSET, 12077 }, - { 0xfba9, G_UNICODE_NOT_PRESENT_OFFSET, 12077 }, - { 0xfbaa, G_UNICODE_NOT_PRESENT_OFFSET, 12080 }, - { 0xfbab, G_UNICODE_NOT_PRESENT_OFFSET, 12080 }, - { 0xfbac, G_UNICODE_NOT_PRESENT_OFFSET, 12080 }, - { 0xfbad, G_UNICODE_NOT_PRESENT_OFFSET, 12080 }, - { 0xfbae, G_UNICODE_NOT_PRESENT_OFFSET, 12083 }, - { 0xfbaf, G_UNICODE_NOT_PRESENT_OFFSET, 12083 }, - { 0xfbb0, G_UNICODE_NOT_PRESENT_OFFSET, 1728 }, - { 0xfbb1, G_UNICODE_NOT_PRESENT_OFFSET, 1728 }, - { 0xfbd3, G_UNICODE_NOT_PRESENT_OFFSET, 12086 }, - { 0xfbd4, G_UNICODE_NOT_PRESENT_OFFSET, 12086 }, - { 0xfbd5, G_UNICODE_NOT_PRESENT_OFFSET, 12086 }, - { 0xfbd6, G_UNICODE_NOT_PRESENT_OFFSET, 12086 }, - { 0xfbd7, G_UNICODE_NOT_PRESENT_OFFSET, 12089 }, - { 0xfbd8, G_UNICODE_NOT_PRESENT_OFFSET, 12089 }, - { 0xfbd9, G_UNICODE_NOT_PRESENT_OFFSET, 12092 }, - { 0xfbda, G_UNICODE_NOT_PRESENT_OFFSET, 12092 }, - { 0xfbdb, G_UNICODE_NOT_PRESENT_OFFSET, 12095 }, - { 0xfbdc, G_UNICODE_NOT_PRESENT_OFFSET, 12095 }, - { 0xfbdd, G_UNICODE_NOT_PRESENT_OFFSET, 1708 }, - { 0xfbde, G_UNICODE_NOT_PRESENT_OFFSET, 12098 }, - { 0xfbdf, G_UNICODE_NOT_PRESENT_OFFSET, 12098 }, - { 0xfbe0, G_UNICODE_NOT_PRESENT_OFFSET, 12101 }, - { 0xfbe1, G_UNICODE_NOT_PRESENT_OFFSET, 12101 }, - { 0xfbe2, G_UNICODE_NOT_PRESENT_OFFSET, 12104 }, - { 0xfbe3, G_UNICODE_NOT_PRESENT_OFFSET, 12104 }, - { 0xfbe4, G_UNICODE_NOT_PRESENT_OFFSET, 12107 }, - { 0xfbe5, G_UNICODE_NOT_PRESENT_OFFSET, 12107 }, - { 0xfbe6, G_UNICODE_NOT_PRESENT_OFFSET, 12107 }, - { 0xfbe7, G_UNICODE_NOT_PRESENT_OFFSET, 12107 }, - { 0xfbe8, G_UNICODE_NOT_PRESENT_OFFSET, 12110 }, - { 0xfbe9, G_UNICODE_NOT_PRESENT_OFFSET, 12110 }, - { 0xfbea, G_UNICODE_NOT_PRESENT_OFFSET, 12113 }, - { 0xfbeb, G_UNICODE_NOT_PRESENT_OFFSET, 12113 }, - { 0xfbec, G_UNICODE_NOT_PRESENT_OFFSET, 12120 }, - { 0xfbed, G_UNICODE_NOT_PRESENT_OFFSET, 12120 }, - { 0xfbee, G_UNICODE_NOT_PRESENT_OFFSET, 12127 }, - { 0xfbef, G_UNICODE_NOT_PRESENT_OFFSET, 12127 }, - { 0xfbf0, G_UNICODE_NOT_PRESENT_OFFSET, 12134 }, - { 0xfbf1, G_UNICODE_NOT_PRESENT_OFFSET, 12134 }, - { 0xfbf2, G_UNICODE_NOT_PRESENT_OFFSET, 12141 }, - { 0xfbf3, G_UNICODE_NOT_PRESENT_OFFSET, 12141 }, - { 0xfbf4, G_UNICODE_NOT_PRESENT_OFFSET, 12148 }, - { 0xfbf5, G_UNICODE_NOT_PRESENT_OFFSET, 12148 }, - { 0xfbf6, G_UNICODE_NOT_PRESENT_OFFSET, 12155 }, - { 0xfbf7, G_UNICODE_NOT_PRESENT_OFFSET, 12155 }, - { 0xfbf8, G_UNICODE_NOT_PRESENT_OFFSET, 12155 }, - { 0xfbf9, G_UNICODE_NOT_PRESENT_OFFSET, 12162 }, - { 0xfbfa, G_UNICODE_NOT_PRESENT_OFFSET, 12162 }, - { 0xfbfb, G_UNICODE_NOT_PRESENT_OFFSET, 12162 }, - { 0xfbfc, G_UNICODE_NOT_PRESENT_OFFSET, 12169 }, - { 0xfbfd, G_UNICODE_NOT_PRESENT_OFFSET, 12169 }, - { 0xfbfe, G_UNICODE_NOT_PRESENT_OFFSET, 12169 }, - { 0xfbff, G_UNICODE_NOT_PRESENT_OFFSET, 12169 }, - { 0xfc00, G_UNICODE_NOT_PRESENT_OFFSET, 12172 }, - { 0xfc01, G_UNICODE_NOT_PRESENT_OFFSET, 12179 }, - { 0xfc02, G_UNICODE_NOT_PRESENT_OFFSET, 12186 }, - { 0xfc03, G_UNICODE_NOT_PRESENT_OFFSET, 12162 }, - { 0xfc04, G_UNICODE_NOT_PRESENT_OFFSET, 12193 }, - { 0xfc05, G_UNICODE_NOT_PRESENT_OFFSET, 12200 }, - { 0xfc06, G_UNICODE_NOT_PRESENT_OFFSET, 12205 }, - { 0xfc07, G_UNICODE_NOT_PRESENT_OFFSET, 12210 }, - { 0xfc08, G_UNICODE_NOT_PRESENT_OFFSET, 12215 }, - { 0xfc09, G_UNICODE_NOT_PRESENT_OFFSET, 12220 }, - { 0xfc0a, G_UNICODE_NOT_PRESENT_OFFSET, 12225 }, - { 0xfc0b, G_UNICODE_NOT_PRESENT_OFFSET, 12230 }, - { 0xfc0c, G_UNICODE_NOT_PRESENT_OFFSET, 12235 }, - { 0xfc0d, G_UNICODE_NOT_PRESENT_OFFSET, 12240 }, - { 0xfc0e, G_UNICODE_NOT_PRESENT_OFFSET, 12245 }, - { 0xfc0f, G_UNICODE_NOT_PRESENT_OFFSET, 12250 }, - { 0xfc10, G_UNICODE_NOT_PRESENT_OFFSET, 12255 }, - { 0xfc11, G_UNICODE_NOT_PRESENT_OFFSET, 12260 }, - { 0xfc12, G_UNICODE_NOT_PRESENT_OFFSET, 12265 }, - { 0xfc13, G_UNICODE_NOT_PRESENT_OFFSET, 12270 }, - { 0xfc14, G_UNICODE_NOT_PRESENT_OFFSET, 12275 }, - { 0xfc15, G_UNICODE_NOT_PRESENT_OFFSET, 12280 }, - { 0xfc16, G_UNICODE_NOT_PRESENT_OFFSET, 12285 }, - { 0xfc17, G_UNICODE_NOT_PRESENT_OFFSET, 12290 }, - { 0xfc18, G_UNICODE_NOT_PRESENT_OFFSET, 12295 }, - { 0xfc19, G_UNICODE_NOT_PRESENT_OFFSET, 12300 }, - { 0xfc1a, G_UNICODE_NOT_PRESENT_OFFSET, 12305 }, - { 0xfc1b, G_UNICODE_NOT_PRESENT_OFFSET, 12310 }, - { 0xfc1c, G_UNICODE_NOT_PRESENT_OFFSET, 12315 }, - { 0xfc1d, G_UNICODE_NOT_PRESENT_OFFSET, 12320 }, - { 0xfc1e, G_UNICODE_NOT_PRESENT_OFFSET, 12325 }, - { 0xfc1f, G_UNICODE_NOT_PRESENT_OFFSET, 12330 }, - { 0xfc20, G_UNICODE_NOT_PRESENT_OFFSET, 12335 }, - { 0xfc21, G_UNICODE_NOT_PRESENT_OFFSET, 12340 }, - { 0xfc22, G_UNICODE_NOT_PRESENT_OFFSET, 12345 }, - { 0xfc23, G_UNICODE_NOT_PRESENT_OFFSET, 12350 }, - { 0xfc24, G_UNICODE_NOT_PRESENT_OFFSET, 12355 }, - { 0xfc25, G_UNICODE_NOT_PRESENT_OFFSET, 12360 }, - { 0xfc26, G_UNICODE_NOT_PRESENT_OFFSET, 12365 }, - { 0xfc27, G_UNICODE_NOT_PRESENT_OFFSET, 12370 }, - { 0xfc28, G_UNICODE_NOT_PRESENT_OFFSET, 12375 }, - { 0xfc29, G_UNICODE_NOT_PRESENT_OFFSET, 12380 }, - { 0xfc2a, G_UNICODE_NOT_PRESENT_OFFSET, 12385 }, - { 0xfc2b, G_UNICODE_NOT_PRESENT_OFFSET, 12390 }, - { 0xfc2c, G_UNICODE_NOT_PRESENT_OFFSET, 12395 }, - { 0xfc2d, G_UNICODE_NOT_PRESENT_OFFSET, 12400 }, - { 0xfc2e, G_UNICODE_NOT_PRESENT_OFFSET, 12405 }, - { 0xfc2f, G_UNICODE_NOT_PRESENT_OFFSET, 12410 }, - { 0xfc30, G_UNICODE_NOT_PRESENT_OFFSET, 12415 }, - { 0xfc31, G_UNICODE_NOT_PRESENT_OFFSET, 12420 }, - { 0xfc32, G_UNICODE_NOT_PRESENT_OFFSET, 12425 }, - { 0xfc33, G_UNICODE_NOT_PRESENT_OFFSET, 12430 }, - { 0xfc34, G_UNICODE_NOT_PRESENT_OFFSET, 12435 }, - { 0xfc35, G_UNICODE_NOT_PRESENT_OFFSET, 12440 }, - { 0xfc36, G_UNICODE_NOT_PRESENT_OFFSET, 12445 }, - { 0xfc37, G_UNICODE_NOT_PRESENT_OFFSET, 12450 }, - { 0xfc38, G_UNICODE_NOT_PRESENT_OFFSET, 12455 }, - { 0xfc39, G_UNICODE_NOT_PRESENT_OFFSET, 12460 }, - { 0xfc3a, G_UNICODE_NOT_PRESENT_OFFSET, 12465 }, - { 0xfc3b, G_UNICODE_NOT_PRESENT_OFFSET, 12470 }, - { 0xfc3c, G_UNICODE_NOT_PRESENT_OFFSET, 12475 }, - { 0xfc3d, G_UNICODE_NOT_PRESENT_OFFSET, 12480 }, - { 0xfc3e, G_UNICODE_NOT_PRESENT_OFFSET, 12485 }, - { 0xfc3f, G_UNICODE_NOT_PRESENT_OFFSET, 12490 }, - { 0xfc40, G_UNICODE_NOT_PRESENT_OFFSET, 12495 }, - { 0xfc41, G_UNICODE_NOT_PRESENT_OFFSET, 12500 }, - { 0xfc42, G_UNICODE_NOT_PRESENT_OFFSET, 12505 }, - { 0xfc43, G_UNICODE_NOT_PRESENT_OFFSET, 12510 }, - { 0xfc44, G_UNICODE_NOT_PRESENT_OFFSET, 12515 }, - { 0xfc45, G_UNICODE_NOT_PRESENT_OFFSET, 12520 }, - { 0xfc46, G_UNICODE_NOT_PRESENT_OFFSET, 12525 }, - { 0xfc47, G_UNICODE_NOT_PRESENT_OFFSET, 12530 }, - { 0xfc48, G_UNICODE_NOT_PRESENT_OFFSET, 12535 }, - { 0xfc49, G_UNICODE_NOT_PRESENT_OFFSET, 12540 }, - { 0xfc4a, G_UNICODE_NOT_PRESENT_OFFSET, 12545 }, - { 0xfc4b, G_UNICODE_NOT_PRESENT_OFFSET, 12550 }, - { 0xfc4c, G_UNICODE_NOT_PRESENT_OFFSET, 12555 }, - { 0xfc4d, G_UNICODE_NOT_PRESENT_OFFSET, 12560 }, - { 0xfc4e, G_UNICODE_NOT_PRESENT_OFFSET, 12565 }, - { 0xfc4f, G_UNICODE_NOT_PRESENT_OFFSET, 12570 }, - { 0xfc50, G_UNICODE_NOT_PRESENT_OFFSET, 12575 }, - { 0xfc51, G_UNICODE_NOT_PRESENT_OFFSET, 12580 }, - { 0xfc52, G_UNICODE_NOT_PRESENT_OFFSET, 12585 }, - { 0xfc53, G_UNICODE_NOT_PRESENT_OFFSET, 12590 }, - { 0xfc54, G_UNICODE_NOT_PRESENT_OFFSET, 12595 }, - { 0xfc55, G_UNICODE_NOT_PRESENT_OFFSET, 12600 }, - { 0xfc56, G_UNICODE_NOT_PRESENT_OFFSET, 12605 }, - { 0xfc57, G_UNICODE_NOT_PRESENT_OFFSET, 12610 }, - { 0xfc58, G_UNICODE_NOT_PRESENT_OFFSET, 12615 }, - { 0xfc59, G_UNICODE_NOT_PRESENT_OFFSET, 12620 }, - { 0xfc5a, G_UNICODE_NOT_PRESENT_OFFSET, 12625 }, - { 0xfc5b, G_UNICODE_NOT_PRESENT_OFFSET, 12630 }, - { 0xfc5c, G_UNICODE_NOT_PRESENT_OFFSET, 12635 }, - { 0xfc5d, G_UNICODE_NOT_PRESENT_OFFSET, 12640 }, - { 0xfc5e, G_UNICODE_NOT_PRESENT_OFFSET, 12645 }, - { 0xfc5f, G_UNICODE_NOT_PRESENT_OFFSET, 12651 }, - { 0xfc60, G_UNICODE_NOT_PRESENT_OFFSET, 12657 }, - { 0xfc61, G_UNICODE_NOT_PRESENT_OFFSET, 12663 }, - { 0xfc62, G_UNICODE_NOT_PRESENT_OFFSET, 12669 }, - { 0xfc63, G_UNICODE_NOT_PRESENT_OFFSET, 12675 }, - { 0xfc64, G_UNICODE_NOT_PRESENT_OFFSET, 12681 }, - { 0xfc65, G_UNICODE_NOT_PRESENT_OFFSET, 12688 }, - { 0xfc66, G_UNICODE_NOT_PRESENT_OFFSET, 12186 }, - { 0xfc67, G_UNICODE_NOT_PRESENT_OFFSET, 12695 }, - { 0xfc68, G_UNICODE_NOT_PRESENT_OFFSET, 12162 }, - { 0xfc69, G_UNICODE_NOT_PRESENT_OFFSET, 12193 }, - { 0xfc6a, G_UNICODE_NOT_PRESENT_OFFSET, 12702 }, - { 0xfc6b, G_UNICODE_NOT_PRESENT_OFFSET, 12707 }, - { 0xfc6c, G_UNICODE_NOT_PRESENT_OFFSET, 12215 }, - { 0xfc6d, G_UNICODE_NOT_PRESENT_OFFSET, 12712 }, - { 0xfc6e, G_UNICODE_NOT_PRESENT_OFFSET, 12220 }, - { 0xfc6f, G_UNICODE_NOT_PRESENT_OFFSET, 12225 }, - { 0xfc70, G_UNICODE_NOT_PRESENT_OFFSET, 12717 }, - { 0xfc71, G_UNICODE_NOT_PRESENT_OFFSET, 12722 }, - { 0xfc72, G_UNICODE_NOT_PRESENT_OFFSET, 12245 }, - { 0xfc73, G_UNICODE_NOT_PRESENT_OFFSET, 12727 }, - { 0xfc74, G_UNICODE_NOT_PRESENT_OFFSET, 12250 }, - { 0xfc75, G_UNICODE_NOT_PRESENT_OFFSET, 12255 }, - { 0xfc76, G_UNICODE_NOT_PRESENT_OFFSET, 12732 }, - { 0xfc77, G_UNICODE_NOT_PRESENT_OFFSET, 12737 }, - { 0xfc78, G_UNICODE_NOT_PRESENT_OFFSET, 12265 }, - { 0xfc79, G_UNICODE_NOT_PRESENT_OFFSET, 12742 }, - { 0xfc7a, G_UNICODE_NOT_PRESENT_OFFSET, 12270 }, - { 0xfc7b, G_UNICODE_NOT_PRESENT_OFFSET, 12275 }, - { 0xfc7c, G_UNICODE_NOT_PRESENT_OFFSET, 12420 }, - { 0xfc7d, G_UNICODE_NOT_PRESENT_OFFSET, 12425 }, - { 0xfc7e, G_UNICODE_NOT_PRESENT_OFFSET, 12440 }, - { 0xfc7f, G_UNICODE_NOT_PRESENT_OFFSET, 12445 }, - { 0xfc80, G_UNICODE_NOT_PRESENT_OFFSET, 12450 }, - { 0xfc81, G_UNICODE_NOT_PRESENT_OFFSET, 12470 }, - { 0xfc82, G_UNICODE_NOT_PRESENT_OFFSET, 12475 }, - { 0xfc83, G_UNICODE_NOT_PRESENT_OFFSET, 12480 }, - { 0xfc84, G_UNICODE_NOT_PRESENT_OFFSET, 12485 }, - { 0xfc85, G_UNICODE_NOT_PRESENT_OFFSET, 12505 }, - { 0xfc86, G_UNICODE_NOT_PRESENT_OFFSET, 12510 }, - { 0xfc87, G_UNICODE_NOT_PRESENT_OFFSET, 12515 }, - { 0xfc88, G_UNICODE_NOT_PRESENT_OFFSET, 12747 }, - { 0xfc89, G_UNICODE_NOT_PRESENT_OFFSET, 12535 }, - { 0xfc8a, G_UNICODE_NOT_PRESENT_OFFSET, 12752 }, - { 0xfc8b, G_UNICODE_NOT_PRESENT_OFFSET, 12757 }, - { 0xfc8c, G_UNICODE_NOT_PRESENT_OFFSET, 12565 }, - { 0xfc8d, G_UNICODE_NOT_PRESENT_OFFSET, 12762 }, - { 0xfc8e, G_UNICODE_NOT_PRESENT_OFFSET, 12570 }, - { 0xfc8f, G_UNICODE_NOT_PRESENT_OFFSET, 12575 }, - { 0xfc90, G_UNICODE_NOT_PRESENT_OFFSET, 12640 }, - { 0xfc91, G_UNICODE_NOT_PRESENT_OFFSET, 12767 }, - { 0xfc92, G_UNICODE_NOT_PRESENT_OFFSET, 12772 }, - { 0xfc93, G_UNICODE_NOT_PRESENT_OFFSET, 12615 }, - { 0xfc94, G_UNICODE_NOT_PRESENT_OFFSET, 12777 }, - { 0xfc95, G_UNICODE_NOT_PRESENT_OFFSET, 12620 }, - { 0xfc96, G_UNICODE_NOT_PRESENT_OFFSET, 12625 }, - { 0xfc97, G_UNICODE_NOT_PRESENT_OFFSET, 12172 }, - { 0xfc98, G_UNICODE_NOT_PRESENT_OFFSET, 12179 }, - { 0xfc99, G_UNICODE_NOT_PRESENT_OFFSET, 12782 }, - { 0xfc9a, G_UNICODE_NOT_PRESENT_OFFSET, 12186 }, - { 0xfc9b, G_UNICODE_NOT_PRESENT_OFFSET, 12789 }, - { 0xfc9c, G_UNICODE_NOT_PRESENT_OFFSET, 12200 }, - { 0xfc9d, G_UNICODE_NOT_PRESENT_OFFSET, 12205 }, - { 0xfc9e, G_UNICODE_NOT_PRESENT_OFFSET, 12210 }, - { 0xfc9f, G_UNICODE_NOT_PRESENT_OFFSET, 12215 }, - { 0xfca0, G_UNICODE_NOT_PRESENT_OFFSET, 12796 }, - { 0xfca1, G_UNICODE_NOT_PRESENT_OFFSET, 12230 }, - { 0xfca2, G_UNICODE_NOT_PRESENT_OFFSET, 12235 }, - { 0xfca3, G_UNICODE_NOT_PRESENT_OFFSET, 12240 }, - { 0xfca4, G_UNICODE_NOT_PRESENT_OFFSET, 12245 }, - { 0xfca5, G_UNICODE_NOT_PRESENT_OFFSET, 12801 }, - { 0xfca6, G_UNICODE_NOT_PRESENT_OFFSET, 12265 }, - { 0xfca7, G_UNICODE_NOT_PRESENT_OFFSET, 12280 }, - { 0xfca8, G_UNICODE_NOT_PRESENT_OFFSET, 12285 }, - { 0xfca9, G_UNICODE_NOT_PRESENT_OFFSET, 12290 }, - { 0xfcaa, G_UNICODE_NOT_PRESENT_OFFSET, 12295 }, - { 0xfcab, G_UNICODE_NOT_PRESENT_OFFSET, 12300 }, - { 0xfcac, G_UNICODE_NOT_PRESENT_OFFSET, 12310 }, - { 0xfcad, G_UNICODE_NOT_PRESENT_OFFSET, 12315 }, - { 0xfcae, G_UNICODE_NOT_PRESENT_OFFSET, 12320 }, - { 0xfcaf, G_UNICODE_NOT_PRESENT_OFFSET, 12325 }, - { 0xfcb0, G_UNICODE_NOT_PRESENT_OFFSET, 12330 }, - { 0xfcb1, G_UNICODE_NOT_PRESENT_OFFSET, 12335 }, - { 0xfcb2, G_UNICODE_NOT_PRESENT_OFFSET, 12806 }, - { 0xfcb3, G_UNICODE_NOT_PRESENT_OFFSET, 12340 }, - { 0xfcb4, G_UNICODE_NOT_PRESENT_OFFSET, 12345 }, - { 0xfcb5, G_UNICODE_NOT_PRESENT_OFFSET, 12350 }, - { 0xfcb6, G_UNICODE_NOT_PRESENT_OFFSET, 12355 }, - { 0xfcb7, G_UNICODE_NOT_PRESENT_OFFSET, 12360 }, - { 0xfcb8, G_UNICODE_NOT_PRESENT_OFFSET, 12365 }, - { 0xfcb9, G_UNICODE_NOT_PRESENT_OFFSET, 12375 }, - { 0xfcba, G_UNICODE_NOT_PRESENT_OFFSET, 12380 }, - { 0xfcbb, G_UNICODE_NOT_PRESENT_OFFSET, 12385 }, - { 0xfcbc, G_UNICODE_NOT_PRESENT_OFFSET, 12390 }, - { 0xfcbd, G_UNICODE_NOT_PRESENT_OFFSET, 12395 }, - { 0xfcbe, G_UNICODE_NOT_PRESENT_OFFSET, 12400 }, - { 0xfcbf, G_UNICODE_NOT_PRESENT_OFFSET, 12405 }, - { 0xfcc0, G_UNICODE_NOT_PRESENT_OFFSET, 12410 }, - { 0xfcc1, G_UNICODE_NOT_PRESENT_OFFSET, 12415 }, - { 0xfcc2, G_UNICODE_NOT_PRESENT_OFFSET, 12430 }, - { 0xfcc3, G_UNICODE_NOT_PRESENT_OFFSET, 12435 }, - { 0xfcc4, G_UNICODE_NOT_PRESENT_OFFSET, 12455 }, - { 0xfcc5, G_UNICODE_NOT_PRESENT_OFFSET, 12460 }, - { 0xfcc6, G_UNICODE_NOT_PRESENT_OFFSET, 12465 }, - { 0xfcc7, G_UNICODE_NOT_PRESENT_OFFSET, 12470 }, - { 0xfcc8, G_UNICODE_NOT_PRESENT_OFFSET, 12475 }, - { 0xfcc9, G_UNICODE_NOT_PRESENT_OFFSET, 12490 }, - { 0xfcca, G_UNICODE_NOT_PRESENT_OFFSET, 12495 }, - { 0xfccb, G_UNICODE_NOT_PRESENT_OFFSET, 12500 }, - { 0xfccc, G_UNICODE_NOT_PRESENT_OFFSET, 12505 }, - { 0xfccd, G_UNICODE_NOT_PRESENT_OFFSET, 12811 }, - { 0xfcce, G_UNICODE_NOT_PRESENT_OFFSET, 12520 }, - { 0xfccf, G_UNICODE_NOT_PRESENT_OFFSET, 12525 }, - { 0xfcd0, G_UNICODE_NOT_PRESENT_OFFSET, 12530 }, - { 0xfcd1, G_UNICODE_NOT_PRESENT_OFFSET, 12535 }, - { 0xfcd2, G_UNICODE_NOT_PRESENT_OFFSET, 12550 }, - { 0xfcd3, G_UNICODE_NOT_PRESENT_OFFSET, 12555 }, - { 0xfcd4, G_UNICODE_NOT_PRESENT_OFFSET, 12560 }, - { 0xfcd5, G_UNICODE_NOT_PRESENT_OFFSET, 12565 }, - { 0xfcd6, G_UNICODE_NOT_PRESENT_OFFSET, 12816 }, - { 0xfcd7, G_UNICODE_NOT_PRESENT_OFFSET, 12580 }, - { 0xfcd8, G_UNICODE_NOT_PRESENT_OFFSET, 12585 }, - { 0xfcd9, G_UNICODE_NOT_PRESENT_OFFSET, 12821 }, - { 0xfcda, G_UNICODE_NOT_PRESENT_OFFSET, 12600 }, - { 0xfcdb, G_UNICODE_NOT_PRESENT_OFFSET, 12605 }, - { 0xfcdc, G_UNICODE_NOT_PRESENT_OFFSET, 12610 }, - { 0xfcdd, G_UNICODE_NOT_PRESENT_OFFSET, 12615 }, - { 0xfcde, G_UNICODE_NOT_PRESENT_OFFSET, 12826 }, - { 0xfcdf, G_UNICODE_NOT_PRESENT_OFFSET, 12186 }, - { 0xfce0, G_UNICODE_NOT_PRESENT_OFFSET, 12789 }, - { 0xfce1, G_UNICODE_NOT_PRESENT_OFFSET, 12215 }, - { 0xfce2, G_UNICODE_NOT_PRESENT_OFFSET, 12796 }, - { 0xfce3, G_UNICODE_NOT_PRESENT_OFFSET, 12245 }, - { 0xfce4, G_UNICODE_NOT_PRESENT_OFFSET, 12801 }, - { 0xfce5, G_UNICODE_NOT_PRESENT_OFFSET, 12265 }, - { 0xfce6, G_UNICODE_NOT_PRESENT_OFFSET, 12831 }, - { 0xfce7, G_UNICODE_NOT_PRESENT_OFFSET, 12330 }, - { 0xfce8, G_UNICODE_NOT_PRESENT_OFFSET, 12836 }, - { 0xfce9, G_UNICODE_NOT_PRESENT_OFFSET, 12841 }, - { 0xfcea, G_UNICODE_NOT_PRESENT_OFFSET, 12846 }, - { 0xfceb, G_UNICODE_NOT_PRESENT_OFFSET, 12470 }, - { 0xfcec, G_UNICODE_NOT_PRESENT_OFFSET, 12475 }, - { 0xfced, G_UNICODE_NOT_PRESENT_OFFSET, 12505 }, - { 0xfcee, G_UNICODE_NOT_PRESENT_OFFSET, 12565 }, - { 0xfcef, G_UNICODE_NOT_PRESENT_OFFSET, 12816 }, - { 0xfcf0, G_UNICODE_NOT_PRESENT_OFFSET, 12615 }, - { 0xfcf1, G_UNICODE_NOT_PRESENT_OFFSET, 12826 }, - { 0xfcf2, G_UNICODE_NOT_PRESENT_OFFSET, 12851 }, - { 0xfcf3, G_UNICODE_NOT_PRESENT_OFFSET, 12858 }, - { 0xfcf4, G_UNICODE_NOT_PRESENT_OFFSET, 12865 }, - { 0xfcf5, G_UNICODE_NOT_PRESENT_OFFSET, 12872 }, - { 0xfcf6, G_UNICODE_NOT_PRESENT_OFFSET, 12877 }, - { 0xfcf7, G_UNICODE_NOT_PRESENT_OFFSET, 12882 }, - { 0xfcf8, G_UNICODE_NOT_PRESENT_OFFSET, 12887 }, - { 0xfcf9, G_UNICODE_NOT_PRESENT_OFFSET, 12892 }, - { 0xfcfa, G_UNICODE_NOT_PRESENT_OFFSET, 12897 }, - { 0xfcfb, G_UNICODE_NOT_PRESENT_OFFSET, 12902 }, - { 0xfcfc, G_UNICODE_NOT_PRESENT_OFFSET, 12907 }, - { 0xfcfd, G_UNICODE_NOT_PRESENT_OFFSET, 12912 }, - { 0xfcfe, G_UNICODE_NOT_PRESENT_OFFSET, 12917 }, - { 0xfcff, G_UNICODE_NOT_PRESENT_OFFSET, 12922 }, - { 0xfd00, G_UNICODE_NOT_PRESENT_OFFSET, 12927 }, - { 0xfd01, G_UNICODE_NOT_PRESENT_OFFSET, 12932 }, - { 0xfd02, G_UNICODE_NOT_PRESENT_OFFSET, 12937 }, - { 0xfd03, G_UNICODE_NOT_PRESENT_OFFSET, 12942 }, - { 0xfd04, G_UNICODE_NOT_PRESENT_OFFSET, 12947 }, - { 0xfd05, G_UNICODE_NOT_PRESENT_OFFSET, 12952 }, - { 0xfd06, G_UNICODE_NOT_PRESENT_OFFSET, 12957 }, - { 0xfd07, G_UNICODE_NOT_PRESENT_OFFSET, 12962 }, - { 0xfd08, G_UNICODE_NOT_PRESENT_OFFSET, 12967 }, - { 0xfd09, G_UNICODE_NOT_PRESENT_OFFSET, 12972 }, - { 0xfd0a, G_UNICODE_NOT_PRESENT_OFFSET, 12977 }, - { 0xfd0b, G_UNICODE_NOT_PRESENT_OFFSET, 12982 }, - { 0xfd0c, G_UNICODE_NOT_PRESENT_OFFSET, 12841 }, - { 0xfd0d, G_UNICODE_NOT_PRESENT_OFFSET, 12987 }, - { 0xfd0e, G_UNICODE_NOT_PRESENT_OFFSET, 12992 }, - { 0xfd0f, G_UNICODE_NOT_PRESENT_OFFSET, 12997 }, - { 0xfd10, G_UNICODE_NOT_PRESENT_OFFSET, 13002 }, - { 0xfd11, G_UNICODE_NOT_PRESENT_OFFSET, 12872 }, - { 0xfd12, G_UNICODE_NOT_PRESENT_OFFSET, 12877 }, - { 0xfd13, G_UNICODE_NOT_PRESENT_OFFSET, 12882 }, - { 0xfd14, G_UNICODE_NOT_PRESENT_OFFSET, 12887 }, - { 0xfd15, G_UNICODE_NOT_PRESENT_OFFSET, 12892 }, - { 0xfd16, G_UNICODE_NOT_PRESENT_OFFSET, 12897 }, - { 0xfd17, G_UNICODE_NOT_PRESENT_OFFSET, 12902 }, - { 0xfd18, G_UNICODE_NOT_PRESENT_OFFSET, 12907 }, - { 0xfd19, G_UNICODE_NOT_PRESENT_OFFSET, 12912 }, - { 0xfd1a, G_UNICODE_NOT_PRESENT_OFFSET, 12917 }, - { 0xfd1b, G_UNICODE_NOT_PRESENT_OFFSET, 12922 }, - { 0xfd1c, G_UNICODE_NOT_PRESENT_OFFSET, 12927 }, - { 0xfd1d, G_UNICODE_NOT_PRESENT_OFFSET, 12932 }, - { 0xfd1e, G_UNICODE_NOT_PRESENT_OFFSET, 12937 }, - { 0xfd1f, G_UNICODE_NOT_PRESENT_OFFSET, 12942 }, - { 0xfd20, G_UNICODE_NOT_PRESENT_OFFSET, 12947 }, - { 0xfd21, G_UNICODE_NOT_PRESENT_OFFSET, 12952 }, - { 0xfd22, G_UNICODE_NOT_PRESENT_OFFSET, 12957 }, - { 0xfd23, G_UNICODE_NOT_PRESENT_OFFSET, 12962 }, - { 0xfd24, G_UNICODE_NOT_PRESENT_OFFSET, 12967 }, - { 0xfd25, G_UNICODE_NOT_PRESENT_OFFSET, 12972 }, - { 0xfd26, G_UNICODE_NOT_PRESENT_OFFSET, 12977 }, - { 0xfd27, G_UNICODE_NOT_PRESENT_OFFSET, 12982 }, - { 0xfd28, G_UNICODE_NOT_PRESENT_OFFSET, 12841 }, - { 0xfd29, G_UNICODE_NOT_PRESENT_OFFSET, 12987 }, - { 0xfd2a, G_UNICODE_NOT_PRESENT_OFFSET, 12992 }, - { 0xfd2b, G_UNICODE_NOT_PRESENT_OFFSET, 12997 }, - { 0xfd2c, G_UNICODE_NOT_PRESENT_OFFSET, 13002 }, - { 0xfd2d, G_UNICODE_NOT_PRESENT_OFFSET, 12972 }, - { 0xfd2e, G_UNICODE_NOT_PRESENT_OFFSET, 12977 }, - { 0xfd2f, G_UNICODE_NOT_PRESENT_OFFSET, 12982 }, - { 0xfd30, G_UNICODE_NOT_PRESENT_OFFSET, 12841 }, - { 0xfd31, G_UNICODE_NOT_PRESENT_OFFSET, 12836 }, - { 0xfd32, G_UNICODE_NOT_PRESENT_OFFSET, 12846 }, - { 0xfd33, G_UNICODE_NOT_PRESENT_OFFSET, 12370 }, - { 0xfd34, G_UNICODE_NOT_PRESENT_OFFSET, 12315 }, - { 0xfd35, G_UNICODE_NOT_PRESENT_OFFSET, 12320 }, - { 0xfd36, G_UNICODE_NOT_PRESENT_OFFSET, 12325 }, - { 0xfd37, G_UNICODE_NOT_PRESENT_OFFSET, 12972 }, - { 0xfd38, G_UNICODE_NOT_PRESENT_OFFSET, 12977 }, - { 0xfd39, G_UNICODE_NOT_PRESENT_OFFSET, 12982 }, - { 0xfd3a, G_UNICODE_NOT_PRESENT_OFFSET, 12370 }, - { 0xfd3b, G_UNICODE_NOT_PRESENT_OFFSET, 12375 }, - { 0xfd3c, G_UNICODE_NOT_PRESENT_OFFSET, 13007 }, - { 0xfd3d, G_UNICODE_NOT_PRESENT_OFFSET, 13007 }, - { 0xfd50, G_UNICODE_NOT_PRESENT_OFFSET, 13012 }, - { 0xfd51, G_UNICODE_NOT_PRESENT_OFFSET, 13019 }, - { 0xfd52, G_UNICODE_NOT_PRESENT_OFFSET, 13019 }, - { 0xfd53, G_UNICODE_NOT_PRESENT_OFFSET, 13026 }, - { 0xfd54, G_UNICODE_NOT_PRESENT_OFFSET, 13033 }, - { 0xfd55, G_UNICODE_NOT_PRESENT_OFFSET, 13040 }, - { 0xfd56, G_UNICODE_NOT_PRESENT_OFFSET, 13047 }, - { 0xfd57, G_UNICODE_NOT_PRESENT_OFFSET, 13054 }, - { 0xfd58, G_UNICODE_NOT_PRESENT_OFFSET, 13061 }, - { 0xfd59, G_UNICODE_NOT_PRESENT_OFFSET, 13061 }, - { 0xfd5a, G_UNICODE_NOT_PRESENT_OFFSET, 13068 }, - { 0xfd5b, G_UNICODE_NOT_PRESENT_OFFSET, 13075 }, - { 0xfd5c, G_UNICODE_NOT_PRESENT_OFFSET, 13082 }, - { 0xfd5d, G_UNICODE_NOT_PRESENT_OFFSET, 13089 }, - { 0xfd5e, G_UNICODE_NOT_PRESENT_OFFSET, 13096 }, - { 0xfd5f, G_UNICODE_NOT_PRESENT_OFFSET, 13103 }, - { 0xfd60, G_UNICODE_NOT_PRESENT_OFFSET, 13103 }, - { 0xfd61, G_UNICODE_NOT_PRESENT_OFFSET, 13110 }, - { 0xfd62, G_UNICODE_NOT_PRESENT_OFFSET, 13117 }, - { 0xfd63, G_UNICODE_NOT_PRESENT_OFFSET, 13117 }, - { 0xfd64, G_UNICODE_NOT_PRESENT_OFFSET, 13124 }, - { 0xfd65, G_UNICODE_NOT_PRESENT_OFFSET, 13124 }, - { 0xfd66, G_UNICODE_NOT_PRESENT_OFFSET, 13131 }, - { 0xfd67, G_UNICODE_NOT_PRESENT_OFFSET, 13138 }, - { 0xfd68, G_UNICODE_NOT_PRESENT_OFFSET, 13138 }, - { 0xfd69, G_UNICODE_NOT_PRESENT_OFFSET, 13145 }, - { 0xfd6a, G_UNICODE_NOT_PRESENT_OFFSET, 13152 }, - { 0xfd6b, G_UNICODE_NOT_PRESENT_OFFSET, 13152 }, - { 0xfd6c, G_UNICODE_NOT_PRESENT_OFFSET, 13159 }, - { 0xfd6d, G_UNICODE_NOT_PRESENT_OFFSET, 13159 }, - { 0xfd6e, G_UNICODE_NOT_PRESENT_OFFSET, 13166 }, - { 0xfd6f, G_UNICODE_NOT_PRESENT_OFFSET, 13173 }, - { 0xfd70, G_UNICODE_NOT_PRESENT_OFFSET, 13173 }, - { 0xfd71, G_UNICODE_NOT_PRESENT_OFFSET, 13180 }, - { 0xfd72, G_UNICODE_NOT_PRESENT_OFFSET, 13180 }, - { 0xfd73, G_UNICODE_NOT_PRESENT_OFFSET, 13187 }, - { 0xfd74, G_UNICODE_NOT_PRESENT_OFFSET, 13194 }, - { 0xfd75, G_UNICODE_NOT_PRESENT_OFFSET, 13201 }, - { 0xfd76, G_UNICODE_NOT_PRESENT_OFFSET, 13208 }, - { 0xfd77, G_UNICODE_NOT_PRESENT_OFFSET, 13208 }, - { 0xfd78, G_UNICODE_NOT_PRESENT_OFFSET, 13215 }, - { 0xfd79, G_UNICODE_NOT_PRESENT_OFFSET, 13222 }, - { 0xfd7a, G_UNICODE_NOT_PRESENT_OFFSET, 13229 }, - { 0xfd7b, G_UNICODE_NOT_PRESENT_OFFSET, 13236 }, - { 0xfd7c, G_UNICODE_NOT_PRESENT_OFFSET, 13243 }, - { 0xfd7d, G_UNICODE_NOT_PRESENT_OFFSET, 13243 }, - { 0xfd7e, G_UNICODE_NOT_PRESENT_OFFSET, 13250 }, - { 0xfd7f, G_UNICODE_NOT_PRESENT_OFFSET, 13257 }, - { 0xfd80, G_UNICODE_NOT_PRESENT_OFFSET, 13264 }, - { 0xfd81, G_UNICODE_NOT_PRESENT_OFFSET, 13271 }, - { 0xfd82, G_UNICODE_NOT_PRESENT_OFFSET, 13278 }, - { 0xfd83, G_UNICODE_NOT_PRESENT_OFFSET, 13285 }, - { 0xfd84, G_UNICODE_NOT_PRESENT_OFFSET, 13285 }, - { 0xfd85, G_UNICODE_NOT_PRESENT_OFFSET, 13292 }, - { 0xfd86, G_UNICODE_NOT_PRESENT_OFFSET, 13292 }, - { 0xfd87, G_UNICODE_NOT_PRESENT_OFFSET, 13299 }, - { 0xfd88, G_UNICODE_NOT_PRESENT_OFFSET, 13299 }, - { 0xfd89, G_UNICODE_NOT_PRESENT_OFFSET, 13306 }, - { 0xfd8a, G_UNICODE_NOT_PRESENT_OFFSET, 13313 }, - { 0xfd8b, G_UNICODE_NOT_PRESENT_OFFSET, 13320 }, - { 0xfd8c, G_UNICODE_NOT_PRESENT_OFFSET, 13327 }, - { 0xfd8d, G_UNICODE_NOT_PRESENT_OFFSET, 13334 }, - { 0xfd8e, G_UNICODE_NOT_PRESENT_OFFSET, 13341 }, - { 0xfd8f, G_UNICODE_NOT_PRESENT_OFFSET, 13348 }, - { 0xfd92, G_UNICODE_NOT_PRESENT_OFFSET, 13355 }, - { 0xfd93, G_UNICODE_NOT_PRESENT_OFFSET, 13362 }, - { 0xfd94, G_UNICODE_NOT_PRESENT_OFFSET, 13369 }, - { 0xfd95, G_UNICODE_NOT_PRESENT_OFFSET, 13376 }, - { 0xfd96, G_UNICODE_NOT_PRESENT_OFFSET, 13383 }, - { 0xfd97, G_UNICODE_NOT_PRESENT_OFFSET, 13390 }, - { 0xfd98, G_UNICODE_NOT_PRESENT_OFFSET, 13390 }, - { 0xfd99, G_UNICODE_NOT_PRESENT_OFFSET, 13397 }, - { 0xfd9a, G_UNICODE_NOT_PRESENT_OFFSET, 13404 }, - { 0xfd9b, G_UNICODE_NOT_PRESENT_OFFSET, 13411 }, - { 0xfd9c, G_UNICODE_NOT_PRESENT_OFFSET, 13418 }, - { 0xfd9d, G_UNICODE_NOT_PRESENT_OFFSET, 13418 }, - { 0xfd9e, G_UNICODE_NOT_PRESENT_OFFSET, 13425 }, - { 0xfd9f, G_UNICODE_NOT_PRESENT_OFFSET, 13432 }, - { 0xfda0, G_UNICODE_NOT_PRESENT_OFFSET, 13439 }, - { 0xfda1, G_UNICODE_NOT_PRESENT_OFFSET, 13446 }, - { 0xfda2, G_UNICODE_NOT_PRESENT_OFFSET, 13453 }, - { 0xfda3, G_UNICODE_NOT_PRESENT_OFFSET, 13460 }, - { 0xfda4, G_UNICODE_NOT_PRESENT_OFFSET, 13467 }, - { 0xfda5, G_UNICODE_NOT_PRESENT_OFFSET, 13474 }, - { 0xfda6, G_UNICODE_NOT_PRESENT_OFFSET, 13481 }, - { 0xfda7, G_UNICODE_NOT_PRESENT_OFFSET, 13488 }, - { 0xfda8, G_UNICODE_NOT_PRESENT_OFFSET, 13495 }, - { 0xfda9, G_UNICODE_NOT_PRESENT_OFFSET, 13502 }, - { 0xfdaa, G_UNICODE_NOT_PRESENT_OFFSET, 13509 }, - { 0xfdab, G_UNICODE_NOT_PRESENT_OFFSET, 13516 }, - { 0xfdac, G_UNICODE_NOT_PRESENT_OFFSET, 13523 }, - { 0xfdad, G_UNICODE_NOT_PRESENT_OFFSET, 13530 }, - { 0xfdae, G_UNICODE_NOT_PRESENT_OFFSET, 13537 }, - { 0xfdaf, G_UNICODE_NOT_PRESENT_OFFSET, 13544 }, - { 0xfdb0, G_UNICODE_NOT_PRESENT_OFFSET, 13551 }, - { 0xfdb1, G_UNICODE_NOT_PRESENT_OFFSET, 13558 }, - { 0xfdb2, G_UNICODE_NOT_PRESENT_OFFSET, 13565 }, - { 0xfdb3, G_UNICODE_NOT_PRESENT_OFFSET, 13572 }, - { 0xfdb4, G_UNICODE_NOT_PRESENT_OFFSET, 13250 }, - { 0xfdb5, G_UNICODE_NOT_PRESENT_OFFSET, 13264 }, - { 0xfdb6, G_UNICODE_NOT_PRESENT_OFFSET, 13579 }, - { 0xfdb7, G_UNICODE_NOT_PRESENT_OFFSET, 13586 }, - { 0xfdb8, G_UNICODE_NOT_PRESENT_OFFSET, 13593 }, - { 0xfdb9, G_UNICODE_NOT_PRESENT_OFFSET, 13600 }, - { 0xfdba, G_UNICODE_NOT_PRESENT_OFFSET, 13607 }, - { 0xfdbb, G_UNICODE_NOT_PRESENT_OFFSET, 13614 }, - { 0xfdbc, G_UNICODE_NOT_PRESENT_OFFSET, 13607 }, - { 0xfdbd, G_UNICODE_NOT_PRESENT_OFFSET, 13593 }, - { 0xfdbe, G_UNICODE_NOT_PRESENT_OFFSET, 13621 }, - { 0xfdbf, G_UNICODE_NOT_PRESENT_OFFSET, 13628 }, - { 0xfdc0, G_UNICODE_NOT_PRESENT_OFFSET, 13635 }, - { 0xfdc1, G_UNICODE_NOT_PRESENT_OFFSET, 13642 }, - { 0xfdc2, G_UNICODE_NOT_PRESENT_OFFSET, 13649 }, - { 0xfdc3, G_UNICODE_NOT_PRESENT_OFFSET, 13614 }, - { 0xfdc4, G_UNICODE_NOT_PRESENT_OFFSET, 13201 }, - { 0xfdc5, G_UNICODE_NOT_PRESENT_OFFSET, 13131 }, - { 0xfdc6, G_UNICODE_NOT_PRESENT_OFFSET, 13656 }, - { 0xfdc7, G_UNICODE_NOT_PRESENT_OFFSET, 13663 }, - { 0xfdf0, G_UNICODE_NOT_PRESENT_OFFSET, 13670 }, - { 0xfdf1, G_UNICODE_NOT_PRESENT_OFFSET, 13677 }, - { 0xfdf2, G_UNICODE_NOT_PRESENT_OFFSET, 13684 }, - { 0xfdf3, G_UNICODE_NOT_PRESENT_OFFSET, 13693 }, - { 0xfdf4, G_UNICODE_NOT_PRESENT_OFFSET, 13702 }, - { 0xfdf5, G_UNICODE_NOT_PRESENT_OFFSET, 13711 }, - { 0xfdf6, G_UNICODE_NOT_PRESENT_OFFSET, 13720 }, - { 0xfdf7, G_UNICODE_NOT_PRESENT_OFFSET, 13729 }, - { 0xfdf8, G_UNICODE_NOT_PRESENT_OFFSET, 13738 }, - { 0xfdf9, G_UNICODE_NOT_PRESENT_OFFSET, 13747 }, - { 0xfdfa, G_UNICODE_NOT_PRESENT_OFFSET, 13754 }, - { 0xfdfb, G_UNICODE_NOT_PRESENT_OFFSET, 13788 }, - { 0xfdfc, G_UNICODE_NOT_PRESENT_OFFSET, 13804 }, - { 0xfe30, G_UNICODE_NOT_PRESENT_OFFSET, 4871 }, - { 0xfe31, G_UNICODE_NOT_PRESENT_OFFSET, 13813 }, - { 0xfe32, G_UNICODE_NOT_PRESENT_OFFSET, 13817 }, - { 0xfe33, G_UNICODE_NOT_PRESENT_OFFSET, 13821 }, - { 0xfe34, G_UNICODE_NOT_PRESENT_OFFSET, 13821 }, - { 0xfe35, G_UNICODE_NOT_PRESENT_OFFSET, 4965 }, - { 0xfe36, G_UNICODE_NOT_PRESENT_OFFSET, 4967 }, - { 0xfe37, G_UNICODE_NOT_PRESENT_OFFSET, 13823 }, - { 0xfe38, G_UNICODE_NOT_PRESENT_OFFSET, 13825 }, - { 0xfe39, G_UNICODE_NOT_PRESENT_OFFSET, 13827 }, - { 0xfe3a, G_UNICODE_NOT_PRESENT_OFFSET, 13831 }, - { 0xfe3b, G_UNICODE_NOT_PRESENT_OFFSET, 13835 }, - { 0xfe3c, G_UNICODE_NOT_PRESENT_OFFSET, 13839 }, - { 0xfe3d, G_UNICODE_NOT_PRESENT_OFFSET, 13843 }, - { 0xfe3e, G_UNICODE_NOT_PRESENT_OFFSET, 13847 }, - { 0xfe3f, G_UNICODE_NOT_PRESENT_OFFSET, 5524 }, - { 0xfe40, G_UNICODE_NOT_PRESENT_OFFSET, 5528 }, - { 0xfe41, G_UNICODE_NOT_PRESENT_OFFSET, 13851 }, - { 0xfe42, G_UNICODE_NOT_PRESENT_OFFSET, 13855 }, - { 0xfe43, G_UNICODE_NOT_PRESENT_OFFSET, 13859 }, - { 0xfe44, G_UNICODE_NOT_PRESENT_OFFSET, 13863 }, - { 0xfe49, G_UNICODE_NOT_PRESENT_OFFSET, 4915 }, - { 0xfe4a, G_UNICODE_NOT_PRESENT_OFFSET, 4915 }, - { 0xfe4b, G_UNICODE_NOT_PRESENT_OFFSET, 4915 }, - { 0xfe4c, G_UNICODE_NOT_PRESENT_OFFSET, 4915 }, - { 0xfe4d, G_UNICODE_NOT_PRESENT_OFFSET, 13821 }, - { 0xfe4e, G_UNICODE_NOT_PRESENT_OFFSET, 13821 }, - { 0xfe4f, G_UNICODE_NOT_PRESENT_OFFSET, 13821 }, - { 0xfe50, G_UNICODE_NOT_PRESENT_OFFSET, 13867 }, - { 0xfe51, G_UNICODE_NOT_PRESENT_OFFSET, 13869 }, - { 0xfe52, G_UNICODE_NOT_PRESENT_OFFSET, 4869 }, - { 0xfe54, G_UNICODE_NOT_PRESENT_OFFSET, 1248 }, - { 0xfe55, G_UNICODE_NOT_PRESENT_OFFSET, 13873 }, - { 0xfe56, G_UNICODE_NOT_PRESENT_OFFSET, 13875 }, - { 0xfe57, G_UNICODE_NOT_PRESENT_OFFSET, 13877 }, - { 0xfe58, G_UNICODE_NOT_PRESENT_OFFSET, 13813 }, - { 0xfe59, G_UNICODE_NOT_PRESENT_OFFSET, 4965 }, - { 0xfe5a, G_UNICODE_NOT_PRESENT_OFFSET, 4967 }, - { 0xfe5b, G_UNICODE_NOT_PRESENT_OFFSET, 13823 }, - { 0xfe5c, G_UNICODE_NOT_PRESENT_OFFSET, 13825 }, - { 0xfe5d, G_UNICODE_NOT_PRESENT_OFFSET, 13827 }, - { 0xfe5e, G_UNICODE_NOT_PRESENT_OFFSET, 13831 }, - { 0xfe5f, G_UNICODE_NOT_PRESENT_OFFSET, 13879 }, - { 0xfe60, G_UNICODE_NOT_PRESENT_OFFSET, 13881 }, - { 0xfe61, G_UNICODE_NOT_PRESENT_OFFSET, 13883 }, - { 0xfe62, G_UNICODE_NOT_PRESENT_OFFSET, 4957 }, - { 0xfe63, G_UNICODE_NOT_PRESENT_OFFSET, 13885 }, - { 0xfe64, G_UNICODE_NOT_PRESENT_OFFSET, 13887 }, - { 0xfe65, G_UNICODE_NOT_PRESENT_OFFSET, 13889 }, - { 0xfe66, G_UNICODE_NOT_PRESENT_OFFSET, 4963 }, - { 0xfe68, G_UNICODE_NOT_PRESENT_OFFSET, 13891 }, - { 0xfe69, G_UNICODE_NOT_PRESENT_OFFSET, 13893 }, - { 0xfe6a, G_UNICODE_NOT_PRESENT_OFFSET, 13895 }, - { 0xfe6b, G_UNICODE_NOT_PRESENT_OFFSET, 13897 }, - { 0xfe70, G_UNICODE_NOT_PRESENT_OFFSET, 13899 }, - { 0xfe71, G_UNICODE_NOT_PRESENT_OFFSET, 13903 }, - { 0xfe72, G_UNICODE_NOT_PRESENT_OFFSET, 13908 }, - { 0xfe74, G_UNICODE_NOT_PRESENT_OFFSET, 13912 }, - { 0xfe76, G_UNICODE_NOT_PRESENT_OFFSET, 13916 }, - { 0xfe77, G_UNICODE_NOT_PRESENT_OFFSET, 13920 }, - { 0xfe78, G_UNICODE_NOT_PRESENT_OFFSET, 13925 }, - { 0xfe79, G_UNICODE_NOT_PRESENT_OFFSET, 13929 }, - { 0xfe7a, G_UNICODE_NOT_PRESENT_OFFSET, 13934 }, - { 0xfe7b, G_UNICODE_NOT_PRESENT_OFFSET, 13938 }, - { 0xfe7c, G_UNICODE_NOT_PRESENT_OFFSET, 13943 }, - { 0xfe7d, G_UNICODE_NOT_PRESENT_OFFSET, 13947 }, - { 0xfe7e, G_UNICODE_NOT_PRESENT_OFFSET, 13952 }, - { 0xfe7f, G_UNICODE_NOT_PRESENT_OFFSET, 13956 }, - { 0xfe80, G_UNICODE_NOT_PRESENT_OFFSET, 13961 }, - { 0xfe81, G_UNICODE_NOT_PRESENT_OFFSET, 1673 }, - { 0xfe82, G_UNICODE_NOT_PRESENT_OFFSET, 1673 }, - { 0xfe83, G_UNICODE_NOT_PRESENT_OFFSET, 1678 }, - { 0xfe84, G_UNICODE_NOT_PRESENT_OFFSET, 1678 }, - { 0xfe85, G_UNICODE_NOT_PRESENT_OFFSET, 1683 }, - { 0xfe86, G_UNICODE_NOT_PRESENT_OFFSET, 1683 }, - { 0xfe87, G_UNICODE_NOT_PRESENT_OFFSET, 1688 }, - { 0xfe88, G_UNICODE_NOT_PRESENT_OFFSET, 1688 }, - { 0xfe89, G_UNICODE_NOT_PRESENT_OFFSET, 1693 }, - { 0xfe8a, G_UNICODE_NOT_PRESENT_OFFSET, 1693 }, - { 0xfe8b, G_UNICODE_NOT_PRESENT_OFFSET, 1693 }, - { 0xfe8c, G_UNICODE_NOT_PRESENT_OFFSET, 1693 }, - { 0xfe8d, G_UNICODE_NOT_PRESENT_OFFSET, 13964 }, - { 0xfe8e, G_UNICODE_NOT_PRESENT_OFFSET, 13964 }, - { 0xfe8f, G_UNICODE_NOT_PRESENT_OFFSET, 13967 }, - { 0xfe90, G_UNICODE_NOT_PRESENT_OFFSET, 13967 }, - { 0xfe91, G_UNICODE_NOT_PRESENT_OFFSET, 13967 }, - { 0xfe92, G_UNICODE_NOT_PRESENT_OFFSET, 13967 }, - { 0xfe93, G_UNICODE_NOT_PRESENT_OFFSET, 13970 }, - { 0xfe94, G_UNICODE_NOT_PRESENT_OFFSET, 13970 }, - { 0xfe95, G_UNICODE_NOT_PRESENT_OFFSET, 13973 }, - { 0xfe96, G_UNICODE_NOT_PRESENT_OFFSET, 13973 }, - { 0xfe97, G_UNICODE_NOT_PRESENT_OFFSET, 13973 }, - { 0xfe98, G_UNICODE_NOT_PRESENT_OFFSET, 13973 }, - { 0xfe99, G_UNICODE_NOT_PRESENT_OFFSET, 13976 }, - { 0xfe9a, G_UNICODE_NOT_PRESENT_OFFSET, 13976 }, - { 0xfe9b, G_UNICODE_NOT_PRESENT_OFFSET, 13976 }, - { 0xfe9c, G_UNICODE_NOT_PRESENT_OFFSET, 13976 }, - { 0xfe9d, G_UNICODE_NOT_PRESENT_OFFSET, 13979 }, - { 0xfe9e, G_UNICODE_NOT_PRESENT_OFFSET, 13979 }, - { 0xfe9f, G_UNICODE_NOT_PRESENT_OFFSET, 13979 }, - { 0xfea0, G_UNICODE_NOT_PRESENT_OFFSET, 13979 }, - { 0xfea1, G_UNICODE_NOT_PRESENT_OFFSET, 13982 }, - { 0xfea2, G_UNICODE_NOT_PRESENT_OFFSET, 13982 }, - { 0xfea3, G_UNICODE_NOT_PRESENT_OFFSET, 13982 }, - { 0xfea4, G_UNICODE_NOT_PRESENT_OFFSET, 13982 }, - { 0xfea5, G_UNICODE_NOT_PRESENT_OFFSET, 13985 }, - { 0xfea6, G_UNICODE_NOT_PRESENT_OFFSET, 13985 }, - { 0xfea7, G_UNICODE_NOT_PRESENT_OFFSET, 13985 }, - { 0xfea8, G_UNICODE_NOT_PRESENT_OFFSET, 13985 }, - { 0xfea9, G_UNICODE_NOT_PRESENT_OFFSET, 13988 }, - { 0xfeaa, G_UNICODE_NOT_PRESENT_OFFSET, 13988 }, - { 0xfeab, G_UNICODE_NOT_PRESENT_OFFSET, 13991 }, - { 0xfeac, G_UNICODE_NOT_PRESENT_OFFSET, 13991 }, - { 0xfead, G_UNICODE_NOT_PRESENT_OFFSET, 13994 }, - { 0xfeae, G_UNICODE_NOT_PRESENT_OFFSET, 13994 }, - { 0xfeaf, G_UNICODE_NOT_PRESENT_OFFSET, 13997 }, - { 0xfeb0, G_UNICODE_NOT_PRESENT_OFFSET, 13997 }, - { 0xfeb1, G_UNICODE_NOT_PRESENT_OFFSET, 14000 }, - { 0xfeb2, G_UNICODE_NOT_PRESENT_OFFSET, 14000 }, - { 0xfeb3, G_UNICODE_NOT_PRESENT_OFFSET, 14000 }, - { 0xfeb4, G_UNICODE_NOT_PRESENT_OFFSET, 14000 }, - { 0xfeb5, G_UNICODE_NOT_PRESENT_OFFSET, 14003 }, - { 0xfeb6, G_UNICODE_NOT_PRESENT_OFFSET, 14003 }, - { 0xfeb7, G_UNICODE_NOT_PRESENT_OFFSET, 14003 }, - { 0xfeb8, G_UNICODE_NOT_PRESENT_OFFSET, 14003 }, - { 0xfeb9, G_UNICODE_NOT_PRESENT_OFFSET, 14006 }, - { 0xfeba, G_UNICODE_NOT_PRESENT_OFFSET, 14006 }, - { 0xfebb, G_UNICODE_NOT_PRESENT_OFFSET, 14006 }, - { 0xfebc, G_UNICODE_NOT_PRESENT_OFFSET, 14006 }, - { 0xfebd, G_UNICODE_NOT_PRESENT_OFFSET, 14009 }, - { 0xfebe, G_UNICODE_NOT_PRESENT_OFFSET, 14009 }, - { 0xfebf, G_UNICODE_NOT_PRESENT_OFFSET, 14009 }, - { 0xfec0, G_UNICODE_NOT_PRESENT_OFFSET, 14009 }, - { 0xfec1, G_UNICODE_NOT_PRESENT_OFFSET, 14012 }, - { 0xfec2, G_UNICODE_NOT_PRESENT_OFFSET, 14012 }, - { 0xfec3, G_UNICODE_NOT_PRESENT_OFFSET, 14012 }, - { 0xfec4, G_UNICODE_NOT_PRESENT_OFFSET, 14012 }, - { 0xfec5, G_UNICODE_NOT_PRESENT_OFFSET, 14015 }, - { 0xfec6, G_UNICODE_NOT_PRESENT_OFFSET, 14015 }, - { 0xfec7, G_UNICODE_NOT_PRESENT_OFFSET, 14015 }, - { 0xfec8, G_UNICODE_NOT_PRESENT_OFFSET, 14015 }, - { 0xfec9, G_UNICODE_NOT_PRESENT_OFFSET, 14018 }, - { 0xfeca, G_UNICODE_NOT_PRESENT_OFFSET, 14018 }, - { 0xfecb, G_UNICODE_NOT_PRESENT_OFFSET, 14018 }, - { 0xfecc, G_UNICODE_NOT_PRESENT_OFFSET, 14018 }, - { 0xfecd, G_UNICODE_NOT_PRESENT_OFFSET, 14021 }, - { 0xfece, G_UNICODE_NOT_PRESENT_OFFSET, 14021 }, - { 0xfecf, G_UNICODE_NOT_PRESENT_OFFSET, 14021 }, - { 0xfed0, G_UNICODE_NOT_PRESENT_OFFSET, 14021 }, - { 0xfed1, G_UNICODE_NOT_PRESENT_OFFSET, 14024 }, - { 0xfed2, G_UNICODE_NOT_PRESENT_OFFSET, 14024 }, - { 0xfed3, G_UNICODE_NOT_PRESENT_OFFSET, 14024 }, - { 0xfed4, G_UNICODE_NOT_PRESENT_OFFSET, 14024 }, - { 0xfed5, G_UNICODE_NOT_PRESENT_OFFSET, 14027 }, - { 0xfed6, G_UNICODE_NOT_PRESENT_OFFSET, 14027 }, - { 0xfed7, G_UNICODE_NOT_PRESENT_OFFSET, 14027 }, - { 0xfed8, G_UNICODE_NOT_PRESENT_OFFSET, 14027 }, - { 0xfed9, G_UNICODE_NOT_PRESENT_OFFSET, 14030 }, - { 0xfeda, G_UNICODE_NOT_PRESENT_OFFSET, 14030 }, - { 0xfedb, G_UNICODE_NOT_PRESENT_OFFSET, 14030 }, - { 0xfedc, G_UNICODE_NOT_PRESENT_OFFSET, 14030 }, - { 0xfedd, G_UNICODE_NOT_PRESENT_OFFSET, 14033 }, - { 0xfede, G_UNICODE_NOT_PRESENT_OFFSET, 14033 }, - { 0xfedf, G_UNICODE_NOT_PRESENT_OFFSET, 14033 }, - { 0xfee0, G_UNICODE_NOT_PRESENT_OFFSET, 14033 }, - { 0xfee1, G_UNICODE_NOT_PRESENT_OFFSET, 14036 }, - { 0xfee2, G_UNICODE_NOT_PRESENT_OFFSET, 14036 }, - { 0xfee3, G_UNICODE_NOT_PRESENT_OFFSET, 14036 }, - { 0xfee4, G_UNICODE_NOT_PRESENT_OFFSET, 14036 }, - { 0xfee5, G_UNICODE_NOT_PRESENT_OFFSET, 14039 }, - { 0xfee6, G_UNICODE_NOT_PRESENT_OFFSET, 14039 }, - { 0xfee7, G_UNICODE_NOT_PRESENT_OFFSET, 14039 }, - { 0xfee8, G_UNICODE_NOT_PRESENT_OFFSET, 14039 }, - { 0xfee9, G_UNICODE_NOT_PRESENT_OFFSET, 14042 }, - { 0xfeea, G_UNICODE_NOT_PRESENT_OFFSET, 14042 }, - { 0xfeeb, G_UNICODE_NOT_PRESENT_OFFSET, 14042 }, - { 0xfeec, G_UNICODE_NOT_PRESENT_OFFSET, 14042 }, - { 0xfeed, G_UNICODE_NOT_PRESENT_OFFSET, 14045 }, - { 0xfeee, G_UNICODE_NOT_PRESENT_OFFSET, 14045 }, - { 0xfeef, G_UNICODE_NOT_PRESENT_OFFSET, 12110 }, - { 0xfef0, G_UNICODE_NOT_PRESENT_OFFSET, 12110 }, - { 0xfef1, G_UNICODE_NOT_PRESENT_OFFSET, 14048 }, - { 0xfef2, G_UNICODE_NOT_PRESENT_OFFSET, 14048 }, - { 0xfef3, G_UNICODE_NOT_PRESENT_OFFSET, 14048 }, - { 0xfef4, G_UNICODE_NOT_PRESENT_OFFSET, 14048 }, - { 0xfef5, G_UNICODE_NOT_PRESENT_OFFSET, 14051 }, - { 0xfef6, G_UNICODE_NOT_PRESENT_OFFSET, 14051 }, - { 0xfef7, G_UNICODE_NOT_PRESENT_OFFSET, 14058 }, - { 0xfef8, G_UNICODE_NOT_PRESENT_OFFSET, 14058 }, - { 0xfef9, G_UNICODE_NOT_PRESENT_OFFSET, 14065 }, - { 0xfefa, G_UNICODE_NOT_PRESENT_OFFSET, 14065 }, - { 0xfefb, G_UNICODE_NOT_PRESENT_OFFSET, 14072 }, - { 0xfefc, G_UNICODE_NOT_PRESENT_OFFSET, 14072 }, - { 0xff01, G_UNICODE_NOT_PRESENT_OFFSET, 13877 }, - { 0xff02, G_UNICODE_NOT_PRESENT_OFFSET, 14077 }, - { 0xff03, G_UNICODE_NOT_PRESENT_OFFSET, 13879 }, - { 0xff04, G_UNICODE_NOT_PRESENT_OFFSET, 13893 }, - { 0xff05, G_UNICODE_NOT_PRESENT_OFFSET, 13895 }, - { 0xff06, G_UNICODE_NOT_PRESENT_OFFSET, 13881 }, - { 0xff07, G_UNICODE_NOT_PRESENT_OFFSET, 14079 }, - { 0xff08, G_UNICODE_NOT_PRESENT_OFFSET, 4965 }, - { 0xff09, G_UNICODE_NOT_PRESENT_OFFSET, 4967 }, - { 0xff0a, G_UNICODE_NOT_PRESENT_OFFSET, 13883 }, - { 0xff0b, G_UNICODE_NOT_PRESENT_OFFSET, 4957 }, - { 0xff0c, G_UNICODE_NOT_PRESENT_OFFSET, 13867 }, - { 0xff0d, G_UNICODE_NOT_PRESENT_OFFSET, 13885 }, - { 0xff0e, G_UNICODE_NOT_PRESENT_OFFSET, 4869 }, - { 0xff0f, G_UNICODE_NOT_PRESENT_OFFSET, 14081 }, - { 0xff10, G_UNICODE_NOT_PRESENT_OFFSET, 4941 }, - { 0xff11, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, - { 0xff12, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, - { 0xff13, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, - { 0xff14, G_UNICODE_NOT_PRESENT_OFFSET, 4945 }, - { 0xff15, G_UNICODE_NOT_PRESENT_OFFSET, 4947 }, - { 0xff16, G_UNICODE_NOT_PRESENT_OFFSET, 4949 }, - { 0xff17, G_UNICODE_NOT_PRESENT_OFFSET, 4951 }, - { 0xff18, G_UNICODE_NOT_PRESENT_OFFSET, 4953 }, - { 0xff19, G_UNICODE_NOT_PRESENT_OFFSET, 4955 }, - { 0xff1a, G_UNICODE_NOT_PRESENT_OFFSET, 13873 }, - { 0xff1b, G_UNICODE_NOT_PRESENT_OFFSET, 1248 }, - { 0xff1c, G_UNICODE_NOT_PRESENT_OFFSET, 13887 }, - { 0xff1d, G_UNICODE_NOT_PRESENT_OFFSET, 4963 }, - { 0xff1e, G_UNICODE_NOT_PRESENT_OFFSET, 13889 }, - { 0xff1f, G_UNICODE_NOT_PRESENT_OFFSET, 13875 }, - { 0xff20, G_UNICODE_NOT_PRESENT_OFFSET, 13897 }, - { 0xff21, G_UNICODE_NOT_PRESENT_OFFSET, 5831 }, - { 0xff22, G_UNICODE_NOT_PRESENT_OFFSET, 5042 }, - { 0xff23, G_UNICODE_NOT_PRESENT_OFFSET, 4982 }, - { 0xff24, G_UNICODE_NOT_PRESENT_OFFSET, 5077 }, - { 0xff25, G_UNICODE_NOT_PRESENT_OFFSET, 5046 }, - { 0xff26, G_UNICODE_NOT_PRESENT_OFFSET, 5048 }, - { 0xff27, G_UNICODE_NOT_PRESENT_OFFSET, 5833 }, - { 0xff28, G_UNICODE_NOT_PRESENT_OFFSET, 5005 }, - { 0xff29, G_UNICODE_NOT_PRESENT_OFFSET, 5010 }, - { 0xff2a, G_UNICODE_NOT_PRESENT_OFFSET, 5835 }, - { 0xff2b, G_UNICODE_NOT_PRESENT_OFFSET, 5040 }, - { 0xff2c, G_UNICODE_NOT_PRESENT_OFFSET, 5012 }, - { 0xff2d, G_UNICODE_NOT_PRESENT_OFFSET, 5050 }, - { 0xff2e, G_UNICODE_NOT_PRESENT_OFFSET, 5014 }, - { 0xff2f, G_UNICODE_NOT_PRESENT_OFFSET, 5837 }, - { 0xff30, G_UNICODE_NOT_PRESENT_OFFSET, 5019 }, - { 0xff31, G_UNICODE_NOT_PRESENT_OFFSET, 5021 }, - { 0xff32, G_UNICODE_NOT_PRESENT_OFFSET, 5023 }, - { 0xff33, G_UNICODE_NOT_PRESENT_OFFSET, 5839 }, - { 0xff34, G_UNICODE_NOT_PRESENT_OFFSET, 5841 }, - { 0xff35, G_UNICODE_NOT_PRESENT_OFFSET, 5843 }, - { 0xff36, G_UNICODE_NOT_PRESENT_OFFSET, 5168 }, - { 0xff37, G_UNICODE_NOT_PRESENT_OFFSET, 5845 }, - { 0xff38, G_UNICODE_NOT_PRESENT_OFFSET, 5185 }, - { 0xff39, G_UNICODE_NOT_PRESENT_OFFSET, 5847 }, - { 0xff3a, G_UNICODE_NOT_PRESENT_OFFSET, 5035 }, - { 0xff3b, G_UNICODE_NOT_PRESENT_OFFSET, 14083 }, - { 0xff3c, G_UNICODE_NOT_PRESENT_OFFSET, 13891 }, - { 0xff3d, G_UNICODE_NOT_PRESENT_OFFSET, 14085 }, - { 0xff3e, G_UNICODE_NOT_PRESENT_OFFSET, 14087 }, - { 0xff3f, G_UNICODE_NOT_PRESENT_OFFSET, 13821 }, - { 0xff40, G_UNICODE_NOT_PRESENT_OFFSET, 4798 }, - { 0xff41, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, - { 0xff42, G_UNICODE_NOT_PRESENT_OFFSET, 5849 }, - { 0xff43, G_UNICODE_NOT_PRESENT_OFFSET, 5228 }, - { 0xff44, G_UNICODE_NOT_PRESENT_OFFSET, 5079 }, - { 0xff45, G_UNICODE_NOT_PRESENT_OFFSET, 5044 }, - { 0xff46, G_UNICODE_NOT_PRESENT_OFFSET, 5851 }, - { 0xff47, G_UNICODE_NOT_PRESENT_OFFSET, 5003 }, - { 0xff48, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, - { 0xff49, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0xff4a, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, - { 0xff4b, G_UNICODE_NOT_PRESENT_OFFSET, 5853 }, - { 0xff4c, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, - { 0xff4d, G_UNICODE_NOT_PRESENT_OFFSET, 5230 }, - { 0xff4e, G_UNICODE_NOT_PRESENT_OFFSET, 4969 }, - { 0xff4f, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, - { 0xff50, G_UNICODE_NOT_PRESENT_OFFSET, 5855 }, - { 0xff51, G_UNICODE_NOT_PRESENT_OFFSET, 5857 }, - { 0xff52, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, - { 0xff53, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, - { 0xff54, G_UNICODE_NOT_PRESENT_OFFSET, 5859 }, - { 0xff55, G_UNICODE_NOT_PRESENT_OFFSET, 5861 }, - { 0xff56, G_UNICODE_NOT_PRESENT_OFFSET, 5204 }, - { 0xff57, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, - { 0xff58, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, - { 0xff59, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, - { 0xff5a, G_UNICODE_NOT_PRESENT_OFFSET, 5863 }, - { 0xff5b, G_UNICODE_NOT_PRESENT_OFFSET, 13823 }, - { 0xff5c, G_UNICODE_NOT_PRESENT_OFFSET, 14089 }, - { 0xff5d, G_UNICODE_NOT_PRESENT_OFFSET, 13825 }, - { 0xff5e, G_UNICODE_NOT_PRESENT_OFFSET, 14091 }, - { 0xff5f, G_UNICODE_NOT_PRESENT_OFFSET, 14093 }, - { 0xff60, G_UNICODE_NOT_PRESENT_OFFSET, 14097 }, - { 0xff61, G_UNICODE_NOT_PRESENT_OFFSET, 14101 }, - { 0xff62, G_UNICODE_NOT_PRESENT_OFFSET, 13851 }, - { 0xff63, G_UNICODE_NOT_PRESENT_OFFSET, 13855 }, - { 0xff64, G_UNICODE_NOT_PRESENT_OFFSET, 13869 }, - { 0xff65, G_UNICODE_NOT_PRESENT_OFFSET, 14105 }, - { 0xff66, G_UNICODE_NOT_PRESENT_OFFSET, 8615 }, - { 0xff67, G_UNICODE_NOT_PRESENT_OFFSET, 14109 }, - { 0xff68, G_UNICODE_NOT_PRESENT_OFFSET, 14113 }, - { 0xff69, G_UNICODE_NOT_PRESENT_OFFSET, 14117 }, - { 0xff6a, G_UNICODE_NOT_PRESENT_OFFSET, 14121 }, - { 0xff6b, G_UNICODE_NOT_PRESENT_OFFSET, 14125 }, - { 0xff6c, G_UNICODE_NOT_PRESENT_OFFSET, 14129 }, - { 0xff6d, G_UNICODE_NOT_PRESENT_OFFSET, 14133 }, - { 0xff6e, G_UNICODE_NOT_PRESENT_OFFSET, 14137 }, - { 0xff6f, G_UNICODE_NOT_PRESENT_OFFSET, 14141 }, - { 0xff70, G_UNICODE_NOT_PRESENT_OFFSET, 14145 }, - { 0xff71, G_UNICODE_NOT_PRESENT_OFFSET, 8431 }, - { 0xff72, G_UNICODE_NOT_PRESENT_OFFSET, 8435 }, - { 0xff73, G_UNICODE_NOT_PRESENT_OFFSET, 8439 }, - { 0xff74, G_UNICODE_NOT_PRESENT_OFFSET, 8443 }, - { 0xff75, G_UNICODE_NOT_PRESENT_OFFSET, 8447 }, - { 0xff76, G_UNICODE_NOT_PRESENT_OFFSET, 8451 }, - { 0xff77, G_UNICODE_NOT_PRESENT_OFFSET, 8455 }, - { 0xff78, G_UNICODE_NOT_PRESENT_OFFSET, 8459 }, - { 0xff79, G_UNICODE_NOT_PRESENT_OFFSET, 8463 }, - { 0xff7a, G_UNICODE_NOT_PRESENT_OFFSET, 8467 }, - { 0xff7b, G_UNICODE_NOT_PRESENT_OFFSET, 8471 }, - { 0xff7c, G_UNICODE_NOT_PRESENT_OFFSET, 8475 }, - { 0xff7d, G_UNICODE_NOT_PRESENT_OFFSET, 8479 }, - { 0xff7e, G_UNICODE_NOT_PRESENT_OFFSET, 8483 }, - { 0xff7f, G_UNICODE_NOT_PRESENT_OFFSET, 8487 }, - { 0xff80, G_UNICODE_NOT_PRESENT_OFFSET, 8491 }, - { 0xff81, G_UNICODE_NOT_PRESENT_OFFSET, 8495 }, - { 0xff82, G_UNICODE_NOT_PRESENT_OFFSET, 8499 }, - { 0xff83, G_UNICODE_NOT_PRESENT_OFFSET, 8503 }, - { 0xff84, G_UNICODE_NOT_PRESENT_OFFSET, 8507 }, - { 0xff85, G_UNICODE_NOT_PRESENT_OFFSET, 8511 }, - { 0xff86, G_UNICODE_NOT_PRESENT_OFFSET, 8515 }, - { 0xff87, G_UNICODE_NOT_PRESENT_OFFSET, 8519 }, - { 0xff88, G_UNICODE_NOT_PRESENT_OFFSET, 8523 }, - { 0xff89, G_UNICODE_NOT_PRESENT_OFFSET, 8527 }, - { 0xff8a, G_UNICODE_NOT_PRESENT_OFFSET, 8531 }, - { 0xff8b, G_UNICODE_NOT_PRESENT_OFFSET, 8535 }, - { 0xff8c, G_UNICODE_NOT_PRESENT_OFFSET, 8539 }, - { 0xff8d, G_UNICODE_NOT_PRESENT_OFFSET, 8543 }, - { 0xff8e, G_UNICODE_NOT_PRESENT_OFFSET, 8547 }, - { 0xff8f, G_UNICODE_NOT_PRESENT_OFFSET, 8551 }, - { 0xff90, G_UNICODE_NOT_PRESENT_OFFSET, 8555 }, - { 0xff91, G_UNICODE_NOT_PRESENT_OFFSET, 8559 }, - { 0xff92, G_UNICODE_NOT_PRESENT_OFFSET, 8563 }, - { 0xff93, G_UNICODE_NOT_PRESENT_OFFSET, 8567 }, - { 0xff94, G_UNICODE_NOT_PRESENT_OFFSET, 8571 }, - { 0xff95, G_UNICODE_NOT_PRESENT_OFFSET, 8575 }, - { 0xff96, G_UNICODE_NOT_PRESENT_OFFSET, 8579 }, - { 0xff97, G_UNICODE_NOT_PRESENT_OFFSET, 8583 }, - { 0xff98, G_UNICODE_NOT_PRESENT_OFFSET, 8587 }, - { 0xff99, G_UNICODE_NOT_PRESENT_OFFSET, 8591 }, - { 0xff9a, G_UNICODE_NOT_PRESENT_OFFSET, 8595 }, - { 0xff9b, G_UNICODE_NOT_PRESENT_OFFSET, 8599 }, - { 0xff9c, G_UNICODE_NOT_PRESENT_OFFSET, 8603 }, - { 0xff9d, G_UNICODE_NOT_PRESENT_OFFSET, 14149 }, - { 0xff9e, G_UNICODE_NOT_PRESENT_OFFSET, 14153 }, - { 0xff9f, G_UNICODE_NOT_PRESENT_OFFSET, 14157 }, - { 0xffa0, G_UNICODE_NOT_PRESENT_OFFSET, 7405 }, - { 0xffa1, G_UNICODE_NOT_PRESENT_OFFSET, 7201 }, - { 0xffa2, G_UNICODE_NOT_PRESENT_OFFSET, 7205 }, - { 0xffa3, G_UNICODE_NOT_PRESENT_OFFSET, 7209 }, - { 0xffa4, G_UNICODE_NOT_PRESENT_OFFSET, 7213 }, - { 0xffa5, G_UNICODE_NOT_PRESENT_OFFSET, 7217 }, - { 0xffa6, G_UNICODE_NOT_PRESENT_OFFSET, 7221 }, - { 0xffa7, G_UNICODE_NOT_PRESENT_OFFSET, 7225 }, - { 0xffa8, G_UNICODE_NOT_PRESENT_OFFSET, 7229 }, - { 0xffa9, G_UNICODE_NOT_PRESENT_OFFSET, 7233 }, - { 0xffaa, G_UNICODE_NOT_PRESENT_OFFSET, 7237 }, - { 0xffab, G_UNICODE_NOT_PRESENT_OFFSET, 7241 }, - { 0xffac, G_UNICODE_NOT_PRESENT_OFFSET, 7245 }, - { 0xffad, G_UNICODE_NOT_PRESENT_OFFSET, 7249 }, - { 0xffae, G_UNICODE_NOT_PRESENT_OFFSET, 7253 }, - { 0xffaf, G_UNICODE_NOT_PRESENT_OFFSET, 7257 }, - { 0xffb0, G_UNICODE_NOT_PRESENT_OFFSET, 7261 }, - { 0xffb1, G_UNICODE_NOT_PRESENT_OFFSET, 7265 }, - { 0xffb2, G_UNICODE_NOT_PRESENT_OFFSET, 7269 }, - { 0xffb3, G_UNICODE_NOT_PRESENT_OFFSET, 7273 }, - { 0xffb4, G_UNICODE_NOT_PRESENT_OFFSET, 7277 }, - { 0xffb5, G_UNICODE_NOT_PRESENT_OFFSET, 7281 }, - { 0xffb6, G_UNICODE_NOT_PRESENT_OFFSET, 7285 }, - { 0xffb7, G_UNICODE_NOT_PRESENT_OFFSET, 7289 }, - { 0xffb8, G_UNICODE_NOT_PRESENT_OFFSET, 7293 }, - { 0xffb9, G_UNICODE_NOT_PRESENT_OFFSET, 7297 }, - { 0xffba, G_UNICODE_NOT_PRESENT_OFFSET, 7301 }, - { 0xffbb, G_UNICODE_NOT_PRESENT_OFFSET, 7305 }, - { 0xffbc, G_UNICODE_NOT_PRESENT_OFFSET, 7309 }, - { 0xffbd, G_UNICODE_NOT_PRESENT_OFFSET, 7313 }, - { 0xffbe, G_UNICODE_NOT_PRESENT_OFFSET, 7317 }, - { 0xffc2, G_UNICODE_NOT_PRESENT_OFFSET, 7321 }, - { 0xffc3, G_UNICODE_NOT_PRESENT_OFFSET, 7325 }, - { 0xffc4, G_UNICODE_NOT_PRESENT_OFFSET, 7329 }, - { 0xffc5, G_UNICODE_NOT_PRESENT_OFFSET, 7333 }, - { 0xffc6, G_UNICODE_NOT_PRESENT_OFFSET, 7337 }, - { 0xffc7, G_UNICODE_NOT_PRESENT_OFFSET, 7341 }, - { 0xffca, G_UNICODE_NOT_PRESENT_OFFSET, 7345 }, - { 0xffcb, G_UNICODE_NOT_PRESENT_OFFSET, 7349 }, - { 0xffcc, G_UNICODE_NOT_PRESENT_OFFSET, 7353 }, - { 0xffcd, G_UNICODE_NOT_PRESENT_OFFSET, 7357 }, - { 0xffce, G_UNICODE_NOT_PRESENT_OFFSET, 7361 }, - { 0xffcf, G_UNICODE_NOT_PRESENT_OFFSET, 7365 }, - { 0xffd2, G_UNICODE_NOT_PRESENT_OFFSET, 7369 }, - { 0xffd3, G_UNICODE_NOT_PRESENT_OFFSET, 7373 }, - { 0xffd4, G_UNICODE_NOT_PRESENT_OFFSET, 7377 }, - { 0xffd5, G_UNICODE_NOT_PRESENT_OFFSET, 7381 }, - { 0xffd6, G_UNICODE_NOT_PRESENT_OFFSET, 7385 }, - { 0xffd7, G_UNICODE_NOT_PRESENT_OFFSET, 7389 }, - { 0xffda, G_UNICODE_NOT_PRESENT_OFFSET, 7393 }, - { 0xffdb, G_UNICODE_NOT_PRESENT_OFFSET, 7397 }, - { 0xffdc, G_UNICODE_NOT_PRESENT_OFFSET, 7401 }, - { 0xffe0, G_UNICODE_NOT_PRESENT_OFFSET, 14161 }, - { 0xffe1, G_UNICODE_NOT_PRESENT_OFFSET, 14164 }, - { 0xffe2, G_UNICODE_NOT_PRESENT_OFFSET, 14167 }, - { 0xffe3, G_UNICODE_NOT_PRESENT_OFFSET, 8 }, - { 0xffe4, G_UNICODE_NOT_PRESENT_OFFSET, 14170 }, - { 0xffe5, G_UNICODE_NOT_PRESENT_OFFSET, 14173 }, - { 0xffe6, G_UNICODE_NOT_PRESENT_OFFSET, 14176 }, - { 0xffe8, G_UNICODE_NOT_PRESENT_OFFSET, 14180 }, - { 0xffe9, G_UNICODE_NOT_PRESENT_OFFSET, 14184 }, - { 0xffea, G_UNICODE_NOT_PRESENT_OFFSET, 14188 }, - { 0xffeb, G_UNICODE_NOT_PRESENT_OFFSET, 14192 }, - { 0xffec, G_UNICODE_NOT_PRESENT_OFFSET, 14196 }, - { 0xffed, G_UNICODE_NOT_PRESENT_OFFSET, 14200 }, - { 0xffee, G_UNICODE_NOT_PRESENT_OFFSET, 14204 }, - { 0x1d15e, 14208, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1d15f, 14217, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1d160, 14226, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1d161, 14239, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1d162, 14252, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1d163, 14265, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1d164, 14278, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1d1bb, 14291, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1d1bc, 14300, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1d1bd, 14309, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1d1be, 14322, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1d1bf, 14335, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1d1c0, 14348, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x1d400, G_UNICODE_NOT_PRESENT_OFFSET, 5831 }, - { 0x1d401, G_UNICODE_NOT_PRESENT_OFFSET, 5042 }, - { 0x1d402, G_UNICODE_NOT_PRESENT_OFFSET, 4982 }, - { 0x1d403, G_UNICODE_NOT_PRESENT_OFFSET, 5077 }, - { 0x1d404, G_UNICODE_NOT_PRESENT_OFFSET, 5046 }, - { 0x1d405, G_UNICODE_NOT_PRESENT_OFFSET, 5048 }, - { 0x1d406, G_UNICODE_NOT_PRESENT_OFFSET, 5833 }, - { 0x1d407, G_UNICODE_NOT_PRESENT_OFFSET, 5005 }, - { 0x1d408, G_UNICODE_NOT_PRESENT_OFFSET, 5010 }, - { 0x1d409, G_UNICODE_NOT_PRESENT_OFFSET, 5835 }, - { 0x1d40a, G_UNICODE_NOT_PRESENT_OFFSET, 5040 }, - { 0x1d40b, G_UNICODE_NOT_PRESENT_OFFSET, 5012 }, - { 0x1d40c, G_UNICODE_NOT_PRESENT_OFFSET, 5050 }, - { 0x1d40d, G_UNICODE_NOT_PRESENT_OFFSET, 5014 }, - { 0x1d40e, G_UNICODE_NOT_PRESENT_OFFSET, 5837 }, - { 0x1d40f, G_UNICODE_NOT_PRESENT_OFFSET, 5019 }, - { 0x1d410, G_UNICODE_NOT_PRESENT_OFFSET, 5021 }, - { 0x1d411, G_UNICODE_NOT_PRESENT_OFFSET, 5023 }, - { 0x1d412, G_UNICODE_NOT_PRESENT_OFFSET, 5839 }, - { 0x1d413, G_UNICODE_NOT_PRESENT_OFFSET, 5841 }, - { 0x1d414, G_UNICODE_NOT_PRESENT_OFFSET, 5843 }, - { 0x1d415, G_UNICODE_NOT_PRESENT_OFFSET, 5168 }, - { 0x1d416, G_UNICODE_NOT_PRESENT_OFFSET, 5845 }, - { 0x1d417, G_UNICODE_NOT_PRESENT_OFFSET, 5185 }, - { 0x1d418, G_UNICODE_NOT_PRESENT_OFFSET, 5847 }, - { 0x1d419, G_UNICODE_NOT_PRESENT_OFFSET, 5035 }, - { 0x1d41a, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, - { 0x1d41b, G_UNICODE_NOT_PRESENT_OFFSET, 5849 }, - { 0x1d41c, G_UNICODE_NOT_PRESENT_OFFSET, 5228 }, - { 0x1d41d, G_UNICODE_NOT_PRESENT_OFFSET, 5079 }, - { 0x1d41e, G_UNICODE_NOT_PRESENT_OFFSET, 5044 }, - { 0x1d41f, G_UNICODE_NOT_PRESENT_OFFSET, 5851 }, - { 0x1d420, G_UNICODE_NOT_PRESENT_OFFSET, 5003 }, - { 0x1d421, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, - { 0x1d422, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x1d423, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, - { 0x1d424, G_UNICODE_NOT_PRESENT_OFFSET, 5853 }, - { 0x1d425, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, - { 0x1d426, G_UNICODE_NOT_PRESENT_OFFSET, 5230 }, - { 0x1d427, G_UNICODE_NOT_PRESENT_OFFSET, 4969 }, - { 0x1d428, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, - { 0x1d429, G_UNICODE_NOT_PRESENT_OFFSET, 5855 }, - { 0x1d42a, G_UNICODE_NOT_PRESENT_OFFSET, 5857 }, - { 0x1d42b, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, - { 0x1d42c, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, - { 0x1d42d, G_UNICODE_NOT_PRESENT_OFFSET, 5859 }, - { 0x1d42e, G_UNICODE_NOT_PRESENT_OFFSET, 5861 }, - { 0x1d42f, G_UNICODE_NOT_PRESENT_OFFSET, 5204 }, - { 0x1d430, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, - { 0x1d431, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, - { 0x1d432, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, - { 0x1d433, G_UNICODE_NOT_PRESENT_OFFSET, 5863 }, - { 0x1d434, G_UNICODE_NOT_PRESENT_OFFSET, 5831 }, - { 0x1d435, G_UNICODE_NOT_PRESENT_OFFSET, 5042 }, - { 0x1d436, G_UNICODE_NOT_PRESENT_OFFSET, 4982 }, - { 0x1d437, G_UNICODE_NOT_PRESENT_OFFSET, 5077 }, - { 0x1d438, G_UNICODE_NOT_PRESENT_OFFSET, 5046 }, - { 0x1d439, G_UNICODE_NOT_PRESENT_OFFSET, 5048 }, - { 0x1d43a, G_UNICODE_NOT_PRESENT_OFFSET, 5833 }, - { 0x1d43b, G_UNICODE_NOT_PRESENT_OFFSET, 5005 }, - { 0x1d43c, G_UNICODE_NOT_PRESENT_OFFSET, 5010 }, - { 0x1d43d, G_UNICODE_NOT_PRESENT_OFFSET, 5835 }, - { 0x1d43e, G_UNICODE_NOT_PRESENT_OFFSET, 5040 }, - { 0x1d43f, G_UNICODE_NOT_PRESENT_OFFSET, 5012 }, - { 0x1d440, G_UNICODE_NOT_PRESENT_OFFSET, 5050 }, - { 0x1d441, G_UNICODE_NOT_PRESENT_OFFSET, 5014 }, - { 0x1d442, G_UNICODE_NOT_PRESENT_OFFSET, 5837 }, - { 0x1d443, G_UNICODE_NOT_PRESENT_OFFSET, 5019 }, - { 0x1d444, G_UNICODE_NOT_PRESENT_OFFSET, 5021 }, - { 0x1d445, G_UNICODE_NOT_PRESENT_OFFSET, 5023 }, - { 0x1d446, G_UNICODE_NOT_PRESENT_OFFSET, 5839 }, - { 0x1d447, G_UNICODE_NOT_PRESENT_OFFSET, 5841 }, - { 0x1d448, G_UNICODE_NOT_PRESENT_OFFSET, 5843 }, - { 0x1d449, G_UNICODE_NOT_PRESENT_OFFSET, 5168 }, - { 0x1d44a, G_UNICODE_NOT_PRESENT_OFFSET, 5845 }, - { 0x1d44b, G_UNICODE_NOT_PRESENT_OFFSET, 5185 }, - { 0x1d44c, G_UNICODE_NOT_PRESENT_OFFSET, 5847 }, - { 0x1d44d, G_UNICODE_NOT_PRESENT_OFFSET, 5035 }, - { 0x1d44e, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, - { 0x1d44f, G_UNICODE_NOT_PRESENT_OFFSET, 5849 }, - { 0x1d450, G_UNICODE_NOT_PRESENT_OFFSET, 5228 }, - { 0x1d451, G_UNICODE_NOT_PRESENT_OFFSET, 5079 }, - { 0x1d452, G_UNICODE_NOT_PRESENT_OFFSET, 5044 }, - { 0x1d453, G_UNICODE_NOT_PRESENT_OFFSET, 5851 }, - { 0x1d454, G_UNICODE_NOT_PRESENT_OFFSET, 5003 }, - { 0x1d456, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x1d457, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, - { 0x1d458, G_UNICODE_NOT_PRESENT_OFFSET, 5853 }, - { 0x1d459, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, - { 0x1d45a, G_UNICODE_NOT_PRESENT_OFFSET, 5230 }, - { 0x1d45b, G_UNICODE_NOT_PRESENT_OFFSET, 4969 }, - { 0x1d45c, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, - { 0x1d45d, G_UNICODE_NOT_PRESENT_OFFSET, 5855 }, - { 0x1d45e, G_UNICODE_NOT_PRESENT_OFFSET, 5857 }, - { 0x1d45f, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, - { 0x1d460, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, - { 0x1d461, G_UNICODE_NOT_PRESENT_OFFSET, 5859 }, - { 0x1d462, G_UNICODE_NOT_PRESENT_OFFSET, 5861 }, - { 0x1d463, G_UNICODE_NOT_PRESENT_OFFSET, 5204 }, - { 0x1d464, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, - { 0x1d465, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, - { 0x1d466, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, - { 0x1d467, G_UNICODE_NOT_PRESENT_OFFSET, 5863 }, - { 0x1d468, G_UNICODE_NOT_PRESENT_OFFSET, 5831 }, - { 0x1d469, G_UNICODE_NOT_PRESENT_OFFSET, 5042 }, - { 0x1d46a, G_UNICODE_NOT_PRESENT_OFFSET, 4982 }, - { 0x1d46b, G_UNICODE_NOT_PRESENT_OFFSET, 5077 }, - { 0x1d46c, G_UNICODE_NOT_PRESENT_OFFSET, 5046 }, - { 0x1d46d, G_UNICODE_NOT_PRESENT_OFFSET, 5048 }, - { 0x1d46e, G_UNICODE_NOT_PRESENT_OFFSET, 5833 }, - { 0x1d46f, G_UNICODE_NOT_PRESENT_OFFSET, 5005 }, - { 0x1d470, G_UNICODE_NOT_PRESENT_OFFSET, 5010 }, - { 0x1d471, G_UNICODE_NOT_PRESENT_OFFSET, 5835 }, - { 0x1d472, G_UNICODE_NOT_PRESENT_OFFSET, 5040 }, - { 0x1d473, G_UNICODE_NOT_PRESENT_OFFSET, 5012 }, - { 0x1d474, G_UNICODE_NOT_PRESENT_OFFSET, 5050 }, - { 0x1d475, G_UNICODE_NOT_PRESENT_OFFSET, 5014 }, - { 0x1d476, G_UNICODE_NOT_PRESENT_OFFSET, 5837 }, - { 0x1d477, G_UNICODE_NOT_PRESENT_OFFSET, 5019 }, - { 0x1d478, G_UNICODE_NOT_PRESENT_OFFSET, 5021 }, - { 0x1d479, G_UNICODE_NOT_PRESENT_OFFSET, 5023 }, - { 0x1d47a, G_UNICODE_NOT_PRESENT_OFFSET, 5839 }, - { 0x1d47b, G_UNICODE_NOT_PRESENT_OFFSET, 5841 }, - { 0x1d47c, G_UNICODE_NOT_PRESENT_OFFSET, 5843 }, - { 0x1d47d, G_UNICODE_NOT_PRESENT_OFFSET, 5168 }, - { 0x1d47e, G_UNICODE_NOT_PRESENT_OFFSET, 5845 }, - { 0x1d47f, G_UNICODE_NOT_PRESENT_OFFSET, 5185 }, - { 0x1d480, G_UNICODE_NOT_PRESENT_OFFSET, 5847 }, - { 0x1d481, G_UNICODE_NOT_PRESENT_OFFSET, 5035 }, - { 0x1d482, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, - { 0x1d483, G_UNICODE_NOT_PRESENT_OFFSET, 5849 }, - { 0x1d484, G_UNICODE_NOT_PRESENT_OFFSET, 5228 }, - { 0x1d485, G_UNICODE_NOT_PRESENT_OFFSET, 5079 }, - { 0x1d486, G_UNICODE_NOT_PRESENT_OFFSET, 5044 }, - { 0x1d487, G_UNICODE_NOT_PRESENT_OFFSET, 5851 }, - { 0x1d488, G_UNICODE_NOT_PRESENT_OFFSET, 5003 }, - { 0x1d489, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, - { 0x1d48a, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x1d48b, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, - { 0x1d48c, G_UNICODE_NOT_PRESENT_OFFSET, 5853 }, - { 0x1d48d, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, - { 0x1d48e, G_UNICODE_NOT_PRESENT_OFFSET, 5230 }, - { 0x1d48f, G_UNICODE_NOT_PRESENT_OFFSET, 4969 }, - { 0x1d490, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, - { 0x1d491, G_UNICODE_NOT_PRESENT_OFFSET, 5855 }, - { 0x1d492, G_UNICODE_NOT_PRESENT_OFFSET, 5857 }, - { 0x1d493, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, - { 0x1d494, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, - { 0x1d495, G_UNICODE_NOT_PRESENT_OFFSET, 5859 }, - { 0x1d496, G_UNICODE_NOT_PRESENT_OFFSET, 5861 }, - { 0x1d497, G_UNICODE_NOT_PRESENT_OFFSET, 5204 }, - { 0x1d498, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, - { 0x1d499, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, - { 0x1d49a, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, - { 0x1d49b, G_UNICODE_NOT_PRESENT_OFFSET, 5863 }, - { 0x1d49c, G_UNICODE_NOT_PRESENT_OFFSET, 5831 }, - { 0x1d49e, G_UNICODE_NOT_PRESENT_OFFSET, 4982 }, - { 0x1d49f, G_UNICODE_NOT_PRESENT_OFFSET, 5077 }, - { 0x1d4a2, G_UNICODE_NOT_PRESENT_OFFSET, 5833 }, - { 0x1d4a5, G_UNICODE_NOT_PRESENT_OFFSET, 5835 }, - { 0x1d4a6, G_UNICODE_NOT_PRESENT_OFFSET, 5040 }, - { 0x1d4a9, G_UNICODE_NOT_PRESENT_OFFSET, 5014 }, - { 0x1d4aa, G_UNICODE_NOT_PRESENT_OFFSET, 5837 }, - { 0x1d4ab, G_UNICODE_NOT_PRESENT_OFFSET, 5019 }, - { 0x1d4ac, G_UNICODE_NOT_PRESENT_OFFSET, 5021 }, - { 0x1d4ae, G_UNICODE_NOT_PRESENT_OFFSET, 5839 }, - { 0x1d4af, G_UNICODE_NOT_PRESENT_OFFSET, 5841 }, - { 0x1d4b0, G_UNICODE_NOT_PRESENT_OFFSET, 5843 }, - { 0x1d4b1, G_UNICODE_NOT_PRESENT_OFFSET, 5168 }, - { 0x1d4b2, G_UNICODE_NOT_PRESENT_OFFSET, 5845 }, - { 0x1d4b3, G_UNICODE_NOT_PRESENT_OFFSET, 5185 }, - { 0x1d4b4, G_UNICODE_NOT_PRESENT_OFFSET, 5847 }, - { 0x1d4b5, G_UNICODE_NOT_PRESENT_OFFSET, 5035 }, - { 0x1d4b6, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, - { 0x1d4b7, G_UNICODE_NOT_PRESENT_OFFSET, 5849 }, - { 0x1d4b8, G_UNICODE_NOT_PRESENT_OFFSET, 5228 }, - { 0x1d4b9, G_UNICODE_NOT_PRESENT_OFFSET, 5079 }, - { 0x1d4bb, G_UNICODE_NOT_PRESENT_OFFSET, 5851 }, - { 0x1d4bd, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, - { 0x1d4be, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x1d4bf, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, - { 0x1d4c0, G_UNICODE_NOT_PRESENT_OFFSET, 5853 }, - { 0x1d4c2, G_UNICODE_NOT_PRESENT_OFFSET, 5230 }, - { 0x1d4c3, G_UNICODE_NOT_PRESENT_OFFSET, 4969 }, - { 0x1d4c5, G_UNICODE_NOT_PRESENT_OFFSET, 5855 }, - { 0x1d4c6, G_UNICODE_NOT_PRESENT_OFFSET, 5857 }, - { 0x1d4c7, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, - { 0x1d4c8, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, - { 0x1d4c9, G_UNICODE_NOT_PRESENT_OFFSET, 5859 }, - { 0x1d4ca, G_UNICODE_NOT_PRESENT_OFFSET, 5861 }, - { 0x1d4cb, G_UNICODE_NOT_PRESENT_OFFSET, 5204 }, - { 0x1d4cc, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, - { 0x1d4cd, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, - { 0x1d4ce, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, - { 0x1d4cf, G_UNICODE_NOT_PRESENT_OFFSET, 5863 }, - { 0x1d4d0, G_UNICODE_NOT_PRESENT_OFFSET, 5831 }, - { 0x1d4d1, G_UNICODE_NOT_PRESENT_OFFSET, 5042 }, - { 0x1d4d2, G_UNICODE_NOT_PRESENT_OFFSET, 4982 }, - { 0x1d4d3, G_UNICODE_NOT_PRESENT_OFFSET, 5077 }, - { 0x1d4d4, G_UNICODE_NOT_PRESENT_OFFSET, 5046 }, - { 0x1d4d5, G_UNICODE_NOT_PRESENT_OFFSET, 5048 }, - { 0x1d4d6, G_UNICODE_NOT_PRESENT_OFFSET, 5833 }, - { 0x1d4d7, G_UNICODE_NOT_PRESENT_OFFSET, 5005 }, - { 0x1d4d8, G_UNICODE_NOT_PRESENT_OFFSET, 5010 }, - { 0x1d4d9, G_UNICODE_NOT_PRESENT_OFFSET, 5835 }, - { 0x1d4da, G_UNICODE_NOT_PRESENT_OFFSET, 5040 }, - { 0x1d4db, G_UNICODE_NOT_PRESENT_OFFSET, 5012 }, - { 0x1d4dc, G_UNICODE_NOT_PRESENT_OFFSET, 5050 }, - { 0x1d4dd, G_UNICODE_NOT_PRESENT_OFFSET, 5014 }, - { 0x1d4de, G_UNICODE_NOT_PRESENT_OFFSET, 5837 }, - { 0x1d4df, G_UNICODE_NOT_PRESENT_OFFSET, 5019 }, - { 0x1d4e0, G_UNICODE_NOT_PRESENT_OFFSET, 5021 }, - { 0x1d4e1, G_UNICODE_NOT_PRESENT_OFFSET, 5023 }, - { 0x1d4e2, G_UNICODE_NOT_PRESENT_OFFSET, 5839 }, - { 0x1d4e3, G_UNICODE_NOT_PRESENT_OFFSET, 5841 }, - { 0x1d4e4, G_UNICODE_NOT_PRESENT_OFFSET, 5843 }, - { 0x1d4e5, G_UNICODE_NOT_PRESENT_OFFSET, 5168 }, - { 0x1d4e6, G_UNICODE_NOT_PRESENT_OFFSET, 5845 }, - { 0x1d4e7, G_UNICODE_NOT_PRESENT_OFFSET, 5185 }, - { 0x1d4e8, G_UNICODE_NOT_PRESENT_OFFSET, 5847 }, - { 0x1d4e9, G_UNICODE_NOT_PRESENT_OFFSET, 5035 }, - { 0x1d4ea, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, - { 0x1d4eb, G_UNICODE_NOT_PRESENT_OFFSET, 5849 }, - { 0x1d4ec, G_UNICODE_NOT_PRESENT_OFFSET, 5228 }, - { 0x1d4ed, G_UNICODE_NOT_PRESENT_OFFSET, 5079 }, - { 0x1d4ee, G_UNICODE_NOT_PRESENT_OFFSET, 5044 }, - { 0x1d4ef, G_UNICODE_NOT_PRESENT_OFFSET, 5851 }, - { 0x1d4f0, G_UNICODE_NOT_PRESENT_OFFSET, 5003 }, - { 0x1d4f1, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, - { 0x1d4f2, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x1d4f3, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, - { 0x1d4f4, G_UNICODE_NOT_PRESENT_OFFSET, 5853 }, - { 0x1d4f5, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, - { 0x1d4f6, G_UNICODE_NOT_PRESENT_OFFSET, 5230 }, - { 0x1d4f7, G_UNICODE_NOT_PRESENT_OFFSET, 4969 }, - { 0x1d4f8, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, - { 0x1d4f9, G_UNICODE_NOT_PRESENT_OFFSET, 5855 }, - { 0x1d4fa, G_UNICODE_NOT_PRESENT_OFFSET, 5857 }, - { 0x1d4fb, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, - { 0x1d4fc, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, - { 0x1d4fd, G_UNICODE_NOT_PRESENT_OFFSET, 5859 }, - { 0x1d4fe, G_UNICODE_NOT_PRESENT_OFFSET, 5861 }, - { 0x1d4ff, G_UNICODE_NOT_PRESENT_OFFSET, 5204 }, - { 0x1d500, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, - { 0x1d501, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, - { 0x1d502, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, - { 0x1d503, G_UNICODE_NOT_PRESENT_OFFSET, 5863 }, - { 0x1d504, G_UNICODE_NOT_PRESENT_OFFSET, 5831 }, - { 0x1d505, G_UNICODE_NOT_PRESENT_OFFSET, 5042 }, - { 0x1d507, G_UNICODE_NOT_PRESENT_OFFSET, 5077 }, - { 0x1d508, G_UNICODE_NOT_PRESENT_OFFSET, 5046 }, - { 0x1d509, G_UNICODE_NOT_PRESENT_OFFSET, 5048 }, - { 0x1d50a, G_UNICODE_NOT_PRESENT_OFFSET, 5833 }, - { 0x1d50d, G_UNICODE_NOT_PRESENT_OFFSET, 5835 }, - { 0x1d50e, G_UNICODE_NOT_PRESENT_OFFSET, 5040 }, - { 0x1d50f, G_UNICODE_NOT_PRESENT_OFFSET, 5012 }, - { 0x1d510, G_UNICODE_NOT_PRESENT_OFFSET, 5050 }, - { 0x1d511, G_UNICODE_NOT_PRESENT_OFFSET, 5014 }, - { 0x1d512, G_UNICODE_NOT_PRESENT_OFFSET, 5837 }, - { 0x1d513, G_UNICODE_NOT_PRESENT_OFFSET, 5019 }, - { 0x1d514, G_UNICODE_NOT_PRESENT_OFFSET, 5021 }, - { 0x1d516, G_UNICODE_NOT_PRESENT_OFFSET, 5839 }, - { 0x1d517, G_UNICODE_NOT_PRESENT_OFFSET, 5841 }, - { 0x1d518, G_UNICODE_NOT_PRESENT_OFFSET, 5843 }, - { 0x1d519, G_UNICODE_NOT_PRESENT_OFFSET, 5168 }, - { 0x1d51a, G_UNICODE_NOT_PRESENT_OFFSET, 5845 }, - { 0x1d51b, G_UNICODE_NOT_PRESENT_OFFSET, 5185 }, - { 0x1d51c, G_UNICODE_NOT_PRESENT_OFFSET, 5847 }, - { 0x1d51e, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, - { 0x1d51f, G_UNICODE_NOT_PRESENT_OFFSET, 5849 }, - { 0x1d520, G_UNICODE_NOT_PRESENT_OFFSET, 5228 }, - { 0x1d521, G_UNICODE_NOT_PRESENT_OFFSET, 5079 }, - { 0x1d522, G_UNICODE_NOT_PRESENT_OFFSET, 5044 }, - { 0x1d523, G_UNICODE_NOT_PRESENT_OFFSET, 5851 }, - { 0x1d524, G_UNICODE_NOT_PRESENT_OFFSET, 5003 }, - { 0x1d525, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, - { 0x1d526, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x1d527, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, - { 0x1d528, G_UNICODE_NOT_PRESENT_OFFSET, 5853 }, - { 0x1d529, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, - { 0x1d52a, G_UNICODE_NOT_PRESENT_OFFSET, 5230 }, - { 0x1d52b, G_UNICODE_NOT_PRESENT_OFFSET, 4969 }, - { 0x1d52c, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, - { 0x1d52d, G_UNICODE_NOT_PRESENT_OFFSET, 5855 }, - { 0x1d52e, G_UNICODE_NOT_PRESENT_OFFSET, 5857 }, - { 0x1d52f, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, - { 0x1d530, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, - { 0x1d531, G_UNICODE_NOT_PRESENT_OFFSET, 5859 }, - { 0x1d532, G_UNICODE_NOT_PRESENT_OFFSET, 5861 }, - { 0x1d533, G_UNICODE_NOT_PRESENT_OFFSET, 5204 }, - { 0x1d534, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, - { 0x1d535, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, - { 0x1d536, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, - { 0x1d537, G_UNICODE_NOT_PRESENT_OFFSET, 5863 }, - { 0x1d538, G_UNICODE_NOT_PRESENT_OFFSET, 5831 }, - { 0x1d539, G_UNICODE_NOT_PRESENT_OFFSET, 5042 }, - { 0x1d53b, G_UNICODE_NOT_PRESENT_OFFSET, 5077 }, - { 0x1d53c, G_UNICODE_NOT_PRESENT_OFFSET, 5046 }, - { 0x1d53d, G_UNICODE_NOT_PRESENT_OFFSET, 5048 }, - { 0x1d53e, G_UNICODE_NOT_PRESENT_OFFSET, 5833 }, - { 0x1d540, G_UNICODE_NOT_PRESENT_OFFSET, 5010 }, - { 0x1d541, G_UNICODE_NOT_PRESENT_OFFSET, 5835 }, - { 0x1d542, G_UNICODE_NOT_PRESENT_OFFSET, 5040 }, - { 0x1d543, G_UNICODE_NOT_PRESENT_OFFSET, 5012 }, - { 0x1d544, G_UNICODE_NOT_PRESENT_OFFSET, 5050 }, - { 0x1d546, G_UNICODE_NOT_PRESENT_OFFSET, 5837 }, - { 0x1d54a, G_UNICODE_NOT_PRESENT_OFFSET, 5839 }, - { 0x1d54b, G_UNICODE_NOT_PRESENT_OFFSET, 5841 }, - { 0x1d54c, G_UNICODE_NOT_PRESENT_OFFSET, 5843 }, - { 0x1d54d, G_UNICODE_NOT_PRESENT_OFFSET, 5168 }, - { 0x1d54e, G_UNICODE_NOT_PRESENT_OFFSET, 5845 }, - { 0x1d54f, G_UNICODE_NOT_PRESENT_OFFSET, 5185 }, - { 0x1d550, G_UNICODE_NOT_PRESENT_OFFSET, 5847 }, - { 0x1d552, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, - { 0x1d553, G_UNICODE_NOT_PRESENT_OFFSET, 5849 }, - { 0x1d554, G_UNICODE_NOT_PRESENT_OFFSET, 5228 }, - { 0x1d555, G_UNICODE_NOT_PRESENT_OFFSET, 5079 }, - { 0x1d556, G_UNICODE_NOT_PRESENT_OFFSET, 5044 }, - { 0x1d557, G_UNICODE_NOT_PRESENT_OFFSET, 5851 }, - { 0x1d558, G_UNICODE_NOT_PRESENT_OFFSET, 5003 }, - { 0x1d559, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, - { 0x1d55a, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x1d55b, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, - { 0x1d55c, G_UNICODE_NOT_PRESENT_OFFSET, 5853 }, - { 0x1d55d, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, - { 0x1d55e, G_UNICODE_NOT_PRESENT_OFFSET, 5230 }, - { 0x1d55f, G_UNICODE_NOT_PRESENT_OFFSET, 4969 }, - { 0x1d560, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, - { 0x1d561, G_UNICODE_NOT_PRESENT_OFFSET, 5855 }, - { 0x1d562, G_UNICODE_NOT_PRESENT_OFFSET, 5857 }, - { 0x1d563, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, - { 0x1d564, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, - { 0x1d565, G_UNICODE_NOT_PRESENT_OFFSET, 5859 }, - { 0x1d566, G_UNICODE_NOT_PRESENT_OFFSET, 5861 }, - { 0x1d567, G_UNICODE_NOT_PRESENT_OFFSET, 5204 }, - { 0x1d568, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, - { 0x1d569, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, - { 0x1d56a, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, - { 0x1d56b, G_UNICODE_NOT_PRESENT_OFFSET, 5863 }, - { 0x1d56c, G_UNICODE_NOT_PRESENT_OFFSET, 5831 }, - { 0x1d56d, G_UNICODE_NOT_PRESENT_OFFSET, 5042 }, - { 0x1d56e, G_UNICODE_NOT_PRESENT_OFFSET, 4982 }, - { 0x1d56f, G_UNICODE_NOT_PRESENT_OFFSET, 5077 }, - { 0x1d570, G_UNICODE_NOT_PRESENT_OFFSET, 5046 }, - { 0x1d571, G_UNICODE_NOT_PRESENT_OFFSET, 5048 }, - { 0x1d572, G_UNICODE_NOT_PRESENT_OFFSET, 5833 }, - { 0x1d573, G_UNICODE_NOT_PRESENT_OFFSET, 5005 }, - { 0x1d574, G_UNICODE_NOT_PRESENT_OFFSET, 5010 }, - { 0x1d575, G_UNICODE_NOT_PRESENT_OFFSET, 5835 }, - { 0x1d576, G_UNICODE_NOT_PRESENT_OFFSET, 5040 }, - { 0x1d577, G_UNICODE_NOT_PRESENT_OFFSET, 5012 }, - { 0x1d578, G_UNICODE_NOT_PRESENT_OFFSET, 5050 }, - { 0x1d579, G_UNICODE_NOT_PRESENT_OFFSET, 5014 }, - { 0x1d57a, G_UNICODE_NOT_PRESENT_OFFSET, 5837 }, - { 0x1d57b, G_UNICODE_NOT_PRESENT_OFFSET, 5019 }, - { 0x1d57c, G_UNICODE_NOT_PRESENT_OFFSET, 5021 }, - { 0x1d57d, G_UNICODE_NOT_PRESENT_OFFSET, 5023 }, - { 0x1d57e, G_UNICODE_NOT_PRESENT_OFFSET, 5839 }, - { 0x1d57f, G_UNICODE_NOT_PRESENT_OFFSET, 5841 }, - { 0x1d580, G_UNICODE_NOT_PRESENT_OFFSET, 5843 }, - { 0x1d581, G_UNICODE_NOT_PRESENT_OFFSET, 5168 }, - { 0x1d582, G_UNICODE_NOT_PRESENT_OFFSET, 5845 }, - { 0x1d583, G_UNICODE_NOT_PRESENT_OFFSET, 5185 }, - { 0x1d584, G_UNICODE_NOT_PRESENT_OFFSET, 5847 }, - { 0x1d585, G_UNICODE_NOT_PRESENT_OFFSET, 5035 }, - { 0x1d586, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, - { 0x1d587, G_UNICODE_NOT_PRESENT_OFFSET, 5849 }, - { 0x1d588, G_UNICODE_NOT_PRESENT_OFFSET, 5228 }, - { 0x1d589, G_UNICODE_NOT_PRESENT_OFFSET, 5079 }, - { 0x1d58a, G_UNICODE_NOT_PRESENT_OFFSET, 5044 }, - { 0x1d58b, G_UNICODE_NOT_PRESENT_OFFSET, 5851 }, - { 0x1d58c, G_UNICODE_NOT_PRESENT_OFFSET, 5003 }, - { 0x1d58d, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, - { 0x1d58e, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x1d58f, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, - { 0x1d590, G_UNICODE_NOT_PRESENT_OFFSET, 5853 }, - { 0x1d591, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, - { 0x1d592, G_UNICODE_NOT_PRESENT_OFFSET, 5230 }, - { 0x1d593, G_UNICODE_NOT_PRESENT_OFFSET, 4969 }, - { 0x1d594, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, - { 0x1d595, G_UNICODE_NOT_PRESENT_OFFSET, 5855 }, - { 0x1d596, G_UNICODE_NOT_PRESENT_OFFSET, 5857 }, - { 0x1d597, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, - { 0x1d598, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, - { 0x1d599, G_UNICODE_NOT_PRESENT_OFFSET, 5859 }, - { 0x1d59a, G_UNICODE_NOT_PRESENT_OFFSET, 5861 }, - { 0x1d59b, G_UNICODE_NOT_PRESENT_OFFSET, 5204 }, - { 0x1d59c, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, - { 0x1d59d, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, - { 0x1d59e, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, - { 0x1d59f, G_UNICODE_NOT_PRESENT_OFFSET, 5863 }, - { 0x1d5a0, G_UNICODE_NOT_PRESENT_OFFSET, 5831 }, - { 0x1d5a1, G_UNICODE_NOT_PRESENT_OFFSET, 5042 }, - { 0x1d5a2, G_UNICODE_NOT_PRESENT_OFFSET, 4982 }, - { 0x1d5a3, G_UNICODE_NOT_PRESENT_OFFSET, 5077 }, - { 0x1d5a4, G_UNICODE_NOT_PRESENT_OFFSET, 5046 }, - { 0x1d5a5, G_UNICODE_NOT_PRESENT_OFFSET, 5048 }, - { 0x1d5a6, G_UNICODE_NOT_PRESENT_OFFSET, 5833 }, - { 0x1d5a7, G_UNICODE_NOT_PRESENT_OFFSET, 5005 }, - { 0x1d5a8, G_UNICODE_NOT_PRESENT_OFFSET, 5010 }, - { 0x1d5a9, G_UNICODE_NOT_PRESENT_OFFSET, 5835 }, - { 0x1d5aa, G_UNICODE_NOT_PRESENT_OFFSET, 5040 }, - { 0x1d5ab, G_UNICODE_NOT_PRESENT_OFFSET, 5012 }, - { 0x1d5ac, G_UNICODE_NOT_PRESENT_OFFSET, 5050 }, - { 0x1d5ad, G_UNICODE_NOT_PRESENT_OFFSET, 5014 }, - { 0x1d5ae, G_UNICODE_NOT_PRESENT_OFFSET, 5837 }, - { 0x1d5af, G_UNICODE_NOT_PRESENT_OFFSET, 5019 }, - { 0x1d5b0, G_UNICODE_NOT_PRESENT_OFFSET, 5021 }, - { 0x1d5b1, G_UNICODE_NOT_PRESENT_OFFSET, 5023 }, - { 0x1d5b2, G_UNICODE_NOT_PRESENT_OFFSET, 5839 }, - { 0x1d5b3, G_UNICODE_NOT_PRESENT_OFFSET, 5841 }, - { 0x1d5b4, G_UNICODE_NOT_PRESENT_OFFSET, 5843 }, - { 0x1d5b5, G_UNICODE_NOT_PRESENT_OFFSET, 5168 }, - { 0x1d5b6, G_UNICODE_NOT_PRESENT_OFFSET, 5845 }, - { 0x1d5b7, G_UNICODE_NOT_PRESENT_OFFSET, 5185 }, - { 0x1d5b8, G_UNICODE_NOT_PRESENT_OFFSET, 5847 }, - { 0x1d5b9, G_UNICODE_NOT_PRESENT_OFFSET, 5035 }, - { 0x1d5ba, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, - { 0x1d5bb, G_UNICODE_NOT_PRESENT_OFFSET, 5849 }, - { 0x1d5bc, G_UNICODE_NOT_PRESENT_OFFSET, 5228 }, - { 0x1d5bd, G_UNICODE_NOT_PRESENT_OFFSET, 5079 }, - { 0x1d5be, G_UNICODE_NOT_PRESENT_OFFSET, 5044 }, - { 0x1d5bf, G_UNICODE_NOT_PRESENT_OFFSET, 5851 }, - { 0x1d5c0, G_UNICODE_NOT_PRESENT_OFFSET, 5003 }, - { 0x1d5c1, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, - { 0x1d5c2, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x1d5c3, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, - { 0x1d5c4, G_UNICODE_NOT_PRESENT_OFFSET, 5853 }, - { 0x1d5c5, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, - { 0x1d5c6, G_UNICODE_NOT_PRESENT_OFFSET, 5230 }, - { 0x1d5c7, G_UNICODE_NOT_PRESENT_OFFSET, 4969 }, - { 0x1d5c8, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, - { 0x1d5c9, G_UNICODE_NOT_PRESENT_OFFSET, 5855 }, - { 0x1d5ca, G_UNICODE_NOT_PRESENT_OFFSET, 5857 }, - { 0x1d5cb, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, - { 0x1d5cc, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, - { 0x1d5cd, G_UNICODE_NOT_PRESENT_OFFSET, 5859 }, - { 0x1d5ce, G_UNICODE_NOT_PRESENT_OFFSET, 5861 }, - { 0x1d5cf, G_UNICODE_NOT_PRESENT_OFFSET, 5204 }, - { 0x1d5d0, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, - { 0x1d5d1, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, - { 0x1d5d2, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, - { 0x1d5d3, G_UNICODE_NOT_PRESENT_OFFSET, 5863 }, - { 0x1d5d4, G_UNICODE_NOT_PRESENT_OFFSET, 5831 }, - { 0x1d5d5, G_UNICODE_NOT_PRESENT_OFFSET, 5042 }, - { 0x1d5d6, G_UNICODE_NOT_PRESENT_OFFSET, 4982 }, - { 0x1d5d7, G_UNICODE_NOT_PRESENT_OFFSET, 5077 }, - { 0x1d5d8, G_UNICODE_NOT_PRESENT_OFFSET, 5046 }, - { 0x1d5d9, G_UNICODE_NOT_PRESENT_OFFSET, 5048 }, - { 0x1d5da, G_UNICODE_NOT_PRESENT_OFFSET, 5833 }, - { 0x1d5db, G_UNICODE_NOT_PRESENT_OFFSET, 5005 }, - { 0x1d5dc, G_UNICODE_NOT_PRESENT_OFFSET, 5010 }, - { 0x1d5dd, G_UNICODE_NOT_PRESENT_OFFSET, 5835 }, - { 0x1d5de, G_UNICODE_NOT_PRESENT_OFFSET, 5040 }, - { 0x1d5df, G_UNICODE_NOT_PRESENT_OFFSET, 5012 }, - { 0x1d5e0, G_UNICODE_NOT_PRESENT_OFFSET, 5050 }, - { 0x1d5e1, G_UNICODE_NOT_PRESENT_OFFSET, 5014 }, - { 0x1d5e2, G_UNICODE_NOT_PRESENT_OFFSET, 5837 }, - { 0x1d5e3, G_UNICODE_NOT_PRESENT_OFFSET, 5019 }, - { 0x1d5e4, G_UNICODE_NOT_PRESENT_OFFSET, 5021 }, - { 0x1d5e5, G_UNICODE_NOT_PRESENT_OFFSET, 5023 }, - { 0x1d5e6, G_UNICODE_NOT_PRESENT_OFFSET, 5839 }, - { 0x1d5e7, G_UNICODE_NOT_PRESENT_OFFSET, 5841 }, - { 0x1d5e8, G_UNICODE_NOT_PRESENT_OFFSET, 5843 }, - { 0x1d5e9, G_UNICODE_NOT_PRESENT_OFFSET, 5168 }, - { 0x1d5ea, G_UNICODE_NOT_PRESENT_OFFSET, 5845 }, - { 0x1d5eb, G_UNICODE_NOT_PRESENT_OFFSET, 5185 }, - { 0x1d5ec, G_UNICODE_NOT_PRESENT_OFFSET, 5847 }, - { 0x1d5ed, G_UNICODE_NOT_PRESENT_OFFSET, 5035 }, - { 0x1d5ee, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, - { 0x1d5ef, G_UNICODE_NOT_PRESENT_OFFSET, 5849 }, - { 0x1d5f0, G_UNICODE_NOT_PRESENT_OFFSET, 5228 }, - { 0x1d5f1, G_UNICODE_NOT_PRESENT_OFFSET, 5079 }, - { 0x1d5f2, G_UNICODE_NOT_PRESENT_OFFSET, 5044 }, - { 0x1d5f3, G_UNICODE_NOT_PRESENT_OFFSET, 5851 }, - { 0x1d5f4, G_UNICODE_NOT_PRESENT_OFFSET, 5003 }, - { 0x1d5f5, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, - { 0x1d5f6, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x1d5f7, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, - { 0x1d5f8, G_UNICODE_NOT_PRESENT_OFFSET, 5853 }, - { 0x1d5f9, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, - { 0x1d5fa, G_UNICODE_NOT_PRESENT_OFFSET, 5230 }, - { 0x1d5fb, G_UNICODE_NOT_PRESENT_OFFSET, 4969 }, - { 0x1d5fc, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, - { 0x1d5fd, G_UNICODE_NOT_PRESENT_OFFSET, 5855 }, - { 0x1d5fe, G_UNICODE_NOT_PRESENT_OFFSET, 5857 }, - { 0x1d5ff, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, - { 0x1d600, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, - { 0x1d601, G_UNICODE_NOT_PRESENT_OFFSET, 5859 }, - { 0x1d602, G_UNICODE_NOT_PRESENT_OFFSET, 5861 }, - { 0x1d603, G_UNICODE_NOT_PRESENT_OFFSET, 5204 }, - { 0x1d604, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, - { 0x1d605, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, - { 0x1d606, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, - { 0x1d607, G_UNICODE_NOT_PRESENT_OFFSET, 5863 }, - { 0x1d608, G_UNICODE_NOT_PRESENT_OFFSET, 5831 }, - { 0x1d609, G_UNICODE_NOT_PRESENT_OFFSET, 5042 }, - { 0x1d60a, G_UNICODE_NOT_PRESENT_OFFSET, 4982 }, - { 0x1d60b, G_UNICODE_NOT_PRESENT_OFFSET, 5077 }, - { 0x1d60c, G_UNICODE_NOT_PRESENT_OFFSET, 5046 }, - { 0x1d60d, G_UNICODE_NOT_PRESENT_OFFSET, 5048 }, - { 0x1d60e, G_UNICODE_NOT_PRESENT_OFFSET, 5833 }, - { 0x1d60f, G_UNICODE_NOT_PRESENT_OFFSET, 5005 }, - { 0x1d610, G_UNICODE_NOT_PRESENT_OFFSET, 5010 }, - { 0x1d611, G_UNICODE_NOT_PRESENT_OFFSET, 5835 }, - { 0x1d612, G_UNICODE_NOT_PRESENT_OFFSET, 5040 }, - { 0x1d613, G_UNICODE_NOT_PRESENT_OFFSET, 5012 }, - { 0x1d614, G_UNICODE_NOT_PRESENT_OFFSET, 5050 }, - { 0x1d615, G_UNICODE_NOT_PRESENT_OFFSET, 5014 }, - { 0x1d616, G_UNICODE_NOT_PRESENT_OFFSET, 5837 }, - { 0x1d617, G_UNICODE_NOT_PRESENT_OFFSET, 5019 }, - { 0x1d618, G_UNICODE_NOT_PRESENT_OFFSET, 5021 }, - { 0x1d619, G_UNICODE_NOT_PRESENT_OFFSET, 5023 }, - { 0x1d61a, G_UNICODE_NOT_PRESENT_OFFSET, 5839 }, - { 0x1d61b, G_UNICODE_NOT_PRESENT_OFFSET, 5841 }, - { 0x1d61c, G_UNICODE_NOT_PRESENT_OFFSET, 5843 }, - { 0x1d61d, G_UNICODE_NOT_PRESENT_OFFSET, 5168 }, - { 0x1d61e, G_UNICODE_NOT_PRESENT_OFFSET, 5845 }, - { 0x1d61f, G_UNICODE_NOT_PRESENT_OFFSET, 5185 }, - { 0x1d620, G_UNICODE_NOT_PRESENT_OFFSET, 5847 }, - { 0x1d621, G_UNICODE_NOT_PRESENT_OFFSET, 5035 }, - { 0x1d622, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, - { 0x1d623, G_UNICODE_NOT_PRESENT_OFFSET, 5849 }, - { 0x1d624, G_UNICODE_NOT_PRESENT_OFFSET, 5228 }, - { 0x1d625, G_UNICODE_NOT_PRESENT_OFFSET, 5079 }, - { 0x1d626, G_UNICODE_NOT_PRESENT_OFFSET, 5044 }, - { 0x1d627, G_UNICODE_NOT_PRESENT_OFFSET, 5851 }, - { 0x1d628, G_UNICODE_NOT_PRESENT_OFFSET, 5003 }, - { 0x1d629, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, - { 0x1d62a, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x1d62b, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, - { 0x1d62c, G_UNICODE_NOT_PRESENT_OFFSET, 5853 }, - { 0x1d62d, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, - { 0x1d62e, G_UNICODE_NOT_PRESENT_OFFSET, 5230 }, - { 0x1d62f, G_UNICODE_NOT_PRESENT_OFFSET, 4969 }, - { 0x1d630, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, - { 0x1d631, G_UNICODE_NOT_PRESENT_OFFSET, 5855 }, - { 0x1d632, G_UNICODE_NOT_PRESENT_OFFSET, 5857 }, - { 0x1d633, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, - { 0x1d634, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, - { 0x1d635, G_UNICODE_NOT_PRESENT_OFFSET, 5859 }, - { 0x1d636, G_UNICODE_NOT_PRESENT_OFFSET, 5861 }, - { 0x1d637, G_UNICODE_NOT_PRESENT_OFFSET, 5204 }, - { 0x1d638, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, - { 0x1d639, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, - { 0x1d63a, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, - { 0x1d63b, G_UNICODE_NOT_PRESENT_OFFSET, 5863 }, - { 0x1d63c, G_UNICODE_NOT_PRESENT_OFFSET, 5831 }, - { 0x1d63d, G_UNICODE_NOT_PRESENT_OFFSET, 5042 }, - { 0x1d63e, G_UNICODE_NOT_PRESENT_OFFSET, 4982 }, - { 0x1d63f, G_UNICODE_NOT_PRESENT_OFFSET, 5077 }, - { 0x1d640, G_UNICODE_NOT_PRESENT_OFFSET, 5046 }, - { 0x1d641, G_UNICODE_NOT_PRESENT_OFFSET, 5048 }, - { 0x1d642, G_UNICODE_NOT_PRESENT_OFFSET, 5833 }, - { 0x1d643, G_UNICODE_NOT_PRESENT_OFFSET, 5005 }, - { 0x1d644, G_UNICODE_NOT_PRESENT_OFFSET, 5010 }, - { 0x1d645, G_UNICODE_NOT_PRESENT_OFFSET, 5835 }, - { 0x1d646, G_UNICODE_NOT_PRESENT_OFFSET, 5040 }, - { 0x1d647, G_UNICODE_NOT_PRESENT_OFFSET, 5012 }, - { 0x1d648, G_UNICODE_NOT_PRESENT_OFFSET, 5050 }, - { 0x1d649, G_UNICODE_NOT_PRESENT_OFFSET, 5014 }, - { 0x1d64a, G_UNICODE_NOT_PRESENT_OFFSET, 5837 }, - { 0x1d64b, G_UNICODE_NOT_PRESENT_OFFSET, 5019 }, - { 0x1d64c, G_UNICODE_NOT_PRESENT_OFFSET, 5021 }, - { 0x1d64d, G_UNICODE_NOT_PRESENT_OFFSET, 5023 }, - { 0x1d64e, G_UNICODE_NOT_PRESENT_OFFSET, 5839 }, - { 0x1d64f, G_UNICODE_NOT_PRESENT_OFFSET, 5841 }, - { 0x1d650, G_UNICODE_NOT_PRESENT_OFFSET, 5843 }, - { 0x1d651, G_UNICODE_NOT_PRESENT_OFFSET, 5168 }, - { 0x1d652, G_UNICODE_NOT_PRESENT_OFFSET, 5845 }, - { 0x1d653, G_UNICODE_NOT_PRESENT_OFFSET, 5185 }, - { 0x1d654, G_UNICODE_NOT_PRESENT_OFFSET, 5847 }, - { 0x1d655, G_UNICODE_NOT_PRESENT_OFFSET, 5035 }, - { 0x1d656, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, - { 0x1d657, G_UNICODE_NOT_PRESENT_OFFSET, 5849 }, - { 0x1d658, G_UNICODE_NOT_PRESENT_OFFSET, 5228 }, - { 0x1d659, G_UNICODE_NOT_PRESENT_OFFSET, 5079 }, - { 0x1d65a, G_UNICODE_NOT_PRESENT_OFFSET, 5044 }, - { 0x1d65b, G_UNICODE_NOT_PRESENT_OFFSET, 5851 }, - { 0x1d65c, G_UNICODE_NOT_PRESENT_OFFSET, 5003 }, - { 0x1d65d, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, - { 0x1d65e, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x1d65f, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, - { 0x1d660, G_UNICODE_NOT_PRESENT_OFFSET, 5853 }, - { 0x1d661, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, - { 0x1d662, G_UNICODE_NOT_PRESENT_OFFSET, 5230 }, - { 0x1d663, G_UNICODE_NOT_PRESENT_OFFSET, 4969 }, - { 0x1d664, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, - { 0x1d665, G_UNICODE_NOT_PRESENT_OFFSET, 5855 }, - { 0x1d666, G_UNICODE_NOT_PRESENT_OFFSET, 5857 }, - { 0x1d667, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, - { 0x1d668, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, - { 0x1d669, G_UNICODE_NOT_PRESENT_OFFSET, 5859 }, - { 0x1d66a, G_UNICODE_NOT_PRESENT_OFFSET, 5861 }, - { 0x1d66b, G_UNICODE_NOT_PRESENT_OFFSET, 5204 }, - { 0x1d66c, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, - { 0x1d66d, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, - { 0x1d66e, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, - { 0x1d66f, G_UNICODE_NOT_PRESENT_OFFSET, 5863 }, - { 0x1d670, G_UNICODE_NOT_PRESENT_OFFSET, 5831 }, - { 0x1d671, G_UNICODE_NOT_PRESENT_OFFSET, 5042 }, - { 0x1d672, G_UNICODE_NOT_PRESENT_OFFSET, 4982 }, - { 0x1d673, G_UNICODE_NOT_PRESENT_OFFSET, 5077 }, - { 0x1d674, G_UNICODE_NOT_PRESENT_OFFSET, 5046 }, - { 0x1d675, G_UNICODE_NOT_PRESENT_OFFSET, 5048 }, - { 0x1d676, G_UNICODE_NOT_PRESENT_OFFSET, 5833 }, - { 0x1d677, G_UNICODE_NOT_PRESENT_OFFSET, 5005 }, - { 0x1d678, G_UNICODE_NOT_PRESENT_OFFSET, 5010 }, - { 0x1d679, G_UNICODE_NOT_PRESENT_OFFSET, 5835 }, - { 0x1d67a, G_UNICODE_NOT_PRESENT_OFFSET, 5040 }, - { 0x1d67b, G_UNICODE_NOT_PRESENT_OFFSET, 5012 }, - { 0x1d67c, G_UNICODE_NOT_PRESENT_OFFSET, 5050 }, - { 0x1d67d, G_UNICODE_NOT_PRESENT_OFFSET, 5014 }, - { 0x1d67e, G_UNICODE_NOT_PRESENT_OFFSET, 5837 }, - { 0x1d67f, G_UNICODE_NOT_PRESENT_OFFSET, 5019 }, - { 0x1d680, G_UNICODE_NOT_PRESENT_OFFSET, 5021 }, - { 0x1d681, G_UNICODE_NOT_PRESENT_OFFSET, 5023 }, - { 0x1d682, G_UNICODE_NOT_PRESENT_OFFSET, 5839 }, - { 0x1d683, G_UNICODE_NOT_PRESENT_OFFSET, 5841 }, - { 0x1d684, G_UNICODE_NOT_PRESENT_OFFSET, 5843 }, - { 0x1d685, G_UNICODE_NOT_PRESENT_OFFSET, 5168 }, - { 0x1d686, G_UNICODE_NOT_PRESENT_OFFSET, 5845 }, - { 0x1d687, G_UNICODE_NOT_PRESENT_OFFSET, 5185 }, - { 0x1d688, G_UNICODE_NOT_PRESENT_OFFSET, 5847 }, - { 0x1d689, G_UNICODE_NOT_PRESENT_OFFSET, 5035 }, - { 0x1d68a, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, - { 0x1d68b, G_UNICODE_NOT_PRESENT_OFFSET, 5849 }, - { 0x1d68c, G_UNICODE_NOT_PRESENT_OFFSET, 5228 }, - { 0x1d68d, G_UNICODE_NOT_PRESENT_OFFSET, 5079 }, - { 0x1d68e, G_UNICODE_NOT_PRESENT_OFFSET, 5044 }, - { 0x1d68f, G_UNICODE_NOT_PRESENT_OFFSET, 5851 }, - { 0x1d690, G_UNICODE_NOT_PRESENT_OFFSET, 5003 }, - { 0x1d691, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, - { 0x1d692, G_UNICODE_NOT_PRESENT_OFFSET, 4943 }, - { 0x1d693, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, - { 0x1d694, G_UNICODE_NOT_PRESENT_OFFSET, 5853 }, - { 0x1d695, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, - { 0x1d696, G_UNICODE_NOT_PRESENT_OFFSET, 5230 }, - { 0x1d697, G_UNICODE_NOT_PRESENT_OFFSET, 4969 }, - { 0x1d698, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, - { 0x1d699, G_UNICODE_NOT_PRESENT_OFFSET, 5855 }, - { 0x1d69a, G_UNICODE_NOT_PRESENT_OFFSET, 5857 }, - { 0x1d69b, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, - { 0x1d69c, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, - { 0x1d69d, G_UNICODE_NOT_PRESENT_OFFSET, 5859 }, - { 0x1d69e, G_UNICODE_NOT_PRESENT_OFFSET, 5861 }, - { 0x1d69f, G_UNICODE_NOT_PRESENT_OFFSET, 5204 }, - { 0x1d6a0, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, - { 0x1d6a1, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, - { 0x1d6a2, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, - { 0x1d6a3, G_UNICODE_NOT_PRESENT_OFFSET, 5863 }, - { 0x1d6a8, G_UNICODE_NOT_PRESENT_OFFSET, 14361 }, - { 0x1d6a9, G_UNICODE_NOT_PRESENT_OFFSET, 14364 }, - { 0x1d6aa, G_UNICODE_NOT_PRESENT_OFFSET, 5067 }, - { 0x1d6ab, G_UNICODE_NOT_PRESENT_OFFSET, 14367 }, - { 0x1d6ac, G_UNICODE_NOT_PRESENT_OFFSET, 14370 }, - { 0x1d6ad, G_UNICODE_NOT_PRESENT_OFFSET, 14373 }, - { 0x1d6ae, G_UNICODE_NOT_PRESENT_OFFSET, 14376 }, - { 0x1d6af, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, - { 0x1d6b0, G_UNICODE_NOT_PRESENT_OFFSET, 14379 }, - { 0x1d6b1, G_UNICODE_NOT_PRESENT_OFFSET, 14382 }, - { 0x1d6b2, G_UNICODE_NOT_PRESENT_OFFSET, 14385 }, - { 0x1d6b3, G_UNICODE_NOT_PRESENT_OFFSET, 14388 }, - { 0x1d6b4, G_UNICODE_NOT_PRESENT_OFFSET, 14391 }, - { 0x1d6b5, G_UNICODE_NOT_PRESENT_OFFSET, 14394 }, - { 0x1d6b6, G_UNICODE_NOT_PRESENT_OFFSET, 14397 }, - { 0x1d6b7, G_UNICODE_NOT_PRESENT_OFFSET, 5070 }, - { 0x1d6b8, G_UNICODE_NOT_PRESENT_OFFSET, 14400 }, - { 0x1d6b9, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, - { 0x1d6ba, G_UNICODE_NOT_PRESENT_OFFSET, 14403 }, - { 0x1d6bb, G_UNICODE_NOT_PRESENT_OFFSET, 14406 }, - { 0x1d6bc, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, - { 0x1d6bd, G_UNICODE_NOT_PRESENT_OFFSET, 14409 }, - { 0x1d6be, G_UNICODE_NOT_PRESENT_OFFSET, 14412 }, - { 0x1d6bf, G_UNICODE_NOT_PRESENT_OFFSET, 14415 }, - { 0x1d6c0, G_UNICODE_NOT_PRESENT_OFFSET, 5037 }, - { 0x1d6c1, G_UNICODE_NOT_PRESENT_OFFSET, 14418 }, - { 0x1d6c2, G_UNICODE_NOT_PRESENT_OFFSET, 14422 }, - { 0x1d6c3, G_UNICODE_NOT_PRESENT_OFFSET, 1368 }, - { 0x1d6c4, G_UNICODE_NOT_PRESENT_OFFSET, 5064 }, - { 0x1d6c5, G_UNICODE_NOT_PRESENT_OFFSET, 14425 }, - { 0x1d6c6, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, - { 0x1d6c7, G_UNICODE_NOT_PRESENT_OFFSET, 14428 }, - { 0x1d6c8, G_UNICODE_NOT_PRESENT_OFFSET, 14431 }, - { 0x1d6c9, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, - { 0x1d6ca, G_UNICODE_NOT_PRESENT_OFFSET, 4548 }, - { 0x1d6cb, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, - { 0x1d6cc, G_UNICODE_NOT_PRESENT_OFFSET, 14434 }, - { 0x1d6cd, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, - { 0x1d6ce, G_UNICODE_NOT_PRESENT_OFFSET, 14437 }, - { 0x1d6cf, G_UNICODE_NOT_PRESENT_OFFSET, 14440 }, - { 0x1d6d0, G_UNICODE_NOT_PRESENT_OFFSET, 14443 }, - { 0x1d6d1, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, - { 0x1d6d2, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, - { 0x1d6d3, G_UNICODE_NOT_PRESENT_OFFSET, 1399 }, - { 0x1d6d4, G_UNICODE_NOT_PRESENT_OFFSET, 14446 }, - { 0x1d6d5, G_UNICODE_NOT_PRESENT_OFFSET, 14449 }, - { 0x1d6d6, G_UNICODE_NOT_PRESENT_OFFSET, 14452 }, - { 0x1d6d7, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, - { 0x1d6d8, G_UNICODE_NOT_PRESENT_OFFSET, 14455 }, - { 0x1d6d9, G_UNICODE_NOT_PRESENT_OFFSET, 14458 }, - { 0x1d6da, G_UNICODE_NOT_PRESENT_OFFSET, 14461 }, - { 0x1d6db, G_UNICODE_NOT_PRESENT_OFFSET, 14464 }, - { 0x1d6dc, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, - { 0x1d6dd, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, - { 0x1d6de, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, - { 0x1d6df, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, - { 0x1d6e0, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, - { 0x1d6e1, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, - { 0x1d6e2, G_UNICODE_NOT_PRESENT_OFFSET, 14361 }, - { 0x1d6e3, G_UNICODE_NOT_PRESENT_OFFSET, 14364 }, - { 0x1d6e4, G_UNICODE_NOT_PRESENT_OFFSET, 5067 }, - { 0x1d6e5, G_UNICODE_NOT_PRESENT_OFFSET, 14367 }, - { 0x1d6e6, G_UNICODE_NOT_PRESENT_OFFSET, 14370 }, - { 0x1d6e7, G_UNICODE_NOT_PRESENT_OFFSET, 14373 }, - { 0x1d6e8, G_UNICODE_NOT_PRESENT_OFFSET, 14376 }, - { 0x1d6e9, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, - { 0x1d6ea, G_UNICODE_NOT_PRESENT_OFFSET, 14379 }, - { 0x1d6eb, G_UNICODE_NOT_PRESENT_OFFSET, 14382 }, - { 0x1d6ec, G_UNICODE_NOT_PRESENT_OFFSET, 14385 }, - { 0x1d6ed, G_UNICODE_NOT_PRESENT_OFFSET, 14388 }, - { 0x1d6ee, G_UNICODE_NOT_PRESENT_OFFSET, 14391 }, - { 0x1d6ef, G_UNICODE_NOT_PRESENT_OFFSET, 14394 }, - { 0x1d6f0, G_UNICODE_NOT_PRESENT_OFFSET, 14397 }, - { 0x1d6f1, G_UNICODE_NOT_PRESENT_OFFSET, 5070 }, - { 0x1d6f2, G_UNICODE_NOT_PRESENT_OFFSET, 14400 }, - { 0x1d6f3, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, - { 0x1d6f4, G_UNICODE_NOT_PRESENT_OFFSET, 14403 }, - { 0x1d6f5, G_UNICODE_NOT_PRESENT_OFFSET, 14406 }, - { 0x1d6f6, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, - { 0x1d6f7, G_UNICODE_NOT_PRESENT_OFFSET, 14409 }, - { 0x1d6f8, G_UNICODE_NOT_PRESENT_OFFSET, 14412 }, - { 0x1d6f9, G_UNICODE_NOT_PRESENT_OFFSET, 14415 }, - { 0x1d6fa, G_UNICODE_NOT_PRESENT_OFFSET, 5037 }, - { 0x1d6fb, G_UNICODE_NOT_PRESENT_OFFSET, 14418 }, - { 0x1d6fc, G_UNICODE_NOT_PRESENT_OFFSET, 14422 }, - { 0x1d6fd, G_UNICODE_NOT_PRESENT_OFFSET, 1368 }, - { 0x1d6fe, G_UNICODE_NOT_PRESENT_OFFSET, 5064 }, - { 0x1d6ff, G_UNICODE_NOT_PRESENT_OFFSET, 14425 }, - { 0x1d700, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, - { 0x1d701, G_UNICODE_NOT_PRESENT_OFFSET, 14428 }, - { 0x1d702, G_UNICODE_NOT_PRESENT_OFFSET, 14431 }, - { 0x1d703, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, - { 0x1d704, G_UNICODE_NOT_PRESENT_OFFSET, 4548 }, - { 0x1d705, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, - { 0x1d706, G_UNICODE_NOT_PRESENT_OFFSET, 14434 }, - { 0x1d707, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, - { 0x1d708, G_UNICODE_NOT_PRESENT_OFFSET, 14437 }, - { 0x1d709, G_UNICODE_NOT_PRESENT_OFFSET, 14440 }, - { 0x1d70a, G_UNICODE_NOT_PRESENT_OFFSET, 14443 }, - { 0x1d70b, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, - { 0x1d70c, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, - { 0x1d70d, G_UNICODE_NOT_PRESENT_OFFSET, 1399 }, - { 0x1d70e, G_UNICODE_NOT_PRESENT_OFFSET, 14446 }, - { 0x1d70f, G_UNICODE_NOT_PRESENT_OFFSET, 14449 }, - { 0x1d710, G_UNICODE_NOT_PRESENT_OFFSET, 14452 }, - { 0x1d711, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, - { 0x1d712, G_UNICODE_NOT_PRESENT_OFFSET, 14455 }, - { 0x1d713, G_UNICODE_NOT_PRESENT_OFFSET, 14458 }, - { 0x1d714, G_UNICODE_NOT_PRESENT_OFFSET, 14461 }, - { 0x1d715, G_UNICODE_NOT_PRESENT_OFFSET, 14464 }, - { 0x1d716, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, - { 0x1d717, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, - { 0x1d718, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, - { 0x1d719, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, - { 0x1d71a, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, - { 0x1d71b, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, - { 0x1d71c, G_UNICODE_NOT_PRESENT_OFFSET, 14361 }, - { 0x1d71d, G_UNICODE_NOT_PRESENT_OFFSET, 14364 }, - { 0x1d71e, G_UNICODE_NOT_PRESENT_OFFSET, 5067 }, - { 0x1d71f, G_UNICODE_NOT_PRESENT_OFFSET, 14367 }, - { 0x1d720, G_UNICODE_NOT_PRESENT_OFFSET, 14370 }, - { 0x1d721, G_UNICODE_NOT_PRESENT_OFFSET, 14373 }, - { 0x1d722, G_UNICODE_NOT_PRESENT_OFFSET, 14376 }, - { 0x1d723, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, - { 0x1d724, G_UNICODE_NOT_PRESENT_OFFSET, 14379 }, - { 0x1d725, G_UNICODE_NOT_PRESENT_OFFSET, 14382 }, - { 0x1d726, G_UNICODE_NOT_PRESENT_OFFSET, 14385 }, - { 0x1d727, G_UNICODE_NOT_PRESENT_OFFSET, 14388 }, - { 0x1d728, G_UNICODE_NOT_PRESENT_OFFSET, 14391 }, - { 0x1d729, G_UNICODE_NOT_PRESENT_OFFSET, 14394 }, - { 0x1d72a, G_UNICODE_NOT_PRESENT_OFFSET, 14397 }, - { 0x1d72b, G_UNICODE_NOT_PRESENT_OFFSET, 5070 }, - { 0x1d72c, G_UNICODE_NOT_PRESENT_OFFSET, 14400 }, - { 0x1d72d, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, - { 0x1d72e, G_UNICODE_NOT_PRESENT_OFFSET, 14403 }, - { 0x1d72f, G_UNICODE_NOT_PRESENT_OFFSET, 14406 }, - { 0x1d730, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, - { 0x1d731, G_UNICODE_NOT_PRESENT_OFFSET, 14409 }, - { 0x1d732, G_UNICODE_NOT_PRESENT_OFFSET, 14412 }, - { 0x1d733, G_UNICODE_NOT_PRESENT_OFFSET, 14415 }, - { 0x1d734, G_UNICODE_NOT_PRESENT_OFFSET, 5037 }, - { 0x1d735, G_UNICODE_NOT_PRESENT_OFFSET, 14418 }, - { 0x1d736, G_UNICODE_NOT_PRESENT_OFFSET, 14422 }, - { 0x1d737, G_UNICODE_NOT_PRESENT_OFFSET, 1368 }, - { 0x1d738, G_UNICODE_NOT_PRESENT_OFFSET, 5064 }, - { 0x1d739, G_UNICODE_NOT_PRESENT_OFFSET, 14425 }, - { 0x1d73a, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, - { 0x1d73b, G_UNICODE_NOT_PRESENT_OFFSET, 14428 }, - { 0x1d73c, G_UNICODE_NOT_PRESENT_OFFSET, 14431 }, - { 0x1d73d, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, - { 0x1d73e, G_UNICODE_NOT_PRESENT_OFFSET, 4548 }, - { 0x1d73f, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, - { 0x1d740, G_UNICODE_NOT_PRESENT_OFFSET, 14434 }, - { 0x1d741, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, - { 0x1d742, G_UNICODE_NOT_PRESENT_OFFSET, 14437 }, - { 0x1d743, G_UNICODE_NOT_PRESENT_OFFSET, 14440 }, - { 0x1d744, G_UNICODE_NOT_PRESENT_OFFSET, 14443 }, - { 0x1d745, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, - { 0x1d746, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, - { 0x1d747, G_UNICODE_NOT_PRESENT_OFFSET, 1399 }, - { 0x1d748, G_UNICODE_NOT_PRESENT_OFFSET, 14446 }, - { 0x1d749, G_UNICODE_NOT_PRESENT_OFFSET, 14449 }, - { 0x1d74a, G_UNICODE_NOT_PRESENT_OFFSET, 14452 }, - { 0x1d74b, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, - { 0x1d74c, G_UNICODE_NOT_PRESENT_OFFSET, 14455 }, - { 0x1d74d, G_UNICODE_NOT_PRESENT_OFFSET, 14458 }, - { 0x1d74e, G_UNICODE_NOT_PRESENT_OFFSET, 14461 }, - { 0x1d74f, G_UNICODE_NOT_PRESENT_OFFSET, 14464 }, - { 0x1d750, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, - { 0x1d751, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, - { 0x1d752, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, - { 0x1d753, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, - { 0x1d754, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, - { 0x1d755, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, - { 0x1d756, G_UNICODE_NOT_PRESENT_OFFSET, 14361 }, - { 0x1d757, G_UNICODE_NOT_PRESENT_OFFSET, 14364 }, - { 0x1d758, G_UNICODE_NOT_PRESENT_OFFSET, 5067 }, - { 0x1d759, G_UNICODE_NOT_PRESENT_OFFSET, 14367 }, - { 0x1d75a, G_UNICODE_NOT_PRESENT_OFFSET, 14370 }, - { 0x1d75b, G_UNICODE_NOT_PRESENT_OFFSET, 14373 }, - { 0x1d75c, G_UNICODE_NOT_PRESENT_OFFSET, 14376 }, - { 0x1d75d, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, - { 0x1d75e, G_UNICODE_NOT_PRESENT_OFFSET, 14379 }, - { 0x1d75f, G_UNICODE_NOT_PRESENT_OFFSET, 14382 }, - { 0x1d760, G_UNICODE_NOT_PRESENT_OFFSET, 14385 }, - { 0x1d761, G_UNICODE_NOT_PRESENT_OFFSET, 14388 }, - { 0x1d762, G_UNICODE_NOT_PRESENT_OFFSET, 14391 }, - { 0x1d763, G_UNICODE_NOT_PRESENT_OFFSET, 14394 }, - { 0x1d764, G_UNICODE_NOT_PRESENT_OFFSET, 14397 }, - { 0x1d765, G_UNICODE_NOT_PRESENT_OFFSET, 5070 }, - { 0x1d766, G_UNICODE_NOT_PRESENT_OFFSET, 14400 }, - { 0x1d767, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, - { 0x1d768, G_UNICODE_NOT_PRESENT_OFFSET, 14403 }, - { 0x1d769, G_UNICODE_NOT_PRESENT_OFFSET, 14406 }, - { 0x1d76a, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, - { 0x1d76b, G_UNICODE_NOT_PRESENT_OFFSET, 14409 }, - { 0x1d76c, G_UNICODE_NOT_PRESENT_OFFSET, 14412 }, - { 0x1d76d, G_UNICODE_NOT_PRESENT_OFFSET, 14415 }, - { 0x1d76e, G_UNICODE_NOT_PRESENT_OFFSET, 5037 }, - { 0x1d76f, G_UNICODE_NOT_PRESENT_OFFSET, 14418 }, - { 0x1d770, G_UNICODE_NOT_PRESENT_OFFSET, 14422 }, - { 0x1d771, G_UNICODE_NOT_PRESENT_OFFSET, 1368 }, - { 0x1d772, G_UNICODE_NOT_PRESENT_OFFSET, 5064 }, - { 0x1d773, G_UNICODE_NOT_PRESENT_OFFSET, 14425 }, - { 0x1d774, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, - { 0x1d775, G_UNICODE_NOT_PRESENT_OFFSET, 14428 }, - { 0x1d776, G_UNICODE_NOT_PRESENT_OFFSET, 14431 }, - { 0x1d777, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, - { 0x1d778, G_UNICODE_NOT_PRESENT_OFFSET, 4548 }, - { 0x1d779, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, - { 0x1d77a, G_UNICODE_NOT_PRESENT_OFFSET, 14434 }, - { 0x1d77b, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, - { 0x1d77c, G_UNICODE_NOT_PRESENT_OFFSET, 14437 }, - { 0x1d77d, G_UNICODE_NOT_PRESENT_OFFSET, 14440 }, - { 0x1d77e, G_UNICODE_NOT_PRESENT_OFFSET, 14443 }, - { 0x1d77f, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, - { 0x1d780, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, - { 0x1d781, G_UNICODE_NOT_PRESENT_OFFSET, 1399 }, - { 0x1d782, G_UNICODE_NOT_PRESENT_OFFSET, 14446 }, - { 0x1d783, G_UNICODE_NOT_PRESENT_OFFSET, 14449 }, - { 0x1d784, G_UNICODE_NOT_PRESENT_OFFSET, 14452 }, - { 0x1d785, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, - { 0x1d786, G_UNICODE_NOT_PRESENT_OFFSET, 14455 }, - { 0x1d787, G_UNICODE_NOT_PRESENT_OFFSET, 14458 }, - { 0x1d788, G_UNICODE_NOT_PRESENT_OFFSET, 14461 }, - { 0x1d789, G_UNICODE_NOT_PRESENT_OFFSET, 14464 }, - { 0x1d78a, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, - { 0x1d78b, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, - { 0x1d78c, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, - { 0x1d78d, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, - { 0x1d78e, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, - { 0x1d78f, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, - { 0x1d790, G_UNICODE_NOT_PRESENT_OFFSET, 14361 }, - { 0x1d791, G_UNICODE_NOT_PRESENT_OFFSET, 14364 }, - { 0x1d792, G_UNICODE_NOT_PRESENT_OFFSET, 5067 }, - { 0x1d793, G_UNICODE_NOT_PRESENT_OFFSET, 14367 }, - { 0x1d794, G_UNICODE_NOT_PRESENT_OFFSET, 14370 }, - { 0x1d795, G_UNICODE_NOT_PRESENT_OFFSET, 14373 }, - { 0x1d796, G_UNICODE_NOT_PRESENT_OFFSET, 14376 }, - { 0x1d797, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, - { 0x1d798, G_UNICODE_NOT_PRESENT_OFFSET, 14379 }, - { 0x1d799, G_UNICODE_NOT_PRESENT_OFFSET, 14382 }, - { 0x1d79a, G_UNICODE_NOT_PRESENT_OFFSET, 14385 }, - { 0x1d79b, G_UNICODE_NOT_PRESENT_OFFSET, 14388 }, - { 0x1d79c, G_UNICODE_NOT_PRESENT_OFFSET, 14391 }, - { 0x1d79d, G_UNICODE_NOT_PRESENT_OFFSET, 14394 }, - { 0x1d79e, G_UNICODE_NOT_PRESENT_OFFSET, 14397 }, - { 0x1d79f, G_UNICODE_NOT_PRESENT_OFFSET, 5070 }, - { 0x1d7a0, G_UNICODE_NOT_PRESENT_OFFSET, 14400 }, - { 0x1d7a1, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, - { 0x1d7a2, G_UNICODE_NOT_PRESENT_OFFSET, 14403 }, - { 0x1d7a3, G_UNICODE_NOT_PRESENT_OFFSET, 14406 }, - { 0x1d7a4, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, - { 0x1d7a5, G_UNICODE_NOT_PRESENT_OFFSET, 14409 }, - { 0x1d7a6, G_UNICODE_NOT_PRESENT_OFFSET, 14412 }, - { 0x1d7a7, G_UNICODE_NOT_PRESENT_OFFSET, 14415 }, - { 0x1d7a8, G_UNICODE_NOT_PRESENT_OFFSET, 5037 }, - { 0x1d7a9, G_UNICODE_NOT_PRESENT_OFFSET, 14418 }, - { 0x1d7aa, G_UNICODE_NOT_PRESENT_OFFSET, 14422 }, - { 0x1d7ab, G_UNICODE_NOT_PRESENT_OFFSET, 1368 }, - { 0x1d7ac, G_UNICODE_NOT_PRESENT_OFFSET, 5064 }, - { 0x1d7ad, G_UNICODE_NOT_PRESENT_OFFSET, 14425 }, - { 0x1d7ae, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, - { 0x1d7af, G_UNICODE_NOT_PRESENT_OFFSET, 14428 }, - { 0x1d7b0, G_UNICODE_NOT_PRESENT_OFFSET, 14431 }, - { 0x1d7b1, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, - { 0x1d7b2, G_UNICODE_NOT_PRESENT_OFFSET, 4548 }, - { 0x1d7b3, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, - { 0x1d7b4, G_UNICODE_NOT_PRESENT_OFFSET, 14434 }, - { 0x1d7b5, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, - { 0x1d7b6, G_UNICODE_NOT_PRESENT_OFFSET, 14437 }, - { 0x1d7b7, G_UNICODE_NOT_PRESENT_OFFSET, 14440 }, - { 0x1d7b8, G_UNICODE_NOT_PRESENT_OFFSET, 14443 }, - { 0x1d7b9, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, - { 0x1d7ba, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, - { 0x1d7bb, G_UNICODE_NOT_PRESENT_OFFSET, 1399 }, - { 0x1d7bc, G_UNICODE_NOT_PRESENT_OFFSET, 14446 }, - { 0x1d7bd, G_UNICODE_NOT_PRESENT_OFFSET, 14449 }, - { 0x1d7be, G_UNICODE_NOT_PRESENT_OFFSET, 14452 }, - { 0x1d7bf, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, - { 0x1d7c0, G_UNICODE_NOT_PRESENT_OFFSET, 14455 }, - { 0x1d7c1, G_UNICODE_NOT_PRESENT_OFFSET, 14458 }, - { 0x1d7c2, G_UNICODE_NOT_PRESENT_OFFSET, 14461 }, - { 0x1d7c3, G_UNICODE_NOT_PRESENT_OFFSET, 14464 }, - { 0x1d7c4, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, - { 0x1d7c5, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, - { 0x1d7c6, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, - { 0x1d7c7, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, - { 0x1d7c8, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, - { 0x1d7c9, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, - { 0x1d7ce, G_UNICODE_NOT_PRESENT_OFFSET, 4941 }, - { 0x1d7cf, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, - { 0x1d7d0, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, - { 0x1d7d1, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, - { 0x1d7d2, G_UNICODE_NOT_PRESENT_OFFSET, 4945 }, - { 0x1d7d3, G_UNICODE_NOT_PRESENT_OFFSET, 4947 }, - { 0x1d7d4, G_UNICODE_NOT_PRESENT_OFFSET, 4949 }, - { 0x1d7d5, G_UNICODE_NOT_PRESENT_OFFSET, 4951 }, - { 0x1d7d6, G_UNICODE_NOT_PRESENT_OFFSET, 4953 }, - { 0x1d7d7, G_UNICODE_NOT_PRESENT_OFFSET, 4955 }, - { 0x1d7d8, G_UNICODE_NOT_PRESENT_OFFSET, 4941 }, - { 0x1d7d9, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, - { 0x1d7da, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, - { 0x1d7db, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, - { 0x1d7dc, G_UNICODE_NOT_PRESENT_OFFSET, 4945 }, - { 0x1d7dd, G_UNICODE_NOT_PRESENT_OFFSET, 4947 }, - { 0x1d7de, G_UNICODE_NOT_PRESENT_OFFSET, 4949 }, - { 0x1d7df, G_UNICODE_NOT_PRESENT_OFFSET, 4951 }, - { 0x1d7e0, G_UNICODE_NOT_PRESENT_OFFSET, 4953 }, - { 0x1d7e1, G_UNICODE_NOT_PRESENT_OFFSET, 4955 }, - { 0x1d7e2, G_UNICODE_NOT_PRESENT_OFFSET, 4941 }, - { 0x1d7e3, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, - { 0x1d7e4, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, - { 0x1d7e5, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, - { 0x1d7e6, G_UNICODE_NOT_PRESENT_OFFSET, 4945 }, - { 0x1d7e7, G_UNICODE_NOT_PRESENT_OFFSET, 4947 }, - { 0x1d7e8, G_UNICODE_NOT_PRESENT_OFFSET, 4949 }, - { 0x1d7e9, G_UNICODE_NOT_PRESENT_OFFSET, 4951 }, - { 0x1d7ea, G_UNICODE_NOT_PRESENT_OFFSET, 4953 }, - { 0x1d7eb, G_UNICODE_NOT_PRESENT_OFFSET, 4955 }, - { 0x1d7ec, G_UNICODE_NOT_PRESENT_OFFSET, 4941 }, - { 0x1d7ed, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, - { 0x1d7ee, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, - { 0x1d7ef, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, - { 0x1d7f0, G_UNICODE_NOT_PRESENT_OFFSET, 4945 }, - { 0x1d7f1, G_UNICODE_NOT_PRESENT_OFFSET, 4947 }, - { 0x1d7f2, G_UNICODE_NOT_PRESENT_OFFSET, 4949 }, - { 0x1d7f3, G_UNICODE_NOT_PRESENT_OFFSET, 4951 }, - { 0x1d7f4, G_UNICODE_NOT_PRESENT_OFFSET, 4953 }, - { 0x1d7f5, G_UNICODE_NOT_PRESENT_OFFSET, 4955 }, - { 0x1d7f6, G_UNICODE_NOT_PRESENT_OFFSET, 4941 }, - { 0x1d7f7, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, - { 0x1d7f8, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, - { 0x1d7f9, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, - { 0x1d7fa, G_UNICODE_NOT_PRESENT_OFFSET, 4945 }, - { 0x1d7fb, G_UNICODE_NOT_PRESENT_OFFSET, 4947 }, - { 0x1d7fc, G_UNICODE_NOT_PRESENT_OFFSET, 4949 }, - { 0x1d7fd, G_UNICODE_NOT_PRESENT_OFFSET, 4951 }, - { 0x1d7fe, G_UNICODE_NOT_PRESENT_OFFSET, 4953 }, - { 0x1d7ff, G_UNICODE_NOT_PRESENT_OFFSET, 4955 }, - { 0x2f800, 14468, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f801, 14472, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f802, 14476, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f803, 14480, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f804, 14485, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f805, 11545, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f806, 14489, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f807, 14493, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f808, 14497, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f809, 14501, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f80a, 11549, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f80b, 14505, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f80c, 14509, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f80d, 14513, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f80e, 11553, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f80f, 14518, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f810, 14522, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f811, 14526, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f812, 14530, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f813, 14535, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f814, 14539, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f815, 14543, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f816, 14547, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f817, 14552, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f818, 14556, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f819, 14560, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f81a, 14564, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f81b, 14568, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f81c, 14572, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f81d, 5967, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f81e, 14577, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f81f, 14581, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f820, 14585, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f821, 14589, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f822, 14593, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f823, 14597, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f824, 14601, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f825, 14605, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f826, 11557, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f827, 11561, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f828, 14609, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f829, 14613, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f82a, 14617, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f82b, 10837, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f82c, 14621, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f82d, 11565, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f82e, 14625, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f82f, 14629, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f830, 14633, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f831, 14637, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f832, 14637, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f833, 14637, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f834, 14641, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f835, 14646, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f836, 14650, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f837, 14654, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f838, 14658, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f839, 14663, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f83a, 14667, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f83b, 14671, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f83c, 14675, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f83d, 14679, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f83e, 14683, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f83f, 14687, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f840, 14691, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f841, 14695, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f842, 14699, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f843, 14703, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f844, 14707, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f845, 14711, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f846, 14711, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f847, 14715, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f848, 14719, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f849, 14723, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f84a, 14727, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f84b, 14731, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f84c, 11573, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f84d, 14735, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f84e, 14739, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f84f, 14743, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f850, 11421, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f851, 14747, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f852, 14751, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f853, 14755, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f854, 14759, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f855, 14763, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f856, 14767, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f857, 14771, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f858, 14775, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f859, 14779, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f85a, 14784, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f85b, 14788, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f85c, 14792, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f85d, 14796, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f85e, 14800, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f85f, 14804, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f860, 14808, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f861, 14813, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f862, 14818, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f863, 14822, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f864, 14826, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f865, 14830, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f866, 14834, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f867, 14838, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f868, 14842, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f869, 14847, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f86a, 14851, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f86b, 14851, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f86c, 14855, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f86d, 14860, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f86e, 14864, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f86f, 10821, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f870, 14868, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f871, 14872, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f872, 14877, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f873, 14881, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f874, 14885, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f875, 6071, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f876, 14889, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f877, 14893, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f878, 6079, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f879, 14897, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f87a, 14901, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f87b, 14905, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f87c, 14910, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f87d, 14914, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f87e, 14919, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f87f, 14923, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f880, 14927, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f881, 14931, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f882, 14935, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f883, 14939, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f884, 14943, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f885, 14947, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f886, 14951, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f887, 14955, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f888, 14959, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f889, 14963, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f88a, 14968, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f88b, 14972, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f88c, 14976, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f88d, 14980, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f88e, 10613, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f88f, 14984, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f890, 6119, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f891, 14989, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f892, 14989, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f893, 14994, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f894, 14998, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f895, 14998, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f896, 15002, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f897, 15006, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f898, 15011, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f899, 15016, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f89a, 15020, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f89b, 15024, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f89c, 15028, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f89d, 15032, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f89e, 15036, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f89f, 15040, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8a0, 15044, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8a1, 15048, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8a2, 15052, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8a3, 11593, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8a4, 15056, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8a5, 15061, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8a6, 15065, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8a7, 15069, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8a8, 15073, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8a9, 15069, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8aa, 15077, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8ab, 11601, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8ac, 15081, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8ad, 15085, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8ae, 15089, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8af, 15093, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8b0, 11605, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8b1, 10505, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8b2, 15097, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8b3, 15101, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8b4, 15105, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8b5, 15109, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8b6, 15113, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8b7, 15117, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8b8, 15121, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8b9, 15126, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8ba, 15130, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8bb, 15134, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8bc, 15138, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8bd, 15142, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8be, 15146, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8bf, 15151, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8c0, 15155, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8c1, 15159, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8c2, 15163, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8c3, 15167, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8c4, 15171, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8c5, 15175, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8c6, 15179, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8c7, 15183, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8c8, 11609, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8c9, 15187, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8ca, 15191, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8cb, 15196, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8cc, 15200, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8cd, 15204, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8ce, 15208, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8cf, 11617, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8d0, 15212, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8d1, 15216, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8d2, 15220, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8d3, 15224, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8d4, 15228, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8d5, 15232, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8d6, 15236, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8d7, 15240, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8d8, 10617, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8d9, 15244, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8da, 15248, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8db, 15252, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8dc, 15256, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8dd, 15260, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8de, 15265, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8df, 15269, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8e0, 15273, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8e1, 15277, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8e2, 11621, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8e3, 15281, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8e4, 15286, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8e5, 15290, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8e6, 15294, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8e7, 15298, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8e8, 15302, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8e9, 15306, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8ea, 15310, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8eb, 15314, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8ec, 15318, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8ed, 15323, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8ee, 15327, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8ef, 15331, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8f0, 15335, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8f1, 15340, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8f2, 15344, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8f3, 15348, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8f4, 15352, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8f5, 10889, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8f6, 15356, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8f7, 15360, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8f8, 15365, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8f9, 15370, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8fa, 15375, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8fb, 15379, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8fc, 15384, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8fd, 15388, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8fe, 15392, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f8ff, 15396, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f900, 15400, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f901, 11625, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f902, 11221, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f903, 15404, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f904, 15408, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f905, 15412, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f906, 15416, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f907, 15421, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f908, 15425, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f909, 15429, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f90a, 15433, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f90b, 15437, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f90c, 15441, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f90d, 15445, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f90e, 15450, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f90f, 15454, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f910, 15458, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f911, 15463, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f912, 15468, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f913, 15472, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f914, 15476, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f915, 15480, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f916, 15484, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f917, 15488, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f918, 15492, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f919, 15496, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f91a, 15500, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f91b, 15504, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f91c, 15509, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f91d, 15513, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f91e, 15518, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f91f, 15522, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f920, 15526, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f921, 15530, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f922, 15534, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f923, 15538, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f924, 15543, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f925, 15547, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f926, 15551, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f927, 15556, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f928, 15561, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f929, 15565, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f92a, 15569, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f92b, 15573, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f92c, 15577, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f92d, 15577, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f92e, 15581, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f92f, 15585, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f930, 15589, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f931, 15593, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f932, 15597, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f933, 15601, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f934, 15605, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f935, 15609, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f936, 15614, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f937, 15618, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f938, 10833, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f939, 15623, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f93a, 15628, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f93b, 15632, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f93c, 15637, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f93d, 15642, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f93e, 15647, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f93f, 15651, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f940, 15655, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f941, 15659, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f942, 15664, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f943, 15669, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f944, 15674, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f945, 15679, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f946, 15683, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f947, 15683, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f948, 15687, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f949, 15691, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f94a, 15695, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f94b, 15699, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f94c, 15703, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f94d, 15707, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f94e, 15712, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f94f, 10685, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f950, 15716, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f951, 15720, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f952, 15724, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f953, 11665, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f954, 15729, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f955, 15734, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f956, 11501, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f957, 15739, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f958, 15743, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f959, 11677, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f95a, 15747, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f95b, 15751, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f95c, 15755, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f95d, 15760, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f95e, 15760, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f95f, 15765, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f960, 15769, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f961, 15773, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f962, 15778, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f963, 15782, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f964, 15786, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f965, 15790, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f966, 15795, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f967, 15799, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f968, 15803, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f969, 15807, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f96a, 15811, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f96b, 15815, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f96c, 15820, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f96d, 15824, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f96e, 15828, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f96f, 15832, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f970, 15836, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f971, 15840, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f972, 15844, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f973, 15849, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f974, 15854, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f975, 15858, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f976, 15863, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f977, 15867, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f978, 15872, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f979, 15876, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f97a, 11701, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f97b, 15880, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f97c, 15885, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f97d, 15890, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f97e, 15894, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f97f, 15899, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f980, 15903, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f981, 15908, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f982, 15912, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f983, 15916, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f984, 15920, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f985, 15924, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f986, 15928, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f987, 15932, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f988, 15937, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f989, 15942, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f98a, 15947, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f98b, 14994, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f98c, 15952, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f98d, 15956, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f98e, 15960, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f98f, 15964, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f990, 15968, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f991, 15972, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f992, 15976, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f993, 15980, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f994, 15984, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f995, 15988, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f996, 15992, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f997, 15996, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f998, 10901, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f999, 16001, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f99a, 16005, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f99b, 16009, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f99c, 16013, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f99d, 16017, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f99e, 16021, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f99f, 11713, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9a0, 16025, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9a1, 16029, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9a2, 16033, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9a3, 16037, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9a4, 16041, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9a5, 16046, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9a6, 16051, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9a7, 16056, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9a8, 16060, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9a9, 16064, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9aa, 16068, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9ab, 16072, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9ac, 16077, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9ad, 16081, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9ae, 16086, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9af, 16090, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9b0, 16094, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9b1, 16099, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9b2, 16104, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9b3, 16108, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9b4, 10665, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9b5, 16112, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9b6, 16116, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9b7, 16120, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9b8, 16124, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9b9, 16128, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9ba, 16132, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9bb, 16136, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9bc, 16140, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9bd, 16144, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9be, 16148, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9bf, 16152, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9c0, 16156, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9c1, 16160, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9c2, 16164, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9c3, 16168, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9c4, 6479, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9c5, 16172, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9c6, 16177, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9c7, 16181, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9c8, 16185, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9c9, 16189, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9ca, 16193, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9cb, 16197, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9cc, 16202, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9cd, 16207, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9ce, 16211, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9cf, 16215, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9d0, 16219, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9d1, 16223, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9d2, 6507, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9d3, 16227, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9d4, 16232, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9d5, 16236, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9d6, 16240, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9d7, 16244, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9d8, 16248, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9d9, 16253, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9da, 16258, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9db, 16262, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9dc, 16266, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9dd, 16270, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9de, 16275, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9df, 16279, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9e0, 16283, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9e1, 16288, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9e2, 16293, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9e3, 16297, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9e4, 16301, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9e5, 16305, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9e6, 16310, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9e7, 16314, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9e8, 16318, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9e9, 16322, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9ea, 16326, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9eb, 16330, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9ec, 16334, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9ed, 16338, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9ee, 16343, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9ef, 16347, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9f0, 16351, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9f1, 16355, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9f2, 16360, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9f3, 16364, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9f4, 16368, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9f5, 16372, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9f6, 16376, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9f7, 16381, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9f8, 16386, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9f9, 16390, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9fa, 16394, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9fb, 16398, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9fc, 16403, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9fd, 16407, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9fe, 16412, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2f9ff, 16412, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa00, 16416, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa01, 16420, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa02, 16425, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa03, 16429, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa04, 16433, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa05, 16437, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa06, 16441, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa07, 16445, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa08, 16449, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa09, 16453, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa0a, 16458, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa0b, 16462, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa0c, 16466, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa0d, 16470, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa0e, 16474, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa0f, 16478, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa10, 16482, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa11, 16487, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa12, 16491, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa13, 16496, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa14, 16501, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa15, 6699, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa16, 16506, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa17, 6715, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa18, 16510, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa19, 16514, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa1a, 16518, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa1b, 16522, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa1c, 6735, G_UNICODE_NOT_PRESENT_OFFSET }, - { 0x2fa1d, 16526, G_UNICODE_NOT_PRESENT_OFFSET } -}; - -static const gchar decomp_expansion_string[] = - "\x20\0" /* offset 0 */ - "\x20\xcc\x88\0" /* offset 2 */ - "\x61\0" /* offset 6 */ - "\x20\xcc\x84\0" /* offset 8 */ - "\x32\0" /* offset 12 */ - "\x33\0" /* offset 14 */ - "\x20\xcc\x81\0" /* offset 16 */ - "\xce\xbc\0" /* offset 20 */ - "\x20\xcc\xa7\0" /* offset 23 */ - "\x31\0" /* offset 27 */ - "\x6f\0" /* offset 29 */ - "\x31\xe2\x81\x84\x34\0" /* offset 31 */ - "\x31\xe2\x81\x84\x32\0" /* offset 37 */ - "\x33\xe2\x81\x84\x34\0" /* offset 43 */ - "\x41\xcc\x80\0" /* offset 49 */ - "\x41\xcc\x81\0" /* offset 53 */ - "\x41\xcc\x82\0" /* offset 57 */ - "\x41\xcc\x83\0" /* offset 61 */ - "\x41\xcc\x88\0" /* offset 65 */ - "\x41\xcc\x8a\0" /* offset 69 */ - "\x43\xcc\xa7\0" /* offset 73 */ - "\x45\xcc\x80\0" /* offset 77 */ - "\x45\xcc\x81\0" /* offset 81 */ - "\x45\xcc\x82\0" /* offset 85 */ - "\x45\xcc\x88\0" /* offset 89 */ - "\x49\xcc\x80\0" /* offset 93 */ - "\x49\xcc\x81\0" /* offset 97 */ - "\x49\xcc\x82\0" /* offset 101 */ - "\x49\xcc\x88\0" /* offset 105 */ - "\x4e\xcc\x83\0" /* offset 109 */ - "\x4f\xcc\x80\0" /* offset 113 */ - "\x4f\xcc\x81\0" /* offset 117 */ - "\x4f\xcc\x82\0" /* offset 121 */ - "\x4f\xcc\x83\0" /* offset 125 */ - "\x4f\xcc\x88\0" /* offset 129 */ - "\x55\xcc\x80\0" /* offset 133 */ - "\x55\xcc\x81\0" /* offset 137 */ - "\x55\xcc\x82\0" /* offset 141 */ - "\x55\xcc\x88\0" /* offset 145 */ - "\x59\xcc\x81\0" /* offset 149 */ - "\x61\xcc\x80\0" /* offset 153 */ - "\x61\xcc\x81\0" /* offset 157 */ - "\x61\xcc\x82\0" /* offset 161 */ - "\x61\xcc\x83\0" /* offset 165 */ - "\x61\xcc\x88\0" /* offset 169 */ - "\x61\xcc\x8a\0" /* offset 173 */ - "\x63\xcc\xa7\0" /* offset 177 */ - "\x65\xcc\x80\0" /* offset 181 */ - "\x65\xcc\x81\0" /* offset 185 */ - "\x65\xcc\x82\0" /* offset 189 */ - "\x65\xcc\x88\0" /* offset 193 */ - "\x69\xcc\x80\0" /* offset 197 */ - "\x69\xcc\x81\0" /* offset 201 */ - "\x69\xcc\x82\0" /* offset 205 */ - "\x69\xcc\x88\0" /* offset 209 */ - "\x6e\xcc\x83\0" /* offset 213 */ - "\x6f\xcc\x80\0" /* offset 217 */ - "\x6f\xcc\x81\0" /* offset 221 */ - "\x6f\xcc\x82\0" /* offset 225 */ - "\x6f\xcc\x83\0" /* offset 229 */ - "\x6f\xcc\x88\0" /* offset 233 */ - "\x75\xcc\x80\0" /* offset 237 */ - "\x75\xcc\x81\0" /* offset 241 */ - "\x75\xcc\x82\0" /* offset 245 */ - "\x75\xcc\x88\0" /* offset 249 */ - "\x79\xcc\x81\0" /* offset 253 */ - "\x79\xcc\x88\0" /* offset 257 */ - "\x41\xcc\x84\0" /* offset 261 */ - "\x61\xcc\x84\0" /* offset 265 */ - "\x41\xcc\x86\0" /* offset 269 */ - "\x61\xcc\x86\0" /* offset 273 */ - "\x41\xcc\xa8\0" /* offset 277 */ - "\x61\xcc\xa8\0" /* offset 281 */ - "\x43\xcc\x81\0" /* offset 285 */ - "\x63\xcc\x81\0" /* offset 289 */ - "\x43\xcc\x82\0" /* offset 293 */ - "\x63\xcc\x82\0" /* offset 297 */ - "\x43\xcc\x87\0" /* offset 301 */ - "\x63\xcc\x87\0" /* offset 305 */ - "\x43\xcc\x8c\0" /* offset 309 */ - "\x63\xcc\x8c\0" /* offset 313 */ - "\x44\xcc\x8c\0" /* offset 317 */ - "\x64\xcc\x8c\0" /* offset 321 */ - "\x45\xcc\x84\0" /* offset 325 */ - "\x65\xcc\x84\0" /* offset 329 */ - "\x45\xcc\x86\0" /* offset 333 */ - "\x65\xcc\x86\0" /* offset 337 */ - "\x45\xcc\x87\0" /* offset 341 */ - "\x65\xcc\x87\0" /* offset 345 */ - "\x45\xcc\xa8\0" /* offset 349 */ - "\x65\xcc\xa8\0" /* offset 353 */ - "\x45\xcc\x8c\0" /* offset 357 */ - "\x65\xcc\x8c\0" /* offset 361 */ - "\x47\xcc\x82\0" /* offset 365 */ - "\x67\xcc\x82\0" /* offset 369 */ - "\x47\xcc\x86\0" /* offset 373 */ - "\x67\xcc\x86\0" /* offset 377 */ - "\x47\xcc\x87\0" /* offset 381 */ - "\x67\xcc\x87\0" /* offset 385 */ - "\x47\xcc\xa7\0" /* offset 389 */ - "\x67\xcc\xa7\0" /* offset 393 */ - "\x48\xcc\x82\0" /* offset 397 */ - "\x68\xcc\x82\0" /* offset 401 */ - "\x49\xcc\x83\0" /* offset 405 */ - "\x69\xcc\x83\0" /* offset 409 */ - "\x49\xcc\x84\0" /* offset 413 */ - "\x69\xcc\x84\0" /* offset 417 */ - "\x49\xcc\x86\0" /* offset 421 */ - "\x69\xcc\x86\0" /* offset 425 */ - "\x49\xcc\xa8\0" /* offset 429 */ - "\x69\xcc\xa8\0" /* offset 433 */ - "\x49\xcc\x87\0" /* offset 437 */ - "\x49\x4a\0" /* offset 441 */ - "\x69\x6a\0" /* offset 444 */ - "\x4a\xcc\x82\0" /* offset 447 */ - "\x6a\xcc\x82\0" /* offset 451 */ - "\x4b\xcc\xa7\0" /* offset 455 */ - "\x6b\xcc\xa7\0" /* offset 459 */ - "\x4c\xcc\x81\0" /* offset 463 */ - "\x6c\xcc\x81\0" /* offset 467 */ - "\x4c\xcc\xa7\0" /* offset 471 */ - "\x6c\xcc\xa7\0" /* offset 475 */ - "\x4c\xcc\x8c\0" /* offset 479 */ - "\x6c\xcc\x8c\0" /* offset 483 */ - "\x4c\xc2\xb7\0" /* offset 487 */ - "\x6c\xc2\xb7\0" /* offset 491 */ - "\x4e\xcc\x81\0" /* offset 495 */ - "\x6e\xcc\x81\0" /* offset 499 */ - "\x4e\xcc\xa7\0" /* offset 503 */ - "\x6e\xcc\xa7\0" /* offset 507 */ - "\x4e\xcc\x8c\0" /* offset 511 */ - "\x6e\xcc\x8c\0" /* offset 515 */ - "\xca\xbc\x6e\0" /* offset 519 */ - "\x4f\xcc\x84\0" /* offset 523 */ - "\x6f\xcc\x84\0" /* offset 527 */ - "\x4f\xcc\x86\0" /* offset 531 */ - "\x6f\xcc\x86\0" /* offset 535 */ - "\x4f\xcc\x8b\0" /* offset 539 */ - "\x6f\xcc\x8b\0" /* offset 543 */ - "\x52\xcc\x81\0" /* offset 547 */ - "\x72\xcc\x81\0" /* offset 551 */ - "\x52\xcc\xa7\0" /* offset 555 */ - "\x72\xcc\xa7\0" /* offset 559 */ - "\x52\xcc\x8c\0" /* offset 563 */ - "\x72\xcc\x8c\0" /* offset 567 */ - "\x53\xcc\x81\0" /* offset 571 */ - "\x73\xcc\x81\0" /* offset 575 */ - "\x53\xcc\x82\0" /* offset 579 */ - "\x73\xcc\x82\0" /* offset 583 */ - "\x53\xcc\xa7\0" /* offset 587 */ - "\x73\xcc\xa7\0" /* offset 591 */ - "\x53\xcc\x8c\0" /* offset 595 */ - "\x73\xcc\x8c\0" /* offset 599 */ - "\x54\xcc\xa7\0" /* offset 603 */ - "\x74\xcc\xa7\0" /* offset 607 */ - "\x54\xcc\x8c\0" /* offset 611 */ - "\x74\xcc\x8c\0" /* offset 615 */ - "\x55\xcc\x83\0" /* offset 619 */ - "\x75\xcc\x83\0" /* offset 623 */ - "\x55\xcc\x84\0" /* offset 627 */ - "\x75\xcc\x84\0" /* offset 631 */ - "\x55\xcc\x86\0" /* offset 635 */ - "\x75\xcc\x86\0" /* offset 639 */ - "\x55\xcc\x8a\0" /* offset 643 */ - "\x75\xcc\x8a\0" /* offset 647 */ - "\x55\xcc\x8b\0" /* offset 651 */ - "\x75\xcc\x8b\0" /* offset 655 */ - "\x55\xcc\xa8\0" /* offset 659 */ - "\x75\xcc\xa8\0" /* offset 663 */ - "\x57\xcc\x82\0" /* offset 667 */ - "\x77\xcc\x82\0" /* offset 671 */ - "\x59\xcc\x82\0" /* offset 675 */ - "\x79\xcc\x82\0" /* offset 679 */ - "\x59\xcc\x88\0" /* offset 683 */ - "\x5a\xcc\x81\0" /* offset 687 */ - "\x7a\xcc\x81\0" /* offset 691 */ - "\x5a\xcc\x87\0" /* offset 695 */ - "\x7a\xcc\x87\0" /* offset 699 */ - "\x5a\xcc\x8c\0" /* offset 703 */ - "\x7a\xcc\x8c\0" /* offset 707 */ - "\x73\0" /* offset 711 */ - "\x4f\xcc\x9b\0" /* offset 713 */ - "\x6f\xcc\x9b\0" /* offset 717 */ - "\x55\xcc\x9b\0" /* offset 721 */ - "\x75\xcc\x9b\0" /* offset 725 */ - "\x44\x5a\xcc\x8c\0" /* offset 729 */ - "\x44\x7a\xcc\x8c\0" /* offset 734 */ - "\x64\x7a\xcc\x8c\0" /* offset 739 */ - "\x4c\x4a\0" /* offset 744 */ - "\x4c\x6a\0" /* offset 747 */ - "\x6c\x6a\0" /* offset 750 */ - "\x4e\x4a\0" /* offset 753 */ - "\x4e\x6a\0" /* offset 756 */ - "\x6e\x6a\0" /* offset 759 */ - "\x41\xcc\x8c\0" /* offset 762 */ - "\x61\xcc\x8c\0" /* offset 766 */ - "\x49\xcc\x8c\0" /* offset 770 */ - "\x69\xcc\x8c\0" /* offset 774 */ - "\x4f\xcc\x8c\0" /* offset 778 */ - "\x6f\xcc\x8c\0" /* offset 782 */ - "\x55\xcc\x8c\0" /* offset 786 */ - "\x75\xcc\x8c\0" /* offset 790 */ - "\x55\xcc\x88\xcc\x84\0" /* offset 794 */ - "\x75\xcc\x88\xcc\x84\0" /* offset 800 */ - "\x55\xcc\x88\xcc\x81\0" /* offset 806 */ - "\x75\xcc\x88\xcc\x81\0" /* offset 812 */ - "\x55\xcc\x88\xcc\x8c\0" /* offset 818 */ - "\x75\xcc\x88\xcc\x8c\0" /* offset 824 */ - "\x55\xcc\x88\xcc\x80\0" /* offset 830 */ - "\x75\xcc\x88\xcc\x80\0" /* offset 836 */ - "\x41\xcc\x88\xcc\x84\0" /* offset 842 */ - "\x61\xcc\x88\xcc\x84\0" /* offset 848 */ - "\x41\xcc\x87\xcc\x84\0" /* offset 854 */ - "\x61\xcc\x87\xcc\x84\0" /* offset 860 */ - "\xc3\x86\xcc\x84\0" /* offset 866 */ - "\xc3\xa6\xcc\x84\0" /* offset 871 */ - "\x47\xcc\x8c\0" /* offset 876 */ - "\x67\xcc\x8c\0" /* offset 880 */ - "\x4b\xcc\x8c\0" /* offset 884 */ - "\x6b\xcc\x8c\0" /* offset 888 */ - "\x4f\xcc\xa8\0" /* offset 892 */ - "\x6f\xcc\xa8\0" /* offset 896 */ - "\x4f\xcc\xa8\xcc\x84\0" /* offset 900 */ - "\x6f\xcc\xa8\xcc\x84\0" /* offset 906 */ - "\xc6\xb7\xcc\x8c\0" /* offset 912 */ - "\xca\x92\xcc\x8c\0" /* offset 917 */ - "\x6a\xcc\x8c\0" /* offset 922 */ - "\x44\x5a\0" /* offset 926 */ - "\x44\x7a\0" /* offset 929 */ - "\x64\x7a\0" /* offset 932 */ - "\x47\xcc\x81\0" /* offset 935 */ - "\x67\xcc\x81\0" /* offset 939 */ - "\x4e\xcc\x80\0" /* offset 943 */ - "\x6e\xcc\x80\0" /* offset 947 */ - "\x41\xcc\x8a\xcc\x81\0" /* offset 951 */ - "\x61\xcc\x8a\xcc\x81\0" /* offset 957 */ - "\xc3\x86\xcc\x81\0" /* offset 963 */ - "\xc3\xa6\xcc\x81\0" /* offset 968 */ - "\xc3\x98\xcc\x81\0" /* offset 973 */ - "\xc3\xb8\xcc\x81\0" /* offset 978 */ - "\x41\xcc\x8f\0" /* offset 983 */ - "\x61\xcc\x8f\0" /* offset 987 */ - "\x41\xcc\x91\0" /* offset 991 */ - "\x61\xcc\x91\0" /* offset 995 */ - "\x45\xcc\x8f\0" /* offset 999 */ - "\x65\xcc\x8f\0" /* offset 1003 */ - "\x45\xcc\x91\0" /* offset 1007 */ - "\x65\xcc\x91\0" /* offset 1011 */ - "\x49\xcc\x8f\0" /* offset 1015 */ - "\x69\xcc\x8f\0" /* offset 1019 */ - "\x49\xcc\x91\0" /* offset 1023 */ - "\x69\xcc\x91\0" /* offset 1027 */ - "\x4f\xcc\x8f\0" /* offset 1031 */ - "\x6f\xcc\x8f\0" /* offset 1035 */ - "\x4f\xcc\x91\0" /* offset 1039 */ - "\x6f\xcc\x91\0" /* offset 1043 */ - "\x52\xcc\x8f\0" /* offset 1047 */ - "\x72\xcc\x8f\0" /* offset 1051 */ - "\x52\xcc\x91\0" /* offset 1055 */ - "\x72\xcc\x91\0" /* offset 1059 */ - "\x55\xcc\x8f\0" /* offset 1063 */ - "\x75\xcc\x8f\0" /* offset 1067 */ - "\x55\xcc\x91\0" /* offset 1071 */ - "\x75\xcc\x91\0" /* offset 1075 */ - "\x53\xcc\xa6\0" /* offset 1079 */ - "\x73\xcc\xa6\0" /* offset 1083 */ - "\x54\xcc\xa6\0" /* offset 1087 */ - "\x74\xcc\xa6\0" /* offset 1091 */ - "\x48\xcc\x8c\0" /* offset 1095 */ - "\x68\xcc\x8c\0" /* offset 1099 */ - "\x41\xcc\x87\0" /* offset 1103 */ - "\x61\xcc\x87\0" /* offset 1107 */ - "\x45\xcc\xa7\0" /* offset 1111 */ - "\x65\xcc\xa7\0" /* offset 1115 */ - "\x4f\xcc\x88\xcc\x84\0" /* offset 1119 */ - "\x6f\xcc\x88\xcc\x84\0" /* offset 1125 */ - "\x4f\xcc\x83\xcc\x84\0" /* offset 1131 */ - "\x6f\xcc\x83\xcc\x84\0" /* offset 1137 */ - "\x4f\xcc\x87\0" /* offset 1143 */ - "\x6f\xcc\x87\0" /* offset 1147 */ - "\x4f\xcc\x87\xcc\x84\0" /* offset 1151 */ - "\x6f\xcc\x87\xcc\x84\0" /* offset 1157 */ - "\x59\xcc\x84\0" /* offset 1163 */ - "\x79\xcc\x84\0" /* offset 1167 */ - "\x68\0" /* offset 1171 */ - "\xc9\xa6\0" /* offset 1173 */ - "\x6a\0" /* offset 1176 */ - "\x72\0" /* offset 1178 */ - "\xc9\xb9\0" /* offset 1180 */ - "\xc9\xbb\0" /* offset 1183 */ - "\xca\x81\0" /* offset 1186 */ - "\x77\0" /* offset 1189 */ - "\x79\0" /* offset 1191 */ - "\x20\xcc\x86\0" /* offset 1193 */ - "\x20\xcc\x87\0" /* offset 1197 */ - "\x20\xcc\x8a\0" /* offset 1201 */ - "\x20\xcc\xa8\0" /* offset 1205 */ - "\x20\xcc\x83\0" /* offset 1209 */ - "\x20\xcc\x8b\0" /* offset 1213 */ - "\xc9\xa3\0" /* offset 1217 */ - "\x6c\0" /* offset 1220 */ - "\x78\0" /* offset 1222 */ - "\xca\x95\0" /* offset 1224 */ - "\xcc\x80\0" /* offset 1227 */ - "\xcc\x81\0" /* offset 1230 */ - "\xcc\x93\0" /* offset 1233 */ - "\xcc\x88\xcc\x81\0" /* offset 1236 */ - "\xca\xb9\0" /* offset 1241 */ - "\x20\xcd\x85\0" /* offset 1244 */ - "\x3b\0" /* offset 1248 */ - "\xc2\xa8\xcc\x81\0" /* offset 1250 */ - "\x20\xcc\x88\xcc\x81\0" /* offset 1255 */ - "\xce\x91\xcc\x81\0" /* offset 1261 */ - "\xc2\xb7\0" /* offset 1266 */ - "\xce\x95\xcc\x81\0" /* offset 1269 */ - "\xce\x97\xcc\x81\0" /* offset 1274 */ - "\xce\x99\xcc\x81\0" /* offset 1279 */ - "\xce\x9f\xcc\x81\0" /* offset 1284 */ - "\xce\xa5\xcc\x81\0" /* offset 1289 */ - "\xce\xa9\xcc\x81\0" /* offset 1294 */ - "\xce\xb9\xcc\x88\xcc\x81\0" /* offset 1299 */ - "\xce\x99\xcc\x88\0" /* offset 1306 */ - "\xce\xa5\xcc\x88\0" /* offset 1311 */ - "\xce\xb1\xcc\x81\0" /* offset 1316 */ - "\xce\xb5\xcc\x81\0" /* offset 1321 */ - "\xce\xb7\xcc\x81\0" /* offset 1326 */ - "\xce\xb9\xcc\x81\0" /* offset 1331 */ - "\xcf\x85\xcc\x88\xcc\x81\0" /* offset 1336 */ - "\xce\xb9\xcc\x88\0" /* offset 1343 */ - "\xcf\x85\xcc\x88\0" /* offset 1348 */ - "\xce\xbf\xcc\x81\0" /* offset 1353 */ - "\xcf\x85\xcc\x81\0" /* offset 1358 */ - "\xcf\x89\xcc\x81\0" /* offset 1363 */ - "\xce\xb2\0" /* offset 1368 */ - "\xce\xb8\0" /* offset 1371 */ - "\xce\xa5\0" /* offset 1374 */ - "\xcf\x92\xcc\x81\0" /* offset 1377 */ - "\xcf\x92\xcc\x88\0" /* offset 1382 */ - "\xcf\x86\0" /* offset 1387 */ - "\xcf\x80\0" /* offset 1390 */ - "\xce\xba\0" /* offset 1393 */ - "\xcf\x81\0" /* offset 1396 */ - "\xcf\x82\0" /* offset 1399 */ - "\xce\x98\0" /* offset 1402 */ - "\xce\xb5\0" /* offset 1405 */ - "\xd0\x95\xcc\x80\0" /* offset 1408 */ - "\xd0\x95\xcc\x88\0" /* offset 1413 */ - "\xd0\x93\xcc\x81\0" /* offset 1418 */ - "\xd0\x86\xcc\x88\0" /* offset 1423 */ - "\xd0\x9a\xcc\x81\0" /* offset 1428 */ - "\xd0\x98\xcc\x80\0" /* offset 1433 */ - "\xd0\xa3\xcc\x86\0" /* offset 1438 */ - "\xd0\x98\xcc\x86\0" /* offset 1443 */ - "\xd0\xb8\xcc\x86\0" /* offset 1448 */ - "\xd0\xb5\xcc\x80\0" /* offset 1453 */ - "\xd0\xb5\xcc\x88\0" /* offset 1458 */ - "\xd0\xb3\xcc\x81\0" /* offset 1463 */ - "\xd1\x96\xcc\x88\0" /* offset 1468 */ - "\xd0\xba\xcc\x81\0" /* offset 1473 */ - "\xd0\xb8\xcc\x80\0" /* offset 1478 */ - "\xd1\x83\xcc\x86\0" /* offset 1483 */ - "\xd1\xb4\xcc\x8f\0" /* offset 1488 */ - "\xd1\xb5\xcc\x8f\0" /* offset 1493 */ - "\xd0\x96\xcc\x86\0" /* offset 1498 */ - "\xd0\xb6\xcc\x86\0" /* offset 1503 */ - "\xd0\x90\xcc\x86\0" /* offset 1508 */ - "\xd0\xb0\xcc\x86\0" /* offset 1513 */ - "\xd0\x90\xcc\x88\0" /* offset 1518 */ - "\xd0\xb0\xcc\x88\0" /* offset 1523 */ - "\xd0\x95\xcc\x86\0" /* offset 1528 */ - "\xd0\xb5\xcc\x86\0" /* offset 1533 */ - "\xd3\x98\xcc\x88\0" /* offset 1538 */ - "\xd3\x99\xcc\x88\0" /* offset 1543 */ - "\xd0\x96\xcc\x88\0" /* offset 1548 */ - "\xd0\xb6\xcc\x88\0" /* offset 1553 */ - "\xd0\x97\xcc\x88\0" /* offset 1558 */ - "\xd0\xb7\xcc\x88\0" /* offset 1563 */ - "\xd0\x98\xcc\x84\0" /* offset 1568 */ - "\xd0\xb8\xcc\x84\0" /* offset 1573 */ - "\xd0\x98\xcc\x88\0" /* offset 1578 */ - "\xd0\xb8\xcc\x88\0" /* offset 1583 */ - "\xd0\x9e\xcc\x88\0" /* offset 1588 */ - "\xd0\xbe\xcc\x88\0" /* offset 1593 */ - "\xd3\xa8\xcc\x88\0" /* offset 1598 */ - "\xd3\xa9\xcc\x88\0" /* offset 1603 */ - "\xd0\xad\xcc\x88\0" /* offset 1608 */ - "\xd1\x8d\xcc\x88\0" /* offset 1613 */ - "\xd0\xa3\xcc\x84\0" /* offset 1618 */ - "\xd1\x83\xcc\x84\0" /* offset 1623 */ - "\xd0\xa3\xcc\x88\0" /* offset 1628 */ - "\xd1\x83\xcc\x88\0" /* offset 1633 */ - "\xd0\xa3\xcc\x8b\0" /* offset 1638 */ - "\xd1\x83\xcc\x8b\0" /* offset 1643 */ - "\xd0\xa7\xcc\x88\0" /* offset 1648 */ - "\xd1\x87\xcc\x88\0" /* offset 1653 */ - "\xd0\xab\xcc\x88\0" /* offset 1658 */ - "\xd1\x8b\xcc\x88\0" /* offset 1663 */ - "\xd5\xa5\xd6\x82\0" /* offset 1668 */ - "\xd8\xa7\xd9\x93\0" /* offset 1673 */ - "\xd8\xa7\xd9\x94\0" /* offset 1678 */ - "\xd9\x88\xd9\x94\0" /* offset 1683 */ - "\xd8\xa7\xd9\x95\0" /* offset 1688 */ - "\xd9\x8a\xd9\x94\0" /* offset 1693 */ - "\xd8\xa7\xd9\xb4\0" /* offset 1698 */ - "\xd9\x88\xd9\xb4\0" /* offset 1703 */ - "\xdb\x87\xd9\xb4\0" /* offset 1708 */ - "\xd9\x8a\xd9\xb4\0" /* offset 1713 */ - "\xdb\x95\xd9\x94\0" /* offset 1718 */ - "\xdb\x81\xd9\x94\0" /* offset 1723 */ - "\xdb\x92\xd9\x94\0" /* offset 1728 */ - "\xe0\xa4\xa8\xe0\xa4\xbc\0" /* offset 1733 */ - "\xe0\xa4\xb0\xe0\xa4\xbc\0" /* offset 1740 */ - "\xe0\xa4\xb3\xe0\xa4\xbc\0" /* offset 1747 */ - "\xe0\xa4\x95\xe0\xa4\xbc\0" /* offset 1754 */ - "\xe0\xa4\x96\xe0\xa4\xbc\0" /* offset 1761 */ - "\xe0\xa4\x97\xe0\xa4\xbc\0" /* offset 1768 */ - "\xe0\xa4\x9c\xe0\xa4\xbc\0" /* offset 1775 */ - "\xe0\xa4\xa1\xe0\xa4\xbc\0" /* offset 1782 */ - "\xe0\xa4\xa2\xe0\xa4\xbc\0" /* offset 1789 */ - "\xe0\xa4\xab\xe0\xa4\xbc\0" /* offset 1796 */ - "\xe0\xa4\xaf\xe0\xa4\xbc\0" /* offset 1803 */ - "\xe0\xa7\x87\xe0\xa6\xbe\0" /* offset 1810 */ - "\xe0\xa7\x87\xe0\xa7\x97\0" /* offset 1817 */ - "\xe0\xa6\xa1\xe0\xa6\xbc\0" /* offset 1824 */ - "\xe0\xa6\xa2\xe0\xa6\xbc\0" /* offset 1831 */ - "\xe0\xa6\xaf\xe0\xa6\xbc\0" /* offset 1838 */ - "\xe0\xa8\xb2\xe0\xa8\xbc\0" /* offset 1845 */ - "\xe0\xa8\xb8\xe0\xa8\xbc\0" /* offset 1852 */ - "\xe0\xa8\x96\xe0\xa8\xbc\0" /* offset 1859 */ - "\xe0\xa8\x97\xe0\xa8\xbc\0" /* offset 1866 */ - "\xe0\xa8\x9c\xe0\xa8\xbc\0" /* offset 1873 */ - "\xe0\xa8\xab\xe0\xa8\xbc\0" /* offset 1880 */ - "\xe0\xad\x87\xe0\xad\x96\0" /* offset 1887 */ - "\xe0\xad\x87\xe0\xac\xbe\0" /* offset 1894 */ - "\xe0\xad\x87\xe0\xad\x97\0" /* offset 1901 */ - "\xe0\xac\xa1\xe0\xac\xbc\0" /* offset 1908 */ - "\xe0\xac\xa2\xe0\xac\xbc\0" /* offset 1915 */ - "\xe0\xae\x92\xe0\xaf\x97\0" /* offset 1922 */ - "\xe0\xaf\x86\xe0\xae\xbe\0" /* offset 1929 */ - "\xe0\xaf\x87\xe0\xae\xbe\0" /* offset 1936 */ - "\xe0\xaf\x86\xe0\xaf\x97\0" /* offset 1943 */ - "\xe0\xb1\x86\xe0\xb1\x96\0" /* offset 1950 */ - "\xe0\xb2\xbf\xe0\xb3\x95\0" /* offset 1957 */ - "\xe0\xb3\x86\xe0\xb3\x95\0" /* offset 1964 */ - "\xe0\xb3\x86\xe0\xb3\x96\0" /* offset 1971 */ - "\xe0\xb3\x86\xe0\xb3\x82\0" /* offset 1978 */ - "\xe0\xb3\x86\xe0\xb3\x82\xe0\xb3\x95\0" /* offset 1985 */ - "\xe0\xb5\x86\xe0\xb4\xbe\0" /* offset 1995 */ - "\xe0\xb5\x87\xe0\xb4\xbe\0" /* offset 2002 */ - "\xe0\xb5\x86\xe0\xb5\x97\0" /* offset 2009 */ - "\xe0\xb7\x99\xe0\xb7\x8a\0" /* offset 2016 */ - "\xe0\xb7\x99\xe0\xb7\x8f\0" /* offset 2023 */ - "\xe0\xb7\x99\xe0\xb7\x8f\xe0\xb7\x8a\0" /* offset 2030 */ - "\xe0\xb7\x99\xe0\xb7\x9f\0" /* offset 2040 */ - "\xe0\xb9\x8d\xe0\xb8\xb2\0" /* offset 2047 */ - "\xe0\xbb\x8d\xe0\xba\xb2\0" /* offset 2054 */ - "\xe0\xba\xab\xe0\xba\x99\0" /* offset 2061 */ - "\xe0\xba\xab\xe0\xba\xa1\0" /* offset 2068 */ - "\xe0\xbc\x8b\0" /* offset 2075 */ - "\xe0\xbd\x82\xe0\xbe\xb7\0" /* offset 2079 */ - "\xe0\xbd\x8c\xe0\xbe\xb7\0" /* offset 2086 */ - "\xe0\xbd\x91\xe0\xbe\xb7\0" /* offset 2093 */ - "\xe0\xbd\x96\xe0\xbe\xb7\0" /* offset 2100 */ - "\xe0\xbd\x9b\xe0\xbe\xb7\0" /* offset 2107 */ - "\xe0\xbd\x80\xe0\xbe\xb5\0" /* offset 2114 */ - "\xe0\xbd\xb1\xe0\xbd\xb2\0" /* offset 2121 */ - "\xe0\xbd\xb1\xe0\xbd\xb4\0" /* offset 2128 */ - "\xe0\xbe\xb2\xe0\xbe\x80\0" /* offset 2135 */ - "\xe0\xbe\xb2\xe0\xbd\xb1\xe0\xbe\x80\0" /* offset 2142 */ - "\xe0\xbe\xb3\xe0\xbe\x80\0" /* offset 2152 */ - "\xe0\xbe\xb3\xe0\xbd\xb1\xe0\xbe\x80\0" /* offset 2159 */ - "\xe0\xbd\xb1\xe0\xbe\x80\0" /* offset 2169 */ - "\xe0\xbe\x92\xe0\xbe\xb7\0" /* offset 2176 */ - "\xe0\xbe\x9c\xe0\xbe\xb7\0" /* offset 2183 */ - "\xe0\xbe\xa1\xe0\xbe\xb7\0" /* offset 2190 */ - "\xe0\xbe\xa6\xe0\xbe\xb7\0" /* offset 2197 */ - "\xe0\xbe\xab\xe0\xbe\xb7\0" /* offset 2204 */ - "\xe0\xbe\x90\xe0\xbe\xb5\0" /* offset 2211 */ - "\xe1\x80\xa5\xe1\x80\xae\0" /* offset 2218 */ - "\x41\xcc\xa5\0" /* offset 2225 */ - "\x61\xcc\xa5\0" /* offset 2229 */ - "\x42\xcc\x87\0" /* offset 2233 */ - "\x62\xcc\x87\0" /* offset 2237 */ - "\x42\xcc\xa3\0" /* offset 2241 */ - "\x62\xcc\xa3\0" /* offset 2245 */ - "\x42\xcc\xb1\0" /* offset 2249 */ - "\x62\xcc\xb1\0" /* offset 2253 */ - "\x43\xcc\xa7\xcc\x81\0" /* offset 2257 */ - "\x63\xcc\xa7\xcc\x81\0" /* offset 2263 */ - "\x44\xcc\x87\0" /* offset 2269 */ - "\x64\xcc\x87\0" /* offset 2273 */ - "\x44\xcc\xa3\0" /* offset 2277 */ - "\x64\xcc\xa3\0" /* offset 2281 */ - "\x44\xcc\xb1\0" /* offset 2285 */ - "\x64\xcc\xb1\0" /* offset 2289 */ - "\x44\xcc\xa7\0" /* offset 2293 */ - "\x64\xcc\xa7\0" /* offset 2297 */ - "\x44\xcc\xad\0" /* offset 2301 */ - "\x64\xcc\xad\0" /* offset 2305 */ - "\x45\xcc\x84\xcc\x80\0" /* offset 2309 */ - "\x65\xcc\x84\xcc\x80\0" /* offset 2315 */ - "\x45\xcc\x84\xcc\x81\0" /* offset 2321 */ - "\x65\xcc\x84\xcc\x81\0" /* offset 2327 */ - "\x45\xcc\xad\0" /* offset 2333 */ - "\x65\xcc\xad\0" /* offset 2337 */ - "\x45\xcc\xb0\0" /* offset 2341 */ - "\x65\xcc\xb0\0" /* offset 2345 */ - "\x45\xcc\xa7\xcc\x86\0" /* offset 2349 */ - "\x65\xcc\xa7\xcc\x86\0" /* offset 2355 */ - "\x46\xcc\x87\0" /* offset 2361 */ - "\x66\xcc\x87\0" /* offset 2365 */ - "\x47\xcc\x84\0" /* offset 2369 */ - "\x67\xcc\x84\0" /* offset 2373 */ - "\x48\xcc\x87\0" /* offset 2377 */ - "\x68\xcc\x87\0" /* offset 2381 */ - "\x48\xcc\xa3\0" /* offset 2385 */ - "\x68\xcc\xa3\0" /* offset 2389 */ - "\x48\xcc\x88\0" /* offset 2393 */ - "\x68\xcc\x88\0" /* offset 2397 */ - "\x48\xcc\xa7\0" /* offset 2401 */ - "\x68\xcc\xa7\0" /* offset 2405 */ - "\x48\xcc\xae\0" /* offset 2409 */ - "\x68\xcc\xae\0" /* offset 2413 */ - "\x49\xcc\xb0\0" /* offset 2417 */ - "\x69\xcc\xb0\0" /* offset 2421 */ - "\x49\xcc\x88\xcc\x81\0" /* offset 2425 */ - "\x69\xcc\x88\xcc\x81\0" /* offset 2431 */ - "\x4b\xcc\x81\0" /* offset 2437 */ - "\x6b\xcc\x81\0" /* offset 2441 */ - "\x4b\xcc\xa3\0" /* offset 2445 */ - "\x6b\xcc\xa3\0" /* offset 2449 */ - "\x4b\xcc\xb1\0" /* offset 2453 */ - "\x6b\xcc\xb1\0" /* offset 2457 */ - "\x4c\xcc\xa3\0" /* offset 2461 */ - "\x6c\xcc\xa3\0" /* offset 2465 */ - "\x4c\xcc\xa3\xcc\x84\0" /* offset 2469 */ - "\x6c\xcc\xa3\xcc\x84\0" /* offset 2475 */ - "\x4c\xcc\xb1\0" /* offset 2481 */ - "\x6c\xcc\xb1\0" /* offset 2485 */ - "\x4c\xcc\xad\0" /* offset 2489 */ - "\x6c\xcc\xad\0" /* offset 2493 */ - "\x4d\xcc\x81\0" /* offset 2497 */ - "\x6d\xcc\x81\0" /* offset 2501 */ - "\x4d\xcc\x87\0" /* offset 2505 */ - "\x6d\xcc\x87\0" /* offset 2509 */ - "\x4d\xcc\xa3\0" /* offset 2513 */ - "\x6d\xcc\xa3\0" /* offset 2517 */ - "\x4e\xcc\x87\0" /* offset 2521 */ - "\x6e\xcc\x87\0" /* offset 2525 */ - "\x4e\xcc\xa3\0" /* offset 2529 */ - "\x6e\xcc\xa3\0" /* offset 2533 */ - "\x4e\xcc\xb1\0" /* offset 2537 */ - "\x6e\xcc\xb1\0" /* offset 2541 */ - "\x4e\xcc\xad\0" /* offset 2545 */ - "\x6e\xcc\xad\0" /* offset 2549 */ - "\x4f\xcc\x83\xcc\x81\0" /* offset 2553 */ - "\x6f\xcc\x83\xcc\x81\0" /* offset 2559 */ - "\x4f\xcc\x83\xcc\x88\0" /* offset 2565 */ - "\x6f\xcc\x83\xcc\x88\0" /* offset 2571 */ - "\x4f\xcc\x84\xcc\x80\0" /* offset 2577 */ - "\x6f\xcc\x84\xcc\x80\0" /* offset 2583 */ - "\x4f\xcc\x84\xcc\x81\0" /* offset 2589 */ - "\x6f\xcc\x84\xcc\x81\0" /* offset 2595 */ - "\x50\xcc\x81\0" /* offset 2601 */ - "\x70\xcc\x81\0" /* offset 2605 */ - "\x50\xcc\x87\0" /* offset 2609 */ - "\x70\xcc\x87\0" /* offset 2613 */ - "\x52\xcc\x87\0" /* offset 2617 */ - "\x72\xcc\x87\0" /* offset 2621 */ - "\x52\xcc\xa3\0" /* offset 2625 */ - "\x72\xcc\xa3\0" /* offset 2629 */ - "\x52\xcc\xa3\xcc\x84\0" /* offset 2633 */ - "\x72\xcc\xa3\xcc\x84\0" /* offset 2639 */ - "\x52\xcc\xb1\0" /* offset 2645 */ - "\x72\xcc\xb1\0" /* offset 2649 */ - "\x53\xcc\x87\0" /* offset 2653 */ - "\x73\xcc\x87\0" /* offset 2657 */ - "\x53\xcc\xa3\0" /* offset 2661 */ - "\x73\xcc\xa3\0" /* offset 2665 */ - "\x53\xcc\x81\xcc\x87\0" /* offset 2669 */ - "\x73\xcc\x81\xcc\x87\0" /* offset 2675 */ - "\x53\xcc\x8c\xcc\x87\0" /* offset 2681 */ - "\x73\xcc\x8c\xcc\x87\0" /* offset 2687 */ - "\x53\xcc\xa3\xcc\x87\0" /* offset 2693 */ - "\x73\xcc\xa3\xcc\x87\0" /* offset 2699 */ - "\x54\xcc\x87\0" /* offset 2705 */ - "\x74\xcc\x87\0" /* offset 2709 */ - "\x54\xcc\xa3\0" /* offset 2713 */ - "\x74\xcc\xa3\0" /* offset 2717 */ - "\x54\xcc\xb1\0" /* offset 2721 */ - "\x74\xcc\xb1\0" /* offset 2725 */ - "\x54\xcc\xad\0" /* offset 2729 */ - "\x74\xcc\xad\0" /* offset 2733 */ - "\x55\xcc\xa4\0" /* offset 2737 */ - "\x75\xcc\xa4\0" /* offset 2741 */ - "\x55\xcc\xb0\0" /* offset 2745 */ - "\x75\xcc\xb0\0" /* offset 2749 */ - "\x55\xcc\xad\0" /* offset 2753 */ - "\x75\xcc\xad\0" /* offset 2757 */ - "\x55\xcc\x83\xcc\x81\0" /* offset 2761 */ - "\x75\xcc\x83\xcc\x81\0" /* offset 2767 */ - "\x55\xcc\x84\xcc\x88\0" /* offset 2773 */ - "\x75\xcc\x84\xcc\x88\0" /* offset 2779 */ - "\x56\xcc\x83\0" /* offset 2785 */ - "\x76\xcc\x83\0" /* offset 2789 */ - "\x56\xcc\xa3\0" /* offset 2793 */ - "\x76\xcc\xa3\0" /* offset 2797 */ - "\x57\xcc\x80\0" /* offset 2801 */ - "\x77\xcc\x80\0" /* offset 2805 */ - "\x57\xcc\x81\0" /* offset 2809 */ - "\x77\xcc\x81\0" /* offset 2813 */ - "\x57\xcc\x88\0" /* offset 2817 */ - "\x77\xcc\x88\0" /* offset 2821 */ - "\x57\xcc\x87\0" /* offset 2825 */ - "\x77\xcc\x87\0" /* offset 2829 */ - "\x57\xcc\xa3\0" /* offset 2833 */ - "\x77\xcc\xa3\0" /* offset 2837 */ - "\x58\xcc\x87\0" /* offset 2841 */ - "\x78\xcc\x87\0" /* offset 2845 */ - "\x58\xcc\x88\0" /* offset 2849 */ - "\x78\xcc\x88\0" /* offset 2853 */ - "\x59\xcc\x87\0" /* offset 2857 */ - "\x79\xcc\x87\0" /* offset 2861 */ - "\x5a\xcc\x82\0" /* offset 2865 */ - "\x7a\xcc\x82\0" /* offset 2869 */ - "\x5a\xcc\xa3\0" /* offset 2873 */ - "\x7a\xcc\xa3\0" /* offset 2877 */ - "\x5a\xcc\xb1\0" /* offset 2881 */ - "\x7a\xcc\xb1\0" /* offset 2885 */ - "\x68\xcc\xb1\0" /* offset 2889 */ - "\x74\xcc\x88\0" /* offset 2893 */ - "\x77\xcc\x8a\0" /* offset 2897 */ - "\x79\xcc\x8a\0" /* offset 2901 */ - "\x61\xca\xbe\0" /* offset 2905 */ - "\xc5\xbf\xcc\x87\0" /* offset 2909 */ - "\x41\xcc\xa3\0" /* offset 2914 */ - "\x61\xcc\xa3\0" /* offset 2918 */ - "\x41\xcc\x89\0" /* offset 2922 */ - "\x61\xcc\x89\0" /* offset 2926 */ - "\x41\xcc\x82\xcc\x81\0" /* offset 2930 */ - "\x61\xcc\x82\xcc\x81\0" /* offset 2936 */ - "\x41\xcc\x82\xcc\x80\0" /* offset 2942 */ - "\x61\xcc\x82\xcc\x80\0" /* offset 2948 */ - "\x41\xcc\x82\xcc\x89\0" /* offset 2954 */ - "\x61\xcc\x82\xcc\x89\0" /* offset 2960 */ - "\x41\xcc\x82\xcc\x83\0" /* offset 2966 */ - "\x61\xcc\x82\xcc\x83\0" /* offset 2972 */ - "\x41\xcc\xa3\xcc\x82\0" /* offset 2978 */ - "\x61\xcc\xa3\xcc\x82\0" /* offset 2984 */ - "\x41\xcc\x86\xcc\x81\0" /* offset 2990 */ - "\x61\xcc\x86\xcc\x81\0" /* offset 2996 */ - "\x41\xcc\x86\xcc\x80\0" /* offset 3002 */ - "\x61\xcc\x86\xcc\x80\0" /* offset 3008 */ - "\x41\xcc\x86\xcc\x89\0" /* offset 3014 */ - "\x61\xcc\x86\xcc\x89\0" /* offset 3020 */ - "\x41\xcc\x86\xcc\x83\0" /* offset 3026 */ - "\x61\xcc\x86\xcc\x83\0" /* offset 3032 */ - "\x41\xcc\xa3\xcc\x86\0" /* offset 3038 */ - "\x61\xcc\xa3\xcc\x86\0" /* offset 3044 */ - "\x45\xcc\xa3\0" /* offset 3050 */ - "\x65\xcc\xa3\0" /* offset 3054 */ - "\x45\xcc\x89\0" /* offset 3058 */ - "\x65\xcc\x89\0" /* offset 3062 */ - "\x45\xcc\x83\0" /* offset 3066 */ - "\x65\xcc\x83\0" /* offset 3070 */ - "\x45\xcc\x82\xcc\x81\0" /* offset 3074 */ - "\x65\xcc\x82\xcc\x81\0" /* offset 3080 */ - "\x45\xcc\x82\xcc\x80\0" /* offset 3086 */ - "\x65\xcc\x82\xcc\x80\0" /* offset 3092 */ - "\x45\xcc\x82\xcc\x89\0" /* offset 3098 */ - "\x65\xcc\x82\xcc\x89\0" /* offset 3104 */ - "\x45\xcc\x82\xcc\x83\0" /* offset 3110 */ - "\x65\xcc\x82\xcc\x83\0" /* offset 3116 */ - "\x45\xcc\xa3\xcc\x82\0" /* offset 3122 */ - "\x65\xcc\xa3\xcc\x82\0" /* offset 3128 */ - "\x49\xcc\x89\0" /* offset 3134 */ - "\x69\xcc\x89\0" /* offset 3138 */ - "\x49\xcc\xa3\0" /* offset 3142 */ - "\x69\xcc\xa3\0" /* offset 3146 */ - "\x4f\xcc\xa3\0" /* offset 3150 */ - "\x6f\xcc\xa3\0" /* offset 3154 */ - "\x4f\xcc\x89\0" /* offset 3158 */ - "\x6f\xcc\x89\0" /* offset 3162 */ - "\x4f\xcc\x82\xcc\x81\0" /* offset 3166 */ - "\x6f\xcc\x82\xcc\x81\0" /* offset 3172 */ - "\x4f\xcc\x82\xcc\x80\0" /* offset 3178 */ - "\x6f\xcc\x82\xcc\x80\0" /* offset 3184 */ - "\x4f\xcc\x82\xcc\x89\0" /* offset 3190 */ - "\x6f\xcc\x82\xcc\x89\0" /* offset 3196 */ - "\x4f\xcc\x82\xcc\x83\0" /* offset 3202 */ - "\x6f\xcc\x82\xcc\x83\0" /* offset 3208 */ - "\x4f\xcc\xa3\xcc\x82\0" /* offset 3214 */ - "\x6f\xcc\xa3\xcc\x82\0" /* offset 3220 */ - "\x4f\xcc\x9b\xcc\x81\0" /* offset 3226 */ - "\x6f\xcc\x9b\xcc\x81\0" /* offset 3232 */ - "\x4f\xcc\x9b\xcc\x80\0" /* offset 3238 */ - "\x6f\xcc\x9b\xcc\x80\0" /* offset 3244 */ - "\x4f\xcc\x9b\xcc\x89\0" /* offset 3250 */ - "\x6f\xcc\x9b\xcc\x89\0" /* offset 3256 */ - "\x4f\xcc\x9b\xcc\x83\0" /* offset 3262 */ - "\x6f\xcc\x9b\xcc\x83\0" /* offset 3268 */ - "\x4f\xcc\x9b\xcc\xa3\0" /* offset 3274 */ - "\x6f\xcc\x9b\xcc\xa3\0" /* offset 3280 */ - "\x55\xcc\xa3\0" /* offset 3286 */ - "\x75\xcc\xa3\0" /* offset 3290 */ - "\x55\xcc\x89\0" /* offset 3294 */ - "\x75\xcc\x89\0" /* offset 3298 */ - "\x55\xcc\x9b\xcc\x81\0" /* offset 3302 */ - "\x75\xcc\x9b\xcc\x81\0" /* offset 3308 */ - "\x55\xcc\x9b\xcc\x80\0" /* offset 3314 */ - "\x75\xcc\x9b\xcc\x80\0" /* offset 3320 */ - "\x55\xcc\x9b\xcc\x89\0" /* offset 3326 */ - "\x75\xcc\x9b\xcc\x89\0" /* offset 3332 */ - "\x55\xcc\x9b\xcc\x83\0" /* offset 3338 */ - "\x75\xcc\x9b\xcc\x83\0" /* offset 3344 */ - "\x55\xcc\x9b\xcc\xa3\0" /* offset 3350 */ - "\x75\xcc\x9b\xcc\xa3\0" /* offset 3356 */ - "\x59\xcc\x80\0" /* offset 3362 */ - "\x79\xcc\x80\0" /* offset 3366 */ - "\x59\xcc\xa3\0" /* offset 3370 */ - "\x79\xcc\xa3\0" /* offset 3374 */ - "\x59\xcc\x89\0" /* offset 3378 */ - "\x79\xcc\x89\0" /* offset 3382 */ - "\x59\xcc\x83\0" /* offset 3386 */ - "\x79\xcc\x83\0" /* offset 3390 */ - "\xce\xb1\xcc\x93\0" /* offset 3394 */ - "\xce\xb1\xcc\x94\0" /* offset 3399 */ - "\xce\xb1\xcc\x93\xcc\x80\0" /* offset 3404 */ - "\xce\xb1\xcc\x94\xcc\x80\0" /* offset 3411 */ - "\xce\xb1\xcc\x93\xcc\x81\0" /* offset 3418 */ - "\xce\xb1\xcc\x94\xcc\x81\0" /* offset 3425 */ - "\xce\xb1\xcc\x93\xcd\x82\0" /* offset 3432 */ - "\xce\xb1\xcc\x94\xcd\x82\0" /* offset 3439 */ - "\xce\x91\xcc\x93\0" /* offset 3446 */ - "\xce\x91\xcc\x94\0" /* offset 3451 */ - "\xce\x91\xcc\x93\xcc\x80\0" /* offset 3456 */ - "\xce\x91\xcc\x94\xcc\x80\0" /* offset 3463 */ - "\xce\x91\xcc\x93\xcc\x81\0" /* offset 3470 */ - "\xce\x91\xcc\x94\xcc\x81\0" /* offset 3477 */ - "\xce\x91\xcc\x93\xcd\x82\0" /* offset 3484 */ - "\xce\x91\xcc\x94\xcd\x82\0" /* offset 3491 */ - "\xce\xb5\xcc\x93\0" /* offset 3498 */ - "\xce\xb5\xcc\x94\0" /* offset 3503 */ - "\xce\xb5\xcc\x93\xcc\x80\0" /* offset 3508 */ - "\xce\xb5\xcc\x94\xcc\x80\0" /* offset 3515 */ - "\xce\xb5\xcc\x93\xcc\x81\0" /* offset 3522 */ - "\xce\xb5\xcc\x94\xcc\x81\0" /* offset 3529 */ - "\xce\x95\xcc\x93\0" /* offset 3536 */ - "\xce\x95\xcc\x94\0" /* offset 3541 */ - "\xce\x95\xcc\x93\xcc\x80\0" /* offset 3546 */ - "\xce\x95\xcc\x94\xcc\x80\0" /* offset 3553 */ - "\xce\x95\xcc\x93\xcc\x81\0" /* offset 3560 */ - "\xce\x95\xcc\x94\xcc\x81\0" /* offset 3567 */ - "\xce\xb7\xcc\x93\0" /* offset 3574 */ - "\xce\xb7\xcc\x94\0" /* offset 3579 */ - "\xce\xb7\xcc\x93\xcc\x80\0" /* offset 3584 */ - "\xce\xb7\xcc\x94\xcc\x80\0" /* offset 3591 */ - "\xce\xb7\xcc\x93\xcc\x81\0" /* offset 3598 */ - "\xce\xb7\xcc\x94\xcc\x81\0" /* offset 3605 */ - "\xce\xb7\xcc\x93\xcd\x82\0" /* offset 3612 */ - "\xce\xb7\xcc\x94\xcd\x82\0" /* offset 3619 */ - "\xce\x97\xcc\x93\0" /* offset 3626 */ - "\xce\x97\xcc\x94\0" /* offset 3631 */ - "\xce\x97\xcc\x93\xcc\x80\0" /* offset 3636 */ - "\xce\x97\xcc\x94\xcc\x80\0" /* offset 3643 */ - "\xce\x97\xcc\x93\xcc\x81\0" /* offset 3650 */ - "\xce\x97\xcc\x94\xcc\x81\0" /* offset 3657 */ - "\xce\x97\xcc\x93\xcd\x82\0" /* offset 3664 */ - "\xce\x97\xcc\x94\xcd\x82\0" /* offset 3671 */ - "\xce\xb9\xcc\x93\0" /* offset 3678 */ - "\xce\xb9\xcc\x94\0" /* offset 3683 */ - "\xce\xb9\xcc\x93\xcc\x80\0" /* offset 3688 */ - "\xce\xb9\xcc\x94\xcc\x80\0" /* offset 3695 */ - "\xce\xb9\xcc\x93\xcc\x81\0" /* offset 3702 */ - "\xce\xb9\xcc\x94\xcc\x81\0" /* offset 3709 */ - "\xce\xb9\xcc\x93\xcd\x82\0" /* offset 3716 */ - "\xce\xb9\xcc\x94\xcd\x82\0" /* offset 3723 */ - "\xce\x99\xcc\x93\0" /* offset 3730 */ - "\xce\x99\xcc\x94\0" /* offset 3735 */ - "\xce\x99\xcc\x93\xcc\x80\0" /* offset 3740 */ - "\xce\x99\xcc\x94\xcc\x80\0" /* offset 3747 */ - "\xce\x99\xcc\x93\xcc\x81\0" /* offset 3754 */ - "\xce\x99\xcc\x94\xcc\x81\0" /* offset 3761 */ - "\xce\x99\xcc\x93\xcd\x82\0" /* offset 3768 */ - "\xce\x99\xcc\x94\xcd\x82\0" /* offset 3775 */ - "\xce\xbf\xcc\x93\0" /* offset 3782 */ - "\xce\xbf\xcc\x94\0" /* offset 3787 */ - "\xce\xbf\xcc\x93\xcc\x80\0" /* offset 3792 */ - "\xce\xbf\xcc\x94\xcc\x80\0" /* offset 3799 */ - "\xce\xbf\xcc\x93\xcc\x81\0" /* offset 3806 */ - "\xce\xbf\xcc\x94\xcc\x81\0" /* offset 3813 */ - "\xce\x9f\xcc\x93\0" /* offset 3820 */ - "\xce\x9f\xcc\x94\0" /* offset 3825 */ - "\xce\x9f\xcc\x93\xcc\x80\0" /* offset 3830 */ - "\xce\x9f\xcc\x94\xcc\x80\0" /* offset 3837 */ - "\xce\x9f\xcc\x93\xcc\x81\0" /* offset 3844 */ - "\xce\x9f\xcc\x94\xcc\x81\0" /* offset 3851 */ - "\xcf\x85\xcc\x93\0" /* offset 3858 */ - "\xcf\x85\xcc\x94\0" /* offset 3863 */ - "\xcf\x85\xcc\x93\xcc\x80\0" /* offset 3868 */ - "\xcf\x85\xcc\x94\xcc\x80\0" /* offset 3875 */ - "\xcf\x85\xcc\x93\xcc\x81\0" /* offset 3882 */ - "\xcf\x85\xcc\x94\xcc\x81\0" /* offset 3889 */ - "\xcf\x85\xcc\x93\xcd\x82\0" /* offset 3896 */ - "\xcf\x85\xcc\x94\xcd\x82\0" /* offset 3903 */ - "\xce\xa5\xcc\x94\0" /* offset 3910 */ - "\xce\xa5\xcc\x94\xcc\x80\0" /* offset 3915 */ - "\xce\xa5\xcc\x94\xcc\x81\0" /* offset 3922 */ - "\xce\xa5\xcc\x94\xcd\x82\0" /* offset 3929 */ - "\xcf\x89\xcc\x93\0" /* offset 3936 */ - "\xcf\x89\xcc\x94\0" /* offset 3941 */ - "\xcf\x89\xcc\x93\xcc\x80\0" /* offset 3946 */ - "\xcf\x89\xcc\x94\xcc\x80\0" /* offset 3953 */ - "\xcf\x89\xcc\x93\xcc\x81\0" /* offset 3960 */ - "\xcf\x89\xcc\x94\xcc\x81\0" /* offset 3967 */ - "\xcf\x89\xcc\x93\xcd\x82\0" /* offset 3974 */ - "\xcf\x89\xcc\x94\xcd\x82\0" /* offset 3981 */ - "\xce\xa9\xcc\x93\0" /* offset 3988 */ - "\xce\xa9\xcc\x94\0" /* offset 3993 */ - "\xce\xa9\xcc\x93\xcc\x80\0" /* offset 3998 */ - "\xce\xa9\xcc\x94\xcc\x80\0" /* offset 4005 */ - "\xce\xa9\xcc\x93\xcc\x81\0" /* offset 4012 */ - "\xce\xa9\xcc\x94\xcc\x81\0" /* offset 4019 */ - "\xce\xa9\xcc\x93\xcd\x82\0" /* offset 4026 */ - "\xce\xa9\xcc\x94\xcd\x82\0" /* offset 4033 */ - "\xce\xb1\xcc\x80\0" /* offset 4040 */ - "\xce\xb5\xcc\x80\0" /* offset 4045 */ - "\xce\xb7\xcc\x80\0" /* offset 4050 */ - "\xce\xb9\xcc\x80\0" /* offset 4055 */ - "\xce\xbf\xcc\x80\0" /* offset 4060 */ - "\xcf\x85\xcc\x80\0" /* offset 4065 */ - "\xcf\x89\xcc\x80\0" /* offset 4070 */ - "\xce\xb1\xcc\x93\xcd\x85\0" /* offset 4075 */ - "\xce\xb1\xcc\x94\xcd\x85\0" /* offset 4082 */ - "\xce\xb1\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4089 */ - "\xce\xb1\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4098 */ - "\xce\xb1\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4107 */ - "\xce\xb1\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4116 */ - "\xce\xb1\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4125 */ - "\xce\xb1\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4134 */ - "\xce\x91\xcc\x93\xcd\x85\0" /* offset 4143 */ - "\xce\x91\xcc\x94\xcd\x85\0" /* offset 4150 */ - "\xce\x91\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4157 */ - "\xce\x91\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4166 */ - "\xce\x91\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4175 */ - "\xce\x91\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4184 */ - "\xce\x91\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4193 */ - "\xce\x91\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4202 */ - "\xce\xb7\xcc\x93\xcd\x85\0" /* offset 4211 */ - "\xce\xb7\xcc\x94\xcd\x85\0" /* offset 4218 */ - "\xce\xb7\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4225 */ - "\xce\xb7\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4234 */ - "\xce\xb7\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4243 */ - "\xce\xb7\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4252 */ - "\xce\xb7\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4261 */ - "\xce\xb7\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4270 */ - "\xce\x97\xcc\x93\xcd\x85\0" /* offset 4279 */ - "\xce\x97\xcc\x94\xcd\x85\0" /* offset 4286 */ - "\xce\x97\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4293 */ - "\xce\x97\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4302 */ - "\xce\x97\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4311 */ - "\xce\x97\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4320 */ - "\xce\x97\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4329 */ - "\xce\x97\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4338 */ - "\xcf\x89\xcc\x93\xcd\x85\0" /* offset 4347 */ - "\xcf\x89\xcc\x94\xcd\x85\0" /* offset 4354 */ - "\xcf\x89\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4361 */ - "\xcf\x89\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4370 */ - "\xcf\x89\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4379 */ - "\xcf\x89\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4388 */ - "\xcf\x89\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4397 */ - "\xcf\x89\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4406 */ - "\xce\xa9\xcc\x93\xcd\x85\0" /* offset 4415 */ - "\xce\xa9\xcc\x94\xcd\x85\0" /* offset 4422 */ - "\xce\xa9\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4429 */ - "\xce\xa9\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4438 */ - "\xce\xa9\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4447 */ - "\xce\xa9\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4456 */ - "\xce\xa9\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4465 */ - "\xce\xa9\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4474 */ - "\xce\xb1\xcc\x86\0" /* offset 4483 */ - "\xce\xb1\xcc\x84\0" /* offset 4488 */ - "\xce\xb1\xcc\x80\xcd\x85\0" /* offset 4493 */ - "\xce\xb1\xcd\x85\0" /* offset 4500 */ - "\xce\xb1\xcc\x81\xcd\x85\0" /* offset 4505 */ - "\xce\xb1\xcd\x82\0" /* offset 4512 */ - "\xce\xb1\xcd\x82\xcd\x85\0" /* offset 4517 */ - "\xce\x91\xcc\x86\0" /* offset 4524 */ - "\xce\x91\xcc\x84\0" /* offset 4529 */ - "\xce\x91\xcc\x80\0" /* offset 4534 */ - "\xce\x91\xcd\x85\0" /* offset 4539 */ - "\x20\xcc\x93\0" /* offset 4544 */ - "\xce\xb9\0" /* offset 4548 */ - "\x20\xcd\x82\0" /* offset 4551 */ - "\xc2\xa8\xcd\x82\0" /* offset 4555 */ - "\x20\xcc\x88\xcd\x82\0" /* offset 4560 */ - "\xce\xb7\xcc\x80\xcd\x85\0" /* offset 4566 */ - "\xce\xb7\xcd\x85\0" /* offset 4573 */ - "\xce\xb7\xcc\x81\xcd\x85\0" /* offset 4578 */ - "\xce\xb7\xcd\x82\0" /* offset 4585 */ - "\xce\xb7\xcd\x82\xcd\x85\0" /* offset 4590 */ - "\xce\x95\xcc\x80\0" /* offset 4597 */ - "\xce\x97\xcc\x80\0" /* offset 4602 */ - "\xce\x97\xcd\x85\0" /* offset 4607 */ - "\xe1\xbe\xbf\xcc\x80\0" /* offset 4612 */ - "\x20\xcc\x93\xcc\x80\0" /* offset 4618 */ - "\xe1\xbe\xbf\xcc\x81\0" /* offset 4624 */ - "\x20\xcc\x93\xcc\x81\0" /* offset 4630 */ - "\xe1\xbe\xbf\xcd\x82\0" /* offset 4636 */ - "\x20\xcc\x93\xcd\x82\0" /* offset 4642 */ - "\xce\xb9\xcc\x86\0" /* offset 4648 */ - "\xce\xb9\xcc\x84\0" /* offset 4653 */ - "\xce\xb9\xcc\x88\xcc\x80\0" /* offset 4658 */ - "\xce\xb9\xcd\x82\0" /* offset 4665 */ - "\xce\xb9\xcc\x88\xcd\x82\0" /* offset 4670 */ - "\xce\x99\xcc\x86\0" /* offset 4677 */ - "\xce\x99\xcc\x84\0" /* offset 4682 */ - "\xce\x99\xcc\x80\0" /* offset 4687 */ - "\xe1\xbf\xbe\xcc\x80\0" /* offset 4692 */ - "\x20\xcc\x94\xcc\x80\0" /* offset 4698 */ - "\xe1\xbf\xbe\xcc\x81\0" /* offset 4704 */ - "\x20\xcc\x94\xcc\x81\0" /* offset 4710 */ - "\xe1\xbf\xbe\xcd\x82\0" /* offset 4716 */ - "\x20\xcc\x94\xcd\x82\0" /* offset 4722 */ - "\xcf\x85\xcc\x86\0" /* offset 4728 */ - "\xcf\x85\xcc\x84\0" /* offset 4733 */ - "\xcf\x85\xcc\x88\xcc\x80\0" /* offset 4738 */ - "\xcf\x81\xcc\x93\0" /* offset 4745 */ - "\xcf\x81\xcc\x94\0" /* offset 4750 */ - "\xcf\x85\xcd\x82\0" /* offset 4755 */ - "\xcf\x85\xcc\x88\xcd\x82\0" /* offset 4760 */ - "\xce\xa5\xcc\x86\0" /* offset 4767 */ - "\xce\xa5\xcc\x84\0" /* offset 4772 */ - "\xce\xa5\xcc\x80\0" /* offset 4777 */ - "\xce\xa1\xcc\x94\0" /* offset 4782 */ - "\xc2\xa8\xcc\x80\0" /* offset 4787 */ - "\x20\xcc\x88\xcc\x80\0" /* offset 4792 */ - "\x60\0" /* offset 4798 */ - "\xcf\x89\xcc\x80\xcd\x85\0" /* offset 4800 */ - "\xcf\x89\xcd\x85\0" /* offset 4807 */ - "\xcf\x89\xcc\x81\xcd\x85\0" /* offset 4812 */ - "\xcf\x89\xcd\x82\0" /* offset 4819 */ - "\xcf\x89\xcd\x82\xcd\x85\0" /* offset 4824 */ - "\xce\x9f\xcc\x80\0" /* offset 4831 */ - "\xce\xa9\xcc\x80\0" /* offset 4836 */ - "\xce\xa9\xcd\x85\0" /* offset 4841 */ - "\xc2\xb4\0" /* offset 4846 */ - "\x20\xcc\x94\0" /* offset 4849 */ - "\xe2\x80\x82\0" /* offset 4853 */ - "\xe2\x80\x83\0" /* offset 4857 */ - "\xe2\x80\x90\0" /* offset 4861 */ - "\x20\xcc\xb3\0" /* offset 4865 */ - "\x2e\0" /* offset 4869 */ - "\x2e\x2e\0" /* offset 4871 */ - "\x2e\x2e\x2e\0" /* offset 4874 */ - "\xe2\x80\xb2\xe2\x80\xb2\0" /* offset 4878 */ - "\xe2\x80\xb2\xe2\x80\xb2\xe2\x80\xb2\0" /* offset 4885 */ - "\xe2\x80\xb5\xe2\x80\xb5\0" /* offset 4895 */ - "\xe2\x80\xb5\xe2\x80\xb5\xe2\x80\xb5\0" /* offset 4902 */ - "\x21\x21\0" /* offset 4912 */ - "\x20\xcc\x85\0" /* offset 4915 */ - "\x3f\x3f\0" /* offset 4919 */ - "\x3f\x21\0" /* offset 4922 */ - "\x21\x3f\0" /* offset 4925 */ - "\xe2\x80\xb2\xe2\x80\xb2\xe2\x80\xb2\xe2\x80\xb2\0" /* offset 4928 */ - "\x30\0" /* offset 4941 */ - "\x69\0" /* offset 4943 */ - "\x34\0" /* offset 4945 */ - "\x35\0" /* offset 4947 */ - "\x36\0" /* offset 4949 */ - "\x37\0" /* offset 4951 */ - "\x38\0" /* offset 4953 */ - "\x39\0" /* offset 4955 */ - "\x2b\0" /* offset 4957 */ - "\xe2\x88\x92\0" /* offset 4959 */ - "\x3d\0" /* offset 4963 */ - "\x28\0" /* offset 4965 */ - "\x29\0" /* offset 4967 */ - "\x6e\0" /* offset 4969 */ - "\x52\x73\0" /* offset 4971 */ - "\x61\x2f\x63\0" /* offset 4974 */ - "\x61\x2f\x73\0" /* offset 4978 */ - "\x43\0" /* offset 4982 */ - "\xc2\xb0\x43\0" /* offset 4984 */ - "\x63\x2f\x6f\0" /* offset 4988 */ - "\x63\x2f\x75\0" /* offset 4992 */ - "\xc6\x90\0" /* offset 4996 */ - "\xc2\xb0\x46\0" /* offset 4999 */ - "\x67\0" /* offset 5003 */ - "\x48\0" /* offset 5005 */ - "\xc4\xa7\0" /* offset 5007 */ - "\x49\0" /* offset 5010 */ - "\x4c\0" /* offset 5012 */ - "\x4e\0" /* offset 5014 */ - "\x4e\x6f\0" /* offset 5016 */ - "\x50\0" /* offset 5019 */ - "\x51\0" /* offset 5021 */ - "\x52\0" /* offset 5023 */ - "\x53\x4d\0" /* offset 5025 */ - "\x54\x45\x4c\0" /* offset 5028 */ - "\x54\x4d\0" /* offset 5032 */ - "\x5a\0" /* offset 5035 */ - "\xce\xa9\0" /* offset 5037 */ - "\x4b\0" /* offset 5040 */ - "\x42\0" /* offset 5042 */ - "\x65\0" /* offset 5044 */ - "\x45\0" /* offset 5046 */ - "\x46\0" /* offset 5048 */ - "\x4d\0" /* offset 5050 */ - "\xd7\x90\0" /* offset 5052 */ - "\xd7\x91\0" /* offset 5055 */ - "\xd7\x92\0" /* offset 5058 */ - "\xd7\x93\0" /* offset 5061 */ - "\xce\xb3\0" /* offset 5064 */ - "\xce\x93\0" /* offset 5067 */ - "\xce\xa0\0" /* offset 5070 */ - "\xe2\x88\x91\0" /* offset 5073 */ - "\x44\0" /* offset 5077 */ - "\x64\0" /* offset 5079 */ - "\x31\xe2\x81\x84\x33\0" /* offset 5081 */ - "\x32\xe2\x81\x84\x33\0" /* offset 5087 */ - "\x31\xe2\x81\x84\x35\0" /* offset 5093 */ - "\x32\xe2\x81\x84\x35\0" /* offset 5099 */ - "\x33\xe2\x81\x84\x35\0" /* offset 5105 */ - "\x34\xe2\x81\x84\x35\0" /* offset 5111 */ - "\x31\xe2\x81\x84\x36\0" /* offset 5117 */ - "\x35\xe2\x81\x84\x36\0" /* offset 5123 */ - "\x31\xe2\x81\x84\x38\0" /* offset 5129 */ - "\x33\xe2\x81\x84\x38\0" /* offset 5135 */ - "\x35\xe2\x81\x84\x38\0" /* offset 5141 */ - "\x37\xe2\x81\x84\x38\0" /* offset 5147 */ - "\x31\xe2\x81\x84\0" /* offset 5153 */ - "\x49\x49\0" /* offset 5158 */ - "\x49\x49\x49\0" /* offset 5161 */ - "\x49\x56\0" /* offset 5165 */ - "\x56\0" /* offset 5168 */ - "\x56\x49\0" /* offset 5170 */ - "\x56\x49\x49\0" /* offset 5173 */ - "\x56\x49\x49\x49\0" /* offset 5177 */ - "\x49\x58\0" /* offset 5182 */ - "\x58\0" /* offset 5185 */ - "\x58\x49\0" /* offset 5187 */ - "\x58\x49\x49\0" /* offset 5190 */ - "\x69\x69\0" /* offset 5194 */ - "\x69\x69\x69\0" /* offset 5197 */ - "\x69\x76\0" /* offset 5201 */ - "\x76\0" /* offset 5204 */ - "\x76\x69\0" /* offset 5206 */ - "\x76\x69\x69\0" /* offset 5209 */ - "\x76\x69\x69\x69\0" /* offset 5213 */ - "\x69\x78\0" /* offset 5218 */ - "\x78\x69\0" /* offset 5221 */ - "\x78\x69\x69\0" /* offset 5224 */ - "\x63\0" /* offset 5228 */ - "\x6d\0" /* offset 5230 */ - "\xe2\x86\x90\xcc\xb8\0" /* offset 5232 */ - "\xe2\x86\x92\xcc\xb8\0" /* offset 5238 */ - "\xe2\x86\x94\xcc\xb8\0" /* offset 5244 */ - "\xe2\x87\x90\xcc\xb8\0" /* offset 5250 */ - "\xe2\x87\x94\xcc\xb8\0" /* offset 5256 */ - "\xe2\x87\x92\xcc\xb8\0" /* offset 5262 */ - "\xe2\x88\x83\xcc\xb8\0" /* offset 5268 */ - "\xe2\x88\x88\xcc\xb8\0" /* offset 5274 */ - "\xe2\x88\x8b\xcc\xb8\0" /* offset 5280 */ - "\xe2\x88\xa3\xcc\xb8\0" /* offset 5286 */ - "\xe2\x88\xa5\xcc\xb8\0" /* offset 5292 */ - "\xe2\x88\xab\xe2\x88\xab\0" /* offset 5298 */ - "\xe2\x88\xab\xe2\x88\xab\xe2\x88\xab\0" /* offset 5305 */ - "\xe2\x88\xae\xe2\x88\xae\0" /* offset 5315 */ - "\xe2\x88\xae\xe2\x88\xae\xe2\x88\xae\0" /* offset 5322 */ - "\xe2\x88\xbc\xcc\xb8\0" /* offset 5332 */ - "\xe2\x89\x83\xcc\xb8\0" /* offset 5338 */ - "\xe2\x89\x85\xcc\xb8\0" /* offset 5344 */ - "\xe2\x89\x88\xcc\xb8\0" /* offset 5350 */ - "\x3d\xcc\xb8\0" /* offset 5356 */ - "\xe2\x89\xa1\xcc\xb8\0" /* offset 5360 */ - "\xe2\x89\x8d\xcc\xb8\0" /* offset 5366 */ - "\x3c\xcc\xb8\0" /* offset 5372 */ - "\x3e\xcc\xb8\0" /* offset 5376 */ - "\xe2\x89\xa4\xcc\xb8\0" /* offset 5380 */ - "\xe2\x89\xa5\xcc\xb8\0" /* offset 5386 */ - "\xe2\x89\xb2\xcc\xb8\0" /* offset 5392 */ - "\xe2\x89\xb3\xcc\xb8\0" /* offset 5398 */ - "\xe2\x89\xb6\xcc\xb8\0" /* offset 5404 */ - "\xe2\x89\xb7\xcc\xb8\0" /* offset 5410 */ - "\xe2\x89\xba\xcc\xb8\0" /* offset 5416 */ - "\xe2\x89\xbb\xcc\xb8\0" /* offset 5422 */ - "\xe2\x8a\x82\xcc\xb8\0" /* offset 5428 */ - "\xe2\x8a\x83\xcc\xb8\0" /* offset 5434 */ - "\xe2\x8a\x86\xcc\xb8\0" /* offset 5440 */ - "\xe2\x8a\x87\xcc\xb8\0" /* offset 5446 */ - "\xe2\x8a\xa2\xcc\xb8\0" /* offset 5452 */ - "\xe2\x8a\xa8\xcc\xb8\0" /* offset 5458 */ - "\xe2\x8a\xa9\xcc\xb8\0" /* offset 5464 */ - "\xe2\x8a\xab\xcc\xb8\0" /* offset 5470 */ - "\xe2\x89\xbc\xcc\xb8\0" /* offset 5476 */ - "\xe2\x89\xbd\xcc\xb8\0" /* offset 5482 */ - "\xe2\x8a\x91\xcc\xb8\0" /* offset 5488 */ - "\xe2\x8a\x92\xcc\xb8\0" /* offset 5494 */ - "\xe2\x8a\xb2\xcc\xb8\0" /* offset 5500 */ - "\xe2\x8a\xb3\xcc\xb8\0" /* offset 5506 */ - "\xe2\x8a\xb4\xcc\xb8\0" /* offset 5512 */ - "\xe2\x8a\xb5\xcc\xb8\0" /* offset 5518 */ - "\xe3\x80\x88\0" /* offset 5524 */ - "\xe3\x80\x89\0" /* offset 5528 */ - "\x31\x30\0" /* offset 5532 */ - "\x31\x31\0" /* offset 5535 */ - "\x31\x32\0" /* offset 5538 */ - "\x31\x33\0" /* offset 5541 */ - "\x31\x34\0" /* offset 5544 */ - "\x31\x35\0" /* offset 5547 */ - "\x31\x36\0" /* offset 5550 */ - "\x31\x37\0" /* offset 5553 */ - "\x31\x38\0" /* offset 5556 */ - "\x31\x39\0" /* offset 5559 */ - "\x32\x30\0" /* offset 5562 */ - "\x28\x31\x29\0" /* offset 5565 */ - "\x28\x32\x29\0" /* offset 5569 */ - "\x28\x33\x29\0" /* offset 5573 */ - "\x28\x34\x29\0" /* offset 5577 */ - "\x28\x35\x29\0" /* offset 5581 */ - "\x28\x36\x29\0" /* offset 5585 */ - "\x28\x37\x29\0" /* offset 5589 */ - "\x28\x38\x29\0" /* offset 5593 */ - "\x28\x39\x29\0" /* offset 5597 */ - "\x28\x31\x30\x29\0" /* offset 5601 */ - "\x28\x31\x31\x29\0" /* offset 5606 */ - "\x28\x31\x32\x29\0" /* offset 5611 */ - "\x28\x31\x33\x29\0" /* offset 5616 */ - "\x28\x31\x34\x29\0" /* offset 5621 */ - "\x28\x31\x35\x29\0" /* offset 5626 */ - "\x28\x31\x36\x29\0" /* offset 5631 */ - "\x28\x31\x37\x29\0" /* offset 5636 */ - "\x28\x31\x38\x29\0" /* offset 5641 */ - "\x28\x31\x39\x29\0" /* offset 5646 */ - "\x28\x32\x30\x29\0" /* offset 5651 */ - "\x31\x2e\0" /* offset 5656 */ - "\x32\x2e\0" /* offset 5659 */ - "\x33\x2e\0" /* offset 5662 */ - "\x34\x2e\0" /* offset 5665 */ - "\x35\x2e\0" /* offset 5668 */ - "\x36\x2e\0" /* offset 5671 */ - "\x37\x2e\0" /* offset 5674 */ - "\x38\x2e\0" /* offset 5677 */ - "\x39\x2e\0" /* offset 5680 */ - "\x31\x30\x2e\0" /* offset 5683 */ - "\x31\x31\x2e\0" /* offset 5687 */ - "\x31\x32\x2e\0" /* offset 5691 */ - "\x31\x33\x2e\0" /* offset 5695 */ - "\x31\x34\x2e\0" /* offset 5699 */ - "\x31\x35\x2e\0" /* offset 5703 */ - "\x31\x36\x2e\0" /* offset 5707 */ - "\x31\x37\x2e\0" /* offset 5711 */ - "\x31\x38\x2e\0" /* offset 5715 */ - "\x31\x39\x2e\0" /* offset 5719 */ - "\x32\x30\x2e\0" /* offset 5723 */ - "\x28\x61\x29\0" /* offset 5727 */ - "\x28\x62\x29\0" /* offset 5731 */ - "\x28\x63\x29\0" /* offset 5735 */ - "\x28\x64\x29\0" /* offset 5739 */ - "\x28\x65\x29\0" /* offset 5743 */ - "\x28\x66\x29\0" /* offset 5747 */ - "\x28\x67\x29\0" /* offset 5751 */ - "\x28\x68\x29\0" /* offset 5755 */ - "\x28\x69\x29\0" /* offset 5759 */ - "\x28\x6a\x29\0" /* offset 5763 */ - "\x28\x6b\x29\0" /* offset 5767 */ - "\x28\x6c\x29\0" /* offset 5771 */ - "\x28\x6d\x29\0" /* offset 5775 */ - "\x28\x6e\x29\0" /* offset 5779 */ - "\x28\x6f\x29\0" /* offset 5783 */ - "\x28\x70\x29\0" /* offset 5787 */ - "\x28\x71\x29\0" /* offset 5791 */ - "\x28\x72\x29\0" /* offset 5795 */ - "\x28\x73\x29\0" /* offset 5799 */ - "\x28\x74\x29\0" /* offset 5803 */ - "\x28\x75\x29\0" /* offset 5807 */ - "\x28\x76\x29\0" /* offset 5811 */ - "\x28\x77\x29\0" /* offset 5815 */ - "\x28\x78\x29\0" /* offset 5819 */ - "\x28\x79\x29\0" /* offset 5823 */ - "\x28\x7a\x29\0" /* offset 5827 */ - "\x41\0" /* offset 5831 */ - "\x47\0" /* offset 5833 */ - "\x4a\0" /* offset 5835 */ - "\x4f\0" /* offset 5837 */ - "\x53\0" /* offset 5839 */ - "\x54\0" /* offset 5841 */ - "\x55\0" /* offset 5843 */ - "\x57\0" /* offset 5845 */ - "\x59\0" /* offset 5847 */ - "\x62\0" /* offset 5849 */ - "\x66\0" /* offset 5851 */ - "\x6b\0" /* offset 5853 */ - "\x70\0" /* offset 5855 */ - "\x71\0" /* offset 5857 */ - "\x74\0" /* offset 5859 */ - "\x75\0" /* offset 5861 */ - "\x7a\0" /* offset 5863 */ - "\xe2\x88\xab\xe2\x88\xab\xe2\x88\xab\xe2\x88\xab\0" /* offset 5865 */ - "\x3a\x3a\x3d\0" /* offset 5878 */ - "\x3d\x3d\0" /* offset 5882 */ - "\x3d\x3d\x3d\0" /* offset 5885 */ - "\xe2\xab\x9d\xcc\xb8\0" /* offset 5889 */ - "\xe6\xaf\x8d\0" /* offset 5895 */ - "\xe9\xbe\x9f\0" /* offset 5899 */ - "\xe4\xb8\x80\0" /* offset 5903 */ - "\xe4\xb8\xa8\0" /* offset 5907 */ - "\xe4\xb8\xb6\0" /* offset 5911 */ - "\xe4\xb8\xbf\0" /* offset 5915 */ - "\xe4\xb9\x99\0" /* offset 5919 */ - "\xe4\xba\x85\0" /* offset 5923 */ - "\xe4\xba\x8c\0" /* offset 5927 */ - "\xe4\xba\xa0\0" /* offset 5931 */ - "\xe4\xba\xba\0" /* offset 5935 */ - "\xe5\x84\xbf\0" /* offset 5939 */ - "\xe5\x85\xa5\0" /* offset 5943 */ - "\xe5\x85\xab\0" /* offset 5947 */ - "\xe5\x86\x82\0" /* offset 5951 */ - "\xe5\x86\x96\0" /* offset 5955 */ - "\xe5\x86\xab\0" /* offset 5959 */ - "\xe5\x87\xa0\0" /* offset 5963 */ - "\xe5\x87\xb5\0" /* offset 5967 */ - "\xe5\x88\x80\0" /* offset 5971 */ - "\xe5\x8a\x9b\0" /* offset 5975 */ - "\xe5\x8b\xb9\0" /* offset 5979 */ - "\xe5\x8c\x95\0" /* offset 5983 */ - "\xe5\x8c\x9a\0" /* offset 5987 */ - "\xe5\x8c\xb8\0" /* offset 5991 */ - "\xe5\x8d\x81\0" /* offset 5995 */ - "\xe5\x8d\x9c\0" /* offset 5999 */ - "\xe5\x8d\xa9\0" /* offset 6003 */ - "\xe5\x8e\x82\0" /* offset 6007 */ - "\xe5\x8e\xb6\0" /* offset 6011 */ - "\xe5\x8f\x88\0" /* offset 6015 */ - "\xe5\x8f\xa3\0" /* offset 6019 */ - "\xe5\x9b\x97\0" /* offset 6023 */ - "\xe5\x9c\x9f\0" /* offset 6027 */ - "\xe5\xa3\xab\0" /* offset 6031 */ - "\xe5\xa4\x82\0" /* offset 6035 */ - "\xe5\xa4\x8a\0" /* offset 6039 */ - "\xe5\xa4\x95\0" /* offset 6043 */ - "\xe5\xa4\xa7\0" /* offset 6047 */ - "\xe5\xa5\xb3\0" /* offset 6051 */ - "\xe5\xad\x90\0" /* offset 6055 */ - "\xe5\xae\x80\0" /* offset 6059 */ - "\xe5\xaf\xb8\0" /* offset 6063 */ - "\xe5\xb0\x8f\0" /* offset 6067 */ - "\xe5\xb0\xa2\0" /* offset 6071 */ - "\xe5\xb0\xb8\0" /* offset 6075 */ - "\xe5\xb1\xae\0" /* offset 6079 */ - "\xe5\xb1\xb1\0" /* offset 6083 */ - "\xe5\xb7\x9b\0" /* offset 6087 */ - "\xe5\xb7\xa5\0" /* offset 6091 */ - "\xe5\xb7\xb1\0" /* offset 6095 */ - "\xe5\xb7\xbe\0" /* offset 6099 */ - "\xe5\xb9\xb2\0" /* offset 6103 */ - "\xe5\xb9\xba\0" /* offset 6107 */ - "\xe5\xb9\xbf\0" /* offset 6111 */ - "\xe5\xbb\xb4\0" /* offset 6115 */ - "\xe5\xbb\xbe\0" /* offset 6119 */ - "\xe5\xbc\x8b\0" /* offset 6123 */ - "\xe5\xbc\x93\0" /* offset 6127 */ - "\xe5\xbd\x90\0" /* offset 6131 */ - "\xe5\xbd\xa1\0" /* offset 6135 */ - "\xe5\xbd\xb3\0" /* offset 6139 */ - "\xe5\xbf\x83\0" /* offset 6143 */ - "\xe6\x88\x88\0" /* offset 6147 */ - "\xe6\x88\xb6\0" /* offset 6151 */ - "\xe6\x89\x8b\0" /* offset 6155 */ - "\xe6\x94\xaf\0" /* offset 6159 */ - "\xe6\x94\xb4\0" /* offset 6163 */ - "\xe6\x96\x87\0" /* offset 6167 */ - "\xe6\x96\x97\0" /* offset 6171 */ - "\xe6\x96\xa4\0" /* offset 6175 */ - "\xe6\x96\xb9\0" /* offset 6179 */ - "\xe6\x97\xa0\0" /* offset 6183 */ - "\xe6\x97\xa5\0" /* offset 6187 */ - "\xe6\x9b\xb0\0" /* offset 6191 */ - "\xe6\x9c\x88\0" /* offset 6195 */ - "\xe6\x9c\xa8\0" /* offset 6199 */ - "\xe6\xac\xa0\0" /* offset 6203 */ - "\xe6\xad\xa2\0" /* offset 6207 */ - "\xe6\xad\xb9\0" /* offset 6211 */ - "\xe6\xae\xb3\0" /* offset 6215 */ - "\xe6\xaf\x8b\0" /* offset 6219 */ - "\xe6\xaf\x94\0" /* offset 6223 */ - "\xe6\xaf\x9b\0" /* offset 6227 */ - "\xe6\xb0\x8f\0" /* offset 6231 */ - "\xe6\xb0\x94\0" /* offset 6235 */ - "\xe6\xb0\xb4\0" /* offset 6239 */ - "\xe7\x81\xab\0" /* offset 6243 */ - "\xe7\x88\xaa\0" /* offset 6247 */ - "\xe7\x88\xb6\0" /* offset 6251 */ - "\xe7\x88\xbb\0" /* offset 6255 */ - "\xe7\x88\xbf\0" /* offset 6259 */ - "\xe7\x89\x87\0" /* offset 6263 */ - "\xe7\x89\x99\0" /* offset 6267 */ - "\xe7\x89\x9b\0" /* offset 6271 */ - "\xe7\x8a\xac\0" /* offset 6275 */ - "\xe7\x8e\x84\0" /* offset 6279 */ - "\xe7\x8e\x89\0" /* offset 6283 */ - "\xe7\x93\x9c\0" /* offset 6287 */ - "\xe7\x93\xa6\0" /* offset 6291 */ - "\xe7\x94\x98\0" /* offset 6295 */ - "\xe7\x94\x9f\0" /* offset 6299 */ - "\xe7\x94\xa8\0" /* offset 6303 */ - "\xe7\x94\xb0\0" /* offset 6307 */ - "\xe7\x96\x8b\0" /* offset 6311 */ - "\xe7\x96\x92\0" /* offset 6315 */ - "\xe7\x99\xb6\0" /* offset 6319 */ - "\xe7\x99\xbd\0" /* offset 6323 */ - "\xe7\x9a\xae\0" /* offset 6327 */ - "\xe7\x9a\xbf\0" /* offset 6331 */ - "\xe7\x9b\xae\0" /* offset 6335 */ - "\xe7\x9f\x9b\0" /* offset 6339 */ - "\xe7\x9f\xa2\0" /* offset 6343 */ - "\xe7\x9f\xb3\0" /* offset 6347 */ - "\xe7\xa4\xba\0" /* offset 6351 */ - "\xe7\xa6\xb8\0" /* offset 6355 */ - "\xe7\xa6\xbe\0" /* offset 6359 */ - "\xe7\xa9\xb4\0" /* offset 6363 */ - "\xe7\xab\x8b\0" /* offset 6367 */ - "\xe7\xab\xb9\0" /* offset 6371 */ - "\xe7\xb1\xb3\0" /* offset 6375 */ - "\xe7\xb3\xb8\0" /* offset 6379 */ - "\xe7\xbc\xb6\0" /* offset 6383 */ - "\xe7\xbd\x91\0" /* offset 6387 */ - "\xe7\xbe\x8a\0" /* offset 6391 */ - "\xe7\xbe\xbd\0" /* offset 6395 */ - "\xe8\x80\x81\0" /* offset 6399 */ - "\xe8\x80\x8c\0" /* offset 6403 */ - "\xe8\x80\x92\0" /* offset 6407 */ - "\xe8\x80\xb3\0" /* offset 6411 */ - "\xe8\x81\xbf\0" /* offset 6415 */ - "\xe8\x82\x89\0" /* offset 6419 */ - "\xe8\x87\xa3\0" /* offset 6423 */ - "\xe8\x87\xaa\0" /* offset 6427 */ - "\xe8\x87\xb3\0" /* offset 6431 */ - "\xe8\x87\xbc\0" /* offset 6435 */ - "\xe8\x88\x8c\0" /* offset 6439 */ - "\xe8\x88\x9b\0" /* offset 6443 */ - "\xe8\x88\x9f\0" /* offset 6447 */ - "\xe8\x89\xae\0" /* offset 6451 */ - "\xe8\x89\xb2\0" /* offset 6455 */ - "\xe8\x89\xb8\0" /* offset 6459 */ - "\xe8\x99\x8d\0" /* offset 6463 */ - "\xe8\x99\xab\0" /* offset 6467 */ - "\xe8\xa1\x80\0" /* offset 6471 */ - "\xe8\xa1\x8c\0" /* offset 6475 */ - "\xe8\xa1\xa3\0" /* offset 6479 */ - "\xe8\xa5\xbe\0" /* offset 6483 */ - "\xe8\xa6\x8b\0" /* offset 6487 */ - "\xe8\xa7\x92\0" /* offset 6491 */ - "\xe8\xa8\x80\0" /* offset 6495 */ - "\xe8\xb0\xb7\0" /* offset 6499 */ - "\xe8\xb1\x86\0" /* offset 6503 */ - "\xe8\xb1\x95\0" /* offset 6507 */ - "\xe8\xb1\xb8\0" /* offset 6511 */ - "\xe8\xb2\x9d\0" /* offset 6515 */ - "\xe8\xb5\xa4\0" /* offset 6519 */ - "\xe8\xb5\xb0\0" /* offset 6523 */ - "\xe8\xb6\xb3\0" /* offset 6527 */ - "\xe8\xba\xab\0" /* offset 6531 */ - "\xe8\xbb\x8a\0" /* offset 6535 */ - "\xe8\xbe\x9b\0" /* offset 6539 */ - "\xe8\xbe\xb0\0" /* offset 6543 */ - "\xe8\xbe\xb5\0" /* offset 6547 */ - "\xe9\x82\x91\0" /* offset 6551 */ - "\xe9\x85\x89\0" /* offset 6555 */ - "\xe9\x87\x86\0" /* offset 6559 */ - "\xe9\x87\x8c\0" /* offset 6563 */ - "\xe9\x87\x91\0" /* offset 6567 */ - "\xe9\x95\xb7\0" /* offset 6571 */ - "\xe9\x96\x80\0" /* offset 6575 */ - "\xe9\x98\x9c\0" /* offset 6579 */ - "\xe9\x9a\xb6\0" /* offset 6583 */ - "\xe9\x9a\xb9\0" /* offset 6587 */ - "\xe9\x9b\xa8\0" /* offset 6591 */ - "\xe9\x9d\x91\0" /* offset 6595 */ - "\xe9\x9d\x9e\0" /* offset 6599 */ - "\xe9\x9d\xa2\0" /* offset 6603 */ - "\xe9\x9d\xa9\0" /* offset 6607 */ - "\xe9\x9f\x8b\0" /* offset 6611 */ - "\xe9\x9f\xad\0" /* offset 6615 */ - "\xe9\x9f\xb3\0" /* offset 6619 */ - "\xe9\xa0\x81\0" /* offset 6623 */ - "\xe9\xa2\xa8\0" /* offset 6627 */ - "\xe9\xa3\x9b\0" /* offset 6631 */ - "\xe9\xa3\x9f\0" /* offset 6635 */ - "\xe9\xa6\x96\0" /* offset 6639 */ - "\xe9\xa6\x99\0" /* offset 6643 */ - "\xe9\xa6\xac\0" /* offset 6647 */ - "\xe9\xaa\xa8\0" /* offset 6651 */ - "\xe9\xab\x98\0" /* offset 6655 */ - "\xe9\xab\x9f\0" /* offset 6659 */ - "\xe9\xac\xa5\0" /* offset 6663 */ - "\xe9\xac\xaf\0" /* offset 6667 */ - "\xe9\xac\xb2\0" /* offset 6671 */ - "\xe9\xac\xbc\0" /* offset 6675 */ - "\xe9\xad\x9a\0" /* offset 6679 */ - "\xe9\xb3\xa5\0" /* offset 6683 */ - "\xe9\xb9\xb5\0" /* offset 6687 */ - "\xe9\xb9\xbf\0" /* offset 6691 */ - "\xe9\xba\xa5\0" /* offset 6695 */ - "\xe9\xba\xbb\0" /* offset 6699 */ - "\xe9\xbb\x83\0" /* offset 6703 */ - "\xe9\xbb\x8d\0" /* offset 6707 */ - "\xe9\xbb\x91\0" /* offset 6711 */ - "\xe9\xbb\xb9\0" /* offset 6715 */ - "\xe9\xbb\xbd\0" /* offset 6719 */ - "\xe9\xbc\x8e\0" /* offset 6723 */ - "\xe9\xbc\x93\0" /* offset 6727 */ - "\xe9\xbc\xa0\0" /* offset 6731 */ - "\xe9\xbc\xbb\0" /* offset 6735 */ - "\xe9\xbd\x8a\0" /* offset 6739 */ - "\xe9\xbd\x92\0" /* offset 6743 */ - "\xe9\xbe\x8d\0" /* offset 6747 */ - "\xe9\xbe\x9c\0" /* offset 6751 */ - "\xe9\xbe\xa0\0" /* offset 6755 */ - "\xe3\x80\x92\0" /* offset 6759 */ - "\xe5\x8d\x84\0" /* offset 6763 */ - "\xe5\x8d\x85\0" /* offset 6767 */ - "\xe3\x81\x8b\xe3\x82\x99\0" /* offset 6771 */ - "\xe3\x81\x8d\xe3\x82\x99\0" /* offset 6778 */ - "\xe3\x81\x8f\xe3\x82\x99\0" /* offset 6785 */ - "\xe3\x81\x91\xe3\x82\x99\0" /* offset 6792 */ - "\xe3\x81\x93\xe3\x82\x99\0" /* offset 6799 */ - "\xe3\x81\x95\xe3\x82\x99\0" /* offset 6806 */ - "\xe3\x81\x97\xe3\x82\x99\0" /* offset 6813 */ - "\xe3\x81\x99\xe3\x82\x99\0" /* offset 6820 */ - "\xe3\x81\x9b\xe3\x82\x99\0" /* offset 6827 */ - "\xe3\x81\x9d\xe3\x82\x99\0" /* offset 6834 */ - "\xe3\x81\x9f\xe3\x82\x99\0" /* offset 6841 */ - "\xe3\x81\xa1\xe3\x82\x99\0" /* offset 6848 */ - "\xe3\x81\xa4\xe3\x82\x99\0" /* offset 6855 */ - "\xe3\x81\xa6\xe3\x82\x99\0" /* offset 6862 */ - "\xe3\x81\xa8\xe3\x82\x99\0" /* offset 6869 */ - "\xe3\x81\xaf\xe3\x82\x99\0" /* offset 6876 */ - "\xe3\x81\xaf\xe3\x82\x9a\0" /* offset 6883 */ - "\xe3\x81\xb2\xe3\x82\x99\0" /* offset 6890 */ - "\xe3\x81\xb2\xe3\x82\x9a\0" /* offset 6897 */ - "\xe3\x81\xb5\xe3\x82\x99\0" /* offset 6904 */ - "\xe3\x81\xb5\xe3\x82\x9a\0" /* offset 6911 */ - "\xe3\x81\xb8\xe3\x82\x99\0" /* offset 6918 */ - "\xe3\x81\xb8\xe3\x82\x9a\0" /* offset 6925 */ - "\xe3\x81\xbb\xe3\x82\x99\0" /* offset 6932 */ - "\xe3\x81\xbb\xe3\x82\x9a\0" /* offset 6939 */ - "\xe3\x81\x86\xe3\x82\x99\0" /* offset 6946 */ - "\x20\xe3\x82\x99\0" /* offset 6953 */ - "\x20\xe3\x82\x9a\0" /* offset 6958 */ - "\xe3\x82\x9d\xe3\x82\x99\0" /* offset 6963 */ - "\xe3\x82\x88\xe3\x82\x8a\0" /* offset 6970 */ - "\xe3\x82\xab\xe3\x82\x99\0" /* offset 6977 */ - "\xe3\x82\xad\xe3\x82\x99\0" /* offset 6984 */ - "\xe3\x82\xaf\xe3\x82\x99\0" /* offset 6991 */ - "\xe3\x82\xb1\xe3\x82\x99\0" /* offset 6998 */ - "\xe3\x82\xb3\xe3\x82\x99\0" /* offset 7005 */ - "\xe3\x82\xb5\xe3\x82\x99\0" /* offset 7012 */ - "\xe3\x82\xb7\xe3\x82\x99\0" /* offset 7019 */ - "\xe3\x82\xb9\xe3\x82\x99\0" /* offset 7026 */ - "\xe3\x82\xbb\xe3\x82\x99\0" /* offset 7033 */ - "\xe3\x82\xbd\xe3\x82\x99\0" /* offset 7040 */ - "\xe3\x82\xbf\xe3\x82\x99\0" /* offset 7047 */ - "\xe3\x83\x81\xe3\x82\x99\0" /* offset 7054 */ - "\xe3\x83\x84\xe3\x82\x99\0" /* offset 7061 */ - "\xe3\x83\x86\xe3\x82\x99\0" /* offset 7068 */ - "\xe3\x83\x88\xe3\x82\x99\0" /* offset 7075 */ - "\xe3\x83\x8f\xe3\x82\x99\0" /* offset 7082 */ - "\xe3\x83\x8f\xe3\x82\x9a\0" /* offset 7089 */ - "\xe3\x83\x92\xe3\x82\x99\0" /* offset 7096 */ - "\xe3\x83\x92\xe3\x82\x9a\0" /* offset 7103 */ - "\xe3\x83\x95\xe3\x82\x99\0" /* offset 7110 */ - "\xe3\x83\x95\xe3\x82\x9a\0" /* offset 7117 */ - "\xe3\x83\x98\xe3\x82\x99\0" /* offset 7124 */ - "\xe3\x83\x98\xe3\x82\x9a\0" /* offset 7131 */ - "\xe3\x83\x9b\xe3\x82\x99\0" /* offset 7138 */ - "\xe3\x83\x9b\xe3\x82\x9a\0" /* offset 7145 */ - "\xe3\x82\xa6\xe3\x82\x99\0" /* offset 7152 */ - "\xe3\x83\xaf\xe3\x82\x99\0" /* offset 7159 */ - "\xe3\x83\xb0\xe3\x82\x99\0" /* offset 7166 */ - "\xe3\x83\xb1\xe3\x82\x99\0" /* offset 7173 */ - "\xe3\x83\xb2\xe3\x82\x99\0" /* offset 7180 */ - "\xe3\x83\xbd\xe3\x82\x99\0" /* offset 7187 */ - "\xe3\x82\xb3\xe3\x83\x88\0" /* offset 7194 */ - "\xe1\x84\x80\0" /* offset 7201 */ - "\xe1\x84\x81\0" /* offset 7205 */ - "\xe1\x86\xaa\0" /* offset 7209 */ - "\xe1\x84\x82\0" /* offset 7213 */ - "\xe1\x86\xac\0" /* offset 7217 */ - "\xe1\x86\xad\0" /* offset 7221 */ - "\xe1\x84\x83\0" /* offset 7225 */ - "\xe1\x84\x84\0" /* offset 7229 */ - "\xe1\x84\x85\0" /* offset 7233 */ - "\xe1\x86\xb0\0" /* offset 7237 */ - "\xe1\x86\xb1\0" /* offset 7241 */ - "\xe1\x86\xb2\0" /* offset 7245 */ - "\xe1\x86\xb3\0" /* offset 7249 */ - "\xe1\x86\xb4\0" /* offset 7253 */ - "\xe1\x86\xb5\0" /* offset 7257 */ - "\xe1\x84\x9a\0" /* offset 7261 */ - "\xe1\x84\x86\0" /* offset 7265 */ - "\xe1\x84\x87\0" /* offset 7269 */ - "\xe1\x84\x88\0" /* offset 7273 */ - "\xe1\x84\xa1\0" /* offset 7277 */ - "\xe1\x84\x89\0" /* offset 7281 */ - "\xe1\x84\x8a\0" /* offset 7285 */ - "\xe1\x84\x8b\0" /* offset 7289 */ - "\xe1\x84\x8c\0" /* offset 7293 */ - "\xe1\x84\x8d\0" /* offset 7297 */ - "\xe1\x84\x8e\0" /* offset 7301 */ - "\xe1\x84\x8f\0" /* offset 7305 */ - "\xe1\x84\x90\0" /* offset 7309 */ - "\xe1\x84\x91\0" /* offset 7313 */ - "\xe1\x84\x92\0" /* offset 7317 */ - "\xe1\x85\xa1\0" /* offset 7321 */ - "\xe1\x85\xa2\0" /* offset 7325 */ - "\xe1\x85\xa3\0" /* offset 7329 */ - "\xe1\x85\xa4\0" /* offset 7333 */ - "\xe1\x85\xa5\0" /* offset 7337 */ - "\xe1\x85\xa6\0" /* offset 7341 */ - "\xe1\x85\xa7\0" /* offset 7345 */ - "\xe1\x85\xa8\0" /* offset 7349 */ - "\xe1\x85\xa9\0" /* offset 7353 */ - "\xe1\x85\xaa\0" /* offset 7357 */ - "\xe1\x85\xab\0" /* offset 7361 */ - "\xe1\x85\xac\0" /* offset 7365 */ - "\xe1\x85\xad\0" /* offset 7369 */ - "\xe1\x85\xae\0" /* offset 7373 */ - "\xe1\x85\xaf\0" /* offset 7377 */ - "\xe1\x85\xb0\0" /* offset 7381 */ - "\xe1\x85\xb1\0" /* offset 7385 */ - "\xe1\x85\xb2\0" /* offset 7389 */ - "\xe1\x85\xb3\0" /* offset 7393 */ - "\xe1\x85\xb4\0" /* offset 7397 */ - "\xe1\x85\xb5\0" /* offset 7401 */ - "\xe1\x85\xa0\0" /* offset 7405 */ - "\xe1\x84\x94\0" /* offset 7409 */ - "\xe1\x84\x95\0" /* offset 7413 */ - "\xe1\x87\x87\0" /* offset 7417 */ - "\xe1\x87\x88\0" /* offset 7421 */ - "\xe1\x87\x8c\0" /* offset 7425 */ - "\xe1\x87\x8e\0" /* offset 7429 */ - "\xe1\x87\x93\0" /* offset 7433 */ - "\xe1\x87\x97\0" /* offset 7437 */ - "\xe1\x87\x99\0" /* offset 7441 */ - "\xe1\x84\x9c\0" /* offset 7445 */ - "\xe1\x87\x9d\0" /* offset 7449 */ - "\xe1\x87\x9f\0" /* offset 7453 */ - "\xe1\x84\x9d\0" /* offset 7457 */ - "\xe1\x84\x9e\0" /* offset 7461 */ - "\xe1\x84\xa0\0" /* offset 7465 */ - "\xe1\x84\xa2\0" /* offset 7469 */ - "\xe1\x84\xa3\0" /* offset 7473 */ - "\xe1\x84\xa7\0" /* offset 7477 */ - "\xe1\x84\xa9\0" /* offset 7481 */ - "\xe1\x84\xab\0" /* offset 7485 */ - "\xe1\x84\xac\0" /* offset 7489 */ - "\xe1\x84\xad\0" /* offset 7493 */ - "\xe1\x84\xae\0" /* offset 7497 */ - "\xe1\x84\xaf\0" /* offset 7501 */ - "\xe1\x84\xb2\0" /* offset 7505 */ - "\xe1\x84\xb6\0" /* offset 7509 */ - "\xe1\x85\x80\0" /* offset 7513 */ - "\xe1\x85\x87\0" /* offset 7517 */ - "\xe1\x85\x8c\0" /* offset 7521 */ - "\xe1\x87\xb1\0" /* offset 7525 */ - "\xe1\x87\xb2\0" /* offset 7529 */ - "\xe1\x85\x97\0" /* offset 7533 */ - "\xe1\x85\x98\0" /* offset 7537 */ - "\xe1\x85\x99\0" /* offset 7541 */ - "\xe1\x86\x84\0" /* offset 7545 */ - "\xe1\x86\x85\0" /* offset 7549 */ - "\xe1\x86\x88\0" /* offset 7553 */ - "\xe1\x86\x91\0" /* offset 7557 */ - "\xe1\x86\x92\0" /* offset 7561 */ - "\xe1\x86\x94\0" /* offset 7565 */ - "\xe1\x86\x9e\0" /* offset 7569 */ - "\xe1\x86\xa1\0" /* offset 7573 */ - "\xe4\xb8\x89\0" /* offset 7577 */ - "\xe5\x9b\x9b\0" /* offset 7581 */ - "\xe4\xb8\x8a\0" /* offset 7585 */ - "\xe4\xb8\xad\0" /* offset 7589 */ - "\xe4\xb8\x8b\0" /* offset 7593 */ - "\xe7\x94\xb2\0" /* offset 7597 */ - "\xe4\xb8\x99\0" /* offset 7601 */ - "\xe4\xb8\x81\0" /* offset 7605 */ - "\xe5\xa4\xa9\0" /* offset 7609 */ - "\xe5\x9c\xb0\0" /* offset 7613 */ - "\x28\xe1\x84\x80\x29\0" /* offset 7617 */ - "\x28\xe1\x84\x82\x29\0" /* offset 7623 */ - "\x28\xe1\x84\x83\x29\0" /* offset 7629 */ - "\x28\xe1\x84\x85\x29\0" /* offset 7635 */ - "\x28\xe1\x84\x86\x29\0" /* offset 7641 */ - "\x28\xe1\x84\x87\x29\0" /* offset 7647 */ - "\x28\xe1\x84\x89\x29\0" /* offset 7653 */ - "\x28\xe1\x84\x8b\x29\0" /* offset 7659 */ - "\x28\xe1\x84\x8c\x29\0" /* offset 7665 */ - "\x28\xe1\x84\x8e\x29\0" /* offset 7671 */ - "\x28\xe1\x84\x8f\x29\0" /* offset 7677 */ - "\x28\xe1\x84\x90\x29\0" /* offset 7683 */ - "\x28\xe1\x84\x91\x29\0" /* offset 7689 */ - "\x28\xe1\x84\x92\x29\0" /* offset 7695 */ - "\x28\xe1\x84\x80\xe1\x85\xa1\x29\0" /* offset 7701 */ - "\x28\xe1\x84\x82\xe1\x85\xa1\x29\0" /* offset 7710 */ - "\x28\xe1\x84\x83\xe1\x85\xa1\x29\0" /* offset 7719 */ - "\x28\xe1\x84\x85\xe1\x85\xa1\x29\0" /* offset 7728 */ - "\x28\xe1\x84\x86\xe1\x85\xa1\x29\0" /* offset 7737 */ - "\x28\xe1\x84\x87\xe1\x85\xa1\x29\0" /* offset 7746 */ - "\x28\xe1\x84\x89\xe1\x85\xa1\x29\0" /* offset 7755 */ - "\x28\xe1\x84\x8b\xe1\x85\xa1\x29\0" /* offset 7764 */ - "\x28\xe1\x84\x8c\xe1\x85\xa1\x29\0" /* offset 7773 */ - "\x28\xe1\x84\x8e\xe1\x85\xa1\x29\0" /* offset 7782 */ - "\x28\xe1\x84\x8f\xe1\x85\xa1\x29\0" /* offset 7791 */ - "\x28\xe1\x84\x90\xe1\x85\xa1\x29\0" /* offset 7800 */ - "\x28\xe1\x84\x91\xe1\x85\xa1\x29\0" /* offset 7809 */ - "\x28\xe1\x84\x92\xe1\x85\xa1\x29\0" /* offset 7818 */ - "\x28\xe1\x84\x8c\xe1\x85\xae\x29\0" /* offset 7827 */ - "\x28\xe4\xb8\x80\x29\0" /* offset 7836 */ - "\x28\xe4\xba\x8c\x29\0" /* offset 7842 */ - "\x28\xe4\xb8\x89\x29\0" /* offset 7848 */ - "\x28\xe5\x9b\x9b\x29\0" /* offset 7854 */ - "\x28\xe4\xba\x94\x29\0" /* offset 7860 */ - "\x28\xe5\x85\xad\x29\0" /* offset 7866 */ - "\x28\xe4\xb8\x83\x29\0" /* offset 7872 */ - "\x28\xe5\x85\xab\x29\0" /* offset 7878 */ - "\x28\xe4\xb9\x9d\x29\0" /* offset 7884 */ - "\x28\xe5\x8d\x81\x29\0" /* offset 7890 */ - "\x28\xe6\x9c\x88\x29\0" /* offset 7896 */ - "\x28\xe7\x81\xab\x29\0" /* offset 7902 */ - "\x28\xe6\xb0\xb4\x29\0" /* offset 7908 */ - "\x28\xe6\x9c\xa8\x29\0" /* offset 7914 */ - "\x28\xe9\x87\x91\x29\0" /* offset 7920 */ - "\x28\xe5\x9c\x9f\x29\0" /* offset 7926 */ - "\x28\xe6\x97\xa5\x29\0" /* offset 7932 */ - "\x28\xe6\xa0\xaa\x29\0" /* offset 7938 */ - "\x28\xe6\x9c\x89\x29\0" /* offset 7944 */ - "\x28\xe7\xa4\xbe\x29\0" /* offset 7950 */ - "\x28\xe5\x90\x8d\x29\0" /* offset 7956 */ - "\x28\xe7\x89\xb9\x29\0" /* offset 7962 */ - "\x28\xe8\xb2\xa1\x29\0" /* offset 7968 */ - "\x28\xe7\xa5\x9d\x29\0" /* offset 7974 */ - "\x28\xe5\x8a\xb4\x29\0" /* offset 7980 */ - "\x28\xe4\xbb\xa3\x29\0" /* offset 7986 */ - "\x28\xe5\x91\xbc\x29\0" /* offset 7992 */ - "\x28\xe5\xad\xa6\x29\0" /* offset 7998 */ - "\x28\xe7\x9b\xa3\x29\0" /* offset 8004 */ - "\x28\xe4\xbc\x81\x29\0" /* offset 8010 */ - "\x28\xe8\xb3\x87\x29\0" /* offset 8016 */ - "\x28\xe5\x8d\x94\x29\0" /* offset 8022 */ - "\x28\xe7\xa5\xad\x29\0" /* offset 8028 */ - "\x28\xe4\xbc\x91\x29\0" /* offset 8034 */ - "\x28\xe8\x87\xaa\x29\0" /* offset 8040 */ - "\x28\xe8\x87\xb3\x29\0" /* offset 8046 */ - "\x32\x31\0" /* offset 8052 */ - "\x32\x32\0" /* offset 8055 */ - "\x32\x33\0" /* offset 8058 */ - "\x32\x34\0" /* offset 8061 */ - "\x32\x35\0" /* offset 8064 */ - "\x32\x36\0" /* offset 8067 */ - "\x32\x37\0" /* offset 8070 */ - "\x32\x38\0" /* offset 8073 */ - "\x32\x39\0" /* offset 8076 */ - "\x33\x30\0" /* offset 8079 */ - "\x33\x31\0" /* offset 8082 */ - "\x33\x32\0" /* offset 8085 */ - "\x33\x33\0" /* offset 8088 */ - "\x33\x34\0" /* offset 8091 */ - "\x33\x35\0" /* offset 8094 */ - "\xe1\x84\x80\xe1\x85\xa1\0" /* offset 8097 */ - "\xe1\x84\x82\xe1\x85\xa1\0" /* offset 8104 */ - "\xe1\x84\x83\xe1\x85\xa1\0" /* offset 8111 */ - "\xe1\x84\x85\xe1\x85\xa1\0" /* offset 8118 */ - "\xe1\x84\x86\xe1\x85\xa1\0" /* offset 8125 */ - "\xe1\x84\x87\xe1\x85\xa1\0" /* offset 8132 */ - "\xe1\x84\x89\xe1\x85\xa1\0" /* offset 8139 */ - "\xe1\x84\x8b\xe1\x85\xa1\0" /* offset 8146 */ - "\xe1\x84\x8c\xe1\x85\xa1\0" /* offset 8153 */ - "\xe1\x84\x8e\xe1\x85\xa1\0" /* offset 8160 */ - "\xe1\x84\x8f\xe1\x85\xa1\0" /* offset 8167 */ - "\xe1\x84\x90\xe1\x85\xa1\0" /* offset 8174 */ - "\xe1\x84\x91\xe1\x85\xa1\0" /* offset 8181 */ - "\xe1\x84\x92\xe1\x85\xa1\0" /* offset 8188 */ - "\xe4\xba\x94\0" /* offset 8195 */ - "\xe5\x85\xad\0" /* offset 8199 */ - "\xe4\xb8\x83\0" /* offset 8203 */ - "\xe4\xb9\x9d\0" /* offset 8207 */ - "\xe6\xa0\xaa\0" /* offset 8211 */ - "\xe6\x9c\x89\0" /* offset 8215 */ - "\xe7\xa4\xbe\0" /* offset 8219 */ - "\xe5\x90\x8d\0" /* offset 8223 */ - "\xe7\x89\xb9\0" /* offset 8227 */ - "\xe8\xb2\xa1\0" /* offset 8231 */ - "\xe7\xa5\x9d\0" /* offset 8235 */ - "\xe5\x8a\xb4\0" /* offset 8239 */ - "\xe7\xa7\x98\0" /* offset 8243 */ - "\xe7\x94\xb7\0" /* offset 8247 */ - "\xe9\x81\xa9\0" /* offset 8251 */ - "\xe5\x84\xaa\0" /* offset 8255 */ - "\xe5\x8d\xb0\0" /* offset 8259 */ - "\xe6\xb3\xa8\0" /* offset 8263 */ - "\xe9\xa0\x85\0" /* offset 8267 */ - "\xe4\xbc\x91\0" /* offset 8271 */ - "\xe5\x86\x99\0" /* offset 8275 */ - "\xe6\xad\xa3\0" /* offset 8279 */ - "\xe5\xb7\xa6\0" /* offset 8283 */ - "\xe5\x8f\xb3\0" /* offset 8287 */ - "\xe5\x8c\xbb\0" /* offset 8291 */ - "\xe5\xae\x97\0" /* offset 8295 */ - "\xe5\xad\xa6\0" /* offset 8299 */ - "\xe7\x9b\xa3\0" /* offset 8303 */ - "\xe4\xbc\x81\0" /* offset 8307 */ - "\xe8\xb3\x87\0" /* offset 8311 */ - "\xe5\x8d\x94\0" /* offset 8315 */ - "\xe5\xa4\x9c\0" /* offset 8319 */ - "\x33\x36\0" /* offset 8323 */ - "\x33\x37\0" /* offset 8326 */ - "\x33\x38\0" /* offset 8329 */ - "\x33\x39\0" /* offset 8332 */ - "\x34\x30\0" /* offset 8335 */ - "\x34\x31\0" /* offset 8338 */ - "\x34\x32\0" /* offset 8341 */ - "\x34\x33\0" /* offset 8344 */ - "\x34\x34\0" /* offset 8347 */ - "\x34\x35\0" /* offset 8350 */ - "\x34\x36\0" /* offset 8353 */ - "\x34\x37\0" /* offset 8356 */ - "\x34\x38\0" /* offset 8359 */ - "\x34\x39\0" /* offset 8362 */ - "\x35\x30\0" /* offset 8365 */ - "\x31\xe6\x9c\x88\0" /* offset 8368 */ - "\x32\xe6\x9c\x88\0" /* offset 8373 */ - "\x33\xe6\x9c\x88\0" /* offset 8378 */ - "\x34\xe6\x9c\x88\0" /* offset 8383 */ - "\x35\xe6\x9c\x88\0" /* offset 8388 */ - "\x36\xe6\x9c\x88\0" /* offset 8393 */ - "\x37\xe6\x9c\x88\0" /* offset 8398 */ - "\x38\xe6\x9c\x88\0" /* offset 8403 */ - "\x39\xe6\x9c\x88\0" /* offset 8408 */ - "\x31\x30\xe6\x9c\x88\0" /* offset 8413 */ - "\x31\x31\xe6\x9c\x88\0" /* offset 8419 */ - "\x31\x32\xe6\x9c\x88\0" /* offset 8425 */ - "\xe3\x82\xa2\0" /* offset 8431 */ - "\xe3\x82\xa4\0" /* offset 8435 */ - "\xe3\x82\xa6\0" /* offset 8439 */ - "\xe3\x82\xa8\0" /* offset 8443 */ - "\xe3\x82\xaa\0" /* offset 8447 */ - "\xe3\x82\xab\0" /* offset 8451 */ - "\xe3\x82\xad\0" /* offset 8455 */ - "\xe3\x82\xaf\0" /* offset 8459 */ - "\xe3\x82\xb1\0" /* offset 8463 */ - "\xe3\x82\xb3\0" /* offset 8467 */ - "\xe3\x82\xb5\0" /* offset 8471 */ - "\xe3\x82\xb7\0" /* offset 8475 */ - "\xe3\x82\xb9\0" /* offset 8479 */ - "\xe3\x82\xbb\0" /* offset 8483 */ - "\xe3\x82\xbd\0" /* offset 8487 */ - "\xe3\x82\xbf\0" /* offset 8491 */ - "\xe3\x83\x81\0" /* offset 8495 */ - "\xe3\x83\x84\0" /* offset 8499 */ - "\xe3\x83\x86\0" /* offset 8503 */ - "\xe3\x83\x88\0" /* offset 8507 */ - "\xe3\x83\x8a\0" /* offset 8511 */ - "\xe3\x83\x8b\0" /* offset 8515 */ - "\xe3\x83\x8c\0" /* offset 8519 */ - "\xe3\x83\x8d\0" /* offset 8523 */ - "\xe3\x83\x8e\0" /* offset 8527 */ - "\xe3\x83\x8f\0" /* offset 8531 */ - "\xe3\x83\x92\0" /* offset 8535 */ - "\xe3\x83\x95\0" /* offset 8539 */ - "\xe3\x83\x98\0" /* offset 8543 */ - "\xe3\x83\x9b\0" /* offset 8547 */ - "\xe3\x83\x9e\0" /* offset 8551 */ - "\xe3\x83\x9f\0" /* offset 8555 */ - "\xe3\x83\xa0\0" /* offset 8559 */ - "\xe3\x83\xa1\0" /* offset 8563 */ - "\xe3\x83\xa2\0" /* offset 8567 */ - "\xe3\x83\xa4\0" /* offset 8571 */ - "\xe3\x83\xa6\0" /* offset 8575 */ - "\xe3\x83\xa8\0" /* offset 8579 */ - "\xe3\x83\xa9\0" /* offset 8583 */ - "\xe3\x83\xaa\0" /* offset 8587 */ - "\xe3\x83\xab\0" /* offset 8591 */ - "\xe3\x83\xac\0" /* offset 8595 */ - "\xe3\x83\xad\0" /* offset 8599 */ - "\xe3\x83\xaf\0" /* offset 8603 */ - "\xe3\x83\xb0\0" /* offset 8607 */ - "\xe3\x83\xb1\0" /* offset 8611 */ - "\xe3\x83\xb2\0" /* offset 8615 */ - "\xe3\x82\xa2\xe3\x83\x8f\xe3\x82\x9a\xe3\x83\xbc\xe3\x83\x88\0" /* offset 8619 */ - "\xe3\x82\xa2\xe3\x83\xab\xe3\x83\x95\xe3\x82\xa1\0" /* offset 8635 */ - "\xe3\x82\xa2\xe3\x83\xb3\xe3\x83\x98\xe3\x82\x9a\xe3\x82\xa2\0" /* offset 8648 */ - "\xe3\x82\xa2\xe3\x83\xbc\xe3\x83\xab\0" /* offset 8664 */ - "\xe3\x82\xa4\xe3\x83\x8b\xe3\x83\xb3\xe3\x82\xaf\xe3\x82\x99\0" /* offset 8674 */ - "\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x81\0" /* offset 8690 */ - "\xe3\x82\xa6\xe3\x82\xa9\xe3\x83\xb3\0" /* offset 8700 */ - "\xe3\x82\xa8\xe3\x82\xb9\xe3\x82\xaf\xe3\x83\xbc\xe3\x83\x88\xe3\x82\x99\0" /* offset 8710 */ - "\xe3\x82\xa8\xe3\x83\xbc\xe3\x82\xab\xe3\x83\xbc\0" /* offset 8729 */ - "\xe3\x82\xaa\xe3\x83\xb3\xe3\x82\xb9\0" /* offset 8742 */ - "\xe3\x82\xaa\xe3\x83\xbc\xe3\x83\xa0\0" /* offset 8752 */ - "\xe3\x82\xab\xe3\x82\xa4\xe3\x83\xaa\0" /* offset 8762 */ - "\xe3\x82\xab\xe3\x83\xa9\xe3\x83\x83\xe3\x83\x88\0" /* offset 8772 */ - "\xe3\x82\xab\xe3\x83\xad\xe3\x83\xaa\xe3\x83\xbc\0" /* offset 8785 */ - "\xe3\x82\xab\xe3\x82\x99\xe3\x83\xad\xe3\x83\xb3\0" /* offset 8798 */ - "\xe3\x82\xab\xe3\x82\x99\xe3\x83\xb3\xe3\x83\x9e\0" /* offset 8811 */ - "\xe3\x82\xad\xe3\x82\x99\xe3\x82\xab\xe3\x82\x99\0" /* offset 8824 */ - "\xe3\x82\xad\xe3\x82\x99\xe3\x83\x8b\xe3\x83\xbc\0" /* offset 8837 */ - "\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\xbc\0" /* offset 8850 */ - "\xe3\x82\xad\xe3\x82\x99\xe3\x83\xab\xe3\x82\xbf\xe3\x82\x99\xe3\x83\xbc\0" /* offset 8863 */ - "\xe3\x82\xad\xe3\x83\xad\0" /* offset 8882 */ - "\xe3\x82\xad\xe3\x83\xad\xe3\x82\xaf\xe3\x82\x99\xe3\x83\xa9\xe3\x83\xa0\0" /* offset 8889 */ - "\xe3\x82\xad\xe3\x83\xad\xe3\x83\xa1\xe3\x83\xbc\xe3\x83\x88\xe3\x83\xab\0" /* offset 8908 */ - "\xe3\x82\xad\xe3\x83\xad\xe3\x83\xaf\xe3\x83\x83\xe3\x83\x88\0" /* offset 8927 */ - "\xe3\x82\xaf\xe3\x82\x99\xe3\x83\xa9\xe3\x83\xa0\0" /* offset 8943 */ - "\xe3\x82\xaf\xe3\x82\x99\xe3\x83\xa9\xe3\x83\xa0\xe3\x83\x88\xe3\x83\xb3\0" /* offset 8956 */ - "\xe3\x82\xaf\xe3\x83\xab\xe3\x82\xbb\xe3\x82\x99\xe3\x82\xa4\xe3\x83\xad\0" /* offset 8975 */ - "\xe3\x82\xaf\xe3\x83\xad\xe3\x83\xbc\xe3\x83\x8d\0" /* offset 8994 */ - "\xe3\x82\xb1\xe3\x83\xbc\xe3\x82\xb9\0" /* offset 9007 */ - "\xe3\x82\xb3\xe3\x83\xab\xe3\x83\x8a\0" /* offset 9017 */ - "\xe3\x82\xb3\xe3\x83\xbc\xe3\x83\x9b\xe3\x82\x9a\0" /* offset 9027 */ - "\xe3\x82\xb5\xe3\x82\xa4\xe3\x82\xaf\xe3\x83\xab\0" /* offset 9040 */ - "\xe3\x82\xb5\xe3\x83\xb3\xe3\x83\x81\xe3\x83\xbc\xe3\x83\xa0\0" /* offset 9053 */ - "\xe3\x82\xb7\xe3\x83\xaa\xe3\x83\xb3\xe3\x82\xaf\xe3\x82\x99\0" /* offset 9069 */ - "\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x81\0" /* offset 9085 */ - "\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x88\0" /* offset 9095 */ - "\xe3\x82\xbf\xe3\x82\x99\xe3\x83\xbc\xe3\x82\xb9\0" /* offset 9105 */ - "\xe3\x83\x86\xe3\x82\x99\xe3\x82\xb7\0" /* offset 9118 */ - "\xe3\x83\x88\xe3\x82\x99\xe3\x83\xab\0" /* offset 9128 */ - "\xe3\x83\x88\xe3\x83\xb3\0" /* offset 9138 */ - "\xe3\x83\x8a\xe3\x83\x8e\0" /* offset 9145 */ - "\xe3\x83\x8e\xe3\x83\x83\xe3\x83\x88\0" /* offset 9152 */ - "\xe3\x83\x8f\xe3\x82\xa4\xe3\x83\x84\0" /* offset 9162 */ - "\xe3\x83\x8f\xe3\x82\x9a\xe3\x83\xbc\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x88\0" /* offset 9172 */ - "\xe3\x83\x8f\xe3\x82\x9a\xe3\x83\xbc\xe3\x83\x84\0" /* offset 9191 */ - "\xe3\x83\x8f\xe3\x82\x99\xe3\x83\xbc\xe3\x83\xac\xe3\x83\xab\0" /* offset 9204 */ - "\xe3\x83\x92\xe3\x82\x9a\xe3\x82\xa2\xe3\x82\xb9\xe3\x83\x88\xe3\x83\xab\0" /* offset 9220 */ - "\xe3\x83\x92\xe3\x82\x9a\xe3\x82\xaf\xe3\x83\xab\0" /* offset 9239 */ - "\xe3\x83\x92\xe3\x82\x9a\xe3\x82\xb3\0" /* offset 9252 */ - "\xe3\x83\x92\xe3\x82\x99\xe3\x83\xab\0" /* offset 9262 */ - "\xe3\x83\x95\xe3\x82\xa1\xe3\x83\xa9\xe3\x83\x83\xe3\x83\x88\xe3\x82\x99\0" /* offset 9272 */ - "\xe3\x83\x95\xe3\x82\xa3\xe3\x83\xbc\xe3\x83\x88\0" /* offset 9291 */ - "\xe3\x83\x95\xe3\x82\x99\xe3\x83\x83\xe3\x82\xb7\xe3\x82\xa7\xe3\x83\xab\0" /* offset 9304 */ - "\xe3\x83\x95\xe3\x83\xa9\xe3\x83\xb3\0" /* offset 9323 */ - "\xe3\x83\x98\xe3\x82\xaf\xe3\x82\xbf\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9333 */ - "\xe3\x83\x98\xe3\x82\x9a\xe3\x82\xbd\0" /* offset 9349 */ - "\xe3\x83\x98\xe3\x82\x9a\xe3\x83\x8b\xe3\x83\x92\0" /* offset 9359 */ - "\xe3\x83\x98\xe3\x83\xab\xe3\x83\x84\0" /* offset 9372 */ - "\xe3\x83\x98\xe3\x82\x9a\xe3\x83\xb3\xe3\x82\xb9\0" /* offset 9382 */ - "\xe3\x83\x98\xe3\x82\x9a\xe3\x83\xbc\xe3\x82\xb7\xe3\x82\x99\0" /* offset 9395 */ - "\xe3\x83\x98\xe3\x82\x99\xe3\x83\xbc\xe3\x82\xbf\0" /* offset 9411 */ - "\xe3\x83\x9b\xe3\x82\x9a\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88\0" /* offset 9424 */ - "\xe3\x83\x9b\xe3\x82\x99\xe3\x83\xab\xe3\x83\x88\0" /* offset 9440 */ - "\xe3\x83\x9b\xe3\x83\xb3\0" /* offset 9453 */ - "\xe3\x83\x9b\xe3\x82\x9a\xe3\x83\xb3\xe3\x83\x88\xe3\x82\x99\0" /* offset 9460 */ - "\xe3\x83\x9b\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9476 */ - "\xe3\x83\x9b\xe3\x83\xbc\xe3\x83\xb3\0" /* offset 9486 */ - "\xe3\x83\x9e\xe3\x82\xa4\xe3\x82\xaf\xe3\x83\xad\0" /* offset 9496 */ - "\xe3\x83\x9e\xe3\x82\xa4\xe3\x83\xab\0" /* offset 9509 */ - "\xe3\x83\x9e\xe3\x83\x83\xe3\x83\x8f\0" /* offset 9519 */ - "\xe3\x83\x9e\xe3\x83\xab\xe3\x82\xaf\0" /* offset 9529 */ - "\xe3\x83\x9e\xe3\x83\xb3\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\0" /* offset 9539 */ - "\xe3\x83\x9f\xe3\x82\xaf\xe3\x83\xad\xe3\x83\xb3\0" /* offset 9555 */ - "\xe3\x83\x9f\xe3\x83\xaa\0" /* offset 9568 */ - "\xe3\x83\x9f\xe3\x83\xaa\xe3\x83\x8f\xe3\x82\x99\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9575 */ - "\xe3\x83\xa1\xe3\x82\xab\xe3\x82\x99\0" /* offset 9594 */ - "\xe3\x83\xa1\xe3\x82\xab\xe3\x82\x99\xe3\x83\x88\xe3\x83\xb3\0" /* offset 9604 */ - "\xe3\x83\xa1\xe3\x83\xbc\xe3\x83\x88\xe3\x83\xab\0" /* offset 9620 */ - "\xe3\x83\xa4\xe3\x83\xbc\xe3\x83\x88\xe3\x82\x99\0" /* offset 9633 */ - "\xe3\x83\xa4\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9646 */ - "\xe3\x83\xa6\xe3\x82\xa2\xe3\x83\xb3\0" /* offset 9656 */ - "\xe3\x83\xaa\xe3\x83\x83\xe3\x83\x88\xe3\x83\xab\0" /* offset 9666 */ - "\xe3\x83\xaa\xe3\x83\xa9\0" /* offset 9679 */ - "\xe3\x83\xab\xe3\x83\x92\xe3\x82\x9a\xe3\x83\xbc\0" /* offset 9686 */ - "\xe3\x83\xab\xe3\x83\xbc\xe3\x83\x95\xe3\x82\x99\xe3\x83\xab\0" /* offset 9699 */ - "\xe3\x83\xac\xe3\x83\xa0\0" /* offset 9715 */ - "\xe3\x83\xac\xe3\x83\xb3\xe3\x83\x88\xe3\x82\xb1\xe3\x82\x99\xe3\x83\xb3\0" /* offset 9722 */ - "\xe3\x83\xaf\xe3\x83\x83\xe3\x83\x88\0" /* offset 9741 */ - "\x30\xe7\x82\xb9\0" /* offset 9751 */ - "\x31\xe7\x82\xb9\0" /* offset 9756 */ - "\x32\xe7\x82\xb9\0" /* offset 9761 */ - "\x33\xe7\x82\xb9\0" /* offset 9766 */ - "\x34\xe7\x82\xb9\0" /* offset 9771 */ - "\x35\xe7\x82\xb9\0" /* offset 9776 */ - "\x36\xe7\x82\xb9\0" /* offset 9781 */ - "\x37\xe7\x82\xb9\0" /* offset 9786 */ - "\x38\xe7\x82\xb9\0" /* offset 9791 */ - "\x39\xe7\x82\xb9\0" /* offset 9796 */ - "\x31\x30\xe7\x82\xb9\0" /* offset 9801 */ - "\x31\x31\xe7\x82\xb9\0" /* offset 9807 */ - "\x31\x32\xe7\x82\xb9\0" /* offset 9813 */ - "\x31\x33\xe7\x82\xb9\0" /* offset 9819 */ - "\x31\x34\xe7\x82\xb9\0" /* offset 9825 */ - "\x31\x35\xe7\x82\xb9\0" /* offset 9831 */ - "\x31\x36\xe7\x82\xb9\0" /* offset 9837 */ - "\x31\x37\xe7\x82\xb9\0" /* offset 9843 */ - "\x31\x38\xe7\x82\xb9\0" /* offset 9849 */ - "\x31\x39\xe7\x82\xb9\0" /* offset 9855 */ - "\x32\x30\xe7\x82\xb9\0" /* offset 9861 */ - "\x32\x31\xe7\x82\xb9\0" /* offset 9867 */ - "\x32\x32\xe7\x82\xb9\0" /* offset 9873 */ - "\x32\x33\xe7\x82\xb9\0" /* offset 9879 */ - "\x32\x34\xe7\x82\xb9\0" /* offset 9885 */ - "\x68\x50\x61\0" /* offset 9891 */ - "\x64\x61\0" /* offset 9895 */ - "\x41\x55\0" /* offset 9898 */ - "\x62\x61\x72\0" /* offset 9901 */ - "\x6f\x56\0" /* offset 9905 */ - "\x70\x63\0" /* offset 9908 */ - "\xe5\xb9\xb3\xe6\x88\x90\0" /* offset 9911 */ - "\xe6\x98\xad\xe5\x92\x8c\0" /* offset 9918 */ - "\xe5\xa4\xa7\xe6\xad\xa3\0" /* offset 9925 */ - "\xe6\x98\x8e\xe6\xb2\xbb\0" /* offset 9932 */ - "\xe6\xa0\xaa\xe5\xbc\x8f\xe4\xbc\x9a\xe7\xa4\xbe\0" /* offset 9939 */ - "\x70\x41\0" /* offset 9952 */ - "\x6e\x41\0" /* offset 9955 */ - "\xce\xbc\x41\0" /* offset 9958 */ - "\x6d\x41\0" /* offset 9962 */ - "\x6b\x41\0" /* offset 9965 */ - "\x4b\x42\0" /* offset 9968 */ - "\x4d\x42\0" /* offset 9971 */ - "\x47\x42\0" /* offset 9974 */ - "\x63\x61\x6c\0" /* offset 9977 */ - "\x6b\x63\x61\x6c\0" /* offset 9981 */ - "\x70\x46\0" /* offset 9986 */ - "\x6e\x46\0" /* offset 9989 */ - "\xce\xbc\x46\0" /* offset 9992 */ - "\xce\xbc\x67\0" /* offset 9996 */ - "\x6d\x67\0" /* offset 10000 */ - "\x6b\x67\0" /* offset 10003 */ - "\x48\x7a\0" /* offset 10006 */ - "\x6b\x48\x7a\0" /* offset 10009 */ - "\x4d\x48\x7a\0" /* offset 10013 */ - "\x47\x48\x7a\0" /* offset 10017 */ - "\x54\x48\x7a\0" /* offset 10021 */ - "\xce\xbc\x6c\0" /* offset 10025 */ - "\x6d\x6c\0" /* offset 10029 */ - "\x64\x6c\0" /* offset 10032 */ - "\x6b\x6c\0" /* offset 10035 */ - "\x66\x6d\0" /* offset 10038 */ - "\x6e\x6d\0" /* offset 10041 */ - "\xce\xbc\x6d\0" /* offset 10044 */ - "\x6d\x6d\0" /* offset 10048 */ - "\x63\x6d\0" /* offset 10051 */ - "\x6b\x6d\0" /* offset 10054 */ - "\x6d\x6d\x32\0" /* offset 10057 */ - "\x63\x6d\x32\0" /* offset 10061 */ - "\x6d\x32\0" /* offset 10065 */ - "\x6b\x6d\x32\0" /* offset 10068 */ - "\x6d\x6d\x33\0" /* offset 10072 */ - "\x63\x6d\x33\0" /* offset 10076 */ - "\x6d\x33\0" /* offset 10080 */ - "\x6b\x6d\x33\0" /* offset 10083 */ - "\x6d\xe2\x88\x95\x73\0" /* offset 10087 */ - "\x6d\xe2\x88\x95\x73\x32\0" /* offset 10093 */ - "\x50\x61\0" /* offset 10100 */ - "\x6b\x50\x61\0" /* offset 10103 */ - "\x4d\x50\x61\0" /* offset 10107 */ - "\x47\x50\x61\0" /* offset 10111 */ - "\x72\x61\x64\0" /* offset 10115 */ - "\x72\x61\x64\xe2\x88\x95\x73\0" /* offset 10119 */ - "\x72\x61\x64\xe2\x88\x95\x73\x32\0" /* offset 10127 */ - "\x70\x73\0" /* offset 10136 */ - "\x6e\x73\0" /* offset 10139 */ - "\xce\xbc\x73\0" /* offset 10142 */ - "\x6d\x73\0" /* offset 10146 */ - "\x70\x56\0" /* offset 10149 */ - "\x6e\x56\0" /* offset 10152 */ - "\xce\xbc\x56\0" /* offset 10155 */ - "\x6d\x56\0" /* offset 10159 */ - "\x6b\x56\0" /* offset 10162 */ - "\x4d\x56\0" /* offset 10165 */ - "\x70\x57\0" /* offset 10168 */ - "\x6e\x57\0" /* offset 10171 */ - "\xce\xbc\x57\0" /* offset 10174 */ - "\x6d\x57\0" /* offset 10178 */ - "\x6b\x57\0" /* offset 10181 */ - "\x4d\x57\0" /* offset 10184 */ - "\x6b\xce\xa9\0" /* offset 10187 */ - "\x4d\xce\xa9\0" /* offset 10191 */ - "\x61\x2e\x6d\x2e\0" /* offset 10195 */ - "\x42\x71\0" /* offset 10200 */ - "\x63\x63\0" /* offset 10203 */ - "\x63\x64\0" /* offset 10206 */ - "\x43\xe2\x88\x95\x6b\x67\0" /* offset 10209 */ - "\x43\x6f\x2e\0" /* offset 10216 */ - "\x64\x42\0" /* offset 10220 */ - "\x47\x79\0" /* offset 10223 */ - "\x68\x61\0" /* offset 10226 */ - "\x48\x50\0" /* offset 10229 */ - "\x69\x6e\0" /* offset 10232 */ - "\x4b\x4b\0" /* offset 10235 */ - "\x4b\x4d\0" /* offset 10238 */ - "\x6b\x74\0" /* offset 10241 */ - "\x6c\x6d\0" /* offset 10244 */ - "\x6c\x6e\0" /* offset 10247 */ - "\x6c\x6f\x67\0" /* offset 10250 */ - "\x6c\x78\0" /* offset 10254 */ - "\x6d\x62\0" /* offset 10257 */ - "\x6d\x69\x6c\0" /* offset 10260 */ - "\x6d\x6f\x6c\0" /* offset 10264 */ - "\x50\x48\0" /* offset 10268 */ - "\x70\x2e\x6d\x2e\0" /* offset 10271 */ - "\x50\x50\x4d\0" /* offset 10276 */ - "\x50\x52\0" /* offset 10280 */ - "\x73\x72\0" /* offset 10283 */ - "\x53\x76\0" /* offset 10286 */ - "\x57\x62\0" /* offset 10289 */ - "\x31\xe6\x97\xa5\0" /* offset 10292 */ - "\x32\xe6\x97\xa5\0" /* offset 10297 */ - "\x33\xe6\x97\xa5\0" /* offset 10302 */ - "\x34\xe6\x97\xa5\0" /* offset 10307 */ - "\x35\xe6\x97\xa5\0" /* offset 10312 */ - "\x36\xe6\x97\xa5\0" /* offset 10317 */ - "\x37\xe6\x97\xa5\0" /* offset 10322 */ - "\x38\xe6\x97\xa5\0" /* offset 10327 */ - "\x39\xe6\x97\xa5\0" /* offset 10332 */ - "\x31\x30\xe6\x97\xa5\0" /* offset 10337 */ - "\x31\x31\xe6\x97\xa5\0" /* offset 10343 */ - "\x31\x32\xe6\x97\xa5\0" /* offset 10349 */ - "\x31\x33\xe6\x97\xa5\0" /* offset 10355 */ - "\x31\x34\xe6\x97\xa5\0" /* offset 10361 */ - "\x31\x35\xe6\x97\xa5\0" /* offset 10367 */ - "\x31\x36\xe6\x97\xa5\0" /* offset 10373 */ - "\x31\x37\xe6\x97\xa5\0" /* offset 10379 */ - "\x31\x38\xe6\x97\xa5\0" /* offset 10385 */ - "\x31\x39\xe6\x97\xa5\0" /* offset 10391 */ - "\x32\x30\xe6\x97\xa5\0" /* offset 10397 */ - "\x32\x31\xe6\x97\xa5\0" /* offset 10403 */ - "\x32\x32\xe6\x97\xa5\0" /* offset 10409 */ - "\x32\x33\xe6\x97\xa5\0" /* offset 10415 */ - "\x32\x34\xe6\x97\xa5\0" /* offset 10421 */ - "\x32\x35\xe6\x97\xa5\0" /* offset 10427 */ - "\x32\x36\xe6\x97\xa5\0" /* offset 10433 */ - "\x32\x37\xe6\x97\xa5\0" /* offset 10439 */ - "\x32\x38\xe6\x97\xa5\0" /* offset 10445 */ - "\x32\x39\xe6\x97\xa5\0" /* offset 10451 */ - "\x33\x30\xe6\x97\xa5\0" /* offset 10457 */ - "\x33\x31\xe6\x97\xa5\0" /* offset 10463 */ - "\xe8\xb1\x88\0" /* offset 10469 */ - "\xe6\x9b\xb4\0" /* offset 10473 */ - "\xe8\xb3\x88\0" /* offset 10477 */ - "\xe6\xbb\x91\0" /* offset 10481 */ - "\xe4\xb8\xb2\0" /* offset 10485 */ - "\xe5\x8f\xa5\0" /* offset 10489 */ - "\xe5\xa5\x91\0" /* offset 10493 */ - "\xe5\x96\x87\0" /* offset 10497 */ - "\xe5\xa5\x88\0" /* offset 10501 */ - "\xe6\x87\xb6\0" /* offset 10505 */ - "\xe7\x99\xa9\0" /* offset 10509 */ - "\xe7\xbe\x85\0" /* offset 10513 */ - "\xe8\x98\xbf\0" /* offset 10517 */ - "\xe8\x9e\xba\0" /* offset 10521 */ - "\xe8\xa3\xb8\0" /* offset 10525 */ - "\xe9\x82\x8f\0" /* offset 10529 */ - "\xe6\xa8\x82\0" /* offset 10533 */ - "\xe6\xb4\x9b\0" /* offset 10537 */ - "\xe7\x83\x99\0" /* offset 10541 */ - "\xe7\x8f\x9e\0" /* offset 10545 */ - "\xe8\x90\xbd\0" /* offset 10549 */ - "\xe9\x85\xaa\0" /* offset 10553 */ - "\xe9\xa7\xb1\0" /* offset 10557 */ - "\xe4\xba\x82\0" /* offset 10561 */ - "\xe5\x8d\xb5\0" /* offset 10565 */ - "\xe6\xac\x84\0" /* offset 10569 */ - "\xe7\x88\x9b\0" /* offset 10573 */ - "\xe8\x98\xad\0" /* offset 10577 */ - "\xe9\xb8\x9e\0" /* offset 10581 */ - "\xe5\xb5\x90\0" /* offset 10585 */ - "\xe6\xbf\xab\0" /* offset 10589 */ - "\xe8\x97\x8d\0" /* offset 10593 */ - "\xe8\xa5\xa4\0" /* offset 10597 */ - "\xe6\x8b\x89\0" /* offset 10601 */ - "\xe8\x87\x98\0" /* offset 10605 */ - "\xe8\xa0\x9f\0" /* offset 10609 */ - "\xe5\xbb\x8a\0" /* offset 10613 */ - "\xe6\x9c\x97\0" /* offset 10617 */ - "\xe6\xb5\xaa\0" /* offset 10621 */ - "\xe7\x8b\xbc\0" /* offset 10625 */ - "\xe9\x83\x8e\0" /* offset 10629 */ - "\xe4\xbe\x86\0" /* offset 10633 */ - "\xe5\x86\xb7\0" /* offset 10637 */ - "\xe5\x8b\x9e\0" /* offset 10641 */ - "\xe6\x93\x84\0" /* offset 10645 */ - "\xe6\xab\x93\0" /* offset 10649 */ - "\xe7\x88\x90\0" /* offset 10653 */ - "\xe7\x9b\xa7\0" /* offset 10657 */ - "\xe8\x98\x86\0" /* offset 10661 */ - "\xe8\x99\x9c\0" /* offset 10665 */ - "\xe8\xb7\xaf\0" /* offset 10669 */ - "\xe9\x9c\xb2\0" /* offset 10673 */ - "\xe9\xad\xaf\0" /* offset 10677 */ - "\xe9\xb7\xba\0" /* offset 10681 */ - "\xe7\xa2\x8c\0" /* offset 10685 */ - "\xe7\xa5\xbf\0" /* offset 10689 */ - "\xe7\xb6\xa0\0" /* offset 10693 */ - "\xe8\x8f\x89\0" /* offset 10697 */ - "\xe9\x8c\x84\0" /* offset 10701 */ - "\xe8\xab\x96\0" /* offset 10705 */ - "\xe5\xa3\x9f\0" /* offset 10709 */ - "\xe5\xbc\x84\0" /* offset 10713 */ - "\xe7\xb1\xa0\0" /* offset 10717 */ - "\xe8\x81\xbe\0" /* offset 10721 */ - "\xe7\x89\xa2\0" /* offset 10725 */ - "\xe7\xa3\x8a\0" /* offset 10729 */ - "\xe8\xb3\x82\0" /* offset 10733 */ - "\xe9\x9b\xb7\0" /* offset 10737 */ - "\xe5\xa3\x98\0" /* offset 10741 */ - "\xe5\xb1\xa2\0" /* offset 10745 */ - "\xe6\xa8\x93\0" /* offset 10749 */ - "\xe6\xb7\x9a\0" /* offset 10753 */ - "\xe6\xbc\x8f\0" /* offset 10757 */ - "\xe7\xb4\xaf\0" /* offset 10761 */ - "\xe7\xb8\xb7\0" /* offset 10765 */ - "\xe9\x99\x8b\0" /* offset 10769 */ - "\xe5\x8b\x92\0" /* offset 10773 */ - "\xe8\x82\x8b\0" /* offset 10777 */ - "\xe5\x87\x9c\0" /* offset 10781 */ - "\xe5\x87\x8c\0" /* offset 10785 */ - "\xe7\xa8\x9c\0" /* offset 10789 */ - "\xe7\xb6\xbe\0" /* offset 10793 */ - "\xe8\x8f\xb1\0" /* offset 10797 */ - "\xe9\x99\xb5\0" /* offset 10801 */ - "\xe8\xae\x80\0" /* offset 10805 */ - "\xe6\x8b\x8f\0" /* offset 10809 */ - "\xe8\xab\xbe\0" /* offset 10813 */ - "\xe4\xb8\xb9\0" /* offset 10817 */ - "\xe5\xaf\xa7\0" /* offset 10821 */ - "\xe6\x80\x92\0" /* offset 10825 */ - "\xe7\x8e\x87\0" /* offset 10829 */ - "\xe7\x95\xb0\0" /* offset 10833 */ - "\xe5\x8c\x97\0" /* offset 10837 */ - "\xe7\xa3\xbb\0" /* offset 10841 */ - "\xe4\xbe\xbf\0" /* offset 10845 */ - "\xe5\xbe\xa9\0" /* offset 10849 */ - "\xe4\xb8\x8d\0" /* offset 10853 */ - "\xe6\xb3\x8c\0" /* offset 10857 */ - "\xe6\x95\xb8\0" /* offset 10861 */ - "\xe7\xb4\xa2\0" /* offset 10865 */ - "\xe5\x8f\x83\0" /* offset 10869 */ - "\xe5\xa1\x9e\0" /* offset 10873 */ - "\xe7\x9c\x81\0" /* offset 10877 */ - "\xe8\x91\x89\0" /* offset 10881 */ - "\xe8\xaa\xaa\0" /* offset 10885 */ - "\xe6\xae\xba\0" /* offset 10889 */ - "\xe6\xb2\x88\0" /* offset 10893 */ - "\xe6\x8b\xbe\0" /* offset 10897 */ - "\xe8\x8b\xa5\0" /* offset 10901 */ - "\xe6\x8e\xa0\0" /* offset 10905 */ - "\xe7\x95\xa5\0" /* offset 10909 */ - "\xe4\xba\xae\0" /* offset 10913 */ - "\xe5\x85\xa9\0" /* offset 10917 */ - "\xe5\x87\x89\0" /* offset 10921 */ - "\xe6\xa2\x81\0" /* offset 10925 */ - "\xe7\xb3\xa7\0" /* offset 10929 */ - "\xe8\x89\xaf\0" /* offset 10933 */ - "\xe8\xab\x92\0" /* offset 10937 */ - "\xe9\x87\x8f\0" /* offset 10941 */ - "\xe5\x8b\xb5\0" /* offset 10945 */ - "\xe5\x91\x82\0" /* offset 10949 */ - "\xe5\xbb\xac\0" /* offset 10953 */ - "\xe6\x97\x85\0" /* offset 10957 */ - "\xe6\xbf\xbe\0" /* offset 10961 */ - "\xe7\xa4\xaa\0" /* offset 10965 */ - "\xe9\x96\xad\0" /* offset 10969 */ - "\xe9\xa9\xaa\0" /* offset 10973 */ - "\xe9\xba\x97\0" /* offset 10977 */ - "\xe9\xbb\x8e\0" /* offset 10981 */ - "\xe6\x9b\x86\0" /* offset 10985 */ - "\xe6\xad\xb7\0" /* offset 10989 */ - "\xe8\xbd\xa2\0" /* offset 10993 */ - "\xe5\xb9\xb4\0" /* offset 10997 */ - "\xe6\x86\x90\0" /* offset 11001 */ - "\xe6\x88\x80\0" /* offset 11005 */ - "\xe6\x92\x9a\0" /* offset 11009 */ - "\xe6\xbc\xa3\0" /* offset 11013 */ - "\xe7\x85\x89\0" /* offset 11017 */ - "\xe7\x92\x89\0" /* offset 11021 */ - "\xe7\xa7\x8a\0" /* offset 11025 */ - "\xe7\xb7\xb4\0" /* offset 11029 */ - "\xe8\x81\xaf\0" /* offset 11033 */ - "\xe8\xbc\xa6\0" /* offset 11037 */ - "\xe8\x93\xae\0" /* offset 11041 */ - "\xe9\x80\xa3\0" /* offset 11045 */ - "\xe9\x8d\x8a\0" /* offset 11049 */ - "\xe5\x88\x97\0" /* offset 11053 */ - "\xe5\x8a\xa3\0" /* offset 11057 */ - "\xe5\x92\xbd\0" /* offset 11061 */ - "\xe7\x83\x88\0" /* offset 11065 */ - "\xe8\xa3\x82\0" /* offset 11069 */ - "\xe5\xbb\x89\0" /* offset 11073 */ - "\xe5\xbf\xb5\0" /* offset 11077 */ - "\xe6\x8d\xbb\0" /* offset 11081 */ - "\xe6\xae\xae\0" /* offset 11085 */ - "\xe7\xb0\xbe\0" /* offset 11089 */ - "\xe7\x8d\xb5\0" /* offset 11093 */ - "\xe4\xbb\xa4\0" /* offset 11097 */ - "\xe5\x9b\xb9\0" /* offset 11101 */ - "\xe5\xb6\xba\0" /* offset 11105 */ - "\xe6\x80\x9c\0" /* offset 11109 */ - "\xe7\x8e\xb2\0" /* offset 11113 */ - "\xe7\x91\xa9\0" /* offset 11117 */ - "\xe7\xbe\x9a\0" /* offset 11121 */ - "\xe8\x81\x86\0" /* offset 11125 */ - "\xe9\x88\xb4\0" /* offset 11129 */ - "\xe9\x9b\xb6\0" /* offset 11133 */ - "\xe9\x9d\x88\0" /* offset 11137 */ - "\xe9\xa0\x98\0" /* offset 11141 */ - "\xe4\xbe\x8b\0" /* offset 11145 */ - "\xe7\xa6\xae\0" /* offset 11149 */ - "\xe9\x86\xb4\0" /* offset 11153 */ - "\xe9\x9a\xb8\0" /* offset 11157 */ - "\xe6\x83\xa1\0" /* offset 11161 */ - "\xe4\xba\x86\0" /* offset 11165 */ - "\xe5\x83\x9a\0" /* offset 11169 */ - "\xe5\xaf\xae\0" /* offset 11173 */ - "\xe5\xb0\xbf\0" /* offset 11177 */ - "\xe6\x96\x99\0" /* offset 11181 */ - "\xe7\x87\x8e\0" /* offset 11185 */ - "\xe7\x99\x82\0" /* offset 11189 */ - "\xe8\x93\xbc\0" /* offset 11193 */ - "\xe9\x81\xbc\0" /* offset 11197 */ - "\xe6\x9a\x88\0" /* offset 11201 */ - "\xe9\x98\xae\0" /* offset 11205 */ - "\xe5\x8a\x89\0" /* offset 11209 */ - "\xe6\x9d\xbb\0" /* offset 11213 */ - "\xe6\x9f\xb3\0" /* offset 11217 */ - "\xe6\xb5\x81\0" /* offset 11221 */ - "\xe6\xba\x9c\0" /* offset 11225 */ - "\xe7\x90\x89\0" /* offset 11229 */ - "\xe7\x95\x99\0" /* offset 11233 */ - "\xe7\xa1\xab\0" /* offset 11237 */ - "\xe7\xb4\x90\0" /* offset 11241 */ - "\xe9\xa1\x9e\0" /* offset 11245 */ - "\xe6\x88\xae\0" /* offset 11249 */ - "\xe9\x99\xb8\0" /* offset 11253 */ - "\xe5\x80\xab\0" /* offset 11257 */ - "\xe5\xb4\x99\0" /* offset 11261 */ - "\xe6\xb7\xaa\0" /* offset 11265 */ - "\xe8\xbc\xaa\0" /* offset 11269 */ - "\xe5\xbe\x8b\0" /* offset 11273 */ - "\xe6\x85\x84\0" /* offset 11277 */ - "\xe6\xa0\x97\0" /* offset 11281 */ - "\xe9\x9a\x86\0" /* offset 11285 */ - "\xe5\x88\xa9\0" /* offset 11289 */ - "\xe5\x90\x8f\0" /* offset 11293 */ - "\xe5\xb1\xa5\0" /* offset 11297 */ - "\xe6\x98\x93\0" /* offset 11301 */ - "\xe6\x9d\x8e\0" /* offset 11305 */ - "\xe6\xa2\xa8\0" /* offset 11309 */ - "\xe6\xb3\xa5\0" /* offset 11313 */ - "\xe7\x90\x86\0" /* offset 11317 */ - "\xe7\x97\xa2\0" /* offset 11321 */ - "\xe7\xbd\xb9\0" /* offset 11325 */ - "\xe8\xa3\x8f\0" /* offset 11329 */ - "\xe8\xa3\xa1\0" /* offset 11333 */ - "\xe9\x9b\xa2\0" /* offset 11337 */ - "\xe5\x8c\xbf\0" /* offset 11341 */ - "\xe6\xba\xba\0" /* offset 11345 */ - "\xe5\x90\x9d\0" /* offset 11349 */ - "\xe7\x87\x90\0" /* offset 11353 */ - "\xe7\x92\x98\0" /* offset 11357 */ - "\xe8\x97\xba\0" /* offset 11361 */ - "\xe9\x9a\xa3\0" /* offset 11365 */ - "\xe9\xb1\x97\0" /* offset 11369 */ - "\xe9\xba\x9f\0" /* offset 11373 */ - "\xe6\x9e\x97\0" /* offset 11377 */ - "\xe6\xb7\x8b\0" /* offset 11381 */ - "\xe8\x87\xa8\0" /* offset 11385 */ - "\xe7\xac\xa0\0" /* offset 11389 */ - "\xe7\xb2\x92\0" /* offset 11393 */ - "\xe7\x8b\x80\0" /* offset 11397 */ - "\xe7\x82\x99\0" /* offset 11401 */ - "\xe8\xad\x98\0" /* offset 11405 */ - "\xe4\xbb\x80\0" /* offset 11409 */ - "\xe8\x8c\xb6\0" /* offset 11413 */ - "\xe5\x88\xba\0" /* offset 11417 */ - "\xe5\x88\x87\0" /* offset 11421 */ - "\xe5\xba\xa6\0" /* offset 11425 */ - "\xe6\x8b\x93\0" /* offset 11429 */ - "\xe7\xb3\x96\0" /* offset 11433 */ - "\xe5\xae\x85\0" /* offset 11437 */ - "\xe6\xb4\x9e\0" /* offset 11441 */ - "\xe6\x9a\xb4\0" /* offset 11445 */ - "\xe8\xbc\xbb\0" /* offset 11449 */ - "\xe9\x99\x8d\0" /* offset 11453 */ - "\xe5\xbb\x93\0" /* offset 11457 */ - "\xe5\x85\x80\0" /* offset 11461 */ - "\xe5\x97\x80\0" /* offset 11465 */ - "\xe5\xa1\x9a\0" /* offset 11469 */ - "\xe6\x99\xb4\0" /* offset 11473 */ - "\xe5\x87\x9e\0" /* offset 11477 */ - "\xe7\x8c\xaa\0" /* offset 11481 */ - "\xe7\x9b\x8a\0" /* offset 11485 */ - "\xe7\xa4\xbc\0" /* offset 11489 */ - "\xe7\xa5\x9e\0" /* offset 11493 */ - "\xe7\xa5\xa5\0" /* offset 11497 */ - "\xe7\xa6\x8f\0" /* offset 11501 */ - "\xe9\x9d\x96\0" /* offset 11505 */ - "\xe7\xb2\xbe\0" /* offset 11509 */ - "\xe8\x98\x92\0" /* offset 11513 */ - "\xe8\xab\xb8\0" /* offset 11517 */ - "\xe9\x80\xb8\0" /* offset 11521 */ - "\xe9\x83\xbd\0" /* offset 11525 */ - "\xe9\xa3\xaf\0" /* offset 11529 */ - "\xe9\xa3\xbc\0" /* offset 11533 */ - "\xe9\xa4\xa8\0" /* offset 11537 */ - "\xe9\xb6\xb4\0" /* offset 11541 */ - "\xe4\xbe\xae\0" /* offset 11545 */ - "\xe5\x83\xa7\0" /* offset 11549 */ - "\xe5\x85\x8d\0" /* offset 11553 */ - "\xe5\x8b\x89\0" /* offset 11557 */ - "\xe5\x8b\xa4\0" /* offset 11561 */ - "\xe5\x8d\x91\0" /* offset 11565 */ - "\xe5\x96\x9d\0" /* offset 11569 */ - "\xe5\x98\x86\0" /* offset 11573 */ - "\xe5\x99\xa8\0" /* offset 11577 */ - "\xe5\xa1\x80\0" /* offset 11581 */ - "\xe5\xa2\xa8\0" /* offset 11585 */ - "\xe5\xb1\xa4\0" /* offset 11589 */ - "\xe6\x82\x94\0" /* offset 11593 */ - "\xe6\x85\xa8\0" /* offset 11597 */ - "\xe6\x86\x8e\0" /* offset 11601 */ - "\xe6\x87\xb2\0" /* offset 11605 */ - "\xe6\x95\x8f\0" /* offset 11609 */ - "\xe6\x97\xa2\0" /* offset 11613 */ - "\xe6\x9a\x91\0" /* offset 11617 */ - "\xe6\xa2\x85\0" /* offset 11621 */ - "\xe6\xb5\xb7\0" /* offset 11625 */ - "\xe6\xb8\x9a\0" /* offset 11629 */ - "\xe6\xbc\xa2\0" /* offset 11633 */ - "\xe7\x85\xae\0" /* offset 11637 */ - "\xe7\x88\xab\0" /* offset 11641 */ - "\xe7\x90\xa2\0" /* offset 11645 */ - "\xe7\xa2\x91\0" /* offset 11649 */ - "\xe7\xa5\x89\0" /* offset 11653 */ - "\xe7\xa5\x88\0" /* offset 11657 */ - "\xe7\xa5\x90\0" /* offset 11661 */ - "\xe7\xa5\x96\0" /* offset 11665 */ - "\xe7\xa6\x8d\0" /* offset 11669 */ - "\xe7\xa6\x8e\0" /* offset 11673 */ - "\xe7\xa9\x80\0" /* offset 11677 */ - "\xe7\xaa\x81\0" /* offset 11681 */ - "\xe7\xaf\x80\0" /* offset 11685 */ - "\xe7\xb8\x89\0" /* offset 11689 */ - "\xe7\xb9\x81\0" /* offset 11693 */ - "\xe7\xbd\xb2\0" /* offset 11697 */ - "\xe8\x80\x85\0" /* offset 11701 */ - "\xe8\x87\xad\0" /* offset 11705 */ - "\xe8\x89\xb9\0" /* offset 11709 */ - "\xe8\x91\x97\0" /* offset 11713 */ - "\xe8\xa4\x90\0" /* offset 11717 */ - "\xe8\xa6\x96\0" /* offset 11721 */ - "\xe8\xac\x81\0" /* offset 11725 */ - "\xe8\xac\xb9\0" /* offset 11729 */ - "\xe8\xb3\x93\0" /* offset 11733 */ - "\xe8\xb4\x88\0" /* offset 11737 */ - "\xe8\xbe\xb6\0" /* offset 11741 */ - "\xe9\x9b\xa3\0" /* offset 11745 */ - "\xe9\x9f\xbf\0" /* offset 11749 */ - "\xe9\xa0\xbb\0" /* offset 11753 */ - "\x66\x66\0" /* offset 11757 */ - "\x66\x69\0" /* offset 11760 */ - "\x66\x6c\0" /* offset 11763 */ - "\x66\x66\x69\0" /* offset 11766 */ - "\x66\x66\x6c\0" /* offset 11770 */ - "\x73\x74\0" /* offset 11774 */ - "\xd5\xb4\xd5\xb6\0" /* offset 11777 */ - "\xd5\xb4\xd5\xa5\0" /* offset 11782 */ - "\xd5\xb4\xd5\xab\0" /* offset 11787 */ - "\xd5\xbe\xd5\xb6\0" /* offset 11792 */ - "\xd5\xb4\xd5\xad\0" /* offset 11797 */ - "\xd7\x99\xd6\xb4\0" /* offset 11802 */ - "\xd7\xb2\xd6\xb7\0" /* offset 11807 */ - "\xd7\xa2\0" /* offset 11812 */ - "\xd7\x94\0" /* offset 11815 */ - "\xd7\x9b\0" /* offset 11818 */ - "\xd7\x9c\0" /* offset 11821 */ - "\xd7\x9d\0" /* offset 11824 */ - "\xd7\xa8\0" /* offset 11827 */ - "\xd7\xaa\0" /* offset 11830 */ - "\xd7\xa9\xd7\x81\0" /* offset 11833 */ - "\xd7\xa9\xd7\x82\0" /* offset 11838 */ - "\xd7\xa9\xd6\xbc\xd7\x81\0" /* offset 11843 */ - "\xd7\xa9\xd6\xbc\xd7\x82\0" /* offset 11850 */ - "\xd7\x90\xd6\xb7\0" /* offset 11857 */ - "\xd7\x90\xd6\xb8\0" /* offset 11862 */ - "\xd7\x90\xd6\xbc\0" /* offset 11867 */ - "\xd7\x91\xd6\xbc\0" /* offset 11872 */ - "\xd7\x92\xd6\xbc\0" /* offset 11877 */ - "\xd7\x93\xd6\xbc\0" /* offset 11882 */ - "\xd7\x94\xd6\xbc\0" /* offset 11887 */ - "\xd7\x95\xd6\xbc\0" /* offset 11892 */ - "\xd7\x96\xd6\xbc\0" /* offset 11897 */ - "\xd7\x98\xd6\xbc\0" /* offset 11902 */ - "\xd7\x99\xd6\xbc\0" /* offset 11907 */ - "\xd7\x9a\xd6\xbc\0" /* offset 11912 */ - "\xd7\x9b\xd6\xbc\0" /* offset 11917 */ - "\xd7\x9c\xd6\xbc\0" /* offset 11922 */ - "\xd7\x9e\xd6\xbc\0" /* offset 11927 */ - "\xd7\xa0\xd6\xbc\0" /* offset 11932 */ - "\xd7\xa1\xd6\xbc\0" /* offset 11937 */ - "\xd7\xa3\xd6\xbc\0" /* offset 11942 */ - "\xd7\xa4\xd6\xbc\0" /* offset 11947 */ - "\xd7\xa6\xd6\xbc\0" /* offset 11952 */ - "\xd7\xa7\xd6\xbc\0" /* offset 11957 */ - "\xd7\xa8\xd6\xbc\0" /* offset 11962 */ - "\xd7\xa9\xd6\xbc\0" /* offset 11967 */ - "\xd7\xaa\xd6\xbc\0" /* offset 11972 */ - "\xd7\x95\xd6\xb9\0" /* offset 11977 */ - "\xd7\x91\xd6\xbf\0" /* offset 11982 */ - "\xd7\x9b\xd6\xbf\0" /* offset 11987 */ - "\xd7\xa4\xd6\xbf\0" /* offset 11992 */ - "\xd7\x90\xd7\x9c\0" /* offset 11997 */ - "\xd9\xb1\0" /* offset 12002 */ - "\xd9\xbb\0" /* offset 12005 */ - "\xd9\xbe\0" /* offset 12008 */ - "\xda\x80\0" /* offset 12011 */ - "\xd9\xba\0" /* offset 12014 */ - "\xd9\xbf\0" /* offset 12017 */ - "\xd9\xb9\0" /* offset 12020 */ - "\xda\xa4\0" /* offset 12023 */ - "\xda\xa6\0" /* offset 12026 */ - "\xda\x84\0" /* offset 12029 */ - "\xda\x83\0" /* offset 12032 */ - "\xda\x86\0" /* offset 12035 */ - "\xda\x87\0" /* offset 12038 */ - "\xda\x8d\0" /* offset 12041 */ - "\xda\x8c\0" /* offset 12044 */ - "\xda\x8e\0" /* offset 12047 */ - "\xda\x88\0" /* offset 12050 */ - "\xda\x98\0" /* offset 12053 */ - "\xda\x91\0" /* offset 12056 */ - "\xda\xa9\0" /* offset 12059 */ - "\xda\xaf\0" /* offset 12062 */ - "\xda\xb3\0" /* offset 12065 */ - "\xda\xb1\0" /* offset 12068 */ - "\xda\xba\0" /* offset 12071 */ - "\xda\xbb\0" /* offset 12074 */ - "\xdb\x81\0" /* offset 12077 */ - "\xda\xbe\0" /* offset 12080 */ - "\xdb\x92\0" /* offset 12083 */ - "\xda\xad\0" /* offset 12086 */ - "\xdb\x87\0" /* offset 12089 */ - "\xdb\x86\0" /* offset 12092 */ - "\xdb\x88\0" /* offset 12095 */ - "\xdb\x8b\0" /* offset 12098 */ - "\xdb\x85\0" /* offset 12101 */ - "\xdb\x89\0" /* offset 12104 */ - "\xdb\x90\0" /* offset 12107 */ - "\xd9\x89\0" /* offset 12110 */ - "\xd9\x8a\xd9\x94\xd8\xa7\0" /* offset 12113 */ - "\xd9\x8a\xd9\x94\xdb\x95\0" /* offset 12120 */ - "\xd9\x8a\xd9\x94\xd9\x88\0" /* offset 12127 */ - "\xd9\x8a\xd9\x94\xdb\x87\0" /* offset 12134 */ - "\xd9\x8a\xd9\x94\xdb\x86\0" /* offset 12141 */ - "\xd9\x8a\xd9\x94\xdb\x88\0" /* offset 12148 */ - "\xd9\x8a\xd9\x94\xdb\x90\0" /* offset 12155 */ - "\xd9\x8a\xd9\x94\xd9\x89\0" /* offset 12162 */ - "\xdb\x8c\0" /* offset 12169 */ - "\xd9\x8a\xd9\x94\xd8\xac\0" /* offset 12172 */ - "\xd9\x8a\xd9\x94\xd8\xad\0" /* offset 12179 */ - "\xd9\x8a\xd9\x94\xd9\x85\0" /* offset 12186 */ - "\xd9\x8a\xd9\x94\xd9\x8a\0" /* offset 12193 */ - "\xd8\xa8\xd8\xac\0" /* offset 12200 */ - "\xd8\xa8\xd8\xad\0" /* offset 12205 */ - "\xd8\xa8\xd8\xae\0" /* offset 12210 */ - "\xd8\xa8\xd9\x85\0" /* offset 12215 */ - "\xd8\xa8\xd9\x89\0" /* offset 12220 */ - "\xd8\xa8\xd9\x8a\0" /* offset 12225 */ - "\xd8\xaa\xd8\xac\0" /* offset 12230 */ - "\xd8\xaa\xd8\xad\0" /* offset 12235 */ - "\xd8\xaa\xd8\xae\0" /* offset 12240 */ - "\xd8\xaa\xd9\x85\0" /* offset 12245 */ - "\xd8\xaa\xd9\x89\0" /* offset 12250 */ - "\xd8\xaa\xd9\x8a\0" /* offset 12255 */ - "\xd8\xab\xd8\xac\0" /* offset 12260 */ - "\xd8\xab\xd9\x85\0" /* offset 12265 */ - "\xd8\xab\xd9\x89\0" /* offset 12270 */ - "\xd8\xab\xd9\x8a\0" /* offset 12275 */ - "\xd8\xac\xd8\xad\0" /* offset 12280 */ - "\xd8\xac\xd9\x85\0" /* offset 12285 */ - "\xd8\xad\xd8\xac\0" /* offset 12290 */ - "\xd8\xad\xd9\x85\0" /* offset 12295 */ - "\xd8\xae\xd8\xac\0" /* offset 12300 */ - "\xd8\xae\xd8\xad\0" /* offset 12305 */ - "\xd8\xae\xd9\x85\0" /* offset 12310 */ - "\xd8\xb3\xd8\xac\0" /* offset 12315 */ - "\xd8\xb3\xd8\xad\0" /* offset 12320 */ - "\xd8\xb3\xd8\xae\0" /* offset 12325 */ - "\xd8\xb3\xd9\x85\0" /* offset 12330 */ - "\xd8\xb5\xd8\xad\0" /* offset 12335 */ - "\xd8\xb5\xd9\x85\0" /* offset 12340 */ - "\xd8\xb6\xd8\xac\0" /* offset 12345 */ - "\xd8\xb6\xd8\xad\0" /* offset 12350 */ - "\xd8\xb6\xd8\xae\0" /* offset 12355 */ - "\xd8\xb6\xd9\x85\0" /* offset 12360 */ - "\xd8\xb7\xd8\xad\0" /* offset 12365 */ - "\xd8\xb7\xd9\x85\0" /* offset 12370 */ - "\xd8\xb8\xd9\x85\0" /* offset 12375 */ - "\xd8\xb9\xd8\xac\0" /* offset 12380 */ - "\xd8\xb9\xd9\x85\0" /* offset 12385 */ - "\xd8\xba\xd8\xac\0" /* offset 12390 */ - "\xd8\xba\xd9\x85\0" /* offset 12395 */ - "\xd9\x81\xd8\xac\0" /* offset 12400 */ - "\xd9\x81\xd8\xad\0" /* offset 12405 */ - "\xd9\x81\xd8\xae\0" /* offset 12410 */ - "\xd9\x81\xd9\x85\0" /* offset 12415 */ - "\xd9\x81\xd9\x89\0" /* offset 12420 */ - "\xd9\x81\xd9\x8a\0" /* offset 12425 */ - "\xd9\x82\xd8\xad\0" /* offset 12430 */ - "\xd9\x82\xd9\x85\0" /* offset 12435 */ - "\xd9\x82\xd9\x89\0" /* offset 12440 */ - "\xd9\x82\xd9\x8a\0" /* offset 12445 */ - "\xd9\x83\xd8\xa7\0" /* offset 12450 */ - "\xd9\x83\xd8\xac\0" /* offset 12455 */ - "\xd9\x83\xd8\xad\0" /* offset 12460 */ - "\xd9\x83\xd8\xae\0" /* offset 12465 */ - "\xd9\x83\xd9\x84\0" /* offset 12470 */ - "\xd9\x83\xd9\x85\0" /* offset 12475 */ - "\xd9\x83\xd9\x89\0" /* offset 12480 */ - "\xd9\x83\xd9\x8a\0" /* offset 12485 */ - "\xd9\x84\xd8\xac\0" /* offset 12490 */ - "\xd9\x84\xd8\xad\0" /* offset 12495 */ - "\xd9\x84\xd8\xae\0" /* offset 12500 */ - "\xd9\x84\xd9\x85\0" /* offset 12505 */ - "\xd9\x84\xd9\x89\0" /* offset 12510 */ - "\xd9\x84\xd9\x8a\0" /* offset 12515 */ - "\xd9\x85\xd8\xac\0" /* offset 12520 */ - "\xd9\x85\xd8\xad\0" /* offset 12525 */ - "\xd9\x85\xd8\xae\0" /* offset 12530 */ - "\xd9\x85\xd9\x85\0" /* offset 12535 */ - "\xd9\x85\xd9\x89\0" /* offset 12540 */ - "\xd9\x85\xd9\x8a\0" /* offset 12545 */ - "\xd9\x86\xd8\xac\0" /* offset 12550 */ - "\xd9\x86\xd8\xad\0" /* offset 12555 */ - "\xd9\x86\xd8\xae\0" /* offset 12560 */ - "\xd9\x86\xd9\x85\0" /* offset 12565 */ - "\xd9\x86\xd9\x89\0" /* offset 12570 */ - "\xd9\x86\xd9\x8a\0" /* offset 12575 */ - "\xd9\x87\xd8\xac\0" /* offset 12580 */ - "\xd9\x87\xd9\x85\0" /* offset 12585 */ - "\xd9\x87\xd9\x89\0" /* offset 12590 */ - "\xd9\x87\xd9\x8a\0" /* offset 12595 */ - "\xd9\x8a\xd8\xac\0" /* offset 12600 */ - "\xd9\x8a\xd8\xad\0" /* offset 12605 */ - "\xd9\x8a\xd8\xae\0" /* offset 12610 */ - "\xd9\x8a\xd9\x85\0" /* offset 12615 */ - "\xd9\x8a\xd9\x89\0" /* offset 12620 */ - "\xd9\x8a\xd9\x8a\0" /* offset 12625 */ - "\xd8\xb0\xd9\xb0\0" /* offset 12630 */ - "\xd8\xb1\xd9\xb0\0" /* offset 12635 */ - "\xd9\x89\xd9\xb0\0" /* offset 12640 */ - "\x20\xd9\x8c\xd9\x91\0" /* offset 12645 */ - "\x20\xd9\x8d\xd9\x91\0" /* offset 12651 */ - "\x20\xd9\x8e\xd9\x91\0" /* offset 12657 */ - "\x20\xd9\x8f\xd9\x91\0" /* offset 12663 */ - "\x20\xd9\x90\xd9\x91\0" /* offset 12669 */ - "\x20\xd9\x91\xd9\xb0\0" /* offset 12675 */ - "\xd9\x8a\xd9\x94\xd8\xb1\0" /* offset 12681 */ - "\xd9\x8a\xd9\x94\xd8\xb2\0" /* offset 12688 */ - "\xd9\x8a\xd9\x94\xd9\x86\0" /* offset 12695 */ - "\xd8\xa8\xd8\xb1\0" /* offset 12702 */ - "\xd8\xa8\xd8\xb2\0" /* offset 12707 */ - "\xd8\xa8\xd9\x86\0" /* offset 12712 */ - "\xd8\xaa\xd8\xb1\0" /* offset 12717 */ - "\xd8\xaa\xd8\xb2\0" /* offset 12722 */ - "\xd8\xaa\xd9\x86\0" /* offset 12727 */ - "\xd8\xab\xd8\xb1\0" /* offset 12732 */ - "\xd8\xab\xd8\xb2\0" /* offset 12737 */ - "\xd8\xab\xd9\x86\0" /* offset 12742 */ - "\xd9\x85\xd8\xa7\0" /* offset 12747 */ - "\xd9\x86\xd8\xb1\0" /* offset 12752 */ - "\xd9\x86\xd8\xb2\0" /* offset 12757 */ - "\xd9\x86\xd9\x86\0" /* offset 12762 */ - "\xd9\x8a\xd8\xb1\0" /* offset 12767 */ - "\xd9\x8a\xd8\xb2\0" /* offset 12772 */ - "\xd9\x8a\xd9\x86\0" /* offset 12777 */ - "\xd9\x8a\xd9\x94\xd8\xae\0" /* offset 12782 */ - "\xd9\x8a\xd9\x94\xd9\x87\0" /* offset 12789 */ - "\xd8\xa8\xd9\x87\0" /* offset 12796 */ - "\xd8\xaa\xd9\x87\0" /* offset 12801 */ - "\xd8\xb5\xd8\xae\0" /* offset 12806 */ - "\xd9\x84\xd9\x87\0" /* offset 12811 */ - "\xd9\x86\xd9\x87\0" /* offset 12816 */ - "\xd9\x87\xd9\xb0\0" /* offset 12821 */ - "\xd9\x8a\xd9\x87\0" /* offset 12826 */ - "\xd8\xab\xd9\x87\0" /* offset 12831 */ - "\xd8\xb3\xd9\x87\0" /* offset 12836 */ - "\xd8\xb4\xd9\x85\0" /* offset 12841 */ - "\xd8\xb4\xd9\x87\0" /* offset 12846 */ - "\xd9\x80\xd9\x8e\xd9\x91\0" /* offset 12851 */ - "\xd9\x80\xd9\x8f\xd9\x91\0" /* offset 12858 */ - "\xd9\x80\xd9\x90\xd9\x91\0" /* offset 12865 */ - "\xd8\xb7\xd9\x89\0" /* offset 12872 */ - "\xd8\xb7\xd9\x8a\0" /* offset 12877 */ - "\xd8\xb9\xd9\x89\0" /* offset 12882 */ - "\xd8\xb9\xd9\x8a\0" /* offset 12887 */ - "\xd8\xba\xd9\x89\0" /* offset 12892 */ - "\xd8\xba\xd9\x8a\0" /* offset 12897 */ - "\xd8\xb3\xd9\x89\0" /* offset 12902 */ - "\xd8\xb3\xd9\x8a\0" /* offset 12907 */ - "\xd8\xb4\xd9\x89\0" /* offset 12912 */ - "\xd8\xb4\xd9\x8a\0" /* offset 12917 */ - "\xd8\xad\xd9\x89\0" /* offset 12922 */ - "\xd8\xad\xd9\x8a\0" /* offset 12927 */ - "\xd8\xac\xd9\x89\0" /* offset 12932 */ - "\xd8\xac\xd9\x8a\0" /* offset 12937 */ - "\xd8\xae\xd9\x89\0" /* offset 12942 */ - "\xd8\xae\xd9\x8a\0" /* offset 12947 */ - "\xd8\xb5\xd9\x89\0" /* offset 12952 */ - "\xd8\xb5\xd9\x8a\0" /* offset 12957 */ - "\xd8\xb6\xd9\x89\0" /* offset 12962 */ - "\xd8\xb6\xd9\x8a\0" /* offset 12967 */ - "\xd8\xb4\xd8\xac\0" /* offset 12972 */ - "\xd8\xb4\xd8\xad\0" /* offset 12977 */ - "\xd8\xb4\xd8\xae\0" /* offset 12982 */ - "\xd8\xb4\xd8\xb1\0" /* offset 12987 */ - "\xd8\xb3\xd8\xb1\0" /* offset 12992 */ - "\xd8\xb5\xd8\xb1\0" /* offset 12997 */ - "\xd8\xb6\xd8\xb1\0" /* offset 13002 */ - "\xd8\xa7\xd9\x8b\0" /* offset 13007 */ - "\xd8\xaa\xd8\xac\xd9\x85\0" /* offset 13012 */ - "\xd8\xaa\xd8\xad\xd8\xac\0" /* offset 13019 */ - "\xd8\xaa\xd8\xad\xd9\x85\0" /* offset 13026 */ - "\xd8\xaa\xd8\xae\xd9\x85\0" /* offset 13033 */ - "\xd8\xaa\xd9\x85\xd8\xac\0" /* offset 13040 */ - "\xd8\xaa\xd9\x85\xd8\xad\0" /* offset 13047 */ - "\xd8\xaa\xd9\x85\xd8\xae\0" /* offset 13054 */ - "\xd8\xac\xd9\x85\xd8\xad\0" /* offset 13061 */ - "\xd8\xad\xd9\x85\xd9\x8a\0" /* offset 13068 */ - "\xd8\xad\xd9\x85\xd9\x89\0" /* offset 13075 */ - "\xd8\xb3\xd8\xad\xd8\xac\0" /* offset 13082 */ - "\xd8\xb3\xd8\xac\xd8\xad\0" /* offset 13089 */ - "\xd8\xb3\xd8\xac\xd9\x89\0" /* offset 13096 */ - "\xd8\xb3\xd9\x85\xd8\xad\0" /* offset 13103 */ - "\xd8\xb3\xd9\x85\xd8\xac\0" /* offset 13110 */ - "\xd8\xb3\xd9\x85\xd9\x85\0" /* offset 13117 */ - "\xd8\xb5\xd8\xad\xd8\xad\0" /* offset 13124 */ - "\xd8\xb5\xd9\x85\xd9\x85\0" /* offset 13131 */ - "\xd8\xb4\xd8\xad\xd9\x85\0" /* offset 13138 */ - "\xd8\xb4\xd8\xac\xd9\x8a\0" /* offset 13145 */ - "\xd8\xb4\xd9\x85\xd8\xae\0" /* offset 13152 */ - "\xd8\xb4\xd9\x85\xd9\x85\0" /* offset 13159 */ - "\xd8\xb6\xd8\xad\xd9\x89\0" /* offset 13166 */ - "\xd8\xb6\xd8\xae\xd9\x85\0" /* offset 13173 */ - "\xd8\xb7\xd9\x85\xd8\xad\0" /* offset 13180 */ - "\xd8\xb7\xd9\x85\xd9\x85\0" /* offset 13187 */ - "\xd8\xb7\xd9\x85\xd9\x8a\0" /* offset 13194 */ - "\xd8\xb9\xd8\xac\xd9\x85\0" /* offset 13201 */ - "\xd8\xb9\xd9\x85\xd9\x85\0" /* offset 13208 */ - "\xd8\xb9\xd9\x85\xd9\x89\0" /* offset 13215 */ - "\xd8\xba\xd9\x85\xd9\x85\0" /* offset 13222 */ - "\xd8\xba\xd9\x85\xd9\x8a\0" /* offset 13229 */ - "\xd8\xba\xd9\x85\xd9\x89\0" /* offset 13236 */ - "\xd9\x81\xd8\xae\xd9\x85\0" /* offset 13243 */ - "\xd9\x82\xd9\x85\xd8\xad\0" /* offset 13250 */ - "\xd9\x82\xd9\x85\xd9\x85\0" /* offset 13257 */ - "\xd9\x84\xd8\xad\xd9\x85\0" /* offset 13264 */ - "\xd9\x84\xd8\xad\xd9\x8a\0" /* offset 13271 */ - "\xd9\x84\xd8\xad\xd9\x89\0" /* offset 13278 */ - "\xd9\x84\xd8\xac\xd8\xac\0" /* offset 13285 */ - "\xd9\x84\xd8\xae\xd9\x85\0" /* offset 13292 */ - "\xd9\x84\xd9\x85\xd8\xad\0" /* offset 13299 */ - "\xd9\x85\xd8\xad\xd8\xac\0" /* offset 13306 */ - "\xd9\x85\xd8\xad\xd9\x85\0" /* offset 13313 */ - "\xd9\x85\xd8\xad\xd9\x8a\0" /* offset 13320 */ - "\xd9\x85\xd8\xac\xd8\xad\0" /* offset 13327 */ - "\xd9\x85\xd8\xac\xd9\x85\0" /* offset 13334 */ - "\xd9\x85\xd8\xae\xd8\xac\0" /* offset 13341 */ - "\xd9\x85\xd8\xae\xd9\x85\0" /* offset 13348 */ - "\xd9\x85\xd8\xac\xd8\xae\0" /* offset 13355 */ - "\xd9\x87\xd9\x85\xd8\xac\0" /* offset 13362 */ - "\xd9\x87\xd9\x85\xd9\x85\0" /* offset 13369 */ - "\xd9\x86\xd8\xad\xd9\x85\0" /* offset 13376 */ - "\xd9\x86\xd8\xad\xd9\x89\0" /* offset 13383 */ - "\xd9\x86\xd8\xac\xd9\x85\0" /* offset 13390 */ - "\xd9\x86\xd8\xac\xd9\x89\0" /* offset 13397 */ - "\xd9\x86\xd9\x85\xd9\x8a\0" /* offset 13404 */ - "\xd9\x86\xd9\x85\xd9\x89\0" /* offset 13411 */ - "\xd9\x8a\xd9\x85\xd9\x85\0" /* offset 13418 */ - "\xd8\xa8\xd8\xae\xd9\x8a\0" /* offset 13425 */ - "\xd8\xaa\xd8\xac\xd9\x8a\0" /* offset 13432 */ - "\xd8\xaa\xd8\xac\xd9\x89\0" /* offset 13439 */ - "\xd8\xaa\xd8\xae\xd9\x8a\0" /* offset 13446 */ - "\xd8\xaa\xd8\xae\xd9\x89\0" /* offset 13453 */ - "\xd8\xaa\xd9\x85\xd9\x8a\0" /* offset 13460 */ - "\xd8\xaa\xd9\x85\xd9\x89\0" /* offset 13467 */ - "\xd8\xac\xd9\x85\xd9\x8a\0" /* offset 13474 */ - "\xd8\xac\xd8\xad\xd9\x89\0" /* offset 13481 */ - "\xd8\xac\xd9\x85\xd9\x89\0" /* offset 13488 */ - "\xd8\xb3\xd8\xae\xd9\x89\0" /* offset 13495 */ - "\xd8\xb5\xd8\xad\xd9\x8a\0" /* offset 13502 */ - "\xd8\xb4\xd8\xad\xd9\x8a\0" /* offset 13509 */ - "\xd8\xb6\xd8\xad\xd9\x8a\0" /* offset 13516 */ - "\xd9\x84\xd8\xac\xd9\x8a\0" /* offset 13523 */ - "\xd9\x84\xd9\x85\xd9\x8a\0" /* offset 13530 */ - "\xd9\x8a\xd8\xad\xd9\x8a\0" /* offset 13537 */ - "\xd9\x8a\xd8\xac\xd9\x8a\0" /* offset 13544 */ - "\xd9\x8a\xd9\x85\xd9\x8a\0" /* offset 13551 */ - "\xd9\x85\xd9\x85\xd9\x8a\0" /* offset 13558 */ - "\xd9\x82\xd9\x85\xd9\x8a\0" /* offset 13565 */ - "\xd9\x86\xd8\xad\xd9\x8a\0" /* offset 13572 */ - "\xd8\xb9\xd9\x85\xd9\x8a\0" /* offset 13579 */ - "\xd9\x83\xd9\x85\xd9\x8a\0" /* offset 13586 */ - "\xd9\x86\xd8\xac\xd8\xad\0" /* offset 13593 */ - "\xd9\x85\xd8\xae\xd9\x8a\0" /* offset 13600 */ - "\xd9\x84\xd8\xac\xd9\x85\0" /* offset 13607 */ - "\xd9\x83\xd9\x85\xd9\x85\0" /* offset 13614 */ - "\xd8\xac\xd8\xad\xd9\x8a\0" /* offset 13621 */ - "\xd8\xad\xd8\xac\xd9\x8a\0" /* offset 13628 */ - "\xd9\x85\xd8\xac\xd9\x8a\0" /* offset 13635 */ - "\xd9\x81\xd9\x85\xd9\x8a\0" /* offset 13642 */ - "\xd8\xa8\xd8\xad\xd9\x8a\0" /* offset 13649 */ - "\xd8\xb3\xd8\xae\xd9\x8a\0" /* offset 13656 */ - "\xd9\x86\xd8\xac\xd9\x8a\0" /* offset 13663 */ - "\xd8\xb5\xd9\x84\xdb\x92\0" /* offset 13670 */ - "\xd9\x82\xd9\x84\xdb\x92\0" /* offset 13677 */ - "\xd8\xa7\xd9\x84\xd9\x84\xd9\x87\0" /* offset 13684 */ - "\xd8\xa7\xd9\x83\xd8\xa8\xd8\xb1\0" /* offset 13693 */ - "\xd9\x85\xd8\xad\xd9\x85\xd8\xaf\0" /* offset 13702 */ - "\xd8\xb5\xd9\x84\xd8\xb9\xd9\x85\0" /* offset 13711 */ - "\xd8\xb1\xd8\xb3\xd9\x88\xd9\x84\0" /* offset 13720 */ - "\xd8\xb9\xd9\x84\xd9\x8a\xd9\x87\0" /* offset 13729 */ - "\xd9\x88\xd8\xb3\xd9\x84\xd9\x85\0" /* offset 13738 */ - "\xd8\xb5\xd9\x84\xd9\x89\0" /* offset 13747 */ - "\xd8\xb5\xd9\x84\xd9\x89\x20\xd8\xa7\xd9\x84\xd9\x84\xd9\x87\x20\xd8\xb9\xd9\x84\xd9\x8a\xd9\x87\x20\xd9\x88\xd8\xb3\xd9\x84\xd9\x85\0" /* offset 13754 */ - "\xd8\xac\xd9\x84\x20\xd8\xac\xd9\x84\xd8\xa7\xd9\x84\xd9\x87\0" /* offset 13788 */ - "\xd8\xb1\xdb\x8c\xd8\xa7\xd9\x84\0" /* offset 13804 */ - "\xe2\x80\x94\0" /* offset 13813 */ - "\xe2\x80\x93\0" /* offset 13817 */ - "\x5f\0" /* offset 13821 */ - "\x7b\0" /* offset 13823 */ - "\x7d\0" /* offset 13825 */ - "\xe3\x80\x94\0" /* offset 13827 */ - "\xe3\x80\x95\0" /* offset 13831 */ - "\xe3\x80\x90\0" /* offset 13835 */ - "\xe3\x80\x91\0" /* offset 13839 */ - "\xe3\x80\x8a\0" /* offset 13843 */ - "\xe3\x80\x8b\0" /* offset 13847 */ - "\xe3\x80\x8c\0" /* offset 13851 */ - "\xe3\x80\x8d\0" /* offset 13855 */ - "\xe3\x80\x8e\0" /* offset 13859 */ - "\xe3\x80\x8f\0" /* offset 13863 */ - "\x2c\0" /* offset 13867 */ - "\xe3\x80\x81\0" /* offset 13869 */ - "\x3a\0" /* offset 13873 */ - "\x3f\0" /* offset 13875 */ - "\x21\0" /* offset 13877 */ - "\x23\0" /* offset 13879 */ - "\x26\0" /* offset 13881 */ - "\x2a\0" /* offset 13883 */ - "\x2d\0" /* offset 13885 */ - "\x3c\0" /* offset 13887 */ - "\x3e\0" /* offset 13889 */ - "\x5c\0" /* offset 13891 */ - "\x24\0" /* offset 13893 */ - "\x25\0" /* offset 13895 */ - "\x40\0" /* offset 13897 */ - "\x20\xd9\x8b\0" /* offset 13899 */ - "\xd9\x80\xd9\x8b\0" /* offset 13903 */ - "\x20\xd9\x8c\0" /* offset 13908 */ - "\x20\xd9\x8d\0" /* offset 13912 */ - "\x20\xd9\x8e\0" /* offset 13916 */ - "\xd9\x80\xd9\x8e\0" /* offset 13920 */ - "\x20\xd9\x8f\0" /* offset 13925 */ - "\xd9\x80\xd9\x8f\0" /* offset 13929 */ - "\x20\xd9\x90\0" /* offset 13934 */ - "\xd9\x80\xd9\x90\0" /* offset 13938 */ - "\x20\xd9\x91\0" /* offset 13943 */ - "\xd9\x80\xd9\x91\0" /* offset 13947 */ - "\x20\xd9\x92\0" /* offset 13952 */ - "\xd9\x80\xd9\x92\0" /* offset 13956 */ - "\xd8\xa1\0" /* offset 13961 */ - "\xd8\xa7\0" /* offset 13964 */ - "\xd8\xa8\0" /* offset 13967 */ - "\xd8\xa9\0" /* offset 13970 */ - "\xd8\xaa\0" /* offset 13973 */ - "\xd8\xab\0" /* offset 13976 */ - "\xd8\xac\0" /* offset 13979 */ - "\xd8\xad\0" /* offset 13982 */ - "\xd8\xae\0" /* offset 13985 */ - "\xd8\xaf\0" /* offset 13988 */ - "\xd8\xb0\0" /* offset 13991 */ - "\xd8\xb1\0" /* offset 13994 */ - "\xd8\xb2\0" /* offset 13997 */ - "\xd8\xb3\0" /* offset 14000 */ - "\xd8\xb4\0" /* offset 14003 */ - "\xd8\xb5\0" /* offset 14006 */ - "\xd8\xb6\0" /* offset 14009 */ - "\xd8\xb7\0" /* offset 14012 */ - "\xd8\xb8\0" /* offset 14015 */ - "\xd8\xb9\0" /* offset 14018 */ - "\xd8\xba\0" /* offset 14021 */ - "\xd9\x81\0" /* offset 14024 */ - "\xd9\x82\0" /* offset 14027 */ - "\xd9\x83\0" /* offset 14030 */ - "\xd9\x84\0" /* offset 14033 */ - "\xd9\x85\0" /* offset 14036 */ - "\xd9\x86\0" /* offset 14039 */ - "\xd9\x87\0" /* offset 14042 */ - "\xd9\x88\0" /* offset 14045 */ - "\xd9\x8a\0" /* offset 14048 */ - "\xd9\x84\xd8\xa7\xd9\x93\0" /* offset 14051 */ - "\xd9\x84\xd8\xa7\xd9\x94\0" /* offset 14058 */ - "\xd9\x84\xd8\xa7\xd9\x95\0" /* offset 14065 */ - "\xd9\x84\xd8\xa7\0" /* offset 14072 */ - "\x22\0" /* offset 14077 */ - "\x27\0" /* offset 14079 */ - "\x2f\0" /* offset 14081 */ - "\x5b\0" /* offset 14083 */ - "\x5d\0" /* offset 14085 */ - "\x5e\0" /* offset 14087 */ - "\x7c\0" /* offset 14089 */ - "\x7e\0" /* offset 14091 */ - "\xe2\xa6\x85\0" /* offset 14093 */ - "\xe2\xa6\x86\0" /* offset 14097 */ - "\xe3\x80\x82\0" /* offset 14101 */ - "\xe3\x83\xbb\0" /* offset 14105 */ - "\xe3\x82\xa1\0" /* offset 14109 */ - "\xe3\x82\xa3\0" /* offset 14113 */ - "\xe3\x82\xa5\0" /* offset 14117 */ - "\xe3\x82\xa7\0" /* offset 14121 */ - "\xe3\x82\xa9\0" /* offset 14125 */ - "\xe3\x83\xa3\0" /* offset 14129 */ - "\xe3\x83\xa5\0" /* offset 14133 */ - "\xe3\x83\xa7\0" /* offset 14137 */ - "\xe3\x83\x83\0" /* offset 14141 */ - "\xe3\x83\xbc\0" /* offset 14145 */ - "\xe3\x83\xb3\0" /* offset 14149 */ - "\xe3\x82\x99\0" /* offset 14153 */ - "\xe3\x82\x9a\0" /* offset 14157 */ - "\xc2\xa2\0" /* offset 14161 */ - "\xc2\xa3\0" /* offset 14164 */ - "\xc2\xac\0" /* offset 14167 */ - "\xc2\xa6\0" /* offset 14170 */ - "\xc2\xa5\0" /* offset 14173 */ - "\xe2\x82\xa9\0" /* offset 14176 */ - "\xe2\x94\x82\0" /* offset 14180 */ - "\xe2\x86\x90\0" /* offset 14184 */ - "\xe2\x86\x91\0" /* offset 14188 */ - "\xe2\x86\x92\0" /* offset 14192 */ - "\xe2\x86\x93\0" /* offset 14196 */ - "\xe2\x96\xa0\0" /* offset 14200 */ - "\xe2\x97\x8b\0" /* offset 14204 */ - "\xf0\x9d\x85\x97\xf0\x9d\x85\xa5\0" /* offset 14208 */ - "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\0" /* offset 14217 */ - "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 14226 */ - "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 14239 */ - "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb0\0" /* offset 14252 */ - "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb1\0" /* offset 14265 */ - "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb2\0" /* offset 14278 */ - "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\0" /* offset 14291 */ - "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\0" /* offset 14300 */ - "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 14309 */ - "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 14322 */ - "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 14335 */ - "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 14348 */ - "\xce\x91\0" /* offset 14361 */ - "\xce\x92\0" /* offset 14364 */ - "\xce\x94\0" /* offset 14367 */ - "\xce\x95\0" /* offset 14370 */ - "\xce\x96\0" /* offset 14373 */ - "\xce\x97\0" /* offset 14376 */ - "\xce\x99\0" /* offset 14379 */ - "\xce\x9a\0" /* offset 14382 */ - "\xce\x9b\0" /* offset 14385 */ - "\xce\x9c\0" /* offset 14388 */ - "\xce\x9d\0" /* offset 14391 */ - "\xce\x9e\0" /* offset 14394 */ - "\xce\x9f\0" /* offset 14397 */ - "\xce\xa1\0" /* offset 14400 */ - "\xce\xa3\0" /* offset 14403 */ - "\xce\xa4\0" /* offset 14406 */ - "\xce\xa6\0" /* offset 14409 */ - "\xce\xa7\0" /* offset 14412 */ - "\xce\xa8\0" /* offset 14415 */ - "\xe2\x88\x87\0" /* offset 14418 */ - "\xce\xb1\0" /* offset 14422 */ - "\xce\xb4\0" /* offset 14425 */ - "\xce\xb6\0" /* offset 14428 */ - "\xce\xb7\0" /* offset 14431 */ - "\xce\xbb\0" /* offset 14434 */ - "\xce\xbd\0" /* offset 14437 */ - "\xce\xbe\0" /* offset 14440 */ - "\xce\xbf\0" /* offset 14443 */ - "\xcf\x83\0" /* offset 14446 */ - "\xcf\x84\0" /* offset 14449 */ - "\xcf\x85\0" /* offset 14452 */ - "\xcf\x87\0" /* offset 14455 */ - "\xcf\x88\0" /* offset 14458 */ - "\xcf\x89\0" /* offset 14461 */ - "\xe2\x88\x82\0" /* offset 14464 */ - "\xe4\xb8\xbd\0" /* offset 14468 */ - "\xe4\xb8\xb8\0" /* offset 14472 */ - "\xe4\xb9\x81\0" /* offset 14476 */ - "\xf0\xa0\x84\xa2\0" /* offset 14480 */ - "\xe4\xbd\xa0\0" /* offset 14485 */ - "\xe4\xbe\xbb\0" /* offset 14489 */ - "\xe5\x80\x82\0" /* offset 14493 */ - "\xe5\x81\xba\0" /* offset 14497 */ - "\xe5\x82\x99\0" /* offset 14501 */ - "\xe5\x83\x8f\0" /* offset 14505 */ - "\xe3\x92\x9e\0" /* offset 14509 */ - "\xf0\xa0\x98\xba\0" /* offset 14513 */ - "\xe5\x85\x94\0" /* offset 14518 */ - "\xe5\x85\xa4\0" /* offset 14522 */ - "\xe5\x85\xb7\0" /* offset 14526 */ - "\xf0\xa0\x94\x9c\0" /* offset 14530 */ - "\xe3\x92\xb9\0" /* offset 14535 */ - "\xe5\x85\xa7\0" /* offset 14539 */ - "\xe5\x86\x8d\0" /* offset 14543 */ - "\xf0\xa0\x95\x8b\0" /* offset 14547 */ - "\xe5\x86\x97\0" /* offset 14552 */ - "\xe5\x86\xa4\0" /* offset 14556 */ - "\xe4\xbb\x8c\0" /* offset 14560 */ - "\xe5\x86\xac\0" /* offset 14564 */ - "\xe5\x86\xb5\0" /* offset 14568 */ - "\xf0\xa9\x87\x9f\0" /* offset 14572 */ - "\xe5\x88\x83\0" /* offset 14577 */ - "\xe3\x93\x9f\0" /* offset 14581 */ - "\xe5\x88\xbb\0" /* offset 14585 */ - "\xe5\x89\x86\0" /* offset 14589 */ - "\xe5\x89\xb2\0" /* offset 14593 */ - "\xe5\x89\xb7\0" /* offset 14597 */ - "\xe3\x94\x95\0" /* offset 14601 */ - "\xe5\x8b\x87\0" /* offset 14605 */ - "\xe5\x8b\xba\0" /* offset 14609 */ - "\xe5\x8c\x85\0" /* offset 14613 */ - "\xe5\x8c\x86\0" /* offset 14617 */ - "\xe5\x8d\x89\0" /* offset 14621 */ - "\xe5\x8d\x9a\0" /* offset 14625 */ - "\xe5\x8d\xb3\0" /* offset 14629 */ - "\xe5\x8d\xbd\0" /* offset 14633 */ - "\xe5\x8d\xbf\0" /* offset 14637 */ - "\xf0\xa0\xa8\xac\0" /* offset 14641 */ - "\xe7\x81\xb0\0" /* offset 14646 */ - "\xe5\x8f\x8a\0" /* offset 14650 */ - "\xe5\x8f\x9f\0" /* offset 14654 */ - "\xf0\xa0\xad\xa3\0" /* offset 14658 */ - "\xe5\x8f\xab\0" /* offset 14663 */ - "\xe5\x8f\xb1\0" /* offset 14667 */ - "\xe5\x90\x86\0" /* offset 14671 */ - "\xe5\x92\x9e\0" /* offset 14675 */ - "\xe5\x90\xb8\0" /* offset 14679 */ - "\xe5\x91\x88\0" /* offset 14683 */ - "\xe5\x91\xa8\0" /* offset 14687 */ - "\xe5\x92\xa2\0" /* offset 14691 */ - "\xe5\x93\xb6\0" /* offset 14695 */ - "\xe5\x94\x90\0" /* offset 14699 */ - "\xe5\x95\x93\0" /* offset 14703 */ - "\xe5\x95\xa3\0" /* offset 14707 */ - "\xe5\x96\x84\0" /* offset 14711 */ - "\xe5\x96\x99\0" /* offset 14715 */ - "\xe5\x96\xab\0" /* offset 14719 */ - "\xe5\x96\xb3\0" /* offset 14723 */ - "\xe5\x97\x82\0" /* offset 14727 */ - "\xe5\x9c\x96\0" /* offset 14731 */ - "\xe5\x9c\x97\0" /* offset 14735 */ - "\xe5\x99\x91\0" /* offset 14739 */ - "\xe5\x99\xb4\0" /* offset 14743 */ - "\xe5\xa3\xae\0" /* offset 14747 */ - "\xe5\x9f\x8e\0" /* offset 14751 */ - "\xe5\x9f\xb4\0" /* offset 14755 */ - "\xe5\xa0\x8d\0" /* offset 14759 */ - "\xe5\x9e\x8b\0" /* offset 14763 */ - "\xe5\xa0\xb2\0" /* offset 14767 */ - "\xe5\xa0\xb1\0" /* offset 14771 */ - "\xe5\xa2\xac\0" /* offset 14775 */ - "\xf0\xa1\x93\xa4\0" /* offset 14779 */ - "\xe5\xa3\xb2\0" /* offset 14784 */ - "\xe5\xa3\xb7\0" /* offset 14788 */ - "\xe5\xa4\x86\0" /* offset 14792 */ - "\xe5\xa4\x9a\0" /* offset 14796 */ - "\xe5\xa4\xa2\0" /* offset 14800 */ - "\xe5\xa5\xa2\0" /* offset 14804 */ - "\xf0\xa1\x9a\xa8\0" /* offset 14808 */ - "\xf0\xa1\x9b\xaa\0" /* offset 14813 */ - "\xe5\xa7\xac\0" /* offset 14818 */ - "\xe5\xa8\x9b\0" /* offset 14822 */ - "\xe5\xa8\xa7\0" /* offset 14826 */ - "\xe5\xa7\x98\0" /* offset 14830 */ - "\xe5\xa9\xa6\0" /* offset 14834 */ - "\xe3\x9b\xae\0" /* offset 14838 */ - "\xf0\xa1\x8d\xaa\0" /* offset 14842 */ - "\xe5\xac\x88\0" /* offset 14847 */ - "\xe5\xac\xbe\0" /* offset 14851 */ - "\xf0\xa1\xa7\x88\0" /* offset 14855 */ - "\xe5\xaf\x83\0" /* offset 14860 */ - "\xe5\xaf\x98\0" /* offset 14864 */ - "\xe5\xaf\xb3\0" /* offset 14868 */ - "\xf0\xa1\xac\x98\0" /* offset 14872 */ - "\xe5\xaf\xbf\0" /* offset 14877 */ - "\xe5\xb0\x86\0" /* offset 14881 */ - "\xe5\xbc\xb3\0" /* offset 14885 */ - "\xe3\x9e\x81\0" /* offset 14889 */ - "\xe5\xb1\xa0\0" /* offset 14893 */ - "\xe5\xb3\x80\0" /* offset 14897 */ - "\xe5\xb2\x8d\0" /* offset 14901 */ - "\xf0\xa1\xb7\xa4\0" /* offset 14905 */ - "\xe5\xb5\x83\0" /* offset 14910 */ - "\xf0\xa1\xb7\xa6\0" /* offset 14914 */ - "\xe5\xb5\xae\0" /* offset 14919 */ - "\xe5\xb5\xab\0" /* offset 14923 */ - "\xe5\xb5\xbc\0" /* offset 14927 */ - "\xe5\xb7\xa1\0" /* offset 14931 */ - "\xe5\xb7\xa2\0" /* offset 14935 */ - "\xe3\xa0\xaf\0" /* offset 14939 */ - "\xe5\xb7\xbd\0" /* offset 14943 */ - "\xe5\xb8\xa8\0" /* offset 14947 */ - "\xe5\xb8\xbd\0" /* offset 14951 */ - "\xe5\xb9\xa9\0" /* offset 14955 */ - "\xe3\xa1\xa2\0" /* offset 14959 */ - "\xf0\xa2\x86\x83\0" /* offset 14963 */ - "\xe3\xa1\xbc\0" /* offset 14968 */ - "\xe5\xba\xb0\0" /* offset 14972 */ - "\xe5\xba\xb3\0" /* offset 14976 */ - "\xe5\xba\xb6\0" /* offset 14980 */ - "\xf0\xaa\x8e\x92\0" /* offset 14984 */ - "\xf0\xa2\x8c\xb1\0" /* offset 14989 */ - "\xe8\x88\x81\0" /* offset 14994 */ - "\xe5\xbc\xa2\0" /* offset 14998 */ - "\xe3\xa3\x87\0" /* offset 15002 */ - "\xf0\xa3\x8a\xb8\0" /* offset 15006 */ - "\xf0\xa6\x87\x9a\0" /* offset 15011 */ - "\xe5\xbd\xa2\0" /* offset 15016 */ - "\xe5\xbd\xab\0" /* offset 15020 */ - "\xe3\xa3\xa3\0" /* offset 15024 */ - "\xe5\xbe\x9a\0" /* offset 15028 */ - "\xe5\xbf\x8d\0" /* offset 15032 */ - "\xe5\xbf\x97\0" /* offset 15036 */ - "\xe5\xbf\xb9\0" /* offset 15040 */ - "\xe6\x82\x81\0" /* offset 15044 */ - "\xe3\xa4\xba\0" /* offset 15048 */ - "\xe3\xa4\x9c\0" /* offset 15052 */ - "\xf0\xa2\x9b\x94\0" /* offset 15056 */ - "\xe6\x83\x87\0" /* offset 15061 */ - "\xe6\x85\x88\0" /* offset 15065 */ - "\xe6\x85\x8c\0" /* offset 15069 */ - "\xe6\x85\x8e\0" /* offset 15073 */ - "\xe6\x85\xba\0" /* offset 15077 */ - "\xe6\x86\xb2\0" /* offset 15081 */ - "\xe6\x86\xa4\0" /* offset 15085 */ - "\xe6\x86\xaf\0" /* offset 15089 */ - "\xe6\x87\x9e\0" /* offset 15093 */ - "\xe6\x88\x90\0" /* offset 15097 */ - "\xe6\x88\x9b\0" /* offset 15101 */ - "\xe6\x89\x9d\0" /* offset 15105 */ - "\xe6\x8a\xb1\0" /* offset 15109 */ - "\xe6\x8b\x94\0" /* offset 15113 */ - "\xe6\x8d\x90\0" /* offset 15117 */ - "\xf0\xa2\xac\x8c\0" /* offset 15121 */ - "\xe6\x8c\xbd\0" /* offset 15126 */ - "\xe6\x8b\xbc\0" /* offset 15130 */ - "\xe6\x8d\xa8\0" /* offset 15134 */ - "\xe6\x8e\x83\0" /* offset 15138 */ - "\xe6\x8f\xa4\0" /* offset 15142 */ - "\xf0\xa2\xaf\xb1\0" /* offset 15146 */ - "\xe6\x90\xa2\0" /* offset 15151 */ - "\xe6\x8f\x85\0" /* offset 15155 */ - "\xe6\x8e\xa9\0" /* offset 15159 */ - "\xe3\xa8\xae\0" /* offset 15163 */ - "\xe6\x91\xa9\0" /* offset 15167 */ - "\xe6\x91\xbe\0" /* offset 15171 */ - "\xe6\x92\x9d\0" /* offset 15175 */ - "\xe6\x91\xb7\0" /* offset 15179 */ - "\xe3\xa9\xac\0" /* offset 15183 */ - "\xe6\x95\xac\0" /* offset 15187 */ - "\xf0\xa3\x80\x8a\0" /* offset 15191 */ - "\xe6\x97\xa3\0" /* offset 15196 */ - "\xe6\x9b\xb8\0" /* offset 15200 */ - "\xe6\x99\x89\0" /* offset 15204 */ - "\xe3\xac\x99\0" /* offset 15208 */ - "\xe3\xac\x88\0" /* offset 15212 */ - "\xe3\xab\xa4\0" /* offset 15216 */ - "\xe5\x86\x92\0" /* offset 15220 */ - "\xe5\x86\x95\0" /* offset 15224 */ - "\xe6\x9c\x80\0" /* offset 15228 */ - "\xe6\x9a\x9c\0" /* offset 15232 */ - "\xe8\x82\xad\0" /* offset 15236 */ - "\xe4\x8f\x99\0" /* offset 15240 */ - "\xe6\x9c\x9b\0" /* offset 15244 */ - "\xe6\x9c\xa1\0" /* offset 15248 */ - "\xe6\x9d\x9e\0" /* offset 15252 */ - "\xe6\x9d\x93\0" /* offset 15256 */ - "\xf0\xa3\x8f\x83\0" /* offset 15260 */ - "\xe3\xad\x89\0" /* offset 15265 */ - "\xe6\x9f\xba\0" /* offset 15269 */ - "\xe6\x9e\x85\0" /* offset 15273 */ - "\xe6\xa1\x92\0" /* offset 15277 */ - "\xf0\xa3\x91\xad\0" /* offset 15281 */ - "\xe6\xa2\x8e\0" /* offset 15286 */ - "\xe6\xa0\x9f\0" /* offset 15290 */ - "\xe6\xa4\x94\0" /* offset 15294 */ - "\xe3\xae\x9d\0" /* offset 15298 */ - "\xe6\xa5\x82\0" /* offset 15302 */ - "\xe6\xa6\xa3\0" /* offset 15306 */ - "\xe6\xa7\xaa\0" /* offset 15310 */ - "\xe6\xaa\xa8\0" /* offset 15314 */ - "\xf0\xa3\x9a\xa3\0" /* offset 15318 */ - "\xe6\xab\x9b\0" /* offset 15323 */ - "\xe3\xb0\x98\0" /* offset 15327 */ - "\xe6\xac\xa1\0" /* offset 15331 */ - "\xf0\xa3\xa2\xa7\0" /* offset 15335 */ - "\xe6\xad\x94\0" /* offset 15340 */ - "\xe3\xb1\x8e\0" /* offset 15344 */ - "\xe6\xad\xb2\0" /* offset 15348 */ - "\xe6\xae\x9f\0" /* offset 15352 */ - "\xe6\xae\xbb\0" /* offset 15356 */ - "\xf0\xa3\xaa\x8d\0" /* offset 15360 */ - "\xf0\xa1\xb4\x8b\0" /* offset 15365 */ - "\xf0\xa3\xab\xba\0" /* offset 15370 */ - "\xe6\xb1\x8e\0" /* offset 15375 */ - "\xf0\xa3\xb2\xbc\0" /* offset 15379 */ - "\xe6\xb2\xbf\0" /* offset 15384 */ - "\xe6\xb3\x8d\0" /* offset 15388 */ - "\xe6\xb1\xa7\0" /* offset 15392 */ - "\xe6\xb4\x96\0" /* offset 15396 */ - "\xe6\xb4\xbe\0" /* offset 15400 */ - "\xe6\xb5\xa9\0" /* offset 15404 */ - "\xe6\xb5\xb8\0" /* offset 15408 */ - "\xe6\xb6\x85\0" /* offset 15412 */ - "\xf0\xa3\xb4\x9e\0" /* offset 15416 */ - "\xe6\xb4\xb4\0" /* offset 15421 */ - "\xe6\xb8\xaf\0" /* offset 15425 */ - "\xe6\xb9\xae\0" /* offset 15429 */ - "\xe3\xb4\xb3\0" /* offset 15433 */ - "\xe6\xbb\x8b\0" /* offset 15437 */ - "\xe6\xbb\x87\0" /* offset 15441 */ - "\xf0\xa3\xbb\x91\0" /* offset 15445 */ - "\xe6\xb7\xb9\0" /* offset 15450 */ - "\xe6\xbd\xae\0" /* offset 15454 */ - "\xf0\xa3\xbd\x9e\0" /* offset 15458 */ - "\xf0\xa3\xbe\x8e\0" /* offset 15463 */ - "\xe6\xbf\x86\0" /* offset 15468 */ - "\xe7\x80\xb9\0" /* offset 15472 */ - "\xe7\x80\x9e\0" /* offset 15476 */ - "\xe7\x80\x9b\0" /* offset 15480 */ - "\xe3\xb6\x96\0" /* offset 15484 */ - "\xe7\x81\x8a\0" /* offset 15488 */ - "\xe7\x81\xbd\0" /* offset 15492 */ - "\xe7\x81\xb7\0" /* offset 15496 */ - "\xe7\x82\xad\0" /* offset 15500 */ - "\xf0\xa0\x94\xa5\0" /* offset 15504 */ - "\xe7\x85\x85\0" /* offset 15509 */ - "\xf0\xa4\x89\xa3\0" /* offset 15513 */ - "\xe7\x86\x9c\0" /* offset 15518 */ - "\xe4\x8e\xab\0" /* offset 15522 */ - "\xe7\x88\xa8\0" /* offset 15526 */ - "\xe7\x88\xb5\0" /* offset 15530 */ - "\xe7\x89\x90\0" /* offset 15534 */ - "\xf0\xa4\x98\x88\0" /* offset 15538 */ - "\xe7\x8a\x80\0" /* offset 15543 */ - "\xe7\x8a\x95\0" /* offset 15547 */ - "\xf0\xa4\x9c\xb5\0" /* offset 15551 */ - "\xf0\xa4\xa0\x94\0" /* offset 15556 */ - "\xe7\x8d\xba\0" /* offset 15561 */ - "\xe7\x8e\x8b\0" /* offset 15565 */ - "\xe3\xba\xac\0" /* offset 15569 */ - "\xe7\x8e\xa5\0" /* offset 15573 */ - "\xe3\xba\xb8\0" /* offset 15577 */ - "\xe7\x91\x87\0" /* offset 15581 */ - "\xe7\x91\x9c\0" /* offset 15585 */ - "\xe7\x91\xb1\0" /* offset 15589 */ - "\xe7\x92\x85\0" /* offset 15593 */ - "\xe7\x93\x8a\0" /* offset 15597 */ - "\xe3\xbc\x9b\0" /* offset 15601 */ - "\xe7\x94\xa4\0" /* offset 15605 */ - "\xf0\xa4\xb0\xb6\0" /* offset 15609 */ - "\xe7\x94\xbe\0" /* offset 15614 */ - "\xf0\xa4\xb2\x92\0" /* offset 15618 */ - "\xf0\xa2\x86\x9f\0" /* offset 15623 */ - "\xe7\x98\x90\0" /* offset 15628 */ - "\xf0\xa4\xbe\xa1\0" /* offset 15632 */ - "\xf0\xa4\xbe\xb8\0" /* offset 15637 */ - "\xf0\xa5\x81\x84\0" /* offset 15642 */ - "\xe3\xbf\xbc\0" /* offset 15647 */ - "\xe4\x80\x88\0" /* offset 15651 */ - "\xe7\x9b\xb4\0" /* offset 15655 */ - "\xf0\xa5\x83\xb3\0" /* offset 15659 */ - "\xf0\xa5\x83\xb2\0" /* offset 15664 */ - "\xf0\xa5\x84\x99\0" /* offset 15669 */ - "\xf0\xa5\x84\xb3\0" /* offset 15674 */ - "\xe7\x9c\x9e\0" /* offset 15679 */ - "\xe7\x9c\x9f\0" /* offset 15683 */ - "\xe7\x9d\x8a\0" /* offset 15687 */ - "\xe4\x80\xb9\0" /* offset 15691 */ - "\xe7\x9e\x8b\0" /* offset 15695 */ - "\xe4\x81\x86\0" /* offset 15699 */ - "\xe4\x82\x96\0" /* offset 15703 */ - "\xf0\xa5\x90\x9d\0" /* offset 15707 */ - "\xe7\xa1\x8e\0" /* offset 15712 */ - "\xe7\xa3\x8c\0" /* offset 15716 */ - "\xe4\x83\xa3\0" /* offset 15720 */ - "\xf0\xa5\x98\xa6\0" /* offset 15724 */ - "\xf0\xa5\x9a\x9a\0" /* offset 15729 */ - "\xf0\xa5\x9b\x85\0" /* offset 15734 */ - "\xe7\xa7\xab\0" /* offset 15739 */ - "\xe4\x84\xaf\0" /* offset 15743 */ - "\xe7\xa9\x8a\0" /* offset 15747 */ - "\xe7\xa9\x8f\0" /* offset 15751 */ - "\xf0\xa5\xa5\xbc\0" /* offset 15755 */ - "\xf0\xa5\xaa\xa7\0" /* offset 15760 */ - "\xe7\xaa\xae\0" /* offset 15765 */ - "\xe4\x88\x82\0" /* offset 15769 */ - "\xf0\xa5\xae\xab\0" /* offset 15773 */ - "\xe7\xaf\x86\0" /* offset 15778 */ - "\xe7\xaf\x89\0" /* offset 15782 */ - "\xe4\x88\xa7\0" /* offset 15786 */ - "\xf0\xa5\xb2\x80\0" /* offset 15790 */ - "\xe7\xb3\x92\0" /* offset 15795 */ - "\xe4\x8a\xa0\0" /* offset 15799 */ - "\xe7\xb3\xa8\0" /* offset 15803 */ - "\xe7\xb3\xa3\0" /* offset 15807 */ - "\xe7\xb4\x80\0" /* offset 15811 */ - "\xf0\xa5\xbe\x86\0" /* offset 15815 */ - "\xe7\xb5\xa3\0" /* offset 15820 */ - "\xe4\x8c\x81\0" /* offset 15824 */ - "\xe7\xb7\x87\0" /* offset 15828 */ - "\xe7\xb8\x82\0" /* offset 15832 */ - "\xe7\xb9\x85\0" /* offset 15836 */ - "\xe4\x8c\xb4\0" /* offset 15840 */ - "\xf0\xa6\x88\xa8\0" /* offset 15844 */ - "\xf0\xa6\x89\x87\0" /* offset 15849 */ - "\xe4\x8d\x99\0" /* offset 15854 */ - "\xf0\xa6\x8b\x99\0" /* offset 15858 */ - "\xe7\xbd\xba\0" /* offset 15863 */ - "\xf0\xa6\x8c\xbe\0" /* offset 15867 */ - "\xe7\xbe\x95\0" /* offset 15872 */ - "\xe7\xbf\xba\0" /* offset 15876 */ - "\xf0\xa6\x93\x9a\0" /* offset 15880 */ - "\xf0\xa6\x94\xa3\0" /* offset 15885 */ - "\xe8\x81\xa0\0" /* offset 15890 */ - "\xf0\xa6\x96\xa8\0" /* offset 15894 */ - "\xe8\x81\xb0\0" /* offset 15899 */ - "\xf0\xa3\x8d\x9f\0" /* offset 15903 */ - "\xe4\x8f\x95\0" /* offset 15908 */ - "\xe8\x82\xb2\0" /* offset 15912 */ - "\xe8\x84\x83\0" /* offset 15916 */ - "\xe4\x90\x8b\0" /* offset 15920 */ - "\xe8\x84\xbe\0" /* offset 15924 */ - "\xe5\xaa\xb5\0" /* offset 15928 */ - "\xf0\xa6\x9e\xa7\0" /* offset 15932 */ - "\xf0\xa6\x9e\xb5\0" /* offset 15937 */ - "\xf0\xa3\x8e\x93\0" /* offset 15942 */ - "\xf0\xa3\x8e\x9c\0" /* offset 15947 */ - "\xe8\x88\x84\0" /* offset 15952 */ - "\xe8\xbe\x9e\0" /* offset 15956 */ - "\xe4\x91\xab\0" /* offset 15960 */ - "\xe8\x8a\x91\0" /* offset 15964 */ - "\xe8\x8a\x8b\0" /* offset 15968 */ - "\xe8\x8a\x9d\0" /* offset 15972 */ - "\xe5\x8a\xb3\0" /* offset 15976 */ - "\xe8\x8a\xb1\0" /* offset 15980 */ - "\xe8\x8a\xb3\0" /* offset 15984 */ - "\xe8\x8a\xbd\0" /* offset 15988 */ - "\xe8\x8b\xa6\0" /* offset 15992 */ - "\xf0\xa6\xac\xbc\0" /* offset 15996 */ - "\xe8\x8c\x9d\0" /* offset 16001 */ - "\xe8\x8d\xa3\0" /* offset 16005 */ - "\xe8\x8e\xad\0" /* offset 16009 */ - "\xe8\x8c\xa3\0" /* offset 16013 */ - "\xe8\x8e\xbd\0" /* offset 16017 */ - "\xe8\x8f\xa7\0" /* offset 16021 */ - "\xe8\x8d\x93\0" /* offset 16025 */ - "\xe8\x8f\x8a\0" /* offset 16029 */ - "\xe8\x8f\x8c\0" /* offset 16033 */ - "\xe8\x8f\x9c\0" /* offset 16037 */ - "\xf0\xa6\xb0\xb6\0" /* offset 16041 */ - "\xf0\xa6\xb5\xab\0" /* offset 16046 */ - "\xf0\xa6\xb3\x95\0" /* offset 16051 */ - "\xe4\x94\xab\0" /* offset 16056 */ - "\xe8\x93\xb1\0" /* offset 16060 */ - "\xe8\x93\xb3\0" /* offset 16064 */ - "\xe8\x94\x96\0" /* offset 16068 */ - "\xf0\xa7\x8f\x8a\0" /* offset 16072 */ - "\xe8\x95\xa4\0" /* offset 16077 */ - "\xf0\xa6\xbc\xac\0" /* offset 16081 */ - "\xe4\x95\x9d\0" /* offset 16086 */ - "\xe4\x95\xa1\0" /* offset 16090 */ - "\xf0\xa6\xbe\xb1\0" /* offset 16094 */ - "\xf0\xa7\x83\x92\0" /* offset 16099 */ - "\xe4\x95\xab\0" /* offset 16104 */ - "\xe8\x99\x90\0" /* offset 16108 */ - "\xe8\x99\xa7\0" /* offset 16112 */ - "\xe8\x99\xa9\0" /* offset 16116 */ - "\xe8\x9a\xa9\0" /* offset 16120 */ - "\xe8\x9a\x88\0" /* offset 16124 */ - "\xe8\x9c\x8e\0" /* offset 16128 */ - "\xe8\x9b\xa2\0" /* offset 16132 */ - "\xe8\x9d\xb9\0" /* offset 16136 */ - "\xe8\x9c\xa8\0" /* offset 16140 */ - "\xe8\x9d\xab\0" /* offset 16144 */ - "\xe8\x9e\x86\0" /* offset 16148 */ - "\xe4\xb5\x97\0" /* offset 16152 */ - "\xe8\x9f\xa1\0" /* offset 16156 */ - "\xe8\xa0\x81\0" /* offset 16160 */ - "\xe4\x97\xb9\0" /* offset 16164 */ - "\xe8\xa1\xa0\0" /* offset 16168 */ - "\xf0\xa7\x99\xa7\0" /* offset 16172 */ - "\xe8\xa3\x97\0" /* offset 16177 */ - "\xe8\xa3\x9e\0" /* offset 16181 */ - "\xe4\x98\xb5\0" /* offset 16185 */ - "\xe8\xa3\xba\0" /* offset 16189 */ - "\xe3\x92\xbb\0" /* offset 16193 */ - "\xf0\xa7\xa2\xae\0" /* offset 16197 */ - "\xf0\xa7\xa5\xa6\0" /* offset 16202 */ - "\xe4\x9a\xbe\0" /* offset 16207 */ - "\xe4\x9b\x87\0" /* offset 16211 */ - "\xe8\xaa\xa0\0" /* offset 16215 */ - "\xe8\xab\xad\0" /* offset 16219 */ - "\xe8\xae\x8a\0" /* offset 16223 */ - "\xf0\xa7\xb2\xa8\0" /* offset 16227 */ - "\xe8\xb2\xab\0" /* offset 16232 */ - "\xe8\xb3\x81\0" /* offset 16236 */ - "\xe8\xb4\x9b\0" /* offset 16240 */ - "\xe8\xb5\xb7\0" /* offset 16244 */ - "\xf0\xa7\xbc\xaf\0" /* offset 16248 */ - "\xf0\xa0\xa0\x84\0" /* offset 16253 */ - "\xe8\xb7\x8b\0" /* offset 16258 */ - "\xe8\xb6\xbc\0" /* offset 16262 */ - "\xe8\xb7\xb0\0" /* offset 16266 */ - "\xf0\xa0\xa3\x9e\0" /* offset 16270 */ - "\xe8\xbb\x94\0" /* offset 16275 */ - "\xe8\xbc\xb8\0" /* offset 16279 */ - "\xf0\xa8\x97\x92\0" /* offset 16283 */ - "\xf0\xa8\x97\xad\0" /* offset 16288 */ - "\xe9\x82\x94\0" /* offset 16293 */ - "\xe9\x83\xb1\0" /* offset 16297 */ - "\xe9\x84\x91\0" /* offset 16301 */ - "\xf0\xa8\x9c\xae\0" /* offset 16305 */ - "\xe9\x84\x9b\0" /* offset 16310 */ - "\xe9\x88\xb8\0" /* offset 16314 */ - "\xe9\x8b\x97\0" /* offset 16318 */ - "\xe9\x8b\x98\0" /* offset 16322 */ - "\xe9\x89\xbc\0" /* offset 16326 */ - "\xe9\x8f\xb9\0" /* offset 16330 */ - "\xe9\x90\x95\0" /* offset 16334 */ - "\xf0\xa8\xaf\xba\0" /* offset 16338 */ - "\xe9\x96\x8b\0" /* offset 16343 */ - "\xe4\xa6\x95\0" /* offset 16347 */ - "\xe9\x96\xb7\0" /* offset 16351 */ - "\xf0\xa8\xb5\xb7\0" /* offset 16355 */ - "\xe4\xa7\xa6\0" /* offset 16360 */ - "\xe9\x9b\x83\0" /* offset 16364 */ - "\xe5\xb6\xb2\0" /* offset 16368 */ - "\xe9\x9c\xa3\0" /* offset 16372 */ - "\xf0\xa9\x85\x85\0" /* offset 16376 */ - "\xf0\xa9\x88\x9a\0" /* offset 16381 */ - "\xe4\xa9\xae\0" /* offset 16386 */ - "\xe4\xa9\xb6\0" /* offset 16390 */ - "\xe9\x9f\xa0\0" /* offset 16394 */ - "\xf0\xa9\x90\x8a\0" /* offset 16398 */ - "\xe4\xaa\xb2\0" /* offset 16403 */ - "\xf0\xa9\x92\x96\0" /* offset 16407 */ - "\xe9\xa0\x8b\0" /* offset 16412 */ - "\xe9\xa0\xa9\0" /* offset 16416 */ - "\xf0\xa9\x96\xb6\0" /* offset 16420 */ - "\xe9\xa3\xa2\0" /* offset 16425 */ - "\xe4\xac\xb3\0" /* offset 16429 */ - "\xe9\xa4\xa9\0" /* offset 16433 */ - "\xe9\xa6\xa7\0" /* offset 16437 */ - "\xe9\xa7\x82\0" /* offset 16441 */ - "\xe9\xa7\xbe\0" /* offset 16445 */ - "\xe4\xaf\x8e\0" /* offset 16449 */ - "\xf0\xa9\xac\xb0\0" /* offset 16453 */ - "\xe9\xac\x92\0" /* offset 16458 */ - "\xe9\xb1\x80\0" /* offset 16462 */ - "\xe9\xb3\xbd\0" /* offset 16466 */ - "\xe4\xb3\x8e\0" /* offset 16470 */ - "\xe4\xb3\xad\0" /* offset 16474 */ - "\xe9\xb5\xa7\0" /* offset 16478 */ - "\xf0\xaa\x83\x8e\0" /* offset 16482 */ - "\xe4\xb3\xb8\0" /* offset 16487 */ - "\xf0\xaa\x84\x85\0" /* offset 16491 */ - "\xf0\xaa\x88\x8e\0" /* offset 16496 */ - "\xf0\xaa\x8a\x91\0" /* offset 16501 */ - "\xe4\xb5\x96\0" /* offset 16506 */ - "\xe9\xbb\xbe\0" /* offset 16510 */ - "\xe9\xbc\x85\0" /* offset 16514 */ - "\xe9\xbc\x8f\0" /* offset 16518 */ - "\xe9\xbc\x96\0" /* offset 16522 */ - "\xf0\xaa\x98\x80\0" /* offset 16526 */; - -#endif /* DECOMP_H */ diff --git a/3rdParty/LibIDN/src/idn-int.h b/3rdParty/LibIDN/src/idn-int.h deleted file mode 100644 index b63851b..0000000 --- a/3rdParty/LibIDN/src/idn-int.h +++ /dev/null @@ -1,527 +0,0 @@ -/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ -/* Copyright (C) 2001-2002, 2004-2008 Free Software Foundation, Inc. - Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood. - This file is part of gnulib. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2.1, 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - -/* - * ISO C 99 <stdint.h> for platforms that lack it. - * <http://www.opengroup.org/susv3xbd/stdint.h.html> - */ - -#ifndef _GL_STDINT_H - -/* When including a system file that in turn includes <inttypes.h>, - use the system <inttypes.h>, not our substitute. This avoids - problems with (for example) VMS, whose <sys/bitypes.h> includes - <inttypes.h>. */ -#define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H - -/* Get those types that are already defined in other system include - files, so that we can "#define int8_t signed char" below without - worrying about a later system include file containing a "typedef - signed char int8_t;" that will get messed up by our macro. Our - macros should all be consistent with the system versions, except - for the "fast" types and macros, which we recommend against using - in public interfaces due to compiler differences. */ - -#if 1 -# if defined __sgi && ! defined __c99 - /* Bypass IRIX's <stdint.h> if in C89 mode, since it merely annoys users - with "This header file is to be used only for c99 mode compilations" - diagnostics. */ -# define __STDINT_H__ -# endif - /* Other systems may have an incomplete or buggy <stdint.h>. - Include it before <inttypes.h>, since any "#include <stdint.h>" - in <inttypes.h> would reinclude us, skipping our contents because - _GL_STDINT_H is defined. - The include requires a split double-inclusion guard. */ -# if __GNUC__ >= 3 -#pragma GCC system_header -# endif -# include <stdint.h> -#endif - -#if ! defined _GL_STDINT_H && ! defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H -#define _GL_STDINT_H - -/* <sys/types.h> defines some of the stdint.h types as well, on glibc, - IRIX 6.5, and OpenBSD 3.8 (via <machine/types.h>). - AIX 5.2 <sys/types.h> isn't needed and causes troubles. - MacOS X 10.4.6 <sys/types.h> includes <stdint.h> (which is us), but - relies on the system <stdint.h> definitions, so include - <sys/types.h> after <stdint.h>. */ -#if 1 && ! defined _AIX -# include <sys/types.h> -#endif - -/* Get LONG_MIN, LONG_MAX, ULONG_MAX. */ -#include <limits.h> - -#if 1 - /* In OpenBSD 3.8, <inttypes.h> includes <machine/types.h>, which defines - int{8,16,32,64}_t, uint{8,16,32,64}_t and __BIT_TYPES_DEFINED__. - <inttypes.h> also defines intptr_t and uintptr_t. */ -# include <inttypes.h> -#elif 0 - /* Solaris 7 <sys/inttypes.h> has the types except the *_fast*_t types, and - the macros except for *_FAST*_*, INTPTR_MIN, PTRDIFF_MIN, PTRDIFF_MAX. */ -# include <sys/inttypes.h> -#endif - -#if 0 && ! defined __BIT_TYPES_DEFINED__ - /* Linux libc4 >= 4.6.7 and libc5 have a <sys/bitypes.h> that defines - int{8,16,32,64}_t and __BIT_TYPES_DEFINED__. In libc5 >= 5.2.2 it is - included by <sys/types.h>. */ -# include <sys/bitypes.h> -#endif - -#if ! defined __cplusplus || defined __STDC_CONSTANT_MACROS - -/* Get WCHAR_MIN, WCHAR_MAX. */ -# if ! (defined WCHAR_MIN && defined WCHAR_MAX) -/* We don't need WCHAR_* in libidn, so to avoid problems with - missing wchar.h, don't include wchar.h here. */ -# endif - -#endif - -#undef _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H - -/* Minimum and maximum values for a integer type under the usual assumption. - Return an unspecified value if BITS == 0, adding a check to pacify - picky compilers. */ - -#define _STDINT_MIN(signed, bits, zero) \ - ((signed) ? (- ((zero) + 1) << ((bits) ? (bits) - 1 : 0)) : (zero)) - -#define _STDINT_MAX(signed, bits, zero) \ - ((signed) \ - ? ~ _STDINT_MIN (signed, bits, zero) \ - : /* The expression for the unsigned case. The subtraction of (signed) \ - is a nop in the unsigned case and avoids "signed integer overflow" \ - warnings in the signed case. */ \ - ((((zero) + 1) << ((bits) ? (bits) - 1 - (signed) : 0)) - 1) * 2 + 1) - -/* 7.18.1.1. Exact-width integer types */ - -/* Here we assume a standard architecture where the hardware integer - types have 8, 16, 32, optionally 64 bits. */ - -#undef int8_t -#undef uint8_t -#define int8_t signed char -#define uint8_t unsigned char - -#undef int16_t -#undef uint16_t -#define int16_t short int -#define uint16_t unsigned short int - -#undef int32_t -#undef uint32_t -#define int32_t int -#define uint32_t unsigned int - -/* Do not undefine int64_t if gnulib is not being used with 64-bit - types, since otherwise it breaks platforms like Tandem/NSK. */ -#if LONG_MAX >> 31 >> 31 == 1 -# undef int64_t -# define int64_t long int -# define GL_INT64_T -#elif defined _MSC_VER -# undef int64_t -# define int64_t __int64 -# define GL_INT64_T -#elif 1 -# undef int64_t -# define int64_t long long int -# define GL_INT64_T -#endif - -#if ULONG_MAX >> 31 >> 31 >> 1 == 1 -# undef uint64_t -# define uint64_t unsigned long int -# define GL_UINT64_T -#elif defined _MSC_VER -# undef uint64_t -# define uint64_t unsigned __int64 -# define GL_UINT64_T -#elif 1 -# undef uint64_t -# define uint64_t unsigned long long int -# define GL_UINT64_T -#endif - -/* Avoid collision with Solaris 2.5.1 <pthread.h> etc. */ -#define _UINT8_T -#define _UINT32_T -#define _UINT64_T - - -/* 7.18.1.2. Minimum-width integer types */ - -/* Here we assume a standard architecture where the hardware integer - types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types - are the same as the corresponding N_t types. */ - -#undef int_least8_t -#undef uint_least8_t -#undef int_least16_t -#undef uint_least16_t -#undef int_least32_t -#undef uint_least32_t -#undef int_least64_t -#undef uint_least64_t -#define int_least8_t int8_t -#define uint_least8_t uint8_t -#define int_least16_t int16_t -#define uint_least16_t uint16_t -#define int_least32_t int32_t -#define uint_least32_t uint32_t -#ifdef GL_INT64_T -# define int_least64_t int64_t -#endif -#ifdef GL_UINT64_T -# define uint_least64_t uint64_t -#endif - -/* 7.18.1.3. Fastest minimum-width integer types */ - -/* Note: Other <stdint.h> substitutes may define these types differently. - It is not recommended to use these types in public header files. */ - -/* Here we assume a standard architecture where the hardware integer - types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types - are taken from the same list of types. Assume that 'long int' - is fast enough for all narrower integers. */ - -#undef int_fast8_t -#undef uint_fast8_t -#undef int_fast16_t -#undef uint_fast16_t -#undef int_fast32_t -#undef uint_fast32_t -#undef int_fast64_t -#undef uint_fast64_t -#define int_fast8_t long int -#define uint_fast8_t unsigned int_fast8_t -#define int_fast16_t long int -#define uint_fast16_t unsigned int_fast16_t -#define int_fast32_t long int -#define uint_fast32_t unsigned int_fast32_t -#ifdef GL_INT64_T -# define int_fast64_t int64_t -#endif -#ifdef GL_UINT64_T -# define uint_fast64_t uint64_t -#endif - -/* 7.18.1.4. Integer types capable of holding object pointers */ - -#undef intptr_t -#undef uintptr_t -#define intptr_t long int -#define uintptr_t unsigned long int - -/* 7.18.1.5. Greatest-width integer types */ - -/* Note: These types are compiler dependent. It may be unwise to use them in - public header files. */ - -#undef intmax_t -#if 1 && LONG_MAX >> 30 == 1 -# define intmax_t long long int -#elif defined GL_INT64_T -# define intmax_t int64_t -#else -# define intmax_t long int -#endif - -#undef uintmax_t -#if 1 && ULONG_MAX >> 31 == 1 -# define uintmax_t unsigned long long int -#elif defined GL_UINT64_T -# define uintmax_t uint64_t -#else -# define uintmax_t unsigned long int -#endif - -/* Verify that intmax_t and uintmax_t have the same size. Too much code - breaks if this is not the case. If this check fails, the reason is likely - to be found in the autoconf macros. */ -typedef int _verify_intmax_size[2 * (sizeof (intmax_t) == sizeof (uintmax_t)) - 1]; - -/* 7.18.2. Limits of specified-width integer types */ - -#if ! defined __cplusplus || defined __STDC_LIMIT_MACROS - -/* 7.18.2.1. Limits of exact-width integer types */ - -/* Here we assume a standard architecture where the hardware integer - types have 8, 16, 32, optionally 64 bits. */ - -#undef INT8_MIN -#undef INT8_MAX -#undef UINT8_MAX -#define INT8_MIN (~ INT8_MAX) -#define INT8_MAX 127 -#define UINT8_MAX 255 - -#undef INT16_MIN -#undef INT16_MAX -#undef UINT16_MAX -#define INT16_MIN (~ INT16_MAX) -#define INT16_MAX 32767 -#define UINT16_MAX 65535 - -#undef INT32_MIN -#undef INT32_MAX -#undef UINT32_MAX -#define INT32_MIN (~ INT32_MAX) -#define INT32_MAX 2147483647 -#define UINT32_MAX 4294967295U - -#undef INT64_MIN -#undef INT64_MAX -#ifdef GL_INT64_T -/* Prefer (- INTMAX_C (1) << 63) over (~ INT64_MAX) because SunPRO C 5.0 - evaluates the latter incorrectly in preprocessor expressions. */ -# define INT64_MIN (- INTMAX_C (1) << 63) -# define INT64_MAX INTMAX_C (9223372036854775807) -#endif - -#undef UINT64_MAX -#ifdef GL_UINT64_T -# define UINT64_MAX UINTMAX_C (18446744073709551615) -#endif - -/* 7.18.2.2. Limits of minimum-width integer types */ - -/* Here we assume a standard architecture where the hardware integer - types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types - are the same as the corresponding N_t types. */ - -#undef INT_LEAST8_MIN -#undef INT_LEAST8_MAX -#undef UINT_LEAST8_MAX -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define UINT_LEAST8_MAX UINT8_MAX - -#undef INT_LEAST16_MIN -#undef INT_LEAST16_MAX -#undef UINT_LEAST16_MAX -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define UINT_LEAST16_MAX UINT16_MAX - -#undef INT_LEAST32_MIN -#undef INT_LEAST32_MAX -#undef UINT_LEAST32_MAX -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define UINT_LEAST32_MAX UINT32_MAX - -#undef INT_LEAST64_MIN -#undef INT_LEAST64_MAX -#ifdef GL_INT64_T -# define INT_LEAST64_MIN INT64_MIN -# define INT_LEAST64_MAX INT64_MAX -#endif - -#undef UINT_LEAST64_MAX -#ifdef GL_UINT64_T -# define UINT_LEAST64_MAX UINT64_MAX -#endif - -/* 7.18.2.3. Limits of fastest minimum-width integer types */ - -/* Here we assume a standard architecture where the hardware integer - types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types - are taken from the same list of types. */ - -#undef INT_FAST8_MIN -#undef INT_FAST8_MAX -#undef UINT_FAST8_MAX -#define INT_FAST8_MIN LONG_MIN -#define INT_FAST8_MAX LONG_MAX -#define UINT_FAST8_MAX ULONG_MAX - -#undef INT_FAST16_MIN -#undef INT_FAST16_MAX -#undef UINT_FAST16_MAX -#define INT_FAST16_MIN LONG_MIN -#define INT_FAST16_MAX LONG_MAX -#define UINT_FAST16_MAX ULONG_MAX - -#undef INT_FAST32_MIN -#undef INT_FAST32_MAX -#undef UINT_FAST32_MAX -#define INT_FAST32_MIN LONG_MIN -#define INT_FAST32_MAX LONG_MAX -#define UINT_FAST32_MAX ULONG_MAX - -#undef INT_FAST64_MIN -#undef INT_FAST64_MAX -#ifdef GL_INT64_T -# define INT_FAST64_MIN INT64_MIN -# define INT_FAST64_MAX INT64_MAX -#endif - -#undef UINT_FAST64_MAX -#ifdef GL_UINT64_T -# define UINT_FAST64_MAX UINT64_MAX -#endif - -/* 7.18.2.4. Limits of integer types capable of holding object pointers */ - -#undef INTPTR_MIN -#undef INTPTR_MAX -#undef UINTPTR_MAX -#define INTPTR_MIN LONG_MIN -#define INTPTR_MAX LONG_MAX -#define UINTPTR_MAX ULONG_MAX - -/* 7.18.2.5. Limits of greatest-width integer types */ - -#undef INTMAX_MIN -#undef INTMAX_MAX -#ifdef INT64_MAX -# define INTMAX_MIN INT64_MIN -# define INTMAX_MAX INT64_MAX -#else -# define INTMAX_MIN INT32_MIN -# define INTMAX_MAX INT32_MAX -#endif - -#undef UINTMAX_MAX -#ifdef UINT64_MAX -# define UINTMAX_MAX UINT64_MAX -#else -# define UINTMAX_MAX UINT32_MAX -#endif - -/* 7.18.3. Limits of other integer types */ - -/* ptrdiff_t limits */ -#undef PTRDIFF_MIN -#undef PTRDIFF_MAX -#define PTRDIFF_MIN \ - _STDINT_MIN (1, 32, 0) -#define PTRDIFF_MAX \ - _STDINT_MAX (1, 32, 0) - -/* sig_atomic_t limits */ -#undef SIG_ATOMIC_MIN -#undef SIG_ATOMIC_MAX -#define SIG_ATOMIC_MIN \ - _STDINT_MIN (1, 32, \ - 0) -#define SIG_ATOMIC_MAX \ - _STDINT_MAX (1, 32, \ - 0) - - -/* size_t limit */ -#undef SIZE_MAX -#define SIZE_MAX _STDINT_MAX (0, 32, 0ul) - -/* wchar_t limits */ -#undef WCHAR_MIN -#undef WCHAR_MAX -#define WCHAR_MIN \ - _STDINT_MIN (1, 32, 0) -#define WCHAR_MAX \ - _STDINT_MAX (1, 32, 0) - -/* wint_t limits */ -#undef WINT_MIN -#undef WINT_MAX -#define WINT_MIN \ - _STDINT_MIN (1, 32, 0) -#define WINT_MAX \ - _STDINT_MAX (1, 32, 0) - -#endif /* !defined __cplusplus || defined __STDC_LIMIT_MACROS */ - -/* 7.18.4. Macros for integer constants */ - -#if ! defined __cplusplus || defined __STDC_CONSTANT_MACROS - -/* 7.18.4.1. Macros for minimum-width integer constants */ -/* According to ISO C 99 Technical Corrigendum 1 */ - -/* Here we assume a standard architecture where the hardware integer - types have 8, 16, 32, optionally 64 bits, and int is 32 bits. */ - -#undef INT8_C -#undef UINT8_C -#define INT8_C(x) x -#define UINT8_C(x) x - -#undef INT16_C -#undef UINT16_C -#define INT16_C(x) x -#define UINT16_C(x) x - -#undef INT32_C -#undef UINT32_C -#define INT32_C(x) x -#define UINT32_C(x) x ## U - -#undef INT64_C -#undef UINT64_C -#if LONG_MAX >> 31 >> 31 == 1 -# define INT64_C(x) x##L -#elif defined _MSC_VER -# define INT64_C(x) x##i64 -#elif 1 -# define INT64_C(x) x##LL -#endif -#if ULONG_MAX >> 31 >> 31 >> 1 == 1 -# define UINT64_C(x) x##UL -#elif defined _MSC_VER -# define UINT64_C(x) x##ui64 -#elif 1 -# define UINT64_C(x) x##ULL -#endif - -/* 7.18.4.2. Macros for greatest-width integer constants */ - -#undef INTMAX_C -#if 1 && LONG_MAX >> 30 == 1 -# define INTMAX_C(x) x##LL -#elif defined GL_INT64_T -# define INTMAX_C(x) INT64_C(x) -#else -# define INTMAX_C(x) x##L -#endif - -#undef UINTMAX_C -#if 1 && ULONG_MAX >> 31 == 1 -# define UINTMAX_C(x) x##ULL -#elif defined GL_UINT64_T -# define UINTMAX_C(x) UINT64_C(x) -#else -# define UINTMAX_C(x) x##UL -#endif - -#endif /* !defined __cplusplus || defined __STDC_CONSTANT_MACROS */ - -#endif /* _GL_STDINT_H */ -#endif /* !defined _GL_STDINT_H && !defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H */ diff --git a/3rdParty/LibIDN/src/idna.c b/3rdParty/LibIDN/src/idna.c deleted file mode 100644 index 8061086..0000000 --- a/3rdParty/LibIDN/src/idna.c +++ /dev/null @@ -1,846 +0,0 @@ -/* idna.c --- Convert to or from IDN strings. - * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Simon Josefsson - * - * This file is part of GNU Libidn. - * - * GNU Libidn is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * GNU Libidn 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with GNU Libidn; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - * - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdlib.h> -#include <string.h> -#include <stringprep.h> -#include <punycode.h> - -#include "idna.h" - -#define DOTP(c) ((c) == 0x002E || (c) == 0x3002 || \ - (c) == 0xFF0E || (c) == 0xFF61) - -/* Core functions */ - -/** - * idna_to_ascii_4i - convert Unicode domain name label to text - * @in: input array with unicode code points. - * @inlen: length of input array with unicode code points. - * @out: output zero terminated string that must have room for at - * least 63 characters plus the terminating zero. - * @flags: an #Idna_flags value, e.g., %IDNA_ALLOW_UNASSIGNED or - * %IDNA_USE_STD3_ASCII_RULES. - * - * The ToASCII operation takes a sequence of Unicode code points that - * make up one domain label and transforms it into a sequence of code - * points in the ASCII range (0..7F). If ToASCII succeeds, the - * original sequence and the resulting sequence are equivalent labels. - * - * It is important to note that the ToASCII operation can fail. ToASCII - * fails if any step of it fails. If any step of the ToASCII operation - * fails on any label in a domain name, that domain name MUST NOT be used - * as an internationalized domain name. The method for deadling with this - * failure is application-specific. - * - * The inputs to ToASCII are a sequence of code points, the AllowUnassigned - * flag, and the UseSTD3ASCIIRules flag. The output of ToASCII is either a - * sequence of ASCII code points or a failure condition. - * - * ToASCII never alters a sequence of code points that are all in the ASCII - * range to begin with (although it could fail). Applying the ToASCII - * operation multiple times has exactly the same effect as applying it just - * once. - * - * Return value: Returns 0 on success, or an #Idna_rc error code. - */ -int -idna_to_ascii_4i (const uint32_t * in, size_t inlen, char *out, int flags) -{ - size_t len, outlen; - uint32_t *src; /* XXX don't need to copy data? */ - int rc; - - /* - * ToASCII consists of the following steps: - * - * 1. If all code points in the sequence are in the ASCII range (0..7F) - * then skip to step 3. - */ - - { - size_t i; - int inasciirange; - - inasciirange = 1; - for (i = 0; i < inlen; i++) - if (in[i] > 0x7F) - inasciirange = 0; - if (inasciirange) - { - src = malloc (sizeof (in[0]) * (inlen + 1)); - if (src == NULL) - return IDNA_MALLOC_ERROR; - - memcpy (src, in, sizeof (in[0]) * inlen); - src[inlen] = 0; - - goto step3; - } - } - - /* - * 2. Perform the steps specified in [NAMEPREP] and fail if there is - * an error. The AllowUnassigned flag is used in [NAMEPREP]. - */ - - { - char *p; - - p = stringprep_ucs4_to_utf8 (in, inlen, NULL, NULL); - if (p == NULL) - return IDNA_MALLOC_ERROR; - - len = strlen (p); - do - { - char *newp; - - len = 2 * len + 10; /* XXX better guess? */ - newp = realloc (p, len); - if (newp == NULL) - { - free (p); - return IDNA_MALLOC_ERROR; - } - p = newp; - - if (flags & IDNA_ALLOW_UNASSIGNED) - rc = stringprep_nameprep (p, len); - else - rc = stringprep_nameprep_no_unassigned (p, len); - } - while (rc == STRINGPREP_TOO_SMALL_BUFFER); - - if (rc != STRINGPREP_OK) - { - free (p); - return IDNA_STRINGPREP_ERROR; - } - - src = stringprep_utf8_to_ucs4 (p, -1, NULL); - - free (p); - } - -step3: - /* - * 3. If the UseSTD3ASCIIRules flag is set, then perform these checks: - * - * (a) Verify the absence of non-LDH ASCII code points; that is, - * the absence of 0..2C, 2E..2F, 3A..40, 5B..60, and 7B..7F. - * - * (b) Verify the absence of leading and trailing hyphen-minus; - * that is, the absence of U+002D at the beginning and end of - * the sequence. - */ - - if (flags & IDNA_USE_STD3_ASCII_RULES) - { - size_t i; - - for (i = 0; src[i]; i++) - if (src[i] <= 0x2C || src[i] == 0x2E || src[i] == 0x2F || - (src[i] >= 0x3A && src[i] <= 0x40) || - (src[i] >= 0x5B && src[i] <= 0x60) || - (src[i] >= 0x7B && src[i] <= 0x7F)) - { - free (src); - return IDNA_CONTAINS_NON_LDH; - } - - if (src[0] == 0x002D || (i > 0 && src[i - 1] == 0x002D)) - { - free (src); - return IDNA_CONTAINS_MINUS; - } - } - - /* - * 4. If all code points in the sequence are in the ASCII range - * (0..7F), then skip to step 8. - */ - - { - size_t i; - int inasciirange; - - inasciirange = 1; - for (i = 0; src[i]; i++) - { - if (src[i] > 0x7F) - inasciirange = 0; - /* copy string to output buffer if we are about to skip to step8 */ - if (i < 64) - out[i] = src[i]; - } - if (i < 64) - out[i] = '\0'; - if (inasciirange) - goto step8; - } - - /* - * 5. Verify that the sequence does NOT begin with the ACE prefix. - * - */ - - { - size_t i; - int match; - - match = 1; - for (i = 0; match && i < strlen (IDNA_ACE_PREFIX); i++) - if (((uint32_t) IDNA_ACE_PREFIX[i] & 0xFF) != src[i]) - match = 0; - if (match) - { - free (src); - return IDNA_CONTAINS_ACE_PREFIX; - } - } - - /* - * 6. Encode the sequence using the encoding algorithm in [PUNYCODE] - * and fail if there is an error. - */ - for (len = 0; src[len]; len++) - ; - src[len] = '\0'; - outlen = 63 - strlen (IDNA_ACE_PREFIX); - rc = punycode_encode (len, src, NULL, - &outlen, &out[strlen (IDNA_ACE_PREFIX)]); - if (rc != PUNYCODE_SUCCESS) - { - free (src); - return IDNA_PUNYCODE_ERROR; - } - out[strlen (IDNA_ACE_PREFIX) + outlen] = '\0'; - - /* - * 7. Prepend the ACE prefix. - */ - - memcpy (out, IDNA_ACE_PREFIX, strlen (IDNA_ACE_PREFIX)); - - /* - * 8. Verify that the number of code points is in the range 1 to 63 - * inclusive (0 is excluded). - */ - -step8: - free (src); - if (strlen (out) < 1 || strlen (out) > 63) - return IDNA_INVALID_LENGTH; - - return IDNA_SUCCESS; -} - -/* ToUnicode(). May realloc() utf8in. Will free utf8in unconditionally. */ -static int -idna_to_unicode_internal (char *utf8in, - uint32_t * out, size_t * outlen, int flags) -{ - int rc; - char tmpout[64]; - size_t utf8len = strlen (utf8in) + 1; - size_t addlen = 0; - - /* - * ToUnicode consists of the following steps: - * - * 1. If the sequence contains any code points outside the ASCII range - * (0..7F) then proceed to step 2, otherwise skip to step 3. - */ - - { - size_t i; - int inasciirange; - - inasciirange = 1; - for (i = 0; utf8in[i]; i++) - if (utf8in[i] & ~0x7F) - inasciirange = 0; - if (inasciirange) - goto step3; - } - - /* - * 2. Perform the steps specified in [NAMEPREP] and fail if there is an - * error. (If step 3 of ToASCII is also performed here, it will not - * affect the overall behavior of ToUnicode, but it is not - * necessary.) The AllowUnassigned flag is used in [NAMEPREP]. - */ - do - { - char *newp = realloc (utf8in, utf8len + addlen); - if (newp == NULL) - { - free (utf8in); - return IDNA_MALLOC_ERROR; - } - utf8in = newp; - if (flags & IDNA_ALLOW_UNASSIGNED) - rc = stringprep_nameprep (utf8in, utf8len + addlen); - else - rc = stringprep_nameprep_no_unassigned (utf8in, utf8len + addlen); - addlen += 1; - } - while (rc == STRINGPREP_TOO_SMALL_BUFFER); - - if (rc != STRINGPREP_OK) - { - free (utf8in); - return IDNA_STRINGPREP_ERROR; - } - - /* 3. Verify that the sequence begins with the ACE prefix, and save a - * copy of the sequence. - */ - -step3: - if (memcmp (IDNA_ACE_PREFIX, utf8in, strlen (IDNA_ACE_PREFIX)) != 0) - { - free (utf8in); - return IDNA_NO_ACE_PREFIX; - } - - /* 4. Remove the ACE prefix. - */ - - memmove (utf8in, &utf8in[strlen (IDNA_ACE_PREFIX)], - strlen (utf8in) - strlen (IDNA_ACE_PREFIX) + 1); - - /* 5. Decode the sequence using the decoding algorithm in [PUNYCODE] - * and fail if there is an error. Save a copy of the result of - * this step. - */ - - (*outlen)--; /* reserve one for the zero */ - - rc = punycode_decode (strlen (utf8in), utf8in, outlen, out, NULL); - if (rc != PUNYCODE_SUCCESS) - { - free (utf8in); - return IDNA_PUNYCODE_ERROR; - } - - out[*outlen] = 0; /* add zero */ - - /* 6. Apply ToASCII. - */ - - rc = idna_to_ascii_4i (out, *outlen, tmpout, flags); - if (rc != IDNA_SUCCESS) - { - free (utf8in); - return rc; - } - - /* 7. Verify that the result of step 6 matches the saved copy from - * step 3, using a case-insensitive ASCII comparison. - */ - - if (strcasecmp (utf8in, tmpout + strlen (IDNA_ACE_PREFIX)) != 0) - { - free (utf8in); - return IDNA_ROUNDTRIP_VERIFY_ERROR; - } - - /* 8. Return the saved copy from step 5. - */ - - free (utf8in); - return IDNA_SUCCESS; -} - -/** - * idna_to_unicode_44i - convert domain name label to Unicode - * @in: input array with unicode code points. - * @inlen: length of input array with unicode code points. - * @out: output array with unicode code points. - * @outlen: on input, maximum size of output array with unicode code points, - * on exit, actual size of output array with unicode code points. - * @flags: an #Idna_flags value, e.g., %IDNA_ALLOW_UNASSIGNED or - * %IDNA_USE_STD3_ASCII_RULES. - * - * The ToUnicode operation takes a sequence of Unicode code points - * that make up one domain label and returns a sequence of Unicode - * code points. If the input sequence is a label in ACE form, then the - * result is an equivalent internationalized label that is not in ACE - * form, otherwise the original sequence is returned unaltered. - * - * ToUnicode never fails. If any step fails, then the original input - * sequence is returned immediately in that step. - * - * The Punycode decoder can never output more code points than it - * inputs, but Nameprep can, and therefore ToUnicode can. Note that - * the number of octets needed to represent a sequence of code points - * depends on the particular character encoding used. - * - * The inputs to ToUnicode are a sequence of code points, the - * AllowUnassigned flag, and the UseSTD3ASCIIRules flag. The output of - * ToUnicode is always a sequence of Unicode code points. - * - * Return value: Returns #Idna_rc error condition, but it must only be - * used for debugging purposes. The output buffer is always - * guaranteed to contain the correct data according to the - * specification (sans malloc induced errors). NB! This means that - * you normally ignore the return code from this function, as - * checking it means breaking the standard. - */ -int -idna_to_unicode_44i (const uint32_t * in, size_t inlen, - uint32_t * out, size_t * outlen, int flags) -{ - int rc; - size_t outlensave = *outlen; - char *p; - - p = stringprep_ucs4_to_utf8 (in, inlen, NULL, NULL); - if (p == NULL) - return IDNA_MALLOC_ERROR; - - rc = idna_to_unicode_internal (p, out, outlen, flags); - if (rc != IDNA_SUCCESS) - { - memcpy (out, in, sizeof (in[0]) * (inlen < outlensave ? - inlen : outlensave)); - *outlen = inlen; - } - - /* p is freed in idna_to_unicode_internal. */ - - return rc; -} - -/* Wrappers that handle several labels */ - -/** - * idna_to_ascii_4z - convert Unicode domain name to text - * @input: zero terminated input Unicode string. - * @output: pointer to newly allocated output string. - * @flags: an #Idna_flags value, e.g., %IDNA_ALLOW_UNASSIGNED or - * %IDNA_USE_STD3_ASCII_RULES. - * - * Convert UCS-4 domain name to ASCII string. The domain name may - * contain several labels, separated by dots. The output buffer must - * be deallocated by the caller. - * - * Return value: Returns %IDNA_SUCCESS on success, or error code. - **/ -int -idna_to_ascii_4z (const uint32_t * input, char **output, int flags) -{ - const uint32_t *start = input; - const uint32_t *end = input; - char buf[64]; - char *out = NULL; - int rc; - - /* 1) Whenever dots are used as label separators, the following - characters MUST be recognized as dots: U+002E (full stop), - U+3002 (ideographic full stop), U+FF0E (fullwidth full stop), - U+FF61 (halfwidth ideographic full stop). */ - - if (input[0] == 0) - { - /* Handle implicit zero-length root label. */ - *output = malloc (1); - if (!*output) - return IDNA_MALLOC_ERROR; - strcpy (*output, ""); - return IDNA_SUCCESS; - } - - if (DOTP (input[0]) && input[1] == 0) - { - /* Handle explicit zero-length root label. */ - *output = malloc (2); - if (!*output) - return IDNA_MALLOC_ERROR; - strcpy (*output, "."); - return IDNA_SUCCESS; - } - - *output = NULL; - do - { - end = start; - - for (; *end && !DOTP (*end); end++) - ; - - if (*end == '\0' && start == end) - { - /* Handle explicit zero-length root label. */ - buf[0] = '\0'; - } - else - { - rc = idna_to_ascii_4i (start, end - start, buf, flags); - if (rc != IDNA_SUCCESS) - return rc; - } - - if (out) - { - char *newp = realloc (out, strlen (out) + 1 + strlen (buf) + 1); - if (!newp) - { - free (out); - return IDNA_MALLOC_ERROR; - } - out = newp; - strcat (out, "."); - strcat (out, buf); - } - else - { - out = (char *) malloc (strlen (buf) + 1); - if (!out) - return IDNA_MALLOC_ERROR; - strcpy (out, buf); - } - - start = end + 1; - } - while (*end); - - *output = out; - - return IDNA_SUCCESS; -} - -/** - * idna_to_ascii_8z - convert Unicode domain name to text - * @input: zero terminated input UTF-8 string. - * @output: pointer to newly allocated output string. - * @flags: an #Idna_flags value, e.g., %IDNA_ALLOW_UNASSIGNED or - * %IDNA_USE_STD3_ASCII_RULES. - * - * Convert UTF-8 domain name to ASCII string. The domain name may - * contain several labels, separated by dots. The output buffer must - * be deallocated by the caller. - * - * Return value: Returns %IDNA_SUCCESS on success, or error code. - **/ -int -idna_to_ascii_8z (const char *input, char **output, int flags) -{ - uint32_t *ucs4; - size_t ucs4len; - int rc; - - ucs4 = stringprep_utf8_to_ucs4 (input, -1, &ucs4len); - if (!ucs4) - return IDNA_ICONV_ERROR; - - rc = idna_to_ascii_4z (ucs4, output, flags); - - free (ucs4); - - return rc; - -} - -/** - * idna_to_ascii_lz - convert Unicode domain name to text - * @input: zero terminated input string encoded in the current locale's - * character set. - * @output: pointer to newly allocated output string. - * @flags: an #Idna_flags value, e.g., %IDNA_ALLOW_UNASSIGNED or - * %IDNA_USE_STD3_ASCII_RULES. - * - * Convert domain name in the locale's encoding to ASCII string. The - * domain name may contain several labels, separated by dots. The - * output buffer must be deallocated by the caller. - * - * Return value: Returns %IDNA_SUCCESS on success, or error code. - **/ -int -idna_to_ascii_lz (const char *input, char **output, int flags) -{ - char *utf8; - int rc; - - utf8 = stringprep_locale_to_utf8 (input); - if (!utf8) - return IDNA_ICONV_ERROR; - - rc = idna_to_ascii_8z (utf8, output, flags); - - free (utf8); - - return rc; -} - -/** - * idna_to_unicode_4z4z - convert domain name to Unicode - * @input: zero-terminated Unicode string. - * @output: pointer to newly allocated output Unicode string. - * @flags: an #Idna_flags value, e.g., %IDNA_ALLOW_UNASSIGNED or - * %IDNA_USE_STD3_ASCII_RULES. - * - * Convert possibly ACE encoded domain name in UCS-4 format into a - * UCS-4 string. The domain name may contain several labels, - * separated by dots. The output buffer must be deallocated by the - * caller. - * - * Return value: Returns %IDNA_SUCCESS on success, or error code. - **/ -int -idna_to_unicode_4z4z (const uint32_t * input, uint32_t ** output, int flags) -{ - const uint32_t *start = input; - const uint32_t *end = input; - uint32_t *buf; - size_t buflen; - uint32_t *out = NULL; - size_t outlen = 0; - int rc; - - *output = NULL; - - do - { - end = start; - - for (; *end && !DOTP (*end); end++) - ; - - buflen = end - start; - buf = malloc (sizeof (buf[0]) * (buflen + 1)); - if (!buf) - return IDNA_MALLOC_ERROR; - - rc = idna_to_unicode_44i (start, end - start, buf, &buflen, flags); - /* don't check rc as per specification! */ - - if (out) - { - uint32_t *newp = realloc (out, - sizeof (out[0]) - * (outlen + 1 + buflen + 1)); - if (!newp) - { - free (buf); - free (out); - return IDNA_MALLOC_ERROR; - } - out = newp; - out[outlen++] = 0x002E; /* '.' (full stop) */ - memcpy (out + outlen, buf, sizeof (buf[0]) * buflen); - outlen += buflen; - out[outlen] = 0x0; - free (buf); - } - else - { - out = buf; - outlen = buflen; - out[outlen] = 0x0; - } - - start = end + 1; - } - while (*end); - - *output = out; - - return IDNA_SUCCESS; -} - -/** - * idna_to_unicode_8z4z - convert domain name to Unicode - * @input: zero-terminated UTF-8 string. - * @output: pointer to newly allocated output Unicode string. - * @flags: an #Idna_flags value, e.g., %IDNA_ALLOW_UNASSIGNED or - * %IDNA_USE_STD3_ASCII_RULES. - * - * Convert possibly ACE encoded domain name in UTF-8 format into a - * UCS-4 string. The domain name may contain several labels, - * separated by dots. The output buffer must be deallocated by the - * caller. - * - * Return value: Returns %IDNA_SUCCESS on success, or error code. - **/ -int -idna_to_unicode_8z4z (const char *input, uint32_t ** output, int flags) -{ - uint32_t *ucs4; - size_t ucs4len; - int rc; - - ucs4 = stringprep_utf8_to_ucs4 (input, -1, &ucs4len); - if (!ucs4) - return IDNA_ICONV_ERROR; - - rc = idna_to_unicode_4z4z (ucs4, output, flags); - free (ucs4); - - return rc; -} - -/** - * idna_to_unicode_8z8z - convert domain name to Unicode - * @input: zero-terminated UTF-8 string. - * @output: pointer to newly allocated output UTF-8 string. - * @flags: an #Idna_flags value, e.g., %IDNA_ALLOW_UNASSIGNED or - * %IDNA_USE_STD3_ASCII_RULES. - * - * Convert possibly ACE encoded domain name in UTF-8 format into a - * UTF-8 string. The domain name may contain several labels, - * separated by dots. The output buffer must be deallocated by the - * caller. - * - * Return value: Returns %IDNA_SUCCESS on success, or error code. - **/ -int -idna_to_unicode_8z8z (const char *input, char **output, int flags) -{ - uint32_t *ucs4; - int rc; - - rc = idna_to_unicode_8z4z (input, &ucs4, flags); - *output = stringprep_ucs4_to_utf8 (ucs4, -1, NULL, NULL); - free (ucs4); - - if (!*output) - return IDNA_ICONV_ERROR; - - return rc; -} - -/** - * idna_to_unicode_8zlz - convert domain name to Unicode - * @input: zero-terminated UTF-8 string. - * @output: pointer to newly allocated output string encoded in the - * current locale's character set. - * @flags: an #Idna_flags value, e.g., %IDNA_ALLOW_UNASSIGNED or - * %IDNA_USE_STD3_ASCII_RULES. - * - * Convert possibly ACE encoded domain name in UTF-8 format into a - * string encoded in the current locale's character set. The domain - * name may contain several labels, separated by dots. The output - * buffer must be deallocated by the caller. - * - * Return value: Returns %IDNA_SUCCESS on success, or error code. - **/ -int -idna_to_unicode_8zlz (const char *input, char **output, int flags) -{ - char *utf8; - int rc; - - rc = idna_to_unicode_8z8z (input, &utf8, flags); - *output = stringprep_utf8_to_locale (utf8); - free (utf8); - - if (!*output) - return IDNA_ICONV_ERROR; - - return rc; -} - -/** - * idna_to_unicode_lzlz - convert domain name to Unicode - * @input: zero-terminated string encoded in the current locale's - * character set. - * @output: pointer to newly allocated output string encoded in the - * current locale's character set. - * @flags: an #Idna_flags value, e.g., %IDNA_ALLOW_UNASSIGNED or - * %IDNA_USE_STD3_ASCII_RULES. - * - * Convert possibly ACE encoded domain name in the locale's character - * set into a string encoded in the current locale's character set. - * The domain name may contain several labels, separated by dots. The - * output buffer must be deallocated by the caller. - * - * Return value: Returns %IDNA_SUCCESS on success, or error code. - **/ -int -idna_to_unicode_lzlz (const char *input, char **output, int flags) -{ - char *utf8; - int rc; - - utf8 = stringprep_locale_to_utf8 (input); - if (!utf8) - return IDNA_ICONV_ERROR; - - rc = idna_to_unicode_8zlz (utf8, output, flags); - free (utf8); - - return rc; -} - -/** - * IDNA_ACE_PREFIX - * - * The IANA allocated prefix to use for IDNA. "xn--" - */ - -/** - * Idna_rc: - * @IDNA_SUCCESS: Successful operation. This value is guaranteed to - * always be zero, the remaining ones are only guaranteed to hold - * non-zero values, for logical comparison purposes. - * @IDNA_STRINGPREP_ERROR: Error during string preparation. - * @IDNA_PUNYCODE_ERROR: Error during punycode operation. - * @IDNA_CONTAINS_NON_LDH: For IDNA_USE_STD3_ASCII_RULES, indicate that - * the string contains non-LDH ASCII characters. - * @IDNA_CONTAINS_MINUS: For IDNA_USE_STD3_ASCII_RULES, indicate that - * the string contains a leading or trailing hyphen-minus (U+002D). - * @IDNA_INVALID_LENGTH: The final output string is not within the - * (inclusive) range 1 to 63 characters. - * @IDNA_NO_ACE_PREFIX: The string does not contain the ACE prefix - * (for ToUnicode). - * @IDNA_ROUNDTRIP_VERIFY_ERROR: The ToASCII operation on output - * string does not equal the input. - * @IDNA_CONTAINS_ACE_PREFIX: The input contains the ACE prefix (for - * ToASCII). - * @IDNA_ICONV_ERROR: Could not convert string in locale encoding. - * @IDNA_MALLOC_ERROR: Could not allocate buffer (this is typically a - * fatal error). - * @IDNA_DLOPEN_ERROR: Could not dlopen the libcidn DSO (only used - * internally in libc). - * - * Enumerated return codes of idna_to_ascii_4i(), - * idna_to_unicode_44i() functions (and functions derived from those - * functions). The value 0 is guaranteed to always correspond to - * success. - */ - - -/** - * Idna_flags: - * @IDNA_ALLOW_UNASSIGNED: Don't reject strings containing unassigned - * Unicode code points. - * @IDNA_USE_STD3_ASCII_RULES: Validate strings according to STD3 - * rules (i.e., normal host name rules). - * - * Flags to pass to idna_to_ascii_4i(), idna_to_unicode_44i() etc. - */ diff --git a/3rdParty/LibIDN/src/idna.h b/3rdParty/LibIDN/src/idna.h deleted file mode 100644 index f6b24ac..0000000 --- a/3rdParty/LibIDN/src/idna.h +++ /dev/null @@ -1,100 +0,0 @@ -/* idna.h --- Declarations for Internationalized Domain Name in Applications. - * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Simon Josefsson - * - * This file is part of GNU Libidn. - * - * GNU Libidn is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * GNU Libidn 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with GNU Libidn; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - * - */ - -#ifndef _IDNA_H -# define _IDNA_H - -# ifdef __cplusplus -extern "C" -{ -# endif - -# include <stddef.h> /* size_t */ -# include <idn-int.h> /* uint32_t */ - - /* Error codes. */ - typedef enum - { - IDNA_SUCCESS = 0, - IDNA_STRINGPREP_ERROR = 1, - IDNA_PUNYCODE_ERROR = 2, - IDNA_CONTAINS_NON_LDH = 3, - /* Workaround typo in earlier versions. */ - IDNA_CONTAINS_LDH = IDNA_CONTAINS_NON_LDH, - IDNA_CONTAINS_MINUS = 4, - IDNA_INVALID_LENGTH = 5, - IDNA_NO_ACE_PREFIX = 6, - IDNA_ROUNDTRIP_VERIFY_ERROR = 7, - IDNA_CONTAINS_ACE_PREFIX = 8, - IDNA_ICONV_ERROR = 9, - /* Internal errors. */ - IDNA_MALLOC_ERROR = 201, - IDNA_DLOPEN_ERROR = 202 - } Idna_rc; - - /* IDNA flags */ - typedef enum - { - IDNA_ALLOW_UNASSIGNED = 0x0001, - IDNA_USE_STD3_ASCII_RULES = 0x0002 - } Idna_flags; - -# ifndef IDNA_ACE_PREFIX -# define IDNA_ACE_PREFIX "xn--" -# endif - - extern const char *idna_strerror (Idna_rc rc); - - /* Core functions */ - extern int idna_to_ascii_4i (const uint32_t * in, size_t inlen, - char *out, int flags); - extern int idna_to_unicode_44i (const uint32_t * in, size_t inlen, - uint32_t * out, size_t * outlen, int flags); - - /* Wrappers that handle several labels */ - - extern int idna_to_ascii_4z (const uint32_t * input, - char **output, int flags); - - extern int idna_to_ascii_8z (const char *input, char **output, int flags); - - extern int idna_to_ascii_lz (const char *input, char **output, int flags); - - - extern int idna_to_unicode_4z4z (const uint32_t * input, - uint32_t ** output, int flags); - - extern int idna_to_unicode_8z4z (const char *input, - uint32_t ** output, int flags); - - extern int idna_to_unicode_8z8z (const char *input, - char **output, int flags); - - extern int idna_to_unicode_8zlz (const char *input, - char **output, int flags); - - extern int idna_to_unicode_lzlz (const char *input, - char **output, int flags); - -# ifdef __cplusplus -} -# endif -#endif /* _IDNA_H */ diff --git a/3rdParty/LibIDN/src/nfkc.c b/3rdParty/LibIDN/src/nfkc.c deleted file mode 100644 index 621f749..0000000 --- a/3rdParty/LibIDN/src/nfkc.c +++ /dev/null @@ -1,1058 +0,0 @@ -/* nfkc.c --- Unicode normalization utilities. - * Copyright (C) 2002, 2003, 2004, 2006, 2007 Simon Josefsson - * - * This file is part of GNU Libidn. - * - * GNU Libidn is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * GNU Libidn 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with GNU Libidn; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - * - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdlib.h> -#include <string.h> - -#include "stringprep.h" - -/* This file contains functions from GLIB, including gutf8.c and - * gunidecomp.c, all licensed under LGPL and copyright hold by: - * - * Copyright (C) 1999, 2000 Tom Tromey - * Copyright 2000 Red Hat, Inc. - */ - -/* Hacks to make syncing with GLIB code easier. */ -#define gboolean int -#define gchar char -#define guchar unsigned char -#define glong long -#define gint int -#define guint unsigned int -#define gushort unsigned short -#define gint16 int16_t -#define guint16 uint16_t -#define gunichar uint32_t -#define gsize size_t -#define gssize ssize_t -#define g_malloc malloc -#define g_free free -#define GError void -#define g_set_error(a,b,c,d) ((void) 0) -#define g_new(struct_type, n_structs) \ - ((struct_type *) g_malloc (((gsize) sizeof (struct_type)) * ((gsize) (n_structs)))) -# if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus) -# define G_STMT_START (void)( -# define G_STMT_END ) -# else -# if (defined (sun) || defined (__sun__)) -# define G_STMT_START if (1) -# define G_STMT_END else (void)0 -# else -# define G_STMT_START do -# define G_STMT_END while (0) -# endif -# endif -#define g_return_val_if_fail(expr,val) G_STMT_START{ (void)0; }G_STMT_END -#define G_N_ELEMENTS(arr) (sizeof (arr) / sizeof ((arr)[0])) -#define TRUE 1 -#define FALSE 0 - -/* Code from GLIB gunicode.h starts here. */ - -typedef enum -{ - G_NORMALIZE_DEFAULT, - G_NORMALIZE_NFD = G_NORMALIZE_DEFAULT, - G_NORMALIZE_DEFAULT_COMPOSE, - G_NORMALIZE_NFC = G_NORMALIZE_DEFAULT_COMPOSE, - G_NORMALIZE_ALL, - G_NORMALIZE_NFKD = G_NORMALIZE_ALL, - G_NORMALIZE_ALL_COMPOSE, - G_NORMALIZE_NFKC = G_NORMALIZE_ALL_COMPOSE -} -GNormalizeMode; - -/* Code from GLIB gutf8.c starts here. */ - -#define UTF8_COMPUTE(Char, Mask, Len) \ - if (Char < 128) \ - { \ - Len = 1; \ - Mask = 0x7f; \ - } \ - else if ((Char & 0xe0) == 0xc0) \ - { \ - Len = 2; \ - Mask = 0x1f; \ - } \ - else if ((Char & 0xf0) == 0xe0) \ - { \ - Len = 3; \ - Mask = 0x0f; \ - } \ - else if ((Char & 0xf8) == 0xf0) \ - { \ - Len = 4; \ - Mask = 0x07; \ - } \ - else if ((Char & 0xfc) == 0xf8) \ - { \ - Len = 5; \ - Mask = 0x03; \ - } \ - else if ((Char & 0xfe) == 0xfc) \ - { \ - Len = 6; \ - Mask = 0x01; \ - } \ - else \ - Len = -1; - -#define UTF8_LENGTH(Char) \ - ((Char) < 0x80 ? 1 : \ - ((Char) < 0x800 ? 2 : \ - ((Char) < 0x10000 ? 3 : \ - ((Char) < 0x200000 ? 4 : \ - ((Char) < 0x4000000 ? 5 : 6))))) - - -#define UTF8_GET(Result, Chars, Count, Mask, Len) \ - (Result) = (Chars)[0] & (Mask); \ - for ((Count) = 1; (Count) < (Len); ++(Count)) \ - { \ - if (((Chars)[(Count)] & 0xc0) != 0x80) \ - { \ - (Result) = -1; \ - break; \ - } \ - (Result) <<= 6; \ - (Result) |= ((Chars)[(Count)] & 0x3f); \ - } - -#define UNICODE_VALID(Char) \ - ((Char) < 0x110000 && \ - (((Char) & 0xFFFFF800) != 0xD800) && \ - ((Char) < 0xFDD0 || (Char) > 0xFDEF) && \ - ((Char) & 0xFFFE) != 0xFFFE) - - -static const gchar utf8_skip_data[256] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, - 5, 5, 5, 6, 6, 1, 1 -}; - -static const gchar *const g_utf8_skip = utf8_skip_data; - -#define g_utf8_next_char(p) (char *)((p) + g_utf8_skip[*(guchar *)(p)]) - -/* - * g_utf8_strlen: - * @p: pointer to the start of a UTF-8 encoded string. - * @max: the maximum number of bytes to examine. If @max - * is less than 0, then the string is assumed to be - * nul-terminated. If @max is 0, @p will not be examined and - * may be %NULL. - * - * Returns the length of the string in characters. - * - * Return value: the length of the string in characters - **/ -static glong -g_utf8_strlen (const gchar * p, gssize max) -{ - glong len = 0; - const gchar *start = p; - g_return_val_if_fail (p != NULL || max == 0, 0); - - if (max < 0) - { - while (*p) - { - p = g_utf8_next_char (p); - ++len; - } - } - else - { - if (max == 0 || !*p) - return 0; - - p = g_utf8_next_char (p); - - while (p - start < max && *p) - { - ++len; - p = g_utf8_next_char (p); - } - - /* only do the last len increment if we got a complete - * char (don't count partial chars) - */ - if (p - start == max) - ++len; - } - - return len; -} - -/* - * g_utf8_get_char: - * @p: a pointer to Unicode character encoded as UTF-8 - * - * Converts a sequence of bytes encoded as UTF-8 to a Unicode character. - * If @p does not point to a valid UTF-8 encoded character, results are - * undefined. If you are not sure that the bytes are complete - * valid Unicode characters, you should use g_utf8_get_char_validated() - * instead. - * - * Return value: the resulting character - **/ -static gunichar -g_utf8_get_char (const gchar * p) -{ - int i, mask = 0, len; - gunichar result; - unsigned char c = (unsigned char) *p; - - UTF8_COMPUTE (c, mask, len); - if (len == -1) - return (gunichar) - 1; - UTF8_GET (result, p, i, mask, len); - - return result; -} - -/* - * g_unichar_to_utf8: - * @c: a ISO10646 character code - * @outbuf: output buffer, must have at least 6 bytes of space. - * If %NULL, the length will be computed and returned - * and nothing will be written to @outbuf. - * - * Converts a single character to UTF-8. - * - * Return value: number of bytes written - **/ -static int -g_unichar_to_utf8 (gunichar c, gchar * outbuf) -{ - guint len = 0; - int first; - int i; - - if (c < 0x80) - { - first = 0; - len = 1; - } - else if (c < 0x800) - { - first = 0xc0; - len = 2; - } - else if (c < 0x10000) - { - first = 0xe0; - len = 3; - } - else if (c < 0x200000) - { - first = 0xf0; - len = 4; - } - else if (c < 0x4000000) - { - first = 0xf8; - len = 5; - } - else - { - first = 0xfc; - len = 6; - } - - if (outbuf) - { - for (i = len - 1; i > 0; --i) - { - outbuf[i] = (c & 0x3f) | 0x80; - c >>= 6; - } - outbuf[0] = c | first; - } - - return len; -} - -/* - * g_utf8_to_ucs4_fast: - * @str: a UTF-8 encoded string - * @len: the maximum length of @str to use. If @len < 0, then - * the string is nul-terminated. - * @items_written: location to store the number of characters in the - * result, or %NULL. - * - * Convert a string from UTF-8 to a 32-bit fixed width - * representation as UCS-4, assuming valid UTF-8 input. - * This function is roughly twice as fast as g_utf8_to_ucs4() - * but does no error checking on the input. - * - * Return value: a pointer to a newly allocated UCS-4 string. - * This value must be freed with g_free(). - **/ -static gunichar * -g_utf8_to_ucs4_fast (const gchar * str, glong len, glong * items_written) -{ - gint j, charlen; - gunichar *result; - gint n_chars, i; - const gchar *p; - - g_return_val_if_fail (str != NULL, NULL); - - p = str; - n_chars = 0; - if (len < 0) - { - while (*p) - { - p = g_utf8_next_char (p); - ++n_chars; - } - } - else - { - while (p < str + len && *p) - { - p = g_utf8_next_char (p); - ++n_chars; - } - } - - result = g_new (gunichar, n_chars + 1); - if (!result) - return NULL; - - p = str; - for (i = 0; i < n_chars; i++) - { - gunichar wc = ((unsigned char *) p)[0]; - - if (wc < 0x80) - { - result[i] = wc; - p++; - } - else - { - if (wc < 0xe0) - { - charlen = 2; - wc &= 0x1f; - } - else if (wc < 0xf0) - { - charlen = 3; - wc &= 0x0f; - } - else if (wc < 0xf8) - { - charlen = 4; - wc &= 0x07; - } - else if (wc < 0xfc) - { - charlen = 5; - wc &= 0x03; - } - else - { - charlen = 6; - wc &= 0x01; - } - - for (j = 1; j < charlen; j++) - { - wc <<= 6; - wc |= ((unsigned char *) p)[j] & 0x3f; - } - - result[i] = wc; - p += charlen; - } - } - result[i] = 0; - - if (items_written) - *items_written = i; - - return result; -} - -/* - * g_ucs4_to_utf8: - * @str: a UCS-4 encoded string - * @len: the maximum length of @str to use. If @len < 0, then - * the string is terminated with a 0 character. - * @items_read: location to store number of characters read read, or %NULL. - * @items_written: location to store number of bytes written or %NULL. - * The value here stored does not include the trailing 0 - * byte. - * @error: location to store the error occuring, or %NULL to ignore - * errors. Any of the errors in #GConvertError other than - * %G_CONVERT_ERROR_NO_CONVERSION may occur. - * - * Convert a string from a 32-bit fixed width representation as UCS-4. - * to UTF-8. The result will be terminated with a 0 byte. - * - * Return value: a pointer to a newly allocated UTF-8 string. - * This value must be freed with g_free(). If an - * error occurs, %NULL will be returned and - * @error set. - **/ -static gchar * -g_ucs4_to_utf8 (const gunichar * str, - glong len, - glong * items_read, glong * items_written, GError ** error) -{ - gint result_length; - gchar *result = NULL; - gchar *p; - gint i; - - result_length = 0; - for (i = 0; len < 0 || i < len; i++) - { - if (!str[i]) - break; - - if (str[i] >= 0x80000000) - { - if (items_read) - *items_read = i; - - g_set_error (error, G_CONVERT_ERROR, - G_CONVERT_ERROR_ILLEGAL_SEQUENCE, - _("Character out of range for UTF-8")); - goto err_out; - } - - result_length += UTF8_LENGTH (str[i]); - } - - result = g_malloc (result_length + 1); - if (!result) - return NULL; - p = result; - - i = 0; - while (p < result + result_length) - p += g_unichar_to_utf8 (str[i++], p); - - *p = '\0'; - - if (items_written) - *items_written = p - result; - -err_out: - if (items_read) - *items_read = i; - - return result; -} - -/* Code from GLIB gunidecomp.c starts here. */ - -#include "gunidecomp.h" -#include "gunicomp.h" - -#define CC_PART1(Page, Char) \ - ((combining_class_table_part1[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ - ? (combining_class_table_part1[Page] - G_UNICODE_MAX_TABLE_INDEX) \ - : (cclass_data[combining_class_table_part1[Page]][Char])) - -#define CC_PART2(Page, Char) \ - ((combining_class_table_part2[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ - ? (combining_class_table_part2[Page] - G_UNICODE_MAX_TABLE_INDEX) \ - : (cclass_data[combining_class_table_part2[Page]][Char])) - -#define COMBINING_CLASS(Char) \ - (((Char) <= G_UNICODE_LAST_CHAR_PART1) \ - ? CC_PART1 ((Char) >> 8, (Char) & 0xff) \ - : (((Char) >= 0xe0000 && (Char) <= G_UNICODE_LAST_CHAR) \ - ? CC_PART2 (((Char) - 0xe0000) >> 8, (Char) & 0xff) \ - : 0)) - -/* constants for hangul syllable [de]composition */ -#define SBase 0xAC00 -#define LBase 0x1100 -#define VBase 0x1161 -#define TBase 0x11A7 -#define LCount 19 -#define VCount 21 -#define TCount 28 -#define NCount (VCount * TCount) -#define SCount (LCount * NCount) - -/* - * g_unicode_canonical_ordering: - * @string: a UCS-4 encoded string. - * @len: the maximum length of @string to use. - * - * Computes the canonical ordering of a string in-place. - * This rearranges decomposed characters in the string - * according to their combining classes. See the Unicode - * manual for more information. - **/ -static void -g_unicode_canonical_ordering (gunichar * string, gsize len) -{ - gsize i; - int swap = 1; - - while (swap) - { - int last; - swap = 0; - last = COMBINING_CLASS (string[0]); - for (i = 0; i < len - 1; ++i) - { - int next = COMBINING_CLASS (string[i + 1]); - if (next != 0 && last > next) - { - gsize j; - /* Percolate item leftward through string. */ - for (j = i + 1; j > 0; --j) - { - gunichar t; - if (COMBINING_CLASS (string[j - 1]) <= next) - break; - t = string[j]; - string[j] = string[j - 1]; - string[j - 1] = t; - swap = 1; - } - /* We're re-entering the loop looking at the old - character again. */ - next = last; - } - last = next; - } - } -} - -/* http://www.unicode.org/unicode/reports/tr15/#Hangul - * r should be null or have sufficient space. Calling with r == NULL will - * only calculate the result_len; however, a buffer with space for three - * characters will always be big enough. */ -static void -decompose_hangul (gunichar s, gunichar * r, gsize * result_len) -{ - gint SIndex = s - SBase; - - /* not a hangul syllable */ - if (SIndex < 0 || SIndex >= SCount) - { - if (r) - r[0] = s; - *result_len = 1; - } - else - { - gunichar L = LBase + SIndex / NCount; - gunichar V = VBase + (SIndex % NCount) / TCount; - gunichar T = TBase + SIndex % TCount; - - if (r) - { - r[0] = L; - r[1] = V; - } - - if (T != TBase) - { - if (r) - r[2] = T; - *result_len = 3; - } - else - *result_len = 2; - } -} - -/* returns a pointer to a null-terminated UTF-8 string */ -static const gchar * -find_decomposition (gunichar ch, gboolean compat) -{ - int start = 0; - int end = G_N_ELEMENTS (decomp_table); - - if (ch >= decomp_table[start].ch && ch <= decomp_table[end - 1].ch) - { - while (TRUE) - { - int half = (start + end) / 2; - if (ch == decomp_table[half].ch) - { - int offset; - - if (compat) - { - offset = decomp_table[half].compat_offset; - if (offset == G_UNICODE_NOT_PRESENT_OFFSET) - offset = decomp_table[half].canon_offset; - } - else - { - offset = decomp_table[half].canon_offset; - if (offset == G_UNICODE_NOT_PRESENT_OFFSET) - return NULL; - } - - return &(decomp_expansion_string[offset]); - } - else if (half == start) - break; - else if (ch > decomp_table[half].ch) - start = half; - else - end = half; - } - } - - return NULL; -} - -/* L,V => LV and LV,T => LVT */ -static gboolean -combine_hangul (gunichar a, gunichar b, gunichar * result) -{ - gint LIndex = a - LBase; - gint SIndex = a - SBase; - - gint VIndex = b - VBase; - gint TIndex = b - TBase; - - if (0 <= LIndex && LIndex < LCount && 0 <= VIndex && VIndex < VCount) - { - *result = SBase + (LIndex * VCount + VIndex) * TCount; - return TRUE; - } - else if (0 <= SIndex && SIndex < SCount && (SIndex % TCount) == 0 - && 0 <= TIndex && TIndex <= TCount) - { - *result = a + TIndex; - return TRUE; - } - - return FALSE; -} - -#define CI(Page, Char) \ - ((compose_table[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ - ? (compose_table[Page] - G_UNICODE_MAX_TABLE_INDEX) \ - : (compose_data[compose_table[Page]][Char])) - -#define COMPOSE_INDEX(Char) \ - ((((Char) >> 8) > (COMPOSE_TABLE_LAST)) ? 0 : CI((Char) >> 8, (Char) & 0xff)) - -static gboolean -combine (gunichar a, gunichar b, gunichar * result) -{ - gushort index_a, index_b; - - if (combine_hangul (a, b, result)) - return TRUE; - - index_a = COMPOSE_INDEX (a); - - if (index_a >= COMPOSE_FIRST_SINGLE_START && index_a < COMPOSE_SECOND_START) - { - if (b == compose_first_single[index_a - COMPOSE_FIRST_SINGLE_START][0]) - { - *result = - compose_first_single[index_a - COMPOSE_FIRST_SINGLE_START][1]; - return TRUE; - } - else - return FALSE; - } - - index_b = COMPOSE_INDEX (b); - - if (index_b >= COMPOSE_SECOND_SINGLE_START) - { - if (a == - compose_second_single[index_b - COMPOSE_SECOND_SINGLE_START][0]) - { - *result = - compose_second_single[index_b - COMPOSE_SECOND_SINGLE_START][1]; - return TRUE; - } - else - return FALSE; - } - - if (index_a >= COMPOSE_FIRST_START && index_a < COMPOSE_FIRST_SINGLE_START - && index_b >= COMPOSE_SECOND_START - && index_b < COMPOSE_SECOND_SINGLE_START) - { - gunichar res = - compose_array[index_a - COMPOSE_FIRST_START][index_b - - COMPOSE_SECOND_START]; - - if (res) - { - *result = res; - return TRUE; - } - } - - return FALSE; -} - -static gunichar * -_g_utf8_normalize_wc (const gchar * str, gssize max_len, GNormalizeMode mode) -{ - gsize n_wc; - gunichar *wc_buffer; - const char *p; - gsize last_start; - gboolean do_compat = (mode == G_NORMALIZE_NFKC || mode == G_NORMALIZE_NFKD); - gboolean do_compose = (mode == G_NORMALIZE_NFC || mode == G_NORMALIZE_NFKC); - - n_wc = 0; - p = str; - while ((max_len < 0 || p < str + max_len) && *p) - { - const gchar *decomp; - gunichar wc = g_utf8_get_char (p); - - if (wc >= 0xac00 && wc <= 0xd7af) - { - gsize result_len; - decompose_hangul (wc, NULL, &result_len); - n_wc += result_len; - } - else - { - decomp = find_decomposition (wc, do_compat); - - if (decomp) - n_wc += g_utf8_strlen (decomp, -1); - else - n_wc++; - } - - p = g_utf8_next_char (p); - } - - wc_buffer = g_new (gunichar, n_wc + 1); - if (!wc_buffer) - return NULL; - - last_start = 0; - n_wc = 0; - p = str; - while ((max_len < 0 || p < str + max_len) && *p) - { - gunichar wc = g_utf8_get_char (p); - const gchar *decomp; - int cc; - gsize old_n_wc = n_wc; - - if (wc >= 0xac00 && wc <= 0xd7af) - { - gsize result_len; - decompose_hangul (wc, wc_buffer + n_wc, &result_len); - n_wc += result_len; - } - else - { - decomp = find_decomposition (wc, do_compat); - - if (decomp) - { - const char *pd; - for (pd = decomp; *pd != '\0'; pd = g_utf8_next_char (pd)) - wc_buffer[n_wc++] = g_utf8_get_char (pd); - } - else - wc_buffer[n_wc++] = wc; - } - - if (n_wc > 0) - { - cc = COMBINING_CLASS (wc_buffer[old_n_wc]); - - if (cc == 0) - { - g_unicode_canonical_ordering (wc_buffer + last_start, - n_wc - last_start); - last_start = old_n_wc; - } - } - - p = g_utf8_next_char (p); - } - - if (n_wc > 0) - { - g_unicode_canonical_ordering (wc_buffer + last_start, - n_wc - last_start); - last_start = n_wc; - } - - wc_buffer[n_wc] = 0; - - /* All decomposed and reordered */ - - if (do_compose && n_wc > 0) - { - gsize i, j; - int last_cc = 0; - last_start = 0; - - for (i = 0; i < n_wc; i++) - { - int cc = COMBINING_CLASS (wc_buffer[i]); - - if (i > 0 && - (last_cc == 0 || last_cc != cc) && - combine (wc_buffer[last_start], wc_buffer[i], - &wc_buffer[last_start])) - { - for (j = i + 1; j < n_wc; j++) - wc_buffer[j - 1] = wc_buffer[j]; - n_wc--; - i--; - - if (i == last_start) - last_cc = 0; - else - last_cc = COMBINING_CLASS (wc_buffer[i - 1]); - - continue; - } - - if (cc == 0) - last_start = i; - - last_cc = cc; - } - } - - wc_buffer[n_wc] = 0; - - return wc_buffer; -} - -/* - * g_utf8_normalize: - * @str: a UTF-8 encoded string. - * @len: length of @str, in bytes, or -1 if @str is nul-terminated. - * @mode: the type of normalization to perform. - * - * Converts a string into canonical form, standardizing - * such issues as whether a character with an accent - * is represented as a base character and combining - * accent or as a single precomposed character. You - * should generally call g_utf8_normalize() before - * comparing two Unicode strings. - * - * The normalization mode %G_NORMALIZE_DEFAULT only - * standardizes differences that do not affect the - * text content, such as the above-mentioned accent - * representation. %G_NORMALIZE_ALL also standardizes - * the "compatibility" characters in Unicode, such - * as SUPERSCRIPT THREE to the standard forms - * (in this case DIGIT THREE). Formatting information - * may be lost but for most text operations such - * characters should be considered the same. - * For example, g_utf8_collate() normalizes - * with %G_NORMALIZE_ALL as its first step. - * - * %G_NORMALIZE_DEFAULT_COMPOSE and %G_NORMALIZE_ALL_COMPOSE - * are like %G_NORMALIZE_DEFAULT and %G_NORMALIZE_ALL, - * but returned a result with composed forms rather - * than a maximally decomposed form. This is often - * useful if you intend to convert the string to - * a legacy encoding or pass it to a system with - * less capable Unicode handling. - * - * Return value: a newly allocated string, that is the - * normalized form of @str. - **/ -static gchar * -g_utf8_normalize (const gchar * str, gssize len, GNormalizeMode mode) -{ - gunichar *result_wc = _g_utf8_normalize_wc (str, len, mode); - gchar *result; - - result = g_ucs4_to_utf8 (result_wc, -1, NULL, NULL, NULL); - g_free (result_wc); - - return result; -} - -/* Public Libidn API starts here. */ - -/** - * stringprep_utf8_to_unichar - convert UTF-8 to Unicode code point - * @p: a pointer to Unicode character encoded as UTF-8 - * - * Converts a sequence of bytes encoded as UTF-8 to a Unicode character. - * If @p does not point to a valid UTF-8 encoded character, results are - * undefined. - * - * Return value: the resulting character. - **/ -uint32_t -stringprep_utf8_to_unichar (const char *p) -{ - return g_utf8_get_char (p); -} - -/** - * stringprep_unichar_to_utf8 - convert Unicode code point to UTF-8 - * @c: a ISO10646 character code - * @outbuf: output buffer, must have at least 6 bytes of space. - * If %NULL, the length will be computed and returned - * and nothing will be written to @outbuf. - * - * Converts a single character to UTF-8. - * - * Return value: number of bytes written. - **/ -int -stringprep_unichar_to_utf8 (uint32_t c, char *outbuf) -{ - return g_unichar_to_utf8 (c, outbuf); -} - -/** - * stringprep_utf8_to_ucs4 - convert UTF-8 string to UCS-4 - * @str: a UTF-8 encoded string - * @len: the maximum length of @str to use. If @len < 0, then - * the string is nul-terminated. - * @items_written: location to store the number of characters in the - * result, or %NULL. - * - * Convert a string from UTF-8 to a 32-bit fixed width - * representation as UCS-4, assuming valid UTF-8 input. - * This function does no error checking on the input. - * - * Return value: a pointer to a newly allocated UCS-4 string. - * This value must be freed with free(). - **/ -uint32_t * -stringprep_utf8_to_ucs4 (const char *str, ssize_t len, size_t * items_written) -{ - return g_utf8_to_ucs4_fast (str, (glong) len, (glong *) items_written); -} - -/** - * stringprep_ucs4_to_utf8 - convert UCS-4 string to UTF-8 - * @str: a UCS-4 encoded string - * @len: the maximum length of @str to use. If @len < 0, then - * the string is terminated with a 0 character. - * @items_read: location to store number of characters read read, or %NULL. - * @items_written: location to store number of bytes written or %NULL. - * The value here stored does not include the trailing 0 - * byte. - * - * Convert a string from a 32-bit fixed width representation as UCS-4. - * to UTF-8. The result will be terminated with a 0 byte. - * - * Return value: a pointer to a newly allocated UTF-8 string. - * This value must be freed with free(). If an - * error occurs, %NULL will be returned and - * @error set. - **/ -char * -stringprep_ucs4_to_utf8 (const uint32_t * str, ssize_t len, - size_t * items_read, size_t * items_written) -{ - return g_ucs4_to_utf8 (str, len, (glong *) items_read, - (glong *) items_written, NULL); -} - -/** - * stringprep_utf8_nfkc_normalize - normalize Unicode string - * @str: a UTF-8 encoded string. - * @len: length of @str, in bytes, or -1 if @str is nul-terminated. - * - * Converts a string into canonical form, standardizing - * such issues as whether a character with an accent - * is represented as a base character and combining - * accent or as a single precomposed character. - * - * The normalization mode is NFKC (ALL COMPOSE). It standardizes - * differences that do not affect the text content, such as the - * above-mentioned accent representation. It standardizes the - * "compatibility" characters in Unicode, such as SUPERSCRIPT THREE to - * the standard forms (in this case DIGIT THREE). Formatting - * information may be lost but for most text operations such - * characters should be considered the same. It returns a result with - * composed forms rather than a maximally decomposed form. - * - * Return value: a newly allocated string, that is the - * NFKC normalized form of @str. - **/ -char * -stringprep_utf8_nfkc_normalize (const char *str, ssize_t len) -{ - return g_utf8_normalize (str, len, G_NORMALIZE_NFKC); -} - -/** - * stringprep_ucs4_nfkc_normalize - normalize Unicode string - * @str: a Unicode string. - * @len: length of @str array, or -1 if @str is nul-terminated. - * - * Converts UCS4 string into UTF-8 and runs - * stringprep_utf8_nfkc_normalize(). - * - * Return value: a newly allocated Unicode string, that is the NFKC - * normalized form of @str. - **/ -uint32_t * -stringprep_ucs4_nfkc_normalize (uint32_t * str, ssize_t len) -{ - char *p; - uint32_t *result_wc; - - p = stringprep_ucs4_to_utf8 (str, len, 0, 0); - result_wc = _g_utf8_normalize_wc (p, -1, G_NORMALIZE_NFKC); - free (p); - - return result_wc; -} diff --git a/3rdParty/LibIDN/src/profiles.c b/3rdParty/LibIDN/src/profiles.c deleted file mode 100644 index f59305f..0000000 --- a/3rdParty/LibIDN/src/profiles.c +++ /dev/null @@ -1,313 +0,0 @@ -/* profiles.c --- Definitions of stringprep profiles. - * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Simon Josefsson - * - * This file is part of GNU Libidn. - * - * GNU Libidn is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * GNU Libidn 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with GNU Libidn; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - * - */ - -#include "stringprep.h" - -const Stringprep_profiles stringprep_profiles[] = { - {"Nameprep", stringprep_nameprep}, - {"KRBprep", stringprep_kerberos5}, /* Deprecate? */ - {"Nodeprep", stringprep_xmpp_nodeprep}, - {"Resourceprep", stringprep_xmpp_resourceprep}, - {"plain", stringprep_plain}, /* sasl-anon-00. */ - {"trace", stringprep_trace}, /* sasl-anon-01,02,03. */ - {"SASLprep", stringprep_saslprep}, - {"ISCSIprep", stringprep_iscsi}, /* Obsolete. */ - {"iSCSI", stringprep_iscsi}, /* IANA. */ - {NULL, NULL} -}; - -const Stringprep_profile stringprep_nameprep[] = { - {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_1}, - {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_2}, - {STRINGPREP_NFKC, 0, 0}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_1_2}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_3}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_4}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_5}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_6}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_7}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_9}, - {STRINGPREP_BIDI, 0, 0}, - {STRINGPREP_BIDI_PROHIBIT_TABLE, ~STRINGPREP_NO_BIDI, - stringprep_rfc3454_C_8}, - {STRINGPREP_BIDI_RAL_TABLE, 0, stringprep_rfc3454_D_1}, - {STRINGPREP_BIDI_L_TABLE, 0, stringprep_rfc3454_D_2}, - {STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, - stringprep_rfc3454_A_1}, - {0} -}; - -const Stringprep_profile stringprep_kerberos5[] = { - /* XXX this is likely to be wrong as the specification is - a rough draft. */ - {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_1}, - {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_3}, - {STRINGPREP_NFKC, 0, 0}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_1_2}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_3}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_4}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_5}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_6}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_7}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_9}, - {STRINGPREP_BIDI, 0, 0}, - {STRINGPREP_BIDI_PROHIBIT_TABLE, ~STRINGPREP_NO_BIDI, - stringprep_rfc3454_C_8}, - {STRINGPREP_BIDI_RAL_TABLE, 0, stringprep_rfc3454_D_1}, - {STRINGPREP_BIDI_L_TABLE, 0, stringprep_rfc3454_D_2}, - {STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, - stringprep_rfc3454_A_1}, - {0} -}; - -const Stringprep_table_element stringprep_xmpp_nodeprep_prohibit[] = { - {0x000022}, /* #x22 (") */ - {0x000026}, /* #x26 (&) */ - {0x000027}, /* #x27 (') */ - {0x00002F}, /* #x2F (/) */ - {0x00003A}, /* #x3A (:) */ - {0x00003C}, /* #x3C (<) */ - {0x00003E}, /* #x3E (>) */ - {0x000040}, /* #x40 (@) */ - {0} -}; - -const Stringprep_profile stringprep_xmpp_nodeprep[] = { - {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_1}, - {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_2}, - {STRINGPREP_NFKC, 0, 0}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_1_1}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_1_2}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_1}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_3}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_4}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_5}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_6}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_7}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_9}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_xmpp_nodeprep_prohibit}, - {STRINGPREP_BIDI, 0, 0}, - {STRINGPREP_BIDI_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8}, - {STRINGPREP_BIDI_RAL_TABLE, 0, stringprep_rfc3454_D_1}, - {STRINGPREP_BIDI_L_TABLE, 0, stringprep_rfc3454_D_2}, - {STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, - stringprep_rfc3454_A_1}, - {0} -}; - -const Stringprep_profile stringprep_xmpp_resourceprep[] = { - {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_1}, - {STRINGPREP_NFKC, 0, 0}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_1_2}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_1}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_3}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_4}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_5}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_6}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_7}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_9}, - {STRINGPREP_BIDI, 0, 0}, - {STRINGPREP_BIDI_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8}, - {STRINGPREP_BIDI_RAL_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_1}, - {STRINGPREP_BIDI_L_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_2}, - {STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, - stringprep_rfc3454_A_1}, - {0} -}; - -const Stringprep_profile stringprep_plain[] = { - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_1}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_3}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_4}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_5}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_6}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_9}, - {STRINGPREP_BIDI, 0, 0}, - {STRINGPREP_BIDI_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8}, - {STRINGPREP_BIDI_RAL_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_1}, - {STRINGPREP_BIDI_L_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_2}, - {0} -}; - -const Stringprep_profile stringprep_trace[] = { - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_1}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_3}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_4}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_5}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_6}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_9}, - {STRINGPREP_BIDI, 0, 0}, - {STRINGPREP_BIDI_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8}, - {STRINGPREP_BIDI_RAL_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_1}, - {STRINGPREP_BIDI_L_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_2}, - {0} -}; - -const Stringprep_table_element stringprep_iscsi_prohibit[] = { - /* NB, since start == 0, we must have that end != 0 for the - end-of-table logic to work. */ - {0x0000, 1}, /* [ASCII CONTROL CHARACTERS and SPACE through ,] */ - {0x0001}, - {0x0002}, - {0x0003}, - {0x0004}, - {0x0005}, - {0x0006}, - {0x0007}, - {0x0008}, - {0x0009}, - {0x000A}, - {0x000B}, - {0x000C}, - {0x000D}, - {0x000E}, - {0x000F}, - {0x0010}, - {0x0011}, - {0x0012}, - {0x0013}, - {0x0014}, - {0x0015}, - {0x0016}, - {0x0017}, - {0x0018}, - {0x0019}, - {0x001A}, - {0x001B}, - {0x001C}, - {0x001D}, - {0x001E}, - {0x001F}, - {0x0020}, - {0x0021}, - {0x0022}, - {0x0023}, - {0x0024}, - {0x0025}, - {0x0026}, - {0x0027}, - {0x0028}, - {0x0029}, - {0x002A}, - {0x002B}, - {0x002C}, - {0x002F}, /* [ASCII /] */ - {0x003B}, /* [ASCII ; through @] */ - {0x003C}, - {0x003D}, - {0x003E}, - {0x003F}, - {0x0040}, - {0x005B}, /* [ASCII [ through `] */ - {0x005C}, - {0x005D}, - {0x005E}, - {0x005F}, - {0x0060}, - {0x007B}, /* [ASCII { through DEL] */ - {0x007C}, - {0x007D}, - {0x007E}, - {0x007F}, - {0x3002}, /* ideographic full stop */ - {0} -}; - -const Stringprep_profile stringprep_iscsi[] = { - {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_1}, - {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_2}, - {STRINGPREP_NFKC, 0, 0}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_1_1}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_1_2}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_1}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_3}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_4}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_5}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_6}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_7}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_9}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_iscsi_prohibit}, - {STRINGPREP_BIDI, 0, 0}, - {STRINGPREP_BIDI_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8}, - {STRINGPREP_BIDI_RAL_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_1}, - {STRINGPREP_BIDI_L_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_2}, - {STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, - stringprep_rfc3454_A_1}, - {0} -}; - -const Stringprep_table_element stringprep_saslprep_space_map[] = { - {0x0000A0, 0, {0x0020}}, /* 00A0; NO-BREAK SPACE */ - {0x001680, 0, {0x0020}}, /* 1680; OGHAM SPACE MARK */ - {0x002000, 0, {0x0020}}, /* 2000; EN QUAD */ - {0x002001, 0, {0x0020}}, /* 2001; EM QUAD */ - {0x002002, 0, {0x0020}}, /* 2002; EN SPACE */ - {0x002003, 0, {0x0020}}, /* 2003; EM SPACE */ - {0x002004, 0, {0x0020}}, /* 2004; THREE-PER-EM SPACE */ - {0x002005, 0, {0x0020}}, /* 2005; FOUR-PER-EM SPACE */ - {0x002006, 0, {0x0020}}, /* 2006; SIX-PER-EM SPACE */ - {0x002007, 0, {0x0020}}, /* 2007; FIGURE SPACE */ - {0x002008, 0, {0x0020}}, /* 2008; PUNCTUATION SPACE */ - {0x002009, 0, {0x0020}}, /* 2009; THIN SPACE */ - {0x00200A, 0, {0x0020}}, /* 200A; HAIR SPACE */ - {0x00200B, 0, {0x0020}}, /* 200B; ZERO WIDTH SPACE */ - {0x00202F, 0, {0x0020}}, /* 202F; NARROW NO-BREAK SPACE */ - {0x00205F, 0, {0x0020}}, /* 205F; MEDIUM MATHEMATICAL SPACE */ - {0x003000, 0, {0x0020}}, /* 3000; IDEOGRAPHIC SPACE */ - {0} -}; - -const Stringprep_profile stringprep_saslprep[] = { - {STRINGPREP_MAP_TABLE, 0, stringprep_saslprep_space_map}, - {STRINGPREP_MAP_TABLE, 0, stringprep_rfc3454_B_1}, - {STRINGPREP_NFKC, 0, 0}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_1_2}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_1}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_2_2}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_3}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_4}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_5}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_6}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_7}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8}, - {STRINGPREP_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_9}, - {STRINGPREP_BIDI, 0, 0}, - {STRINGPREP_BIDI_PROHIBIT_TABLE, 0, stringprep_rfc3454_C_8}, - {STRINGPREP_BIDI_RAL_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_1}, - {STRINGPREP_BIDI_L_TABLE, ~STRINGPREP_NO_BIDI, stringprep_rfc3454_D_2}, - {STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, - stringprep_rfc3454_A_1}, - {0} -}; diff --git a/3rdParty/LibIDN/src/punycode.c b/3rdParty/LibIDN/src/punycode.c deleted file mode 100644 index 36ffee0..0000000 --- a/3rdParty/LibIDN/src/punycode.c +++ /dev/null @@ -1,456 +0,0 @@ -/* punycode.c --- Implementation of punycode used to ASCII encode IDN's. - * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Simon Josefsson - * - * This file is part of GNU Libidn. - * - * GNU Libidn is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * GNU Libidn 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with GNU Libidn; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - * - */ - -/* - * This file is derived from RFC 3492bis written by Adam M. Costello. - * - * Disclaimer and license: Regarding this entire document or any - * portion of it (including the pseudocode and C code), the author - * makes no guarantees and is not responsible for any damage resulting - * from its use. The author grants irrevocable permission to anyone - * to use, modify, and distribute it in any way that does not diminish - * the rights of anyone else to use, modify, and distribute it, - * provided that redistributed derivative works do not contain - * misleading author or version information. Derivative works need - * not be licensed under similar terms. - * - * Copyright (C) The Internet Society (2003). All Rights Reserved. - * - * This document and translations of it may be copied and furnished to - * others, and derivative works that comment on or otherwise explain it - * or assist in its implementation may be prepared, copied, published - * and distributed, in whole or in part, without restriction of any - * kind, provided that the above copyright notice and this paragraph are - * included on all such copies and derivative works. However, this - * document itself may not be modified in any way, such as by removing - * the copyright notice or references to the Internet Society or other - * Internet organizations, except as needed for the purpose of - * developing Internet standards in which case the procedures for - * copyrights defined in the Internet Standards process must be - * followed, or as required to translate it into languages other than - * English. - * - * The limited permissions granted above are perpetual and will not be - * revoked by the Internet Society or its successors or assigns. - * - * This document and the information contained herein is provided on an - * "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING - * TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING - * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION - * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF - * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include <string.h> - -#include "punycode.h" - -/*** Bootstring parameters for Punycode ***/ - -enum -{ base = 36, tmin = 1, tmax = 26, skew = 38, damp = 700, - initial_bias = 72, initial_n = 0x80, delimiter = 0x2D -}; - -/* basic(cp) tests whether cp is a basic code point: */ -#define basic(cp) ((punycode_uint)(cp) < 0x80) - -/* delim(cp) tests whether cp is a delimiter: */ -#define delim(cp) ((cp) == delimiter) - -/* decode_digit(cp) returns the numeric value of a basic code */ -/* point (for use in representing integers) in the range 0 to */ -/* base-1, or base if cp does not represent a value. */ - -static punycode_uint -decode_digit (punycode_uint cp) -{ - return cp - 48 < 10 ? cp - 22 : cp - 65 < 26 ? cp - 65 : - cp - 97 < 26 ? cp - 97 : base; -} - -/* encode_digit(d,flag) returns the basic code point whose value */ -/* (when used for representing integers) is d, which needs to be in */ -/* the range 0 to base-1. The lowercase form is used unless flag is */ -/* nonzero, in which case the uppercase form is used. The behavior */ -/* is undefined if flag is nonzero and digit d has no uppercase form. */ - -static char -encode_digit (punycode_uint d, int flag) -{ - return d + 22 + 75 * (d < 26) - ((flag != 0) << 5); - /* 0..25 map to ASCII a..z or A..Z */ - /* 26..35 map to ASCII 0..9 */ -} - -/* flagged(bcp) tests whether a basic code point is flagged */ -/* (uppercase). The behavior is undefined if bcp is not a */ -/* basic code point. */ - -#define flagged(bcp) ((punycode_uint)(bcp) - 65 < 26) - -/* encode_basic(bcp,flag) forces a basic code point to lowercase */ -/* if flag is zero, uppercase if flag is nonzero, and returns */ -/* the resulting code point. The code point is unchanged if it */ -/* is caseless. The behavior is undefined if bcp is not a basic */ -/* code point. */ - -static char -encode_basic (punycode_uint bcp, int flag) -{ - bcp -= (bcp - 97 < 26) << 5; - return bcp + ((!flag && (bcp - 65 < 26)) << 5); -} - -/*** Platform-specific constants ***/ - -/* maxint is the maximum value of a punycode_uint variable: */ -static const punycode_uint maxint = -1; -/* Because maxint is unsigned, -1 becomes the maximum value. */ - -/*** Bias adaptation function ***/ - -static punycode_uint -adapt (punycode_uint delta, punycode_uint numpoints, int firsttime) -{ - punycode_uint k; - - delta = firsttime ? delta / damp : delta >> 1; - /* delta >> 1 is a faster way of doing delta / 2 */ - delta += delta / numpoints; - - for (k = 0; delta > ((base - tmin) * tmax) / 2; k += base) - { - delta /= base - tmin; - } - - return k + (base - tmin + 1) * delta / (delta + skew); -} - -/*** Main encode function ***/ - -/** - * punycode_encode - encode Unicode to Punycode - * @input_length: The number of code points in the @input array and - * the number of flags in the @case_flags array. - * @input: An array of code points. They are presumed to be Unicode - * code points, but that is not strictly REQUIRED. The array - * contains code points, not code units. UTF-16 uses code units - * D800 through DFFF to refer to code points 10000..10FFFF. The - * code points D800..DFFF do not occur in any valid Unicode string. - * The code points that can occur in Unicode strings (0..D7FF and - * E000..10FFFF) are also called Unicode scalar values. - * @case_flags: A %NULL pointer or an array of boolean values parallel - * to the @input array. Nonzero (true, flagged) suggests that the - * corresponding Unicode character be forced to uppercase after - * being decoded (if possible), and zero (false, unflagged) suggests - * that it be forced to lowercase (if possible). ASCII code points - * (0..7F) are encoded literally, except that ASCII letters are - * forced to uppercase or lowercase according to the corresponding - * case flags. If @case_flags is a %NULL pointer then ASCII letters - * are left as they are, and other code points are treated as - * unflagged. - * @output_length: The caller passes in the maximum number of ASCII - * code points that it can receive. On successful return it will - * contain the number of ASCII code points actually output. - * @output: An array of ASCII code points. It is *not* - * null-terminated; it will contain zeros if and only if the @input - * contains zeros. (Of course the caller can leave room for a - * terminator and add one if needed.) - * - * Converts a sequence of code points (presumed to be Unicode code - * points) to Punycode. - * - * Return value: The return value can be any of the #Punycode_status - * values defined above except %PUNYCODE_BAD_INPUT. If not - * %PUNYCODE_SUCCESS, then @output_size and @output might contain - * garbage. - **/ -int -punycode_encode (size_t input_length, - const punycode_uint input[], - const unsigned char case_flags[], - size_t * output_length, char output[]) -{ - punycode_uint input_len, n, delta, h, b, bias, j, m, q, k, t; - size_t out, max_out; - - /* The Punycode spec assumes that the input length is the same type */ - /* of integer as a code point, so we need to convert the size_t to */ - /* a punycode_uint, which could overflow. */ - - if (input_length > maxint) - return punycode_overflow; - input_len = (punycode_uint) input_length; - - /* Initialize the state: */ - - n = initial_n; - delta = 0; - out = 0; - max_out = *output_length; - bias = initial_bias; - - /* Handle the basic code points: */ - - for (j = 0; j < input_len; ++j) - { - if (basic (input[j])) - { - if (max_out - out < 2) - return punycode_big_output; - output[out++] = case_flags ? - encode_basic (input[j], case_flags[j]) : (char) input[j]; - } - /* else if (input[j] < n) return punycode_bad_input; */ - /* (not needed for Punycode with unsigned code points) */ - } - - h = b = (punycode_uint) out; - /* cannot overflow because out <= input_len <= maxint */ - - /* h is the number of code points that have been handled, b is the */ - /* number of basic code points, and out is the number of ASCII code */ - /* points that have been output. */ - - if (b > 0) - output[out++] = delimiter; - - /* Main encoding loop: */ - - while (h < input_len) - { - /* All non-basic code points < n have been */ - /* handled already. Find the next larger one: */ - - for (m = maxint, j = 0; j < input_len; ++j) - { - /* if (basic(input[j])) continue; */ - /* (not needed for Punycode) */ - if (input[j] >= n && input[j] < m) - m = input[j]; - } - - /* Increase delta enough to advance the decoder's */ - /* <n,i> state to <m,0>, but guard against overflow: */ - - if (m - n > (maxint - delta) / (h + 1)) - return punycode_overflow; - delta += (m - n) * (h + 1); - n = m; - - for (j = 0; j < input_len; ++j) - { - /* Punycode does not need to check whether input[j] is basic: */ - if (input[j] < n /* || basic(input[j]) */ ) - { - if (++delta == 0) - return punycode_overflow; - } - - if (input[j] == n) - { - /* Represent delta as a generalized variable-length integer: */ - - for (q = delta, k = base;; k += base) - { - if (out >= max_out) - return punycode_big_output; - t = k <= bias /* + tmin */ ? tmin : /* +tmin not needed */ - k >= bias + tmax ? tmax : k - bias; - if (q < t) - break; - output[out++] = encode_digit (t + (q - t) % (base - t), 0); - q = (q - t) / (base - t); - } - - output[out++] = encode_digit (q, case_flags && case_flags[j]); - bias = adapt (delta, h + 1, h == b); - delta = 0; - ++h; - } - } - - ++delta, ++n; - } - - *output_length = out; - return punycode_success; -} - -/*** Main decode function ***/ - -/** - * punycode_decode - decode Punycode to Unicode - * @input_length: The number of ASCII code points in the @input array. - * @input: An array of ASCII code points (0..7F). - * @output_length: The caller passes in the maximum number of code - * points that it can receive into the @output array (which is also - * the maximum number of flags that it can receive into the - * @case_flags array, if @case_flags is not a %NULL pointer). On - * successful return it will contain the number of code points - * actually output (which is also the number of flags actually - * output, if case_flags is not a null pointer). The decoder will - * never need to output more code points than the number of ASCII - * code points in the input, because of the way the encoding is - * defined. The number of code points output cannot exceed the - * maximum possible value of a punycode_uint, even if the supplied - * @output_length is greater than that. - * @output: An array of code points like the input argument of - * punycode_encode() (see above). - * @case_flags: A %NULL pointer (if the flags are not needed by the - * caller) or an array of boolean values parallel to the @output - * array. Nonzero (true, flagged) suggests that the corresponding - * Unicode character be forced to uppercase by the caller (if - * possible), and zero (false, unflagged) suggests that it be forced - * to lowercase (if possible). ASCII code points (0..7F) are output - * already in the proper case, but their flags will be set - * appropriately so that applying the flags would be harmless. - * - * Converts Punycode to a sequence of code points (presumed to be - * Unicode code points). - * - * Return value: The return value can be any of the #Punycode_status - * values defined above. If not %PUNYCODE_SUCCESS, then - * @output_length, @output, and @case_flags might contain garbage. - * - **/ -int -punycode_decode (size_t input_length, - const char input[], - size_t * output_length, - punycode_uint output[], unsigned char case_flags[]) -{ - punycode_uint n, out, i, max_out, bias, oldi, w, k, digit, t; - size_t b, j, in; - - /* Initialize the state: */ - - n = initial_n; - out = i = 0; - max_out = *output_length > maxint ? maxint - : (punycode_uint) * output_length; - bias = initial_bias; - - /* Handle the basic code points: Let b be the number of input code */ - /* points before the last delimiter, or 0 if there is none, then */ - /* copy the first b code points to the output. */ - - for (b = j = 0; j < input_length; ++j) - if (delim (input[j])) - b = j; - if (b > max_out) - return punycode_big_output; - - for (j = 0; j < b; ++j) - { - if (case_flags) - case_flags[out] = flagged (input[j]); - if (!basic (input[j])) - return punycode_bad_input; - output[out++] = input[j]; - } - - /* Main decoding loop: Start just after the last delimiter if any */ - /* basic code points were copied; start at the beginning otherwise. */ - - for (in = b > 0 ? b + 1 : 0; in < input_length; ++out) - { - - /* in is the index of the next ASCII code point to be consumed, */ - /* and out is the number of code points in the output array. */ - - /* Decode a generalized variable-length integer into delta, */ - /* which gets added to i. The overflow checking is easier */ - /* if we increase i as we go, then subtract off its starting */ - /* value at the end to obtain delta. */ - - for (oldi = i, w = 1, k = base;; k += base) - { - if (in >= input_length) - return punycode_bad_input; - digit = decode_digit (input[in++]); - if (digit >= base) - return punycode_bad_input; - if (digit > (maxint - i) / w) - return punycode_overflow; - i += digit * w; - t = k <= bias /* + tmin */ ? tmin : /* +tmin not needed */ - k >= bias + tmax ? tmax : k - bias; - if (digit < t) - break; - if (w > maxint / (base - t)) - return punycode_overflow; - w *= (base - t); - } - - bias = adapt (i - oldi, out + 1, oldi == 0); - - /* i was supposed to wrap around from out+1 to 0, */ - /* incrementing n each time, so we'll fix that now: */ - - if (i / (out + 1) > maxint - n) - return punycode_overflow; - n += i / (out + 1); - i %= (out + 1); - - /* Insert n at position i of the output: */ - - /* not needed for Punycode: */ - /* if (basic(n)) return punycode_invalid_input; */ - if (out >= max_out) - return punycode_big_output; - - if (case_flags) - { - memmove (case_flags + i + 1, case_flags + i, out - i); - /* Case of last ASCII code point determines case flag: */ - case_flags[i] = flagged (input[in - 1]); - } - - memmove (output + i + 1, output + i, (out - i) * sizeof *output); - output[i++] = n; - } - - *output_length = (size_t) out; - /* cannot overflow because out <= old value of *output_length */ - return punycode_success; -} - -/** - * punycode_uint - * - * Unicode code point data type, this is always a 32 bit unsigned - * integer. - */ - -/** - * Punycode_status - * @PUNYCODE_SUCCESS: Successful operation. This value is guaranteed - * to always be zero, the remaining ones are only guaranteed to hold - * non-zero values, for logical comparison purposes. - * @PUNYCODE_BAD_INPUT: Input is invalid. - * @PUNYCODE_BIG_OUTPUT: Output would exceed the space provided. - * @PUNYCODE_OVERFLOW: Input needs wider integers to process. - * - * Enumerated return codes of punycode_encode() and punycode_decode(). - * The value 0 is guaranteed to always correspond to success. - */ diff --git a/3rdParty/LibIDN/src/punycode.h b/3rdParty/LibIDN/src/punycode.h deleted file mode 100644 index 4872417..0000000 --- a/3rdParty/LibIDN/src/punycode.h +++ /dev/null @@ -1,218 +0,0 @@ -/* punycode.h --- Declarations for punycode functions. - * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Simon Josefsson - * - * This file is part of GNU Libidn. - * - * GNU Libidn is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * GNU Libidn 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with GNU Libidn; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - * - */ - -/* - * This file is derived from RFC 3492bis written by Adam M. Costello. - * - * Disclaimer and license: Regarding this entire document or any - * portion of it (including the pseudocode and C code), the author - * makes no guarantees and is not responsible for any damage resulting - * from its use. The author grants irrevocable permission to anyone - * to use, modify, and distribute it in any way that does not diminish - * the rights of anyone else to use, modify, and distribute it, - * provided that redistributed derivative works do not contain - * misleading author or version information. Derivative works need - * not be licensed under similar terms. - * - * Copyright (C) The Internet Society (2003). All Rights Reserved. - * - * This document and translations of it may be copied and furnished to - * others, and derivative works that comment on or otherwise explain it - * or assist in its implementation may be prepared, copied, published - * and distributed, in whole or in part, without restriction of any - * kind, provided that the above copyright notice and this paragraph are - * included on all such copies and derivative works. However, this - * document itself may not be modified in any way, such as by removing - * the copyright notice or references to the Internet Society or other - * Internet organizations, except as needed for the purpose of - * developing Internet standards in which case the procedures for - * copyrights defined in the Internet Standards process must be - * followed, or as required to translate it into languages other than - * English. - * - * The limited permissions granted above are perpetual and will not be - * revoked by the Internet Society or its successors or assigns. - * - * This document and the information contained herein is provided on an - * "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING - * TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING - * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION - * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF - * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - */ - -#ifndef _PUNYCODE_H -#define _PUNYCODE_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include <stddef.h> /* size_t */ -#include <idn-int.h> /* uint32_t */ - - enum punycode_status - { - punycode_success = 0, - punycode_bad_input = 1, /* Input is invalid. */ - punycode_big_output = 2, /* Output would exceed the space provided. */ - punycode_overflow = 3 /* Wider integers needed to process input. */ - }; - - typedef enum - { - PUNYCODE_SUCCESS = punycode_success, - PUNYCODE_BAD_INPUT = punycode_bad_input, - PUNYCODE_BIG_OUTPUT = punycode_big_output, - PUNYCODE_OVERFLOW = punycode_overflow - } Punycode_status; - - extern const char *punycode_strerror (Punycode_status rc); - -/* punycode_uint needs to be unsigned and needs to be */ -/* at least 26 bits wide. */ - - typedef uint32_t punycode_uint; - - extern int punycode_encode (size_t input_length, - const punycode_uint input[], - const unsigned char case_flags[], - size_t * output_length, char output[]); - -/* - punycode_encode() converts a sequence of code points (presumed to be - Unicode code points) to Punycode. - - Input arguments (to be supplied by the caller): - - input_length - The number of code points in the input array and the number - of flags in the case_flags array. - - input - An array of code points. They are presumed to be Unicode - code points, but that is not strictly REQUIRED. The - array contains code points, not code units. UTF-16 uses - code units D800 through DFFF to refer to code points - 10000..10FFFF. The code points D800..DFFF do not occur in - any valid Unicode string. The code points that can occur in - Unicode strings (0..D7FF and E000..10FFFF) are also called - Unicode scalar values. - - case_flags - A null pointer or an array of boolean values parallel to - the input array. Nonzero (true, flagged) suggests that the - corresponding Unicode character be forced to uppercase after - being decoded (if possible), and zero (false, unflagged) - suggests that it be forced to lowercase (if possible). - ASCII code points (0..7F) are encoded literally, except that - ASCII letters are forced to uppercase or lowercase according - to the corresponding case flags. If case_flags is a null - pointer then ASCII letters are left as they are, and other - code points are treated as unflagged. - - Output arguments (to be filled in by the function): - - output - An array of ASCII code points. It is *not* null-terminated; - it will contain zeros if and only if the input contains - zeros. (Of course the caller can leave room for a - terminator and add one if needed.) - - Input/output arguments (to be supplied by the caller and overwritten - by the function): - - output_length - The caller passes in the maximum number of ASCII code points - that it can receive. On successful return it will contain - the number of ASCII code points actually output. - - Return value: - - Can be any of the punycode_status values defined above except - punycode_bad_input. If not punycode_success, then output_size - and output might contain garbage. -*/ - - extern int punycode_decode (size_t input_length, - const char input[], - size_t * output_length, - punycode_uint output[], - unsigned char case_flags[]); - -/* - punycode_decode() converts Punycode to a sequence of code points - (presumed to be Unicode code points). - - Input arguments (to be supplied by the caller): - - input_length - The number of ASCII code points in the input array. - - input - An array of ASCII code points (0..7F). - - Output arguments (to be filled in by the function): - - output - An array of code points like the input argument of - punycode_encode() (see above). - - case_flags - A null pointer (if the flags are not needed by the caller) - or an array of boolean values parallel to the output array. - Nonzero (true, flagged) suggests that the corresponding - Unicode character be forced to uppercase by the caller (if - possible), and zero (false, unflagged) suggests that it - be forced to lowercase (if possible). ASCII code points - (0..7F) are output already in the proper case, but their - flags will be set appropriately so that applying the flags - would be harmless. - - Input/output arguments (to be supplied by the caller and overwritten - by the function): - - output_length - The caller passes in the maximum number of code points - that it can receive into the output array (which is also - the maximum number of flags that it can receive into the - case_flags array, if case_flags is not a null pointer). On - successful return it will contain the number of code points - actually output (which is also the number of flags actually - output, if case_flags is not a null pointer). The decoder - will never need to output more code points than the number - of ASCII code points in the input, because of the way the - encoding is defined. The number of code points output - cannot exceed the maximum possible value of a punycode_uint, - even if the supplied output_length is greater than that. - - Return value: - - Can be any of the punycode_status values defined above. If not - punycode_success, then output_length, output, and case_flags - might contain garbage. -*/ - -#ifdef __cplusplus -} -#endif -#endif /* _PUNYCODE_H */ diff --git a/3rdParty/LibIDN/src/rfc3454.c b/3rdParty/LibIDN/src/rfc3454.c deleted file mode 100644 index 856b67a..0000000 --- a/3rdParty/LibIDN/src/rfc3454.c +++ /dev/null @@ -1,4252 +0,0 @@ -/* This file is automatically generated. DO NOT EDIT! - Instead, edit gen-stringprep-tables.pl and re-run. */ - -#include "stringprep.h" - -/* - * So we can use this material. There may be other legal analysis that - * also reach the same conclusion. - - */ - -const Stringprep_table_element stringprep_rfc3454_A_1[] = { - { 0x000221 }, /* 0221 */ - { 0x000234, 0x00024F }, /* 0234-024F */ - { 0x0002AE, 0x0002AF }, /* 02AE-02AF */ - { 0x0002EF, 0x0002FF }, /* 02EF-02FF */ - { 0x000350, 0x00035F }, /* 0350-035F */ - { 0x000370, 0x000373 }, /* 0370-0373 */ - { 0x000376, 0x000379 }, /* 0376-0379 */ - { 0x00037B, 0x00037D }, /* 037B-037D */ - { 0x00037F, 0x000383 }, /* 037F-0383 */ - { 0x00038B }, /* 038B */ - { 0x00038D }, /* 038D */ - { 0x0003A2 }, /* 03A2 */ - { 0x0003CF }, /* 03CF */ - { 0x0003F7, 0x0003FF }, /* 03F7-03FF */ - { 0x000487 }, /* 0487 */ - { 0x0004CF }, /* 04CF */ - { 0x0004F6, 0x0004F7 }, /* 04F6-04F7 */ - { 0x0004FA, 0x0004FF }, /* 04FA-04FF */ - { 0x000510, 0x000530 }, /* 0510-0530 */ - { 0x000557, 0x000558 }, /* 0557-0558 */ - { 0x000560 }, /* 0560 */ - { 0x000588 }, /* 0588 */ - { 0x00058B, 0x000590 }, /* 058B-0590 */ - { 0x0005A2 }, /* 05A2 */ - { 0x0005BA }, /* 05BA */ - { 0x0005C5, 0x0005CF }, /* 05C5-05CF */ - { 0x0005EB, 0x0005EF }, /* 05EB-05EF */ - { 0x0005F5, 0x00060B }, /* 05F5-060B */ - { 0x00060D, 0x00061A }, /* 060D-061A */ - { 0x00061C, 0x00061E }, /* 061C-061E */ - { 0x000620 }, /* 0620 */ - { 0x00063B, 0x00063F }, /* 063B-063F */ - { 0x000656, 0x00065F }, /* 0656-065F */ - { 0x0006EE, 0x0006EF }, /* 06EE-06EF */ - { 0x0006FF }, /* 06FF */ - { 0x00070E }, /* 070E */ - { 0x00072D, 0x00072F }, /* 072D-072F */ - { 0x00074B, 0x00077F }, /* 074B-077F */ - { 0x0007B2, 0x000900 }, /* 07B2-0900 */ - { 0x000904 }, /* 0904 */ - { 0x00093A, 0x00093B }, /* 093A-093B */ - { 0x00094E, 0x00094F }, /* 094E-094F */ - { 0x000955, 0x000957 }, /* 0955-0957 */ - { 0x000971, 0x000980 }, /* 0971-0980 */ - { 0x000984 }, /* 0984 */ - { 0x00098D, 0x00098E }, /* 098D-098E */ - { 0x000991, 0x000992 }, /* 0991-0992 */ - { 0x0009A9 }, /* 09A9 */ - { 0x0009B1 }, /* 09B1 */ - { 0x0009B3, 0x0009B5 }, /* 09B3-09B5 */ - { 0x0009BA, 0x0009BB }, /* 09BA-09BB */ - { 0x0009BD }, /* 09BD */ - { 0x0009C5, 0x0009C6 }, /* 09C5-09C6 */ - { 0x0009C9, 0x0009CA }, /* 09C9-09CA */ - { 0x0009CE, 0x0009D6 }, /* 09CE-09D6 */ - { 0x0009D8, 0x0009DB }, /* 09D8-09DB */ - { 0x0009DE }, /* 09DE */ - { 0x0009E4, 0x0009E5 }, /* 09E4-09E5 */ - { 0x0009FB, 0x000A01 }, /* 09FB-0A01 */ - { 0x000A03, 0x000A04 }, /* 0A03-0A04 */ - { 0x000A0B, 0x000A0E }, /* 0A0B-0A0E */ - { 0x000A11, 0x000A12 }, /* 0A11-0A12 */ - { 0x000A29 }, /* 0A29 */ - { 0x000A31 }, /* 0A31 */ - { 0x000A34 }, /* 0A34 */ - { 0x000A37 }, /* 0A37 */ - { 0x000A3A, 0x000A3B }, /* 0A3A-0A3B */ - { 0x000A3D }, /* 0A3D */ - { 0x000A43, 0x000A46 }, /* 0A43-0A46 */ - { 0x000A49, 0x000A4A }, /* 0A49-0A4A */ - { 0x000A4E, 0x000A58 }, /* 0A4E-0A58 */ - { 0x000A5D }, /* 0A5D */ - { 0x000A5F, 0x000A65 }, /* 0A5F-0A65 */ - { 0x000A75, 0x000A80 }, /* 0A75-0A80 */ - { 0x000A84 }, /* 0A84 */ - { 0x000A8C }, /* 0A8C */ - { 0x000A8E }, /* 0A8E */ - { 0x000A92 }, /* 0A92 */ - { 0x000AA9 }, /* 0AA9 */ - { 0x000AB1 }, /* 0AB1 */ - { 0x000AB4 }, /* 0AB4 */ - { 0x000ABA, 0x000ABB }, /* 0ABA-0ABB */ - { 0x000AC6 }, /* 0AC6 */ - { 0x000ACA }, /* 0ACA */ - { 0x000ACE, 0x000ACF }, /* 0ACE-0ACF */ - { 0x000AD1, 0x000ADF }, /* 0AD1-0ADF */ - { 0x000AE1, 0x000AE5 }, /* 0AE1-0AE5 */ - { 0x000AF0, 0x000B00 }, /* 0AF0-0B00 */ - { 0x000B04 }, /* 0B04 */ - { 0x000B0D, 0x000B0E }, /* 0B0D-0B0E */ - { 0x000B11, 0x000B12 }, /* 0B11-0B12 */ - { 0x000B29 }, /* 0B29 */ - { 0x000B31 }, /* 0B31 */ - { 0x000B34, 0x000B35 }, /* 0B34-0B35 */ - { 0x000B3A, 0x000B3B }, /* 0B3A-0B3B */ - { 0x000B44, 0x000B46 }, /* 0B44-0B46 */ - { 0x000B49, 0x000B4A }, /* 0B49-0B4A */ - { 0x000B4E, 0x000B55 }, /* 0B4E-0B55 */ - { 0x000B58, 0x000B5B }, /* 0B58-0B5B */ - { 0x000B5E }, /* 0B5E */ - { 0x000B62, 0x000B65 }, /* 0B62-0B65 */ - { 0x000B71, 0x000B81 }, /* 0B71-0B81 */ - { 0x000B84 }, /* 0B84 */ - { 0x000B8B, 0x000B8D }, /* 0B8B-0B8D */ - { 0x000B91 }, /* 0B91 */ - { 0x000B96, 0x000B98 }, /* 0B96-0B98 */ - { 0x000B9B }, /* 0B9B */ - { 0x000B9D }, /* 0B9D */ - { 0x000BA0, 0x000BA2 }, /* 0BA0-0BA2 */ - { 0x000BA5, 0x000BA7 }, /* 0BA5-0BA7 */ - { 0x000BAB, 0x000BAD }, /* 0BAB-0BAD */ - { 0x000BB6 }, /* 0BB6 */ - { 0x000BBA, 0x000BBD }, /* 0BBA-0BBD */ - { 0x000BC3, 0x000BC5 }, /* 0BC3-0BC5 */ - { 0x000BC9 }, /* 0BC9 */ - { 0x000BCE, 0x000BD6 }, /* 0BCE-0BD6 */ - { 0x000BD8, 0x000BE6 }, /* 0BD8-0BE6 */ - { 0x000BF3, 0x000C00 }, /* 0BF3-0C00 */ - { 0x000C04 }, /* 0C04 */ - { 0x000C0D }, /* 0C0D */ - { 0x000C11 }, /* 0C11 */ - { 0x000C29 }, /* 0C29 */ - { 0x000C34 }, /* 0C34 */ - { 0x000C3A, 0x000C3D }, /* 0C3A-0C3D */ - { 0x000C45 }, /* 0C45 */ - { 0x000C49 }, /* 0C49 */ - { 0x000C4E, 0x000C54 }, /* 0C4E-0C54 */ - { 0x000C57, 0x000C5F }, /* 0C57-0C5F */ - { 0x000C62, 0x000C65 }, /* 0C62-0C65 */ - { 0x000C70, 0x000C81 }, /* 0C70-0C81 */ - { 0x000C84 }, /* 0C84 */ - { 0x000C8D }, /* 0C8D */ - { 0x000C91 }, /* 0C91 */ - { 0x000CA9 }, /* 0CA9 */ - { 0x000CB4 }, /* 0CB4 */ - { 0x000CBA, 0x000CBD }, /* 0CBA-0CBD */ - { 0x000CC5 }, /* 0CC5 */ - { 0x000CC9 }, /* 0CC9 */ - { 0x000CCE, 0x000CD4 }, /* 0CCE-0CD4 */ - { 0x000CD7, 0x000CDD }, /* 0CD7-0CDD */ - { 0x000CDF }, /* 0CDF */ - { 0x000CE2, 0x000CE5 }, /* 0CE2-0CE5 */ - { 0x000CF0, 0x000D01 }, /* 0CF0-0D01 */ - { 0x000D04 }, /* 0D04 */ - { 0x000D0D }, /* 0D0D */ - { 0x000D11 }, /* 0D11 */ - { 0x000D29 }, /* 0D29 */ - { 0x000D3A, 0x000D3D }, /* 0D3A-0D3D */ - { 0x000D44, 0x000D45 }, /* 0D44-0D45 */ - { 0x000D49 }, /* 0D49 */ - { 0x000D4E, 0x000D56 }, /* 0D4E-0D56 */ - { 0x000D58, 0x000D5F }, /* 0D58-0D5F */ - { 0x000D62, 0x000D65 }, /* 0D62-0D65 */ - { 0x000D70, 0x000D81 }, /* 0D70-0D81 */ - { 0x000D84 }, /* 0D84 */ - { 0x000D97, 0x000D99 }, /* 0D97-0D99 */ - { 0x000DB2 }, /* 0DB2 */ - { 0x000DBC }, /* 0DBC */ - { 0x000DBE, 0x000DBF }, /* 0DBE-0DBF */ - { 0x000DC7, 0x000DC9 }, /* 0DC7-0DC9 */ - { 0x000DCB, 0x000DCE }, /* 0DCB-0DCE */ - { 0x000DD5 }, /* 0DD5 */ - { 0x000DD7 }, /* 0DD7 */ - { 0x000DE0, 0x000DF1 }, /* 0DE0-0DF1 */ - { 0x000DF5, 0x000E00 }, /* 0DF5-0E00 */ - { 0x000E3B, 0x000E3E }, /* 0E3B-0E3E */ - { 0x000E5C, 0x000E80 }, /* 0E5C-0E80 */ - { 0x000E83 }, /* 0E83 */ - { 0x000E85, 0x000E86 }, /* 0E85-0E86 */ - { 0x000E89 }, /* 0E89 */ - { 0x000E8B, 0x000E8C }, /* 0E8B-0E8C */ - { 0x000E8E, 0x000E93 }, /* 0E8E-0E93 */ - { 0x000E98 }, /* 0E98 */ - { 0x000EA0 }, /* 0EA0 */ - { 0x000EA4 }, /* 0EA4 */ - { 0x000EA6 }, /* 0EA6 */ - { 0x000EA8, 0x000EA9 }, /* 0EA8-0EA9 */ - { 0x000EAC }, /* 0EAC */ - { 0x000EBA }, /* 0EBA */ - { 0x000EBE, 0x000EBF }, /* 0EBE-0EBF */ - { 0x000EC5 }, /* 0EC5 */ - { 0x000EC7 }, /* 0EC7 */ - { 0x000ECE, 0x000ECF }, /* 0ECE-0ECF */ - { 0x000EDA, 0x000EDB }, /* 0EDA-0EDB */ - { 0x000EDE, 0x000EFF }, /* 0EDE-0EFF */ - { 0x000F48 }, /* 0F48 */ - { 0x000F6B, 0x000F70 }, /* 0F6B-0F70 */ - { 0x000F8C, 0x000F8F }, /* 0F8C-0F8F */ - { 0x000F98 }, /* 0F98 */ - { 0x000FBD }, /* 0FBD */ - { 0x000FCD, 0x000FCE }, /* 0FCD-0FCE */ - { 0x000FD0, 0x000FFF }, /* 0FD0-0FFF */ - { 0x001022 }, /* 1022 */ - { 0x001028 }, /* 1028 */ - { 0x00102B }, /* 102B */ - { 0x001033, 0x001035 }, /* 1033-1035 */ - { 0x00103A, 0x00103F }, /* 103A-103F */ - { 0x00105A, 0x00109F }, /* 105A-109F */ - { 0x0010C6, 0x0010CF }, /* 10C6-10CF */ - { 0x0010F9, 0x0010FA }, /* 10F9-10FA */ - { 0x0010FC, 0x0010FF }, /* 10FC-10FF */ - { 0x00115A, 0x00115E }, /* 115A-115E */ - { 0x0011A3, 0x0011A7 }, /* 11A3-11A7 */ - { 0x0011FA, 0x0011FF }, /* 11FA-11FF */ - { 0x001207 }, /* 1207 */ - { 0x001247 }, /* 1247 */ - { 0x001249 }, /* 1249 */ - { 0x00124E, 0x00124F }, /* 124E-124F */ - { 0x001257 }, /* 1257 */ - { 0x001259 }, /* 1259 */ - { 0x00125E, 0x00125F }, /* 125E-125F */ - { 0x001287 }, /* 1287 */ - { 0x001289 }, /* 1289 */ - { 0x00128E, 0x00128F }, /* 128E-128F */ - { 0x0012AF }, /* 12AF */ - { 0x0012B1 }, /* 12B1 */ - { 0x0012B6, 0x0012B7 }, /* 12B6-12B7 */ - { 0x0012BF }, /* 12BF */ - { 0x0012C1 }, /* 12C1 */ - { 0x0012C6, 0x0012C7 }, /* 12C6-12C7 */ - { 0x0012CF }, /* 12CF */ - { 0x0012D7 }, /* 12D7 */ - { 0x0012EF }, /* 12EF */ - { 0x00130F }, /* 130F */ - { 0x001311 }, /* 1311 */ - { 0x001316, 0x001317 }, /* 1316-1317 */ - { 0x00131F }, /* 131F */ - { 0x001347 }, /* 1347 */ - { 0x00135B, 0x001360 }, /* 135B-1360 */ - { 0x00137D, 0x00139F }, /* 137D-139F */ - { 0x0013F5, 0x001400 }, /* 13F5-1400 */ - { 0x001677, 0x00167F }, /* 1677-167F */ - { 0x00169D, 0x00169F }, /* 169D-169F */ - { 0x0016F1, 0x0016FF }, /* 16F1-16FF */ - { 0x00170D }, /* 170D */ - { 0x001715, 0x00171F }, /* 1715-171F */ - { 0x001737, 0x00173F }, /* 1737-173F */ - { 0x001754, 0x00175F }, /* 1754-175F */ - { 0x00176D }, /* 176D */ - { 0x001771 }, /* 1771 */ - { 0x001774, 0x00177F }, /* 1774-177F */ - { 0x0017DD, 0x0017DF }, /* 17DD-17DF */ - { 0x0017EA, 0x0017FF }, /* 17EA-17FF */ - { 0x00180F }, /* 180F */ - { 0x00181A, 0x00181F }, /* 181A-181F */ - { 0x001878, 0x00187F }, /* 1878-187F */ - { 0x0018AA, 0x001DFF }, /* 18AA-1DFF */ - { 0x001E9C, 0x001E9F }, /* 1E9C-1E9F */ - { 0x001EFA, 0x001EFF }, /* 1EFA-1EFF */ - { 0x001F16, 0x001F17 }, /* 1F16-1F17 */ - { 0x001F1E, 0x001F1F }, /* 1F1E-1F1F */ - { 0x001F46, 0x001F47 }, /* 1F46-1F47 */ - { 0x001F4E, 0x001F4F }, /* 1F4E-1F4F */ - { 0x001F58 }, /* 1F58 */ - { 0x001F5A }, /* 1F5A */ - { 0x001F5C }, /* 1F5C */ - { 0x001F5E }, /* 1F5E */ - { 0x001F7E, 0x001F7F }, /* 1F7E-1F7F */ - { 0x001FB5 }, /* 1FB5 */ - { 0x001FC5 }, /* 1FC5 */ - { 0x001FD4, 0x001FD5 }, /* 1FD4-1FD5 */ - { 0x001FDC }, /* 1FDC */ - { 0x001FF0, 0x001FF1 }, /* 1FF0-1FF1 */ - { 0x001FF5 }, /* 1FF5 */ - { 0x001FFF }, /* 1FFF */ - { 0x002053, 0x002056 }, /* 2053-2056 */ - { 0x002058, 0x00205E }, /* 2058-205E */ - { 0x002064, 0x002069 }, /* 2064-2069 */ - { 0x002072, 0x002073 }, /* 2072-2073 */ - { 0x00208F, 0x00209F }, /* 208F-209F */ - { 0x0020B2, 0x0020CF }, /* 20B2-20CF */ - { 0x0020EB, 0x0020FF }, /* 20EB-20FF */ - { 0x00213B, 0x00213C }, /* 213B-213C */ - { 0x00214C, 0x002152 }, /* 214C-2152 */ - { 0x002184, 0x00218F }, /* 2184-218F */ - { 0x0023CF, 0x0023FF }, /* 23CF-23FF */ - { 0x002427, 0x00243F }, /* 2427-243F */ - { 0x00244B, 0x00245F }, /* 244B-245F */ - { 0x0024FF }, /* 24FF */ - { 0x002614, 0x002615 }, /* 2614-2615 */ - { 0x002618 }, /* 2618 */ - { 0x00267E, 0x00267F }, /* 267E-267F */ - { 0x00268A, 0x002700 }, /* 268A-2700 */ - { 0x002705 }, /* 2705 */ - { 0x00270A, 0x00270B }, /* 270A-270B */ - { 0x002728 }, /* 2728 */ - { 0x00274C }, /* 274C */ - { 0x00274E }, /* 274E */ - { 0x002753, 0x002755 }, /* 2753-2755 */ - { 0x002757 }, /* 2757 */ - { 0x00275F, 0x002760 }, /* 275F-2760 */ - { 0x002795, 0x002797 }, /* 2795-2797 */ - { 0x0027B0 }, /* 27B0 */ - { 0x0027BF, 0x0027CF }, /* 27BF-27CF */ - { 0x0027EC, 0x0027EF }, /* 27EC-27EF */ - { 0x002B00, 0x002E7F }, /* 2B00-2E7F */ - { 0x002E9A }, /* 2E9A */ - { 0x002EF4, 0x002EFF }, /* 2EF4-2EFF */ - { 0x002FD6, 0x002FEF }, /* 2FD6-2FEF */ - { 0x002FFC, 0x002FFF }, /* 2FFC-2FFF */ - { 0x003040 }, /* 3040 */ - { 0x003097, 0x003098 }, /* 3097-3098 */ - { 0x003100, 0x003104 }, /* 3100-3104 */ - { 0x00312D, 0x003130 }, /* 312D-3130 */ - { 0x00318F }, /* 318F */ - { 0x0031B8, 0x0031EF }, /* 31B8-31EF */ - { 0x00321D, 0x00321F }, /* 321D-321F */ - { 0x003244, 0x003250 }, /* 3244-3250 */ - { 0x00327C, 0x00327E }, /* 327C-327E */ - { 0x0032CC, 0x0032CF }, /* 32CC-32CF */ - { 0x0032FF }, /* 32FF */ - { 0x003377, 0x00337A }, /* 3377-337A */ - { 0x0033DE, 0x0033DF }, /* 33DE-33DF */ - { 0x0033FF }, /* 33FF */ - { 0x004DB6, 0x004DFF }, /* 4DB6-4DFF */ - { 0x009FA6, 0x009FFF }, /* 9FA6-9FFF */ - { 0x00A48D, 0x00A48F }, /* A48D-A48F */ - { 0x00A4C7, 0x00ABFF }, /* A4C7-ABFF */ - { 0x00D7A4, 0x00D7FF }, /* D7A4-D7FF */ - { 0x00FA2E, 0x00FA2F }, /* FA2E-FA2F */ - { 0x00FA6B, 0x00FAFF }, /* FA6B-FAFF */ - { 0x00FB07, 0x00FB12 }, /* FB07-FB12 */ - { 0x00FB18, 0x00FB1C }, /* FB18-FB1C */ - { 0x00FB37 }, /* FB37 */ - { 0x00FB3D }, /* FB3D */ - { 0x00FB3F }, /* FB3F */ - { 0x00FB42 }, /* FB42 */ - { 0x00FB45 }, /* FB45 */ - { 0x00FBB2, 0x00FBD2 }, /* FBB2-FBD2 */ - { 0x00FD40, 0x00FD4F }, /* FD40-FD4F */ - { 0x00FD90, 0x00FD91 }, /* FD90-FD91 */ - { 0x00FDC8, 0x00FDCF }, /* FDC8-FDCF */ - { 0x00FDFD, 0x00FDFF }, /* FDFD-FDFF */ - { 0x00FE10, 0x00FE1F }, /* FE10-FE1F */ - { 0x00FE24, 0x00FE2F }, /* FE24-FE2F */ - { 0x00FE47, 0x00FE48 }, /* FE47-FE48 */ - { 0x00FE53 }, /* FE53 */ - { 0x00FE67 }, /* FE67 */ - { 0x00FE6C, 0x00FE6F }, /* FE6C-FE6F */ - { 0x00FE75 }, /* FE75 */ - { 0x00FEFD, 0x00FEFE }, /* FEFD-FEFE */ - { 0x00FF00 }, /* FF00 */ - { 0x00FFBF, 0x00FFC1 }, /* FFBF-FFC1 */ - { 0x00FFC8, 0x00FFC9 }, /* FFC8-FFC9 */ - { 0x00FFD0, 0x00FFD1 }, /* FFD0-FFD1 */ - { 0x00FFD8, 0x00FFD9 }, /* FFD8-FFD9 */ - { 0x00FFDD, 0x00FFDF }, /* FFDD-FFDF */ - { 0x00FFE7 }, /* FFE7 */ - { 0x00FFEF, 0x00FFF8 }, /* FFEF-FFF8 */ - { 0x010000, 0x0102FF }, /* 10000-102FF */ - { 0x01031F }, /* 1031F */ - { 0x010324, 0x01032F }, /* 10324-1032F */ - { 0x01034B, 0x0103FF }, /* 1034B-103FF */ - { 0x010426, 0x010427 }, /* 10426-10427 */ - { 0x01044E, 0x01CFFF }, /* 1044E-1CFFF */ - { 0x01D0F6, 0x01D0FF }, /* 1D0F6-1D0FF */ - { 0x01D127, 0x01D129 }, /* 1D127-1D129 */ - { 0x01D1DE, 0x01D3FF }, /* 1D1DE-1D3FF */ - { 0x01D455 }, /* 1D455 */ - { 0x01D49D }, /* 1D49D */ - { 0x01D4A0, 0x01D4A1 }, /* 1D4A0-1D4A1 */ - { 0x01D4A3, 0x01D4A4 }, /* 1D4A3-1D4A4 */ - { 0x01D4A7, 0x01D4A8 }, /* 1D4A7-1D4A8 */ - { 0x01D4AD }, /* 1D4AD */ - { 0x01D4BA }, /* 1D4BA */ - { 0x01D4BC }, /* 1D4BC */ - { 0x01D4C1 }, /* 1D4C1 */ - { 0x01D4C4 }, /* 1D4C4 */ - { 0x01D506 }, /* 1D506 */ - { 0x01D50B, 0x01D50C }, /* 1D50B-1D50C */ - { 0x01D515 }, /* 1D515 */ - { 0x01D51D }, /* 1D51D */ - { 0x01D53A }, /* 1D53A */ - { 0x01D53F }, /* 1D53F */ - { 0x01D545 }, /* 1D545 */ - { 0x01D547, 0x01D549 }, /* 1D547-1D549 */ - { 0x01D551 }, /* 1D551 */ - { 0x01D6A4, 0x01D6A7 }, /* 1D6A4-1D6A7 */ - { 0x01D7CA, 0x01D7CD }, /* 1D7CA-1D7CD */ - { 0x01D800, 0x01FFFD }, /* 1D800-1FFFD */ - { 0x02A6D7, 0x02F7FF }, /* 2A6D7-2F7FF */ - { 0x02FA1E, 0x02FFFD }, /* 2FA1E-2FFFD */ - { 0x030000, 0x03FFFD }, /* 30000-3FFFD */ - { 0x040000, 0x04FFFD }, /* 40000-4FFFD */ - { 0x050000, 0x05FFFD }, /* 50000-5FFFD */ - { 0x060000, 0x06FFFD }, /* 60000-6FFFD */ - { 0x070000, 0x07FFFD }, /* 70000-7FFFD */ - { 0x080000, 0x08FFFD }, /* 80000-8FFFD */ - { 0x090000, 0x09FFFD }, /* 90000-9FFFD */ - { 0x0A0000, 0x0AFFFD }, /* A0000-AFFFD */ - { 0x0B0000, 0x0BFFFD }, /* B0000-BFFFD */ - { 0x0C0000, 0x0CFFFD }, /* C0000-CFFFD */ - { 0x0D0000, 0x0DFFFD }, /* D0000-DFFFD */ - { 0x0E0000 }, /* E0000 */ - { 0x0E0002, 0x0E001F }, /* E0002-E001F */ - { 0x0E0080, 0x0EFFFD }, /* E0080-EFFFD */ - { 0 }, -}; - - -/* - * E0080-EFFFD - * - */ - -const Stringprep_table_element stringprep_rfc3454_B_1[] = { - { 0x0000AD }, /* 00AD; ; Map to nothing */ - { 0x00034F }, /* 034F; ; Map to nothing */ - { 0x001806 }, /* 1806; ; Map to nothing */ - { 0x00180B }, /* 180B; ; Map to nothing */ - { 0x00180C }, /* 180C; ; Map to nothing */ - { 0x00180D }, /* 180D; ; Map to nothing */ - { 0x00200B }, /* 200B; ; Map to nothing */ - { 0x00200C }, /* 200C; ; Map to nothing */ - { 0x00200D }, /* 200D; ; Map to nothing */ - { 0x002060 }, /* 2060; ; Map to nothing */ - { 0x00FE00 }, /* FE00; ; Map to nothing */ - { 0x00FE01 }, /* FE01; ; Map to nothing */ - { 0x00FE02 }, /* FE02; ; Map to nothing */ - { 0x00FE03 }, /* FE03; ; Map to nothing */ - { 0x00FE04 }, /* FE04; ; Map to nothing */ - { 0x00FE05 }, /* FE05; ; Map to nothing */ - { 0x00FE06 }, /* FE06; ; Map to nothing */ - { 0x00FE07 }, /* FE07; ; Map to nothing */ - { 0x00FE08 }, /* FE08; ; Map to nothing */ - { 0x00FE09 }, /* FE09; ; Map to nothing */ - { 0x00FE0A }, /* FE0A; ; Map to nothing */ - { 0x00FE0B }, /* FE0B; ; Map to nothing */ - { 0x00FE0C }, /* FE0C; ; Map to nothing */ - { 0x00FE0D }, /* FE0D; ; Map to nothing */ - { 0x00FE0E }, /* FE0E; ; Map to nothing */ - { 0x00FE0F }, /* FE0F; ; Map to nothing */ - { 0x00FEFF }, /* FEFF; ; Map to nothing */ - { 0 }, -}; - - -/* - * FEFF; ; Map to nothing - * - */ - -const Stringprep_table_element stringprep_rfc3454_B_2[] = { - { 0x000041, 0, { 0x000061 }}, /* 0041; 0061; Case map */ - { 0x000042, 0, { 0x000062 }}, /* 0042; 0062; Case map */ - { 0x000043, 0, { 0x000063 }}, /* 0043; 0063; Case map */ - { 0x000044, 0, { 0x000064 }}, /* 0044; 0064; Case map */ - { 0x000045, 0, { 0x000065 }}, /* 0045; 0065; Case map */ - { 0x000046, 0, { 0x000066 }}, /* 0046; 0066; Case map */ - { 0x000047, 0, { 0x000067 }}, /* 0047; 0067; Case map */ - { 0x000048, 0, { 0x000068 }}, /* 0048; 0068; Case map */ - { 0x000049, 0, { 0x000069 }}, /* 0049; 0069; Case map */ - { 0x00004A, 0, { 0x00006A }}, /* 004A; 006A; Case map */ - { 0x00004B, 0, { 0x00006B }}, /* 004B; 006B; Case map */ - { 0x00004C, 0, { 0x00006C }}, /* 004C; 006C; Case map */ - { 0x00004D, 0, { 0x00006D }}, /* 004D; 006D; Case map */ - { 0x00004E, 0, { 0x00006E }}, /* 004E; 006E; Case map */ - { 0x00004F, 0, { 0x00006F }}, /* 004F; 006F; Case map */ - { 0x000050, 0, { 0x000070 }}, /* 0050; 0070; Case map */ - { 0x000051, 0, { 0x000071 }}, /* 0051; 0071; Case map */ - { 0x000052, 0, { 0x000072 }}, /* 0052; 0072; Case map */ - { 0x000053, 0, { 0x000073 }}, /* 0053; 0073; Case map */ - { 0x000054, 0, { 0x000074 }}, /* 0054; 0074; Case map */ - { 0x000055, 0, { 0x000075 }}, /* 0055; 0075; Case map */ - { 0x000056, 0, { 0x000076 }}, /* 0056; 0076; Case map */ - { 0x000057, 0, { 0x000077 }}, /* 0057; 0077; Case map */ - { 0x000058, 0, { 0x000078 }}, /* 0058; 0078; Case map */ - { 0x000059, 0, { 0x000079 }}, /* 0059; 0079; Case map */ - { 0x00005A, 0, { 0x00007A }}, /* 005A; 007A; Case map */ - { 0x0000B5, 0, { 0x0003BC }}, /* 00B5; 03BC; Case map */ - { 0x0000C0, 0, { 0x0000E0 }}, /* 00C0; 00E0; Case map */ - { 0x0000C1, 0, { 0x0000E1 }}, /* 00C1; 00E1; Case map */ - { 0x0000C2, 0, { 0x0000E2 }}, /* 00C2; 00E2; Case map */ - { 0x0000C3, 0, { 0x0000E3 }}, /* 00C3; 00E3; Case map */ - { 0x0000C4, 0, { 0x0000E4 }}, /* 00C4; 00E4; Case map */ - { 0x0000C5, 0, { 0x0000E5 }}, /* 00C5; 00E5; Case map */ - { 0x0000C6, 0, { 0x0000E6 }}, /* 00C6; 00E6; Case map */ - { 0x0000C7, 0, { 0x0000E7 }}, /* 00C7; 00E7; Case map */ - { 0x0000C8, 0, { 0x0000E8 }}, /* 00C8; 00E8; Case map */ - { 0x0000C9, 0, { 0x0000E9 }}, /* 00C9; 00E9; Case map */ - { 0x0000CA, 0, { 0x0000EA }}, /* 00CA; 00EA; Case map */ - { 0x0000CB, 0, { 0x0000EB }}, /* 00CB; 00EB; Case map */ - { 0x0000CC, 0, { 0x0000EC }}, /* 00CC; 00EC; Case map */ - { 0x0000CD, 0, { 0x0000ED }}, /* 00CD; 00ED; Case map */ - { 0x0000CE, 0, { 0x0000EE }}, /* 00CE; 00EE; Case map */ - { 0x0000CF, 0, { 0x0000EF }}, /* 00CF; 00EF; Case map */ - { 0x0000D0, 0, { 0x0000F0 }}, /* 00D0; 00F0; Case map */ - { 0x0000D1, 0, { 0x0000F1 }}, /* 00D1; 00F1; Case map */ - { 0x0000D2, 0, { 0x0000F2 }}, /* 00D2; 00F2; Case map */ - { 0x0000D3, 0, { 0x0000F3 }}, /* 00D3; 00F3; Case map */ - { 0x0000D4, 0, { 0x0000F4 }}, /* 00D4; 00F4; Case map */ - { 0x0000D5, 0, { 0x0000F5 }}, /* 00D5; 00F5; Case map */ - { 0x0000D6, 0, { 0x0000F6 }}, /* 00D6; 00F6; Case map */ - { 0x0000D8, 0, { 0x0000F8 }}, /* 00D8; 00F8; Case map */ - { 0x0000D9, 0, { 0x0000F9 }}, /* 00D9; 00F9; Case map */ - { 0x0000DA, 0, { 0x0000FA }}, /* 00DA; 00FA; Case map */ - { 0x0000DB, 0, { 0x0000FB }}, /* 00DB; 00FB; Case map */ - { 0x0000DC, 0, { 0x0000FC }}, /* 00DC; 00FC; Case map */ - { 0x0000DD, 0, { 0x0000FD }}, /* 00DD; 00FD; Case map */ - { 0x0000DE, 0, { 0x0000FE }}, /* 00DE; 00FE; Case map */ - { 0x0000DF, 0, { 0x000073, /* 00DF; 0073 0073; Case map */ - 0x000073 }}, - { 0x000100, 0, { 0x000101 }}, /* 0100; 0101; Case map */ - { 0x000102, 0, { 0x000103 }}, /* 0102; 0103; Case map */ - { 0x000104, 0, { 0x000105 }}, /* 0104; 0105; Case map */ - { 0x000106, 0, { 0x000107 }}, /* 0106; 0107; Case map */ - { 0x000108, 0, { 0x000109 }}, /* 0108; 0109; Case map */ - { 0x00010A, 0, { 0x00010B }}, /* 010A; 010B; Case map */ - { 0x00010C, 0, { 0x00010D }}, /* 010C; 010D; Case map */ - { 0x00010E, 0, { 0x00010F }}, /* 010E; 010F; Case map */ - { 0x000110, 0, { 0x000111 }}, /* 0110; 0111; Case map */ - { 0x000112, 0, { 0x000113 }}, /* 0112; 0113; Case map */ - { 0x000114, 0, { 0x000115 }}, /* 0114; 0115; Case map */ - { 0x000116, 0, { 0x000117 }}, /* 0116; 0117; Case map */ - { 0x000118, 0, { 0x000119 }}, /* 0118; 0119; Case map */ - { 0x00011A, 0, { 0x00011B }}, /* 011A; 011B; Case map */ - { 0x00011C, 0, { 0x00011D }}, /* 011C; 011D; Case map */ - { 0x00011E, 0, { 0x00011F }}, /* 011E; 011F; Case map */ - { 0x000120, 0, { 0x000121 }}, /* 0120; 0121; Case map */ - { 0x000122, 0, { 0x000123 }}, /* 0122; 0123; Case map */ - { 0x000124, 0, { 0x000125 }}, /* 0124; 0125; Case map */ - { 0x000126, 0, { 0x000127 }}, /* 0126; 0127; Case map */ - { 0x000128, 0, { 0x000129 }}, /* 0128; 0129; Case map */ - { 0x00012A, 0, { 0x00012B }}, /* 012A; 012B; Case map */ - { 0x00012C, 0, { 0x00012D }}, /* 012C; 012D; Case map */ - { 0x00012E, 0, { 0x00012F }}, /* 012E; 012F; Case map */ - { 0x000130, 0, { 0x000069, /* 0130; 0069 0307; Case map */ - 0x000307 }}, - { 0x000132, 0, { 0x000133 }}, /* 0132; 0133; Case map */ - { 0x000134, 0, { 0x000135 }}, /* 0134; 0135; Case map */ - { 0x000136, 0, { 0x000137 }}, /* 0136; 0137; Case map */ - { 0x000139, 0, { 0x00013A }}, /* 0139; 013A; Case map */ - { 0x00013B, 0, { 0x00013C }}, /* 013B; 013C; Case map */ - { 0x00013D, 0, { 0x00013E }}, /* 013D; 013E; Case map */ - { 0x00013F, 0, { 0x000140 }}, /* 013F; 0140; Case map */ - { 0x000141, 0, { 0x000142 }}, /* 0141; 0142; Case map */ - { 0x000143, 0, { 0x000144 }}, /* 0143; 0144; Case map */ - { 0x000145, 0, { 0x000146 }}, /* 0145; 0146; Case map */ - { 0x000147, 0, { 0x000148 }}, /* 0147; 0148; Case map */ - { 0x000149, 0, { 0x0002BC, /* 0149; 02BC 006E; Case map */ - 0x00006E }}, - { 0x00014A, 0, { 0x00014B }}, /* 014A; 014B; Case map */ - { 0x00014C, 0, { 0x00014D }}, /* 014C; 014D; Case map */ - { 0x00014E, 0, { 0x00014F }}, /* 014E; 014F; Case map */ - { 0x000150, 0, { 0x000151 }}, /* 0150; 0151; Case map */ - { 0x000152, 0, { 0x000153 }}, /* 0152; 0153; Case map */ - { 0x000154, 0, { 0x000155 }}, /* 0154; 0155; Case map */ - { 0x000156, 0, { 0x000157 }}, /* 0156; 0157; Case map */ - { 0x000158, 0, { 0x000159 }}, /* 0158; 0159; Case map */ - { 0x00015A, 0, { 0x00015B }}, /* 015A; 015B; Case map */ - { 0x00015C, 0, { 0x00015D }}, /* 015C; 015D; Case map */ - { 0x00015E, 0, { 0x00015F }}, /* 015E; 015F; Case map */ - { 0x000160, 0, { 0x000161 }}, /* 0160; 0161; Case map */ - { 0x000162, 0, { 0x000163 }}, /* 0162; 0163; Case map */ - { 0x000164, 0, { 0x000165 }}, /* 0164; 0165; Case map */ - { 0x000166, 0, { 0x000167 }}, /* 0166; 0167; Case map */ - { 0x000168, 0, { 0x000169 }}, /* 0168; 0169; Case map */ - { 0x00016A, 0, { 0x00016B }}, /* 016A; 016B; Case map */ - { 0x00016C, 0, { 0x00016D }}, /* 016C; 016D; Case map */ - { 0x00016E, 0, { 0x00016F }}, /* 016E; 016F; Case map */ - { 0x000170, 0, { 0x000171 }}, /* 0170; 0171; Case map */ - { 0x000172, 0, { 0x000173 }}, /* 0172; 0173; Case map */ - { 0x000174, 0, { 0x000175 }}, /* 0174; 0175; Case map */ - { 0x000176, 0, { 0x000177 }}, /* 0176; 0177; Case map */ - { 0x000178, 0, { 0x0000FF }}, /* 0178; 00FF; Case map */ - { 0x000179, 0, { 0x00017A }}, /* 0179; 017A; Case map */ - { 0x00017B, 0, { 0x00017C }}, /* 017B; 017C; Case map */ - { 0x00017D, 0, { 0x00017E }}, /* 017D; 017E; Case map */ - { 0x00017F, 0, { 0x000073 }}, /* 017F; 0073; Case map */ - { 0x000181, 0, { 0x000253 }}, /* 0181; 0253; Case map */ - { 0x000182, 0, { 0x000183 }}, /* 0182; 0183; Case map */ - { 0x000184, 0, { 0x000185 }}, /* 0184; 0185; Case map */ - { 0x000186, 0, { 0x000254 }}, /* 0186; 0254; Case map */ - { 0x000187, 0, { 0x000188 }}, /* 0187; 0188; Case map */ - { 0x000189, 0, { 0x000256 }}, /* 0189; 0256; Case map */ - { 0x00018A, 0, { 0x000257 }}, /* 018A; 0257; Case map */ - { 0x00018B, 0, { 0x00018C }}, /* 018B; 018C; Case map */ - { 0x00018E, 0, { 0x0001DD }}, /* 018E; 01DD; Case map */ - { 0x00018F, 0, { 0x000259 }}, /* 018F; 0259; Case map */ - { 0x000190, 0, { 0x00025B }}, /* 0190; 025B; Case map */ - { 0x000191, 0, { 0x000192 }}, /* 0191; 0192; Case map */ - { 0x000193, 0, { 0x000260 }}, /* 0193; 0260; Case map */ - { 0x000194, 0, { 0x000263 }}, /* 0194; 0263; Case map */ - { 0x000196, 0, { 0x000269 }}, /* 0196; 0269; Case map */ - { 0x000197, 0, { 0x000268 }}, /* 0197; 0268; Case map */ - { 0x000198, 0, { 0x000199 }}, /* 0198; 0199; Case map */ - { 0x00019C, 0, { 0x00026F }}, /* 019C; 026F; Case map */ - { 0x00019D, 0, { 0x000272 }}, /* 019D; 0272; Case map */ - { 0x00019F, 0, { 0x000275 }}, /* 019F; 0275; Case map */ - { 0x0001A0, 0, { 0x0001A1 }}, /* 01A0; 01A1; Case map */ - { 0x0001A2, 0, { 0x0001A3 }}, /* 01A2; 01A3; Case map */ - { 0x0001A4, 0, { 0x0001A5 }}, /* 01A4; 01A5; Case map */ - { 0x0001A6, 0, { 0x000280 }}, /* 01A6; 0280; Case map */ - { 0x0001A7, 0, { 0x0001A8 }}, /* 01A7; 01A8; Case map */ - { 0x0001A9, 0, { 0x000283 }}, /* 01A9; 0283; Case map */ - { 0x0001AC, 0, { 0x0001AD }}, /* 01AC; 01AD; Case map */ - { 0x0001AE, 0, { 0x000288 }}, /* 01AE; 0288; Case map */ - { 0x0001AF, 0, { 0x0001B0 }}, /* 01AF; 01B0; Case map */ - { 0x0001B1, 0, { 0x00028A }}, /* 01B1; 028A; Case map */ - { 0x0001B2, 0, { 0x00028B }}, /* 01B2; 028B; Case map */ - { 0x0001B3, 0, { 0x0001B4 }}, /* 01B3; 01B4; Case map */ - { 0x0001B5, 0, { 0x0001B6 }}, /* 01B5; 01B6; Case map */ - { 0x0001B7, 0, { 0x000292 }}, /* 01B7; 0292; Case map */ - { 0x0001B8, 0, { 0x0001B9 }}, /* 01B8; 01B9; Case map */ - { 0x0001BC, 0, { 0x0001BD }}, /* 01BC; 01BD; Case map */ - { 0x0001C4, 0, { 0x0001C6 }}, /* 01C4; 01C6; Case map */ - { 0x0001C5, 0, { 0x0001C6 }}, /* 01C5; 01C6; Case map */ - { 0x0001C7, 0, { 0x0001C9 }}, /* 01C7; 01C9; Case map */ - { 0x0001C8, 0, { 0x0001C9 }}, /* 01C8; 01C9; Case map */ - { 0x0001CA, 0, { 0x0001CC }}, /* 01CA; 01CC; Case map */ - { 0x0001CB, 0, { 0x0001CC }}, /* 01CB; 01CC; Case map */ - { 0x0001CD, 0, { 0x0001CE }}, /* 01CD; 01CE; Case map */ - { 0x0001CF, 0, { 0x0001D0 }}, /* 01CF; 01D0; Case map */ - { 0x0001D1, 0, { 0x0001D2 }}, /* 01D1; 01D2; Case map */ - { 0x0001D3, 0, { 0x0001D4 }}, /* 01D3; 01D4; Case map */ - { 0x0001D5, 0, { 0x0001D6 }}, /* 01D5; 01D6; Case map */ - { 0x0001D7, 0, { 0x0001D8 }}, /* 01D7; 01D8; Case map */ - { 0x0001D9, 0, { 0x0001DA }}, /* 01D9; 01DA; Case map */ - { 0x0001DB, 0, { 0x0001DC }}, /* 01DB; 01DC; Case map */ - { 0x0001DE, 0, { 0x0001DF }}, /* 01DE; 01DF; Case map */ - { 0x0001E0, 0, { 0x0001E1 }}, /* 01E0; 01E1; Case map */ - { 0x0001E2, 0, { 0x0001E3 }}, /* 01E2; 01E3; Case map */ - { 0x0001E4, 0, { 0x0001E5 }}, /* 01E4; 01E5; Case map */ - { 0x0001E6, 0, { 0x0001E7 }}, /* 01E6; 01E7; Case map */ - { 0x0001E8, 0, { 0x0001E9 }}, /* 01E8; 01E9; Case map */ - { 0x0001EA, 0, { 0x0001EB }}, /* 01EA; 01EB; Case map */ - { 0x0001EC, 0, { 0x0001ED }}, /* 01EC; 01ED; Case map */ - { 0x0001EE, 0, { 0x0001EF }}, /* 01EE; 01EF; Case map */ - { 0x0001F0, 0, { 0x00006A, /* 01F0; 006A 030C; Case map */ - 0x00030C }}, - { 0x0001F1, 0, { 0x0001F3 }}, /* 01F1; 01F3; Case map */ - { 0x0001F2, 0, { 0x0001F3 }}, /* 01F2; 01F3; Case map */ - { 0x0001F4, 0, { 0x0001F5 }}, /* 01F4; 01F5; Case map */ - { 0x0001F6, 0, { 0x000195 }}, /* 01F6; 0195; Case map */ - { 0x0001F7, 0, { 0x0001BF }}, /* 01F7; 01BF; Case map */ - { 0x0001F8, 0, { 0x0001F9 }}, /* 01F8; 01F9; Case map */ - { 0x0001FA, 0, { 0x0001FB }}, /* 01FA; 01FB; Case map */ - { 0x0001FC, 0, { 0x0001FD }}, /* 01FC; 01FD; Case map */ - { 0x0001FE, 0, { 0x0001FF }}, /* 01FE; 01FF; Case map */ - { 0x000200, 0, { 0x000201 }}, /* 0200; 0201; Case map */ - { 0x000202, 0, { 0x000203 }}, /* 0202; 0203; Case map */ - { 0x000204, 0, { 0x000205 }}, /* 0204; 0205; Case map */ - { 0x000206, 0, { 0x000207 }}, /* 0206; 0207; Case map */ - { 0x000208, 0, { 0x000209 }}, /* 0208; 0209; Case map */ - { 0x00020A, 0, { 0x00020B }}, /* 020A; 020B; Case map */ - { 0x00020C, 0, { 0x00020D }}, /* 020C; 020D; Case map */ - { 0x00020E, 0, { 0x00020F }}, /* 020E; 020F; Case map */ - { 0x000210, 0, { 0x000211 }}, /* 0210; 0211; Case map */ - { 0x000212, 0, { 0x000213 }}, /* 0212; 0213; Case map */ - { 0x000214, 0, { 0x000215 }}, /* 0214; 0215; Case map */ - { 0x000216, 0, { 0x000217 }}, /* 0216; 0217; Case map */ - { 0x000218, 0, { 0x000219 }}, /* 0218; 0219; Case map */ - { 0x00021A, 0, { 0x00021B }}, /* 021A; 021B; Case map */ - { 0x00021C, 0, { 0x00021D }}, /* 021C; 021D; Case map */ - { 0x00021E, 0, { 0x00021F }}, /* 021E; 021F; Case map */ - { 0x000220, 0, { 0x00019E }}, /* 0220; 019E; Case map */ - { 0x000222, 0, { 0x000223 }}, /* 0222; 0223; Case map */ - { 0x000224, 0, { 0x000225 }}, /* 0224; 0225; Case map */ - { 0x000226, 0, { 0x000227 }}, /* 0226; 0227; Case map */ - { 0x000228, 0, { 0x000229 }}, /* 0228; 0229; Case map */ - { 0x00022A, 0, { 0x00022B }}, /* 022A; 022B; Case map */ - { 0x00022C, 0, { 0x00022D }}, /* 022C; 022D; Case map */ - { 0x00022E, 0, { 0x00022F }}, /* 022E; 022F; Case map */ - { 0x000230, 0, { 0x000231 }}, /* 0230; 0231; Case map */ - { 0x000232, 0, { 0x000233 }}, /* 0232; 0233; Case map */ - { 0x000345, 0, { 0x0003B9 }}, /* 0345; 03B9; Case map */ - { 0x00037A, 0, { 0x000020, /* 037A; 0020 03B9; Additional folding */ - 0x0003B9 }}, - { 0x000386, 0, { 0x0003AC }}, /* 0386; 03AC; Case map */ - { 0x000388, 0, { 0x0003AD }}, /* 0388; 03AD; Case map */ - { 0x000389, 0, { 0x0003AE }}, /* 0389; 03AE; Case map */ - { 0x00038A, 0, { 0x0003AF }}, /* 038A; 03AF; Case map */ - { 0x00038C, 0, { 0x0003CC }}, /* 038C; 03CC; Case map */ - { 0x00038E, 0, { 0x0003CD }}, /* 038E; 03CD; Case map */ - { 0x00038F, 0, { 0x0003CE }}, /* 038F; 03CE; Case map */ - { 0x000390, 0, { 0x0003B9, /* 0390; 03B9 0308 0301; Case map */ - 0x000308, 0x000301 }}, - { 0x000391, 0, { 0x0003B1 }}, /* 0391; 03B1; Case map */ - { 0x000392, 0, { 0x0003B2 }}, /* 0392; 03B2; Case map */ - { 0x000393, 0, { 0x0003B3 }}, /* 0393; 03B3; Case map */ - { 0x000394, 0, { 0x0003B4 }}, /* 0394; 03B4; Case map */ - { 0x000395, 0, { 0x0003B5 }}, /* 0395; 03B5; Case map */ - { 0x000396, 0, { 0x0003B6 }}, /* 0396; 03B6; Case map */ - { 0x000397, 0, { 0x0003B7 }}, /* 0397; 03B7; Case map */ - { 0x000398, 0, { 0x0003B8 }}, /* 0398; 03B8; Case map */ - { 0x000399, 0, { 0x0003B9 }}, /* 0399; 03B9; Case map */ - { 0x00039A, 0, { 0x0003BA }}, /* 039A; 03BA; Case map */ - { 0x00039B, 0, { 0x0003BB }}, /* 039B; 03BB; Case map */ - { 0x00039C, 0, { 0x0003BC }}, /* 039C; 03BC; Case map */ - { 0x00039D, 0, { 0x0003BD }}, /* 039D; 03BD; Case map */ - { 0x00039E, 0, { 0x0003BE }}, /* 039E; 03BE; Case map */ - { 0x00039F, 0, { 0x0003BF }}, /* 039F; 03BF; Case map */ - { 0x0003A0, 0, { 0x0003C0 }}, /* 03A0; 03C0; Case map */ - { 0x0003A1, 0, { 0x0003C1 }}, /* 03A1; 03C1; Case map */ - { 0x0003A3, 0, { 0x0003C3 }}, /* 03A3; 03C3; Case map */ - { 0x0003A4, 0, { 0x0003C4 }}, /* 03A4; 03C4; Case map */ - { 0x0003A5, 0, { 0x0003C5 }}, /* 03A5; 03C5; Case map */ - { 0x0003A6, 0, { 0x0003C6 }}, /* 03A6; 03C6; Case map */ - { 0x0003A7, 0, { 0x0003C7 }}, /* 03A7; 03C7; Case map */ - { 0x0003A8, 0, { 0x0003C8 }}, /* 03A8; 03C8; Case map */ - { 0x0003A9, 0, { 0x0003C9 }}, /* 03A9; 03C9; Case map */ - { 0x0003AA, 0, { 0x0003CA }}, /* 03AA; 03CA; Case map */ - { 0x0003AB, 0, { 0x0003CB }}, /* 03AB; 03CB; Case map */ - { 0x0003B0, 0, { 0x0003C5, /* 03B0; 03C5 0308 0301; Case map */ - 0x000308, 0x000301 }}, - { 0x0003C2, 0, { 0x0003C3 }}, /* 03C2; 03C3; Case map */ - { 0x0003D0, 0, { 0x0003B2 }}, /* 03D0; 03B2; Case map */ - { 0x0003D1, 0, { 0x0003B8 }}, /* 03D1; 03B8; Case map */ - { 0x0003D2, 0, { 0x0003C5 }}, /* 03D2; 03C5; Additional folding */ - { 0x0003D3, 0, { 0x0003CD }}, /* 03D3; 03CD; Additional folding */ - { 0x0003D4, 0, { 0x0003CB }}, /* 03D4; 03CB; Additional folding */ - { 0x0003D5, 0, { 0x0003C6 }}, /* 03D5; 03C6; Case map */ - { 0x0003D6, 0, { 0x0003C0 }}, /* 03D6; 03C0; Case map */ - { 0x0003D8, 0, { 0x0003D9 }}, /* 03D8; 03D9; Case map */ - { 0x0003DA, 0, { 0x0003DB }}, /* 03DA; 03DB; Case map */ - { 0x0003DC, 0, { 0x0003DD }}, /* 03DC; 03DD; Case map */ - { 0x0003DE, 0, { 0x0003DF }}, /* 03DE; 03DF; Case map */ - { 0x0003E0, 0, { 0x0003E1 }}, /* 03E0; 03E1; Case map */ - { 0x0003E2, 0, { 0x0003E3 }}, /* 03E2; 03E3; Case map */ - { 0x0003E4, 0, { 0x0003E5 }}, /* 03E4; 03E5; Case map */ - { 0x0003E6, 0, { 0x0003E7 }}, /* 03E6; 03E7; Case map */ - { 0x0003E8, 0, { 0x0003E9 }}, /* 03E8; 03E9; Case map */ - { 0x0003EA, 0, { 0x0003EB }}, /* 03EA; 03EB; Case map */ - { 0x0003EC, 0, { 0x0003ED }}, /* 03EC; 03ED; Case map */ - { 0x0003EE, 0, { 0x0003EF }}, /* 03EE; 03EF; Case map */ - { 0x0003F0, 0, { 0x0003BA }}, /* 03F0; 03BA; Case map */ - { 0x0003F1, 0, { 0x0003C1 }}, /* 03F1; 03C1; Case map */ - { 0x0003F2, 0, { 0x0003C3 }}, /* 03F2; 03C3; Case map */ - { 0x0003F4, 0, { 0x0003B8 }}, /* 03F4; 03B8; Case map */ - { 0x0003F5, 0, { 0x0003B5 }}, /* 03F5; 03B5; Case map */ - { 0x000400, 0, { 0x000450 }}, /* 0400; 0450; Case map */ - { 0x000401, 0, { 0x000451 }}, /* 0401; 0451; Case map */ - { 0x000402, 0, { 0x000452 }}, /* 0402; 0452; Case map */ - { 0x000403, 0, { 0x000453 }}, /* 0403; 0453; Case map */ - { 0x000404, 0, { 0x000454 }}, /* 0404; 0454; Case map */ - { 0x000405, 0, { 0x000455 }}, /* 0405; 0455; Case map */ - { 0x000406, 0, { 0x000456 }}, /* 0406; 0456; Case map */ - { 0x000407, 0, { 0x000457 }}, /* 0407; 0457; Case map */ - { 0x000408, 0, { 0x000458 }}, /* 0408; 0458; Case map */ - { 0x000409, 0, { 0x000459 }}, /* 0409; 0459; Case map */ - { 0x00040A, 0, { 0x00045A }}, /* 040A; 045A; Case map */ - { 0x00040B, 0, { 0x00045B }}, /* 040B; 045B; Case map */ - { 0x00040C, 0, { 0x00045C }}, /* 040C; 045C; Case map */ - { 0x00040D, 0, { 0x00045D }}, /* 040D; 045D; Case map */ - { 0x00040E, 0, { 0x00045E }}, /* 040E; 045E; Case map */ - { 0x00040F, 0, { 0x00045F }}, /* 040F; 045F; Case map */ - { 0x000410, 0, { 0x000430 }}, /* 0410; 0430; Case map */ - { 0x000411, 0, { 0x000431 }}, /* 0411; 0431; Case map */ - { 0x000412, 0, { 0x000432 }}, /* 0412; 0432; Case map */ - { 0x000413, 0, { 0x000433 }}, /* 0413; 0433; Case map */ - { 0x000414, 0, { 0x000434 }}, /* 0414; 0434; Case map */ - { 0x000415, 0, { 0x000435 }}, /* 0415; 0435; Case map */ - { 0x000416, 0, { 0x000436 }}, /* 0416; 0436; Case map */ - { 0x000417, 0, { 0x000437 }}, /* 0417; 0437; Case map */ - { 0x000418, 0, { 0x000438 }}, /* 0418; 0438; Case map */ - { 0x000419, 0, { 0x000439 }}, /* 0419; 0439; Case map */ - { 0x00041A, 0, { 0x00043A }}, /* 041A; 043A; Case map */ - { 0x00041B, 0, { 0x00043B }}, /* 041B; 043B; Case map */ - { 0x00041C, 0, { 0x00043C }}, /* 041C; 043C; Case map */ - { 0x00041D, 0, { 0x00043D }}, /* 041D; 043D; Case map */ - { 0x00041E, 0, { 0x00043E }}, /* 041E; 043E; Case map */ - { 0x00041F, 0, { 0x00043F }}, /* 041F; 043F; Case map */ - { 0x000420, 0, { 0x000440 }}, /* 0420; 0440; Case map */ - { 0x000421, 0, { 0x000441 }}, /* 0421; 0441; Case map */ - { 0x000422, 0, { 0x000442 }}, /* 0422; 0442; Case map */ - { 0x000423, 0, { 0x000443 }}, /* 0423; 0443; Case map */ - { 0x000424, 0, { 0x000444 }}, /* 0424; 0444; Case map */ - { 0x000425, 0, { 0x000445 }}, /* 0425; 0445; Case map */ - { 0x000426, 0, { 0x000446 }}, /* 0426; 0446; Case map */ - { 0x000427, 0, { 0x000447 }}, /* 0427; 0447; Case map */ - { 0x000428, 0, { 0x000448 }}, /* 0428; 0448; Case map */ - { 0x000429, 0, { 0x000449 }}, /* 0429; 0449; Case map */ - { 0x00042A, 0, { 0x00044A }}, /* 042A; 044A; Case map */ - { 0x00042B, 0, { 0x00044B }}, /* 042B; 044B; Case map */ - { 0x00042C, 0, { 0x00044C }}, /* 042C; 044C; Case map */ - { 0x00042D, 0, { 0x00044D }}, /* 042D; 044D; Case map */ - { 0x00042E, 0, { 0x00044E }}, /* 042E; 044E; Case map */ - { 0x00042F, 0, { 0x00044F }}, /* 042F; 044F; Case map */ - { 0x000460, 0, { 0x000461 }}, /* 0460; 0461; Case map */ - { 0x000462, 0, { 0x000463 }}, /* 0462; 0463; Case map */ - { 0x000464, 0, { 0x000465 }}, /* 0464; 0465; Case map */ - { 0x000466, 0, { 0x000467 }}, /* 0466; 0467; Case map */ - { 0x000468, 0, { 0x000469 }}, /* 0468; 0469; Case map */ - { 0x00046A, 0, { 0x00046B }}, /* 046A; 046B; Case map */ - { 0x00046C, 0, { 0x00046D }}, /* 046C; 046D; Case map */ - { 0x00046E, 0, { 0x00046F }}, /* 046E; 046F; Case map */ - { 0x000470, 0, { 0x000471 }}, /* 0470; 0471; Case map */ - { 0x000472, 0, { 0x000473 }}, /* 0472; 0473; Case map */ - { 0x000474, 0, { 0x000475 }}, /* 0474; 0475; Case map */ - { 0x000476, 0, { 0x000477 }}, /* 0476; 0477; Case map */ - { 0x000478, 0, { 0x000479 }}, /* 0478; 0479; Case map */ - { 0x00047A, 0, { 0x00047B }}, /* 047A; 047B; Case map */ - { 0x00047C, 0, { 0x00047D }}, /* 047C; 047D; Case map */ - { 0x00047E, 0, { 0x00047F }}, /* 047E; 047F; Case map */ - { 0x000480, 0, { 0x000481 }}, /* 0480; 0481; Case map */ - { 0x00048A, 0, { 0x00048B }}, /* 048A; 048B; Case map */ - { 0x00048C, 0, { 0x00048D }}, /* 048C; 048D; Case map */ - { 0x00048E, 0, { 0x00048F }}, /* 048E; 048F; Case map */ - { 0x000490, 0, { 0x000491 }}, /* 0490; 0491; Case map */ - { 0x000492, 0, { 0x000493 }}, /* 0492; 0493; Case map */ - { 0x000494, 0, { 0x000495 }}, /* 0494; 0495; Case map */ - { 0x000496, 0, { 0x000497 }}, /* 0496; 0497; Case map */ - { 0x000498, 0, { 0x000499 }}, /* 0498; 0499; Case map */ - { 0x00049A, 0, { 0x00049B }}, /* 049A; 049B; Case map */ - { 0x00049C, 0, { 0x00049D }}, /* 049C; 049D; Case map */ - { 0x00049E, 0, { 0x00049F }}, /* 049E; 049F; Case map */ - { 0x0004A0, 0, { 0x0004A1 }}, /* 04A0; 04A1; Case map */ - { 0x0004A2, 0, { 0x0004A3 }}, /* 04A2; 04A3; Case map */ - { 0x0004A4, 0, { 0x0004A5 }}, /* 04A4; 04A5; Case map */ - { 0x0004A6, 0, { 0x0004A7 }}, /* 04A6; 04A7; Case map */ - { 0x0004A8, 0, { 0x0004A9 }}, /* 04A8; 04A9; Case map */ - { 0x0004AA, 0, { 0x0004AB }}, /* 04AA; 04AB; Case map */ - { 0x0004AC, 0, { 0x0004AD }}, /* 04AC; 04AD; Case map */ - { 0x0004AE, 0, { 0x0004AF }}, /* 04AE; 04AF; Case map */ - { 0x0004B0, 0, { 0x0004B1 }}, /* 04B0; 04B1; Case map */ - { 0x0004B2, 0, { 0x0004B3 }}, /* 04B2; 04B3; Case map */ - { 0x0004B4, 0, { 0x0004B5 }}, /* 04B4; 04B5; Case map */ - { 0x0004B6, 0, { 0x0004B7 }}, /* 04B6; 04B7; Case map */ - { 0x0004B8, 0, { 0x0004B9 }}, /* 04B8; 04B9; Case map */ - { 0x0004BA, 0, { 0x0004BB }}, /* 04BA; 04BB; Case map */ - { 0x0004BC, 0, { 0x0004BD }}, /* 04BC; 04BD; Case map */ - { 0x0004BE, 0, { 0x0004BF }}, /* 04BE; 04BF; Case map */ - { 0x0004C1, 0, { 0x0004C2 }}, /* 04C1; 04C2; Case map */ - { 0x0004C3, 0, { 0x0004C4 }}, /* 04C3; 04C4; Case map */ - { 0x0004C5, 0, { 0x0004C6 }}, /* 04C5; 04C6; Case map */ - { 0x0004C7, 0, { 0x0004C8 }}, /* 04C7; 04C8; Case map */ - { 0x0004C9, 0, { 0x0004CA }}, /* 04C9; 04CA; Case map */ - { 0x0004CB, 0, { 0x0004CC }}, /* 04CB; 04CC; Case map */ - { 0x0004CD, 0, { 0x0004CE }}, /* 04CD; 04CE; Case map */ - { 0x0004D0, 0, { 0x0004D1 }}, /* 04D0; 04D1; Case map */ - { 0x0004D2, 0, { 0x0004D3 }}, /* 04D2; 04D3; Case map */ - { 0x0004D4, 0, { 0x0004D5 }}, /* 04D4; 04D5; Case map */ - { 0x0004D6, 0, { 0x0004D7 }}, /* 04D6; 04D7; Case map */ - { 0x0004D8, 0, { 0x0004D9 }}, /* 04D8; 04D9; Case map */ - { 0x0004DA, 0, { 0x0004DB }}, /* 04DA; 04DB; Case map */ - { 0x0004DC, 0, { 0x0004DD }}, /* 04DC; 04DD; Case map */ - { 0x0004DE, 0, { 0x0004DF }}, /* 04DE; 04DF; Case map */ - { 0x0004E0, 0, { 0x0004E1 }}, /* 04E0; 04E1; Case map */ - { 0x0004E2, 0, { 0x0004E3 }}, /* 04E2; 04E3; Case map */ - { 0x0004E4, 0, { 0x0004E5 }}, /* 04E4; 04E5; Case map */ - { 0x0004E6, 0, { 0x0004E7 }}, /* 04E6; 04E7; Case map */ - { 0x0004E8, 0, { 0x0004E9 }}, /* 04E8; 04E9; Case map */ - { 0x0004EA, 0, { 0x0004EB }}, /* 04EA; 04EB; Case map */ - { 0x0004EC, 0, { 0x0004ED }}, /* 04EC; 04ED; Case map */ - { 0x0004EE, 0, { 0x0004EF }}, /* 04EE; 04EF; Case map */ - { 0x0004F0, 0, { 0x0004F1 }}, /* 04F0; 04F1; Case map */ - { 0x0004F2, 0, { 0x0004F3 }}, /* 04F2; 04F3; Case map */ - { 0x0004F4, 0, { 0x0004F5 }}, /* 04F4; 04F5; Case map */ - { 0x0004F8, 0, { 0x0004F9 }}, /* 04F8; 04F9; Case map */ - { 0x000500, 0, { 0x000501 }}, /* 0500; 0501; Case map */ - { 0x000502, 0, { 0x000503 }}, /* 0502; 0503; Case map */ - { 0x000504, 0, { 0x000505 }}, /* 0504; 0505; Case map */ - { 0x000506, 0, { 0x000507 }}, /* 0506; 0507; Case map */ - { 0x000508, 0, { 0x000509 }}, /* 0508; 0509; Case map */ - { 0x00050A, 0, { 0x00050B }}, /* 050A; 050B; Case map */ - { 0x00050C, 0, { 0x00050D }}, /* 050C; 050D; Case map */ - { 0x00050E, 0, { 0x00050F }}, /* 050E; 050F; Case map */ - { 0x000531, 0, { 0x000561 }}, /* 0531; 0561; Case map */ - { 0x000532, 0, { 0x000562 }}, /* 0532; 0562; Case map */ - { 0x000533, 0, { 0x000563 }}, /* 0533; 0563; Case map */ - { 0x000534, 0, { 0x000564 }}, /* 0534; 0564; Case map */ - { 0x000535, 0, { 0x000565 }}, /* 0535; 0565; Case map */ - { 0x000536, 0, { 0x000566 }}, /* 0536; 0566; Case map */ - { 0x000537, 0, { 0x000567 }}, /* 0537; 0567; Case map */ - { 0x000538, 0, { 0x000568 }}, /* 0538; 0568; Case map */ - { 0x000539, 0, { 0x000569 }}, /* 0539; 0569; Case map */ - { 0x00053A, 0, { 0x00056A }}, /* 053A; 056A; Case map */ - { 0x00053B, 0, { 0x00056B }}, /* 053B; 056B; Case map */ - { 0x00053C, 0, { 0x00056C }}, /* 053C; 056C; Case map */ - { 0x00053D, 0, { 0x00056D }}, /* 053D; 056D; Case map */ - { 0x00053E, 0, { 0x00056E }}, /* 053E; 056E; Case map */ - { 0x00053F, 0, { 0x00056F }}, /* 053F; 056F; Case map */ - { 0x000540, 0, { 0x000570 }}, /* 0540; 0570; Case map */ - { 0x000541, 0, { 0x000571 }}, /* 0541; 0571; Case map */ - { 0x000542, 0, { 0x000572 }}, /* 0542; 0572; Case map */ - { 0x000543, 0, { 0x000573 }}, /* 0543; 0573; Case map */ - { 0x000544, 0, { 0x000574 }}, /* 0544; 0574; Case map */ - { 0x000545, 0, { 0x000575 }}, /* 0545; 0575; Case map */ - { 0x000546, 0, { 0x000576 }}, /* 0546; 0576; Case map */ - { 0x000547, 0, { 0x000577 }}, /* 0547; 0577; Case map */ - { 0x000548, 0, { 0x000578 }}, /* 0548; 0578; Case map */ - { 0x000549, 0, { 0x000579 }}, /* 0549; 0579; Case map */ - { 0x00054A, 0, { 0x00057A }}, /* 054A; 057A; Case map */ - { 0x00054B, 0, { 0x00057B }}, /* 054B; 057B; Case map */ - { 0x00054C, 0, { 0x00057C }}, /* 054C; 057C; Case map */ - { 0x00054D, 0, { 0x00057D }}, /* 054D; 057D; Case map */ - { 0x00054E, 0, { 0x00057E }}, /* 054E; 057E; Case map */ - { 0x00054F, 0, { 0x00057F }}, /* 054F; 057F; Case map */ - { 0x000550, 0, { 0x000580 }}, /* 0550; 0580; Case map */ - { 0x000551, 0, { 0x000581 }}, /* 0551; 0581; Case map */ - { 0x000552, 0, { 0x000582 }}, /* 0552; 0582; Case map */ - { 0x000553, 0, { 0x000583 }}, /* 0553; 0583; Case map */ - { 0x000554, 0, { 0x000584 }}, /* 0554; 0584; Case map */ - { 0x000555, 0, { 0x000585 }}, /* 0555; 0585; Case map */ - { 0x000556, 0, { 0x000586 }}, /* 0556; 0586; Case map */ - { 0x000587, 0, { 0x000565, /* 0587; 0565 0582; Case map */ - 0x000582 }}, - { 0x001E00, 0, { 0x001E01 }}, /* 1E00; 1E01; Case map */ - { 0x001E02, 0, { 0x001E03 }}, /* 1E02; 1E03; Case map */ - { 0x001E04, 0, { 0x001E05 }}, /* 1E04; 1E05; Case map */ - { 0x001E06, 0, { 0x001E07 }}, /* 1E06; 1E07; Case map */ - { 0x001E08, 0, { 0x001E09 }}, /* 1E08; 1E09; Case map */ - { 0x001E0A, 0, { 0x001E0B }}, /* 1E0A; 1E0B; Case map */ - { 0x001E0C, 0, { 0x001E0D }}, /* 1E0C; 1E0D; Case map */ - { 0x001E0E, 0, { 0x001E0F }}, /* 1E0E; 1E0F; Case map */ - { 0x001E10, 0, { 0x001E11 }}, /* 1E10; 1E11; Case map */ - { 0x001E12, 0, { 0x001E13 }}, /* 1E12; 1E13; Case map */ - { 0x001E14, 0, { 0x001E15 }}, /* 1E14; 1E15; Case map */ - { 0x001E16, 0, { 0x001E17 }}, /* 1E16; 1E17; Case map */ - { 0x001E18, 0, { 0x001E19 }}, /* 1E18; 1E19; Case map */ - { 0x001E1A, 0, { 0x001E1B }}, /* 1E1A; 1E1B; Case map */ - { 0x001E1C, 0, { 0x001E1D }}, /* 1E1C; 1E1D; Case map */ - { 0x001E1E, 0, { 0x001E1F }}, /* 1E1E; 1E1F; Case map */ - { 0x001E20, 0, { 0x001E21 }}, /* 1E20; 1E21; Case map */ - { 0x001E22, 0, { 0x001E23 }}, /* 1E22; 1E23; Case map */ - { 0x001E24, 0, { 0x001E25 }}, /* 1E24; 1E25; Case map */ - { 0x001E26, 0, { 0x001E27 }}, /* 1E26; 1E27; Case map */ - { 0x001E28, 0, { 0x001E29 }}, /* 1E28; 1E29; Case map */ - { 0x001E2A, 0, { 0x001E2B }}, /* 1E2A; 1E2B; Case map */ - { 0x001E2C, 0, { 0x001E2D }}, /* 1E2C; 1E2D; Case map */ - { 0x001E2E, 0, { 0x001E2F }}, /* 1E2E; 1E2F; Case map */ - { 0x001E30, 0, { 0x001E31 }}, /* 1E30; 1E31; Case map */ - { 0x001E32, 0, { 0x001E33 }}, /* 1E32; 1E33; Case map */ - { 0x001E34, 0, { 0x001E35 }}, /* 1E34; 1E35; Case map */ - { 0x001E36, 0, { 0x001E37 }}, /* 1E36; 1E37; Case map */ - { 0x001E38, 0, { 0x001E39 }}, /* 1E38; 1E39; Case map */ - { 0x001E3A, 0, { 0x001E3B }}, /* 1E3A; 1E3B; Case map */ - { 0x001E3C, 0, { 0x001E3D }}, /* 1E3C; 1E3D; Case map */ - { 0x001E3E, 0, { 0x001E3F }}, /* 1E3E; 1E3F; Case map */ - { 0x001E40, 0, { 0x001E41 }}, /* 1E40; 1E41; Case map */ - { 0x001E42, 0, { 0x001E43 }}, /* 1E42; 1E43; Case map */ - { 0x001E44, 0, { 0x001E45 }}, /* 1E44; 1E45; Case map */ - { 0x001E46, 0, { 0x001E47 }}, /* 1E46; 1E47; Case map */ - { 0x001E48, 0, { 0x001E49 }}, /* 1E48; 1E49; Case map */ - { 0x001E4A, 0, { 0x001E4B }}, /* 1E4A; 1E4B; Case map */ - { 0x001E4C, 0, { 0x001E4D }}, /* 1E4C; 1E4D; Case map */ - { 0x001E4E, 0, { 0x001E4F }}, /* 1E4E; 1E4F; Case map */ - { 0x001E50, 0, { 0x001E51 }}, /* 1E50; 1E51; Case map */ - { 0x001E52, 0, { 0x001E53 }}, /* 1E52; 1E53; Case map */ - { 0x001E54, 0, { 0x001E55 }}, /* 1E54; 1E55; Case map */ - { 0x001E56, 0, { 0x001E57 }}, /* 1E56; 1E57; Case map */ - { 0x001E58, 0, { 0x001E59 }}, /* 1E58; 1E59; Case map */ - { 0x001E5A, 0, { 0x001E5B }}, /* 1E5A; 1E5B; Case map */ - { 0x001E5C, 0, { 0x001E5D }}, /* 1E5C; 1E5D; Case map */ - { 0x001E5E, 0, { 0x001E5F }}, /* 1E5E; 1E5F; Case map */ - { 0x001E60, 0, { 0x001E61 }}, /* 1E60; 1E61; Case map */ - { 0x001E62, 0, { 0x001E63 }}, /* 1E62; 1E63; Case map */ - { 0x001E64, 0, { 0x001E65 }}, /* 1E64; 1E65; Case map */ - { 0x001E66, 0, { 0x001E67 }}, /* 1E66; 1E67; Case map */ - { 0x001E68, 0, { 0x001E69 }}, /* 1E68; 1E69; Case map */ - { 0x001E6A, 0, { 0x001E6B }}, /* 1E6A; 1E6B; Case map */ - { 0x001E6C, 0, { 0x001E6D }}, /* 1E6C; 1E6D; Case map */ - { 0x001E6E, 0, { 0x001E6F }}, /* 1E6E; 1E6F; Case map */ - { 0x001E70, 0, { 0x001E71 }}, /* 1E70; 1E71; Case map */ - { 0x001E72, 0, { 0x001E73 }}, /* 1E72; 1E73; Case map */ - { 0x001E74, 0, { 0x001E75 }}, /* 1E74; 1E75; Case map */ - { 0x001E76, 0, { 0x001E77 }}, /* 1E76; 1E77; Case map */ - { 0x001E78, 0, { 0x001E79 }}, /* 1E78; 1E79; Case map */ - { 0x001E7A, 0, { 0x001E7B }}, /* 1E7A; 1E7B; Case map */ - { 0x001E7C, 0, { 0x001E7D }}, /* 1E7C; 1E7D; Case map */ - { 0x001E7E, 0, { 0x001E7F }}, /* 1E7E; 1E7F; Case map */ - { 0x001E80, 0, { 0x001E81 }}, /* 1E80; 1E81; Case map */ - { 0x001E82, 0, { 0x001E83 }}, /* 1E82; 1E83; Case map */ - { 0x001E84, 0, { 0x001E85 }}, /* 1E84; 1E85; Case map */ - { 0x001E86, 0, { 0x001E87 }}, /* 1E86; 1E87; Case map */ - { 0x001E88, 0, { 0x001E89 }}, /* 1E88; 1E89; Case map */ - { 0x001E8A, 0, { 0x001E8B }}, /* 1E8A; 1E8B; Case map */ - { 0x001E8C, 0, { 0x001E8D }}, /* 1E8C; 1E8D; Case map */ - { 0x001E8E, 0, { 0x001E8F }}, /* 1E8E; 1E8F; Case map */ - { 0x001E90, 0, { 0x001E91 }}, /* 1E90; 1E91; Case map */ - { 0x001E92, 0, { 0x001E93 }}, /* 1E92; 1E93; Case map */ - { 0x001E94, 0, { 0x001E95 }}, /* 1E94; 1E95; Case map */ - { 0x001E96, 0, { 0x000068, /* 1E96; 0068 0331; Case map */ - 0x000331 }}, - { 0x001E97, 0, { 0x000074, /* 1E97; 0074 0308; Case map */ - 0x000308 }}, - { 0x001E98, 0, { 0x000077, /* 1E98; 0077 030A; Case map */ - 0x00030A }}, - { 0x001E99, 0, { 0x000079, /* 1E99; 0079 030A; Case map */ - 0x00030A }}, - { 0x001E9A, 0, { 0x000061, /* 1E9A; 0061 02BE; Case map */ - 0x0002BE }}, - { 0x001E9B, 0, { 0x001E61 }}, /* 1E9B; 1E61; Case map */ - { 0x001EA0, 0, { 0x001EA1 }}, /* 1EA0; 1EA1; Case map */ - { 0x001EA2, 0, { 0x001EA3 }}, /* 1EA2; 1EA3; Case map */ - { 0x001EA4, 0, { 0x001EA5 }}, /* 1EA4; 1EA5; Case map */ - { 0x001EA6, 0, { 0x001EA7 }}, /* 1EA6; 1EA7; Case map */ - { 0x001EA8, 0, { 0x001EA9 }}, /* 1EA8; 1EA9; Case map */ - { 0x001EAA, 0, { 0x001EAB }}, /* 1EAA; 1EAB; Case map */ - { 0x001EAC, 0, { 0x001EAD }}, /* 1EAC; 1EAD; Case map */ - { 0x001EAE, 0, { 0x001EAF }}, /* 1EAE; 1EAF; Case map */ - { 0x001EB0, 0, { 0x001EB1 }}, /* 1EB0; 1EB1; Case map */ - { 0x001EB2, 0, { 0x001EB3 }}, /* 1EB2; 1EB3; Case map */ - { 0x001EB4, 0, { 0x001EB5 }}, /* 1EB4; 1EB5; Case map */ - { 0x001EB6, 0, { 0x001EB7 }}, /* 1EB6; 1EB7; Case map */ - { 0x001EB8, 0, { 0x001EB9 }}, /* 1EB8; 1EB9; Case map */ - { 0x001EBA, 0, { 0x001EBB }}, /* 1EBA; 1EBB; Case map */ - { 0x001EBC, 0, { 0x001EBD }}, /* 1EBC; 1EBD; Case map */ - { 0x001EBE, 0, { 0x001EBF }}, /* 1EBE; 1EBF; Case map */ - { 0x001EC0, 0, { 0x001EC1 }}, /* 1EC0; 1EC1; Case map */ - { 0x001EC2, 0, { 0x001EC3 }}, /* 1EC2; 1EC3; Case map */ - { 0x001EC4, 0, { 0x001EC5 }}, /* 1EC4; 1EC5; Case map */ - { 0x001EC6, 0, { 0x001EC7 }}, /* 1EC6; 1EC7; Case map */ - { 0x001EC8, 0, { 0x001EC9 }}, /* 1EC8; 1EC9; Case map */ - { 0x001ECA, 0, { 0x001ECB }}, /* 1ECA; 1ECB; Case map */ - { 0x001ECC, 0, { 0x001ECD }}, /* 1ECC; 1ECD; Case map */ - { 0x001ECE, 0, { 0x001ECF }}, /* 1ECE; 1ECF; Case map */ - { 0x001ED0, 0, { 0x001ED1 }}, /* 1ED0; 1ED1; Case map */ - { 0x001ED2, 0, { 0x001ED3 }}, /* 1ED2; 1ED3; Case map */ - { 0x001ED4, 0, { 0x001ED5 }}, /* 1ED4; 1ED5; Case map */ - { 0x001ED6, 0, { 0x001ED7 }}, /* 1ED6; 1ED7; Case map */ - { 0x001ED8, 0, { 0x001ED9 }}, /* 1ED8; 1ED9; Case map */ - { 0x001EDA, 0, { 0x001EDB }}, /* 1EDA; 1EDB; Case map */ - { 0x001EDC, 0, { 0x001EDD }}, /* 1EDC; 1EDD; Case map */ - { 0x001EDE, 0, { 0x001EDF }}, /* 1EDE; 1EDF; Case map */ - { 0x001EE0, 0, { 0x001EE1 }}, /* 1EE0; 1EE1; Case map */ - { 0x001EE2, 0, { 0x001EE3 }}, /* 1EE2; 1EE3; Case map */ - { 0x001EE4, 0, { 0x001EE5 }}, /* 1EE4; 1EE5; Case map */ - { 0x001EE6, 0, { 0x001EE7 }}, /* 1EE6; 1EE7; Case map */ - { 0x001EE8, 0, { 0x001EE9 }}, /* 1EE8; 1EE9; Case map */ - { 0x001EEA, 0, { 0x001EEB }}, /* 1EEA; 1EEB; Case map */ - { 0x001EEC, 0, { 0x001EED }}, /* 1EEC; 1EED; Case map */ - { 0x001EEE, 0, { 0x001EEF }}, /* 1EEE; 1EEF; Case map */ - { 0x001EF0, 0, { 0x001EF1 }}, /* 1EF0; 1EF1; Case map */ - { 0x001EF2, 0, { 0x001EF3 }}, /* 1EF2; 1EF3; Case map */ - { 0x001EF4, 0, { 0x001EF5 }}, /* 1EF4; 1EF5; Case map */ - { 0x001EF6, 0, { 0x001EF7 }}, /* 1EF6; 1EF7; Case map */ - { 0x001EF8, 0, { 0x001EF9 }}, /* 1EF8; 1EF9; Case map */ - { 0x001F08, 0, { 0x001F00 }}, /* 1F08; 1F00; Case map */ - { 0x001F09, 0, { 0x001F01 }}, /* 1F09; 1F01; Case map */ - { 0x001F0A, 0, { 0x001F02 }}, /* 1F0A; 1F02; Case map */ - { 0x001F0B, 0, { 0x001F03 }}, /* 1F0B; 1F03; Case map */ - { 0x001F0C, 0, { 0x001F04 }}, /* 1F0C; 1F04; Case map */ - { 0x001F0D, 0, { 0x001F05 }}, /* 1F0D; 1F05; Case map */ - { 0x001F0E, 0, { 0x001F06 }}, /* 1F0E; 1F06; Case map */ - { 0x001F0F, 0, { 0x001F07 }}, /* 1F0F; 1F07; Case map */ - { 0x001F18, 0, { 0x001F10 }}, /* 1F18; 1F10; Case map */ - { 0x001F19, 0, { 0x001F11 }}, /* 1F19; 1F11; Case map */ - { 0x001F1A, 0, { 0x001F12 }}, /* 1F1A; 1F12; Case map */ - { 0x001F1B, 0, { 0x001F13 }}, /* 1F1B; 1F13; Case map */ - { 0x001F1C, 0, { 0x001F14 }}, /* 1F1C; 1F14; Case map */ - { 0x001F1D, 0, { 0x001F15 }}, /* 1F1D; 1F15; Case map */ - { 0x001F28, 0, { 0x001F20 }}, /* 1F28; 1F20; Case map */ - { 0x001F29, 0, { 0x001F21 }}, /* 1F29; 1F21; Case map */ - { 0x001F2A, 0, { 0x001F22 }}, /* 1F2A; 1F22; Case map */ - { 0x001F2B, 0, { 0x001F23 }}, /* 1F2B; 1F23; Case map */ - { 0x001F2C, 0, { 0x001F24 }}, /* 1F2C; 1F24; Case map */ - { 0x001F2D, 0, { 0x001F25 }}, /* 1F2D; 1F25; Case map */ - { 0x001F2E, 0, { 0x001F26 }}, /* 1F2E; 1F26; Case map */ - { 0x001F2F, 0, { 0x001F27 }}, /* 1F2F; 1F27; Case map */ - { 0x001F38, 0, { 0x001F30 }}, /* 1F38; 1F30; Case map */ - { 0x001F39, 0, { 0x001F31 }}, /* 1F39; 1F31; Case map */ - { 0x001F3A, 0, { 0x001F32 }}, /* 1F3A; 1F32; Case map */ - { 0x001F3B, 0, { 0x001F33 }}, /* 1F3B; 1F33; Case map */ - { 0x001F3C, 0, { 0x001F34 }}, /* 1F3C; 1F34; Case map */ - { 0x001F3D, 0, { 0x001F35 }}, /* 1F3D; 1F35; Case map */ - { 0x001F3E, 0, { 0x001F36 }}, /* 1F3E; 1F36; Case map */ - { 0x001F3F, 0, { 0x001F37 }}, /* 1F3F; 1F37; Case map */ - { 0x001F48, 0, { 0x001F40 }}, /* 1F48; 1F40; Case map */ - { 0x001F49, 0, { 0x001F41 }}, /* 1F49; 1F41; Case map */ - { 0x001F4A, 0, { 0x001F42 }}, /* 1F4A; 1F42; Case map */ - { 0x001F4B, 0, { 0x001F43 }}, /* 1F4B; 1F43; Case map */ - { 0x001F4C, 0, { 0x001F44 }}, /* 1F4C; 1F44; Case map */ - { 0x001F4D, 0, { 0x001F45 }}, /* 1F4D; 1F45; Case map */ - { 0x001F50, 0, { 0x0003C5, /* 1F50; 03C5 0313; Case map */ - 0x000313 }}, - { 0x001F52, 0, { 0x0003C5, /* 1F52; 03C5 0313 0300; Case map */ - 0x000313, 0x000300 }}, - { 0x001F54, 0, { 0x0003C5, /* 1F54; 03C5 0313 0301; Case map */ - 0x000313, 0x000301 }}, - { 0x001F56, 0, { 0x0003C5, /* 1F56; 03C5 0313 0342; Case map */ - 0x000313, 0x000342 }}, - { 0x001F59, 0, { 0x001F51 }}, /* 1F59; 1F51; Case map */ - { 0x001F5B, 0, { 0x001F53 }}, /* 1F5B; 1F53; Case map */ - { 0x001F5D, 0, { 0x001F55 }}, /* 1F5D; 1F55; Case map */ - { 0x001F5F, 0, { 0x001F57 }}, /* 1F5F; 1F57; Case map */ - { 0x001F68, 0, { 0x001F60 }}, /* 1F68; 1F60; Case map */ - { 0x001F69, 0, { 0x001F61 }}, /* 1F69; 1F61; Case map */ - { 0x001F6A, 0, { 0x001F62 }}, /* 1F6A; 1F62; Case map */ - { 0x001F6B, 0, { 0x001F63 }}, /* 1F6B; 1F63; Case map */ - { 0x001F6C, 0, { 0x001F64 }}, /* 1F6C; 1F64; Case map */ - { 0x001F6D, 0, { 0x001F65 }}, /* 1F6D; 1F65; Case map */ - { 0x001F6E, 0, { 0x001F66 }}, /* 1F6E; 1F66; Case map */ - { 0x001F6F, 0, { 0x001F67 }}, /* 1F6F; 1F67; Case map */ - { 0x001F80, 0, { 0x001F00, /* 1F80; 1F00 03B9; Case map */ - 0x0003B9 }}, - { 0x001F81, 0, { 0x001F01, /* 1F81; 1F01 03B9; Case map */ - 0x0003B9 }}, - { 0x001F82, 0, { 0x001F02, /* 1F82; 1F02 03B9; Case map */ - 0x0003B9 }}, - { 0x001F83, 0, { 0x001F03, /* 1F83; 1F03 03B9; Case map */ - 0x0003B9 }}, - { 0x001F84, 0, { 0x001F04, /* 1F84; 1F04 03B9; Case map */ - 0x0003B9 }}, - { 0x001F85, 0, { 0x001F05, /* 1F85; 1F05 03B9; Case map */ - 0x0003B9 }}, - { 0x001F86, 0, { 0x001F06, /* 1F86; 1F06 03B9; Case map */ - 0x0003B9 }}, - { 0x001F87, 0, { 0x001F07, /* 1F87; 1F07 03B9; Case map */ - 0x0003B9 }}, - { 0x001F88, 0, { 0x001F00, /* 1F88; 1F00 03B9; Case map */ - 0x0003B9 }}, - { 0x001F89, 0, { 0x001F01, /* 1F89; 1F01 03B9; Case map */ - 0x0003B9 }}, - { 0x001F8A, 0, { 0x001F02, /* 1F8A; 1F02 03B9; Case map */ - 0x0003B9 }}, - { 0x001F8B, 0, { 0x001F03, /* 1F8B; 1F03 03B9; Case map */ - 0x0003B9 }}, - { 0x001F8C, 0, { 0x001F04, /* 1F8C; 1F04 03B9; Case map */ - 0x0003B9 }}, - { 0x001F8D, 0, { 0x001F05, /* 1F8D; 1F05 03B9; Case map */ - 0x0003B9 }}, - { 0x001F8E, 0, { 0x001F06, /* 1F8E; 1F06 03B9; Case map */ - 0x0003B9 }}, - { 0x001F8F, 0, { 0x001F07, /* 1F8F; 1F07 03B9; Case map */ - 0x0003B9 }}, - { 0x001F90, 0, { 0x001F20, /* 1F90; 1F20 03B9; Case map */ - 0x0003B9 }}, - { 0x001F91, 0, { 0x001F21, /* 1F91; 1F21 03B9; Case map */ - 0x0003B9 }}, - { 0x001F92, 0, { 0x001F22, /* 1F92; 1F22 03B9; Case map */ - 0x0003B9 }}, - { 0x001F93, 0, { 0x001F23, /* 1F93; 1F23 03B9; Case map */ - 0x0003B9 }}, - { 0x001F94, 0, { 0x001F24, /* 1F94; 1F24 03B9; Case map */ - 0x0003B9 }}, - { 0x001F95, 0, { 0x001F25, /* 1F95; 1F25 03B9; Case map */ - 0x0003B9 }}, - { 0x001F96, 0, { 0x001F26, /* 1F96; 1F26 03B9; Case map */ - 0x0003B9 }}, - { 0x001F97, 0, { 0x001F27, /* 1F97; 1F27 03B9; Case map */ - 0x0003B9 }}, - { 0x001F98, 0, { 0x001F20, /* 1F98; 1F20 03B9; Case map */ - 0x0003B9 }}, - { 0x001F99, 0, { 0x001F21, /* 1F99; 1F21 03B9; Case map */ - 0x0003B9 }}, - { 0x001F9A, 0, { 0x001F22, /* 1F9A; 1F22 03B9; Case map */ - 0x0003B9 }}, - { 0x001F9B, 0, { 0x001F23, /* 1F9B; 1F23 03B9; Case map */ - 0x0003B9 }}, - { 0x001F9C, 0, { 0x001F24, /* 1F9C; 1F24 03B9; Case map */ - 0x0003B9 }}, - { 0x001F9D, 0, { 0x001F25, /* 1F9D; 1F25 03B9; Case map */ - 0x0003B9 }}, - { 0x001F9E, 0, { 0x001F26, /* 1F9E; 1F26 03B9; Case map */ - 0x0003B9 }}, - { 0x001F9F, 0, { 0x001F27, /* 1F9F; 1F27 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA0, 0, { 0x001F60, /* 1FA0; 1F60 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA1, 0, { 0x001F61, /* 1FA1; 1F61 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA2, 0, { 0x001F62, /* 1FA2; 1F62 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA3, 0, { 0x001F63, /* 1FA3; 1F63 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA4, 0, { 0x001F64, /* 1FA4; 1F64 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA5, 0, { 0x001F65, /* 1FA5; 1F65 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA6, 0, { 0x001F66, /* 1FA6; 1F66 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA7, 0, { 0x001F67, /* 1FA7; 1F67 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA8, 0, { 0x001F60, /* 1FA8; 1F60 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA9, 0, { 0x001F61, /* 1FA9; 1F61 03B9; Case map */ - 0x0003B9 }}, - { 0x001FAA, 0, { 0x001F62, /* 1FAA; 1F62 03B9; Case map */ - 0x0003B9 }}, - { 0x001FAB, 0, { 0x001F63, /* 1FAB; 1F63 03B9; Case map */ - 0x0003B9 }}, - { 0x001FAC, 0, { 0x001F64, /* 1FAC; 1F64 03B9; Case map */ - 0x0003B9 }}, - { 0x001FAD, 0, { 0x001F65, /* 1FAD; 1F65 03B9; Case map */ - 0x0003B9 }}, - { 0x001FAE, 0, { 0x001F66, /* 1FAE; 1F66 03B9; Case map */ - 0x0003B9 }}, - { 0x001FAF, 0, { 0x001F67, /* 1FAF; 1F67 03B9; Case map */ - 0x0003B9 }}, - { 0x001FB2, 0, { 0x001F70, /* 1FB2; 1F70 03B9; Case map */ - 0x0003B9 }}, - { 0x001FB3, 0, { 0x0003B1, /* 1FB3; 03B1 03B9; Case map */ - 0x0003B9 }}, - { 0x001FB4, 0, { 0x0003AC, /* 1FB4; 03AC 03B9; Case map */ - 0x0003B9 }}, - { 0x001FB6, 0, { 0x0003B1, /* 1FB6; 03B1 0342; Case map */ - 0x000342 }}, - { 0x001FB7, 0, { 0x0003B1, /* 1FB7; 03B1 0342 03B9; Case map */ - 0x000342, 0x0003B9 }}, - { 0x001FB8, 0, { 0x001FB0 }}, /* 1FB8; 1FB0; Case map */ - { 0x001FB9, 0, { 0x001FB1 }}, /* 1FB9; 1FB1; Case map */ - { 0x001FBA, 0, { 0x001F70 }}, /* 1FBA; 1F70; Case map */ - { 0x001FBB, 0, { 0x001F71 }}, /* 1FBB; 1F71; Case map */ - { 0x001FBC, 0, { 0x0003B1, /* 1FBC; 03B1 03B9; Case map */ - 0x0003B9 }}, - { 0x001FBE, 0, { 0x0003B9 }}, /* 1FBE; 03B9; Case map */ - { 0x001FC2, 0, { 0x001F74, /* 1FC2; 1F74 03B9; Case map */ - 0x0003B9 }}, - { 0x001FC3, 0, { 0x0003B7, /* 1FC3; 03B7 03B9; Case map */ - 0x0003B9 }}, - { 0x001FC4, 0, { 0x0003AE, /* 1FC4; 03AE 03B9; Case map */ - 0x0003B9 }}, - { 0x001FC6, 0, { 0x0003B7, /* 1FC6; 03B7 0342; Case map */ - 0x000342 }}, - { 0x001FC7, 0, { 0x0003B7, /* 1FC7; 03B7 0342 03B9; Case map */ - 0x000342, 0x0003B9 }}, - { 0x001FC8, 0, { 0x001F72 }}, /* 1FC8; 1F72; Case map */ - { 0x001FC9, 0, { 0x001F73 }}, /* 1FC9; 1F73; Case map */ - { 0x001FCA, 0, { 0x001F74 }}, /* 1FCA; 1F74; Case map */ - { 0x001FCB, 0, { 0x001F75 }}, /* 1FCB; 1F75; Case map */ - { 0x001FCC, 0, { 0x0003B7, /* 1FCC; 03B7 03B9; Case map */ - 0x0003B9 }}, - { 0x001FD2, 0, { 0x0003B9, /* 1FD2; 03B9 0308 0300; Case map */ - 0x000308, 0x000300 }}, - { 0x001FD3, 0, { 0x0003B9, /* 1FD3; 03B9 0308 0301; Case map */ - 0x000308, 0x000301 }}, - { 0x001FD6, 0, { 0x0003B9, /* 1FD6; 03B9 0342; Case map */ - 0x000342 }}, - { 0x001FD7, 0, { 0x0003B9, /* 1FD7; 03B9 0308 0342; Case map */ - 0x000308, 0x000342 }}, - { 0x001FD8, 0, { 0x001FD0 }}, /* 1FD8; 1FD0; Case map */ - { 0x001FD9, 0, { 0x001FD1 }}, /* 1FD9; 1FD1; Case map */ - { 0x001FDA, 0, { 0x001F76 }}, /* 1FDA; 1F76; Case map */ - { 0x001FDB, 0, { 0x001F77 }}, /* 1FDB; 1F77; Case map */ - { 0x001FE2, 0, { 0x0003C5, /* 1FE2; 03C5 0308 0300; Case map */ - 0x000308, 0x000300 }}, - { 0x001FE3, 0, { 0x0003C5, /* 1FE3; 03C5 0308 0301; Case map */ - 0x000308, 0x000301 }}, - { 0x001FE4, 0, { 0x0003C1, /* 1FE4; 03C1 0313; Case map */ - 0x000313 }}, - { 0x001FE6, 0, { 0x0003C5, /* 1FE6; 03C5 0342; Case map */ - 0x000342 }}, - { 0x001FE7, 0, { 0x0003C5, /* 1FE7; 03C5 0308 0342; Case map */ - 0x000308, 0x000342 }}, - { 0x001FE8, 0, { 0x001FE0 }}, /* 1FE8; 1FE0; Case map */ - { 0x001FE9, 0, { 0x001FE1 }}, /* 1FE9; 1FE1; Case map */ - { 0x001FEA, 0, { 0x001F7A }}, /* 1FEA; 1F7A; Case map */ - { 0x001FEB, 0, { 0x001F7B }}, /* 1FEB; 1F7B; Case map */ - { 0x001FEC, 0, { 0x001FE5 }}, /* 1FEC; 1FE5; Case map */ - { 0x001FF2, 0, { 0x001F7C, /* 1FF2; 1F7C 03B9; Case map */ - 0x0003B9 }}, - { 0x001FF3, 0, { 0x0003C9, /* 1FF3; 03C9 03B9; Case map */ - 0x0003B9 }}, - { 0x001FF4, 0, { 0x0003CE, /* 1FF4; 03CE 03B9; Case map */ - 0x0003B9 }}, - { 0x001FF6, 0, { 0x0003C9, /* 1FF6; 03C9 0342; Case map */ - 0x000342 }}, - { 0x001FF7, 0, { 0x0003C9, /* 1FF7; 03C9 0342 03B9; Case map */ - 0x000342, 0x0003B9 }}, - { 0x001FF8, 0, { 0x001F78 }}, /* 1FF8; 1F78; Case map */ - { 0x001FF9, 0, { 0x001F79 }}, /* 1FF9; 1F79; Case map */ - { 0x001FFA, 0, { 0x001F7C }}, /* 1FFA; 1F7C; Case map */ - { 0x001FFB, 0, { 0x001F7D }}, /* 1FFB; 1F7D; Case map */ - { 0x001FFC, 0, { 0x0003C9, /* 1FFC; 03C9 03B9; Case map */ - 0x0003B9 }}, - { 0x0020A8, 0, { 0x000072, /* 20A8; 0072 0073; Additional folding */ - 0x000073 }}, - { 0x002102, 0, { 0x000063 }}, /* 2102; 0063; Additional folding */ - { 0x002103, 0, { 0x0000B0, /* 2103; 00B0 0063; Additional folding */ - 0x000063 }}, - { 0x002107, 0, { 0x00025B }}, /* 2107; 025B; Additional folding */ - { 0x002109, 0, { 0x0000B0, /* 2109; 00B0 0066; Additional folding */ - 0x000066 }}, - { 0x00210B, 0, { 0x000068 }}, /* 210B; 0068; Additional folding */ - { 0x00210C, 0, { 0x000068 }}, /* 210C; 0068; Additional folding */ - { 0x00210D, 0, { 0x000068 }}, /* 210D; 0068; Additional folding */ - { 0x002110, 0, { 0x000069 }}, /* 2110; 0069; Additional folding */ - { 0x002111, 0, { 0x000069 }}, /* 2111; 0069; Additional folding */ - { 0x002112, 0, { 0x00006C }}, /* 2112; 006C; Additional folding */ - { 0x002115, 0, { 0x00006E }}, /* 2115; 006E; Additional folding */ - { 0x002116, 0, { 0x00006E, /* 2116; 006E 006F; Additional folding */ - 0x00006F }}, - { 0x002119, 0, { 0x000070 }}, /* 2119; 0070; Additional folding */ - { 0x00211A, 0, { 0x000071 }}, /* 211A; 0071; Additional folding */ - { 0x00211B, 0, { 0x000072 }}, /* 211B; 0072; Additional folding */ - { 0x00211C, 0, { 0x000072 }}, /* 211C; 0072; Additional folding */ - { 0x00211D, 0, { 0x000072 }}, /* 211D; 0072; Additional folding */ - { 0x002120, 0, { 0x000073, /* 2120; 0073 006D; Additional folding */ - 0x00006D }}, - { 0x002121, 0, { 0x000074, /* 2121; 0074 0065 006C; Additional folding */ - 0x000065, 0x00006C }}, - { 0x002122, 0, { 0x000074, /* 2122; 0074 006D; Additional folding */ - 0x00006D }}, - { 0x002124, 0, { 0x00007A }}, /* 2124; 007A; Additional folding */ - { 0x002126, 0, { 0x0003C9 }}, /* 2126; 03C9; Case map */ - { 0x002128, 0, { 0x00007A }}, /* 2128; 007A; Additional folding */ - { 0x00212A, 0, { 0x00006B }}, /* 212A; 006B; Case map */ - { 0x00212B, 0, { 0x0000E5 }}, /* 212B; 00E5; Case map */ - { 0x00212C, 0, { 0x000062 }}, /* 212C; 0062; Additional folding */ - { 0x00212D, 0, { 0x000063 }}, /* 212D; 0063; Additional folding */ - { 0x002130, 0, { 0x000065 }}, /* 2130; 0065; Additional folding */ - { 0x002131, 0, { 0x000066 }}, /* 2131; 0066; Additional folding */ - { 0x002133, 0, { 0x00006D }}, /* 2133; 006D; Additional folding */ - { 0x00213E, 0, { 0x0003B3 }}, /* 213E; 03B3; Additional folding */ - { 0x00213F, 0, { 0x0003C0 }}, /* 213F; 03C0; Additional folding */ - { 0x002145, 0, { 0x000064 }}, /* 2145; 0064; Additional folding */ - { 0x002160, 0, { 0x002170 }}, /* 2160; 2170; Case map */ - { 0x002161, 0, { 0x002171 }}, /* 2161; 2171; Case map */ - { 0x002162, 0, { 0x002172 }}, /* 2162; 2172; Case map */ - { 0x002163, 0, { 0x002173 }}, /* 2163; 2173; Case map */ - { 0x002164, 0, { 0x002174 }}, /* 2164; 2174; Case map */ - { 0x002165, 0, { 0x002175 }}, /* 2165; 2175; Case map */ - { 0x002166, 0, { 0x002176 }}, /* 2166; 2176; Case map */ - { 0x002167, 0, { 0x002177 }}, /* 2167; 2177; Case map */ - { 0x002168, 0, { 0x002178 }}, /* 2168; 2178; Case map */ - { 0x002169, 0, { 0x002179 }}, /* 2169; 2179; Case map */ - { 0x00216A, 0, { 0x00217A }}, /* 216A; 217A; Case map */ - { 0x00216B, 0, { 0x00217B }}, /* 216B; 217B; Case map */ - { 0x00216C, 0, { 0x00217C }}, /* 216C; 217C; Case map */ - { 0x00216D, 0, { 0x00217D }}, /* 216D; 217D; Case map */ - { 0x00216E, 0, { 0x00217E }}, /* 216E; 217E; Case map */ - { 0x00216F, 0, { 0x00217F }}, /* 216F; 217F; Case map */ - { 0x0024B6, 0, { 0x0024D0 }}, /* 24B6; 24D0; Case map */ - { 0x0024B7, 0, { 0x0024D1 }}, /* 24B7; 24D1; Case map */ - { 0x0024B8, 0, { 0x0024D2 }}, /* 24B8; 24D2; Case map */ - { 0x0024B9, 0, { 0x0024D3 }}, /* 24B9; 24D3; Case map */ - { 0x0024BA, 0, { 0x0024D4 }}, /* 24BA; 24D4; Case map */ - { 0x0024BB, 0, { 0x0024D5 }}, /* 24BB; 24D5; Case map */ - { 0x0024BC, 0, { 0x0024D6 }}, /* 24BC; 24D6; Case map */ - { 0x0024BD, 0, { 0x0024D7 }}, /* 24BD; 24D7; Case map */ - { 0x0024BE, 0, { 0x0024D8 }}, /* 24BE; 24D8; Case map */ - { 0x0024BF, 0, { 0x0024D9 }}, /* 24BF; 24D9; Case map */ - { 0x0024C0, 0, { 0x0024DA }}, /* 24C0; 24DA; Case map */ - { 0x0024C1, 0, { 0x0024DB }}, /* 24C1; 24DB; Case map */ - { 0x0024C2, 0, { 0x0024DC }}, /* 24C2; 24DC; Case map */ - { 0x0024C3, 0, { 0x0024DD }}, /* 24C3; 24DD; Case map */ - { 0x0024C4, 0, { 0x0024DE }}, /* 24C4; 24DE; Case map */ - { 0x0024C5, 0, { 0x0024DF }}, /* 24C5; 24DF; Case map */ - { 0x0024C6, 0, { 0x0024E0 }}, /* 24C6; 24E0; Case map */ - { 0x0024C7, 0, { 0x0024E1 }}, /* 24C7; 24E1; Case map */ - { 0x0024C8, 0, { 0x0024E2 }}, /* 24C8; 24E2; Case map */ - { 0x0024C9, 0, { 0x0024E3 }}, /* 24C9; 24E3; Case map */ - { 0x0024CA, 0, { 0x0024E4 }}, /* 24CA; 24E4; Case map */ - { 0x0024CB, 0, { 0x0024E5 }}, /* 24CB; 24E5; Case map */ - { 0x0024CC, 0, { 0x0024E6 }}, /* 24CC; 24E6; Case map */ - { 0x0024CD, 0, { 0x0024E7 }}, /* 24CD; 24E7; Case map */ - { 0x0024CE, 0, { 0x0024E8 }}, /* 24CE; 24E8; Case map */ - { 0x0024CF, 0, { 0x0024E9 }}, /* 24CF; 24E9; Case map */ - { 0x003371, 0, { 0x000068, /* 3371; 0068 0070 0061; Additional folding */ - 0x000070, 0x000061 }}, - { 0x003373, 0, { 0x000061, /* 3373; 0061 0075; Additional folding */ - 0x000075 }}, - { 0x003375, 0, { 0x00006F, /* 3375; 006F 0076; Additional folding */ - 0x000076 }}, - { 0x003380, 0, { 0x000070, /* 3380; 0070 0061; Additional folding */ - 0x000061 }}, - { 0x003381, 0, { 0x00006E, /* 3381; 006E 0061; Additional folding */ - 0x000061 }}, - { 0x003382, 0, { 0x0003BC, /* 3382; 03BC 0061; Additional folding */ - 0x000061 }}, - { 0x003383, 0, { 0x00006D, /* 3383; 006D 0061; Additional folding */ - 0x000061 }}, - { 0x003384, 0, { 0x00006B, /* 3384; 006B 0061; Additional folding */ - 0x000061 }}, - { 0x003385, 0, { 0x00006B, /* 3385; 006B 0062; Additional folding */ - 0x000062 }}, - { 0x003386, 0, { 0x00006D, /* 3386; 006D 0062; Additional folding */ - 0x000062 }}, - { 0x003387, 0, { 0x000067, /* 3387; 0067 0062; Additional folding */ - 0x000062 }}, - { 0x00338A, 0, { 0x000070, /* 338A; 0070 0066; Additional folding */ - 0x000066 }}, - { 0x00338B, 0, { 0x00006E, /* 338B; 006E 0066; Additional folding */ - 0x000066 }}, - { 0x00338C, 0, { 0x0003BC, /* 338C; 03BC 0066; Additional folding */ - 0x000066 }}, - { 0x003390, 0, { 0x000068, /* 3390; 0068 007A; Additional folding */ - 0x00007A }}, - { 0x003391, 0, { 0x00006B, /* 3391; 006B 0068 007A; Additional folding */ - 0x000068, 0x00007A }}, - { 0x003392, 0, { 0x00006D, /* 3392; 006D 0068 007A; Additional folding */ - 0x000068, 0x00007A }}, - { 0x003393, 0, { 0x000067, /* 3393; 0067 0068 007A; Additional folding */ - 0x000068, 0x00007A }}, - { 0x003394, 0, { 0x000074, /* 3394; 0074 0068 007A; Additional folding */ - 0x000068, 0x00007A }}, - { 0x0033A9, 0, { 0x000070, /* 33A9; 0070 0061; Additional folding */ - 0x000061 }}, - { 0x0033AA, 0, { 0x00006B, /* 33AA; 006B 0070 0061; Additional folding */ - 0x000070, 0x000061 }}, - { 0x0033AB, 0, { 0x00006D, /* 33AB; 006D 0070 0061; Additional folding */ - 0x000070, 0x000061 }}, - { 0x0033AC, 0, { 0x000067, /* 33AC; 0067 0070 0061; Additional folding */ - 0x000070, 0x000061 }}, - { 0x0033B4, 0, { 0x000070, /* 33B4; 0070 0076; Additional folding */ - 0x000076 }}, - { 0x0033B5, 0, { 0x00006E, /* 33B5; 006E 0076; Additional folding */ - 0x000076 }}, - { 0x0033B6, 0, { 0x0003BC, /* 33B6; 03BC 0076; Additional folding */ - 0x000076 }}, - { 0x0033B7, 0, { 0x00006D, /* 33B7; 006D 0076; Additional folding */ - 0x000076 }}, - { 0x0033B8, 0, { 0x00006B, /* 33B8; 006B 0076; Additional folding */ - 0x000076 }}, - { 0x0033B9, 0, { 0x00006D, /* 33B9; 006D 0076; Additional folding */ - 0x000076 }}, - { 0x0033BA, 0, { 0x000070, /* 33BA; 0070 0077; Additional folding */ - 0x000077 }}, - { 0x0033BB, 0, { 0x00006E, /* 33BB; 006E 0077; Additional folding */ - 0x000077 }}, - { 0x0033BC, 0, { 0x0003BC, /* 33BC; 03BC 0077; Additional folding */ - 0x000077 }}, - { 0x0033BD, 0, { 0x00006D, /* 33BD; 006D 0077; Additional folding */ - 0x000077 }}, - { 0x0033BE, 0, { 0x00006B, /* 33BE; 006B 0077; Additional folding */ - 0x000077 }}, - { 0x0033BF, 0, { 0x00006D, /* 33BF; 006D 0077; Additional folding */ - 0x000077 }}, - { 0x0033C0, 0, { 0x00006B, /* 33C0; 006B 03C9; Additional folding */ - 0x0003C9 }}, - { 0x0033C1, 0, { 0x00006D, /* 33C1; 006D 03C9; Additional folding */ - 0x0003C9 }}, - { 0x0033C3, 0, { 0x000062, /* 33C3; 0062 0071; Additional folding */ - 0x000071 }}, - { 0x0033C6, 0, { 0x000063, /* 33C6; 0063 2215 006B 0067; Additional folding */ - 0x002215, 0x00006B, 0x000067 }}, - { 0x0033C7, 0, { 0x000063, /* 33C7; 0063 006F 002E; Additional folding */ - 0x00006F, 0x00002E }}, - { 0x0033C8, 0, { 0x000064, /* 33C8; 0064 0062; Additional folding */ - 0x000062 }}, - { 0x0033C9, 0, { 0x000067, /* 33C9; 0067 0079; Additional folding */ - 0x000079 }}, - { 0x0033CB, 0, { 0x000068, /* 33CB; 0068 0070; Additional folding */ - 0x000070 }}, - { 0x0033CD, 0, { 0x00006B, /* 33CD; 006B 006B; Additional folding */ - 0x00006B }}, - { 0x0033CE, 0, { 0x00006B, /* 33CE; 006B 006D; Additional folding */ - 0x00006D }}, - { 0x0033D7, 0, { 0x000070, /* 33D7; 0070 0068; Additional folding */ - 0x000068 }}, - { 0x0033D9, 0, { 0x000070, /* 33D9; 0070 0070 006D; Additional folding */ - 0x000070, 0x00006D }}, - { 0x0033DA, 0, { 0x000070, /* 33DA; 0070 0072; Additional folding */ - 0x000072 }}, - { 0x0033DC, 0, { 0x000073, /* 33DC; 0073 0076; Additional folding */ - 0x000076 }}, - { 0x0033DD, 0, { 0x000077, /* 33DD; 0077 0062; Additional folding */ - 0x000062 }}, - { 0x00FB00, 0, { 0x000066, /* FB00; 0066 0066; Case map */ - 0x000066 }}, - { 0x00FB01, 0, { 0x000066, /* FB01; 0066 0069; Case map */ - 0x000069 }}, - { 0x00FB02, 0, { 0x000066, /* FB02; 0066 006C; Case map */ - 0x00006C }}, - { 0x00FB03, 0, { 0x000066, /* FB03; 0066 0066 0069; Case map */ - 0x000066, 0x000069 }}, - { 0x00FB04, 0, { 0x000066, /* FB04; 0066 0066 006C; Case map */ - 0x000066, 0x00006C }}, - { 0x00FB05, 0, { 0x000073, /* FB05; 0073 0074; Case map */ - 0x000074 }}, - { 0x00FB06, 0, { 0x000073, /* FB06; 0073 0074; Case map */ - 0x000074 }}, - { 0x00FB13, 0, { 0x000574, /* FB13; 0574 0576; Case map */ - 0x000576 }}, - { 0x00FB14, 0, { 0x000574, /* FB14; 0574 0565; Case map */ - 0x000565 }}, - { 0x00FB15, 0, { 0x000574, /* FB15; 0574 056B; Case map */ - 0x00056B }}, - { 0x00FB16, 0, { 0x00057E, /* FB16; 057E 0576; Case map */ - 0x000576 }}, - { 0x00FB17, 0, { 0x000574, /* FB17; 0574 056D; Case map */ - 0x00056D }}, - { 0x00FF21, 0, { 0x00FF41 }}, /* FF21; FF41; Case map */ - { 0x00FF22, 0, { 0x00FF42 }}, /* FF22; FF42; Case map */ - { 0x00FF23, 0, { 0x00FF43 }}, /* FF23; FF43; Case map */ - { 0x00FF24, 0, { 0x00FF44 }}, /* FF24; FF44; Case map */ - { 0x00FF25, 0, { 0x00FF45 }}, /* FF25; FF45; Case map */ - { 0x00FF26, 0, { 0x00FF46 }}, /* FF26; FF46; Case map */ - { 0x00FF27, 0, { 0x00FF47 }}, /* FF27; FF47; Case map */ - { 0x00FF28, 0, { 0x00FF48 }}, /* FF28; FF48; Case map */ - { 0x00FF29, 0, { 0x00FF49 }}, /* FF29; FF49; Case map */ - { 0x00FF2A, 0, { 0x00FF4A }}, /* FF2A; FF4A; Case map */ - { 0x00FF2B, 0, { 0x00FF4B }}, /* FF2B; FF4B; Case map */ - { 0x00FF2C, 0, { 0x00FF4C }}, /* FF2C; FF4C; Case map */ - { 0x00FF2D, 0, { 0x00FF4D }}, /* FF2D; FF4D; Case map */ - { 0x00FF2E, 0, { 0x00FF4E }}, /* FF2E; FF4E; Case map */ - { 0x00FF2F, 0, { 0x00FF4F }}, /* FF2F; FF4F; Case map */ - { 0x00FF30, 0, { 0x00FF50 }}, /* FF30; FF50; Case map */ - { 0x00FF31, 0, { 0x00FF51 }}, /* FF31; FF51; Case map */ - { 0x00FF32, 0, { 0x00FF52 }}, /* FF32; FF52; Case map */ - { 0x00FF33, 0, { 0x00FF53 }}, /* FF33; FF53; Case map */ - { 0x00FF34, 0, { 0x00FF54 }}, /* FF34; FF54; Case map */ - { 0x00FF35, 0, { 0x00FF55 }}, /* FF35; FF55; Case map */ - { 0x00FF36, 0, { 0x00FF56 }}, /* FF36; FF56; Case map */ - { 0x00FF37, 0, { 0x00FF57 }}, /* FF37; FF57; Case map */ - { 0x00FF38, 0, { 0x00FF58 }}, /* FF38; FF58; Case map */ - { 0x00FF39, 0, { 0x00FF59 }}, /* FF39; FF59; Case map */ - { 0x00FF3A, 0, { 0x00FF5A }}, /* FF3A; FF5A; Case map */ - { 0x010400, 0, { 0x010428 }}, /* 10400; 10428; Case map */ - { 0x010401, 0, { 0x010429 }}, /* 10401; 10429; Case map */ - { 0x010402, 0, { 0x01042A }}, /* 10402; 1042A; Case map */ - { 0x010403, 0, { 0x01042B }}, /* 10403; 1042B; Case map */ - { 0x010404, 0, { 0x01042C }}, /* 10404; 1042C; Case map */ - { 0x010405, 0, { 0x01042D }}, /* 10405; 1042D; Case map */ - { 0x010406, 0, { 0x01042E }}, /* 10406; 1042E; Case map */ - { 0x010407, 0, { 0x01042F }}, /* 10407; 1042F; Case map */ - { 0x010408, 0, { 0x010430 }}, /* 10408; 10430; Case map */ - { 0x010409, 0, { 0x010431 }}, /* 10409; 10431; Case map */ - { 0x01040A, 0, { 0x010432 }}, /* 1040A; 10432; Case map */ - { 0x01040B, 0, { 0x010433 }}, /* 1040B; 10433; Case map */ - { 0x01040C, 0, { 0x010434 }}, /* 1040C; 10434; Case map */ - { 0x01040D, 0, { 0x010435 }}, /* 1040D; 10435; Case map */ - { 0x01040E, 0, { 0x010436 }}, /* 1040E; 10436; Case map */ - { 0x01040F, 0, { 0x010437 }}, /* 1040F; 10437; Case map */ - { 0x010410, 0, { 0x010438 }}, /* 10410; 10438; Case map */ - { 0x010411, 0, { 0x010439 }}, /* 10411; 10439; Case map */ - { 0x010412, 0, { 0x01043A }}, /* 10412; 1043A; Case map */ - { 0x010413, 0, { 0x01043B }}, /* 10413; 1043B; Case map */ - { 0x010414, 0, { 0x01043C }}, /* 10414; 1043C; Case map */ - { 0x010415, 0, { 0x01043D }}, /* 10415; 1043D; Case map */ - { 0x010416, 0, { 0x01043E }}, /* 10416; 1043E; Case map */ - { 0x010417, 0, { 0x01043F }}, /* 10417; 1043F; Case map */ - { 0x010418, 0, { 0x010440 }}, /* 10418; 10440; Case map */ - { 0x010419, 0, { 0x010441 }}, /* 10419; 10441; Case map */ - { 0x01041A, 0, { 0x010442 }}, /* 1041A; 10442; Case map */ - { 0x01041B, 0, { 0x010443 }}, /* 1041B; 10443; Case map */ - { 0x01041C, 0, { 0x010444 }}, /* 1041C; 10444; Case map */ - { 0x01041D, 0, { 0x010445 }}, /* 1041D; 10445; Case map */ - { 0x01041E, 0, { 0x010446 }}, /* 1041E; 10446; Case map */ - { 0x01041F, 0, { 0x010447 }}, /* 1041F; 10447; Case map */ - { 0x010420, 0, { 0x010448 }}, /* 10420; 10448; Case map */ - { 0x010421, 0, { 0x010449 }}, /* 10421; 10449; Case map */ - { 0x010422, 0, { 0x01044A }}, /* 10422; 1044A; Case map */ - { 0x010423, 0, { 0x01044B }}, /* 10423; 1044B; Case map */ - { 0x010424, 0, { 0x01044C }}, /* 10424; 1044C; Case map */ - { 0x010425, 0, { 0x01044D }}, /* 10425; 1044D; Case map */ - { 0x01D400, 0, { 0x000061 }}, /* 1D400; 0061; Additional folding */ - { 0x01D401, 0, { 0x000062 }}, /* 1D401; 0062; Additional folding */ - { 0x01D402, 0, { 0x000063 }}, /* 1D402; 0063; Additional folding */ - { 0x01D403, 0, { 0x000064 }}, /* 1D403; 0064; Additional folding */ - { 0x01D404, 0, { 0x000065 }}, /* 1D404; 0065; Additional folding */ - { 0x01D405, 0, { 0x000066 }}, /* 1D405; 0066; Additional folding */ - { 0x01D406, 0, { 0x000067 }}, /* 1D406; 0067; Additional folding */ - { 0x01D407, 0, { 0x000068 }}, /* 1D407; 0068; Additional folding */ - { 0x01D408, 0, { 0x000069 }}, /* 1D408; 0069; Additional folding */ - { 0x01D409, 0, { 0x00006A }}, /* 1D409; 006A; Additional folding */ - { 0x01D40A, 0, { 0x00006B }}, /* 1D40A; 006B; Additional folding */ - { 0x01D40B, 0, { 0x00006C }}, /* 1D40B; 006C; Additional folding */ - { 0x01D40C, 0, { 0x00006D }}, /* 1D40C; 006D; Additional folding */ - { 0x01D40D, 0, { 0x00006E }}, /* 1D40D; 006E; Additional folding */ - { 0x01D40E, 0, { 0x00006F }}, /* 1D40E; 006F; Additional folding */ - { 0x01D40F, 0, { 0x000070 }}, /* 1D40F; 0070; Additional folding */ - { 0x01D410, 0, { 0x000071 }}, /* 1D410; 0071; Additional folding */ - { 0x01D411, 0, { 0x000072 }}, /* 1D411; 0072; Additional folding */ - { 0x01D412, 0, { 0x000073 }}, /* 1D412; 0073; Additional folding */ - { 0x01D413, 0, { 0x000074 }}, /* 1D413; 0074; Additional folding */ - { 0x01D414, 0, { 0x000075 }}, /* 1D414; 0075; Additional folding */ - { 0x01D415, 0, { 0x000076 }}, /* 1D415; 0076; Additional folding */ - { 0x01D416, 0, { 0x000077 }}, /* 1D416; 0077; Additional folding */ - { 0x01D417, 0, { 0x000078 }}, /* 1D417; 0078; Additional folding */ - { 0x01D418, 0, { 0x000079 }}, /* 1D418; 0079; Additional folding */ - { 0x01D419, 0, { 0x00007A }}, /* 1D419; 007A; Additional folding */ - { 0x01D434, 0, { 0x000061 }}, /* 1D434; 0061; Additional folding */ - { 0x01D435, 0, { 0x000062 }}, /* 1D435; 0062; Additional folding */ - { 0x01D436, 0, { 0x000063 }}, /* 1D436; 0063; Additional folding */ - { 0x01D437, 0, { 0x000064 }}, /* 1D437; 0064; Additional folding */ - { 0x01D438, 0, { 0x000065 }}, /* 1D438; 0065; Additional folding */ - { 0x01D439, 0, { 0x000066 }}, /* 1D439; 0066; Additional folding */ - { 0x01D43A, 0, { 0x000067 }}, /* 1D43A; 0067; Additional folding */ - { 0x01D43B, 0, { 0x000068 }}, /* 1D43B; 0068; Additional folding */ - { 0x01D43C, 0, { 0x000069 }}, /* 1D43C; 0069; Additional folding */ - { 0x01D43D, 0, { 0x00006A }}, /* 1D43D; 006A; Additional folding */ - { 0x01D43E, 0, { 0x00006B }}, /* 1D43E; 006B; Additional folding */ - { 0x01D43F, 0, { 0x00006C }}, /* 1D43F; 006C; Additional folding */ - { 0x01D440, 0, { 0x00006D }}, /* 1D440; 006D; Additional folding */ - { 0x01D441, 0, { 0x00006E }}, /* 1D441; 006E; Additional folding */ - { 0x01D442, 0, { 0x00006F }}, /* 1D442; 006F; Additional folding */ - { 0x01D443, 0, { 0x000070 }}, /* 1D443; 0070; Additional folding */ - { 0x01D444, 0, { 0x000071 }}, /* 1D444; 0071; Additional folding */ - { 0x01D445, 0, { 0x000072 }}, /* 1D445; 0072; Additional folding */ - { 0x01D446, 0, { 0x000073 }}, /* 1D446; 0073; Additional folding */ - { 0x01D447, 0, { 0x000074 }}, /* 1D447; 0074; Additional folding */ - { 0x01D448, 0, { 0x000075 }}, /* 1D448; 0075; Additional folding */ - { 0x01D449, 0, { 0x000076 }}, /* 1D449; 0076; Additional folding */ - { 0x01D44A, 0, { 0x000077 }}, /* 1D44A; 0077; Additional folding */ - { 0x01D44B, 0, { 0x000078 }}, /* 1D44B; 0078; Additional folding */ - { 0x01D44C, 0, { 0x000079 }}, /* 1D44C; 0079; Additional folding */ - { 0x01D44D, 0, { 0x00007A }}, /* 1D44D; 007A; Additional folding */ - { 0x01D468, 0, { 0x000061 }}, /* 1D468; 0061; Additional folding */ - { 0x01D469, 0, { 0x000062 }}, /* 1D469; 0062; Additional folding */ - { 0x01D46A, 0, { 0x000063 }}, /* 1D46A; 0063; Additional folding */ - { 0x01D46B, 0, { 0x000064 }}, /* 1D46B; 0064; Additional folding */ - { 0x01D46C, 0, { 0x000065 }}, /* 1D46C; 0065; Additional folding */ - { 0x01D46D, 0, { 0x000066 }}, /* 1D46D; 0066; Additional folding */ - { 0x01D46E, 0, { 0x000067 }}, /* 1D46E; 0067; Additional folding */ - { 0x01D46F, 0, { 0x000068 }}, /* 1D46F; 0068; Additional folding */ - { 0x01D470, 0, { 0x000069 }}, /* 1D470; 0069; Additional folding */ - { 0x01D471, 0, { 0x00006A }}, /* 1D471; 006A; Additional folding */ - { 0x01D472, 0, { 0x00006B }}, /* 1D472; 006B; Additional folding */ - { 0x01D473, 0, { 0x00006C }}, /* 1D473; 006C; Additional folding */ - { 0x01D474, 0, { 0x00006D }}, /* 1D474; 006D; Additional folding */ - { 0x01D475, 0, { 0x00006E }}, /* 1D475; 006E; Additional folding */ - { 0x01D476, 0, { 0x00006F }}, /* 1D476; 006F; Additional folding */ - { 0x01D477, 0, { 0x000070 }}, /* 1D477; 0070; Additional folding */ - { 0x01D478, 0, { 0x000071 }}, /* 1D478; 0071; Additional folding */ - { 0x01D479, 0, { 0x000072 }}, /* 1D479; 0072; Additional folding */ - { 0x01D47A, 0, { 0x000073 }}, /* 1D47A; 0073; Additional folding */ - { 0x01D47B, 0, { 0x000074 }}, /* 1D47B; 0074; Additional folding */ - { 0x01D47C, 0, { 0x000075 }}, /* 1D47C; 0075; Additional folding */ - { 0x01D47D, 0, { 0x000076 }}, /* 1D47D; 0076; Additional folding */ - { 0x01D47E, 0, { 0x000077 }}, /* 1D47E; 0077; Additional folding */ - { 0x01D47F, 0, { 0x000078 }}, /* 1D47F; 0078; Additional folding */ - { 0x01D480, 0, { 0x000079 }}, /* 1D480; 0079; Additional folding */ - { 0x01D481, 0, { 0x00007A }}, /* 1D481; 007A; Additional folding */ - { 0x01D49C, 0, { 0x000061 }}, /* 1D49C; 0061; Additional folding */ - { 0x01D49E, 0, { 0x000063 }}, /* 1D49E; 0063; Additional folding */ - { 0x01D49F, 0, { 0x000064 }}, /* 1D49F; 0064; Additional folding */ - { 0x01D4A2, 0, { 0x000067 }}, /* 1D4A2; 0067; Additional folding */ - { 0x01D4A5, 0, { 0x00006A }}, /* 1D4A5; 006A; Additional folding */ - { 0x01D4A6, 0, { 0x00006B }}, /* 1D4A6; 006B; Additional folding */ - { 0x01D4A9, 0, { 0x00006E }}, /* 1D4A9; 006E; Additional folding */ - { 0x01D4AA, 0, { 0x00006F }}, /* 1D4AA; 006F; Additional folding */ - { 0x01D4AB, 0, { 0x000070 }}, /* 1D4AB; 0070; Additional folding */ - { 0x01D4AC, 0, { 0x000071 }}, /* 1D4AC; 0071; Additional folding */ - { 0x01D4AE, 0, { 0x000073 }}, /* 1D4AE; 0073; Additional folding */ - { 0x01D4AF, 0, { 0x000074 }}, /* 1D4AF; 0074; Additional folding */ - { 0x01D4B0, 0, { 0x000075 }}, /* 1D4B0; 0075; Additional folding */ - { 0x01D4B1, 0, { 0x000076 }}, /* 1D4B1; 0076; Additional folding */ - { 0x01D4B2, 0, { 0x000077 }}, /* 1D4B2; 0077; Additional folding */ - { 0x01D4B3, 0, { 0x000078 }}, /* 1D4B3; 0078; Additional folding */ - { 0x01D4B4, 0, { 0x000079 }}, /* 1D4B4; 0079; Additional folding */ - { 0x01D4B5, 0, { 0x00007A }}, /* 1D4B5; 007A; Additional folding */ - { 0x01D4D0, 0, { 0x000061 }}, /* 1D4D0; 0061; Additional folding */ - { 0x01D4D1, 0, { 0x000062 }}, /* 1D4D1; 0062; Additional folding */ - { 0x01D4D2, 0, { 0x000063 }}, /* 1D4D2; 0063; Additional folding */ - { 0x01D4D3, 0, { 0x000064 }}, /* 1D4D3; 0064; Additional folding */ - { 0x01D4D4, 0, { 0x000065 }}, /* 1D4D4; 0065; Additional folding */ - { 0x01D4D5, 0, { 0x000066 }}, /* 1D4D5; 0066; Additional folding */ - { 0x01D4D6, 0, { 0x000067 }}, /* 1D4D6; 0067; Additional folding */ - { 0x01D4D7, 0, { 0x000068 }}, /* 1D4D7; 0068; Additional folding */ - { 0x01D4D8, 0, { 0x000069 }}, /* 1D4D8; 0069; Additional folding */ - { 0x01D4D9, 0, { 0x00006A }}, /* 1D4D9; 006A; Additional folding */ - { 0x01D4DA, 0, { 0x00006B }}, /* 1D4DA; 006B; Additional folding */ - { 0x01D4DB, 0, { 0x00006C }}, /* 1D4DB; 006C; Additional folding */ - { 0x01D4DC, 0, { 0x00006D }}, /* 1D4DC; 006D; Additional folding */ - { 0x01D4DD, 0, { 0x00006E }}, /* 1D4DD; 006E; Additional folding */ - { 0x01D4DE, 0, { 0x00006F }}, /* 1D4DE; 006F; Additional folding */ - { 0x01D4DF, 0, { 0x000070 }}, /* 1D4DF; 0070; Additional folding */ - { 0x01D4E0, 0, { 0x000071 }}, /* 1D4E0; 0071; Additional folding */ - { 0x01D4E1, 0, { 0x000072 }}, /* 1D4E1; 0072; Additional folding */ - { 0x01D4E2, 0, { 0x000073 }}, /* 1D4E2; 0073; Additional folding */ - { 0x01D4E3, 0, { 0x000074 }}, /* 1D4E3; 0074; Additional folding */ - { 0x01D4E4, 0, { 0x000075 }}, /* 1D4E4; 0075; Additional folding */ - { 0x01D4E5, 0, { 0x000076 }}, /* 1D4E5; 0076; Additional folding */ - { 0x01D4E6, 0, { 0x000077 }}, /* 1D4E6; 0077; Additional folding */ - { 0x01D4E7, 0, { 0x000078 }}, /* 1D4E7; 0078; Additional folding */ - { 0x01D4E8, 0, { 0x000079 }}, /* 1D4E8; 0079; Additional folding */ - { 0x01D4E9, 0, { 0x00007A }}, /* 1D4E9; 007A; Additional folding */ - { 0x01D504, 0, { 0x000061 }}, /* 1D504; 0061; Additional folding */ - { 0x01D505, 0, { 0x000062 }}, /* 1D505; 0062; Additional folding */ - { 0x01D507, 0, { 0x000064 }}, /* 1D507; 0064; Additional folding */ - { 0x01D508, 0, { 0x000065 }}, /* 1D508; 0065; Additional folding */ - { 0x01D509, 0, { 0x000066 }}, /* 1D509; 0066; Additional folding */ - { 0x01D50A, 0, { 0x000067 }}, /* 1D50A; 0067; Additional folding */ - { 0x01D50D, 0, { 0x00006A }}, /* 1D50D; 006A; Additional folding */ - { 0x01D50E, 0, { 0x00006B }}, /* 1D50E; 006B; Additional folding */ - { 0x01D50F, 0, { 0x00006C }}, /* 1D50F; 006C; Additional folding */ - { 0x01D510, 0, { 0x00006D }}, /* 1D510; 006D; Additional folding */ - { 0x01D511, 0, { 0x00006E }}, /* 1D511; 006E; Additional folding */ - { 0x01D512, 0, { 0x00006F }}, /* 1D512; 006F; Additional folding */ - { 0x01D513, 0, { 0x000070 }}, /* 1D513; 0070; Additional folding */ - { 0x01D514, 0, { 0x000071 }}, /* 1D514; 0071; Additional folding */ - { 0x01D516, 0, { 0x000073 }}, /* 1D516; 0073; Additional folding */ - { 0x01D517, 0, { 0x000074 }}, /* 1D517; 0074; Additional folding */ - { 0x01D518, 0, { 0x000075 }}, /* 1D518; 0075; Additional folding */ - { 0x01D519, 0, { 0x000076 }}, /* 1D519; 0076; Additional folding */ - { 0x01D51A, 0, { 0x000077 }}, /* 1D51A; 0077; Additional folding */ - { 0x01D51B, 0, { 0x000078 }}, /* 1D51B; 0078; Additional folding */ - { 0x01D51C, 0, { 0x000079 }}, /* 1D51C; 0079; Additional folding */ - { 0x01D538, 0, { 0x000061 }}, /* 1D538; 0061; Additional folding */ - { 0x01D539, 0, { 0x000062 }}, /* 1D539; 0062; Additional folding */ - { 0x01D53B, 0, { 0x000064 }}, /* 1D53B; 0064; Additional folding */ - { 0x01D53C, 0, { 0x000065 }}, /* 1D53C; 0065; Additional folding */ - { 0x01D53D, 0, { 0x000066 }}, /* 1D53D; 0066; Additional folding */ - { 0x01D53E, 0, { 0x000067 }}, /* 1D53E; 0067; Additional folding */ - { 0x01D540, 0, { 0x000069 }}, /* 1D540; 0069; Additional folding */ - { 0x01D541, 0, { 0x00006A }}, /* 1D541; 006A; Additional folding */ - { 0x01D542, 0, { 0x00006B }}, /* 1D542; 006B; Additional folding */ - { 0x01D543, 0, { 0x00006C }}, /* 1D543; 006C; Additional folding */ - { 0x01D544, 0, { 0x00006D }}, /* 1D544; 006D; Additional folding */ - { 0x01D546, 0, { 0x00006F }}, /* 1D546; 006F; Additional folding */ - { 0x01D54A, 0, { 0x000073 }}, /* 1D54A; 0073; Additional folding */ - { 0x01D54B, 0, { 0x000074 }}, /* 1D54B; 0074; Additional folding */ - { 0x01D54C, 0, { 0x000075 }}, /* 1D54C; 0075; Additional folding */ - { 0x01D54D, 0, { 0x000076 }}, /* 1D54D; 0076; Additional folding */ - { 0x01D54E, 0, { 0x000077 }}, /* 1D54E; 0077; Additional folding */ - { 0x01D54F, 0, { 0x000078 }}, /* 1D54F; 0078; Additional folding */ - { 0x01D550, 0, { 0x000079 }}, /* 1D550; 0079; Additional folding */ - { 0x01D56C, 0, { 0x000061 }}, /* 1D56C; 0061; Additional folding */ - { 0x01D56D, 0, { 0x000062 }}, /* 1D56D; 0062; Additional folding */ - { 0x01D56E, 0, { 0x000063 }}, /* 1D56E; 0063; Additional folding */ - { 0x01D56F, 0, { 0x000064 }}, /* 1D56F; 0064; Additional folding */ - { 0x01D570, 0, { 0x000065 }}, /* 1D570; 0065; Additional folding */ - { 0x01D571, 0, { 0x000066 }}, /* 1D571; 0066; Additional folding */ - { 0x01D572, 0, { 0x000067 }}, /* 1D572; 0067; Additional folding */ - { 0x01D573, 0, { 0x000068 }}, /* 1D573; 0068; Additional folding */ - { 0x01D574, 0, { 0x000069 }}, /* 1D574; 0069; Additional folding */ - { 0x01D575, 0, { 0x00006A }}, /* 1D575; 006A; Additional folding */ - { 0x01D576, 0, { 0x00006B }}, /* 1D576; 006B; Additional folding */ - { 0x01D577, 0, { 0x00006C }}, /* 1D577; 006C; Additional folding */ - { 0x01D578, 0, { 0x00006D }}, /* 1D578; 006D; Additional folding */ - { 0x01D579, 0, { 0x00006E }}, /* 1D579; 006E; Additional folding */ - { 0x01D57A, 0, { 0x00006F }}, /* 1D57A; 006F; Additional folding */ - { 0x01D57B, 0, { 0x000070 }}, /* 1D57B; 0070; Additional folding */ - { 0x01D57C, 0, { 0x000071 }}, /* 1D57C; 0071; Additional folding */ - { 0x01D57D, 0, { 0x000072 }}, /* 1D57D; 0072; Additional folding */ - { 0x01D57E, 0, { 0x000073 }}, /* 1D57E; 0073; Additional folding */ - { 0x01D57F, 0, { 0x000074 }}, /* 1D57F; 0074; Additional folding */ - { 0x01D580, 0, { 0x000075 }}, /* 1D580; 0075; Additional folding */ - { 0x01D581, 0, { 0x000076 }}, /* 1D581; 0076; Additional folding */ - { 0x01D582, 0, { 0x000077 }}, /* 1D582; 0077; Additional folding */ - { 0x01D583, 0, { 0x000078 }}, /* 1D583; 0078; Additional folding */ - { 0x01D584, 0, { 0x000079 }}, /* 1D584; 0079; Additional folding */ - { 0x01D585, 0, { 0x00007A }}, /* 1D585; 007A; Additional folding */ - { 0x01D5A0, 0, { 0x000061 }}, /* 1D5A0; 0061; Additional folding */ - { 0x01D5A1, 0, { 0x000062 }}, /* 1D5A1; 0062; Additional folding */ - { 0x01D5A2, 0, { 0x000063 }}, /* 1D5A2; 0063; Additional folding */ - { 0x01D5A3, 0, { 0x000064 }}, /* 1D5A3; 0064; Additional folding */ - { 0x01D5A4, 0, { 0x000065 }}, /* 1D5A4; 0065; Additional folding */ - { 0x01D5A5, 0, { 0x000066 }}, /* 1D5A5; 0066; Additional folding */ - { 0x01D5A6, 0, { 0x000067 }}, /* 1D5A6; 0067; Additional folding */ - { 0x01D5A7, 0, { 0x000068 }}, /* 1D5A7; 0068; Additional folding */ - { 0x01D5A8, 0, { 0x000069 }}, /* 1D5A8; 0069; Additional folding */ - { 0x01D5A9, 0, { 0x00006A }}, /* 1D5A9; 006A; Additional folding */ - { 0x01D5AA, 0, { 0x00006B }}, /* 1D5AA; 006B; Additional folding */ - { 0x01D5AB, 0, { 0x00006C }}, /* 1D5AB; 006C; Additional folding */ - { 0x01D5AC, 0, { 0x00006D }}, /* 1D5AC; 006D; Additional folding */ - { 0x01D5AD, 0, { 0x00006E }}, /* 1D5AD; 006E; Additional folding */ - { 0x01D5AE, 0, { 0x00006F }}, /* 1D5AE; 006F; Additional folding */ - { 0x01D5AF, 0, { 0x000070 }}, /* 1D5AF; 0070; Additional folding */ - { 0x01D5B0, 0, { 0x000071 }}, /* 1D5B0; 0071; Additional folding */ - { 0x01D5B1, 0, { 0x000072 }}, /* 1D5B1; 0072; Additional folding */ - { 0x01D5B2, 0, { 0x000073 }}, /* 1D5B2; 0073; Additional folding */ - { 0x01D5B3, 0, { 0x000074 }}, /* 1D5B3; 0074; Additional folding */ - { 0x01D5B4, 0, { 0x000075 }}, /* 1D5B4; 0075; Additional folding */ - { 0x01D5B5, 0, { 0x000076 }}, /* 1D5B5; 0076; Additional folding */ - { 0x01D5B6, 0, { 0x000077 }}, /* 1D5B6; 0077; Additional folding */ - { 0x01D5B7, 0, { 0x000078 }}, /* 1D5B7; 0078; Additional folding */ - { 0x01D5B8, 0, { 0x000079 }}, /* 1D5B8; 0079; Additional folding */ - { 0x01D5B9, 0, { 0x00007A }}, /* 1D5B9; 007A; Additional folding */ - { 0x01D5D4, 0, { 0x000061 }}, /* 1D5D4; 0061; Additional folding */ - { 0x01D5D5, 0, { 0x000062 }}, /* 1D5D5; 0062; Additional folding */ - { 0x01D5D6, 0, { 0x000063 }}, /* 1D5D6; 0063; Additional folding */ - { 0x01D5D7, 0, { 0x000064 }}, /* 1D5D7; 0064; Additional folding */ - { 0x01D5D8, 0, { 0x000065 }}, /* 1D5D8; 0065; Additional folding */ - { 0x01D5D9, 0, { 0x000066 }}, /* 1D5D9; 0066; Additional folding */ - { 0x01D5DA, 0, { 0x000067 }}, /* 1D5DA; 0067; Additional folding */ - { 0x01D5DB, 0, { 0x000068 }}, /* 1D5DB; 0068; Additional folding */ - { 0x01D5DC, 0, { 0x000069 }}, /* 1D5DC; 0069; Additional folding */ - { 0x01D5DD, 0, { 0x00006A }}, /* 1D5DD; 006A; Additional folding */ - { 0x01D5DE, 0, { 0x00006B }}, /* 1D5DE; 006B; Additional folding */ - { 0x01D5DF, 0, { 0x00006C }}, /* 1D5DF; 006C; Additional folding */ - { 0x01D5E0, 0, { 0x00006D }}, /* 1D5E0; 006D; Additional folding */ - { 0x01D5E1, 0, { 0x00006E }}, /* 1D5E1; 006E; Additional folding */ - { 0x01D5E2, 0, { 0x00006F }}, /* 1D5E2; 006F; Additional folding */ - { 0x01D5E3, 0, { 0x000070 }}, /* 1D5E3; 0070; Additional folding */ - { 0x01D5E4, 0, { 0x000071 }}, /* 1D5E4; 0071; Additional folding */ - { 0x01D5E5, 0, { 0x000072 }}, /* 1D5E5; 0072; Additional folding */ - { 0x01D5E6, 0, { 0x000073 }}, /* 1D5E6; 0073; Additional folding */ - { 0x01D5E7, 0, { 0x000074 }}, /* 1D5E7; 0074; Additional folding */ - { 0x01D5E8, 0, { 0x000075 }}, /* 1D5E8; 0075; Additional folding */ - { 0x01D5E9, 0, { 0x000076 }}, /* 1D5E9; 0076; Additional folding */ - { 0x01D5EA, 0, { 0x000077 }}, /* 1D5EA; 0077; Additional folding */ - { 0x01D5EB, 0, { 0x000078 }}, /* 1D5EB; 0078; Additional folding */ - { 0x01D5EC, 0, { 0x000079 }}, /* 1D5EC; 0079; Additional folding */ - { 0x01D5ED, 0, { 0x00007A }}, /* 1D5ED; 007A; Additional folding */ - { 0x01D608, 0, { 0x000061 }}, /* 1D608; 0061; Additional folding */ - { 0x01D609, 0, { 0x000062 }}, /* 1D609; 0062; Additional folding */ - { 0x01D60A, 0, { 0x000063 }}, /* 1D60A; 0063; Additional folding */ - { 0x01D60B, 0, { 0x000064 }}, /* 1D60B; 0064; Additional folding */ - { 0x01D60C, 0, { 0x000065 }}, /* 1D60C; 0065; Additional folding */ - { 0x01D60D, 0, { 0x000066 }}, /* 1D60D; 0066; Additional folding */ - { 0x01D60E, 0, { 0x000067 }}, /* 1D60E; 0067; Additional folding */ - { 0x01D60F, 0, { 0x000068 }}, /* 1D60F; 0068; Additional folding */ - { 0x01D610, 0, { 0x000069 }}, /* 1D610; 0069; Additional folding */ - { 0x01D611, 0, { 0x00006A }}, /* 1D611; 006A; Additional folding */ - { 0x01D612, 0, { 0x00006B }}, /* 1D612; 006B; Additional folding */ - { 0x01D613, 0, { 0x00006C }}, /* 1D613; 006C; Additional folding */ - { 0x01D614, 0, { 0x00006D }}, /* 1D614; 006D; Additional folding */ - { 0x01D615, 0, { 0x00006E }}, /* 1D615; 006E; Additional folding */ - { 0x01D616, 0, { 0x00006F }}, /* 1D616; 006F; Additional folding */ - { 0x01D617, 0, { 0x000070 }}, /* 1D617; 0070; Additional folding */ - { 0x01D618, 0, { 0x000071 }}, /* 1D618; 0071; Additional folding */ - { 0x01D619, 0, { 0x000072 }}, /* 1D619; 0072; Additional folding */ - { 0x01D61A, 0, { 0x000073 }}, /* 1D61A; 0073; Additional folding */ - { 0x01D61B, 0, { 0x000074 }}, /* 1D61B; 0074; Additional folding */ - { 0x01D61C, 0, { 0x000075 }}, /* 1D61C; 0075; Additional folding */ - { 0x01D61D, 0, { 0x000076 }}, /* 1D61D; 0076; Additional folding */ - { 0x01D61E, 0, { 0x000077 }}, /* 1D61E; 0077; Additional folding */ - { 0x01D61F, 0, { 0x000078 }}, /* 1D61F; 0078; Additional folding */ - { 0x01D620, 0, { 0x000079 }}, /* 1D620; 0079; Additional folding */ - { 0x01D621, 0, { 0x00007A }}, /* 1D621; 007A; Additional folding */ - { 0x01D63C, 0, { 0x000061 }}, /* 1D63C; 0061; Additional folding */ - { 0x01D63D, 0, { 0x000062 }}, /* 1D63D; 0062; Additional folding */ - { 0x01D63E, 0, { 0x000063 }}, /* 1D63E; 0063; Additional folding */ - { 0x01D63F, 0, { 0x000064 }}, /* 1D63F; 0064; Additional folding */ - { 0x01D640, 0, { 0x000065 }}, /* 1D640; 0065; Additional folding */ - { 0x01D641, 0, { 0x000066 }}, /* 1D641; 0066; Additional folding */ - { 0x01D642, 0, { 0x000067 }}, /* 1D642; 0067; Additional folding */ - { 0x01D643, 0, { 0x000068 }}, /* 1D643; 0068; Additional folding */ - { 0x01D644, 0, { 0x000069 }}, /* 1D644; 0069; Additional folding */ - { 0x01D645, 0, { 0x00006A }}, /* 1D645; 006A; Additional folding */ - { 0x01D646, 0, { 0x00006B }}, /* 1D646; 006B; Additional folding */ - { 0x01D647, 0, { 0x00006C }}, /* 1D647; 006C; Additional folding */ - { 0x01D648, 0, { 0x00006D }}, /* 1D648; 006D; Additional folding */ - { 0x01D649, 0, { 0x00006E }}, /* 1D649; 006E; Additional folding */ - { 0x01D64A, 0, { 0x00006F }}, /* 1D64A; 006F; Additional folding */ - { 0x01D64B, 0, { 0x000070 }}, /* 1D64B; 0070; Additional folding */ - { 0x01D64C, 0, { 0x000071 }}, /* 1D64C; 0071; Additional folding */ - { 0x01D64D, 0, { 0x000072 }}, /* 1D64D; 0072; Additional folding */ - { 0x01D64E, 0, { 0x000073 }}, /* 1D64E; 0073; Additional folding */ - { 0x01D64F, 0, { 0x000074 }}, /* 1D64F; 0074; Additional folding */ - { 0x01D650, 0, { 0x000075 }}, /* 1D650; 0075; Additional folding */ - { 0x01D651, 0, { 0x000076 }}, /* 1D651; 0076; Additional folding */ - { 0x01D652, 0, { 0x000077 }}, /* 1D652; 0077; Additional folding */ - { 0x01D653, 0, { 0x000078 }}, /* 1D653; 0078; Additional folding */ - { 0x01D654, 0, { 0x000079 }}, /* 1D654; 0079; Additional folding */ - { 0x01D655, 0, { 0x00007A }}, /* 1D655; 007A; Additional folding */ - { 0x01D670, 0, { 0x000061 }}, /* 1D670; 0061; Additional folding */ - { 0x01D671, 0, { 0x000062 }}, /* 1D671; 0062; Additional folding */ - { 0x01D672, 0, { 0x000063 }}, /* 1D672; 0063; Additional folding */ - { 0x01D673, 0, { 0x000064 }}, /* 1D673; 0064; Additional folding */ - { 0x01D674, 0, { 0x000065 }}, /* 1D674; 0065; Additional folding */ - { 0x01D675, 0, { 0x000066 }}, /* 1D675; 0066; Additional folding */ - { 0x01D676, 0, { 0x000067 }}, /* 1D676; 0067; Additional folding */ - { 0x01D677, 0, { 0x000068 }}, /* 1D677; 0068; Additional folding */ - { 0x01D678, 0, { 0x000069 }}, /* 1D678; 0069; Additional folding */ - { 0x01D679, 0, { 0x00006A }}, /* 1D679; 006A; Additional folding */ - { 0x01D67A, 0, { 0x00006B }}, /* 1D67A; 006B; Additional folding */ - { 0x01D67B, 0, { 0x00006C }}, /* 1D67B; 006C; Additional folding */ - { 0x01D67C, 0, { 0x00006D }}, /* 1D67C; 006D; Additional folding */ - { 0x01D67D, 0, { 0x00006E }}, /* 1D67D; 006E; Additional folding */ - { 0x01D67E, 0, { 0x00006F }}, /* 1D67E; 006F; Additional folding */ - { 0x01D67F, 0, { 0x000070 }}, /* 1D67F; 0070; Additional folding */ - { 0x01D680, 0, { 0x000071 }}, /* 1D680; 0071; Additional folding */ - { 0x01D681, 0, { 0x000072 }}, /* 1D681; 0072; Additional folding */ - { 0x01D682, 0, { 0x000073 }}, /* 1D682; 0073; Additional folding */ - { 0x01D683, 0, { 0x000074 }}, /* 1D683; 0074; Additional folding */ - { 0x01D684, 0, { 0x000075 }}, /* 1D684; 0075; Additional folding */ - { 0x01D685, 0, { 0x000076 }}, /* 1D685; 0076; Additional folding */ - { 0x01D686, 0, { 0x000077 }}, /* 1D686; 0077; Additional folding */ - { 0x01D687, 0, { 0x000078 }}, /* 1D687; 0078; Additional folding */ - { 0x01D688, 0, { 0x000079 }}, /* 1D688; 0079; Additional folding */ - { 0x01D689, 0, { 0x00007A }}, /* 1D689; 007A; Additional folding */ - { 0x01D6A8, 0, { 0x0003B1 }}, /* 1D6A8; 03B1; Additional folding */ - { 0x01D6A9, 0, { 0x0003B2 }}, /* 1D6A9; 03B2; Additional folding */ - { 0x01D6AA, 0, { 0x0003B3 }}, /* 1D6AA; 03B3; Additional folding */ - { 0x01D6AB, 0, { 0x0003B4 }}, /* 1D6AB; 03B4; Additional folding */ - { 0x01D6AC, 0, { 0x0003B5 }}, /* 1D6AC; 03B5; Additional folding */ - { 0x01D6AD, 0, { 0x0003B6 }}, /* 1D6AD; 03B6; Additional folding */ - { 0x01D6AE, 0, { 0x0003B7 }}, /* 1D6AE; 03B7; Additional folding */ - { 0x01D6AF, 0, { 0x0003B8 }}, /* 1D6AF; 03B8; Additional folding */ - { 0x01D6B0, 0, { 0x0003B9 }}, /* 1D6B0; 03B9; Additional folding */ - { 0x01D6B1, 0, { 0x0003BA }}, /* 1D6B1; 03BA; Additional folding */ - { 0x01D6B2, 0, { 0x0003BB }}, /* 1D6B2; 03BB; Additional folding */ - { 0x01D6B3, 0, { 0x0003BC }}, /* 1D6B3; 03BC; Additional folding */ - { 0x01D6B4, 0, { 0x0003BD }}, /* 1D6B4; 03BD; Additional folding */ - { 0x01D6B5, 0, { 0x0003BE }}, /* 1D6B5; 03BE; Additional folding */ - { 0x01D6B6, 0, { 0x0003BF }}, /* 1D6B6; 03BF; Additional folding */ - { 0x01D6B7, 0, { 0x0003C0 }}, /* 1D6B7; 03C0; Additional folding */ - { 0x01D6B8, 0, { 0x0003C1 }}, /* 1D6B8; 03C1; Additional folding */ - { 0x01D6B9, 0, { 0x0003B8 }}, /* 1D6B9; 03B8; Additional folding */ - { 0x01D6BA, 0, { 0x0003C3 }}, /* 1D6BA; 03C3; Additional folding */ - { 0x01D6BB, 0, { 0x0003C4 }}, /* 1D6BB; 03C4; Additional folding */ - { 0x01D6BC, 0, { 0x0003C5 }}, /* 1D6BC; 03C5; Additional folding */ - { 0x01D6BD, 0, { 0x0003C6 }}, /* 1D6BD; 03C6; Additional folding */ - { 0x01D6BE, 0, { 0x0003C7 }}, /* 1D6BE; 03C7; Additional folding */ - { 0x01D6BF, 0, { 0x0003C8 }}, /* 1D6BF; 03C8; Additional folding */ - { 0x01D6C0, 0, { 0x0003C9 }}, /* 1D6C0; 03C9; Additional folding */ - { 0x01D6D3, 0, { 0x0003C3 }}, /* 1D6D3; 03C3; Additional folding */ - { 0x01D6E2, 0, { 0x0003B1 }}, /* 1D6E2; 03B1; Additional folding */ - { 0x01D6E3, 0, { 0x0003B2 }}, /* 1D6E3; 03B2; Additional folding */ - { 0x01D6E4, 0, { 0x0003B3 }}, /* 1D6E4; 03B3; Additional folding */ - { 0x01D6E5, 0, { 0x0003B4 }}, /* 1D6E5; 03B4; Additional folding */ - { 0x01D6E6, 0, { 0x0003B5 }}, /* 1D6E6; 03B5; Additional folding */ - { 0x01D6E7, 0, { 0x0003B6 }}, /* 1D6E7; 03B6; Additional folding */ - { 0x01D6E8, 0, { 0x0003B7 }}, /* 1D6E8; 03B7; Additional folding */ - { 0x01D6E9, 0, { 0x0003B8 }}, /* 1D6E9; 03B8; Additional folding */ - { 0x01D6EA, 0, { 0x0003B9 }}, /* 1D6EA; 03B9; Additional folding */ - { 0x01D6EB, 0, { 0x0003BA }}, /* 1D6EB; 03BA; Additional folding */ - { 0x01D6EC, 0, { 0x0003BB }}, /* 1D6EC; 03BB; Additional folding */ - { 0x01D6ED, 0, { 0x0003BC }}, /* 1D6ED; 03BC; Additional folding */ - { 0x01D6EE, 0, { 0x0003BD }}, /* 1D6EE; 03BD; Additional folding */ - { 0x01D6EF, 0, { 0x0003BE }}, /* 1D6EF; 03BE; Additional folding */ - { 0x01D6F0, 0, { 0x0003BF }}, /* 1D6F0; 03BF; Additional folding */ - { 0x01D6F1, 0, { 0x0003C0 }}, /* 1D6F1; 03C0; Additional folding */ - { 0x01D6F2, 0, { 0x0003C1 }}, /* 1D6F2; 03C1; Additional folding */ - { 0x01D6F3, 0, { 0x0003B8 }}, /* 1D6F3; 03B8; Additional folding */ - { 0x01D6F4, 0, { 0x0003C3 }}, /* 1D6F4; 03C3; Additional folding */ - { 0x01D6F5, 0, { 0x0003C4 }}, /* 1D6F5; 03C4; Additional folding */ - { 0x01D6F6, 0, { 0x0003C5 }}, /* 1D6F6; 03C5; Additional folding */ - { 0x01D6F7, 0, { 0x0003C6 }}, /* 1D6F7; 03C6; Additional folding */ - { 0x01D6F8, 0, { 0x0003C7 }}, /* 1D6F8; 03C7; Additional folding */ - { 0x01D6F9, 0, { 0x0003C8 }}, /* 1D6F9; 03C8; Additional folding */ - { 0x01D6FA, 0, { 0x0003C9 }}, /* 1D6FA; 03C9; Additional folding */ - { 0x01D70D, 0, { 0x0003C3 }}, /* 1D70D; 03C3; Additional folding */ - { 0x01D71C, 0, { 0x0003B1 }}, /* 1D71C; 03B1; Additional folding */ - { 0x01D71D, 0, { 0x0003B2 }}, /* 1D71D; 03B2; Additional folding */ - { 0x01D71E, 0, { 0x0003B3 }}, /* 1D71E; 03B3; Additional folding */ - { 0x01D71F, 0, { 0x0003B4 }}, /* 1D71F; 03B4; Additional folding */ - { 0x01D720, 0, { 0x0003B5 }}, /* 1D720; 03B5; Additional folding */ - { 0x01D721, 0, { 0x0003B6 }}, /* 1D721; 03B6; Additional folding */ - { 0x01D722, 0, { 0x0003B7 }}, /* 1D722; 03B7; Additional folding */ - { 0x01D723, 0, { 0x0003B8 }}, /* 1D723; 03B8; Additional folding */ - { 0x01D724, 0, { 0x0003B9 }}, /* 1D724; 03B9; Additional folding */ - { 0x01D725, 0, { 0x0003BA }}, /* 1D725; 03BA; Additional folding */ - { 0x01D726, 0, { 0x0003BB }}, /* 1D726; 03BB; Additional folding */ - { 0x01D727, 0, { 0x0003BC }}, /* 1D727; 03BC; Additional folding */ - { 0x01D728, 0, { 0x0003BD }}, /* 1D728; 03BD; Additional folding */ - { 0x01D729, 0, { 0x0003BE }}, /* 1D729; 03BE; Additional folding */ - { 0x01D72A, 0, { 0x0003BF }}, /* 1D72A; 03BF; Additional folding */ - { 0x01D72B, 0, { 0x0003C0 }}, /* 1D72B; 03C0; Additional folding */ - { 0x01D72C, 0, { 0x0003C1 }}, /* 1D72C; 03C1; Additional folding */ - { 0x01D72D, 0, { 0x0003B8 }}, /* 1D72D; 03B8; Additional folding */ - { 0x01D72E, 0, { 0x0003C3 }}, /* 1D72E; 03C3; Additional folding */ - { 0x01D72F, 0, { 0x0003C4 }}, /* 1D72F; 03C4; Additional folding */ - { 0x01D730, 0, { 0x0003C5 }}, /* 1D730; 03C5; Additional folding */ - { 0x01D731, 0, { 0x0003C6 }}, /* 1D731; 03C6; Additional folding */ - { 0x01D732, 0, { 0x0003C7 }}, /* 1D732; 03C7; Additional folding */ - { 0x01D733, 0, { 0x0003C8 }}, /* 1D733; 03C8; Additional folding */ - { 0x01D734, 0, { 0x0003C9 }}, /* 1D734; 03C9; Additional folding */ - { 0x01D747, 0, { 0x0003C3 }}, /* 1D747; 03C3; Additional folding */ - { 0x01D756, 0, { 0x0003B1 }}, /* 1D756; 03B1; Additional folding */ - { 0x01D757, 0, { 0x0003B2 }}, /* 1D757; 03B2; Additional folding */ - { 0x01D758, 0, { 0x0003B3 }}, /* 1D758; 03B3; Additional folding */ - { 0x01D759, 0, { 0x0003B4 }}, /* 1D759; 03B4; Additional folding */ - { 0x01D75A, 0, { 0x0003B5 }}, /* 1D75A; 03B5; Additional folding */ - { 0x01D75B, 0, { 0x0003B6 }}, /* 1D75B; 03B6; Additional folding */ - { 0x01D75C, 0, { 0x0003B7 }}, /* 1D75C; 03B7; Additional folding */ - { 0x01D75D, 0, { 0x0003B8 }}, /* 1D75D; 03B8; Additional folding */ - { 0x01D75E, 0, { 0x0003B9 }}, /* 1D75E; 03B9; Additional folding */ - { 0x01D75F, 0, { 0x0003BA }}, /* 1D75F; 03BA; Additional folding */ - { 0x01D760, 0, { 0x0003BB }}, /* 1D760; 03BB; Additional folding */ - { 0x01D761, 0, { 0x0003BC }}, /* 1D761; 03BC; Additional folding */ - { 0x01D762, 0, { 0x0003BD }}, /* 1D762; 03BD; Additional folding */ - { 0x01D763, 0, { 0x0003BE }}, /* 1D763; 03BE; Additional folding */ - { 0x01D764, 0, { 0x0003BF }}, /* 1D764; 03BF; Additional folding */ - { 0x01D765, 0, { 0x0003C0 }}, /* 1D765; 03C0; Additional folding */ - { 0x01D766, 0, { 0x0003C1 }}, /* 1D766; 03C1; Additional folding */ - { 0x01D767, 0, { 0x0003B8 }}, /* 1D767; 03B8; Additional folding */ - { 0x01D768, 0, { 0x0003C3 }}, /* 1D768; 03C3; Additional folding */ - { 0x01D769, 0, { 0x0003C4 }}, /* 1D769; 03C4; Additional folding */ - { 0x01D76A, 0, { 0x0003C5 }}, /* 1D76A; 03C5; Additional folding */ - { 0x01D76B, 0, { 0x0003C6 }}, /* 1D76B; 03C6; Additional folding */ - { 0x01D76C, 0, { 0x0003C7 }}, /* 1D76C; 03C7; Additional folding */ - { 0x01D76D, 0, { 0x0003C8 }}, /* 1D76D; 03C8; Additional folding */ - { 0x01D76E, 0, { 0x0003C9 }}, /* 1D76E; 03C9; Additional folding */ - { 0x01D781, 0, { 0x0003C3 }}, /* 1D781; 03C3; Additional folding */ - { 0x01D790, 0, { 0x0003B1 }}, /* 1D790; 03B1; Additional folding */ - { 0x01D791, 0, { 0x0003B2 }}, /* 1D791; 03B2; Additional folding */ - { 0x01D792, 0, { 0x0003B3 }}, /* 1D792; 03B3; Additional folding */ - { 0x01D793, 0, { 0x0003B4 }}, /* 1D793; 03B4; Additional folding */ - { 0x01D794, 0, { 0x0003B5 }}, /* 1D794; 03B5; Additional folding */ - { 0x01D795, 0, { 0x0003B6 }}, /* 1D795; 03B6; Additional folding */ - { 0x01D796, 0, { 0x0003B7 }}, /* 1D796; 03B7; Additional folding */ - { 0x01D797, 0, { 0x0003B8 }}, /* 1D797; 03B8; Additional folding */ - { 0x01D798, 0, { 0x0003B9 }}, /* 1D798; 03B9; Additional folding */ - { 0x01D799, 0, { 0x0003BA }}, /* 1D799; 03BA; Additional folding */ - { 0x01D79A, 0, { 0x0003BB }}, /* 1D79A; 03BB; Additional folding */ - { 0x01D79B, 0, { 0x0003BC }}, /* 1D79B; 03BC; Additional folding */ - { 0x01D79C, 0, { 0x0003BD }}, /* 1D79C; 03BD; Additional folding */ - { 0x01D79D, 0, { 0x0003BE }}, /* 1D79D; 03BE; Additional folding */ - { 0x01D79E, 0, { 0x0003BF }}, /* 1D79E; 03BF; Additional folding */ - { 0x01D79F, 0, { 0x0003C0 }}, /* 1D79F; 03C0; Additional folding */ - { 0x01D7A0, 0, { 0x0003C1 }}, /* 1D7A0; 03C1; Additional folding */ - { 0x01D7A1, 0, { 0x0003B8 }}, /* 1D7A1; 03B8; Additional folding */ - { 0x01D7A2, 0, { 0x0003C3 }}, /* 1D7A2; 03C3; Additional folding */ - { 0x01D7A3, 0, { 0x0003C4 }}, /* 1D7A3; 03C4; Additional folding */ - { 0x01D7A4, 0, { 0x0003C5 }}, /* 1D7A4; 03C5; Additional folding */ - { 0x01D7A5, 0, { 0x0003C6 }}, /* 1D7A5; 03C6; Additional folding */ - { 0x01D7A6, 0, { 0x0003C7 }}, /* 1D7A6; 03C7; Additional folding */ - { 0x01D7A7, 0, { 0x0003C8 }}, /* 1D7A7; 03C8; Additional folding */ - { 0x01D7A8, 0, { 0x0003C9 }}, /* 1D7A8; 03C9; Additional folding */ - { 0x01D7BB, 0, { 0x0003C3 }}, /* 1D7BB; 03C3; Additional folding */ - { 0 }, -}; - - -/* - * FF3A; FF5A; Case map - * 10400; 10428; Case map -10401; 10429; Case map -10402; 1042A; Case map -10403; 1042B; Case map -10404; 1042C; Case map -10405; 1042D; Case map -10406; 1042E; Case map -10407; 1042F; Case map -10408; 10430; Case map -10409; 10431; Case map -1040A; 10432; Case map -1040B; 10433; Case map -1040C; 10434; Case map -1040D; 10435; Case map -1040E; 10436; Case map -1040F; 10437; Case map -10410; 10438; Case map -10411; 10439; Case map -10412; 1043A; Case map -10413; 1043B; Case map -10414; 1043C; Case map -10415; 1043D; Case map -10416; 1043E; Case map -10417; 1043F; Case map -10418; 10440; Case map -10419; 10441; Case map -1041A; 10442; Case map -1041B; 10443; Case map -1041C; 10444; Case map -1041D; 10445; Case map -1041E; 10446; Case map -1041F; 10447; Case map -10420; 10448; Case map -10421; 10449; Case map -10422; 1044A; Case map -10423; 1044B; Case map -10424; 1044C; Case map -10425; 1044D; Case map -1D400; 0061; Additional folding -1D401; 0062; Additional folding -1D402; 0063; Additional folding -1D403; 0064; Additional folding -1D404; 0065; Additional folding -1D405; 0066; Additional folding -1D406; 0067; Additional folding -1D407; 0068; Additional folding -1D408; 0069; Additional folding -1D409; 006A; Additional folding -1D40A; 006B; Additional folding -1D40B; 006C; Additional folding -1D40C; 006D; Additional folding -1D40D; 006E; Additional folding -1D40E; 006F; Additional folding -1D40F; 0070; Additional folding -1D410; 0071; Additional folding -1D411; 0072; Additional folding -1D412; 0073; Additional folding -1D413; 0074; Additional folding -1D414; 0075; Additional folding -1D415; 0076; Additional folding -1D416; 0077; Additional folding -1D417; 0078; Additional folding -1D418; 0079; Additional folding -1D419; 007A; Additional folding -1D434; 0061; Additional folding -1D435; 0062; Additional folding -1D436; 0063; Additional folding -1D437; 0064; Additional folding -1D438; 0065; Additional folding -1D439; 0066; Additional folding -1D43A; 0067; Additional folding -1D43B; 0068; Additional folding -1D43C; 0069; Additional folding -1D43D; 006A; Additional folding -1D43E; 006B; Additional folding -1D43F; 006C; Additional folding -1D440; 006D; Additional folding -1D441; 006E; Additional folding -1D442; 006F; Additional folding -1D443; 0070; Additional folding -1D444; 0071; Additional folding -1D445; 0072; Additional folding -1D446; 0073; Additional folding -1D447; 0074; Additional folding -1D448; 0075; Additional folding -1D449; 0076; Additional folding -1D44A; 0077; Additional folding -1D44B; 0078; Additional folding -1D44C; 0079; Additional folding -1D44D; 007A; Additional folding -1D468; 0061; Additional folding -1D469; 0062; Additional folding -1D46A; 0063; Additional folding -1D46B; 0064; Additional folding -1D46C; 0065; Additional folding -1D46D; 0066; Additional folding -1D46E; 0067; Additional folding -1D46F; 0068; Additional folding -1D470; 0069; Additional folding -1D471; 006A; Additional folding -1D472; 006B; Additional folding -1D473; 006C; Additional folding -1D474; 006D; Additional folding -1D475; 006E; Additional folding -1D476; 006F; Additional folding -1D477; 0070; Additional folding -1D478; 0071; Additional folding -1D479; 0072; Additional folding -1D47A; 0073; Additional folding -1D47B; 0074; Additional folding -1D47C; 0075; Additional folding -1D47D; 0076; Additional folding -1D47E; 0077; Additional folding -1D47F; 0078; Additional folding -1D480; 0079; Additional folding -1D481; 007A; Additional folding -1D49C; 0061; Additional folding -1D49E; 0063; Additional folding -1D49F; 0064; Additional folding -1D4A2; 0067; Additional folding -1D4A5; 006A; Additional folding -1D4A6; 006B; Additional folding -1D4A9; 006E; Additional folding -1D4AA; 006F; Additional folding -1D4AB; 0070; Additional folding -1D4AC; 0071; Additional folding -1D4AE; 0073; Additional folding -1D4AF; 0074; Additional folding -1D4B0; 0075; Additional folding -1D4B1; 0076; Additional folding -1D4B2; 0077; Additional folding -1D4B3; 0078; Additional folding -1D4B4; 0079; Additional folding -1D4B5; 007A; Additional folding -1D4D0; 0061; Additional folding -1D4D1; 0062; Additional folding -1D4D2; 0063; Additional folding -1D4D3; 0064; Additional folding -1D4D4; 0065; Additional folding -1D4D5; 0066; Additional folding -1D4D6; 0067; Additional folding -1D4D7; 0068; Additional folding -1D4D8; 0069; Additional folding -1D4D9; 006A; Additional folding -1D4DA; 006B; Additional folding -1D4DB; 006C; Additional folding -1D4DC; 006D; Additional folding -1D4DD; 006E; Additional folding -1D4DE; 006F; Additional folding -1D4DF; 0070; Additional folding -1D4E0; 0071; Additional folding -1D4E1; 0072; Additional folding -1D4E2; 0073; Additional folding -1D4E3; 0074; Additional folding -1D4E4; 0075; Additional folding -1D4E5; 0076; Additional folding -1D4E6; 0077; Additional folding -1D4E7; 0078; Additional folding -1D4E8; 0079; Additional folding -1D4E9; 007A; Additional folding -1D504; 0061; Additional folding -1D505; 0062; Additional folding -1D507; 0064; Additional folding -1D508; 0065; Additional folding -1D509; 0066; Additional folding -1D50A; 0067; Additional folding -1D50D; 006A; Additional folding -1D50E; 006B; Additional folding -1D50F; 006C; Additional folding -1D510; 006D; Additional folding -1D511; 006E; Additional folding -1D512; 006F; Additional folding -1D513; 0070; Additional folding -1D514; 0071; Additional folding -1D516; 0073; Additional folding -1D517; 0074; Additional folding -1D518; 0075; Additional folding -1D519; 0076; Additional folding -1D51A; 0077; Additional folding -1D51B; 0078; Additional folding -1D51C; 0079; Additional folding -1D538; 0061; Additional folding -1D539; 0062; Additional folding -1D53B; 0064; Additional folding -1D53C; 0065; Additional folding -1D53D; 0066; Additional folding -1D53E; 0067; Additional folding -1D540; 0069; Additional folding -1D541; 006A; Additional folding -1D542; 006B; Additional folding -1D543; 006C; Additional folding -1D544; 006D; Additional folding -1D546; 006F; Additional folding -1D54A; 0073; Additional folding -1D54B; 0074; Additional folding -1D54C; 0075; Additional folding -1D54D; 0076; Additional folding -1D54E; 0077; Additional folding -1D54F; 0078; Additional folding -1D550; 0079; Additional folding -1D56C; 0061; Additional folding -1D56D; 0062; Additional folding -1D56E; 0063; Additional folding -1D56F; 0064; Additional folding -1D570; 0065; Additional folding -1D571; 0066; Additional folding -1D572; 0067; Additional folding -1D573; 0068; Additional folding -1D574; 0069; Additional folding -1D575; 006A; Additional folding -1D576; 006B; Additional folding -1D577; 006C; Additional folding -1D578; 006D; Additional folding -1D579; 006E; Additional folding -1D57A; 006F; Additional folding -1D57B; 0070; Additional folding -1D57C; 0071; Additional folding -1D57D; 0072; Additional folding -1D57E; 0073; Additional folding -1D57F; 0074; Additional folding -1D580; 0075; Additional folding -1D581; 0076; Additional folding -1D582; 0077; Additional folding -1D583; 0078; Additional folding -1D584; 0079; Additional folding -1D585; 007A; Additional folding -1D5A0; 0061; Additional folding -1D5A1; 0062; Additional folding -1D5A2; 0063; Additional folding -1D5A3; 0064; Additional folding -1D5A4; 0065; Additional folding -1D5A5; 0066; Additional folding -1D5A6; 0067; Additional folding -1D5A7; 0068; Additional folding -1D5A8; 0069; Additional folding -1D5A9; 006A; Additional folding -1D5AA; 006B; Additional folding -1D5AB; 006C; Additional folding -1D5AC; 006D; Additional folding -1D5AD; 006E; Additional folding -1D5AE; 006F; Additional folding -1D5AF; 0070; Additional folding -1D5B0; 0071; Additional folding -1D5B1; 0072; Additional folding -1D5B2; 0073; Additional folding -1D5B3; 0074; Additional folding -1D5B4; 0075; Additional folding -1D5B5; 0076; Additional folding -1D5B6; 0077; Additional folding -1D5B7; 0078; Additional folding -1D5B8; 0079; Additional folding -1D5B9; 007A; Additional folding -1D5D4; 0061; Additional folding -1D5D5; 0062; Additional folding -1D5D6; 0063; Additional folding -1D5D7; 0064; Additional folding -1D5D8; 0065; Additional folding -1D5D9; 0066; Additional folding -1D5DA; 0067; Additional folding -1D5DB; 0068; Additional folding -1D5DC; 0069; Additional folding -1D5DD; 006A; Additional folding -1D5DE; 006B; Additional folding -1D5DF; 006C; Additional folding -1D5E0; 006D; Additional folding -1D5E1; 006E; Additional folding -1D5E2; 006F; Additional folding -1D5E3; 0070; Additional folding -1D5E4; 0071; Additional folding -1D5E5; 0072; Additional folding -1D5E6; 0073; Additional folding -1D5E7; 0074; Additional folding -1D5E8; 0075; Additional folding -1D5E9; 0076; Additional folding -1D5EA; 0077; Additional folding -1D5EB; 0078; Additional folding -1D5EC; 0079; Additional folding -1D5ED; 007A; Additional folding -1D608; 0061; Additional folding -1D609; 0062; Additional folding -1D60A; 0063; Additional folding -1D60B; 0064; Additional folding -1D60C; 0065; Additional folding -1D60D; 0066; Additional folding -1D60E; 0067; Additional folding -1D60F; 0068; Additional folding -1D610; 0069; Additional folding -1D611; 006A; Additional folding -1D612; 006B; Additional folding -1D613; 006C; Additional folding -1D614; 006D; Additional folding -1D615; 006E; Additional folding -1D616; 006F; Additional folding -1D617; 0070; Additional folding -1D618; 0071; Additional folding -1D619; 0072; Additional folding -1D61A; 0073; Additional folding -1D61B; 0074; Additional folding -1D61C; 0075; Additional folding -1D61D; 0076; Additional folding -1D61E; 0077; Additional folding -1D61F; 0078; Additional folding -1D620; 0079; Additional folding -1D621; 007A; Additional folding -1D63C; 0061; Additional folding -1D63D; 0062; Additional folding -1D63E; 0063; Additional folding -1D63F; 0064; Additional folding -1D640; 0065; Additional folding -1D641; 0066; Additional folding -1D642; 0067; Additional folding -1D643; 0068; Additional folding -1D644; 0069; Additional folding -1D645; 006A; Additional folding -1D646; 006B; Additional folding -1D647; 006C; Additional folding -1D648; 006D; Additional folding -1D649; 006E; Additional folding -1D64A; 006F; Additional folding -1D64B; 0070; Additional folding -1D64C; 0071; Additional folding -1D64D; 0072; Additional folding -1D64E; 0073; Additional folding -1D64F; 0074; Additional folding -1D650; 0075; Additional folding -1D651; 0076; Additional folding -1D652; 0077; Additional folding -1D653; 0078; Additional folding -1D654; 0079; Additional folding -1D655; 007A; Additional folding -1D670; 0061; Additional folding -1D671; 0062; Additional folding -1D672; 0063; Additional folding -1D673; 0064; Additional folding -1D674; 0065; Additional folding -1D675; 0066; Additional folding -1D676; 0067; Additional folding -1D677; 0068; Additional folding -1D678; 0069; Additional folding -1D679; 006A; Additional folding -1D67A; 006B; Additional folding -1D67B; 006C; Additional folding -1D67C; 006D; Additional folding -1D67D; 006E; Additional folding -1D67E; 006F; Additional folding -1D67F; 0070; Additional folding -1D680; 0071; Additional folding -1D681; 0072; Additional folding -1D682; 0073; Additional folding -1D683; 0074; Additional folding -1D684; 0075; Additional folding -1D685; 0076; Additional folding -1D686; 0077; Additional folding -1D687; 0078; Additional folding -1D688; 0079; Additional folding -1D689; 007A; Additional folding -1D6A8; 03B1; Additional folding -1D6A9; 03B2; Additional folding -1D6AA; 03B3; Additional folding -1D6AB; 03B4; Additional folding -1D6AC; 03B5; Additional folding -1D6AD; 03B6; Additional folding -1D6AE; 03B7; Additional folding -1D6AF; 03B8; Additional folding -1D6B0; 03B9; Additional folding -1D6B1; 03BA; Additional folding -1D6B2; 03BB; Additional folding -1D6B3; 03BC; Additional folding -1D6B4; 03BD; Additional folding -1D6B5; 03BE; Additional folding -1D6B6; 03BF; Additional folding -1D6B7; 03C0; Additional folding -1D6B8; 03C1; Additional folding -1D6B9; 03B8; Additional folding -1D6BA; 03C3; Additional folding -1D6BB; 03C4; Additional folding -1D6BC; 03C5; Additional folding -1D6BD; 03C6; Additional folding -1D6BE; 03C7; Additional folding -1D6BF; 03C8; Additional folding -1D6C0; 03C9; Additional folding -1D6D3; 03C3; Additional folding -1D6E2; 03B1; Additional folding -1D6E3; 03B2; Additional folding -1D6E4; 03B3; Additional folding -1D6E5; 03B4; Additional folding -1D6E6; 03B5; Additional folding -1D6E7; 03B6; Additional folding -1D6E8; 03B7; Additional folding -1D6E9; 03B8; Additional folding -1D6EA; 03B9; Additional folding -1D6EB; 03BA; Additional folding -1D6EC; 03BB; Additional folding -1D6ED; 03BC; Additional folding -1D6EE; 03BD; Additional folding -1D6EF; 03BE; Additional folding -1D6F0; 03BF; Additional folding -1D6F1; 03C0; Additional folding -1D6F2; 03C1; Additional folding -1D6F3; 03B8; Additional folding -1D6F4; 03C3; Additional folding -1D6F5; 03C4; Additional folding -1D6F6; 03C5; Additional folding -1D6F7; 03C6; Additional folding -1D6F8; 03C7; Additional folding -1D6F9; 03C8; Additional folding -1D6FA; 03C9; Additional folding -1D70D; 03C3; Additional folding -1D71C; 03B1; Additional folding -1D71D; 03B2; Additional folding -1D71E; 03B3; Additional folding -1D71F; 03B4; Additional folding -1D720; 03B5; Additional folding -1D721; 03B6; Additional folding -1D722; 03B7; Additional folding -1D723; 03B8; Additional folding -1D724; 03B9; Additional folding -1D725; 03BA; Additional folding -1D726; 03BB; Additional folding -1D727; 03BC; Additional folding -1D728; 03BD; Additional folding -1D729; 03BE; Additional folding -1D72A; 03BF; Additional folding -1D72B; 03C0; Additional folding -1D72C; 03C1; Additional folding -1D72D; 03B8; Additional folding -1D72E; 03C3; Additional folding -1D72F; 03C4; Additional folding -1D730; 03C5; Additional folding -1D731; 03C6; Additional folding -1D732; 03C7; Additional folding -1D733; 03C8; Additional folding -1D734; 03C9; Additional folding -1D747; 03C3; Additional folding -1D756; 03B1; Additional folding -1D757; 03B2; Additional folding -1D758; 03B3; Additional folding -1D759; 03B4; Additional folding -1D75A; 03B5; Additional folding -1D75B; 03B6; Additional folding -1D75C; 03B7; Additional folding -1D75D; 03B8; Additional folding -1D75E; 03B9; Additional folding -1D75F; 03BA; Additional folding -1D760; 03BB; Additional folding -1D761; 03BC; Additional folding -1D762; 03BD; Additional folding -1D763; 03BE; Additional folding -1D764; 03BF; Additional folding -1D765; 03C0; Additional folding -1D766; 03C1; Additional folding -1D767; 03B8; Additional folding -1D768; 03C3; Additional folding -1D769; 03C4; Additional folding -1D76A; 03C5; Additional folding -1D76B; 03C6; Additional folding -1D76C; 03C7; Additional folding -1D76D; 03C8; Additional folding -1D76E; 03C9; Additional folding -1D781; 03C3; Additional folding -1D790; 03B1; Additional folding -1D791; 03B2; Additional folding -1D792; 03B3; Additional folding -1D793; 03B4; Additional folding -1D794; 03B5; Additional folding -1D795; 03B6; Additional folding -1D796; 03B7; Additional folding -1D797; 03B8; Additional folding -1D798; 03B9; Additional folding -1D799; 03BA; Additional folding -1D79A; 03BB; Additional folding -1D79B; 03BC; Additional folding -1D79C; 03BD; Additional folding -1D79D; 03BE; Additional folding -1D79E; 03BF; Additional folding -1D79F; 03C0; Additional folding -1D7A0; 03C1; Additional folding -1D7A1; 03B8; Additional folding -1D7A2; 03C3; Additional folding -1D7A3; 03C4; Additional folding -1D7A4; 03C5; Additional folding -1D7A5; 03C6; Additional folding -1D7A6; 03C7; Additional folding -1D7A7; 03C8; Additional folding -1D7A8; 03C9; Additional folding -1D7BB; 03C3; Additional folding - - */ - -const Stringprep_table_element stringprep_rfc3454_B_3[] = { - { 0x000041, 0, { 0x000061 }}, /* 0041; 0061; Case map */ - { 0x000042, 0, { 0x000062 }}, /* 0042; 0062; Case map */ - { 0x000043, 0, { 0x000063 }}, /* 0043; 0063; Case map */ - { 0x000044, 0, { 0x000064 }}, /* 0044; 0064; Case map */ - { 0x000045, 0, { 0x000065 }}, /* 0045; 0065; Case map */ - { 0x000046, 0, { 0x000066 }}, /* 0046; 0066; Case map */ - { 0x000047, 0, { 0x000067 }}, /* 0047; 0067; Case map */ - { 0x000048, 0, { 0x000068 }}, /* 0048; 0068; Case map */ - { 0x000049, 0, { 0x000069 }}, /* 0049; 0069; Case map */ - { 0x00004A, 0, { 0x00006A }}, /* 004A; 006A; Case map */ - { 0x00004B, 0, { 0x00006B }}, /* 004B; 006B; Case map */ - { 0x00004C, 0, { 0x00006C }}, /* 004C; 006C; Case map */ - { 0x00004D, 0, { 0x00006D }}, /* 004D; 006D; Case map */ - { 0x00004E, 0, { 0x00006E }}, /* 004E; 006E; Case map */ - { 0x00004F, 0, { 0x00006F }}, /* 004F; 006F; Case map */ - { 0x000050, 0, { 0x000070 }}, /* 0050; 0070; Case map */ - { 0x000051, 0, { 0x000071 }}, /* 0051; 0071; Case map */ - { 0x000052, 0, { 0x000072 }}, /* 0052; 0072; Case map */ - { 0x000053, 0, { 0x000073 }}, /* 0053; 0073; Case map */ - { 0x000054, 0, { 0x000074 }}, /* 0054; 0074; Case map */ - { 0x000055, 0, { 0x000075 }}, /* 0055; 0075; Case map */ - { 0x000056, 0, { 0x000076 }}, /* 0056; 0076; Case map */ - { 0x000057, 0, { 0x000077 }}, /* 0057; 0077; Case map */ - { 0x000058, 0, { 0x000078 }}, /* 0058; 0078; Case map */ - { 0x000059, 0, { 0x000079 }}, /* 0059; 0079; Case map */ - { 0x00005A, 0, { 0x00007A }}, /* 005A; 007A; Case map */ - { 0x0000B5, 0, { 0x0003BC }}, /* 00B5; 03BC; Case map */ - { 0x0000C0, 0, { 0x0000E0 }}, /* 00C0; 00E0; Case map */ - { 0x0000C1, 0, { 0x0000E1 }}, /* 00C1; 00E1; Case map */ - { 0x0000C2, 0, { 0x0000E2 }}, /* 00C2; 00E2; Case map */ - { 0x0000C3, 0, { 0x0000E3 }}, /* 00C3; 00E3; Case map */ - { 0x0000C4, 0, { 0x0000E4 }}, /* 00C4; 00E4; Case map */ - { 0x0000C5, 0, { 0x0000E5 }}, /* 00C5; 00E5; Case map */ - { 0x0000C6, 0, { 0x0000E6 }}, /* 00C6; 00E6; Case map */ - { 0x0000C7, 0, { 0x0000E7 }}, /* 00C7; 00E7; Case map */ - { 0x0000C8, 0, { 0x0000E8 }}, /* 00C8; 00E8; Case map */ - { 0x0000C9, 0, { 0x0000E9 }}, /* 00C9; 00E9; Case map */ - { 0x0000CA, 0, { 0x0000EA }}, /* 00CA; 00EA; Case map */ - { 0x0000CB, 0, { 0x0000EB }}, /* 00CB; 00EB; Case map */ - { 0x0000CC, 0, { 0x0000EC }}, /* 00CC; 00EC; Case map */ - { 0x0000CD, 0, { 0x0000ED }}, /* 00CD; 00ED; Case map */ - { 0x0000CE, 0, { 0x0000EE }}, /* 00CE; 00EE; Case map */ - { 0x0000CF, 0, { 0x0000EF }}, /* 00CF; 00EF; Case map */ - { 0x0000D0, 0, { 0x0000F0 }}, /* 00D0; 00F0; Case map */ - { 0x0000D1, 0, { 0x0000F1 }}, /* 00D1; 00F1; Case map */ - { 0x0000D2, 0, { 0x0000F2 }}, /* 00D2; 00F2; Case map */ - { 0x0000D3, 0, { 0x0000F3 }}, /* 00D3; 00F3; Case map */ - { 0x0000D4, 0, { 0x0000F4 }}, /* 00D4; 00F4; Case map */ - { 0x0000D5, 0, { 0x0000F5 }}, /* 00D5; 00F5; Case map */ - { 0x0000D6, 0, { 0x0000F6 }}, /* 00D6; 00F6; Case map */ - { 0x0000D8, 0, { 0x0000F8 }}, /* 00D8; 00F8; Case map */ - { 0x0000D9, 0, { 0x0000F9 }}, /* 00D9; 00F9; Case map */ - { 0x0000DA, 0, { 0x0000FA }}, /* 00DA; 00FA; Case map */ - { 0x0000DB, 0, { 0x0000FB }}, /* 00DB; 00FB; Case map */ - { 0x0000DC, 0, { 0x0000FC }}, /* 00DC; 00FC; Case map */ - { 0x0000DD, 0, { 0x0000FD }}, /* 00DD; 00FD; Case map */ - { 0x0000DE, 0, { 0x0000FE }}, /* 00DE; 00FE; Case map */ - { 0x0000DF, 0, { 0x000073, /* 00DF; 0073 0073; Case map */ - 0x000073 }}, - { 0x000100, 0, { 0x000101 }}, /* 0100; 0101; Case map */ - { 0x000102, 0, { 0x000103 }}, /* 0102; 0103; Case map */ - { 0x000104, 0, { 0x000105 }}, /* 0104; 0105; Case map */ - { 0x000106, 0, { 0x000107 }}, /* 0106; 0107; Case map */ - { 0x000108, 0, { 0x000109 }}, /* 0108; 0109; Case map */ - { 0x00010A, 0, { 0x00010B }}, /* 010A; 010B; Case map */ - { 0x00010C, 0, { 0x00010D }}, /* 010C; 010D; Case map */ - { 0x00010E, 0, { 0x00010F }}, /* 010E; 010F; Case map */ - { 0x000110, 0, { 0x000111 }}, /* 0110; 0111; Case map */ - { 0x000112, 0, { 0x000113 }}, /* 0112; 0113; Case map */ - { 0x000114, 0, { 0x000115 }}, /* 0114; 0115; Case map */ - { 0x000116, 0, { 0x000117 }}, /* 0116; 0117; Case map */ - { 0x000118, 0, { 0x000119 }}, /* 0118; 0119; Case map */ - { 0x00011A, 0, { 0x00011B }}, /* 011A; 011B; Case map */ - { 0x00011C, 0, { 0x00011D }}, /* 011C; 011D; Case map */ - { 0x00011E, 0, { 0x00011F }}, /* 011E; 011F; Case map */ - { 0x000120, 0, { 0x000121 }}, /* 0120; 0121; Case map */ - { 0x000122, 0, { 0x000123 }}, /* 0122; 0123; Case map */ - { 0x000124, 0, { 0x000125 }}, /* 0124; 0125; Case map */ - { 0x000126, 0, { 0x000127 }}, /* 0126; 0127; Case map */ - { 0x000128, 0, { 0x000129 }}, /* 0128; 0129; Case map */ - { 0x00012A, 0, { 0x00012B }}, /* 012A; 012B; Case map */ - { 0x00012C, 0, { 0x00012D }}, /* 012C; 012D; Case map */ - { 0x00012E, 0, { 0x00012F }}, /* 012E; 012F; Case map */ - { 0x000130, 0, { 0x000069, /* 0130; 0069 0307; Case map */ - 0x000307 }}, - { 0x000132, 0, { 0x000133 }}, /* 0132; 0133; Case map */ - { 0x000134, 0, { 0x000135 }}, /* 0134; 0135; Case map */ - { 0x000136, 0, { 0x000137 }}, /* 0136; 0137; Case map */ - { 0x000139, 0, { 0x00013A }}, /* 0139; 013A; Case map */ - { 0x00013B, 0, { 0x00013C }}, /* 013B; 013C; Case map */ - { 0x00013D, 0, { 0x00013E }}, /* 013D; 013E; Case map */ - { 0x00013F, 0, { 0x000140 }}, /* 013F; 0140; Case map */ - { 0x000141, 0, { 0x000142 }}, /* 0141; 0142; Case map */ - { 0x000143, 0, { 0x000144 }}, /* 0143; 0144; Case map */ - { 0x000145, 0, { 0x000146 }}, /* 0145; 0146; Case map */ - { 0x000147, 0, { 0x000148 }}, /* 0147; 0148; Case map */ - { 0x000149, 0, { 0x0002BC, /* 0149; 02BC 006E; Case map */ - 0x00006E }}, - { 0x00014A, 0, { 0x00014B }}, /* 014A; 014B; Case map */ - { 0x00014C, 0, { 0x00014D }}, /* 014C; 014D; Case map */ - { 0x00014E, 0, { 0x00014F }}, /* 014E; 014F; Case map */ - { 0x000150, 0, { 0x000151 }}, /* 0150; 0151; Case map */ - { 0x000152, 0, { 0x000153 }}, /* 0152; 0153; Case map */ - { 0x000154, 0, { 0x000155 }}, /* 0154; 0155; Case map */ - { 0x000156, 0, { 0x000157 }}, /* 0156; 0157; Case map */ - { 0x000158, 0, { 0x000159 }}, /* 0158; 0159; Case map */ - { 0x00015A, 0, { 0x00015B }}, /* 015A; 015B; Case map */ - { 0x00015C, 0, { 0x00015D }}, /* 015C; 015D; Case map */ - { 0x00015E, 0, { 0x00015F }}, /* 015E; 015F; Case map */ - { 0x000160, 0, { 0x000161 }}, /* 0160; 0161; Case map */ - { 0x000162, 0, { 0x000163 }}, /* 0162; 0163; Case map */ - { 0x000164, 0, { 0x000165 }}, /* 0164; 0165; Case map */ - { 0x000166, 0, { 0x000167 }}, /* 0166; 0167; Case map */ - { 0x000168, 0, { 0x000169 }}, /* 0168; 0169; Case map */ - { 0x00016A, 0, { 0x00016B }}, /* 016A; 016B; Case map */ - { 0x00016C, 0, { 0x00016D }}, /* 016C; 016D; Case map */ - { 0x00016E, 0, { 0x00016F }}, /* 016E; 016F; Case map */ - { 0x000170, 0, { 0x000171 }}, /* 0170; 0171; Case map */ - { 0x000172, 0, { 0x000173 }}, /* 0172; 0173; Case map */ - { 0x000174, 0, { 0x000175 }}, /* 0174; 0175; Case map */ - { 0x000176, 0, { 0x000177 }}, /* 0176; 0177; Case map */ - { 0x000178, 0, { 0x0000FF }}, /* 0178; 00FF; Case map */ - { 0x000179, 0, { 0x00017A }}, /* 0179; 017A; Case map */ - { 0x00017B, 0, { 0x00017C }}, /* 017B; 017C; Case map */ - { 0x00017D, 0, { 0x00017E }}, /* 017D; 017E; Case map */ - { 0x00017F, 0, { 0x000073 }}, /* 017F; 0073; Case map */ - { 0x000181, 0, { 0x000253 }}, /* 0181; 0253; Case map */ - { 0x000182, 0, { 0x000183 }}, /* 0182; 0183; Case map */ - { 0x000184, 0, { 0x000185 }}, /* 0184; 0185; Case map */ - { 0x000186, 0, { 0x000254 }}, /* 0186; 0254; Case map */ - { 0x000187, 0, { 0x000188 }}, /* 0187; 0188; Case map */ - { 0x000189, 0, { 0x000256 }}, /* 0189; 0256; Case map */ - { 0x00018A, 0, { 0x000257 }}, /* 018A; 0257; Case map */ - { 0x00018B, 0, { 0x00018C }}, /* 018B; 018C; Case map */ - { 0x00018E, 0, { 0x0001DD }}, /* 018E; 01DD; Case map */ - { 0x00018F, 0, { 0x000259 }}, /* 018F; 0259; Case map */ - { 0x000190, 0, { 0x00025B }}, /* 0190; 025B; Case map */ - { 0x000191, 0, { 0x000192 }}, /* 0191; 0192; Case map */ - { 0x000193, 0, { 0x000260 }}, /* 0193; 0260; Case map */ - { 0x000194, 0, { 0x000263 }}, /* 0194; 0263; Case map */ - { 0x000196, 0, { 0x000269 }}, /* 0196; 0269; Case map */ - { 0x000197, 0, { 0x000268 }}, /* 0197; 0268; Case map */ - { 0x000198, 0, { 0x000199 }}, /* 0198; 0199; Case map */ - { 0x00019C, 0, { 0x00026F }}, /* 019C; 026F; Case map */ - { 0x00019D, 0, { 0x000272 }}, /* 019D; 0272; Case map */ - { 0x00019F, 0, { 0x000275 }}, /* 019F; 0275; Case map */ - { 0x0001A0, 0, { 0x0001A1 }}, /* 01A0; 01A1; Case map */ - { 0x0001A2, 0, { 0x0001A3 }}, /* 01A2; 01A3; Case map */ - { 0x0001A4, 0, { 0x0001A5 }}, /* 01A4; 01A5; Case map */ - { 0x0001A6, 0, { 0x000280 }}, /* 01A6; 0280; Case map */ - { 0x0001A7, 0, { 0x0001A8 }}, /* 01A7; 01A8; Case map */ - { 0x0001A9, 0, { 0x000283 }}, /* 01A9; 0283; Case map */ - { 0x0001AC, 0, { 0x0001AD }}, /* 01AC; 01AD; Case map */ - { 0x0001AE, 0, { 0x000288 }}, /* 01AE; 0288; Case map */ - { 0x0001AF, 0, { 0x0001B0 }}, /* 01AF; 01B0; Case map */ - { 0x0001B1, 0, { 0x00028A }}, /* 01B1; 028A; Case map */ - { 0x0001B2, 0, { 0x00028B }}, /* 01B2; 028B; Case map */ - { 0x0001B3, 0, { 0x0001B4 }}, /* 01B3; 01B4; Case map */ - { 0x0001B5, 0, { 0x0001B6 }}, /* 01B5; 01B6; Case map */ - { 0x0001B7, 0, { 0x000292 }}, /* 01B7; 0292; Case map */ - { 0x0001B8, 0, { 0x0001B9 }}, /* 01B8; 01B9; Case map */ - { 0x0001BC, 0, { 0x0001BD }}, /* 01BC; 01BD; Case map */ - { 0x0001C4, 0, { 0x0001C6 }}, /* 01C4; 01C6; Case map */ - { 0x0001C5, 0, { 0x0001C6 }}, /* 01C5; 01C6; Case map */ - { 0x0001C7, 0, { 0x0001C9 }}, /* 01C7; 01C9; Case map */ - { 0x0001C8, 0, { 0x0001C9 }}, /* 01C8; 01C9; Case map */ - { 0x0001CA, 0, { 0x0001CC }}, /* 01CA; 01CC; Case map */ - { 0x0001CB, 0, { 0x0001CC }}, /* 01CB; 01CC; Case map */ - { 0x0001CD, 0, { 0x0001CE }}, /* 01CD; 01CE; Case map */ - { 0x0001CF, 0, { 0x0001D0 }}, /* 01CF; 01D0; Case map */ - { 0x0001D1, 0, { 0x0001D2 }}, /* 01D1; 01D2; Case map */ - { 0x0001D3, 0, { 0x0001D4 }}, /* 01D3; 01D4; Case map */ - { 0x0001D5, 0, { 0x0001D6 }}, /* 01D5; 01D6; Case map */ - { 0x0001D7, 0, { 0x0001D8 }}, /* 01D7; 01D8; Case map */ - { 0x0001D9, 0, { 0x0001DA }}, /* 01D9; 01DA; Case map */ - { 0x0001DB, 0, { 0x0001DC }}, /* 01DB; 01DC; Case map */ - { 0x0001DE, 0, { 0x0001DF }}, /* 01DE; 01DF; Case map */ - { 0x0001E0, 0, { 0x0001E1 }}, /* 01E0; 01E1; Case map */ - { 0x0001E2, 0, { 0x0001E3 }}, /* 01E2; 01E3; Case map */ - { 0x0001E4, 0, { 0x0001E5 }}, /* 01E4; 01E5; Case map */ - { 0x0001E6, 0, { 0x0001E7 }}, /* 01E6; 01E7; Case map */ - { 0x0001E8, 0, { 0x0001E9 }}, /* 01E8; 01E9; Case map */ - { 0x0001EA, 0, { 0x0001EB }}, /* 01EA; 01EB; Case map */ - { 0x0001EC, 0, { 0x0001ED }}, /* 01EC; 01ED; Case map */ - { 0x0001EE, 0, { 0x0001EF }}, /* 01EE; 01EF; Case map */ - { 0x0001F0, 0, { 0x00006A, /* 01F0; 006A 030C; Case map */ - 0x00030C }}, - { 0x0001F1, 0, { 0x0001F3 }}, /* 01F1; 01F3; Case map */ - { 0x0001F2, 0, { 0x0001F3 }}, /* 01F2; 01F3; Case map */ - { 0x0001F4, 0, { 0x0001F5 }}, /* 01F4; 01F5; Case map */ - { 0x0001F6, 0, { 0x000195 }}, /* 01F6; 0195; Case map */ - { 0x0001F7, 0, { 0x0001BF }}, /* 01F7; 01BF; Case map */ - { 0x0001F8, 0, { 0x0001F9 }}, /* 01F8; 01F9; Case map */ - { 0x0001FA, 0, { 0x0001FB }}, /* 01FA; 01FB; Case map */ - { 0x0001FC, 0, { 0x0001FD }}, /* 01FC; 01FD; Case map */ - { 0x0001FE, 0, { 0x0001FF }}, /* 01FE; 01FF; Case map */ - { 0x000200, 0, { 0x000201 }}, /* 0200; 0201; Case map */ - { 0x000202, 0, { 0x000203 }}, /* 0202; 0203; Case map */ - { 0x000204, 0, { 0x000205 }}, /* 0204; 0205; Case map */ - { 0x000206, 0, { 0x000207 }}, /* 0206; 0207; Case map */ - { 0x000208, 0, { 0x000209 }}, /* 0208; 0209; Case map */ - { 0x00020A, 0, { 0x00020B }}, /* 020A; 020B; Case map */ - { 0x00020C, 0, { 0x00020D }}, /* 020C; 020D; Case map */ - { 0x00020E, 0, { 0x00020F }}, /* 020E; 020F; Case map */ - { 0x000210, 0, { 0x000211 }}, /* 0210; 0211; Case map */ - { 0x000212, 0, { 0x000213 }}, /* 0212; 0213; Case map */ - { 0x000214, 0, { 0x000215 }}, /* 0214; 0215; Case map */ - { 0x000216, 0, { 0x000217 }}, /* 0216; 0217; Case map */ - { 0x000218, 0, { 0x000219 }}, /* 0218; 0219; Case map */ - { 0x00021A, 0, { 0x00021B }}, /* 021A; 021B; Case map */ - { 0x00021C, 0, { 0x00021D }}, /* 021C; 021D; Case map */ - { 0x00021E, 0, { 0x00021F }}, /* 021E; 021F; Case map */ - { 0x000220, 0, { 0x00019E }}, /* 0220; 019E; Case map */ - { 0x000222, 0, { 0x000223 }}, /* 0222; 0223; Case map */ - { 0x000224, 0, { 0x000225 }}, /* 0224; 0225; Case map */ - { 0x000226, 0, { 0x000227 }}, /* 0226; 0227; Case map */ - { 0x000228, 0, { 0x000229 }}, /* 0228; 0229; Case map */ - { 0x00022A, 0, { 0x00022B }}, /* 022A; 022B; Case map */ - { 0x00022C, 0, { 0x00022D }}, /* 022C; 022D; Case map */ - { 0x00022E, 0, { 0x00022F }}, /* 022E; 022F; Case map */ - { 0x000230, 0, { 0x000231 }}, /* 0230; 0231; Case map */ - { 0x000232, 0, { 0x000233 }}, /* 0232; 0233; Case map */ - { 0x000345, 0, { 0x0003B9 }}, /* 0345; 03B9; Case map */ - { 0x000386, 0, { 0x0003AC }}, /* 0386; 03AC; Case map */ - { 0x000388, 0, { 0x0003AD }}, /* 0388; 03AD; Case map */ - { 0x000389, 0, { 0x0003AE }}, /* 0389; 03AE; Case map */ - { 0x00038A, 0, { 0x0003AF }}, /* 038A; 03AF; Case map */ - { 0x00038C, 0, { 0x0003CC }}, /* 038C; 03CC; Case map */ - { 0x00038E, 0, { 0x0003CD }}, /* 038E; 03CD; Case map */ - { 0x00038F, 0, { 0x0003CE }}, /* 038F; 03CE; Case map */ - { 0x000390, 0, { 0x0003B9, /* 0390; 03B9 0308 0301; Case map */ - 0x000308, 0x000301 }}, - { 0x000391, 0, { 0x0003B1 }}, /* 0391; 03B1; Case map */ - { 0x000392, 0, { 0x0003B2 }}, /* 0392; 03B2; Case map */ - { 0x000393, 0, { 0x0003B3 }}, /* 0393; 03B3; Case map */ - { 0x000394, 0, { 0x0003B4 }}, /* 0394; 03B4; Case map */ - { 0x000395, 0, { 0x0003B5 }}, /* 0395; 03B5; Case map */ - { 0x000396, 0, { 0x0003B6 }}, /* 0396; 03B6; Case map */ - { 0x000397, 0, { 0x0003B7 }}, /* 0397; 03B7; Case map */ - { 0x000398, 0, { 0x0003B8 }}, /* 0398; 03B8; Case map */ - { 0x000399, 0, { 0x0003B9 }}, /* 0399; 03B9; Case map */ - { 0x00039A, 0, { 0x0003BA }}, /* 039A; 03BA; Case map */ - { 0x00039B, 0, { 0x0003BB }}, /* 039B; 03BB; Case map */ - { 0x00039C, 0, { 0x0003BC }}, /* 039C; 03BC; Case map */ - { 0x00039D, 0, { 0x0003BD }}, /* 039D; 03BD; Case map */ - { 0x00039E, 0, { 0x0003BE }}, /* 039E; 03BE; Case map */ - { 0x00039F, 0, { 0x0003BF }}, /* 039F; 03BF; Case map */ - { 0x0003A0, 0, { 0x0003C0 }}, /* 03A0; 03C0; Case map */ - { 0x0003A1, 0, { 0x0003C1 }}, /* 03A1; 03C1; Case map */ - { 0x0003A3, 0, { 0x0003C3 }}, /* 03A3; 03C3; Case map */ - { 0x0003A4, 0, { 0x0003C4 }}, /* 03A4; 03C4; Case map */ - { 0x0003A5, 0, { 0x0003C5 }}, /* 03A5; 03C5; Case map */ - { 0x0003A6, 0, { 0x0003C6 }}, /* 03A6; 03C6; Case map */ - { 0x0003A7, 0, { 0x0003C7 }}, /* 03A7; 03C7; Case map */ - { 0x0003A8, 0, { 0x0003C8 }}, /* 03A8; 03C8; Case map */ - { 0x0003A9, 0, { 0x0003C9 }}, /* 03A9; 03C9; Case map */ - { 0x0003AA, 0, { 0x0003CA }}, /* 03AA; 03CA; Case map */ - { 0x0003AB, 0, { 0x0003CB }}, /* 03AB; 03CB; Case map */ - { 0x0003B0, 0, { 0x0003C5, /* 03B0; 03C5 0308 0301; Case map */ - 0x000308, 0x000301 }}, - { 0x0003C2, 0, { 0x0003C3 }}, /* 03C2; 03C3; Case map */ - { 0x0003D0, 0, { 0x0003B2 }}, /* 03D0; 03B2; Case map */ - { 0x0003D1, 0, { 0x0003B8 }}, /* 03D1; 03B8; Case map */ - { 0x0003D5, 0, { 0x0003C6 }}, /* 03D5; 03C6; Case map */ - { 0x0003D6, 0, { 0x0003C0 }}, /* 03D6; 03C0; Case map */ - { 0x0003D8, 0, { 0x0003D9 }}, /* 03D8; 03D9; Case map */ - { 0x0003DA, 0, { 0x0003DB }}, /* 03DA; 03DB; Case map */ - { 0x0003DC, 0, { 0x0003DD }}, /* 03DC; 03DD; Case map */ - { 0x0003DE, 0, { 0x0003DF }}, /* 03DE; 03DF; Case map */ - { 0x0003E0, 0, { 0x0003E1 }}, /* 03E0; 03E1; Case map */ - { 0x0003E2, 0, { 0x0003E3 }}, /* 03E2; 03E3; Case map */ - { 0x0003E4, 0, { 0x0003E5 }}, /* 03E4; 03E5; Case map */ - { 0x0003E6, 0, { 0x0003E7 }}, /* 03E6; 03E7; Case map */ - { 0x0003E8, 0, { 0x0003E9 }}, /* 03E8; 03E9; Case map */ - { 0x0003EA, 0, { 0x0003EB }}, /* 03EA; 03EB; Case map */ - { 0x0003EC, 0, { 0x0003ED }}, /* 03EC; 03ED; Case map */ - { 0x0003EE, 0, { 0x0003EF }}, /* 03EE; 03EF; Case map */ - { 0x0003F0, 0, { 0x0003BA }}, /* 03F0; 03BA; Case map */ - { 0x0003F1, 0, { 0x0003C1 }}, /* 03F1; 03C1; Case map */ - { 0x0003F2, 0, { 0x0003C3 }}, /* 03F2; 03C3; Case map */ - { 0x0003F4, 0, { 0x0003B8 }}, /* 03F4; 03B8; Case map */ - { 0x0003F5, 0, { 0x0003B5 }}, /* 03F5; 03B5; Case map */ - { 0x000400, 0, { 0x000450 }}, /* 0400; 0450; Case map */ - { 0x000401, 0, { 0x000451 }}, /* 0401; 0451; Case map */ - { 0x000402, 0, { 0x000452 }}, /* 0402; 0452; Case map */ - { 0x000403, 0, { 0x000453 }}, /* 0403; 0453; Case map */ - { 0x000404, 0, { 0x000454 }}, /* 0404; 0454; Case map */ - { 0x000405, 0, { 0x000455 }}, /* 0405; 0455; Case map */ - { 0x000406, 0, { 0x000456 }}, /* 0406; 0456; Case map */ - { 0x000407, 0, { 0x000457 }}, /* 0407; 0457; Case map */ - { 0x000408, 0, { 0x000458 }}, /* 0408; 0458; Case map */ - { 0x000409, 0, { 0x000459 }}, /* 0409; 0459; Case map */ - { 0x00040A, 0, { 0x00045A }}, /* 040A; 045A; Case map */ - { 0x00040B, 0, { 0x00045B }}, /* 040B; 045B; Case map */ - { 0x00040C, 0, { 0x00045C }}, /* 040C; 045C; Case map */ - { 0x00040D, 0, { 0x00045D }}, /* 040D; 045D; Case map */ - { 0x00040E, 0, { 0x00045E }}, /* 040E; 045E; Case map */ - { 0x00040F, 0, { 0x00045F }}, /* 040F; 045F; Case map */ - { 0x000410, 0, { 0x000430 }}, /* 0410; 0430; Case map */ - { 0x000411, 0, { 0x000431 }}, /* 0411; 0431; Case map */ - { 0x000412, 0, { 0x000432 }}, /* 0412; 0432; Case map */ - { 0x000413, 0, { 0x000433 }}, /* 0413; 0433; Case map */ - { 0x000414, 0, { 0x000434 }}, /* 0414; 0434; Case map */ - { 0x000415, 0, { 0x000435 }}, /* 0415; 0435; Case map */ - { 0x000416, 0, { 0x000436 }}, /* 0416; 0436; Case map */ - { 0x000417, 0, { 0x000437 }}, /* 0417; 0437; Case map */ - { 0x000418, 0, { 0x000438 }}, /* 0418; 0438; Case map */ - { 0x000419, 0, { 0x000439 }}, /* 0419; 0439; Case map */ - { 0x00041A, 0, { 0x00043A }}, /* 041A; 043A; Case map */ - { 0x00041B, 0, { 0x00043B }}, /* 041B; 043B; Case map */ - { 0x00041C, 0, { 0x00043C }}, /* 041C; 043C; Case map */ - { 0x00041D, 0, { 0x00043D }}, /* 041D; 043D; Case map */ - { 0x00041E, 0, { 0x00043E }}, /* 041E; 043E; Case map */ - { 0x00041F, 0, { 0x00043F }}, /* 041F; 043F; Case map */ - { 0x000420, 0, { 0x000440 }}, /* 0420; 0440; Case map */ - { 0x000421, 0, { 0x000441 }}, /* 0421; 0441; Case map */ - { 0x000422, 0, { 0x000442 }}, /* 0422; 0442; Case map */ - { 0x000423, 0, { 0x000443 }}, /* 0423; 0443; Case map */ - { 0x000424, 0, { 0x000444 }}, /* 0424; 0444; Case map */ - { 0x000425, 0, { 0x000445 }}, /* 0425; 0445; Case map */ - { 0x000426, 0, { 0x000446 }}, /* 0426; 0446; Case map */ - { 0x000427, 0, { 0x000447 }}, /* 0427; 0447; Case map */ - { 0x000428, 0, { 0x000448 }}, /* 0428; 0448; Case map */ - { 0x000429, 0, { 0x000449 }}, /* 0429; 0449; Case map */ - { 0x00042A, 0, { 0x00044A }}, /* 042A; 044A; Case map */ - { 0x00042B, 0, { 0x00044B }}, /* 042B; 044B; Case map */ - { 0x00042C, 0, { 0x00044C }}, /* 042C; 044C; Case map */ - { 0x00042D, 0, { 0x00044D }}, /* 042D; 044D; Case map */ - { 0x00042E, 0, { 0x00044E }}, /* 042E; 044E; Case map */ - { 0x00042F, 0, { 0x00044F }}, /* 042F; 044F; Case map */ - { 0x000460, 0, { 0x000461 }}, /* 0460; 0461; Case map */ - { 0x000462, 0, { 0x000463 }}, /* 0462; 0463; Case map */ - { 0x000464, 0, { 0x000465 }}, /* 0464; 0465; Case map */ - { 0x000466, 0, { 0x000467 }}, /* 0466; 0467; Case map */ - { 0x000468, 0, { 0x000469 }}, /* 0468; 0469; Case map */ - { 0x00046A, 0, { 0x00046B }}, /* 046A; 046B; Case map */ - { 0x00046C, 0, { 0x00046D }}, /* 046C; 046D; Case map */ - { 0x00046E, 0, { 0x00046F }}, /* 046E; 046F; Case map */ - { 0x000470, 0, { 0x000471 }}, /* 0470; 0471; Case map */ - { 0x000472, 0, { 0x000473 }}, /* 0472; 0473; Case map */ - { 0x000474, 0, { 0x000475 }}, /* 0474; 0475; Case map */ - { 0x000476, 0, { 0x000477 }}, /* 0476; 0477; Case map */ - { 0x000478, 0, { 0x000479 }}, /* 0478; 0479; Case map */ - { 0x00047A, 0, { 0x00047B }}, /* 047A; 047B; Case map */ - { 0x00047C, 0, { 0x00047D }}, /* 047C; 047D; Case map */ - { 0x00047E, 0, { 0x00047F }}, /* 047E; 047F; Case map */ - { 0x000480, 0, { 0x000481 }}, /* 0480; 0481; Case map */ - { 0x00048A, 0, { 0x00048B }}, /* 048A; 048B; Case map */ - { 0x00048C, 0, { 0x00048D }}, /* 048C; 048D; Case map */ - { 0x00048E, 0, { 0x00048F }}, /* 048E; 048F; Case map */ - { 0x000490, 0, { 0x000491 }}, /* 0490; 0491; Case map */ - { 0x000492, 0, { 0x000493 }}, /* 0492; 0493; Case map */ - { 0x000494, 0, { 0x000495 }}, /* 0494; 0495; Case map */ - { 0x000496, 0, { 0x000497 }}, /* 0496; 0497; Case map */ - { 0x000498, 0, { 0x000499 }}, /* 0498; 0499; Case map */ - { 0x00049A, 0, { 0x00049B }}, /* 049A; 049B; Case map */ - { 0x00049C, 0, { 0x00049D }}, /* 049C; 049D; Case map */ - { 0x00049E, 0, { 0x00049F }}, /* 049E; 049F; Case map */ - { 0x0004A0, 0, { 0x0004A1 }}, /* 04A0; 04A1; Case map */ - { 0x0004A2, 0, { 0x0004A3 }}, /* 04A2; 04A3; Case map */ - { 0x0004A4, 0, { 0x0004A5 }}, /* 04A4; 04A5; Case map */ - { 0x0004A6, 0, { 0x0004A7 }}, /* 04A6; 04A7; Case map */ - { 0x0004A8, 0, { 0x0004A9 }}, /* 04A8; 04A9; Case map */ - { 0x0004AA, 0, { 0x0004AB }}, /* 04AA; 04AB; Case map */ - { 0x0004AC, 0, { 0x0004AD }}, /* 04AC; 04AD; Case map */ - { 0x0004AE, 0, { 0x0004AF }}, /* 04AE; 04AF; Case map */ - { 0x0004B0, 0, { 0x0004B1 }}, /* 04B0; 04B1; Case map */ - { 0x0004B2, 0, { 0x0004B3 }}, /* 04B2; 04B3; Case map */ - { 0x0004B4, 0, { 0x0004B5 }}, /* 04B4; 04B5; Case map */ - { 0x0004B6, 0, { 0x0004B7 }}, /* 04B6; 04B7; Case map */ - { 0x0004B8, 0, { 0x0004B9 }}, /* 04B8; 04B9; Case map */ - { 0x0004BA, 0, { 0x0004BB }}, /* 04BA; 04BB; Case map */ - { 0x0004BC, 0, { 0x0004BD }}, /* 04BC; 04BD; Case map */ - { 0x0004BE, 0, { 0x0004BF }}, /* 04BE; 04BF; Case map */ - { 0x0004C1, 0, { 0x0004C2 }}, /* 04C1; 04C2; Case map */ - { 0x0004C3, 0, { 0x0004C4 }}, /* 04C3; 04C4; Case map */ - { 0x0004C5, 0, { 0x0004C6 }}, /* 04C5; 04C6; Case map */ - { 0x0004C7, 0, { 0x0004C8 }}, /* 04C7; 04C8; Case map */ - { 0x0004C9, 0, { 0x0004CA }}, /* 04C9; 04CA; Case map */ - { 0x0004CB, 0, { 0x0004CC }}, /* 04CB; 04CC; Case map */ - { 0x0004CD, 0, { 0x0004CE }}, /* 04CD; 04CE; Case map */ - { 0x0004D0, 0, { 0x0004D1 }}, /* 04D0; 04D1; Case map */ - { 0x0004D2, 0, { 0x0004D3 }}, /* 04D2; 04D3; Case map */ - { 0x0004D4, 0, { 0x0004D5 }}, /* 04D4; 04D5; Case map */ - { 0x0004D6, 0, { 0x0004D7 }}, /* 04D6; 04D7; Case map */ - { 0x0004D8, 0, { 0x0004D9 }}, /* 04D8; 04D9; Case map */ - { 0x0004DA, 0, { 0x0004DB }}, /* 04DA; 04DB; Case map */ - { 0x0004DC, 0, { 0x0004DD }}, /* 04DC; 04DD; Case map */ - { 0x0004DE, 0, { 0x0004DF }}, /* 04DE; 04DF; Case map */ - { 0x0004E0, 0, { 0x0004E1 }}, /* 04E0; 04E1; Case map */ - { 0x0004E2, 0, { 0x0004E3 }}, /* 04E2; 04E3; Case map */ - { 0x0004E4, 0, { 0x0004E5 }}, /* 04E4; 04E5; Case map */ - { 0x0004E6, 0, { 0x0004E7 }}, /* 04E6; 04E7; Case map */ - { 0x0004E8, 0, { 0x0004E9 }}, /* 04E8; 04E9; Case map */ - { 0x0004EA, 0, { 0x0004EB }}, /* 04EA; 04EB; Case map */ - { 0x0004EC, 0, { 0x0004ED }}, /* 04EC; 04ED; Case map */ - { 0x0004EE, 0, { 0x0004EF }}, /* 04EE; 04EF; Case map */ - { 0x0004F0, 0, { 0x0004F1 }}, /* 04F0; 04F1; Case map */ - { 0x0004F2, 0, { 0x0004F3 }}, /* 04F2; 04F3; Case map */ - { 0x0004F4, 0, { 0x0004F5 }}, /* 04F4; 04F5; Case map */ - { 0x0004F8, 0, { 0x0004F9 }}, /* 04F8; 04F9; Case map */ - { 0x000500, 0, { 0x000501 }}, /* 0500; 0501; Case map */ - { 0x000502, 0, { 0x000503 }}, /* 0502; 0503; Case map */ - { 0x000504, 0, { 0x000505 }}, /* 0504; 0505; Case map */ - { 0x000506, 0, { 0x000507 }}, /* 0506; 0507; Case map */ - { 0x000508, 0, { 0x000509 }}, /* 0508; 0509; Case map */ - { 0x00050A, 0, { 0x00050B }}, /* 050A; 050B; Case map */ - { 0x00050C, 0, { 0x00050D }}, /* 050C; 050D; Case map */ - { 0x00050E, 0, { 0x00050F }}, /* 050E; 050F; Case map */ - { 0x000531, 0, { 0x000561 }}, /* 0531; 0561; Case map */ - { 0x000532, 0, { 0x000562 }}, /* 0532; 0562; Case map */ - { 0x000533, 0, { 0x000563 }}, /* 0533; 0563; Case map */ - { 0x000534, 0, { 0x000564 }}, /* 0534; 0564; Case map */ - { 0x000535, 0, { 0x000565 }}, /* 0535; 0565; Case map */ - { 0x000536, 0, { 0x000566 }}, /* 0536; 0566; Case map */ - { 0x000537, 0, { 0x000567 }}, /* 0537; 0567; Case map */ - { 0x000538, 0, { 0x000568 }}, /* 0538; 0568; Case map */ - { 0x000539, 0, { 0x000569 }}, /* 0539; 0569; Case map */ - { 0x00053A, 0, { 0x00056A }}, /* 053A; 056A; Case map */ - { 0x00053B, 0, { 0x00056B }}, /* 053B; 056B; Case map */ - { 0x00053C, 0, { 0x00056C }}, /* 053C; 056C; Case map */ - { 0x00053D, 0, { 0x00056D }}, /* 053D; 056D; Case map */ - { 0x00053E, 0, { 0x00056E }}, /* 053E; 056E; Case map */ - { 0x00053F, 0, { 0x00056F }}, /* 053F; 056F; Case map */ - { 0x000540, 0, { 0x000570 }}, /* 0540; 0570; Case map */ - { 0x000541, 0, { 0x000571 }}, /* 0541; 0571; Case map */ - { 0x000542, 0, { 0x000572 }}, /* 0542; 0572; Case map */ - { 0x000543, 0, { 0x000573 }}, /* 0543; 0573; Case map */ - { 0x000544, 0, { 0x000574 }}, /* 0544; 0574; Case map */ - { 0x000545, 0, { 0x000575 }}, /* 0545; 0575; Case map */ - { 0x000546, 0, { 0x000576 }}, /* 0546; 0576; Case map */ - { 0x000547, 0, { 0x000577 }}, /* 0547; 0577; Case map */ - { 0x000548, 0, { 0x000578 }}, /* 0548; 0578; Case map */ - { 0x000549, 0, { 0x000579 }}, /* 0549; 0579; Case map */ - { 0x00054A, 0, { 0x00057A }}, /* 054A; 057A; Case map */ - { 0x00054B, 0, { 0x00057B }}, /* 054B; 057B; Case map */ - { 0x00054C, 0, { 0x00057C }}, /* 054C; 057C; Case map */ - { 0x00054D, 0, { 0x00057D }}, /* 054D; 057D; Case map */ - { 0x00054E, 0, { 0x00057E }}, /* 054E; 057E; Case map */ - { 0x00054F, 0, { 0x00057F }}, /* 054F; 057F; Case map */ - { 0x000550, 0, { 0x000580 }}, /* 0550; 0580; Case map */ - { 0x000551, 0, { 0x000581 }}, /* 0551; 0581; Case map */ - { 0x000552, 0, { 0x000582 }}, /* 0552; 0582; Case map */ - { 0x000553, 0, { 0x000583 }}, /* 0553; 0583; Case map */ - { 0x000554, 0, { 0x000584 }}, /* 0554; 0584; Case map */ - { 0x000555, 0, { 0x000585 }}, /* 0555; 0585; Case map */ - { 0x000556, 0, { 0x000586 }}, /* 0556; 0586; Case map */ - { 0x000587, 0, { 0x000565, /* 0587; 0565 0582; Case map */ - 0x000582 }}, - { 0x001E00, 0, { 0x001E01 }}, /* 1E00; 1E01; Case map */ - { 0x001E02, 0, { 0x001E03 }}, /* 1E02; 1E03; Case map */ - { 0x001E04, 0, { 0x001E05 }}, /* 1E04; 1E05; Case map */ - { 0x001E06, 0, { 0x001E07 }}, /* 1E06; 1E07; Case map */ - { 0x001E08, 0, { 0x001E09 }}, /* 1E08; 1E09; Case map */ - { 0x001E0A, 0, { 0x001E0B }}, /* 1E0A; 1E0B; Case map */ - { 0x001E0C, 0, { 0x001E0D }}, /* 1E0C; 1E0D; Case map */ - { 0x001E0E, 0, { 0x001E0F }}, /* 1E0E; 1E0F; Case map */ - { 0x001E10, 0, { 0x001E11 }}, /* 1E10; 1E11; Case map */ - { 0x001E12, 0, { 0x001E13 }}, /* 1E12; 1E13; Case map */ - { 0x001E14, 0, { 0x001E15 }}, /* 1E14; 1E15; Case map */ - { 0x001E16, 0, { 0x001E17 }}, /* 1E16; 1E17; Case map */ - { 0x001E18, 0, { 0x001E19 }}, /* 1E18; 1E19; Case map */ - { 0x001E1A, 0, { 0x001E1B }}, /* 1E1A; 1E1B; Case map */ - { 0x001E1C, 0, { 0x001E1D }}, /* 1E1C; 1E1D; Case map */ - { 0x001E1E, 0, { 0x001E1F }}, /* 1E1E; 1E1F; Case map */ - { 0x001E20, 0, { 0x001E21 }}, /* 1E20; 1E21; Case map */ - { 0x001E22, 0, { 0x001E23 }}, /* 1E22; 1E23; Case map */ - { 0x001E24, 0, { 0x001E25 }}, /* 1E24; 1E25; Case map */ - { 0x001E26, 0, { 0x001E27 }}, /* 1E26; 1E27; Case map */ - { 0x001E28, 0, { 0x001E29 }}, /* 1E28; 1E29; Case map */ - { 0x001E2A, 0, { 0x001E2B }}, /* 1E2A; 1E2B; Case map */ - { 0x001E2C, 0, { 0x001E2D }}, /* 1E2C; 1E2D; Case map */ - { 0x001E2E, 0, { 0x001E2F }}, /* 1E2E; 1E2F; Case map */ - { 0x001E30, 0, { 0x001E31 }}, /* 1E30; 1E31; Case map */ - { 0x001E32, 0, { 0x001E33 }}, /* 1E32; 1E33; Case map */ - { 0x001E34, 0, { 0x001E35 }}, /* 1E34; 1E35; Case map */ - { 0x001E36, 0, { 0x001E37 }}, /* 1E36; 1E37; Case map */ - { 0x001E38, 0, { 0x001E39 }}, /* 1E38; 1E39; Case map */ - { 0x001E3A, 0, { 0x001E3B }}, /* 1E3A; 1E3B; Case map */ - { 0x001E3C, 0, { 0x001E3D }}, /* 1E3C; 1E3D; Case map */ - { 0x001E3E, 0, { 0x001E3F }}, /* 1E3E; 1E3F; Case map */ - { 0x001E40, 0, { 0x001E41 }}, /* 1E40; 1E41; Case map */ - { 0x001E42, 0, { 0x001E43 }}, /* 1E42; 1E43; Case map */ - { 0x001E44, 0, { 0x001E45 }}, /* 1E44; 1E45; Case map */ - { 0x001E46, 0, { 0x001E47 }}, /* 1E46; 1E47; Case map */ - { 0x001E48, 0, { 0x001E49 }}, /* 1E48; 1E49; Case map */ - { 0x001E4A, 0, { 0x001E4B }}, /* 1E4A; 1E4B; Case map */ - { 0x001E4C, 0, { 0x001E4D }}, /* 1E4C; 1E4D; Case map */ - { 0x001E4E, 0, { 0x001E4F }}, /* 1E4E; 1E4F; Case map */ - { 0x001E50, 0, { 0x001E51 }}, /* 1E50; 1E51; Case map */ - { 0x001E52, 0, { 0x001E53 }}, /* 1E52; 1E53; Case map */ - { 0x001E54, 0, { 0x001E55 }}, /* 1E54; 1E55; Case map */ - { 0x001E56, 0, { 0x001E57 }}, /* 1E56; 1E57; Case map */ - { 0x001E58, 0, { 0x001E59 }}, /* 1E58; 1E59; Case map */ - { 0x001E5A, 0, { 0x001E5B }}, /* 1E5A; 1E5B; Case map */ - { 0x001E5C, 0, { 0x001E5D }}, /* 1E5C; 1E5D; Case map */ - { 0x001E5E, 0, { 0x001E5F }}, /* 1E5E; 1E5F; Case map */ - { 0x001E60, 0, { 0x001E61 }}, /* 1E60; 1E61; Case map */ - { 0x001E62, 0, { 0x001E63 }}, /* 1E62; 1E63; Case map */ - { 0x001E64, 0, { 0x001E65 }}, /* 1E64; 1E65; Case map */ - { 0x001E66, 0, { 0x001E67 }}, /* 1E66; 1E67; Case map */ - { 0x001E68, 0, { 0x001E69 }}, /* 1E68; 1E69; Case map */ - { 0x001E6A, 0, { 0x001E6B }}, /* 1E6A; 1E6B; Case map */ - { 0x001E6C, 0, { 0x001E6D }}, /* 1E6C; 1E6D; Case map */ - { 0x001E6E, 0, { 0x001E6F }}, /* 1E6E; 1E6F; Case map */ - { 0x001E70, 0, { 0x001E71 }}, /* 1E70; 1E71; Case map */ - { 0x001E72, 0, { 0x001E73 }}, /* 1E72; 1E73; Case map */ - { 0x001E74, 0, { 0x001E75 }}, /* 1E74; 1E75; Case map */ - { 0x001E76, 0, { 0x001E77 }}, /* 1E76; 1E77; Case map */ - { 0x001E78, 0, { 0x001E79 }}, /* 1E78; 1E79; Case map */ - { 0x001E7A, 0, { 0x001E7B }}, /* 1E7A; 1E7B; Case map */ - { 0x001E7C, 0, { 0x001E7D }}, /* 1E7C; 1E7D; Case map */ - { 0x001E7E, 0, { 0x001E7F }}, /* 1E7E; 1E7F; Case map */ - { 0x001E80, 0, { 0x001E81 }}, /* 1E80; 1E81; Case map */ - { 0x001E82, 0, { 0x001E83 }}, /* 1E82; 1E83; Case map */ - { 0x001E84, 0, { 0x001E85 }}, /* 1E84; 1E85; Case map */ - { 0x001E86, 0, { 0x001E87 }}, /* 1E86; 1E87; Case map */ - { 0x001E88, 0, { 0x001E89 }}, /* 1E88; 1E89; Case map */ - { 0x001E8A, 0, { 0x001E8B }}, /* 1E8A; 1E8B; Case map */ - { 0x001E8C, 0, { 0x001E8D }}, /* 1E8C; 1E8D; Case map */ - { 0x001E8E, 0, { 0x001E8F }}, /* 1E8E; 1E8F; Case map */ - { 0x001E90, 0, { 0x001E91 }}, /* 1E90; 1E91; Case map */ - { 0x001E92, 0, { 0x001E93 }}, /* 1E92; 1E93; Case map */ - { 0x001E94, 0, { 0x001E95 }}, /* 1E94; 1E95; Case map */ - { 0x001E96, 0, { 0x000068, /* 1E96; 0068 0331; Case map */ - 0x000331 }}, - { 0x001E97, 0, { 0x000074, /* 1E97; 0074 0308; Case map */ - 0x000308 }}, - { 0x001E98, 0, { 0x000077, /* 1E98; 0077 030A; Case map */ - 0x00030A }}, - { 0x001E99, 0, { 0x000079, /* 1E99; 0079 030A; Case map */ - 0x00030A }}, - { 0x001E9A, 0, { 0x000061, /* 1E9A; 0061 02BE; Case map */ - 0x0002BE }}, - { 0x001E9B, 0, { 0x001E61 }}, /* 1E9B; 1E61; Case map */ - { 0x001EA0, 0, { 0x001EA1 }}, /* 1EA0; 1EA1; Case map */ - { 0x001EA2, 0, { 0x001EA3 }}, /* 1EA2; 1EA3; Case map */ - { 0x001EA4, 0, { 0x001EA5 }}, /* 1EA4; 1EA5; Case map */ - { 0x001EA6, 0, { 0x001EA7 }}, /* 1EA6; 1EA7; Case map */ - { 0x001EA8, 0, { 0x001EA9 }}, /* 1EA8; 1EA9; Case map */ - { 0x001EAA, 0, { 0x001EAB }}, /* 1EAA; 1EAB; Case map */ - { 0x001EAC, 0, { 0x001EAD }}, /* 1EAC; 1EAD; Case map */ - { 0x001EAE, 0, { 0x001EAF }}, /* 1EAE; 1EAF; Case map */ - { 0x001EB0, 0, { 0x001EB1 }}, /* 1EB0; 1EB1; Case map */ - { 0x001EB2, 0, { 0x001EB3 }}, /* 1EB2; 1EB3; Case map */ - { 0x001EB4, 0, { 0x001EB5 }}, /* 1EB4; 1EB5; Case map */ - { 0x001EB6, 0, { 0x001EB7 }}, /* 1EB6; 1EB7; Case map */ - { 0x001EB8, 0, { 0x001EB9 }}, /* 1EB8; 1EB9; Case map */ - { 0x001EBA, 0, { 0x001EBB }}, /* 1EBA; 1EBB; Case map */ - { 0x001EBC, 0, { 0x001EBD }}, /* 1EBC; 1EBD; Case map */ - { 0x001EBE, 0, { 0x001EBF }}, /* 1EBE; 1EBF; Case map */ - { 0x001EC0, 0, { 0x001EC1 }}, /* 1EC0; 1EC1; Case map */ - { 0x001EC2, 0, { 0x001EC3 }}, /* 1EC2; 1EC3; Case map */ - { 0x001EC4, 0, { 0x001EC5 }}, /* 1EC4; 1EC5; Case map */ - { 0x001EC6, 0, { 0x001EC7 }}, /* 1EC6; 1EC7; Case map */ - { 0x001EC8, 0, { 0x001EC9 }}, /* 1EC8; 1EC9; Case map */ - { 0x001ECA, 0, { 0x001ECB }}, /* 1ECA; 1ECB; Case map */ - { 0x001ECC, 0, { 0x001ECD }}, /* 1ECC; 1ECD; Case map */ - { 0x001ECE, 0, { 0x001ECF }}, /* 1ECE; 1ECF; Case map */ - { 0x001ED0, 0, { 0x001ED1 }}, /* 1ED0; 1ED1; Case map */ - { 0x001ED2, 0, { 0x001ED3 }}, /* 1ED2; 1ED3; Case map */ - { 0x001ED4, 0, { 0x001ED5 }}, /* 1ED4; 1ED5; Case map */ - { 0x001ED6, 0, { 0x001ED7 }}, /* 1ED6; 1ED7; Case map */ - { 0x001ED8, 0, { 0x001ED9 }}, /* 1ED8; 1ED9; Case map */ - { 0x001EDA, 0, { 0x001EDB }}, /* 1EDA; 1EDB; Case map */ - { 0x001EDC, 0, { 0x001EDD }}, /* 1EDC; 1EDD; Case map */ - { 0x001EDE, 0, { 0x001EDF }}, /* 1EDE; 1EDF; Case map */ - { 0x001EE0, 0, { 0x001EE1 }}, /* 1EE0; 1EE1; Case map */ - { 0x001EE2, 0, { 0x001EE3 }}, /* 1EE2; 1EE3; Case map */ - { 0x001EE4, 0, { 0x001EE5 }}, /* 1EE4; 1EE5; Case map */ - { 0x001EE6, 0, { 0x001EE7 }}, /* 1EE6; 1EE7; Case map */ - { 0x001EE8, 0, { 0x001EE9 }}, /* 1EE8; 1EE9; Case map */ - { 0x001EEA, 0, { 0x001EEB }}, /* 1EEA; 1EEB; Case map */ - { 0x001EEC, 0, { 0x001EED }}, /* 1EEC; 1EED; Case map */ - { 0x001EEE, 0, { 0x001EEF }}, /* 1EEE; 1EEF; Case map */ - { 0x001EF0, 0, { 0x001EF1 }}, /* 1EF0; 1EF1; Case map */ - { 0x001EF2, 0, { 0x001EF3 }}, /* 1EF2; 1EF3; Case map */ - { 0x001EF4, 0, { 0x001EF5 }}, /* 1EF4; 1EF5; Case map */ - { 0x001EF6, 0, { 0x001EF7 }}, /* 1EF6; 1EF7; Case map */ - { 0x001EF8, 0, { 0x001EF9 }}, /* 1EF8; 1EF9; Case map */ - { 0x001F08, 0, { 0x001F00 }}, /* 1F08; 1F00; Case map */ - { 0x001F09, 0, { 0x001F01 }}, /* 1F09; 1F01; Case map */ - { 0x001F0A, 0, { 0x001F02 }}, /* 1F0A; 1F02; Case map */ - { 0x001F0B, 0, { 0x001F03 }}, /* 1F0B; 1F03; Case map */ - { 0x001F0C, 0, { 0x001F04 }}, /* 1F0C; 1F04; Case map */ - { 0x001F0D, 0, { 0x001F05 }}, /* 1F0D; 1F05; Case map */ - { 0x001F0E, 0, { 0x001F06 }}, /* 1F0E; 1F06; Case map */ - { 0x001F0F, 0, { 0x001F07 }}, /* 1F0F; 1F07; Case map */ - { 0x001F18, 0, { 0x001F10 }}, /* 1F18; 1F10; Case map */ - { 0x001F19, 0, { 0x001F11 }}, /* 1F19; 1F11; Case map */ - { 0x001F1A, 0, { 0x001F12 }}, /* 1F1A; 1F12; Case map */ - { 0x001F1B, 0, { 0x001F13 }}, /* 1F1B; 1F13; Case map */ - { 0x001F1C, 0, { 0x001F14 }}, /* 1F1C; 1F14; Case map */ - { 0x001F1D, 0, { 0x001F15 }}, /* 1F1D; 1F15; Case map */ - { 0x001F28, 0, { 0x001F20 }}, /* 1F28; 1F20; Case map */ - { 0x001F29, 0, { 0x001F21 }}, /* 1F29; 1F21; Case map */ - { 0x001F2A, 0, { 0x001F22 }}, /* 1F2A; 1F22; Case map */ - { 0x001F2B, 0, { 0x001F23 }}, /* 1F2B; 1F23; Case map */ - { 0x001F2C, 0, { 0x001F24 }}, /* 1F2C; 1F24; Case map */ - { 0x001F2D, 0, { 0x001F25 }}, /* 1F2D; 1F25; Case map */ - { 0x001F2E, 0, { 0x001F26 }}, /* 1F2E; 1F26; Case map */ - { 0x001F2F, 0, { 0x001F27 }}, /* 1F2F; 1F27; Case map */ - { 0x001F38, 0, { 0x001F30 }}, /* 1F38; 1F30; Case map */ - { 0x001F39, 0, { 0x001F31 }}, /* 1F39; 1F31; Case map */ - { 0x001F3A, 0, { 0x001F32 }}, /* 1F3A; 1F32; Case map */ - { 0x001F3B, 0, { 0x001F33 }}, /* 1F3B; 1F33; Case map */ - { 0x001F3C, 0, { 0x001F34 }}, /* 1F3C; 1F34; Case map */ - { 0x001F3D, 0, { 0x001F35 }}, /* 1F3D; 1F35; Case map */ - { 0x001F3E, 0, { 0x001F36 }}, /* 1F3E; 1F36; Case map */ - { 0x001F3F, 0, { 0x001F37 }}, /* 1F3F; 1F37; Case map */ - { 0x001F48, 0, { 0x001F40 }}, /* 1F48; 1F40; Case map */ - { 0x001F49, 0, { 0x001F41 }}, /* 1F49; 1F41; Case map */ - { 0x001F4A, 0, { 0x001F42 }}, /* 1F4A; 1F42; Case map */ - { 0x001F4B, 0, { 0x001F43 }}, /* 1F4B; 1F43; Case map */ - { 0x001F4C, 0, { 0x001F44 }}, /* 1F4C; 1F44; Case map */ - { 0x001F4D, 0, { 0x001F45 }}, /* 1F4D; 1F45; Case map */ - { 0x001F50, 0, { 0x0003C5, /* 1F50; 03C5 0313; Case map */ - 0x000313 }}, - { 0x001F52, 0, { 0x0003C5, /* 1F52; 03C5 0313 0300; Case map */ - 0x000313, 0x000300 }}, - { 0x001F54, 0, { 0x0003C5, /* 1F54; 03C5 0313 0301; Case map */ - 0x000313, 0x000301 }}, - { 0x001F56, 0, { 0x0003C5, /* 1F56; 03C5 0313 0342; Case map */ - 0x000313, 0x000342 }}, - { 0x001F59, 0, { 0x001F51 }}, /* 1F59; 1F51; Case map */ - { 0x001F5B, 0, { 0x001F53 }}, /* 1F5B; 1F53; Case map */ - { 0x001F5D, 0, { 0x001F55 }}, /* 1F5D; 1F55; Case map */ - { 0x001F5F, 0, { 0x001F57 }}, /* 1F5F; 1F57; Case map */ - { 0x001F68, 0, { 0x001F60 }}, /* 1F68; 1F60; Case map */ - { 0x001F69, 0, { 0x001F61 }}, /* 1F69; 1F61; Case map */ - { 0x001F6A, 0, { 0x001F62 }}, /* 1F6A; 1F62; Case map */ - { 0x001F6B, 0, { 0x001F63 }}, /* 1F6B; 1F63; Case map */ - { 0x001F6C, 0, { 0x001F64 }}, /* 1F6C; 1F64; Case map */ - { 0x001F6D, 0, { 0x001F65 }}, /* 1F6D; 1F65; Case map */ - { 0x001F6E, 0, { 0x001F66 }}, /* 1F6E; 1F66; Case map */ - { 0x001F6F, 0, { 0x001F67 }}, /* 1F6F; 1F67; Case map */ - { 0x001F80, 0, { 0x001F00, /* 1F80; 1F00 03B9; Case map */ - 0x0003B9 }}, - { 0x001F81, 0, { 0x001F01, /* 1F81; 1F01 03B9; Case map */ - 0x0003B9 }}, - { 0x001F82, 0, { 0x001F02, /* 1F82; 1F02 03B9; Case map */ - 0x0003B9 }}, - { 0x001F83, 0, { 0x001F03, /* 1F83; 1F03 03B9; Case map */ - 0x0003B9 }}, - { 0x001F84, 0, { 0x001F04, /* 1F84; 1F04 03B9; Case map */ - 0x0003B9 }}, - { 0x001F85, 0, { 0x001F05, /* 1F85; 1F05 03B9; Case map */ - 0x0003B9 }}, - { 0x001F86, 0, { 0x001F06, /* 1F86; 1F06 03B9; Case map */ - 0x0003B9 }}, - { 0x001F87, 0, { 0x001F07, /* 1F87; 1F07 03B9; Case map */ - 0x0003B9 }}, - { 0x001F88, 0, { 0x001F00, /* 1F88; 1F00 03B9; Case map */ - 0x0003B9 }}, - { 0x001F89, 0, { 0x001F01, /* 1F89; 1F01 03B9; Case map */ - 0x0003B9 }}, - { 0x001F8A, 0, { 0x001F02, /* 1F8A; 1F02 03B9; Case map */ - 0x0003B9 }}, - { 0x001F8B, 0, { 0x001F03, /* 1F8B; 1F03 03B9; Case map */ - 0x0003B9 }}, - { 0x001F8C, 0, { 0x001F04, /* 1F8C; 1F04 03B9; Case map */ - 0x0003B9 }}, - { 0x001F8D, 0, { 0x001F05, /* 1F8D; 1F05 03B9; Case map */ - 0x0003B9 }}, - { 0x001F8E, 0, { 0x001F06, /* 1F8E; 1F06 03B9; Case map */ - 0x0003B9 }}, - { 0x001F8F, 0, { 0x001F07, /* 1F8F; 1F07 03B9; Case map */ - 0x0003B9 }}, - { 0x001F90, 0, { 0x001F20, /* 1F90; 1F20 03B9; Case map */ - 0x0003B9 }}, - { 0x001F91, 0, { 0x001F21, /* 1F91; 1F21 03B9; Case map */ - 0x0003B9 }}, - { 0x001F92, 0, { 0x001F22, /* 1F92; 1F22 03B9; Case map */ - 0x0003B9 }}, - { 0x001F93, 0, { 0x001F23, /* 1F93; 1F23 03B9; Case map */ - 0x0003B9 }}, - { 0x001F94, 0, { 0x001F24, /* 1F94; 1F24 03B9; Case map */ - 0x0003B9 }}, - { 0x001F95, 0, { 0x001F25, /* 1F95; 1F25 03B9; Case map */ - 0x0003B9 }}, - { 0x001F96, 0, { 0x001F26, /* 1F96; 1F26 03B9; Case map */ - 0x0003B9 }}, - { 0x001F97, 0, { 0x001F27, /* 1F97; 1F27 03B9; Case map */ - 0x0003B9 }}, - { 0x001F98, 0, { 0x001F20, /* 1F98; 1F20 03B9; Case map */ - 0x0003B9 }}, - { 0x001F99, 0, { 0x001F21, /* 1F99; 1F21 03B9; Case map */ - 0x0003B9 }}, - { 0x001F9A, 0, { 0x001F22, /* 1F9A; 1F22 03B9; Case map */ - 0x0003B9 }}, - { 0x001F9B, 0, { 0x001F23, /* 1F9B; 1F23 03B9; Case map */ - 0x0003B9 }}, - { 0x001F9C, 0, { 0x001F24, /* 1F9C; 1F24 03B9; Case map */ - 0x0003B9 }}, - { 0x001F9D, 0, { 0x001F25, /* 1F9D; 1F25 03B9; Case map */ - 0x0003B9 }}, - { 0x001F9E, 0, { 0x001F26, /* 1F9E; 1F26 03B9; Case map */ - 0x0003B9 }}, - { 0x001F9F, 0, { 0x001F27, /* 1F9F; 1F27 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA0, 0, { 0x001F60, /* 1FA0; 1F60 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA1, 0, { 0x001F61, /* 1FA1; 1F61 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA2, 0, { 0x001F62, /* 1FA2; 1F62 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA3, 0, { 0x001F63, /* 1FA3; 1F63 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA4, 0, { 0x001F64, /* 1FA4; 1F64 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA5, 0, { 0x001F65, /* 1FA5; 1F65 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA6, 0, { 0x001F66, /* 1FA6; 1F66 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA7, 0, { 0x001F67, /* 1FA7; 1F67 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA8, 0, { 0x001F60, /* 1FA8; 1F60 03B9; Case map */ - 0x0003B9 }}, - { 0x001FA9, 0, { 0x001F61, /* 1FA9; 1F61 03B9; Case map */ - 0x0003B9 }}, - { 0x001FAA, 0, { 0x001F62, /* 1FAA; 1F62 03B9; Case map */ - 0x0003B9 }}, - { 0x001FAB, 0, { 0x001F63, /* 1FAB; 1F63 03B9; Case map */ - 0x0003B9 }}, - { 0x001FAC, 0, { 0x001F64, /* 1FAC; 1F64 03B9; Case map */ - 0x0003B9 }}, - { 0x001FAD, 0, { 0x001F65, /* 1FAD; 1F65 03B9; Case map */ - 0x0003B9 }}, - { 0x001FAE, 0, { 0x001F66, /* 1FAE; 1F66 03B9; Case map */ - 0x0003B9 }}, - { 0x001FAF, 0, { 0x001F67, /* 1FAF; 1F67 03B9; Case map */ - 0x0003B9 }}, - { 0x001FB2, 0, { 0x001F70, /* 1FB2; 1F70 03B9; Case map */ - 0x0003B9 }}, - { 0x001FB3, 0, { 0x0003B1, /* 1FB3; 03B1 03B9; Case map */ - 0x0003B9 }}, - { 0x001FB4, 0, { 0x0003AC, /* 1FB4; 03AC 03B9; Case map */ - 0x0003B9 }}, - { 0x001FB6, 0, { 0x0003B1, /* 1FB6; 03B1 0342; Case map */ - 0x000342 }}, - { 0x001FB7, 0, { 0x0003B1, /* 1FB7; 03B1 0342 03B9; Case map */ - 0x000342, 0x0003B9 }}, - { 0x001FB8, 0, { 0x001FB0 }}, /* 1FB8; 1FB0; Case map */ - { 0x001FB9, 0, { 0x001FB1 }}, /* 1FB9; 1FB1; Case map */ - { 0x001FBA, 0, { 0x001F70 }}, /* 1FBA; 1F70; Case map */ - { 0x001FBB, 0, { 0x001F71 }}, /* 1FBB; 1F71; Case map */ - { 0x001FBC, 0, { 0x0003B1, /* 1FBC; 03B1 03B9; Case map */ - 0x0003B9 }}, - { 0x001FBE, 0, { 0x0003B9 }}, /* 1FBE; 03B9; Case map */ - { 0x001FC2, 0, { 0x001F74, /* 1FC2; 1F74 03B9; Case map */ - 0x0003B9 }}, - { 0x001FC3, 0, { 0x0003B7, /* 1FC3; 03B7 03B9; Case map */ - 0x0003B9 }}, - { 0x001FC4, 0, { 0x0003AE, /* 1FC4; 03AE 03B9; Case map */ - 0x0003B9 }}, - { 0x001FC6, 0, { 0x0003B7, /* 1FC6; 03B7 0342; Case map */ - 0x000342 }}, - { 0x001FC7, 0, { 0x0003B7, /* 1FC7; 03B7 0342 03B9; Case map */ - 0x000342, 0x0003B9 }}, - { 0x001FC8, 0, { 0x001F72 }}, /* 1FC8; 1F72; Case map */ - { 0x001FC9, 0, { 0x001F73 }}, /* 1FC9; 1F73; Case map */ - { 0x001FCA, 0, { 0x001F74 }}, /* 1FCA; 1F74; Case map */ - { 0x001FCB, 0, { 0x001F75 }}, /* 1FCB; 1F75; Case map */ - { 0x001FCC, 0, { 0x0003B7, /* 1FCC; 03B7 03B9; Case map */ - 0x0003B9 }}, - { 0x001FD2, 0, { 0x0003B9, /* 1FD2; 03B9 0308 0300; Case map */ - 0x000308, 0x000300 }}, - { 0x001FD3, 0, { 0x0003B9, /* 1FD3; 03B9 0308 0301; Case map */ - 0x000308, 0x000301 }}, - { 0x001FD6, 0, { 0x0003B9, /* 1FD6; 03B9 0342; Case map */ - 0x000342 }}, - { 0x001FD7, 0, { 0x0003B9, /* 1FD7; 03B9 0308 0342; Case map */ - 0x000308, 0x000342 }}, - { 0x001FD8, 0, { 0x001FD0 }}, /* 1FD8; 1FD0; Case map */ - { 0x001FD9, 0, { 0x001FD1 }}, /* 1FD9; 1FD1; Case map */ - { 0x001FDA, 0, { 0x001F76 }}, /* 1FDA; 1F76; Case map */ - { 0x001FDB, 0, { 0x001F77 }}, /* 1FDB; 1F77; Case map */ - { 0x001FE2, 0, { 0x0003C5, /* 1FE2; 03C5 0308 0300; Case map */ - 0x000308, 0x000300 }}, - { 0x001FE3, 0, { 0x0003C5, /* 1FE3; 03C5 0308 0301; Case map */ - 0x000308, 0x000301 }}, - { 0x001FE4, 0, { 0x0003C1, /* 1FE4; 03C1 0313; Case map */ - 0x000313 }}, - { 0x001FE6, 0, { 0x0003C5, /* 1FE6; 03C5 0342; Case map */ - 0x000342 }}, - { 0x001FE7, 0, { 0x0003C5, /* 1FE7; 03C5 0308 0342; Case map */ - 0x000308, 0x000342 }}, - { 0x001FE8, 0, { 0x001FE0 }}, /* 1FE8; 1FE0; Case map */ - { 0x001FE9, 0, { 0x001FE1 }}, /* 1FE9; 1FE1; Case map */ - { 0x001FEA, 0, { 0x001F7A }}, /* 1FEA; 1F7A; Case map */ - { 0x001FEB, 0, { 0x001F7B }}, /* 1FEB; 1F7B; Case map */ - { 0x001FEC, 0, { 0x001FE5 }}, /* 1FEC; 1FE5; Case map */ - { 0x001FF2, 0, { 0x001F7C, /* 1FF2; 1F7C 03B9; Case map */ - 0x0003B9 }}, - { 0x001FF3, 0, { 0x0003C9, /* 1FF3; 03C9 03B9; Case map */ - 0x0003B9 }}, - { 0x001FF4, 0, { 0x0003CE, /* 1FF4; 03CE 03B9; Case map */ - 0x0003B9 }}, - { 0x001FF6, 0, { 0x0003C9, /* 1FF6; 03C9 0342; Case map */ - 0x000342 }}, - { 0x001FF7, 0, { 0x0003C9, /* 1FF7; 03C9 0342 03B9; Case map */ - 0x000342, 0x0003B9 }}, - { 0x001FF8, 0, { 0x001F78 }}, /* 1FF8; 1F78; Case map */ - { 0x001FF9, 0, { 0x001F79 }}, /* 1FF9; 1F79; Case map */ - { 0x001FFA, 0, { 0x001F7C }}, /* 1FFA; 1F7C; Case map */ - { 0x001FFB, 0, { 0x001F7D }}, /* 1FFB; 1F7D; Case map */ - { 0x001FFC, 0, { 0x0003C9, /* 1FFC; 03C9 03B9; Case map */ - 0x0003B9 }}, - { 0x002126, 0, { 0x0003C9 }}, /* 2126; 03C9; Case map */ - { 0x00212A, 0, { 0x00006B }}, /* 212A; 006B; Case map */ - { 0x00212B, 0, { 0x0000E5 }}, /* 212B; 00E5; Case map */ - { 0x002160, 0, { 0x002170 }}, /* 2160; 2170; Case map */ - { 0x002161, 0, { 0x002171 }}, /* 2161; 2171; Case map */ - { 0x002162, 0, { 0x002172 }}, /* 2162; 2172; Case map */ - { 0x002163, 0, { 0x002173 }}, /* 2163; 2173; Case map */ - { 0x002164, 0, { 0x002174 }}, /* 2164; 2174; Case map */ - { 0x002165, 0, { 0x002175 }}, /* 2165; 2175; Case map */ - { 0x002166, 0, { 0x002176 }}, /* 2166; 2176; Case map */ - { 0x002167, 0, { 0x002177 }}, /* 2167; 2177; Case map */ - { 0x002168, 0, { 0x002178 }}, /* 2168; 2178; Case map */ - { 0x002169, 0, { 0x002179 }}, /* 2169; 2179; Case map */ - { 0x00216A, 0, { 0x00217A }}, /* 216A; 217A; Case map */ - { 0x00216B, 0, { 0x00217B }}, /* 216B; 217B; Case map */ - { 0x00216C, 0, { 0x00217C }}, /* 216C; 217C; Case map */ - { 0x00216D, 0, { 0x00217D }}, /* 216D; 217D; Case map */ - { 0x00216E, 0, { 0x00217E }}, /* 216E; 217E; Case map */ - { 0x00216F, 0, { 0x00217F }}, /* 216F; 217F; Case map */ - { 0x0024B6, 0, { 0x0024D0 }}, /* 24B6; 24D0; Case map */ - { 0x0024B7, 0, { 0x0024D1 }}, /* 24B7; 24D1; Case map */ - { 0x0024B8, 0, { 0x0024D2 }}, /* 24B8; 24D2; Case map */ - { 0x0024B9, 0, { 0x0024D3 }}, /* 24B9; 24D3; Case map */ - { 0x0024BA, 0, { 0x0024D4 }}, /* 24BA; 24D4; Case map */ - { 0x0024BB, 0, { 0x0024D5 }}, /* 24BB; 24D5; Case map */ - { 0x0024BC, 0, { 0x0024D6 }}, /* 24BC; 24D6; Case map */ - { 0x0024BD, 0, { 0x0024D7 }}, /* 24BD; 24D7; Case map */ - { 0x0024BE, 0, { 0x0024D8 }}, /* 24BE; 24D8; Case map */ - { 0x0024BF, 0, { 0x0024D9 }}, /* 24BF; 24D9; Case map */ - { 0x0024C0, 0, { 0x0024DA }}, /* 24C0; 24DA; Case map */ - { 0x0024C1, 0, { 0x0024DB }}, /* 24C1; 24DB; Case map */ - { 0x0024C2, 0, { 0x0024DC }}, /* 24C2; 24DC; Case map */ - { 0x0024C3, 0, { 0x0024DD }}, /* 24C3; 24DD; Case map */ - { 0x0024C4, 0, { 0x0024DE }}, /* 24C4; 24DE; Case map */ - { 0x0024C5, 0, { 0x0024DF }}, /* 24C5; 24DF; Case map */ - { 0x0024C6, 0, { 0x0024E0 }}, /* 24C6; 24E0; Case map */ - { 0x0024C7, 0, { 0x0024E1 }}, /* 24C7; 24E1; Case map */ - { 0x0024C8, 0, { 0x0024E2 }}, /* 24C8; 24E2; Case map */ - { 0x0024C9, 0, { 0x0024E3 }}, /* 24C9; 24E3; Case map */ - { 0x0024CA, 0, { 0x0024E4 }}, /* 24CA; 24E4; Case map */ - { 0x0024CB, 0, { 0x0024E5 }}, /* 24CB; 24E5; Case map */ - { 0x0024CC, 0, { 0x0024E6 }}, /* 24CC; 24E6; Case map */ - { 0x0024CD, 0, { 0x0024E7 }}, /* 24CD; 24E7; Case map */ - { 0x0024CE, 0, { 0x0024E8 }}, /* 24CE; 24E8; Case map */ - { 0x0024CF, 0, { 0x0024E9 }}, /* 24CF; 24E9; Case map */ - { 0x00FB00, 0, { 0x000066, /* FB00; 0066 0066; Case map */ - 0x000066 }}, - { 0x00FB01, 0, { 0x000066, /* FB01; 0066 0069; Case map */ - 0x000069 }}, - { 0x00FB02, 0, { 0x000066, /* FB02; 0066 006C; Case map */ - 0x00006C }}, - { 0x00FB03, 0, { 0x000066, /* FB03; 0066 0066 0069; Case map */ - 0x000066, 0x000069 }}, - { 0x00FB04, 0, { 0x000066, /* FB04; 0066 0066 006C; Case map */ - 0x000066, 0x00006C }}, - { 0x00FB05, 0, { 0x000073, /* FB05; 0073 0074; Case map */ - 0x000074 }}, - { 0x00FB06, 0, { 0x000073, /* FB06; 0073 0074; Case map */ - 0x000074 }}, - { 0x00FB13, 0, { 0x000574, /* FB13; 0574 0576; Case map */ - 0x000576 }}, - { 0x00FB14, 0, { 0x000574, /* FB14; 0574 0565; Case map */ - 0x000565 }}, - { 0x00FB15, 0, { 0x000574, /* FB15; 0574 056B; Case map */ - 0x00056B }}, - { 0x00FB16, 0, { 0x00057E, /* FB16; 057E 0576; Case map */ - 0x000576 }}, - { 0x00FB17, 0, { 0x000574, /* FB17; 0574 056D; Case map */ - 0x00056D }}, - { 0x00FF21, 0, { 0x00FF41 }}, /* FF21; FF41; Case map */ - { 0x00FF22, 0, { 0x00FF42 }}, /* FF22; FF42; Case map */ - { 0x00FF23, 0, { 0x00FF43 }}, /* FF23; FF43; Case map */ - { 0x00FF24, 0, { 0x00FF44 }}, /* FF24; FF44; Case map */ - { 0x00FF25, 0, { 0x00FF45 }}, /* FF25; FF45; Case map */ - { 0x00FF26, 0, { 0x00FF46 }}, /* FF26; FF46; Case map */ - { 0x00FF27, 0, { 0x00FF47 }}, /* FF27; FF47; Case map */ - { 0x00FF28, 0, { 0x00FF48 }}, /* FF28; FF48; Case map */ - { 0x00FF29, 0, { 0x00FF49 }}, /* FF29; FF49; Case map */ - { 0x00FF2A, 0, { 0x00FF4A }}, /* FF2A; FF4A; Case map */ - { 0x00FF2B, 0, { 0x00FF4B }}, /* FF2B; FF4B; Case map */ - { 0x00FF2C, 0, { 0x00FF4C }}, /* FF2C; FF4C; Case map */ - { 0x00FF2D, 0, { 0x00FF4D }}, /* FF2D; FF4D; Case map */ - { 0x00FF2E, 0, { 0x00FF4E }}, /* FF2E; FF4E; Case map */ - { 0x00FF2F, 0, { 0x00FF4F }}, /* FF2F; FF4F; Case map */ - { 0x00FF30, 0, { 0x00FF50 }}, /* FF30; FF50; Case map */ - { 0x00FF31, 0, { 0x00FF51 }}, /* FF31; FF51; Case map */ - { 0x00FF32, 0, { 0x00FF52 }}, /* FF32; FF52; Case map */ - { 0x00FF33, 0, { 0x00FF53 }}, /* FF33; FF53; Case map */ - { 0x00FF34, 0, { 0x00FF54 }}, /* FF34; FF54; Case map */ - { 0x00FF35, 0, { 0x00FF55 }}, /* FF35; FF55; Case map */ - { 0x00FF36, 0, { 0x00FF56 }}, /* FF36; FF56; Case map */ - { 0x00FF37, 0, { 0x00FF57 }}, /* FF37; FF57; Case map */ - { 0x00FF38, 0, { 0x00FF58 }}, /* FF38; FF58; Case map */ - { 0x00FF39, 0, { 0x00FF59 }}, /* FF39; FF59; Case map */ - { 0x00FF3A, 0, { 0x00FF5A }}, /* FF3A; FF5A; Case map */ - { 0x010400, 0, { 0x010428 }}, /* 10400; 10428; Case map */ - { 0x010401, 0, { 0x010429 }}, /* 10401; 10429; Case map */ - { 0x010402, 0, { 0x01042A }}, /* 10402; 1042A; Case map */ - { 0x010403, 0, { 0x01042B }}, /* 10403; 1042B; Case map */ - { 0x010404, 0, { 0x01042C }}, /* 10404; 1042C; Case map */ - { 0x010405, 0, { 0x01042D }}, /* 10405; 1042D; Case map */ - { 0x010406, 0, { 0x01042E }}, /* 10406; 1042E; Case map */ - { 0x010407, 0, { 0x01042F }}, /* 10407; 1042F; Case map */ - { 0x010408, 0, { 0x010430 }}, /* 10408; 10430; Case map */ - { 0x010409, 0, { 0x010431 }}, /* 10409; 10431; Case map */ - { 0x01040A, 0, { 0x010432 }}, /* 1040A; 10432; Case map */ - { 0x01040B, 0, { 0x010433 }}, /* 1040B; 10433; Case map */ - { 0x01040C, 0, { 0x010434 }}, /* 1040C; 10434; Case map */ - { 0x01040D, 0, { 0x010435 }}, /* 1040D; 10435; Case map */ - { 0x01040E, 0, { 0x010436 }}, /* 1040E; 10436; Case map */ - { 0x01040F, 0, { 0x010437 }}, /* 1040F; 10437; Case map */ - { 0x010410, 0, { 0x010438 }}, /* 10410; 10438; Case map */ - { 0x010411, 0, { 0x010439 }}, /* 10411; 10439; Case map */ - { 0x010412, 0, { 0x01043A }}, /* 10412; 1043A; Case map */ - { 0x010413, 0, { 0x01043B }}, /* 10413; 1043B; Case map */ - { 0x010414, 0, { 0x01043C }}, /* 10414; 1043C; Case map */ - { 0x010415, 0, { 0x01043D }}, /* 10415; 1043D; Case map */ - { 0x010416, 0, { 0x01043E }}, /* 10416; 1043E; Case map */ - { 0x010417, 0, { 0x01043F }}, /* 10417; 1043F; Case map */ - { 0x010418, 0, { 0x010440 }}, /* 10418; 10440; Case map */ - { 0x010419, 0, { 0x010441 }}, /* 10419; 10441; Case map */ - { 0x01041A, 0, { 0x010442 }}, /* 1041A; 10442; Case map */ - { 0x01041B, 0, { 0x010443 }}, /* 1041B; 10443; Case map */ - { 0x01041C, 0, { 0x010444 }}, /* 1041C; 10444; Case map */ - { 0x01041D, 0, { 0x010445 }}, /* 1041D; 10445; Case map */ - { 0x01041E, 0, { 0x010446 }}, /* 1041E; 10446; Case map */ - { 0x01041F, 0, { 0x010447 }}, /* 1041F; 10447; Case map */ - { 0x010420, 0, { 0x010448 }}, /* 10420; 10448; Case map */ - { 0x010421, 0, { 0x010449 }}, /* 10421; 10449; Case map */ - { 0x010422, 0, { 0x01044A }}, /* 10422; 1044A; Case map */ - { 0x010423, 0, { 0x01044B }}, /* 10423; 1044B; Case map */ - { 0x010424, 0, { 0x01044C }}, /* 10424; 1044C; Case map */ - { 0x010425, 0, { 0x01044D }}, /* 10425; 1044D; Case map */ - { 0 }, -}; - - -/* - * FF3A; FF5A; Case map - * 10400; 10428; Case map -10401; 10429; Case map -10402; 1042A; Case map -10403; 1042B; Case map -10404; 1042C; Case map -10405; 1042D; Case map -10406; 1042E; Case map -10407; 1042F; Case map -10408; 10430; Case map -10409; 10431; Case map -1040A; 10432; Case map -1040B; 10433; Case map -1040C; 10434; Case map -1040D; 10435; Case map -1040E; 10436; Case map -1040F; 10437; Case map -10410; 10438; Case map -10411; 10439; Case map -10412; 1043A; Case map -10413; 1043B; Case map -10414; 1043C; Case map -10415; 1043D; Case map -10416; 1043E; Case map -10417; 1043F; Case map -10418; 10440; Case map -10419; 10441; Case map -1041A; 10442; Case map -1041B; 10443; Case map -1041C; 10444; Case map -1041D; 10445; Case map -1041E; 10446; Case map -1041F; 10447; Case map -10420; 10448; Case map -10421; 10449; Case map -10422; 1044A; Case map -10423; 1044B; Case map -10424; 1044C; Case map -10425; 1044D; Case map - - */ - -const Stringprep_table_element stringprep_rfc3454_C_1_1[] = { - { 0x000020 }, /* 0020; SPACE */ - { 0 }, -}; - - -/* - * FF3A; FF5A; Case map - * * 10400; 10428; Case map -10401; 10429; Case map -10402; 1042A; Case map -10403; 1042B; Case map -10404; 1042C; Case map -10405; 1042D; Case map -10406; 1042E; Case map -10407; 1042F; Case map -10408; 10430; Case map -10409; 10431; Case map -1040A; 10432; Case map -1040B; 10433; Case map -1040C; 10434; Case map -1040D; 10435; Case map -1040E; 10436; Case map -1040F; 10437; Case map -10410; 10438; Case map -10411; 10439; Case map -10412; 1043A; Case map -10413; 1043B; Case map -10414; 1043C; Case map -10415; 1043D; Case map -10416; 1043E; Case map -10417; 1043F; Case map -10418; 10440; Case map -10419; 10441; Case map -1041A; 10442; Case map -1041B; 10443; Case map -1041C; 10444; Case map -1041D; 10445; Case map -1041E; 10446; Case map -1041F; 10447; Case map -10420; 10448; Case map -10421; 10449; Case map -10422; 1044A; Case map -10423; 1044B; Case map -10424; 1044C; Case map -10425; 1044D; Case map - -0020; SPACE - - */ - -const Stringprep_table_element stringprep_rfc3454_C_1_2[] = { - { 0x0000A0 }, /* 00A0; NO-BREAK SPACE */ - { 0x001680 }, /* 1680; OGHAM SPACE MARK */ - { 0x002000 }, /* 2000; EN QUAD */ - { 0x002001 }, /* 2001; EM QUAD */ - { 0x002002 }, /* 2002; EN SPACE */ - { 0x002003 }, /* 2003; EM SPACE */ - { 0x002004 }, /* 2004; THREE-PER-EM SPACE */ - { 0x002005 }, /* 2005; FOUR-PER-EM SPACE */ - { 0x002006 }, /* 2006; SIX-PER-EM SPACE */ - { 0x002007 }, /* 2007; FIGURE SPACE */ - { 0x002008 }, /* 2008; PUNCTUATION SPACE */ - { 0x002009 }, /* 2009; THIN SPACE */ - { 0x00200A }, /* 200A; HAIR SPACE */ - { 0x00200B }, /* 200B; ZERO WIDTH SPACE */ - { 0x00202F }, /* 202F; NARROW NO-BREAK SPACE */ - { 0x00205F }, /* 205F; MEDIUM MATHEMATICAL SPACE */ - { 0x003000 }, /* 3000; IDEOGRAPHIC SPACE */ - { 0 }, -}; - - -/* - * FF3A; FF5A; Case map - * * * 10400; 10428; Case map -10401; 10429; Case map -10402; 1042A; Case map -10403; 1042B; Case map -10404; 1042C; Case map -10405; 1042D; Case map -10406; 1042E; Case map -10407; 1042F; Case map -10408; 10430; Case map -10409; 10431; Case map -1040A; 10432; Case map -1040B; 10433; Case map -1040C; 10434; Case map -1040D; 10435; Case map -1040E; 10436; Case map -1040F; 10437; Case map -10410; 10438; Case map -10411; 10439; Case map -10412; 1043A; Case map -10413; 1043B; Case map -10414; 1043C; Case map -10415; 1043D; Case map -10416; 1043E; Case map -10417; 1043F; Case map -10418; 10440; Case map -10419; 10441; Case map -1041A; 10442; Case map -1041B; 10443; Case map -1041C; 10444; Case map -1041D; 10445; Case map -1041E; 10446; Case map -1041F; 10447; Case map -10420; 10448; Case map -10421; 10449; Case map -10422; 1044A; Case map -10423; 1044B; Case map -10424; 1044C; Case map -10425; 1044D; Case map - -0020; SPACE - -00A0; NO-BREAK SPACE -1680; OGHAM SPACE MARK -2000; EN QUAD -2001; EM QUAD -2002; EN SPACE -2003; EM SPACE -2004; THREE-PER-EM SPACE -2005; FOUR-PER-EM SPACE -2006; SIX-PER-EM SPACE -2007; FIGURE SPACE -2008; PUNCTUATION SPACE -2009; THIN SPACE -200A; HAIR SPACE -200B; ZERO WIDTH SPACE -202F; NARROW NO-BREAK SPACE -205F; MEDIUM MATHEMATICAL SPACE -3000; IDEOGRAPHIC SPACE - - */ - -const Stringprep_table_element stringprep_rfc3454_C_2_1[] = { - { 0x000000, 0x00001F }, /* 0000-001F; [CONTROL CHARACTERS] */ - { 0x00007F }, /* 007F; DELETE */ - { 0 }, -}; - - -/* - * FF3A; FF5A; Case map - * * * * 10400; 10428; Case map -10401; 10429; Case map -10402; 1042A; Case map -10403; 1042B; Case map -10404; 1042C; Case map -10405; 1042D; Case map -10406; 1042E; Case map -10407; 1042F; Case map -10408; 10430; Case map -10409; 10431; Case map -1040A; 10432; Case map -1040B; 10433; Case map -1040C; 10434; Case map -1040D; 10435; Case map -1040E; 10436; Case map -1040F; 10437; Case map -10410; 10438; Case map -10411; 10439; Case map -10412; 1043A; Case map -10413; 1043B; Case map -10414; 1043C; Case map -10415; 1043D; Case map -10416; 1043E; Case map -10417; 1043F; Case map -10418; 10440; Case map -10419; 10441; Case map -1041A; 10442; Case map -1041B; 10443; Case map -1041C; 10444; Case map -1041D; 10445; Case map -1041E; 10446; Case map -1041F; 10447; Case map -10420; 10448; Case map -10421; 10449; Case map -10422; 1044A; Case map -10423; 1044B; Case map -10424; 1044C; Case map -10425; 1044D; Case map - -0020; SPACE - -00A0; NO-BREAK SPACE -1680; OGHAM SPACE MARK -2000; EN QUAD -2001; EM QUAD -2002; EN SPACE -2003; EM SPACE -2004; THREE-PER-EM SPACE -2005; FOUR-PER-EM SPACE -2006; SIX-PER-EM SPACE -2007; FIGURE SPACE -2008; PUNCTUATION SPACE -2009; THIN SPACE -200A; HAIR SPACE -200B; ZERO WIDTH SPACE -202F; NARROW NO-BREAK SPACE -205F; MEDIUM MATHEMATICAL SPACE -3000; IDEOGRAPHIC SPACE - -0000-001F; [CONTROL CHARACTERS] -007F; DELETE - - */ - -const Stringprep_table_element stringprep_rfc3454_C_2_2[] = { - { 0x000080, 0x00009F }, /* 0080-009F; [CONTROL CHARACTERS] */ - { 0x0006DD }, /* 06DD; ARABIC END OF AYAH */ - { 0x00070F }, /* 070F; SYRIAC ABBREVIATION MARK */ - { 0x00180E }, /* 180E; MONGOLIAN VOWEL SEPARATOR */ - { 0x00200C }, /* 200C; ZERO WIDTH NON-JOINER */ - { 0x00200D }, /* 200D; ZERO WIDTH JOINER */ - { 0x002028 }, /* 2028; LINE SEPARATOR */ - { 0x002029 }, /* 2029; PARAGRAPH SEPARATOR */ - { 0x002060 }, /* 2060; WORD JOINER */ - { 0x002061 }, /* 2061; FUNCTION APPLICATION */ - { 0x002062 }, /* 2062; INVISIBLE TIMES */ - { 0x002063 }, /* 2063; INVISIBLE SEPARATOR */ - { 0x00206A, 0x00206F }, /* 206A-206F; [CONTROL CHARACTERS] */ - { 0x00FEFF }, /* FEFF; ZERO WIDTH NO-BREAK SPACE */ - { 0x00FFF9, 0x00FFFC }, /* FFF9-FFFC; [CONTROL CHARACTERS] */ - { 0x01D173, 0x01D17A }, /* 1D173-1D17A; [MUSICAL CONTROL CHARACTERS] */ - { 0 }, -}; - - -/* - * FFF9-FFFC; [CONTROL CHARACTERS] - * 1D173-1D17A; [MUSICAL CONTROL CHARACTERS] - - */ - -const Stringprep_table_element stringprep_rfc3454_C_3[] = { - { 0x00E000, 0x00F8FF }, /* E000-F8FF; [PRIVATE USE, PLANE 0] */ - { 0x0F0000, 0x0FFFFD }, /* F0000-FFFFD; [PRIVATE USE, PLANE 15] */ - { 0x100000, 0x10FFFD }, /* 100000-10FFFD; [PRIVATE USE, PLANE 16] */ - { 0 }, -}; - - -/* - * F0000-FFFFD; [PRIVATE USE, PLANE 15] - * 100000-10FFFD; [PRIVATE USE, PLANE 16] - - */ - -const Stringprep_table_element stringprep_rfc3454_C_4[] = { - { 0x00FDD0, 0x00FDEF }, /* FDD0-FDEF; [NONCHARACTER CODE POINTS] */ - { 0x00FFFE, 0x00FFFF }, /* FFFE-FFFF; [NONCHARACTER CODE POINTS] */ - { 0x01FFFE, 0x01FFFF }, /* 1FFFE-1FFFF; [NONCHARACTER CODE POINTS] */ - { 0x02FFFE, 0x02FFFF }, /* 2FFFE-2FFFF; [NONCHARACTER CODE POINTS] */ - { 0x03FFFE, 0x03FFFF }, /* 3FFFE-3FFFF; [NONCHARACTER CODE POINTS] */ - { 0x04FFFE, 0x04FFFF }, /* 4FFFE-4FFFF; [NONCHARACTER CODE POINTS] */ - { 0x05FFFE, 0x05FFFF }, /* 5FFFE-5FFFF; [NONCHARACTER CODE POINTS] */ - { 0x06FFFE, 0x06FFFF }, /* 6FFFE-6FFFF; [NONCHARACTER CODE POINTS] */ - { 0x07FFFE, 0x07FFFF }, /* 7FFFE-7FFFF; [NONCHARACTER CODE POINTS] */ - { 0x08FFFE, 0x08FFFF }, /* 8FFFE-8FFFF; [NONCHARACTER CODE POINTS] */ - { 0x09FFFE, 0x09FFFF }, /* 9FFFE-9FFFF; [NONCHARACTER CODE POINTS] */ - { 0x0AFFFE, 0x0AFFFF }, /* AFFFE-AFFFF; [NONCHARACTER CODE POINTS] */ - { 0x0BFFFE, 0x0BFFFF }, /* BFFFE-BFFFF; [NONCHARACTER CODE POINTS] */ - { 0x0CFFFE, 0x0CFFFF }, /* CFFFE-CFFFF; [NONCHARACTER CODE POINTS] */ - { 0x0DFFFE, 0x0DFFFF }, /* DFFFE-DFFFF; [NONCHARACTER CODE POINTS] */ - { 0x0EFFFE, 0x0EFFFF }, /* EFFFE-EFFFF; [NONCHARACTER CODE POINTS] */ - { 0x0FFFFE, 0x0FFFFF }, /* FFFFE-FFFFF; [NONCHARACTER CODE POINTS] */ - { 0x10FFFE, 0x10FFFF }, /* 10FFFE-10FFFF; [NONCHARACTER CODE POINTS] */ - { 0 }, -}; - - -/* - * FFFFE-FFFFF; [NONCHARACTER CODE POINTS] - * 10FFFE-10FFFF; [NONCHARACTER CODE POINTS] - - */ - -const Stringprep_table_element stringprep_rfc3454_C_5[] = { - { 0x00D800, 0x00DFFF }, /* D800-DFFF; [SURROGATE CODES] */ - { 0 }, -}; - - -/* - * D800-DFFF; [SURROGATE CODES] - * - */ - -const Stringprep_table_element stringprep_rfc3454_C_6[] = { - { 0x00FFF9 }, /* FFF9; INTERLINEAR ANNOTATION ANCHOR */ - { 0x00FFFA }, /* FFFA; INTERLINEAR ANNOTATION SEPARATOR */ - { 0x00FFFB }, /* FFFB; INTERLINEAR ANNOTATION TERMINATOR */ - { 0x00FFFC }, /* FFFC; OBJECT REPLACEMENT CHARACTER */ - { 0x00FFFD }, /* FFFD; REPLACEMENT CHARACTER */ - { 0 }, -}; - - -/* - * FFFD; REPLACEMENT CHARACTER - * - */ - -const Stringprep_table_element stringprep_rfc3454_C_7[] = { - { 0x002FF0, 0x002FFB }, /* 2FF0-2FFB; [IDEOGRAPHIC DESCRIPTION CHARACTERS] */ - { 0 }, -}; - - -/* - * FFFD; REPLACEMENT CHARACTER - * * -2FF0-2FFB; [IDEOGRAPHIC DESCRIPTION CHARACTERS] - - */ - -const Stringprep_table_element stringprep_rfc3454_C_8[] = { - { 0x000340 }, /* 0340; COMBINING GRAVE TONE MARK */ - { 0x000341 }, /* 0341; COMBINING ACUTE TONE MARK */ - { 0x00200E }, /* 200E; LEFT-TO-RIGHT MARK */ - { 0x00200F }, /* 200F; RIGHT-TO-LEFT MARK */ - { 0x00202A }, /* 202A; LEFT-TO-RIGHT EMBEDDING */ - { 0x00202B }, /* 202B; RIGHT-TO-LEFT EMBEDDING */ - { 0x00202C }, /* 202C; POP DIRECTIONAL FORMATTING */ - { 0x00202D }, /* 202D; LEFT-TO-RIGHT OVERRIDE */ - { 0x00202E }, /* 202E; RIGHT-TO-LEFT OVERRIDE */ - { 0x00206A }, /* 206A; INHIBIT SYMMETRIC SWAPPING */ - { 0x00206B }, /* 206B; ACTIVATE SYMMETRIC SWAPPING */ - { 0x00206C }, /* 206C; INHIBIT ARABIC FORM SHAPING */ - { 0x00206D }, /* 206D; ACTIVATE ARABIC FORM SHAPING */ - { 0x00206E }, /* 206E; NATIONAL DIGIT SHAPES */ - { 0x00206F }, /* 206F; NOMINAL DIGIT SHAPES */ - { 0 }, -}; - - -/* - * FFFD; REPLACEMENT CHARACTER - * * * -2FF0-2FFB; [IDEOGRAPHIC DESCRIPTION CHARACTERS] - -0340; COMBINING GRAVE TONE MARK -0341; COMBINING ACUTE TONE MARK -200E; LEFT-TO-RIGHT MARK -200F; RIGHT-TO-LEFT MARK -202A; LEFT-TO-RIGHT EMBEDDING -202B; RIGHT-TO-LEFT EMBEDDING -202C; POP DIRECTIONAL FORMATTING -202D; LEFT-TO-RIGHT OVERRIDE -202E; RIGHT-TO-LEFT OVERRIDE -206A; INHIBIT SYMMETRIC SWAPPING -206B; ACTIVATE SYMMETRIC SWAPPING -206C; INHIBIT ARABIC FORM SHAPING -206D; ACTIVATE ARABIC FORM SHAPING -206E; NATIONAL DIGIT SHAPES -206F; NOMINAL DIGIT SHAPES - - */ - -const Stringprep_table_element stringprep_rfc3454_C_9[] = { - { 0x0E0001 }, /* E0001; LANGUAGE TAG */ - { 0x0E0020, 0x0E007F }, /* E0020-E007F; [TAGGING CHARACTERS] */ - { 0 }, -}; - - -/* - * E0020-E007F; [TAGGING CHARACTERS] - * - */ - -const Stringprep_table_element stringprep_rfc3454_D_1[] = { - { 0x0005BE }, /* 05BE */ - { 0x0005C0 }, /* 05C0 */ - { 0x0005C3 }, /* 05C3 */ - { 0x0005D0, 0x0005EA }, /* 05D0-05EA */ - { 0x0005F0, 0x0005F4 }, /* 05F0-05F4 */ - { 0x00061B }, /* 061B */ - { 0x00061F }, /* 061F */ - { 0x000621, 0x00063A }, /* 0621-063A */ - { 0x000640, 0x00064A }, /* 0640-064A */ - { 0x00066D, 0x00066F }, /* 066D-066F */ - { 0x000671, 0x0006D5 }, /* 0671-06D5 */ - { 0x0006DD }, /* 06DD */ - { 0x0006E5, 0x0006E6 }, /* 06E5-06E6 */ - { 0x0006FA, 0x0006FE }, /* 06FA-06FE */ - { 0x000700, 0x00070D }, /* 0700-070D */ - { 0x000710 }, /* 0710 */ - { 0x000712, 0x00072C }, /* 0712-072C */ - { 0x000780, 0x0007A5 }, /* 0780-07A5 */ - { 0x0007B1 }, /* 07B1 */ - { 0x00200F }, /* 200F */ - { 0x00FB1D }, /* FB1D */ - { 0x00FB1F, 0x00FB28 }, /* FB1F-FB28 */ - { 0x00FB2A, 0x00FB36 }, /* FB2A-FB36 */ - { 0x00FB38, 0x00FB3C }, /* FB38-FB3C */ - { 0x00FB3E }, /* FB3E */ - { 0x00FB40, 0x00FB41 }, /* FB40-FB41 */ - { 0x00FB43, 0x00FB44 }, /* FB43-FB44 */ - { 0x00FB46, 0x00FBB1 }, /* FB46-FBB1 */ - { 0x00FBD3, 0x00FD3D }, /* FBD3-FD3D */ - { 0x00FD50, 0x00FD8F }, /* FD50-FD8F */ - { 0x00FD92, 0x00FDC7 }, /* FD92-FDC7 */ - { 0x00FDF0, 0x00FDFC }, /* FDF0-FDFC */ - { 0x00FE70, 0x00FE74 }, /* FE70-FE74 */ - { 0x00FE76, 0x00FEFC }, /* FE76-FEFC */ - { 0 }, -}; - - -/* - * FE76-FEFC - * - */ - -const Stringprep_table_element stringprep_rfc3454_D_2[] = { - { 0x000041, 0x00005A }, /* 0041-005A */ - { 0x000061, 0x00007A }, /* 0061-007A */ - { 0x0000AA }, /* 00AA */ - { 0x0000B5 }, /* 00B5 */ - { 0x0000BA }, /* 00BA */ - { 0x0000C0, 0x0000D6 }, /* 00C0-00D6 */ - { 0x0000D8, 0x0000F6 }, /* 00D8-00F6 */ - { 0x0000F8, 0x000220 }, /* 00F8-0220 */ - { 0x000222, 0x000233 }, /* 0222-0233 */ - { 0x000250, 0x0002AD }, /* 0250-02AD */ - { 0x0002B0, 0x0002B8 }, /* 02B0-02B8 */ - { 0x0002BB, 0x0002C1 }, /* 02BB-02C1 */ - { 0x0002D0, 0x0002D1 }, /* 02D0-02D1 */ - { 0x0002E0, 0x0002E4 }, /* 02E0-02E4 */ - { 0x0002EE }, /* 02EE */ - { 0x00037A }, /* 037A */ - { 0x000386 }, /* 0386 */ - { 0x000388, 0x00038A }, /* 0388-038A */ - { 0x00038C }, /* 038C */ - { 0x00038E, 0x0003A1 }, /* 038E-03A1 */ - { 0x0003A3, 0x0003CE }, /* 03A3-03CE */ - { 0x0003D0, 0x0003F5 }, /* 03D0-03F5 */ - { 0x000400, 0x000482 }, /* 0400-0482 */ - { 0x00048A, 0x0004CE }, /* 048A-04CE */ - { 0x0004D0, 0x0004F5 }, /* 04D0-04F5 */ - { 0x0004F8, 0x0004F9 }, /* 04F8-04F9 */ - { 0x000500, 0x00050F }, /* 0500-050F */ - { 0x000531, 0x000556 }, /* 0531-0556 */ - { 0x000559, 0x00055F }, /* 0559-055F */ - { 0x000561, 0x000587 }, /* 0561-0587 */ - { 0x000589 }, /* 0589 */ - { 0x000903 }, /* 0903 */ - { 0x000905, 0x000939 }, /* 0905-0939 */ - { 0x00093D, 0x000940 }, /* 093D-0940 */ - { 0x000949, 0x00094C }, /* 0949-094C */ - { 0x000950 }, /* 0950 */ - { 0x000958, 0x000961 }, /* 0958-0961 */ - { 0x000964, 0x000970 }, /* 0964-0970 */ - { 0x000982, 0x000983 }, /* 0982-0983 */ - { 0x000985, 0x00098C }, /* 0985-098C */ - { 0x00098F, 0x000990 }, /* 098F-0990 */ - { 0x000993, 0x0009A8 }, /* 0993-09A8 */ - { 0x0009AA, 0x0009B0 }, /* 09AA-09B0 */ - { 0x0009B2 }, /* 09B2 */ - { 0x0009B6, 0x0009B9 }, /* 09B6-09B9 */ - { 0x0009BE, 0x0009C0 }, /* 09BE-09C0 */ - { 0x0009C7, 0x0009C8 }, /* 09C7-09C8 */ - { 0x0009CB, 0x0009CC }, /* 09CB-09CC */ - { 0x0009D7 }, /* 09D7 */ - { 0x0009DC, 0x0009DD }, /* 09DC-09DD */ - { 0x0009DF, 0x0009E1 }, /* 09DF-09E1 */ - { 0x0009E6, 0x0009F1 }, /* 09E6-09F1 */ - { 0x0009F4, 0x0009FA }, /* 09F4-09FA */ - { 0x000A05, 0x000A0A }, /* 0A05-0A0A */ - { 0x000A0F, 0x000A10 }, /* 0A0F-0A10 */ - { 0x000A13, 0x000A28 }, /* 0A13-0A28 */ - { 0x000A2A, 0x000A30 }, /* 0A2A-0A30 */ - { 0x000A32, 0x000A33 }, /* 0A32-0A33 */ - { 0x000A35, 0x000A36 }, /* 0A35-0A36 */ - { 0x000A38, 0x000A39 }, /* 0A38-0A39 */ - { 0x000A3E, 0x000A40 }, /* 0A3E-0A40 */ - { 0x000A59, 0x000A5C }, /* 0A59-0A5C */ - { 0x000A5E }, /* 0A5E */ - { 0x000A66, 0x000A6F }, /* 0A66-0A6F */ - { 0x000A72, 0x000A74 }, /* 0A72-0A74 */ - { 0x000A83 }, /* 0A83 */ - { 0x000A85, 0x000A8B }, /* 0A85-0A8B */ - { 0x000A8D }, /* 0A8D */ - { 0x000A8F, 0x000A91 }, /* 0A8F-0A91 */ - { 0x000A93, 0x000AA8 }, /* 0A93-0AA8 */ - { 0x000AAA, 0x000AB0 }, /* 0AAA-0AB0 */ - { 0x000AB2, 0x000AB3 }, /* 0AB2-0AB3 */ - { 0x000AB5, 0x000AB9 }, /* 0AB5-0AB9 */ - { 0x000ABD, 0x000AC0 }, /* 0ABD-0AC0 */ - { 0x000AC9 }, /* 0AC9 */ - { 0x000ACB, 0x000ACC }, /* 0ACB-0ACC */ - { 0x000AD0 }, /* 0AD0 */ - { 0x000AE0 }, /* 0AE0 */ - { 0x000AE6, 0x000AEF }, /* 0AE6-0AEF */ - { 0x000B02, 0x000B03 }, /* 0B02-0B03 */ - { 0x000B05, 0x000B0C }, /* 0B05-0B0C */ - { 0x000B0F, 0x000B10 }, /* 0B0F-0B10 */ - { 0x000B13, 0x000B28 }, /* 0B13-0B28 */ - { 0x000B2A, 0x000B30 }, /* 0B2A-0B30 */ - { 0x000B32, 0x000B33 }, /* 0B32-0B33 */ - { 0x000B36, 0x000B39 }, /* 0B36-0B39 */ - { 0x000B3D, 0x000B3E }, /* 0B3D-0B3E */ - { 0x000B40 }, /* 0B40 */ - { 0x000B47, 0x000B48 }, /* 0B47-0B48 */ - { 0x000B4B, 0x000B4C }, /* 0B4B-0B4C */ - { 0x000B57 }, /* 0B57 */ - { 0x000B5C, 0x000B5D }, /* 0B5C-0B5D */ - { 0x000B5F, 0x000B61 }, /* 0B5F-0B61 */ - { 0x000B66, 0x000B70 }, /* 0B66-0B70 */ - { 0x000B83 }, /* 0B83 */ - { 0x000B85, 0x000B8A }, /* 0B85-0B8A */ - { 0x000B8E, 0x000B90 }, /* 0B8E-0B90 */ - { 0x000B92, 0x000B95 }, /* 0B92-0B95 */ - { 0x000B99, 0x000B9A }, /* 0B99-0B9A */ - { 0x000B9C }, /* 0B9C */ - { 0x000B9E, 0x000B9F }, /* 0B9E-0B9F */ - { 0x000BA3, 0x000BA4 }, /* 0BA3-0BA4 */ - { 0x000BA8, 0x000BAA }, /* 0BA8-0BAA */ - { 0x000BAE, 0x000BB5 }, /* 0BAE-0BB5 */ - { 0x000BB7, 0x000BB9 }, /* 0BB7-0BB9 */ - { 0x000BBE, 0x000BBF }, /* 0BBE-0BBF */ - { 0x000BC1, 0x000BC2 }, /* 0BC1-0BC2 */ - { 0x000BC6, 0x000BC8 }, /* 0BC6-0BC8 */ - { 0x000BCA, 0x000BCC }, /* 0BCA-0BCC */ - { 0x000BD7 }, /* 0BD7 */ - { 0x000BE7, 0x000BF2 }, /* 0BE7-0BF2 */ - { 0x000C01, 0x000C03 }, /* 0C01-0C03 */ - { 0x000C05, 0x000C0C }, /* 0C05-0C0C */ - { 0x000C0E, 0x000C10 }, /* 0C0E-0C10 */ - { 0x000C12, 0x000C28 }, /* 0C12-0C28 */ - { 0x000C2A, 0x000C33 }, /* 0C2A-0C33 */ - { 0x000C35, 0x000C39 }, /* 0C35-0C39 */ - { 0x000C41, 0x000C44 }, /* 0C41-0C44 */ - { 0x000C60, 0x000C61 }, /* 0C60-0C61 */ - { 0x000C66, 0x000C6F }, /* 0C66-0C6F */ - { 0x000C82, 0x000C83 }, /* 0C82-0C83 */ - { 0x000C85, 0x000C8C }, /* 0C85-0C8C */ - { 0x000C8E, 0x000C90 }, /* 0C8E-0C90 */ - { 0x000C92, 0x000CA8 }, /* 0C92-0CA8 */ - { 0x000CAA, 0x000CB3 }, /* 0CAA-0CB3 */ - { 0x000CB5, 0x000CB9 }, /* 0CB5-0CB9 */ - { 0x000CBE }, /* 0CBE */ - { 0x000CC0, 0x000CC4 }, /* 0CC0-0CC4 */ - { 0x000CC7, 0x000CC8 }, /* 0CC7-0CC8 */ - { 0x000CCA, 0x000CCB }, /* 0CCA-0CCB */ - { 0x000CD5, 0x000CD6 }, /* 0CD5-0CD6 */ - { 0x000CDE }, /* 0CDE */ - { 0x000CE0, 0x000CE1 }, /* 0CE0-0CE1 */ - { 0x000CE6, 0x000CEF }, /* 0CE6-0CEF */ - { 0x000D02, 0x000D03 }, /* 0D02-0D03 */ - { 0x000D05, 0x000D0C }, /* 0D05-0D0C */ - { 0x000D0E, 0x000D10 }, /* 0D0E-0D10 */ - { 0x000D12, 0x000D28 }, /* 0D12-0D28 */ - { 0x000D2A, 0x000D39 }, /* 0D2A-0D39 */ - { 0x000D3E, 0x000D40 }, /* 0D3E-0D40 */ - { 0x000D46, 0x000D48 }, /* 0D46-0D48 */ - { 0x000D4A, 0x000D4C }, /* 0D4A-0D4C */ - { 0x000D57 }, /* 0D57 */ - { 0x000D60, 0x000D61 }, /* 0D60-0D61 */ - { 0x000D66, 0x000D6F }, /* 0D66-0D6F */ - { 0x000D82, 0x000D83 }, /* 0D82-0D83 */ - { 0x000D85, 0x000D96 }, /* 0D85-0D96 */ - { 0x000D9A, 0x000DB1 }, /* 0D9A-0DB1 */ - { 0x000DB3, 0x000DBB }, /* 0DB3-0DBB */ - { 0x000DBD }, /* 0DBD */ - { 0x000DC0, 0x000DC6 }, /* 0DC0-0DC6 */ - { 0x000DCF, 0x000DD1 }, /* 0DCF-0DD1 */ - { 0x000DD8, 0x000DDF }, /* 0DD8-0DDF */ - { 0x000DF2, 0x000DF4 }, /* 0DF2-0DF4 */ - { 0x000E01, 0x000E30 }, /* 0E01-0E30 */ - { 0x000E32, 0x000E33 }, /* 0E32-0E33 */ - { 0x000E40, 0x000E46 }, /* 0E40-0E46 */ - { 0x000E4F, 0x000E5B }, /* 0E4F-0E5B */ - { 0x000E81, 0x000E82 }, /* 0E81-0E82 */ - { 0x000E84 }, /* 0E84 */ - { 0x000E87, 0x000E88 }, /* 0E87-0E88 */ - { 0x000E8A }, /* 0E8A */ - { 0x000E8D }, /* 0E8D */ - { 0x000E94, 0x000E97 }, /* 0E94-0E97 */ - { 0x000E99, 0x000E9F }, /* 0E99-0E9F */ - { 0x000EA1, 0x000EA3 }, /* 0EA1-0EA3 */ - { 0x000EA5 }, /* 0EA5 */ - { 0x000EA7 }, /* 0EA7 */ - { 0x000EAA, 0x000EAB }, /* 0EAA-0EAB */ - { 0x000EAD, 0x000EB0 }, /* 0EAD-0EB0 */ - { 0x000EB2, 0x000EB3 }, /* 0EB2-0EB3 */ - { 0x000EBD }, /* 0EBD */ - { 0x000EC0, 0x000EC4 }, /* 0EC0-0EC4 */ - { 0x000EC6 }, /* 0EC6 */ - { 0x000ED0, 0x000ED9 }, /* 0ED0-0ED9 */ - { 0x000EDC, 0x000EDD }, /* 0EDC-0EDD */ - { 0x000F00, 0x000F17 }, /* 0F00-0F17 */ - { 0x000F1A, 0x000F34 }, /* 0F1A-0F34 */ - { 0x000F36 }, /* 0F36 */ - { 0x000F38 }, /* 0F38 */ - { 0x000F3E, 0x000F47 }, /* 0F3E-0F47 */ - { 0x000F49, 0x000F6A }, /* 0F49-0F6A */ - { 0x000F7F }, /* 0F7F */ - { 0x000F85 }, /* 0F85 */ - { 0x000F88, 0x000F8B }, /* 0F88-0F8B */ - { 0x000FBE, 0x000FC5 }, /* 0FBE-0FC5 */ - { 0x000FC7, 0x000FCC }, /* 0FC7-0FCC */ - { 0x000FCF }, /* 0FCF */ - { 0x001000, 0x001021 }, /* 1000-1021 */ - { 0x001023, 0x001027 }, /* 1023-1027 */ - { 0x001029, 0x00102A }, /* 1029-102A */ - { 0x00102C }, /* 102C */ - { 0x001031 }, /* 1031 */ - { 0x001038 }, /* 1038 */ - { 0x001040, 0x001057 }, /* 1040-1057 */ - { 0x0010A0, 0x0010C5 }, /* 10A0-10C5 */ - { 0x0010D0, 0x0010F8 }, /* 10D0-10F8 */ - { 0x0010FB }, /* 10FB */ - { 0x001100, 0x001159 }, /* 1100-1159 */ - { 0x00115F, 0x0011A2 }, /* 115F-11A2 */ - { 0x0011A8, 0x0011F9 }, /* 11A8-11F9 */ - { 0x001200, 0x001206 }, /* 1200-1206 */ - { 0x001208, 0x001246 }, /* 1208-1246 */ - { 0x001248 }, /* 1248 */ - { 0x00124A, 0x00124D }, /* 124A-124D */ - { 0x001250, 0x001256 }, /* 1250-1256 */ - { 0x001258 }, /* 1258 */ - { 0x00125A, 0x00125D }, /* 125A-125D */ - { 0x001260, 0x001286 }, /* 1260-1286 */ - { 0x001288 }, /* 1288 */ - { 0x00128A, 0x00128D }, /* 128A-128D */ - { 0x001290, 0x0012AE }, /* 1290-12AE */ - { 0x0012B0 }, /* 12B0 */ - { 0x0012B2, 0x0012B5 }, /* 12B2-12B5 */ - { 0x0012B8, 0x0012BE }, /* 12B8-12BE */ - { 0x0012C0 }, /* 12C0 */ - { 0x0012C2, 0x0012C5 }, /* 12C2-12C5 */ - { 0x0012C8, 0x0012CE }, /* 12C8-12CE */ - { 0x0012D0, 0x0012D6 }, /* 12D0-12D6 */ - { 0x0012D8, 0x0012EE }, /* 12D8-12EE */ - { 0x0012F0, 0x00130E }, /* 12F0-130E */ - { 0x001310 }, /* 1310 */ - { 0x001312, 0x001315 }, /* 1312-1315 */ - { 0x001318, 0x00131E }, /* 1318-131E */ - { 0x001320, 0x001346 }, /* 1320-1346 */ - { 0x001348, 0x00135A }, /* 1348-135A */ - { 0x001361, 0x00137C }, /* 1361-137C */ - { 0x0013A0, 0x0013F4 }, /* 13A0-13F4 */ - { 0x001401, 0x001676 }, /* 1401-1676 */ - { 0x001681, 0x00169A }, /* 1681-169A */ - { 0x0016A0, 0x0016F0 }, /* 16A0-16F0 */ - { 0x001700, 0x00170C }, /* 1700-170C */ - { 0x00170E, 0x001711 }, /* 170E-1711 */ - { 0x001720, 0x001731 }, /* 1720-1731 */ - { 0x001735, 0x001736 }, /* 1735-1736 */ - { 0x001740, 0x001751 }, /* 1740-1751 */ - { 0x001760, 0x00176C }, /* 1760-176C */ - { 0x00176E, 0x001770 }, /* 176E-1770 */ - { 0x001780, 0x0017B6 }, /* 1780-17B6 */ - { 0x0017BE, 0x0017C5 }, /* 17BE-17C5 */ - { 0x0017C7, 0x0017C8 }, /* 17C7-17C8 */ - { 0x0017D4, 0x0017DA }, /* 17D4-17DA */ - { 0x0017DC }, /* 17DC */ - { 0x0017E0, 0x0017E9 }, /* 17E0-17E9 */ - { 0x001810, 0x001819 }, /* 1810-1819 */ - { 0x001820, 0x001877 }, /* 1820-1877 */ - { 0x001880, 0x0018A8 }, /* 1880-18A8 */ - { 0x001E00, 0x001E9B }, /* 1E00-1E9B */ - { 0x001EA0, 0x001EF9 }, /* 1EA0-1EF9 */ - { 0x001F00, 0x001F15 }, /* 1F00-1F15 */ - { 0x001F18, 0x001F1D }, /* 1F18-1F1D */ - { 0x001F20, 0x001F45 }, /* 1F20-1F45 */ - { 0x001F48, 0x001F4D }, /* 1F48-1F4D */ - { 0x001F50, 0x001F57 }, /* 1F50-1F57 */ - { 0x001F59 }, /* 1F59 */ - { 0x001F5B }, /* 1F5B */ - { 0x001F5D }, /* 1F5D */ - { 0x001F5F, 0x001F7D }, /* 1F5F-1F7D */ - { 0x001F80, 0x001FB4 }, /* 1F80-1FB4 */ - { 0x001FB6, 0x001FBC }, /* 1FB6-1FBC */ - { 0x001FBE }, /* 1FBE */ - { 0x001FC2, 0x001FC4 }, /* 1FC2-1FC4 */ - { 0x001FC6, 0x001FCC }, /* 1FC6-1FCC */ - { 0x001FD0, 0x001FD3 }, /* 1FD0-1FD3 */ - { 0x001FD6, 0x001FDB }, /* 1FD6-1FDB */ - { 0x001FE0, 0x001FEC }, /* 1FE0-1FEC */ - { 0x001FF2, 0x001FF4 }, /* 1FF2-1FF4 */ - { 0x001FF6, 0x001FFC }, /* 1FF6-1FFC */ - { 0x00200E }, /* 200E */ - { 0x002071 }, /* 2071 */ - { 0x00207F }, /* 207F */ - { 0x002102 }, /* 2102 */ - { 0x002107 }, /* 2107 */ - { 0x00210A, 0x002113 }, /* 210A-2113 */ - { 0x002115 }, /* 2115 */ - { 0x002119, 0x00211D }, /* 2119-211D */ - { 0x002124 }, /* 2124 */ - { 0x002126 }, /* 2126 */ - { 0x002128 }, /* 2128 */ - { 0x00212A, 0x00212D }, /* 212A-212D */ - { 0x00212F, 0x002131 }, /* 212F-2131 */ - { 0x002133, 0x002139 }, /* 2133-2139 */ - { 0x00213D, 0x00213F }, /* 213D-213F */ - { 0x002145, 0x002149 }, /* 2145-2149 */ - { 0x002160, 0x002183 }, /* 2160-2183 */ - { 0x002336, 0x00237A }, /* 2336-237A */ - { 0x002395 }, /* 2395 */ - { 0x00249C, 0x0024E9 }, /* 249C-24E9 */ - { 0x003005, 0x003007 }, /* 3005-3007 */ - { 0x003021, 0x003029 }, /* 3021-3029 */ - { 0x003031, 0x003035 }, /* 3031-3035 */ - { 0x003038, 0x00303C }, /* 3038-303C */ - { 0x003041, 0x003096 }, /* 3041-3096 */ - { 0x00309D, 0x00309F }, /* 309D-309F */ - { 0x0030A1, 0x0030FA }, /* 30A1-30FA */ - { 0x0030FC, 0x0030FF }, /* 30FC-30FF */ - { 0x003105, 0x00312C }, /* 3105-312C */ - { 0x003131, 0x00318E }, /* 3131-318E */ - { 0x003190, 0x0031B7 }, /* 3190-31B7 */ - { 0x0031F0, 0x00321C }, /* 31F0-321C */ - { 0x003220, 0x003243 }, /* 3220-3243 */ - { 0x003260, 0x00327B }, /* 3260-327B */ - { 0x00327F, 0x0032B0 }, /* 327F-32B0 */ - { 0x0032C0, 0x0032CB }, /* 32C0-32CB */ - { 0x0032D0, 0x0032FE }, /* 32D0-32FE */ - { 0x003300, 0x003376 }, /* 3300-3376 */ - { 0x00337B, 0x0033DD }, /* 337B-33DD */ - { 0x0033E0, 0x0033FE }, /* 33E0-33FE */ - { 0x003400, 0x004DB5 }, /* 3400-4DB5 */ - { 0x004E00, 0x009FA5 }, /* 4E00-9FA5 */ - { 0x00A000, 0x00A48C }, /* A000-A48C */ - { 0x00AC00, 0x00D7A3 }, /* AC00-D7A3 */ - { 0x00D800, 0x00FA2D }, /* D800-FA2D */ - { 0x00FA30, 0x00FA6A }, /* FA30-FA6A */ - { 0x00FB00, 0x00FB06 }, /* FB00-FB06 */ - { 0x00FB13, 0x00FB17 }, /* FB13-FB17 */ - { 0x00FF21, 0x00FF3A }, /* FF21-FF3A */ - { 0x00FF41, 0x00FF5A }, /* FF41-FF5A */ - { 0x00FF66, 0x00FFBE }, /* FF66-FFBE */ - { 0x00FFC2, 0x00FFC7 }, /* FFC2-FFC7 */ - { 0x00FFCA, 0x00FFCF }, /* FFCA-FFCF */ - { 0x00FFD2, 0x00FFD7 }, /* FFD2-FFD7 */ - { 0x00FFDA, 0x00FFDC }, /* FFDA-FFDC */ - { 0x010300, 0x01031E }, /* 10300-1031E */ - { 0x010320, 0x010323 }, /* 10320-10323 */ - { 0x010330, 0x01034A }, /* 10330-1034A */ - { 0x010400, 0x010425 }, /* 10400-10425 */ - { 0x010428, 0x01044D }, /* 10428-1044D */ - { 0x01D000, 0x01D0F5 }, /* 1D000-1D0F5 */ - { 0x01D100, 0x01D126 }, /* 1D100-1D126 */ - { 0x01D12A, 0x01D166 }, /* 1D12A-1D166 */ - { 0x01D16A, 0x01D172 }, /* 1D16A-1D172 */ - { 0x01D183, 0x01D184 }, /* 1D183-1D184 */ - { 0x01D18C, 0x01D1A9 }, /* 1D18C-1D1A9 */ - { 0x01D1AE, 0x01D1DD }, /* 1D1AE-1D1DD */ - { 0x01D400, 0x01D454 }, /* 1D400-1D454 */ - { 0x01D456, 0x01D49C }, /* 1D456-1D49C */ - { 0x01D49E, 0x01D49F }, /* 1D49E-1D49F */ - { 0x01D4A2 }, /* 1D4A2 */ - { 0x01D4A5, 0x01D4A6 }, /* 1D4A5-1D4A6 */ - { 0x01D4A9, 0x01D4AC }, /* 1D4A9-1D4AC */ - { 0x01D4AE, 0x01D4B9 }, /* 1D4AE-1D4B9 */ - { 0x01D4BB }, /* 1D4BB */ - { 0x01D4BD, 0x01D4C0 }, /* 1D4BD-1D4C0 */ - { 0x01D4C2, 0x01D4C3 }, /* 1D4C2-1D4C3 */ - { 0x01D4C5, 0x01D505 }, /* 1D4C5-1D505 */ - { 0x01D507, 0x01D50A }, /* 1D507-1D50A */ - { 0x01D50D, 0x01D514 }, /* 1D50D-1D514 */ - { 0x01D516, 0x01D51C }, /* 1D516-1D51C */ - { 0x01D51E, 0x01D539 }, /* 1D51E-1D539 */ - { 0x01D53B, 0x01D53E }, /* 1D53B-1D53E */ - { 0x01D540, 0x01D544 }, /* 1D540-1D544 */ - { 0x01D546 }, /* 1D546 */ - { 0x01D54A, 0x01D550 }, /* 1D54A-1D550 */ - { 0x01D552, 0x01D6A3 }, /* 1D552-1D6A3 */ - { 0x01D6A8, 0x01D7C9 }, /* 1D6A8-1D7C9 */ - { 0x020000, 0x02A6D6 }, /* 20000-2A6D6 */ - { 0x02F800, 0x02FA1D }, /* 2F800-2FA1D */ - { 0x0F0000, 0x0FFFFD }, /* F0000-FFFFD */ - { 0x100000, 0x10FFFD }, /* 100000-10FFFD */ - { 0 }, -}; - diff --git a/3rdParty/LibIDN/src/stringprep.c b/3rdParty/LibIDN/src/stringprep.c deleted file mode 100644 index 96fa316..0000000 --- a/3rdParty/LibIDN/src/stringprep.c +++ /dev/null @@ -1,675 +0,0 @@ -/* stringprep.c --- Core stringprep implementation. - * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Simon Josefsson - * - * This file is part of GNU Libidn. - * - * GNU Libidn is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * GNU Libidn 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with GNU Libidn; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - * - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdlib.h> -#include <string.h> - -#include "stringprep.h" - -static ssize_t -stringprep_find_character_in_table (uint32_t ucs4, - const Stringprep_table_element * table) -{ - ssize_t i; - - /* This is where typical uses of Libidn spends very close to all CPU - time and causes most cache misses. One could easily do a binary - search instead. Before rewriting this, I want hard evidence this - slowness is at all relevant in typical applications. (I don't - dispute optimization may improve matters significantly, I'm - mostly interested in having someone give real-world benchmark on - the impact of libidn.) */ - - for (i = 0; table[i].start || table[i].end; i++) - if (ucs4 >= table[i].start && - ucs4 <= (table[i].end ? table[i].end : table[i].start)) - return i; - - return -1; -} - -static ssize_t -stringprep_find_string_in_table (uint32_t * ucs4, - size_t ucs4len, - size_t * tablepos, - const Stringprep_table_element * table) -{ - size_t j; - ssize_t pos; - - for (j = 0; j < ucs4len; j++) - if ((pos = stringprep_find_character_in_table (ucs4[j], table)) != -1) - { - if (tablepos) - *tablepos = pos; - return j; - } - - return -1; -} - -static int -stringprep_apply_table_to_string (uint32_t * ucs4, - size_t * ucs4len, - size_t maxucs4len, - const Stringprep_table_element * table) -{ - ssize_t pos; - size_t i, maplen; - - while ((pos = stringprep_find_string_in_table (ucs4, *ucs4len, - &i, table)) != -1) - { - for (maplen = STRINGPREP_MAX_MAP_CHARS; - maplen > 0 && table[i].map[maplen - 1] == 0; maplen--) - ; - - if (*ucs4len - 1 + maplen >= maxucs4len) - return STRINGPREP_TOO_SMALL_BUFFER; - - memmove (&ucs4[pos + maplen], &ucs4[pos + 1], - sizeof (uint32_t) * (*ucs4len - pos - 1)); - memcpy (&ucs4[pos], table[i].map, sizeof (uint32_t) * maplen); - *ucs4len = *ucs4len - 1 + maplen; - } - - return STRINGPREP_OK; -} - -#define INVERTED(x) ((x) & ((~0UL) >> 1)) -#define UNAPPLICAPLEFLAGS(flags, profileflags) \ - ((!INVERTED(profileflags) && !(profileflags & flags) && profileflags) || \ - ( INVERTED(profileflags) && (profileflags & flags))) - -/** - * stringprep_4i - prepare internationalized string - * @ucs4: input/output array with string to prepare. - * @len: on input, length of input array with Unicode code points, - * on exit, length of output array with Unicode code points. - * @maxucs4len: maximum length of input/output array. - * @flags: a #Stringprep_profile_flags value, or 0. - * @profile: pointer to #Stringprep_profile to use. - * - * Prepare the input UCS-4 string according to the stringprep profile, - * and write back the result to the input string. - * - * The input is not required to be zero terminated (@ucs4[@len] = 0). - * The output will not be zero terminated unless @ucs4[@len] = 0. - * Instead, see stringprep_4zi() if your input is zero terminated or - * if you want the output to be. - * - * Since the stringprep operation can expand the string, @maxucs4len - * indicate how large the buffer holding the string is. This function - * will not read or write to code points outside that size. - * - * The @flags are one of #Stringprep_profile_flags values, or 0. - * - * The @profile contain the #Stringprep_profile instructions to - * perform. Your application can define new profiles, possibly - * re-using the generic stringprep tables that always will be part of - * the library, or use one of the currently supported profiles. - * - * Return value: Returns %STRINGPREP_OK iff successful, or an - * #Stringprep_rc error code. - **/ -int -stringprep_4i (uint32_t * ucs4, size_t * len, size_t maxucs4len, - Stringprep_profile_flags flags, - const Stringprep_profile * profile) -{ - size_t i, j; - ssize_t k; - size_t ucs4len = *len; - int rc; - - for (i = 0; profile[i].operation; i++) - { - switch (profile[i].operation) - { - case STRINGPREP_NFKC: - { - uint32_t *q = 0; - - if (UNAPPLICAPLEFLAGS (flags, profile[i].flags)) - break; - - if (flags & STRINGPREP_NO_NFKC && !profile[i].flags) - /* Profile requires NFKC, but callee asked for no NFKC. */ - return STRINGPREP_FLAG_ERROR; - - q = stringprep_ucs4_nfkc_normalize (ucs4, ucs4len); - if (!q) - return STRINGPREP_NFKC_FAILED; - - for (ucs4len = 0; q[ucs4len]; ucs4len++) - ; - - if (ucs4len >= maxucs4len) - { - free (q); - return STRINGPREP_TOO_SMALL_BUFFER; - } - - memcpy (ucs4, q, ucs4len * sizeof (ucs4[0])); - - free (q); - } - break; - - case STRINGPREP_PROHIBIT_TABLE: - k = stringprep_find_string_in_table (ucs4, ucs4len, - NULL, profile[i].table); - if (k != -1) - return STRINGPREP_CONTAINS_PROHIBITED; - break; - - case STRINGPREP_UNASSIGNED_TABLE: - if (UNAPPLICAPLEFLAGS (flags, profile[i].flags)) - break; - if (flags & STRINGPREP_NO_UNASSIGNED) - { - k = stringprep_find_string_in_table - (ucs4, ucs4len, NULL, profile[i].table); - if (k != -1) - return STRINGPREP_CONTAINS_UNASSIGNED; - } - break; - - case STRINGPREP_MAP_TABLE: - if (UNAPPLICAPLEFLAGS (flags, profile[i].flags)) - break; - rc = stringprep_apply_table_to_string - (ucs4, &ucs4len, maxucs4len, profile[i].table); - if (rc != STRINGPREP_OK) - return rc; - break; - - case STRINGPREP_BIDI_PROHIBIT_TABLE: - case STRINGPREP_BIDI_RAL_TABLE: - case STRINGPREP_BIDI_L_TABLE: - break; - - case STRINGPREP_BIDI: - { - int done_prohibited = 0; - int done_ral = 0; - int done_l = 0; - size_t contains_ral = SIZE_MAX; - size_t contains_l = SIZE_MAX; - - for (j = 0; profile[j].operation; j++) - if (profile[j].operation == STRINGPREP_BIDI_PROHIBIT_TABLE) - { - done_prohibited = 1; - k = stringprep_find_string_in_table (ucs4, ucs4len, - NULL, - profile[j].table); - if (k != -1) - return STRINGPREP_BIDI_CONTAINS_PROHIBITED; - } - else if (profile[j].operation == STRINGPREP_BIDI_RAL_TABLE) - { - done_ral = 1; - if (stringprep_find_string_in_table - (ucs4, ucs4len, NULL, profile[j].table) != -1) - contains_ral = j; - } - else if (profile[j].operation == STRINGPREP_BIDI_L_TABLE) - { - done_l = 1; - if (stringprep_find_string_in_table - (ucs4, ucs4len, NULL, profile[j].table) != -1) - contains_l = j; - } - - if (!done_prohibited || !done_ral || !done_l) - return STRINGPREP_PROFILE_ERROR; - - if (contains_ral != SIZE_MAX && contains_l != SIZE_MAX) - return STRINGPREP_BIDI_BOTH_L_AND_RAL; - - if (contains_ral != SIZE_MAX) - { - if (!(stringprep_find_character_in_table - (ucs4[0], profile[contains_ral].table) != -1 && - stringprep_find_character_in_table - (ucs4[ucs4len - 1], profile[contains_ral].table) != -1)) - return STRINGPREP_BIDI_LEADTRAIL_NOT_RAL; - } - } - break; - - default: - return STRINGPREP_PROFILE_ERROR; - break; - } - } - - *len = ucs4len; - - return STRINGPREP_OK; -} - -static int -stringprep_4zi_1 (uint32_t * ucs4, size_t ucs4len, size_t maxucs4len, - Stringprep_profile_flags flags, - const Stringprep_profile * profile) -{ - int rc; - - rc = stringprep_4i (ucs4, &ucs4len, maxucs4len, flags, profile); - if (rc != STRINGPREP_OK) - return rc; - - if (ucs4len >= maxucs4len) - return STRINGPREP_TOO_SMALL_BUFFER; - - ucs4[ucs4len] = 0; - - return STRINGPREP_OK; -} - -/** - * stringprep_4zi - prepare internationalized string - * @ucs4: input/output array with zero terminated string to prepare. - * @maxucs4len: maximum length of input/output array. - * @flags: a #Stringprep_profile_flags value, or 0. - * @profile: pointer to #Stringprep_profile to use. - * - * Prepare the input zero terminated UCS-4 string according to the - * stringprep profile, and write back the result to the input string. - * - * Since the stringprep operation can expand the string, @maxucs4len - * indicate how large the buffer holding the string is. This function - * will not read or write to code points outside that size. - * - * The @flags are one of #Stringprep_profile_flags values, or 0. - * - * The @profile contain the #Stringprep_profile instructions to - * perform. Your application can define new profiles, possibly - * re-using the generic stringprep tables that always will be part of - * the library, or use one of the currently supported profiles. - * - * Return value: Returns %STRINGPREP_OK iff successful, or an - * #Stringprep_rc error code. - **/ -int -stringprep_4zi (uint32_t * ucs4, size_t maxucs4len, - Stringprep_profile_flags flags, - const Stringprep_profile * profile) -{ - size_t ucs4len; - - for (ucs4len = 0; ucs4len < maxucs4len && ucs4[ucs4len] != 0; ucs4len++) - ; - - return stringprep_4zi_1 (ucs4, ucs4len, maxucs4len, flags, profile); -} - -/** - * stringprep - prepare internationalized string - * @in: input/ouput array with string to prepare. - * @maxlen: maximum length of input/output array. - * @flags: a #Stringprep_profile_flags value, or 0. - * @profile: pointer to #Stringprep_profile to use. - * - * Prepare the input zero terminated UTF-8 string according to the - * stringprep profile, and write back the result to the input string. - * - * Note that you must convert strings entered in the systems locale - * into UTF-8 before using this function, see - * stringprep_locale_to_utf8(). - * - * Since the stringprep operation can expand the string, @maxlen - * indicate how large the buffer holding the string is. This function - * will not read or write to characters outside that size. - * - * The @flags are one of #Stringprep_profile_flags values, or 0. - * - * The @profile contain the #Stringprep_profile instructions to - * perform. Your application can define new profiles, possibly - * re-using the generic stringprep tables that always will be part of - * the library, or use one of the currently supported profiles. - * - * Return value: Returns %STRINGPREP_OK iff successful, or an error code. - **/ -int -stringprep (char *in, - size_t maxlen, - Stringprep_profile_flags flags, - const Stringprep_profile * profile) -{ - int rc; - char *utf8 = NULL; - uint32_t *ucs4 = NULL; - size_t ucs4len, maxucs4len, adducs4len = 50; - - do - { - uint32_t *newp; - - if (ucs4) - free (ucs4); - ucs4 = stringprep_utf8_to_ucs4 (in, -1, &ucs4len); - maxucs4len = ucs4len + adducs4len; - newp = realloc (ucs4, maxucs4len * sizeof (uint32_t)); - if (!newp) - { - free (ucs4); - return STRINGPREP_MALLOC_ERROR; - } - ucs4 = newp; - - rc = stringprep_4i (ucs4, &ucs4len, maxucs4len, flags, profile); - adducs4len += 50; - } - while (rc == STRINGPREP_TOO_SMALL_BUFFER); - if (rc != STRINGPREP_OK) - { - free (ucs4); - return rc; - } - - utf8 = stringprep_ucs4_to_utf8 (ucs4, ucs4len, 0, 0); - free (ucs4); - if (!utf8) - return STRINGPREP_MALLOC_ERROR; - - if (strlen (utf8) >= maxlen) - { - free (utf8); - return STRINGPREP_TOO_SMALL_BUFFER; - } - - strcpy (in, utf8); /* flawfinder: ignore */ - - free (utf8); - - return STRINGPREP_OK; -} - -/** - * stringprep_profile - prepare internationalized string - * @in: input array with UTF-8 string to prepare. - * @out: output variable with pointer to newly allocate string. - * @profile: name of stringprep profile to use. - * @flags: a #Stringprep_profile_flags value, or 0. - * - * Prepare the input zero terminated UTF-8 string according to the - * stringprep profile, and return the result in a newly allocated - * variable. - * - * Note that you must convert strings entered in the systems locale - * into UTF-8 before using this function, see - * stringprep_locale_to_utf8(). - * - * The output @out variable must be deallocated by the caller. - * - * The @flags are one of #Stringprep_profile_flags values, or 0. - * - * The @profile specifies the name of the stringprep profile to use. - * It must be one of the internally supported stringprep profiles. - * - * Return value: Returns %STRINGPREP_OK iff successful, or an error code. - **/ -int -stringprep_profile (const char *in, - char **out, - const char *profile, Stringprep_profile_flags flags) -{ - const Stringprep_profiles *p; - char *str = NULL; - size_t len = strlen (in) + 1; - int rc; - - for (p = &stringprep_profiles[0]; p->name; p++) - if (strcmp (p->name, profile) == 0) - break; - - if (!p || !p->name || !p->tables) - return STRINGPREP_UNKNOWN_PROFILE; - - do - { - if (str) - free (str); - str = (char *) malloc (len); - if (str == NULL) - return STRINGPREP_MALLOC_ERROR; - - strcpy (str, in); - - rc = stringprep (str, len, flags, p->tables); - len += 50; - } - while (rc == STRINGPREP_TOO_SMALL_BUFFER); - - if (rc == STRINGPREP_OK) - *out = str; - else - free (str); - - return rc; -} - -/*! \mainpage GNU Internationalized Domain Name Library - * - * \section intro Introduction - * - * GNU Libidn is an implementation of the Stringprep, Punycode and IDNA - * specifications defined by the IETF Internationalized Domain Names - * (IDN) working group, used for internationalized domain names. The - * package is available under the GNU Lesser General Public License. - * - * The library contains a generic Stringprep implementation that does - * Unicode 3.2 NFKC normalization, mapping and prohibitation of - * characters, and bidirectional character handling. Profiles for - * Nameprep, iSCSI, SASL and XMPP are included. Punycode and ASCII - * Compatible Encoding (ACE) via IDNA are supported. A mechanism to - * define Top-Level Domain (TLD) specific validation tables, and to - * compare strings against those tables, is included. Default tables - * for some TLDs are also included. - * - * The Stringprep API consists of two main functions, one for - * converting data from the system's native representation into UTF-8, - * and one function to perform the Stringprep processing. Adding a - * new Stringprep profile for your application within the API is - * straightforward. The Punycode API consists of one encoding - * function and one decoding function. The IDNA API consists of the - * ToASCII and ToUnicode functions, as well as an high-level interface - * for converting entire domain names to and from the ACE encoded - * form. The TLD API consists of one set of functions to extract the - * TLD name from a domain string, one set of functions to locate the - * proper TLD table to use based on the TLD name, and core functions - * to validate a string against a TLD table, and some utility wrappers - * to perform all the steps in one call. - * - * The library is used by, e.g., GNU SASL and Shishi to process user - * names and passwords. Libidn can be built into GNU Libc to enable a - * new system-wide getaddrinfo() flag for IDN processing. - * - * Libidn is developed for the GNU/Linux system, but runs on over 20 Unix - * platforms (including Solaris, IRIX, AIX, and Tru64) and Windows. - * Libidn is written in C and (parts of) the API is accessible from C, - * C++, Emacs Lisp, Python and Java. - * - * The project web page:\n - * http://www.gnu.org/software/libidn/ - * - * The software archive:\n - * ftp://alpha.gnu.org/pub/gnu/libidn/ - * - * For more information see:\n - * http://www.ietf.org/html.charters/idn-charter.html\n - * http://www.ietf.org/rfc/rfc3454.txt (stringprep specification)\n - * http://www.ietf.org/rfc/rfc3490.txt (idna specification)\n - * http://www.ietf.org/rfc/rfc3491.txt (nameprep specification)\n - * http://www.ietf.org/rfc/rfc3492.txt (punycode specification)\n - * http://www.ietf.org/internet-drafts/draft-ietf-ips-iscsi-string-prep-04.txt\n - * http://www.ietf.org/internet-drafts/draft-ietf-krb-wg-utf8-profile-01.txt\n - * http://www.ietf.org/internet-drafts/draft-ietf-sasl-anon-00.txt\n - * http://www.ietf.org/internet-drafts/draft-ietf-sasl-saslprep-00.txt\n - * http://www.ietf.org/internet-drafts/draft-ietf-xmpp-nodeprep-01.txt\n - * http://www.ietf.org/internet-drafts/draft-ietf-xmpp-resourceprep-01.txt\n - * - * Further information and paid contract development:\n - * Simon Josefsson <simon@josefsson.org> - * - * \section examples Examples - * - * \include example.c - * \include example3.c - * \include example4.c - * \include example5.c - */ - -/** - * STRINGPREP_VERSION - * - * String defined via CPP denoting the header file version number. - * Used together with stringprep_check_version() to verify header file - * and run-time library consistency. - */ - -/** - * STRINGPREP_MAX_MAP_CHARS - * - * Maximum number of code points that can replace a single code point, - * during stringprep mapping. - */ - -/** - * Stringprep_rc: - * @STRINGPREP_OK: Successful operation. This value is guaranteed to - * always be zero, the remaining ones are only guaranteed to hold - * non-zero values, for logical comparison purposes. - * @STRINGPREP_CONTAINS_UNASSIGNED: String contain unassigned Unicode - * code points, which is forbidden by the profile. - * @STRINGPREP_CONTAINS_PROHIBITED: String contain code points - * prohibited by the profile. - * @STRINGPREP_BIDI_BOTH_L_AND_RAL: String contain code points with - * conflicting bidirection category. - * @STRINGPREP_BIDI_LEADTRAIL_NOT_RAL: Leading and trailing character - * in string not of proper bidirectional category. - * @STRINGPREP_BIDI_CONTAINS_PROHIBITED: Contains prohibited code - * points detected by bidirectional code. - * @STRINGPREP_TOO_SMALL_BUFFER: Buffer handed to function was too - * small. This usually indicate a problem in the calling - * application. - * @STRINGPREP_PROFILE_ERROR: The stringprep profile was inconsistent. - * This usually indicate an internal error in the library. - * @STRINGPREP_FLAG_ERROR: The supplied flag conflicted with profile. - * This usually indicate a problem in the calling application. - * @STRINGPREP_UNKNOWN_PROFILE: The supplied profile name was not - * known to the library. - * @STRINGPREP_NFKC_FAILED: The Unicode NFKC operation failed. This - * usually indicate an internal error in the library. - * @STRINGPREP_MALLOC_ERROR: The malloc() was out of memory. This is - * usually a fatal error. - * - * Enumerated return codes of stringprep(), stringprep_profile() - * functions (and macros using those functions). The value 0 is - * guaranteed to always correspond to success. - */ - -/** - * Stringprep_profile_flags: - * @STRINGPREP_NO_NFKC: Disable the NFKC normalization, as well as - * selecting the non-NFKC case folding tables. Usually the profile - * specifies BIDI and NFKC settings, and applications should not - * override it unless in special situations. - * @STRINGPREP_NO_BIDI: Disable the BIDI step. Usually the profile - * specifies BIDI and NFKC settings, and applications should not - * override it unless in special situations. - * @STRINGPREP_NO_UNASSIGNED: Make the library return with an error if - * string contains unassigned characters according to profile. - * - * Stringprep profile flags. - */ - -/** - * Stringprep_profile_steps: - * - * Various steps in the stringprep algorithm. You really want to - * study the source code to understand this one. Only useful if you - * want to add another profile. - */ - -/** - * stringprep_nameprep: - * @in: input/ouput array with string to prepare. - * @maxlen: maximum length of input/output array. - * - * Prepare the input UTF-8 string according to the nameprep profile. - * The AllowUnassigned flag is true, use - * stringprep_nameprep_no_unassigned() if you want a false - * AllowUnassigned. Returns 0 iff successful, or an error code. - **/ - -/** - * stringprep_nameprep_no_unassigned: - * @in: input/ouput array with string to prepare. - * @maxlen: maximum length of input/output array. - * - * Prepare the input UTF-8 string according to the nameprep profile. - * The AllowUnassigned flag is false, use stringprep_nameprep() for - * true AllowUnassigned. Returns 0 iff successful, or an error code. - **/ - -/** - * stringprep_iscsi: - * @in: input/ouput array with string to prepare. - * @maxlen: maximum length of input/output array. - * - * Prepare the input UTF-8 string according to the draft iSCSI - * stringprep profile. Returns 0 iff successful, or an error code. - **/ - -/** - * stringprep_plain: - * @in: input/ouput array with string to prepare. - * @maxlen: maximum length of input/output array. - * - * Prepare the input UTF-8 string according to the draft SASL - * ANONYMOUS profile. Returns 0 iff successful, or an error code. - **/ - -/** - * stringprep_xmpp_nodeprep: - * @in: input/ouput array with string to prepare. - * @maxlen: maximum length of input/output array. - * - * Prepare the input UTF-8 string according to the draft XMPP node - * identifier profile. Returns 0 iff successful, or an error code. - **/ - -/** - * stringprep_xmpp_resourceprep: - * @in: input/ouput array with string to prepare. - * @maxlen: maximum length of input/output array. - * - * Prepare the input UTF-8 string according to the draft XMPP resource - * identifier profile. Returns 0 iff successful, or an error code. - **/ diff --git a/3rdParty/LibIDN/src/stringprep.h b/3rdParty/LibIDN/src/stringprep.h deleted file mode 100644 index fa822e8..0000000 --- a/3rdParty/LibIDN/src/stringprep.h +++ /dev/null @@ -1,233 +0,0 @@ -/* stringprep.h --- Header file for stringprep functions. - * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Simon Josefsson - * - * This file is part of GNU Libidn. - * - * GNU Libidn is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * GNU Libidn 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with GNU Libidn; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - * - */ - -#ifndef STRINGPREP_H -# define STRINGPREP_H - -# include <stddef.h> /* size_t */ -# include <unistd.h> /* ssize_t */ -# include <idn-int.h> /* uint32_t */ - -/* Libidn Windows DLL. Only needed when this file is used in Visual - Studio. Export and import happens automatically in MinGW. */ -# ifndef IDNA_API -# if defined(_MSC_VER) && !defined(IDNA_STATIC) -# ifdef IDNA_EXPORTS -# define IDNA_API __declspec(dllexport) -# else -# define IDNA_API __declspec(dllimport) -# endif -# else -# define IDNA_API -# endif -# endif - -# ifdef __cplusplus -extern "C" -{ -# endif - -# define STRINGPREP_VERSION "1.11" - -/* Error codes. */ - typedef enum - { - STRINGPREP_OK = 0, - /* Stringprep errors. */ - STRINGPREP_CONTAINS_UNASSIGNED = 1, - STRINGPREP_CONTAINS_PROHIBITED = 2, - STRINGPREP_BIDI_BOTH_L_AND_RAL = 3, - STRINGPREP_BIDI_LEADTRAIL_NOT_RAL = 4, - STRINGPREP_BIDI_CONTAINS_PROHIBITED = 5, - /* Error in calling application. */ - STRINGPREP_TOO_SMALL_BUFFER = 100, - STRINGPREP_PROFILE_ERROR = 101, - STRINGPREP_FLAG_ERROR = 102, - STRINGPREP_UNKNOWN_PROFILE = 103, - /* Internal errors. */ - STRINGPREP_NFKC_FAILED = 200, - STRINGPREP_MALLOC_ERROR = 201 - } Stringprep_rc; - -/* Flags used when calling stringprep(). */ - typedef enum - { - STRINGPREP_NO_NFKC = 1, - STRINGPREP_NO_BIDI = 2, - STRINGPREP_NO_UNASSIGNED = 4 - } Stringprep_profile_flags; - -/* Steps in a stringprep profile. */ - typedef enum - { - STRINGPREP_NFKC = 1, - STRINGPREP_BIDI = 2, - STRINGPREP_MAP_TABLE = 3, - STRINGPREP_UNASSIGNED_TABLE = 4, - STRINGPREP_PROHIBIT_TABLE = 5, - STRINGPREP_BIDI_PROHIBIT_TABLE = 6, - STRINGPREP_BIDI_RAL_TABLE = 7, - STRINGPREP_BIDI_L_TABLE = 8 - } Stringprep_profile_steps; - -# define STRINGPREP_MAX_MAP_CHARS 4 - - struct Stringprep_table_element - { - uint32_t start; - uint32_t end; /* 0 if only one character */ - uint32_t map[STRINGPREP_MAX_MAP_CHARS]; /* NULL if end is not 0 */ - }; - typedef struct Stringprep_table_element Stringprep_table_element; - - struct Stringprep_table - { - Stringprep_profile_steps operation; - Stringprep_profile_flags flags; - const Stringprep_table_element *table; - }; - typedef struct Stringprep_table Stringprep_profile; - - struct Stringprep_profiles - { - const char *name; - const Stringprep_profile *tables; - }; - typedef struct Stringprep_profiles Stringprep_profiles; - - extern IDNA_API const Stringprep_profiles stringprep_profiles[]; - -/* Profiles */ - extern IDNA_API const Stringprep_table_element stringprep_rfc3454_A_1[]; - extern IDNA_API const Stringprep_table_element stringprep_rfc3454_B_1[]; - extern IDNA_API const Stringprep_table_element stringprep_rfc3454_B_2[]; - extern IDNA_API const Stringprep_table_element stringprep_rfc3454_B_3[]; - extern IDNA_API const Stringprep_table_element stringprep_rfc3454_C_1_1[]; - extern IDNA_API const Stringprep_table_element stringprep_rfc3454_C_1_2[]; - extern IDNA_API const Stringprep_table_element stringprep_rfc3454_C_2_1[]; - extern IDNA_API const Stringprep_table_element stringprep_rfc3454_C_2_2[]; - extern IDNA_API const Stringprep_table_element stringprep_rfc3454_C_3[]; - extern IDNA_API const Stringprep_table_element stringprep_rfc3454_C_4[]; - extern IDNA_API const Stringprep_table_element stringprep_rfc3454_C_5[]; - extern IDNA_API const Stringprep_table_element stringprep_rfc3454_C_6[]; - extern IDNA_API const Stringprep_table_element stringprep_rfc3454_C_7[]; - extern IDNA_API const Stringprep_table_element stringprep_rfc3454_C_8[]; - extern IDNA_API const Stringprep_table_element stringprep_rfc3454_C_9[]; - extern IDNA_API const Stringprep_table_element stringprep_rfc3454_D_1[]; - extern IDNA_API const Stringprep_table_element stringprep_rfc3454_D_2[]; - - /* Nameprep */ - - extern IDNA_API const Stringprep_profile stringprep_nameprep[]; - -# define stringprep_nameprep(in, maxlen) \ - stringprep(in, maxlen, 0, stringprep_nameprep) - -# define stringprep_nameprep_no_unassigned(in, maxlen) \ - stringprep(in, maxlen, STRINGPREP_NO_UNASSIGNED, stringprep_nameprep) - - /* SASL */ - - extern IDNA_API const Stringprep_profile stringprep_saslprep[]; - extern IDNA_API const Stringprep_profile stringprep_plain[]; - extern IDNA_API const Stringprep_profile stringprep_trace[]; - -# define stringprep_plain(in, maxlen) \ - stringprep(in, maxlen, 0, stringprep_plain) - - /* Kerberos */ - - extern IDNA_API const Stringprep_profile stringprep_kerberos5[]; - -# define stringprep_kerberos5(in, maxlen) \ - stringprep(in, maxlen, 0, stringprep_kerberos5) - - /* XMPP */ - - extern IDNA_API const Stringprep_profile stringprep_xmpp_nodeprep[]; - extern IDNA_API const Stringprep_profile stringprep_xmpp_resourceprep[]; - extern IDNA_API const Stringprep_table_element stringprep_xmpp_nodeprep_prohibit[]; - -# define stringprep_xmpp_nodeprep(in, maxlen) \ - stringprep(in, maxlen, 0, stringprep_xmpp_nodeprep) -# define stringprep_xmpp_resourceprep(in, maxlen) \ - stringprep(in, maxlen, 0, stringprep_xmpp_resourceprep) - - /* iSCSI */ - - extern IDNA_API const Stringprep_profile stringprep_iscsi[]; - -# define stringprep_iscsi(in, maxlen) \ - stringprep(in, maxlen, 0, stringprep_iscsi) - - /* API */ - - extern IDNA_API int stringprep_4i (uint32_t * ucs4, size_t * len, - size_t maxucs4len, - Stringprep_profile_flags flags, - const Stringprep_profile * profile); - extern IDNA_API int stringprep_4zi (uint32_t * ucs4, size_t maxucs4len, - Stringprep_profile_flags flags, - const Stringprep_profile * profile); - extern IDNA_API int stringprep (char *in, size_t maxlen, - Stringprep_profile_flags flags, - const Stringprep_profile * profile); - - extern IDNA_API int stringprep_profile (const char *in, - char **out, - const char *profile, - Stringprep_profile_flags flags); - - extern IDNA_API const char *stringprep_strerror (Stringprep_rc rc); - - extern IDNA_API const char *stringprep_check_version (const char - *req_version); - -/* Utility */ - - extern IDNA_API int stringprep_unichar_to_utf8 (uint32_t c, char *outbuf); - extern IDNA_API uint32_t stringprep_utf8_to_unichar (const char *p); - - extern IDNA_API uint32_t *stringprep_utf8_to_ucs4 (const char *str, - ssize_t len, - size_t * items_written); - extern IDNA_API char *stringprep_ucs4_to_utf8 (const uint32_t * str, - ssize_t len, - size_t * items_read, - size_t * items_written); - - extern IDNA_API char *stringprep_utf8_nfkc_normalize (const char *str, - ssize_t len); - extern IDNA_API uint32_t *stringprep_ucs4_nfkc_normalize (uint32_t * str, - ssize_t len); - - extern IDNA_API const char *stringprep_locale_charset (void); - extern IDNA_API char *stringprep_convert (const char *str, - const char *to_codeset, - const char *from_codeset); - extern IDNA_API char *stringprep_locale_to_utf8 (const char *str); - extern IDNA_API char *stringprep_utf8_to_locale (const char *str); - -# ifdef __cplusplus -} -# endif - -#endif /* STRINGPREP_H */ diff --git a/3rdParty/LibIDN/src/toutf8.c b/3rdParty/LibIDN/src/toutf8.c deleted file mode 100644 index 0d82717..0000000 --- a/3rdParty/LibIDN/src/toutf8.c +++ /dev/null @@ -1,156 +0,0 @@ -/* toutf8.c --- Convert strings from system locale into UTF-8. - * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Simon Josefsson - * - * This file is part of GNU Libidn. - * - * GNU Libidn is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * GNU Libidn 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with GNU Libidn; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - * - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -/* Get prototypes. */ -#include "stringprep.h" - -/* Get fprintf. */ -#include <stdio.h> - -/* Get getenv. */ -#include <stdlib.h> - -/* Get strlen. */ -#include <string.h> - -/* Get iconv_string. */ -#include "striconv.h" - -#ifdef _LIBC -# define HAVE_ICONV 1 -# define HAVE_LOCALE_H 1 -# define HAVE_LANGINFO_CODESET 1 -#endif - -#if HAVE_LOCALE_H -# include <locale.h> -#endif - -#if HAVE_LANGINFO_CODESET -# include <langinfo.h> -#endif - -#ifdef _LIBC -# define stringprep_locale_charset() nl_langinfo (CODESET) -#else -/** - * stringprep_locale_charset - return charset used in current locale - * - * Find out current locale charset. The function respect the CHARSET - * environment variable, but typically uses nl_langinfo(CODESET) when - * it is supported. It fall back on "ASCII" if CHARSET isn't set and - * nl_langinfo isn't supported or return anything. - * - * Note that this function return the application's locale's preferred - * charset (or thread's locale's preffered charset, if your system - * support thread-specific locales). It does not return what the - * system may be using. Thus, if you receive data from external - * sources you cannot in general use this function to guess what - * charset it is encoded in. Use stringprep_convert from the external - * representation into the charset returned by this function, to have - * data in the locale encoding. - * - * Return value: Return the character set used by the current locale. - * It will never return NULL, but use "ASCII" as a fallback. - **/ -const char * -stringprep_locale_charset (void) -{ - const char *charset = getenv ("CHARSET"); /* flawfinder: ignore */ - - if (charset && *charset) - return charset; - -# ifdef HAVE_LANGINFO_CODESET - charset = nl_langinfo (CODESET); - - if (charset && *charset) - return charset; -# endif - - return "ASCII"; -} -#endif - -/** - * stringprep_convert - encode string using new character set - * @str: input zero-terminated string. - * @to_codeset: name of destination character set. - * @from_codeset: name of origin character set, as used by @str. - * - * Convert the string from one character set to another using the - * system's iconv() function. - * - * Return value: Returns newly allocated zero-terminated string which - * is @str transcoded into to_codeset. - **/ -char * -stringprep_convert (const char *str, - const char *to_codeset, const char *from_codeset) -{ -#if HAVE_ICONV - return str_iconv (str, from_codeset, to_codeset); -#else - char *p; - fprintf (stderr, "libidn: warning: libiconv not installed, cannot " - "convert data to UTF-8\n"); - p = malloc (strlen (str) + 1); - if (!p) - return NULL; - return strcpy (p, str); -#endif -} - -/** - * stringprep_locale_to_utf8 - convert locale encoded string to UTF-8 - * @str: input zero terminated string. - * - * Convert string encoded in the locale's character set into UTF-8 by - * using stringprep_convert(). - * - * Return value: Returns newly allocated zero-terminated string which - * is @str transcoded into UTF-8. - **/ -char * -stringprep_locale_to_utf8 (const char *str) -{ - return stringprep_convert (str, "UTF-8", stringprep_locale_charset ()); -} - -/** - * stringprep_utf8_to_locale - encode UTF-8 string to locale encoding - * @str: input zero terminated string. - * - * Convert string encoded in UTF-8 into the locale's character set by - * using stringprep_convert(). - * - * Return value: Returns newly allocated zero-terminated string which - * is @str transcoded into the locale's character set. - **/ -char * -stringprep_utf8_to_locale (const char *str) -{ - return stringprep_convert (str, stringprep_locale_charset (), "UTF-8"); -} diff --git a/3rdParty/LibIDN/stubs/striconv.h b/3rdParty/LibIDN/stubs/striconv.h deleted file mode 100644 index e69de29..0000000 --- a/3rdParty/LibIDN/stubs/striconv.h +++ /dev/null diff --git a/3rdParty/LibIDN/stubs/win32/inttypes.h b/3rdParty/LibIDN/stubs/win32/inttypes.h deleted file mode 100644 index e69de29..0000000 --- a/3rdParty/LibIDN/stubs/win32/inttypes.h +++ /dev/null diff --git a/3rdParty/LibIDN/stubs/win32/stdint.h b/3rdParty/LibIDN/stubs/win32/stdint.h deleted file mode 100644 index 6a57ff9..0000000 --- a/3rdParty/LibIDN/stubs/win32/stdint.h +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 2008 Free Software Foundation, Inc. - Written by Adam Strzelecki <ono@java.pl> - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License - as published by the Free Software Foundation; either version 2.1, - 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ - -#ifndef _AC_STDINT_H -#define _AC_STDINT_H 1 -#ifndef _GENERATED_STDINT_H -#define _GENERATED_STDINT_H - -#define uint8_t unsigned char -#define uint16_t unsigned short -#define uint32_t unsigned int -#define int8_t signed char -#define int16_t signed short -#define int32_t signed int - -#define gint16 int16_t - -#ifdef _WIN64 -typedef __int64 ssize_t; -#else -typedef _W64 int ssize_t; -#endif - -#endif -#endif diff --git a/3rdParty/LibIDN/stubs/win32/unistd.h b/3rdParty/LibIDN/stubs/win32/unistd.h deleted file mode 100644 index 0d2bb16..0000000 --- a/3rdParty/LibIDN/stubs/win32/unistd.h +++ /dev/null @@ -1 +0,0 @@ -/* Dummy file to satisfy source file dependencies on Windows platform */ diff --git a/3rdParty/SCons b/3rdParty/SCons new file mode 160000 +Subproject 3056da6ce23ced559497a07bd4444fb3a17b4db diff --git a/3rdParty/SCons/scons-LICENSE b/3rdParty/SCons/scons-LICENSE deleted file mode 100644 index 4ac2352..0000000 --- a/3rdParty/SCons/scons-LICENSE +++ /dev/null @@ -1,25 +0,0 @@ - Copyright and license for SCons - a software construction tool - - This copyright and license do not apply to any other software - with which this software may have been included. - -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation - -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. diff --git a/3rdParty/SCons/scons-README b/3rdParty/SCons/scons-README deleted file mode 100644 index 89bc634..0000000 --- a/3rdParty/SCons/scons-README +++ /dev/null @@ -1,204 +0,0 @@ -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation - - SCons - a software construction tool - -This is the scons-README file for a version of SCons packaged for local -execution--that is, execution out of a specific local directory, without -having to install SCons as a system-wide utility. - -You are likely reading this file in one of the following two situations: - - 1) You have unpacked an scons-local-{version} package and are - examining the contents. - - In this case, you are presumably interested in using this - package to include a local copy of SCons with some other - software that you package, so that you can use SCons to build - your software without forcing all of your users to have it fully - installed. Instructions for this can be found below. - - If you are not looking to use SCons in this way, then please - use either the scons-{version} package to install SCons on your - system, or the scons-src-{version} package if you want the full - source to SCons, including its packaging code and underlying - tests and testing infrastructure. - - 2) This file was included in some other software package so that - the package could be built using SCons. - - In this case, follow the instructions provided with the - rest of the software package for how to use SCons to build - and/or install the software. The file containing build and - installation instructions will typically be named README or - INSTALL. - -LATEST VERSION -============== - -Before going further, you can check for the latest version of the -scons-local package, or any SCons package, at the SCons download page: - - http://www.scons.org/download.html - - -EXECUTION REQUIREMENTS -====================== - -Running SCons requires Python version 1.5.2 or later. There should be -no other dependencies or requirements to run SCons. - -The default SCons configuration assumes use of the Microsoft Visual C++ -compiler suite on WIN32 systems, and assumes a C compiler named 'cc', -a C++ compiler named 'c++', and a Fortran compiler named 'g77' (such -as found in the GNU C compiler suite) on any other type of system. -You may, of course, override these default values by appropriate -configuration of Environment construction variables. - - -INSTALLATION -============ - -Installation of this package should be as simple as unpacking the -archive (either .tar.gz or .zip) in any directory (top-level or a -subdirectory) within the software package with which you want to ship -SCons. - -Once you have installed this package, you should write an SConstruct -file at the top level of your source tree to build your software as you -see fit. - -Then modify the build/install instructions for your package to instruct -your users to execute SCons as follows (if you installed this package in -your top-level directory): - - $ python scons.py - -Or (if, for example, you installed this package in a subdirectory named -"scons"): - - $ python scons/scons.py - -That should be all you have to do. (If it isn't that simple, please let -us know!) - - -CONTENTS OF THIS PACKAGE -======================== - -This scons-local package consists of the following: - -scons-LICENSE - A copy of the copyright and terms under which SCons is - distributed (the Open Source Initiative-approved MIT license). - - A disclaimer has been added to the beginning to make clear that - this license applies only to SCons, and not to any separate - software you've written with which you're planning to package - SCons. - -scons-README - What you're looking at right now. - -scons-local-{version}/ - The SCons build engine. This is structured as a Python - library. - -scons.py - The SCons script itself. The script sets up the Python - sys.path variable to use the build engine found in the - scons-local-{version}/ directory in preference to any other - SCons build engine installed on your system. - - -DOCUMENTATION -============= - -Because this package is intended to be included with other software by -experienced users, we have not included any SCons documentation in this -package (other than this scons-README file you're reading right now). - -If, however, you need documentation about SCons, then consult any of the -following from the corresponding scons-{version} or scons-src-{version} -package: - - The RELEASE.txt file (src/RELEASE.txt file in the - scons-src-{version} package), which contains notes about this - specific release, including known problems. - - The CHANGES.txt file (src/CHANGES.txt file in the - scons-src-{version} package), which contains a list of changes - since the previous release. - - The scons.1 man page (doc/man/scons.1 in the scons-src-{version} - package), which contains a section of small examples for getting - started using SCons. - -Additional documentation for SCons is available at: - - http://www.scons.org/doc.html - - -LICENSING -========= - -SCons is distributed under the MIT license, a full copy of which is -available in the scons-LICENSE file in this package. The MIT license is -an approved Open Source license, which means: - - This software is OSI Certified Open Source Software. OSI - Certified is a certification mark of the Open Source Initiative. - -More information about OSI certifications and Open Source software is -available at: - - http://www.opensource.org/ - - -REPORTING BUGS -============== - -You can report bugs either by following the "Tracker - Bugs" link -on the SCons project page: - - http://sourceforge.net/projects/scons/ - -or by sending mail to the SCons developers mailing list: - - scons-devel@lists.sourceforge.net - - -MAILING LISTS -============= - -A mailing list for users of SCons is available. You may send questions -or comments to the list at: - - scons-users@lists.sourceforge.net - -You may subscribe to the scons-users mailing list at: - - http://lists.sourceforge.net/lists/listinfo/scons-users - - -FOR MORE INFORMATION -==================== - -Check the SCons web site at: - - http://www.scons.org/ - - -AUTHOR INFO -=========== - -Steven Knight -knight at baldmt dot com -http://www.baldmt.com/~knight/ - -With plenty of help from the SCons Development team: - Chad Austin - Charles Crain - Steve Leblanc - Anthony Roach - Terrel Shumway - diff --git a/3rdParty/SCons/scons-local/SCons/Action.py b/3rdParty/SCons/scons-local/SCons/Action.py deleted file mode 100644 index 9535194..0000000 --- a/3rdParty/SCons/scons-local/SCons/Action.py +++ /dev/null @@ -1,1240 +0,0 @@ -"""SCons.Action - -This encapsulates information about executing any sort of action that -can build one or more target Nodes (typically files) from one or more -source Nodes (also typically files) given a specific Environment. - -The base class here is ActionBase. The base class supplies just a few -OO utility methods and some generic methods for displaying information -about an Action in response to the various commands that control printing. - -A second-level base class is _ActionAction. This extends ActionBase -by providing the methods that can be used to show and perform an -action. True Action objects will subclass _ActionAction; Action -factory class objects will subclass ActionBase. - -The heavy lifting is handled by subclasses for the different types of -actions we might execute: - - CommandAction - CommandGeneratorAction - FunctionAction - ListAction - -The subclasses supply the following public interface methods used by -other modules: - - __call__() - THE public interface, "calling" an Action object executes the - command or Python function. This also takes care of printing - a pre-substitution command for debugging purposes. - - get_contents() - Fetches the "contents" of an Action for signature calculation - plus the varlist. This is what gets MD5 checksummed to decide - if a target needs to be rebuilt because its action changed. - - genstring() - Returns a string representation of the Action *without* - command substitution, but allows a CommandGeneratorAction to - generate the right action based on the specified target, - source and env. This is used by the Signature subsystem - (through the Executor) to obtain an (imprecise) representation - of the Action operation for informative purposes. - - -Subclasses also supply the following methods for internal use within -this module: - - __str__() - Returns a string approximation of the Action; no variable - substitution is performed. - - execute() - The internal method that really, truly, actually handles the - execution of a command or Python function. This is used so - that the __call__() methods can take care of displaying any - pre-substitution representations, and *then* execute an action - without worrying about the specific Actions involved. - - get_presig() - Fetches the "contents" of a subclass for signature calculation. - The varlist is added to this to produce the Action's contents. - - strfunction() - Returns a substituted string representation of the Action. - This is used by the _ActionAction.show() command to display the - command/function that will be executed to generate the target(s). - -There is a related independent ActionCaller class that looks like a -regular Action, and which serves as a wrapper for arbitrary functions -that we want to let the user specify the arguments to now, but actually -execute later (when an out-of-date check determines that it's needed to -be executed, for example). Objects of this class are returned by an -ActionFactory class that provides a __call__() method as a convenient -way for wrapping up the functions. - -""" - -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. - -__revision__ = "src/engine/SCons/Action.py 4043 2009/02/23 09:06:45 scons" - -import cPickle -import dis -import os -import re -import string -import sys -import subprocess - -from SCons.Debug import logInstanceCreation -import SCons.Errors -import SCons.Executor -import SCons.Util -import SCons.Subst - -# we use these a lot, so try to optimize them -is_String = SCons.Util.is_String -is_List = SCons.Util.is_List - -class _null: - pass - -print_actions = 1 -execute_actions = 1 -print_actions_presub = 0 - -def rfile(n): - try: - return n.rfile() - except AttributeError: - return n - -def default_exitstatfunc(s): - return s - -try: - SET_LINENO = dis.SET_LINENO - HAVE_ARGUMENT = dis.HAVE_ARGUMENT -except AttributeError: - remove_set_lineno_codes = lambda x: x -else: - def remove_set_lineno_codes(code): - result = [] - n = len(code) - i = 0 - while i < n: - c = code[i] - op = ord(c) - if op >= HAVE_ARGUMENT: - if op != SET_LINENO: - result.append(code[i:i+3]) - i = i+3 - else: - result.append(c) - i = i+1 - return string.join(result, '') - -strip_quotes = re.compile('^[\'"](.*)[\'"]$') - - -def _callable_contents(obj): - """Return the signature contents of a callable Python object. - """ - try: - # Test if obj is a method. - return _function_contents(obj.im_func) - - except AttributeError: - try: - # Test if obj is a callable object. - return _function_contents(obj.__call__.im_func) - - except AttributeError: - try: - # Test if obj is a code object. - return _code_contents(obj) - - except AttributeError: - # Test if obj is a function object. - return _function_contents(obj) - - -def _object_contents(obj): - """Return the signature contents of any Python object. - - We have to handle the case where object contains a code object - since it can be pickled directly. - """ - try: - # Test if obj is a method. - return _function_contents(obj.im_func) - - except AttributeError: - try: - # Test if obj is a callable object. - return _function_contents(obj.__call__.im_func) - - except AttributeError: - try: - # Test if obj is a code object. - return _code_contents(obj) - - except AttributeError: - try: - # Test if obj is a function object. - return _function_contents(obj) - - except AttributeError: - # Should be a pickable Python object. - try: - return cPickle.dumps(obj) - except (cPickle.PicklingError, TypeError): - # This is weird, but it seems that nested classes - # are unpickable. The Python docs say it should - # always be a PicklingError, but some Python - # versions seem to return TypeError. Just do - # the best we can. - return str(obj) - - -def _code_contents(code): - """Return the signature contents of a code object. - - By providing direct access to the code object of the - function, Python makes this extremely easy. Hooray! - - Unfortunately, older versions of Python include line - number indications in the compiled byte code. Boo! - So we remove the line number byte codes to prevent - recompilations from moving a Python function. - """ - - contents = [] - - # The code contents depends on the number of local variables - # but not their actual names. - contents.append("%s,%s" % (code.co_argcount, len(code.co_varnames))) - try: - contents.append(",%s,%s" % (len(code.co_cellvars), len(code.co_freevars))) - except AttributeError: - # Older versions of Python do not support closures. - contents.append(",0,0") - - # The code contents depends on any constants accessed by the - # function. Note that we have to call _object_contents on each - # constants because the code object of nested functions can - # show-up among the constants. - # - # Note that we also always ignore the first entry of co_consts - # which contains the function doc string. We assume that the - # function does not access its doc string. - contents.append(',(' + string.join(map(_object_contents,code.co_consts[1:]),',') + ')') - - # The code contents depends on the variable names used to - # accessed global variable, as changing the variable name changes - # the variable actually accessed and therefore changes the - # function result. - contents.append(',(' + string.join(map(_object_contents,code.co_names),',') + ')') - - - # The code contents depends on its actual code!!! - contents.append(',(' + str(remove_set_lineno_codes(code.co_code)) + ')') - - return string.join(contents, '') - - -def _function_contents(func): - """Return the signature contents of a function.""" - - contents = [_code_contents(func.func_code)] - - # The function contents depends on the value of defaults arguments - if func.func_defaults: - contents.append(',(' + string.join(map(_object_contents,func.func_defaults),',') + ')') - else: - contents.append(',()') - - # The function contents depends on the closure captured cell values. - try: - closure = func.func_closure or [] - except AttributeError: - # Older versions of Python do not support closures. - closure = [] - - #xxx = [_object_contents(x.cell_contents) for x in closure] - try: - xxx = map(lambda x: _object_contents(x.cell_contents), closure) - except AttributeError: - xxx = [] - contents.append(',(' + string.join(xxx, ',') + ')') - - return string.join(contents, '') - - -def _actionAppend(act1, act2): - # This function knows how to slap two actions together. - # Mainly, it handles ListActions by concatenating into - # a single ListAction. - a1 = Action(act1) - a2 = Action(act2) - if a1 is None or a2 is None: - raise TypeError, "Cannot append %s to %s" % (type(act1), type(act2)) - if isinstance(a1, ListAction): - if isinstance(a2, ListAction): - return ListAction(a1.list + a2.list) - else: - return ListAction(a1.list + [ a2 ]) - else: - if isinstance(a2, ListAction): - return ListAction([ a1 ] + a2.list) - else: - return ListAction([ a1, a2 ]) - -def _do_create_keywords(args, kw): - """This converts any arguments after the action argument into - their equivalent keywords and adds them to the kw argument. - """ - v = kw.get('varlist', ()) - # prevent varlist="FOO" from being interpreted as ['F', 'O', 'O'] - if is_String(v): v = (v,) - kw['varlist'] = tuple(v) - if args: - # turn positional args into equivalent keywords - cmdstrfunc = args[0] - if cmdstrfunc is None or is_String(cmdstrfunc): - kw['cmdstr'] = cmdstrfunc - elif callable(cmdstrfunc): - kw['strfunction'] = cmdstrfunc - else: - raise SCons.Errors.UserError( - 'Invalid command display variable type. ' - 'You must either pass a string or a callback which ' - 'accepts (target, source, env) as parameters.') - if len(args) > 1: - kw['varlist'] = args[1:] + kw['varlist'] - if kw.get('strfunction', _null) is not _null \ - and kw.get('cmdstr', _null) is not _null: - raise SCons.Errors.UserError( - 'Cannot have both strfunction and cmdstr args to Action()') - -def _do_create_action(act, kw): - """This is the actual "implementation" for the - Action factory method, below. This handles the - fact that passing lists to Action() itself has - different semantics than passing lists as elements - of lists. - - The former will create a ListAction, the latter - will create a CommandAction by converting the inner - list elements to strings.""" - - if isinstance(act, ActionBase): - return act - - if is_List(act): - #TODO(1.5) return CommandAction(act, **kw) - return apply(CommandAction, (act,), kw) - - if callable(act): - try: - gen = kw['generator'] - del kw['generator'] - except KeyError: - gen = 0 - if gen: - action_type = CommandGeneratorAction - else: - action_type = FunctionAction - return action_type(act, kw) - - if is_String(act): - var=SCons.Util.get_environment_var(act) - if var: - # This looks like a string that is purely an Environment - # variable reference, like "$FOO" or "${FOO}". We do - # something special here...we lazily evaluate the contents - # of that Environment variable, so a user could put something - # like a function or a CommandGenerator in that variable - # instead of a string. - return LazyAction(var, kw) - commands = string.split(str(act), '\n') - if len(commands) == 1: - #TODO(1.5) return CommandAction(commands[0], **kw) - return apply(CommandAction, (commands[0],), kw) - # The list of string commands may include a LazyAction, so we - # reprocess them via _do_create_list_action. - return _do_create_list_action(commands, kw) - return None - -def _do_create_list_action(act, kw): - """A factory for list actions. Convert the input list into Actions - and then wrap them in a ListAction.""" - acts = [] - for a in act: - aa = _do_create_action(a, kw) - if aa is not None: acts.append(aa) - if not acts: - return ListAction([]) - elif len(acts) == 1: - return acts[0] - else: - return ListAction(acts) - -def Action(act, *args, **kw): - """A factory for action objects.""" - # Really simple: the _do_create_* routines do the heavy lifting. - _do_create_keywords(args, kw) - if is_List(act): - return _do_create_list_action(act, kw) - return _do_create_action(act, kw) - -class ActionBase: - """Base class for all types of action objects that can be held by - other objects (Builders, Executors, etc.) This provides the - common methods for manipulating and combining those actions.""" - - def __cmp__(self, other): - return cmp(self.__dict__, other) - - def no_batch_key(self, env, target, source): - return None - - batch_key = no_batch_key - - def genstring(self, target, source, env): - return str(self) - - def get_contents(self, target, source, env): - result = [ self.get_presig(target, source, env) ] - # This should never happen, as the Action() factory should wrap - # the varlist, but just in case an action is created directly, - # we duplicate this check here. - vl = self.varlist - if is_String(vl): vl = (vl,) - for v in vl: - result.append(env.subst('${'+v+'}')) - return string.join(result, '') - - def __add__(self, other): - return _actionAppend(self, other) - - def __radd__(self, other): - return _actionAppend(other, self) - - def presub_lines(self, env): - # CommandGeneratorAction needs a real environment - # in order to return the proper string here, since - # it may call LazyAction, which looks up a key - # in that env. So we temporarily remember the env here, - # and CommandGeneratorAction will use this env - # when it calls its _generate method. - self.presub_env = env - lines = string.split(str(self), '\n') - self.presub_env = None # don't need this any more - return lines - - def get_targets(self, env, executor): - """ - Returns the type of targets ($TARGETS, $CHANGED_TARGETS) used - by this action. - """ - return self.targets - -class _ActionAction(ActionBase): - """Base class for actions that create output objects.""" - def __init__(self, cmdstr=_null, strfunction=_null, varlist=(), - presub=_null, chdir=None, exitstatfunc=None, - batch_key=None, targets='$TARGETS', - **kw): - self.cmdstr = cmdstr - if strfunction is not _null: - if strfunction is None: - self.cmdstr = None - else: - self.strfunction = strfunction - self.varlist = varlist - self.presub = presub - self.chdir = chdir - if not exitstatfunc: - exitstatfunc = default_exitstatfunc - self.exitstatfunc = exitstatfunc - - self.targets = targets - - if batch_key: - if not callable(batch_key): - # They have set batch_key, but not to their own - # callable. The default behavior here will batch - # *all* targets+sources using this action, separated - # for each construction environment. - def default_batch_key(self, env, target, source): - return (id(self), id(env)) - batch_key = default_batch_key - SCons.Util.AddMethod(self, batch_key, 'batch_key') - - def print_cmd_line(self, s, target, source, env): - sys.stdout.write(s + "\n") - - def __call__(self, target, source, env, - exitstatfunc=_null, - presub=_null, - show=_null, - execute=_null, - chdir=_null, - executor=None): - if not is_List(target): - target = [target] - if not is_List(source): - source = [source] - - if presub is _null: - presub = self.presub - if presub is _null: - presub = print_actions_presub - if exitstatfunc is _null: exitstatfunc = self.exitstatfunc - if show is _null: show = print_actions - if execute is _null: execute = execute_actions - if chdir is _null: chdir = self.chdir - save_cwd = None - if chdir: - save_cwd = os.getcwd() - try: - chdir = str(chdir.abspath) - except AttributeError: - if not is_String(chdir): - if executor: - chdir = str(executor.batches[0].targets[0].dir) - else: - chdir = str(target[0].dir) - if presub: - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - t = string.join(map(str, target), ' and ') - l = string.join(self.presub_lines(env), '\n ') - out = "Building %s with action:\n %s\n" % (t, l) - sys.stdout.write(out) - cmd = None - if show and self.strfunction: - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - try: - cmd = self.strfunction(target, source, env, executor) - except TypeError: - cmd = self.strfunction(target, source, env) - if cmd: - if chdir: - cmd = ('os.chdir(%s)\n' % repr(chdir)) + cmd - try: - get = env.get - except AttributeError: - print_func = self.print_cmd_line - else: - print_func = get('PRINT_CMD_LINE_FUNC') - if not print_func: - print_func = self.print_cmd_line - print_func(cmd, target, source, env) - stat = 0 - if execute: - if chdir: - os.chdir(chdir) - try: - stat = self.execute(target, source, env, executor=executor) - if isinstance(stat, SCons.Errors.BuildError): - s = exitstatfunc(stat.status) - if s: - stat.status = s - else: - stat = s - else: - stat = exitstatfunc(stat) - finally: - if save_cwd: - os.chdir(save_cwd) - if cmd and save_cwd: - print_func('os.chdir(%s)' % repr(save_cwd), target, source, env) - - return stat - - -def _string_from_cmd_list(cmd_list): - """Takes a list of command line arguments and returns a pretty - representation for printing.""" - cl = [] - for arg in map(str, cmd_list): - if ' ' in arg or '\t' in arg: - arg = '"' + arg + '"' - cl.append(arg) - return string.join(cl) - -# A fiddlin' little function that has an 'import SCons.Environment' which -# can't be moved to the top level without creating an import loop. Since -# this import creates a local variable named 'SCons', it blocks access to -# the global variable, so we move it here to prevent complaints about local -# variables being used uninitialized. -default_ENV = None -def get_default_ENV(env): - global default_ENV - try: - return env['ENV'] - except KeyError: - if not default_ENV: - import SCons.Environment - # This is a hideously expensive way to get a default shell - # environment. What it really should do is run the platform - # setup to get the default ENV. Fortunately, it's incredibly - # rare for an Environment not to have a shell environment, so - # we're not going to worry about it overmuch. - default_ENV = SCons.Environment.Environment()['ENV'] - return default_ENV - -# This function is still in draft mode. We're going to need something like -# it in the long run as more and more places use subprocess, but I'm sure -# it'll have to be tweaked to get the full desired functionality. -# one special arg (so far?), 'error', to tell what to do with exceptions. -def _subproc(env, cmd, error = 'ignore', **kw): - """Do common setup for a subprocess.Popen() call""" - # allow std{in,out,err} to be "'devnull'" - io = kw.get('stdin') - if is_String(io) and io == 'devnull': - kw['stdin'] = open(os.devnull) - io = kw.get('stdout') - if is_String(io) and io == 'devnull': - kw['stdout'] = open(os.devnull, 'w') - io = kw.get('stderr') - if is_String(io) and io == 'devnull': - kw['stderr'] = open(os.devnull, 'w') - - # Figure out what shell environment to use - ENV = kw.get('env', None) - if ENV is None: ENV = get_default_ENV(env) - - # Ensure that the ENV values are all strings: - new_env = {} - for key, value in ENV.items(): - if is_List(value): - # If the value is a list, then we assume it is a path list, - # because that's a pretty common list-like value to stick - # in an environment variable: - value = SCons.Util.flatten_sequence(value) - new_env[key] = string.join(map(str, value), os.pathsep) - else: - # It's either a string or something else. If it's a string, - # we still want to call str() because it might be a *Unicode* - # string, which makes subprocess.Popen() gag. If it isn't a - # string or a list, then we just coerce it to a string, which - # is the proper way to handle Dir and File instances and will - # produce something reasonable for just about everything else: - new_env[key] = str(value) - kw['env'] = new_env - - try: - #FUTURE return subprocess.Popen(cmd, **kw) - return apply(subprocess.Popen, (cmd,), kw) - except EnvironmentError, e: - if error == 'raise': raise - # return a dummy Popen instance that only returns error - class dummyPopen: - def __init__(self, e): self.exception = e - def communicate(self): return ('','') - def wait(self): return -self.exception.errno - stdin = None - class f: - def read(self): return '' - def readline(self): return '' - stdout = stderr = f() - return dummyPopen(e) - -class CommandAction(_ActionAction): - """Class for command-execution actions.""" - def __init__(self, cmd, **kw): - # Cmd can actually be a list or a single item; if it's a - # single item it should be the command string to execute; if a - # list then it should be the words of the command string to - # execute. Only a single command should be executed by this - # object; lists of commands should be handled by embedding - # these objects in a ListAction object (which the Action() - # factory above does). cmd will be passed to - # Environment.subst_list() for substituting environment - # variables. - if __debug__: logInstanceCreation(self, 'Action.CommandAction') - - #TODO(1.5) _ActionAction.__init__(self, **kw) - apply(_ActionAction.__init__, (self,), kw) - if is_List(cmd): - if filter(is_List, cmd): - raise TypeError, "CommandAction should be given only " \ - "a single command" - self.cmd_list = cmd - - def __str__(self): - if is_List(self.cmd_list): - return string.join(map(str, self.cmd_list), ' ') - return str(self.cmd_list) - - def process(self, target, source, env, executor=None): - if executor: - result = env.subst_list(self.cmd_list, 0, executor=executor) - else: - result = env.subst_list(self.cmd_list, 0, target, source) - silent = None - ignore = None - while 1: - try: c = result[0][0][0] - except IndexError: c = None - if c == '@': silent = 1 - elif c == '-': ignore = 1 - else: break - result[0][0] = result[0][0][1:] - try: - if not result[0][0]: - result[0] = result[0][1:] - except IndexError: - pass - return result, ignore, silent - - def strfunction(self, target, source, env, executor=None): - if self.cmdstr is None: - return None - if self.cmdstr is not _null: - from SCons.Subst import SUBST_RAW - if executor: - c = env.subst(self.cmdstr, SUBST_RAW, executor=executor) - else: - c = env.subst(self.cmdstr, SUBST_RAW, target, source) - if c: - return c - cmd_list, ignore, silent = self.process(target, source, env, executor) - if silent: - return '' - return _string_from_cmd_list(cmd_list[0]) - - def execute(self, target, source, env, executor=None): - """Execute a command action. - - This will handle lists of commands as well as individual commands, - because construction variable substitution may turn a single - "command" into a list. This means that this class can actually - handle lists of commands, even though that's not how we use it - externally. - """ - escape_list = SCons.Subst.escape_list - flatten_sequence = SCons.Util.flatten_sequence - - try: - shell = env['SHELL'] - except KeyError: - raise SCons.Errors.UserError('Missing SHELL construction variable.') - - try: - spawn = env['SPAWN'] - except KeyError: - raise SCons.Errors.UserError('Missing SPAWN construction variable.') - else: - if is_String(spawn): - spawn = env.subst(spawn, raw=1, conv=lambda x: x) - - escape = env.get('ESCAPE', lambda x: x) - - ENV = get_default_ENV(env) - - # Ensure that the ENV values are all strings: - for key, value in ENV.items(): - if not is_String(value): - if is_List(value): - # If the value is a list, then we assume it is a - # path list, because that's a pretty common list-like - # value to stick in an environment variable: - value = flatten_sequence(value) - ENV[key] = string.join(map(str, value), os.pathsep) - else: - # If it isn't a string or a list, then we just coerce - # it to a string, which is the proper way to handle - # Dir and File instances and will produce something - # reasonable for just about everything else: - ENV[key] = str(value) - - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - cmd_list, ignore, silent = self.process(target, map(rfile, source), env, executor) - - # Use len() to filter out any "command" that's zero-length. - for cmd_line in filter(len, cmd_list): - # Escape the command line for the interpreter we are using. - cmd_line = escape_list(cmd_line, escape) - result = spawn(shell, escape, cmd_line[0], cmd_line, ENV) - if not ignore and result: - msg = "Error %s" % result - return SCons.Errors.BuildError(errstr=msg, - status=result, - action=self, - command=cmd_line) - return 0 - - def get_presig(self, target, source, env, executor=None): - """Return the signature contents of this action's command line. - - This strips $(-$) and everything in between the string, - since those parts don't affect signatures. - """ - from SCons.Subst import SUBST_SIG - cmd = self.cmd_list - if is_List(cmd): - cmd = string.join(map(str, cmd)) - else: - cmd = str(cmd) - if executor: - return env.subst_target_source(cmd, SUBST_SIG, executor=executor) - else: - return env.subst_target_source(cmd, SUBST_SIG, target, source) - - def get_implicit_deps(self, target, source, env, executor=None): - icd = env.get('IMPLICIT_COMMAND_DEPENDENCIES', True) - if is_String(icd) and icd[:1] == '$': - icd = env.subst(icd) - if not icd or icd in ('0', 'None'): - return [] - from SCons.Subst import SUBST_SIG - if executor: - cmd_list = env.subst_list(self.cmd_list, SUBST_SIG, executor=executor) - else: - cmd_list = env.subst_list(self.cmd_list, SUBST_SIG, target, source) - res = [] - for cmd_line in cmd_list: - if cmd_line: - d = str(cmd_line[0]) - m = strip_quotes.match(d) - if m: - d = m.group(1) - d = env.WhereIs(d) - if d: - res.append(env.fs.File(d)) - return res - -class CommandGeneratorAction(ActionBase): - """Class for command-generator actions.""" - def __init__(self, generator, kw): - if __debug__: logInstanceCreation(self, 'Action.CommandGeneratorAction') - self.generator = generator - self.gen_kw = kw - self.varlist = kw.get('varlist', ()) - self.targets = kw.get('targets', '$TARGETS') - - def _generate(self, target, source, env, for_signature, executor=None): - # ensure that target is a list, to make it easier to write - # generator functions: - if not is_List(target): - target = [target] - - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - ret = self.generator(target=target, - source=source, - env=env, - for_signature=for_signature) - #TODO(1.5) gen_cmd = Action(ret, **self.gen_kw) - gen_cmd = apply(Action, (ret,), self.gen_kw) - if not gen_cmd: - raise SCons.Errors.UserError("Object returned from command generator: %s cannot be used to create an Action." % repr(ret)) - return gen_cmd - - def __str__(self): - try: - env = self.presub_env - except AttributeError: - env = None - if env is None: - env = SCons.Defaults.DefaultEnvironment() - act = self._generate([], [], env, 1) - return str(act) - - def batch_key(self, env, target, source): - return self._generate(target, source, env, 1).batch_key(env, target, source) - - def genstring(self, target, source, env, executor=None): - return self._generate(target, source, env, 1, executor).genstring(target, source, env) - - def __call__(self, target, source, env, exitstatfunc=_null, presub=_null, - show=_null, execute=_null, chdir=_null, executor=None): - act = self._generate(target, source, env, 0, executor) - if act is None: - raise UserError("While building `%s': Cannot deduce file extension from source files: %s" % (repr(map(str, target)), repr(map(str, source)))) - return act(target, source, env, exitstatfunc, presub, - show, execute, chdir, executor) - - def get_presig(self, target, source, env, executor=None): - """Return the signature contents of this action's command line. - - This strips $(-$) and everything in between the string, - since those parts don't affect signatures. - """ - return self._generate(target, source, env, 1, executor).get_presig(target, source, env) - - def get_implicit_deps(self, target, source, env, executor=None): - return self._generate(target, source, env, 1, executor).get_implicit_deps(target, source, env) - - def get_targets(self, env, executor): - return self._generate(None, None, env, 1, executor).get_targets(env, executor) - - - -# A LazyAction is a kind of hybrid generator and command action for -# strings of the form "$VAR". These strings normally expand to other -# strings (think "$CCCOM" to "$CC -c -o $TARGET $SOURCE"), but we also -# want to be able to replace them with functions in the construction -# environment. Consequently, we want lazy evaluation and creation of -# an Action in the case of the function, but that's overkill in the more -# normal case of expansion to other strings. -# -# So we do this with a subclass that's both a generator *and* -# a command action. The overridden methods all do a quick check -# of the construction variable, and if it's a string we just call -# the corresponding CommandAction method to do the heavy lifting. -# If not, then we call the same-named CommandGeneratorAction method. -# The CommandGeneratorAction methods work by using the overridden -# _generate() method, that is, our own way of handling "generation" of -# an action based on what's in the construction variable. - -class LazyAction(CommandGeneratorAction, CommandAction): - - def __init__(self, var, kw): - if __debug__: logInstanceCreation(self, 'Action.LazyAction') - #FUTURE CommandAction.__init__(self, '${'+var+'}', **kw) - apply(CommandAction.__init__, (self, '${'+var+'}'), kw) - self.var = SCons.Util.to_String(var) - self.gen_kw = kw - - def get_parent_class(self, env): - c = env.get(self.var) - if is_String(c) and not '\n' in c: - return CommandAction - return CommandGeneratorAction - - def _generate_cache(self, env): - if env: - c = env.get(self.var, '') - else: - c = '' - #TODO(1.5) gen_cmd = Action(c, **self.gen_kw) - gen_cmd = apply(Action, (c,), self.gen_kw) - if not gen_cmd: - raise SCons.Errors.UserError("$%s value %s cannot be used to create an Action." % (self.var, repr(c))) - return gen_cmd - - def _generate(self, target, source, env, for_signature, executor=None): - return self._generate_cache(env) - - def __call__(self, target, source, env, *args, **kw): - args = (self, target, source, env) + args - c = self.get_parent_class(env) - #TODO(1.5) return c.__call__(*args, **kw) - return apply(c.__call__, args, kw) - - def get_presig(self, target, source, env): - c = self.get_parent_class(env) - return c.get_presig(self, target, source, env) - - - -class FunctionAction(_ActionAction): - """Class for Python function actions.""" - - def __init__(self, execfunction, kw): - if __debug__: logInstanceCreation(self, 'Action.FunctionAction') - - self.execfunction = execfunction - try: - self.funccontents = _callable_contents(execfunction) - except AttributeError: - try: - # See if execfunction will do the heavy lifting for us. - self.gc = execfunction.get_contents - except AttributeError: - # This is weird, just do the best we can. - self.funccontents = _object_contents(execfunction) - - #TODO(1.5) _ActionAction.__init__(self, **kw) - apply(_ActionAction.__init__, (self,), kw) - - def function_name(self): - try: - return self.execfunction.__name__ - except AttributeError: - try: - return self.execfunction.__class__.__name__ - except AttributeError: - return "unknown_python_function" - - def strfunction(self, target, source, env, executor=None): - if self.cmdstr is None: - return None - if self.cmdstr is not _null: - from SCons.Subst import SUBST_RAW - if executor: - c = env.subst(self.cmdstr, SUBST_RAW, executor=executor) - else: - c = env.subst(self.cmdstr, SUBST_RAW, target, source) - if c: - return c - def array(a): - def quote(s): - try: - str_for_display = s.str_for_display - except AttributeError: - s = repr(s) - else: - s = str_for_display() - return s - return '[' + string.join(map(quote, a), ", ") + ']' - try: - strfunc = self.execfunction.strfunction - except AttributeError: - pass - else: - if strfunc is None: - return None - if callable(strfunc): - return strfunc(target, source, env) - name = self.function_name() - tstr = array(target) - sstr = array(source) - return "%s(%s, %s)" % (name, tstr, sstr) - - def __str__(self): - name = self.function_name() - if name == 'ActionCaller': - return str(self.execfunction) - return "%s(target, source, env)" % name - - def execute(self, target, source, env, executor=None): - exc_info = (None,None,None) - try: - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - rsources = map(rfile, source) - try: - result = self.execfunction(target=target, source=rsources, env=env) - except KeyboardInterrupt, e: - raise - except SystemExit, e: - raise - except Exception, e: - result = e - exc_info = sys.exc_info() - - if result: - result = SCons.Errors.convert_to_BuildError(result, exc_info) - result.node=target - result.action=self - try: - result.command=self.strfunction(target, source, env, executor) - except TypeError: - result.command=self.strfunction(target, source, env) - - # FIXME: This maintains backward compatibility with respect to - # which type of exceptions were returned by raising an - # exception and which ones were returned by value. It would - # probably be best to always return them by value here, but - # some codes do not check the return value of Actions and I do - # not have the time to modify them at this point. - if (exc_info[1] and - not isinstance(exc_info[1],EnvironmentError)): - raise result - - return result - finally: - # Break the cycle between the traceback object and this - # function stack frame. See the sys.exc_info() doc info for - # more information about this issue. - del exc_info - - - def get_presig(self, target, source, env): - """Return the signature contents of this callable action.""" - try: - return self.gc(target, source, env) - except AttributeError: - return self.funccontents - - def get_implicit_deps(self, target, source, env): - return [] - -class ListAction(ActionBase): - """Class for lists of other actions.""" - def __init__(self, list): - if __debug__: logInstanceCreation(self, 'Action.ListAction') - def list_of_actions(x): - if isinstance(x, ActionBase): - return x - return Action(x) - self.list = map(list_of_actions, list) - # our children will have had any varlist - # applied; we don't need to do it again - self.varlist = () - self.targets = '$TARGETS' - - def genstring(self, target, source, env): - return string.join(map(lambda a, t=target, s=source, e=env: - a.genstring(t, s, e), - self.list), - '\n') - - def __str__(self): - return string.join(map(str, self.list), '\n') - - def presub_lines(self, env): - return SCons.Util.flatten_sequence( - map(lambda a, env=env: a.presub_lines(env), self.list)) - - def get_presig(self, target, source, env): - """Return the signature contents of this action list. - - Simple concatenation of the signatures of the elements. - """ - return string.join(map(lambda x, t=target, s=source, e=env: - x.get_contents(t, s, e), - self.list), - "") - - def __call__(self, target, source, env, exitstatfunc=_null, presub=_null, - show=_null, execute=_null, chdir=_null, executor=None): - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - for act in self.list: - stat = act(target, source, env, exitstatfunc, presub, - show, execute, chdir, executor) - if stat: - return stat - return 0 - - def get_implicit_deps(self, target, source, env): - result = [] - for act in self.list: - result.extend(act.get_implicit_deps(target, source, env)) - return result - -class ActionCaller: - """A class for delaying calling an Action function with specific - (positional and keyword) arguments until the Action is actually - executed. - - This class looks to the rest of the world like a normal Action object, - but what it's really doing is hanging on to the arguments until we - have a target, source and env to use for the expansion. - """ - def __init__(self, parent, args, kw): - self.parent = parent - self.args = args - self.kw = kw - - def get_contents(self, target, source, env): - actfunc = self.parent.actfunc - try: - # "self.actfunc" is a function. - contents = str(actfunc.func_code.co_code) - except AttributeError: - # "self.actfunc" is a callable object. - try: - contents = str(actfunc.__call__.im_func.func_code.co_code) - except AttributeError: - # No __call__() method, so it might be a builtin - # or something like that. Do the best we can. - contents = str(actfunc) - contents = remove_set_lineno_codes(contents) - return contents - - def subst(self, s, target, source, env): - # If s is a list, recursively apply subst() - # to every element in the list - if is_List(s): - result = [] - for elem in s: - result.append(self.subst(elem, target, source, env)) - return self.parent.convert(result) - - # Special-case hack: Let a custom function wrapped in an - # ActionCaller get at the environment through which the action - # was called by using this hard-coded value as a special return. - if s == '$__env__': - return env - elif is_String(s): - return env.subst(s, 1, target, source) - return self.parent.convert(s) - - def subst_args(self, target, source, env): - return map(lambda x, self=self, t=target, s=source, e=env: - self.subst(x, t, s, e), - self.args) - - def subst_kw(self, target, source, env): - kw = {} - for key in self.kw.keys(): - kw[key] = self.subst(self.kw[key], target, source, env) - return kw - - def __call__(self, target, source, env, executor=None): - args = self.subst_args(target, source, env) - kw = self.subst_kw(target, source, env) - #TODO(1.5) return self.parent.actfunc(*args, **kw) - return apply(self.parent.actfunc, args, kw) - - def strfunction(self, target, source, env): - args = self.subst_args(target, source, env) - kw = self.subst_kw(target, source, env) - #TODO(1.5) return self.parent.strfunc(*args, **kw) - return apply(self.parent.strfunc, args, kw) - - def __str__(self): - #TODO(1.5) return self.parent.strfunc(*self.args, **self.kw) - return apply(self.parent.strfunc, self.args, self.kw) - -class ActionFactory: - """A factory class that will wrap up an arbitrary function - as an SCons-executable Action object. - - The real heavy lifting here is done by the ActionCaller class. - We just collect the (positional and keyword) arguments that we're - called with and give them to the ActionCaller object we create, - so it can hang onto them until it needs them. - """ - def __init__(self, actfunc, strfunc, convert=lambda x: x): - self.actfunc = actfunc - self.strfunc = strfunc - self.convert = convert - - def __call__(self, *args, **kw): - ac = ActionCaller(self, args, kw) - action = Action(ac, strfunction=ac.strfunction) - return action - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Builder.py b/3rdParty/SCons/scons-local/SCons/Builder.py deleted file mode 100644 index 18026c3..0000000 --- a/3rdParty/SCons/scons-local/SCons/Builder.py +++ /dev/null @@ -1,868 +0,0 @@ -"""SCons.Builder - -Builder object subsystem. - -A Builder object is a callable that encapsulates information about how -to execute actions to create a target Node (file) from source Nodes -(files), and how to create those dependencies for tracking. - -The main entry point here is the Builder() factory method. This provides -a procedural interface that creates the right underlying Builder object -based on the keyword arguments supplied and the types of the arguments. - -The goal is for this external interface to be simple enough that the -vast majority of users can create new Builders as necessary to support -building new types of files in their configurations, without having to -dive any deeper into this subsystem. - -The base class here is BuilderBase. This is a concrete base class which -does, in fact, represent the Builder objects that we (or users) create. - -There is also a proxy that looks like a Builder: - - CompositeBuilder - - This proxies for a Builder with an action that is actually a - dictionary that knows how to map file suffixes to a specific - action. This is so that we can invoke different actions - (compilers, compile options) for different flavors of source - files. - -Builders and their proxies have the following public interface methods -used by other modules: - - __call__() - THE public interface. Calling a Builder object (with the - use of internal helper methods) sets up the target and source - dependencies, appropriate mapping to a specific action, and the - environment manipulation necessary for overridden construction - variable. This also takes care of warning about possible mistakes - in keyword arguments. - - add_emitter() - Adds an emitter for a specific file suffix, used by some Tool - modules to specify that (for example) a yacc invocation on a .y - can create a .h *and* a .c file. - - add_action() - Adds an action for a specific file suffix, heavily used by - Tool modules to add their specific action(s) for turning - a source file into an object file to the global static - and shared object file Builders. - -There are the following methods for internal use within this module: - - _execute() - The internal method that handles the heavily lifting when a - Builder is called. This is used so that the __call__() methods - can set up warning about possible mistakes in keyword-argument - overrides, and *then* execute all of the steps necessary so that - the warnings only occur once. - - get_name() - Returns the Builder's name within a specific Environment, - primarily used to try to return helpful information in error - messages. - - adjust_suffix() - get_prefix() - get_suffix() - get_src_suffix() - set_src_suffix() - Miscellaneous stuff for handling the prefix and suffix - manipulation we use in turning source file names into target - file names. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Builder.py 4043 2009/02/23 09:06:45 scons" - -import UserDict -import UserList - -import SCons.Action -from SCons.Debug import logInstanceCreation -from SCons.Errors import InternalError, UserError -import SCons.Executor -import SCons.Memoize -import SCons.Node -import SCons.Node.FS -import SCons.Util -import SCons.Warnings - -class _Null: - pass - -_null = _Null - -def match_splitext(path, suffixes = []): - if suffixes: - matchsuf = filter(lambda S,path=path: path[-len(S):] == S, - suffixes) - if matchsuf: - suf = max(map(None, map(len, matchsuf), matchsuf))[1] - return [path[:-len(suf)], path[-len(suf):]] - return SCons.Util.splitext(path) - -class DictCmdGenerator(SCons.Util.Selector): - """This is a callable class that can be used as a - command generator function. It holds on to a dictionary - mapping file suffixes to Actions. It uses that dictionary - to return the proper action based on the file suffix of - the source file.""" - - def __init__(self, dict=None, source_ext_match=1): - SCons.Util.Selector.__init__(self, dict) - self.source_ext_match = source_ext_match - - def src_suffixes(self): - return self.keys() - - def add_action(self, suffix, action): - """Add a suffix-action pair to the mapping. - """ - self[suffix] = action - - def __call__(self, target, source, env, for_signature): - if not source: - return [] - - if self.source_ext_match: - suffixes = self.src_suffixes() - ext = None - for src in map(str, source): - my_ext = match_splitext(src, suffixes)[1] - if ext and my_ext != ext: - raise UserError("While building `%s' from `%s': Cannot build multiple sources with different extensions: %s, %s" % (repr(map(str, target)), src, ext, my_ext)) - ext = my_ext - else: - ext = match_splitext(str(source[0]), self.src_suffixes())[1] - - if not ext: - #return ext - raise UserError("While building `%s': Cannot deduce file extension from source files: %s" % (repr(map(str, target)), repr(map(str, source)))) - - try: - ret = SCons.Util.Selector.__call__(self, env, source, ext) - except KeyError, e: - raise UserError("Ambiguous suffixes after environment substitution: %s == %s == %s" % (e[0], e[1], e[2])) - if ret is None: - raise UserError("While building `%s' from `%s': Don't know how to build from a source file with suffix `%s'. Expected a suffix in this list: %s." % \ - (repr(map(str, target)), repr(map(str, source)), ext, repr(self.keys()))) - return ret - -class CallableSelector(SCons.Util.Selector): - """A callable dictionary that will, in turn, call the value it - finds if it can.""" - def __call__(self, env, source): - value = SCons.Util.Selector.__call__(self, env, source) - if callable(value): - value = value(env, source) - return value - -class DictEmitter(SCons.Util.Selector): - """A callable dictionary that maps file suffixes to emitters. - When called, it finds the right emitter in its dictionary for the - suffix of the first source file, and calls that emitter to get the - right lists of targets and sources to return. If there's no emitter - for the suffix in its dictionary, the original target and source are - returned. - """ - def __call__(self, target, source, env): - emitter = SCons.Util.Selector.__call__(self, env, source) - if emitter: - target, source = emitter(target, source, env) - return (target, source) - -class ListEmitter(UserList.UserList): - """A callable list of emitters that calls each in sequence, - returning the result. - """ - def __call__(self, target, source, env): - for e in self.data: - target, source = e(target, source, env) - return (target, source) - -# These are a common errors when calling a Builder; -# they are similar to the 'target' and 'source' keyword args to builders, -# so we issue warnings when we see them. The warnings can, of course, -# be disabled. -misleading_keywords = { - 'targets' : 'target', - 'sources' : 'source', -} - -class OverrideWarner(UserDict.UserDict): - """A class for warning about keyword arguments that we use as - overrides in a Builder call. - - This class exists to handle the fact that a single Builder call - can actually invoke multiple builders. This class only emits the - warnings once, no matter how many Builders are invoked. - """ - def __init__(self, dict): - UserDict.UserDict.__init__(self, dict) - if __debug__: logInstanceCreation(self, 'Builder.OverrideWarner') - self.already_warned = None - def warn(self): - if self.already_warned: - return - for k in self.keys(): - if misleading_keywords.has_key(k): - alt = misleading_keywords[k] - msg = "Did you mean to use `%s' instead of `%s'?" % (alt, k) - SCons.Warnings.warn(SCons.Warnings.MisleadingKeywordsWarning, msg) - self.already_warned = 1 - -def Builder(**kw): - """A factory for builder objects.""" - composite = None - if kw.has_key('generator'): - if kw.has_key('action'): - raise UserError, "You must not specify both an action and a generator." - kw['action'] = SCons.Action.CommandGeneratorAction(kw['generator'], {}) - del kw['generator'] - elif kw.has_key('action'): - source_ext_match = kw.get('source_ext_match', 1) - if kw.has_key('source_ext_match'): - del kw['source_ext_match'] - if SCons.Util.is_Dict(kw['action']): - composite = DictCmdGenerator(kw['action'], source_ext_match) - kw['action'] = SCons.Action.CommandGeneratorAction(composite, {}) - kw['src_suffix'] = composite.src_suffixes() - else: - kw['action'] = SCons.Action.Action(kw['action']) - - if kw.has_key('emitter'): - emitter = kw['emitter'] - if SCons.Util.is_String(emitter): - # This allows users to pass in an Environment - # variable reference (like "$FOO") as an emitter. - # We will look in that Environment variable for - # a callable to use as the actual emitter. - var = SCons.Util.get_environment_var(emitter) - if not var: - raise UserError, "Supplied emitter '%s' does not appear to refer to an Environment variable" % emitter - kw['emitter'] = EmitterProxy(var) - elif SCons.Util.is_Dict(emitter): - kw['emitter'] = DictEmitter(emitter) - elif SCons.Util.is_List(emitter): - kw['emitter'] = ListEmitter(emitter) - - result = apply(BuilderBase, (), kw) - - if not composite is None: - result = CompositeBuilder(result, composite) - - return result - -def _node_errors(builder, env, tlist, slist): - """Validate that the lists of target and source nodes are - legal for this builder and environment. Raise errors or - issue warnings as appropriate. - """ - - # First, figure out if there are any errors in the way the targets - # were specified. - for t in tlist: - if t.side_effect: - raise UserError, "Multiple ways to build the same target were specified for: %s" % t - if t.has_explicit_builder(): - if not t.env is None and not t.env is env: - action = t.builder.action - t_contents = action.get_contents(tlist, slist, t.env) - contents = action.get_contents(tlist, slist, env) - - if t_contents == contents: - msg = "Two different environments were specified for target %s,\n\tbut they appear to have the same action: %s" % (t, action.genstring(tlist, slist, t.env)) - SCons.Warnings.warn(SCons.Warnings.DuplicateEnvironmentWarning, msg) - else: - msg = "Two environments with different actions were specified for the same target: %s" % t - raise UserError, msg - if builder.multi: - if t.builder != builder: - msg = "Two different builders (%s and %s) were specified for the same target: %s" % (t.builder.get_name(env), builder.get_name(env), t) - raise UserError, msg - # TODO(batch): list constructed each time! - if t.get_executor().get_all_targets() != tlist: - msg = "Two different target lists have a target in common: %s (from %s and from %s)" % (t, map(str, t.get_executor().get_all_targets()), map(str, tlist)) - raise UserError, msg - elif t.sources != slist: - msg = "Multiple ways to build the same target were specified for: %s (from %s and from %s)" % (t, map(str, t.sources), map(str, slist)) - raise UserError, msg - - if builder.single_source: - if len(slist) > 1: - raise UserError, "More than one source given for single-source builder: targets=%s sources=%s" % (map(str,tlist), map(str,slist)) - -class EmitterProxy: - """This is a callable class that can act as a - Builder emitter. It holds on to a string that - is a key into an Environment dictionary, and will - look there at actual build time to see if it holds - a callable. If so, we will call that as the actual - emitter.""" - def __init__(self, var): - self.var = SCons.Util.to_String(var) - - def __call__(self, target, source, env): - emitter = self.var - - # Recursively substitute the variable. - # We can't use env.subst() because it deals only - # in strings. Maybe we should change that? - while SCons.Util.is_String(emitter) and env.has_key(emitter): - emitter = env[emitter] - if callable(emitter): - target, source = emitter(target, source, env) - elif SCons.Util.is_List(emitter): - for e in emitter: - target, source = e(target, source, env) - - return (target, source) - - - def __cmp__(self, other): - return cmp(self.var, other.var) - -class BuilderBase: - """Base class for Builders, objects that create output - nodes (files) from input nodes (files). - """ - - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - memoizer_counters = [] - - def __init__(self, action = None, - prefix = '', - suffix = '', - src_suffix = '', - target_factory = None, - source_factory = None, - target_scanner = None, - source_scanner = None, - emitter = None, - multi = 0, - env = None, - single_source = 0, - name = None, - chdir = _null, - is_explicit = 1, - src_builder = None, - ensure_suffix = False, - **overrides): - if __debug__: logInstanceCreation(self, 'Builder.BuilderBase') - self._memo = {} - self.action = action - self.multi = multi - if SCons.Util.is_Dict(prefix): - prefix = CallableSelector(prefix) - self.prefix = prefix - if SCons.Util.is_Dict(suffix): - suffix = CallableSelector(suffix) - self.env = env - self.single_source = single_source - if overrides.has_key('overrides'): - SCons.Warnings.warn(SCons.Warnings.DeprecatedWarning, - "The \"overrides\" keyword to Builder() creation has been deprecated;\n" +\ - "\tspecify the items as keyword arguments to the Builder() call instead.") - overrides.update(overrides['overrides']) - del overrides['overrides'] - if overrides.has_key('scanner'): - SCons.Warnings.warn(SCons.Warnings.DeprecatedWarning, - "The \"scanner\" keyword to Builder() creation has been deprecated;\n" - "\tuse: source_scanner or target_scanner as appropriate.") - del overrides['scanner'] - self.overrides = overrides - - self.set_suffix(suffix) - self.set_src_suffix(src_suffix) - self.ensure_suffix = ensure_suffix - - self.target_factory = target_factory - self.source_factory = source_factory - self.target_scanner = target_scanner - self.source_scanner = source_scanner - - self.emitter = emitter - - # Optional Builder name should only be used for Builders - # that don't get attached to construction environments. - if name: - self.name = name - self.executor_kw = {} - if not chdir is _null: - self.executor_kw['chdir'] = chdir - self.is_explicit = is_explicit - - if src_builder is None: - src_builder = [] - elif not SCons.Util.is_List(src_builder): - src_builder = [ src_builder ] - self.src_builder = src_builder - - def __nonzero__(self): - raise InternalError, "Do not test for the Node.builder attribute directly; use Node.has_builder() instead" - - def get_name(self, env): - """Attempts to get the name of the Builder. - - Look at the BUILDERS variable of env, expecting it to be a - dictionary containing this Builder, and return the key of the - dictionary. If there's no key, then return a directly-configured - name (if there is one) or the name of the class (by default).""" - - try: - index = env['BUILDERS'].values().index(self) - return env['BUILDERS'].keys()[index] - except (AttributeError, KeyError, TypeError, ValueError): - try: - return self.name - except AttributeError: - return str(self.__class__) - - def __cmp__(self, other): - return cmp(self.__dict__, other.__dict__) - - def splitext(self, path, env=None): - if not env: - env = self.env - if env: - suffixes = self.src_suffixes(env) - else: - suffixes = [] - return match_splitext(path, suffixes) - - def _adjustixes(self, files, pre, suf, ensure_suffix=False): - if not files: - return [] - result = [] - if not SCons.Util.is_List(files): - files = [files] - - for f in files: - if SCons.Util.is_String(f): - f = SCons.Util.adjustixes(f, pre, suf, ensure_suffix) - result.append(f) - return result - - def _create_nodes(self, env, target = None, source = None): - """Create and return lists of target and source nodes. - """ - src_suf = self.get_src_suffix(env) - - target_factory = env.get_factory(self.target_factory) - source_factory = env.get_factory(self.source_factory) - - source = self._adjustixes(source, None, src_suf) - slist = env.arg2nodes(source, source_factory) - - pre = self.get_prefix(env, slist) - suf = self.get_suffix(env, slist) - - if target is None: - try: - t_from_s = slist[0].target_from_source - except AttributeError: - raise UserError("Do not know how to create a target from source `%s'" % slist[0]) - except IndexError: - tlist = [] - else: - splitext = lambda S,self=self,env=env: self.splitext(S,env) - tlist = [ t_from_s(pre, suf, splitext) ] - else: - target = self._adjustixes(target, pre, suf, self.ensure_suffix) - tlist = env.arg2nodes(target, target_factory, target=target, source=source) - - if self.emitter: - # The emitter is going to do str(node), but because we're - # being called *from* a builder invocation, the new targets - # don't yet have a builder set on them and will look like - # source files. Fool the emitter's str() calls by setting - # up a temporary builder on the new targets. - new_targets = [] - for t in tlist: - if not t.is_derived(): - t.builder_set(self) - new_targets.append(t) - - orig_tlist = tlist[:] - orig_slist = slist[:] - - target, source = self.emitter(target=tlist, source=slist, env=env) - - # Now delete the temporary builders that we attached to any - # new targets, so that _node_errors() doesn't do weird stuff - # to them because it thinks they already have builders. - for t in new_targets: - if t.builder is self: - # Only delete the temporary builder if the emitter - # didn't change it on us. - t.builder_set(None) - - # Have to call arg2nodes yet again, since it is legal for - # emitters to spit out strings as well as Node instances. - tlist = env.arg2nodes(target, target_factory, - target=orig_tlist, source=orig_slist) - slist = env.arg2nodes(source, source_factory, - target=orig_tlist, source=orig_slist) - - return tlist, slist - - def _execute(self, env, target, source, overwarn={}, executor_kw={}): - # We now assume that target and source are lists or None. - if self.src_builder: - source = self.src_builder_sources(env, source, overwarn) - - if self.single_source and len(source) > 1 and target is None: - result = [] - if target is None: target = [None]*len(source) - for tgt, src in zip(target, source): - if not tgt is None: tgt = [tgt] - if not src is None: src = [src] - result.extend(self._execute(env, tgt, src, overwarn)) - return SCons.Node.NodeList(result) - - overwarn.warn() - - tlist, slist = self._create_nodes(env, target, source) - - # Check for errors with the specified target/source lists. - _node_errors(self, env, tlist, slist) - - # The targets are fine, so find or make the appropriate Executor to - # build this particular list of targets from this particular list of - # sources. - - executor = None - key = None - - if self.multi: - try: - executor = tlist[0].get_executor(create = 0) - except (AttributeError, IndexError): - pass - else: - executor.add_sources(slist) - - if executor is None: - if not self.action: - fmt = "Builder %s must have an action to build %s." - raise UserError, fmt % (self.get_name(env or self.env), - map(str,tlist)) - key = self.action.batch_key(env or self.env, tlist, slist) - if key: - try: - executor = SCons.Executor.GetBatchExecutor(key) - except KeyError: - pass - else: - executor.add_batch(tlist, slist) - - if executor is None: - executor = SCons.Executor.Executor(self.action, env, [], - tlist, slist, executor_kw) - if key: - SCons.Executor.AddBatchExecutor(key, executor) - - # Now set up the relevant information in the target Nodes themselves. - for t in tlist: - t.cwd = env.fs.getcwd() - t.builder_set(self) - t.env_set(env) - t.add_source(slist) - t.set_executor(executor) - t.set_explicit(self.is_explicit) - - return SCons.Node.NodeList(tlist) - - def __call__(self, env, target=None, source=None, chdir=_null, **kw): - # We now assume that target and source are lists or None. - # The caller (typically Environment.BuilderWrapper) is - # responsible for converting any scalar values to lists. - if chdir is _null: - ekw = self.executor_kw - else: - ekw = self.executor_kw.copy() - ekw['chdir'] = chdir - if kw: - if kw.has_key('srcdir'): - def prependDirIfRelative(f, srcdir=kw['srcdir']): - import os.path - if SCons.Util.is_String(f) and not os.path.isabs(f): - f = os.path.join(srcdir, f) - return f - if not SCons.Util.is_List(source): - source = [source] - source = map(prependDirIfRelative, source) - del kw['srcdir'] - if self.overrides: - env_kw = self.overrides.copy() - env_kw.update(kw) - else: - env_kw = kw - else: - env_kw = self.overrides - env = env.Override(env_kw) - return self._execute(env, target, source, OverrideWarner(kw), ekw) - - def adjust_suffix(self, suff): - if suff and not suff[0] in [ '.', '_', '$' ]: - return '.' + suff - return suff - - def get_prefix(self, env, sources=[]): - prefix = self.prefix - if callable(prefix): - prefix = prefix(env, sources) - return env.subst(prefix) - - def set_suffix(self, suffix): - if not callable(suffix): - suffix = self.adjust_suffix(suffix) - self.suffix = suffix - - def get_suffix(self, env, sources=[]): - suffix = self.suffix - if callable(suffix): - suffix = suffix(env, sources) - return env.subst(suffix) - - def set_src_suffix(self, src_suffix): - if not src_suffix: - src_suffix = [] - elif not SCons.Util.is_List(src_suffix): - src_suffix = [ src_suffix ] - adjust = lambda suf, s=self: \ - callable(suf) and suf or s.adjust_suffix(suf) - self.src_suffix = map(adjust, src_suffix) - - def get_src_suffix(self, env): - """Get the first src_suffix in the list of src_suffixes.""" - ret = self.src_suffixes(env) - if not ret: - return '' - return ret[0] - - def add_emitter(self, suffix, emitter): - """Add a suffix-emitter mapping to this Builder. - - This assumes that emitter has been initialized with an - appropriate dictionary type, and will throw a TypeError if - not, so the caller is responsible for knowing that this is an - appropriate method to call for the Builder in question. - """ - self.emitter[suffix] = emitter - - def add_src_builder(self, builder): - """ - Add a new Builder to the list of src_builders. - - This requires wiping out cached values so that the computed - lists of source suffixes get re-calculated. - """ - self._memo = {} - self.src_builder.append(builder) - - def _get_sdict(self, env): - """ - Returns a dictionary mapping all of the source suffixes of all - src_builders of this Builder to the underlying Builder that - should be called first. - - This dictionary is used for each target specified, so we save a - lot of extra computation by memoizing it for each construction - environment. - - Note that this is re-computed each time, not cached, because there - might be changes to one of our source Builders (or one of their - source Builders, and so on, and so on...) that we can't "see." - - The underlying methods we call cache their computed values, - though, so we hope repeatedly aggregating them into a dictionary - like this won't be too big a hit. We may need to look for a - better way to do this if performance data show this has turned - into a significant bottleneck. - """ - sdict = {} - for bld in self.get_src_builders(env): - for suf in bld.src_suffixes(env): - sdict[suf] = bld - return sdict - - def src_builder_sources(self, env, source, overwarn={}): - sdict = self._get_sdict(env) - - src_suffixes = self.src_suffixes(env) - - lengths = list(set(map(len, src_suffixes))) - - def match_src_suffix(name, src_suffixes=src_suffixes, lengths=lengths): - node_suffixes = map(lambda l, n=name: n[-l:], lengths) - for suf in src_suffixes: - if suf in node_suffixes: - return suf - return None - - result = [] - for s in SCons.Util.flatten(source): - if SCons.Util.is_String(s): - match_suffix = match_src_suffix(env.subst(s)) - if not match_suffix and not '.' in s: - src_suf = self.get_src_suffix(env) - s = self._adjustixes(s, None, src_suf)[0] - else: - match_suffix = match_src_suffix(s.name) - if match_suffix: - try: - bld = sdict[match_suffix] - except KeyError: - result.append(s) - else: - tlist = bld._execute(env, None, [s], overwarn) - # If the subsidiary Builder returned more than one - # target, then filter out any sources that this - # Builder isn't capable of building. - if len(tlist) > 1: - mss = lambda t, m=match_src_suffix: m(t.name) - tlist = filter(mss, tlist) - result.extend(tlist) - else: - result.append(s) - - source_factory = env.get_factory(self.source_factory) - - return env.arg2nodes(result, source_factory) - - def _get_src_builders_key(self, env): - return id(env) - - memoizer_counters.append(SCons.Memoize.CountDict('get_src_builders', _get_src_builders_key)) - - def get_src_builders(self, env): - """ - Returns the list of source Builders for this Builder. - - This exists mainly to look up Builders referenced as - strings in the 'BUILDER' variable of the construction - environment and cache the result. - """ - memo_key = id(env) - try: - memo_dict = self._memo['get_src_builders'] - except KeyError: - memo_dict = {} - self._memo['get_src_builders'] = memo_dict - else: - try: - return memo_dict[memo_key] - except KeyError: - pass - - builders = [] - for bld in self.src_builder: - if SCons.Util.is_String(bld): - try: - bld = env['BUILDERS'][bld] - except KeyError: - continue - builders.append(bld) - - memo_dict[memo_key] = builders - return builders - - def _subst_src_suffixes_key(self, env): - return id(env) - - memoizer_counters.append(SCons.Memoize.CountDict('subst_src_suffixes', _subst_src_suffixes_key)) - - def subst_src_suffixes(self, env): - """ - The suffix list may contain construction variable expansions, - so we have to evaluate the individual strings. To avoid doing - this over and over, we memoize the results for each construction - environment. - """ - memo_key = id(env) - try: - memo_dict = self._memo['subst_src_suffixes'] - except KeyError: - memo_dict = {} - self._memo['subst_src_suffixes'] = memo_dict - else: - try: - return memo_dict[memo_key] - except KeyError: - pass - suffixes = map(lambda x, s=self, e=env: e.subst(x), self.src_suffix) - memo_dict[memo_key] = suffixes - return suffixes - - def src_suffixes(self, env): - """ - Returns the list of source suffixes for all src_builders of this - Builder. - - This is essentially a recursive descent of the src_builder "tree." - (This value isn't cached because there may be changes in a - src_builder many levels deep that we can't see.) - """ - sdict = {} - suffixes = self.subst_src_suffixes(env) - for s in suffixes: - sdict[s] = 1 - for builder in self.get_src_builders(env): - for s in builder.src_suffixes(env): - if not sdict.has_key(s): - sdict[s] = 1 - suffixes.append(s) - return suffixes - -class CompositeBuilder(SCons.Util.Proxy): - """A Builder Proxy whose main purpose is to always have - a DictCmdGenerator as its action, and to provide access - to the DictCmdGenerator's add_action() method. - """ - - def __init__(self, builder, cmdgen): - if __debug__: logInstanceCreation(self, 'Builder.CompositeBuilder') - SCons.Util.Proxy.__init__(self, builder) - - # cmdgen should always be an instance of DictCmdGenerator. - self.cmdgen = cmdgen - self.builder = builder - - def add_action(self, suffix, action): - self.cmdgen.add_action(suffix, action) - self.set_src_suffix(self.cmdgen.src_suffixes()) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/CacheDir.py b/3rdParty/SCons/scons-local/SCons/CacheDir.py deleted file mode 100644 index eda431a..0000000 --- a/3rdParty/SCons/scons-local/SCons/CacheDir.py +++ /dev/null @@ -1,217 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/CacheDir.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """ -CacheDir support -""" - -import os.path -import stat -import string -import sys - -import SCons.Action - -cache_enabled = True -cache_debug = False -cache_force = False -cache_show = False - -def CacheRetrieveFunc(target, source, env): - t = target[0] - fs = t.fs - cd = env.get_CacheDir() - cachedir, cachefile = cd.cachepath(t) - if not fs.exists(cachefile): - cd.CacheDebug('CacheRetrieve(%s): %s not in cache\n', t, cachefile) - return 1 - cd.CacheDebug('CacheRetrieve(%s): retrieving from %s\n', t, cachefile) - if SCons.Action.execute_actions: - if fs.islink(cachefile): - fs.symlink(fs.readlink(cachefile), t.path) - else: - env.copy_from_cache(cachefile, t.path) - st = fs.stat(cachefile) - fs.chmod(t.path, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE) - return 0 - -def CacheRetrieveString(target, source, env): - t = target[0] - fs = t.fs - cd = env.get_CacheDir() - cachedir, cachefile = cd.cachepath(t) - if t.fs.exists(cachefile): - return "Retrieved `%s' from cache" % t.path - return None - -CacheRetrieve = SCons.Action.Action(CacheRetrieveFunc, CacheRetrieveString) - -CacheRetrieveSilent = SCons.Action.Action(CacheRetrieveFunc, None) - -def CachePushFunc(target, source, env): - t = target[0] - if t.nocache: - return - fs = t.fs - cd = env.get_CacheDir() - cachedir, cachefile = cd.cachepath(t) - if fs.exists(cachefile): - # Don't bother copying it if it's already there. Note that - # usually this "shouldn't happen" because if the file already - # existed in cache, we'd have retrieved the file from there, - # not built it. This can happen, though, in a race, if some - # other person running the same build pushes their copy to - # the cache after we decide we need to build it but before our - # build completes. - cd.CacheDebug('CachePush(%s): %s already exists in cache\n', t, cachefile) - return - - cd.CacheDebug('CachePush(%s): pushing to %s\n', t, cachefile) - - tempfile = cachefile+'.tmp'+str(os.getpid()) - errfmt = "Unable to copy %s to cache. Cache file is %s" - - if not fs.isdir(cachedir): - try: - fs.makedirs(cachedir) - except EnvironmentError: - # We may have received an exception because another process - # has beaten us creating the directory. - if not fs.isdir(cachedir): - msg = errfmt % (str(target), cachefile) - raise SCons.Errors.EnvironmentError, msg - - try: - if fs.islink(t.path): - fs.symlink(fs.readlink(t.path), tempfile) - else: - fs.copy2(t.path, tempfile) - fs.rename(tempfile, cachefile) - st = fs.stat(t.path) - fs.chmod(cachefile, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE) - except EnvironmentError: - # It's possible someone else tried writing the file at the - # same time we did, or else that there was some problem like - # the CacheDir being on a separate file system that's full. - # In any case, inability to push a file to cache doesn't affect - # the correctness of the build, so just print a warning. - msg = errfmt % (str(target), cachefile) - SCons.Warnings.warn(SCons.Warnings.CacheWriteErrorWarning, msg) - -CachePush = SCons.Action.Action(CachePushFunc, None) - -class CacheDir: - - def __init__(self, path): - try: - import hashlib - except ImportError: - msg = "No hashlib or MD5 module available, CacheDir() not supported" - SCons.Warnings.warn(SCons.Warnings.NoMD5ModuleWarning, msg) - self.path = None - else: - self.path = path - self.current_cache_debug = None - self.debugFP = None - - def CacheDebug(self, fmt, target, cachefile): - if cache_debug != self.current_cache_debug: - if cache_debug == '-': - self.debugFP = sys.stdout - elif cache_debug: - self.debugFP = open(cache_debug, 'w') - else: - self.debugFP = None - self.current_cache_debug = cache_debug - if self.debugFP: - self.debugFP.write(fmt % (target, os.path.split(cachefile)[1])) - - def is_enabled(self): - return (cache_enabled and not self.path is None) - - def cachepath(self, node): - """ - """ - if not self.is_enabled(): - return None, None - - sig = node.get_cachedir_bsig() - subdir = string.upper(sig[0]) - dir = os.path.join(self.path, subdir) - return dir, os.path.join(dir, sig) - - def retrieve(self, node): - """ - This method is called from multiple threads in a parallel build, - so only do thread safe stuff here. Do thread unsafe stuff in - built(). - - Note that there's a special trick here with the execute flag - (one that's not normally done for other actions). Basically - if the user requested a no_exec (-n) build, then - SCons.Action.execute_actions is set to 0 and when any action - is called, it does its showing but then just returns zero - instead of actually calling the action execution operation. - The problem for caching is that if the file does NOT exist in - cache then the CacheRetrieveString won't return anything to - show for the task, but the Action.__call__ won't call - CacheRetrieveFunc; instead it just returns zero, which makes - the code below think that the file *was* successfully - retrieved from the cache, therefore it doesn't do any - subsequent building. However, the CacheRetrieveString didn't - print anything because it didn't actually exist in the cache, - and no more build actions will be performed, so the user just - sees nothing. The fix is to tell Action.__call__ to always - execute the CacheRetrieveFunc and then have the latter - explicitly check SCons.Action.execute_actions itself. - """ - if not self.is_enabled(): - return False - - env = node.get_build_env() - if cache_show: - if CacheRetrieveSilent(node, [], env, execute=1) == 0: - node.build(presub=0, execute=0) - return True - else: - if CacheRetrieve(node, [], env, execute=1) == 0: - return True - - return False - - def push(self, node): - if not self.is_enabled(): - return - return CachePush(node, [], node.get_build_env()) - - def push_if_forced(self, node): - if cache_force: - return self.push(node) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Conftest.py b/3rdParty/SCons/scons-local/SCons/Conftest.py deleted file mode 100644 index 6327353..0000000 --- a/3rdParty/SCons/scons-local/SCons/Conftest.py +++ /dev/null @@ -1,784 +0,0 @@ -"""SCons.Conftest - -Autoconf-like configuration support; low level implementation of tests. -""" - -# -# Copyright (c) 2003 Stichting NLnet Labs -# Copyright (c) 2001, 2002, 2003 Steven Knight -# -# 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. -# - -# -# The purpose of this module is to define how a check is to be performed. -# Use one of the Check...() functions below. -# - -# -# A context class is used that defines functions for carrying out the tests, -# logging and messages. The following methods and members must be present: -# -# context.Display(msg) Function called to print messages that are normally -# displayed for the user. Newlines are explicitly used. -# The text should also be written to the logfile! -# -# context.Log(msg) Function called to write to a log file. -# -# context.BuildProg(text, ext) -# Function called to build a program, using "ext" for the -# file extention. Must return an empty string for -# success, an error message for failure. -# For reliable test results building should be done just -# like an actual program would be build, using the same -# command and arguments (including configure results so -# far). -# -# context.CompileProg(text, ext) -# Function called to compile a program, using "ext" for -# the file extention. Must return an empty string for -# success, an error message for failure. -# For reliable test results compiling should be done just -# like an actual source file would be compiled, using the -# same command and arguments (including configure results -# so far). -# -# context.AppendLIBS(lib_name_list) -# Append "lib_name_list" to the value of LIBS. -# "lib_namelist" is a list of strings. -# Return the value of LIBS before changing it (any type -# can be used, it is passed to SetLIBS() later. -# -# context.SetLIBS(value) -# Set LIBS to "value". The type of "value" is what -# AppendLIBS() returned. -# Return the value of LIBS before changing it (any type -# can be used, it is passed to SetLIBS() later. -# -# context.headerfilename -# Name of file to append configure results to, usually -# "confdefs.h". -# The file must not exist or be empty when starting. -# Empty or None to skip this (some tests will not work!). -# -# context.config_h (may be missing). If present, must be a string, which -# will be filled with the contents of a config_h file. -# -# context.vardict Dictionary holding variables used for the tests and -# stores results from the tests, used for the build -# commands. -# Normally contains "CC", "LIBS", "CPPFLAGS", etc. -# -# context.havedict Dictionary holding results from the tests that are to -# be used inside a program. -# Names often start with "HAVE_". These are zero -# (feature not present) or one (feature present). Other -# variables may have any value, e.g., "PERLVERSION" can -# be a number and "SYSTEMNAME" a string. -# - -import re -import string -from types import IntType - -# -# PUBLIC VARIABLES -# - -LogInputFiles = 1 # Set that to log the input files in case of a failed test -LogErrorMessages = 1 # Set that to log Conftest-generated error messages - -# -# PUBLIC FUNCTIONS -# - -# Generic remarks: -# - When a language is specified which is not supported the test fails. The -# message is a bit different, because not all the arguments for the normal -# message are available yet (chicken-egg problem). - - -def CheckBuilder(context, text = None, language = None): - """ - Configure check to see if the compiler works. - Note that this uses the current value of compiler and linker flags, make - sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly. - "language" should be "C" or "C++" and is used to select the compiler. - Default is "C". - "text" may be used to specify the code to be build. - Returns an empty string for success, an error message for failure. - """ - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("%s\n" % msg) - return msg - - if not text: - text = """ -int main() { - return 0; -} -""" - - context.Display("Checking if building a %s file works... " % lang) - ret = context.BuildProg(text, suffix) - _YesNoResult(context, ret, None, text) - return ret - -def CheckCC(context): - """ - Configure check for a working C compiler. - - This checks whether the C compiler, as defined in the $CC construction - variable, can compile a C source file. It uses the current $CCCOM value - too, so that it can test against non working flags. - - """ - context.Display("Checking whether the C compiler works") - text = """ -int main() -{ - return 0; -} -""" - ret = _check_empty_program(context, 'CC', text, 'C') - _YesNoResult(context, ret, None, text) - return ret - -def CheckSHCC(context): - """ - Configure check for a working shared C compiler. - - This checks whether the C compiler, as defined in the $SHCC construction - variable, can compile a C source file. It uses the current $SHCCCOM value - too, so that it can test against non working flags. - - """ - context.Display("Checking whether the (shared) C compiler works") - text = """ -int foo() -{ - return 0; -} -""" - ret = _check_empty_program(context, 'SHCC', text, 'C', use_shared = True) - _YesNoResult(context, ret, None, text) - return ret - -def CheckCXX(context): - """ - Configure check for a working CXX compiler. - - This checks whether the CXX compiler, as defined in the $CXX construction - variable, can compile a CXX source file. It uses the current $CXXCOM value - too, so that it can test against non working flags. - - """ - context.Display("Checking whether the C++ compiler works") - text = """ -int main() -{ - return 0; -} -""" - ret = _check_empty_program(context, 'CXX', text, 'C++') - _YesNoResult(context, ret, None, text) - return ret - -def CheckSHCXX(context): - """ - Configure check for a working shared CXX compiler. - - This checks whether the CXX compiler, as defined in the $SHCXX construction - variable, can compile a CXX source file. It uses the current $SHCXXCOM value - too, so that it can test against non working flags. - - """ - context.Display("Checking whether the (shared) C++ compiler works") - text = """ -int main() -{ - return 0; -} -""" - ret = _check_empty_program(context, 'SHCXX', text, 'C++', use_shared = True) - _YesNoResult(context, ret, None, text) - return ret - -def _check_empty_program(context, comp, text, language, use_shared = False): - """Return 0 on success, 1 otherwise.""" - if not context.env.has_key(comp) or not context.env[comp]: - # The compiler construction variable is not set or empty - return 1 - - lang, suffix, msg = _lang2suffix(language) - if msg: - return 1 - - if use_shared: - return context.CompileSharedObject(text, suffix) - else: - return context.CompileProg(text, suffix) - - -def CheckFunc(context, function_name, header = None, language = None): - """ - Configure check for a function "function_name". - "language" should be "C" or "C++" and is used to select the compiler. - Default is "C". - Optional "header" can be defined to define a function prototype, include a - header file or anything else that comes before main(). - Sets HAVE_function_name in context.havedict according to the result. - Note that this uses the current value of compiler and linker flags, make - sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly. - Returns an empty string for success, an error message for failure. - """ - - # Remarks from autoconf: - # - Don't include <ctype.h> because on OSF/1 3.0 it includes <sys/types.h> - # which includes <sys/select.h> which contains a prototype for select. - # Similarly for bzero. - # - assert.h is included to define __stub macros and hopefully few - # prototypes, which can conflict with char $1(); below. - # - Override any gcc2 internal prototype to avoid an error. - # - We use char for the function declaration because int might match the - # return type of a gcc2 builtin and then its argument prototype would - # still apply. - # - The GNU C library defines this for functions which it implements to - # always fail with ENOSYS. Some functions are actually named something - # starting with __ and the normal name is an alias. - - if context.headerfilename: - includetext = '#include "%s"' % context.headerfilename - else: - includetext = '' - if not header: - header = """ -#ifdef __cplusplus -extern "C" -#endif -char %s();""" % function_name - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for %s(): %s\n" % (function_name, msg)) - return msg - - text = """ -%(include)s -#include <assert.h> -%(hdr)s - -int main() { -#if defined (__stub_%(name)s) || defined (__stub___%(name)s) - fail fail fail -#else - %(name)s(); -#endif - - return 0; -} -""" % { 'name': function_name, - 'include': includetext, - 'hdr': header } - - context.Display("Checking for %s function %s()... " % (lang, function_name)) - ret = context.BuildProg(text, suffix) - _YesNoResult(context, ret, "HAVE_" + function_name, text, - "Define to 1 if the system has the function `%s'." %\ - function_name) - return ret - - -def CheckHeader(context, header_name, header = None, language = None, - include_quotes = None): - """ - Configure check for a C or C++ header file "header_name". - Optional "header" can be defined to do something before including the - header file (unusual, supported for consistency). - "language" should be "C" or "C++" and is used to select the compiler. - Default is "C". - Sets HAVE_header_name in context.havedict according to the result. - Note that this uses the current value of compiler and linker flags, make - sure $CFLAGS and $CPPFLAGS are set correctly. - Returns an empty string for success, an error message for failure. - """ - # Why compile the program instead of just running the preprocessor? - # It is possible that the header file exists, but actually using it may - # fail (e.g., because it depends on other header files). Thus this test is - # more strict. It may require using the "header" argument. - # - # Use <> by default, because the check is normally used for system header - # files. SCons passes '""' to overrule this. - - # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H. - if context.headerfilename: - includetext = '#include "%s"\n' % context.headerfilename - else: - includetext = '' - if not header: - header = "" - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for header file %s: %s\n" - % (header_name, msg)) - return msg - - if not include_quotes: - include_quotes = "<>" - - text = "%s%s\n#include %s%s%s\n\n" % (includetext, header, - include_quotes[0], header_name, include_quotes[1]) - - context.Display("Checking for %s header file %s... " % (lang, header_name)) - ret = context.CompileProg(text, suffix) - _YesNoResult(context, ret, "HAVE_" + header_name, text, - "Define to 1 if you have the <%s> header file." % header_name) - return ret - - -def CheckType(context, type_name, fallback = None, - header = None, language = None): - """ - Configure check for a C or C++ type "type_name". - Optional "header" can be defined to include a header file. - "language" should be "C" or "C++" and is used to select the compiler. - Default is "C". - Sets HAVE_type_name in context.havedict according to the result. - Note that this uses the current value of compiler and linker flags, make - sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly. - Returns an empty string for success, an error message for failure. - """ - - # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H. - if context.headerfilename: - includetext = '#include "%s"' % context.headerfilename - else: - includetext = '' - if not header: - header = "" - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for %s type: %s\n" % (type_name, msg)) - return msg - - # Remarks from autoconf about this test: - # - Grepping for the type in include files is not reliable (grep isn't - # portable anyway). - # - Using "TYPE my_var;" doesn't work for const qualified types in C++. - # Adding an initializer is not valid for some C++ classes. - # - Using the type as parameter to a function either fails for K&$ C or for - # C++. - # - Using "TYPE *my_var;" is valid in C for some types that are not - # declared (struct something). - # - Using "sizeof(TYPE)" is valid when TYPE is actually a variable. - # - Using the previous two together works reliably. - text = """ -%(include)s -%(header)s - -int main() { - if ((%(name)s *) 0) - return 0; - if (sizeof (%(name)s)) - return 0; -} -""" % { 'include': includetext, - 'header': header, - 'name': type_name } - - context.Display("Checking for %s type %s... " % (lang, type_name)) - ret = context.BuildProg(text, suffix) - _YesNoResult(context, ret, "HAVE_" + type_name, text, - "Define to 1 if the system has the type `%s'." % type_name) - if ret and fallback and context.headerfilename: - f = open(context.headerfilename, "a") - f.write("typedef %s %s;\n" % (fallback, type_name)) - f.close() - - return ret - -def CheckTypeSize(context, type_name, header = None, language = None, expect = None): - """This check can be used to get the size of a given type, or to check whether - the type is of expected size. - - Arguments: - - type : str - the type to check - - includes : sequence - list of headers to include in the test code before testing the type - - language : str - 'C' or 'C++' - - expect : int - if given, will test wether the type has the given number of bytes. - If not given, will automatically find the size. - - Returns: - status : int - 0 if the check failed, or the found size of the type if the check succeeded.""" - - # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H. - if context.headerfilename: - includetext = '#include "%s"' % context.headerfilename - else: - includetext = '' - - if not header: - header = "" - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for %s type: %s\n" % (type_name, msg)) - return msg - - src = includetext + header - if not expect is None: - # Only check if the given size is the right one - context.Display('Checking %s is %d bytes... ' % (type_name, expect)) - - # test code taken from autoconf: this is a pretty clever hack to find that - # a type is of a given size using only compilation. This speeds things up - # quite a bit compared to straightforward code using TryRun - src = src + r""" -typedef %s scons_check_type; - -int main() -{ - static int test_array[1 - 2 * !(((long int) (sizeof(scons_check_type))) == %d)]; - test_array[0] = 0; - - return 0; -} -""" - - st = context.CompileProg(src % (type_name, expect), suffix) - if not st: - context.Display("yes\n") - _Have(context, "SIZEOF_%s" % type_name, expect, - "The size of `%s', as computed by sizeof." % type_name) - return expect - else: - context.Display("no\n") - _LogFailed(context, src, st) - return 0 - else: - # Only check if the given size is the right one - context.Message('Checking size of %s ... ' % type_name) - - # We have to be careful with the program we wish to test here since - # compilation will be attempted using the current environment's flags. - # So make sure that the program will compile without any warning. For - # example using: 'int main(int argc, char** argv)' will fail with the - # '-Wall -Werror' flags since the variables argc and argv would not be - # used in the program... - # - src = src + """ -#include <stdlib.h> -#include <stdio.h> -int main() { - printf("%d", (int)sizeof(""" + type_name + """)); - return 0; -} - """ - st, out = context.RunProg(src, suffix) - try: - size = int(out) - except ValueError: - # If cannot convert output of test prog to an integer (the size), - # something went wront, so just fail - st = 1 - size = 0 - - if not st: - context.Display("yes\n") - _Have(context, "SIZEOF_%s" % type_name, size, - "The size of `%s', as computed by sizeof." % type_name) - return size - else: - context.Display("no\n") - _LogFailed(context, src, st) - return 0 - - return 0 - -def CheckDeclaration(context, symbol, includes = None, language = None): - """Checks whether symbol is declared. - - Use the same test as autoconf, that is test whether the symbol is defined - as a macro or can be used as an r-value. - - Arguments: - symbol : str - the symbol to check - includes : str - Optional "header" can be defined to include a header file. - language : str - only C and C++ supported. - - Returns: - status : bool - True if the check failed, False if succeeded.""" - - # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H. - if context.headerfilename: - includetext = '#include "%s"' % context.headerfilename - else: - includetext = '' - - if not includes: - includes = "" - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for declaration %s: %s\n" % (type_name, msg)) - return msg - - src = includetext + includes - context.Display('Checking whether %s is declared... ' % symbol) - - src = src + r""" -int main() -{ -#ifndef %s - (void) %s; -#endif - ; - return 0; -} -""" % (symbol, symbol) - - st = context.CompileProg(src, suffix) - _YesNoResult(context, st, "HAVE_DECL_" + symbol, src, - "Set to 1 if %s is defined." % symbol) - return st - -def CheckLib(context, libs, func_name = None, header = None, - extra_libs = None, call = None, language = None, autoadd = 1): - """ - Configure check for a C or C++ libraries "libs". Searches through - the list of libraries, until one is found where the test succeeds. - Tests if "func_name" or "call" exists in the library. Note: if it exists - in another library the test succeeds anyway! - Optional "header" can be defined to include a header file. If not given a - default prototype for "func_name" is added. - Optional "extra_libs" is a list of library names to be added after - "lib_name" in the build command. To be used for libraries that "lib_name" - depends on. - Optional "call" replaces the call to "func_name" in the test code. It must - consist of complete C statements, including a trailing ";". - Both "func_name" and "call" arguments are optional, and in that case, just - linking against the libs is tested. - "language" should be "C" or "C++" and is used to select the compiler. - Default is "C". - Note that this uses the current value of compiler and linker flags, make - sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly. - Returns an empty string for success, an error message for failure. - """ - # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H. - if context.headerfilename: - includetext = '#include "%s"' % context.headerfilename - else: - includetext = '' - if not header: - header = "" - - text = """ -%s -%s""" % (includetext, header) - - # Add a function declaration if needed. - if func_name and func_name != "main": - if not header: - text = text + """ -#ifdef __cplusplus -extern "C" -#endif -char %s(); -""" % func_name - - # The actual test code. - if not call: - call = "%s();" % func_name - - # if no function to test, leave main() blank - text = text + """ -int -main() { - %s -return 0; -} -""" % (call or "") - - if call: - i = string.find(call, "\n") - if i > 0: - calltext = call[:i] + ".." - elif call[-1] == ';': - calltext = call[:-1] - else: - calltext = call - - for lib_name in libs: - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for library %s: %s\n" % (lib_name, msg)) - return msg - - # if a function was specified to run in main(), say it - if call: - context.Display("Checking for %s in %s library %s... " - % (calltext, lang, lib_name)) - # otherwise, just say the name of library and language - else: - context.Display("Checking for %s library %s... " - % (lang, lib_name)) - - if lib_name: - l = [ lib_name ] - if extra_libs: - l.extend(extra_libs) - oldLIBS = context.AppendLIBS(l) - sym = "HAVE_LIB" + lib_name - else: - oldLIBS = -1 - sym = None - - ret = context.BuildProg(text, suffix) - - _YesNoResult(context, ret, sym, text, - "Define to 1 if you have the `%s' library." % lib_name) - if oldLIBS != -1 and (ret or not autoadd): - context.SetLIBS(oldLIBS) - - if not ret: - return ret - - return ret - -# -# END OF PUBLIC FUNCTIONS -# - -def _YesNoResult(context, ret, key, text, comment = None): - """ - Handle the result of a test with a "yes" or "no" result. - "ret" is the return value: empty if OK, error message when not. - "key" is the name of the symbol to be defined (HAVE_foo). - "text" is the source code of the program used for testing. - "comment" is the C comment to add above the line defining the symbol (the - comment is automatically put inside a /* */). If None, no comment is added. - """ - if key: - _Have(context, key, not ret, comment) - if ret: - context.Display("no\n") - _LogFailed(context, text, ret) - else: - context.Display("yes\n") - - -def _Have(context, key, have, comment = None): - """ - Store result of a test in context.havedict and context.headerfilename. - "key" is a "HAVE_abc" name. It is turned into all CAPITALS and non- - alphanumerics are replaced by an underscore. - The value of "have" can be: - 1 - Feature is defined, add "#define key". - 0 - Feature is not defined, add "/* #undef key */". - Adding "undef" is what autoconf does. Not useful for the - compiler, but it shows that the test was done. - number - Feature is defined to this number "#define key have". - Doesn't work for 0 or 1, use a string then. - string - Feature is defined to this string "#define key have". - Give "have" as is should appear in the header file, include quotes - when desired and escape special characters! - """ - key_up = string.upper(key) - key_up = re.sub('[^A-Z0-9_]', '_', key_up) - context.havedict[key_up] = have - if have == 1: - line = "#define %s 1\n" % key_up - elif have == 0: - line = "/* #undef %s */\n" % key_up - elif type(have) == IntType: - line = "#define %s %d\n" % (key_up, have) - else: - line = "#define %s %s\n" % (key_up, str(have)) - - if comment is not None: - lines = "\n/* %s */\n" % comment + line - else: - lines = "\n" + line - - if context.headerfilename: - f = open(context.headerfilename, "a") - f.write(lines) - f.close() - elif hasattr(context,'config_h'): - context.config_h = context.config_h + lines - - -def _LogFailed(context, text, msg): - """ - Write to the log about a failed program. - Add line numbers, so that error messages can be understood. - """ - if LogInputFiles: - context.Log("Failed program was:\n") - lines = string.split(text, '\n') - if len(lines) and lines[-1] == '': - lines = lines[:-1] # remove trailing empty line - n = 1 - for line in lines: - context.Log("%d: %s\n" % (n, line)) - n = n + 1 - if LogErrorMessages: - context.Log("Error message: %s\n" % msg) - - -def _lang2suffix(lang): - """ - Convert a language name to a suffix. - When "lang" is empty or None C is assumed. - Returns a tuple (lang, suffix, None) when it works. - For an unrecognized language returns (None, None, msg). - Where: - lang = the unified language name - suffix = the suffix, including the leading dot - msg = an error message - """ - if not lang or lang in ["C", "c"]: - return ("C", ".c", None) - if lang in ["c++", "C++", "cpp", "CXX", "cxx"]: - return ("C++", ".cpp", None) - - return None, None, "Unsupported language: %s" % lang - - -# vim: set sw=4 et sts=4 tw=79 fo+=l: - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Debug.py b/3rdParty/SCons/scons-local/SCons/Debug.py deleted file mode 100644 index cc7041d..0000000 --- a/3rdParty/SCons/scons-local/SCons/Debug.py +++ /dev/null @@ -1,222 +0,0 @@ -"""SCons.Debug - -Code for debugging SCons internal things. Not everything here is -guaranteed to work all the way back to Python 1.5.2, and shouldn't be -needed by most users. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Debug.py 4043 2009/02/23 09:06:45 scons" - -import os -import string -import sys - -# Recipe 14.10 from the Python Cookbook. -try: - import weakref -except ImportError: - def logInstanceCreation(instance, name=None): - pass -else: - def logInstanceCreation(instance, name=None): - if name is None: - name = instance.__class__.__name__ - if not tracked_classes.has_key(name): - tracked_classes[name] = [] - tracked_classes[name].append(weakref.ref(instance)) - - - -tracked_classes = {} - -def string_to_classes(s): - if s == '*': - c = tracked_classes.keys() - c.sort() - return c - else: - return string.split(s) - -def fetchLoggedInstances(classes="*"): - classnames = string_to_classes(classes) - return map(lambda cn: (cn, len(tracked_classes[cn])), classnames) - -def countLoggedInstances(classes, file=sys.stdout): - for classname in string_to_classes(classes): - file.write("%s: %d\n" % (classname, len(tracked_classes[classname]))) - -def listLoggedInstances(classes, file=sys.stdout): - for classname in string_to_classes(classes): - file.write('\n%s:\n' % classname) - for ref in tracked_classes[classname]: - obj = ref() - if obj is not None: - file.write(' %s\n' % repr(obj)) - -def dumpLoggedInstances(classes, file=sys.stdout): - for classname in string_to_classes(classes): - file.write('\n%s:\n' % classname) - for ref in tracked_classes[classname]: - obj = ref() - if obj is not None: - file.write(' %s:\n' % obj) - for key, value in obj.__dict__.items(): - file.write(' %20s : %s\n' % (key, value)) - - - -if sys.platform[:5] == "linux": - # Linux doesn't actually support memory usage stats from getrusage(). - def memory(): - mstr = open('/proc/self/stat').read() - mstr = string.split(mstr)[22] - return int(mstr) -else: - try: - import resource - except ImportError: - try: - import win32process - import win32api - except ImportError: - def memory(): - return 0 - else: - def memory(): - process_handle = win32api.GetCurrentProcess() - memory_info = win32process.GetProcessMemoryInfo( process_handle ) - return memory_info['PeakWorkingSetSize'] - else: - def memory(): - res = resource.getrusage(resource.RUSAGE_SELF) - return res[4] - -# returns caller's stack -def caller_stack(*backlist): - import traceback - if not backlist: - backlist = [0] - result = [] - for back in backlist: - tb = traceback.extract_stack(limit=3+back) - key = tb[0][:3] - result.append('%s:%d(%s)' % func_shorten(key)) - return result - -caller_bases = {} -caller_dicts = {} - -# trace a caller's stack -def caller_trace(back=0): - import traceback - tb = traceback.extract_stack(limit=3+back) - tb.reverse() - callee = tb[1][:3] - caller_bases[callee] = caller_bases.get(callee, 0) + 1 - for caller in tb[2:]: - caller = callee + caller[:3] - try: - entry = caller_dicts[callee] - except KeyError: - caller_dicts[callee] = entry = {} - entry[caller] = entry.get(caller, 0) + 1 - callee = caller - -# print a single caller and its callers, if any -def _dump_one_caller(key, file, level=0): - l = [] - for c,v in caller_dicts[key].items(): - l.append((-v,c)) - l.sort() - leader = ' '*level - for v,c in l: - file.write("%s %6d %s:%d(%s)\n" % ((leader,-v) + func_shorten(c[-3:]))) - if caller_dicts.has_key(c): - _dump_one_caller(c, file, level+1) - -# print each call tree -def dump_caller_counts(file=sys.stdout): - keys = caller_bases.keys() - keys.sort() - for k in keys: - file.write("Callers of %s:%d(%s), %d calls:\n" - % (func_shorten(k) + (caller_bases[k],))) - _dump_one_caller(k, file) - -shorten_list = [ - ( '/scons/SCons/', 1), - ( '/src/engine/SCons/', 1), - ( '/usr/lib/python', 0), -] - -if os.sep != '/': - def platformize(t): - return (string.replace(t[0], '/', os.sep), t[1]) - shorten_list = map(platformize, shorten_list) - del platformize - -def func_shorten(func_tuple): - f = func_tuple[0] - for t in shorten_list: - i = string.find(f, t[0]) - if i >= 0: - if t[1]: - i = i + len(t[0]) - return (f[i:],)+func_tuple[1:] - return func_tuple - - -TraceFP = {} -if sys.platform == 'win32': - TraceDefault = 'con' -else: - TraceDefault = '/dev/tty' - -def Trace(msg, file=None, mode='w'): - """Write a trace message to a file. Whenever a file is specified, - it becomes the default for the next call to Trace().""" - global TraceDefault - if file is None: - file = TraceDefault - else: - TraceDefault = file - try: - fp = TraceFP[file] - except KeyError: - try: - fp = TraceFP[file] = open(file, mode) - except TypeError: - # Assume we were passed an open file pointer. - fp = file - fp.write(msg) - fp.flush() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Defaults.py b/3rdParty/SCons/scons-local/SCons/Defaults.py deleted file mode 100644 index d52bf59..0000000 --- a/3rdParty/SCons/scons-local/SCons/Defaults.py +++ /dev/null @@ -1,478 +0,0 @@ -"""SCons.Defaults - -Builders and other things for the local site. Here's where we'll -duplicate the functionality of autoconf until we move it into the -installation procedure or use something like qmconf. - -The code that reads the registry to find MSVC components was borrowed -from distutils.msvccompiler. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Defaults.py 4043 2009/02/23 09:06:45 scons" - - - -import os -import os.path -import errno -import shutil -import stat -import string -import time -import types -import sys - -import SCons.Action -import SCons.Builder -import SCons.CacheDir -import SCons.Environment -import SCons.PathList -import SCons.Subst -import SCons.Tool - -# A placeholder for a default Environment (for fetching source files -# from source code management systems and the like). This must be -# initialized later, after the top-level directory is set by the calling -# interface. -_default_env = None - -# Lazily instantiate the default environment so the overhead of creating -# it doesn't apply when it's not needed. -def _fetch_DefaultEnvironment(*args, **kw): - """ - Returns the already-created default construction environment. - """ - global _default_env - return _default_env - -def DefaultEnvironment(*args, **kw): - """ - Initial public entry point for creating the default construction - Environment. - - After creating the environment, we overwrite our name - (DefaultEnvironment) with the _fetch_DefaultEnvironment() function, - which more efficiently returns the initialized default construction - environment without checking for its existence. - - (This function still exists with its _default_check because someone - else (*cough* Script/__init__.py *cough*) may keep a reference - to this function. So we can't use the fully functional idiom of - having the name originally be a something that *only* creates the - construction environment and then overwrites the name.) - """ - global _default_env - if not _default_env: - import SCons.Util - _default_env = apply(SCons.Environment.Environment, args, kw) - if SCons.Util.md5: - _default_env.Decider('MD5') - else: - _default_env.Decider('timestamp-match') - global DefaultEnvironment - DefaultEnvironment = _fetch_DefaultEnvironment - _default_env._CacheDir_path = None - return _default_env - -# Emitters for setting the shared attribute on object files, -# and an action for checking that all of the source files -# going into a shared library are, in fact, shared. -def StaticObjectEmitter(target, source, env): - for tgt in target: - tgt.attributes.shared = None - return (target, source) - -def SharedObjectEmitter(target, source, env): - for tgt in target: - tgt.attributes.shared = 1 - return (target, source) - -def SharedFlagChecker(source, target, env): - same = env.subst('$STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME') - if same == '0' or same == '' or same == 'False': - for src in source: - try: - shared = src.attributes.shared - except AttributeError: - shared = None - if not shared: - raise SCons.Errors.UserError, "Source file: %s is static and is not compatible with shared target: %s" % (src, target[0]) - -SharedCheck = SCons.Action.Action(SharedFlagChecker, None) - -# Some people were using these variable name before we made -# SourceFileScanner part of the public interface. Don't break their -# SConscript files until we've given them some fair warning and a -# transition period. -CScan = SCons.Tool.CScanner -DScan = SCons.Tool.DScanner -LaTeXScan = SCons.Tool.LaTeXScanner -ObjSourceScan = SCons.Tool.SourceFileScanner -ProgScan = SCons.Tool.ProgramScanner - -# These aren't really tool scanners, so they don't quite belong with -# the rest of those in Tool/__init__.py, but I'm not sure where else -# they should go. Leave them here for now. -import SCons.Scanner.Dir -DirScanner = SCons.Scanner.Dir.DirScanner() -DirEntryScanner = SCons.Scanner.Dir.DirEntryScanner() - -# Actions for common languages. -CAction = SCons.Action.Action("$CCCOM", "$CCCOMSTR") -ShCAction = SCons.Action.Action("$SHCCCOM", "$SHCCCOMSTR") -CXXAction = SCons.Action.Action("$CXXCOM", "$CXXCOMSTR") -ShCXXAction = SCons.Action.Action("$SHCXXCOM", "$SHCXXCOMSTR") - -ASAction = SCons.Action.Action("$ASCOM", "$ASCOMSTR") -ASPPAction = SCons.Action.Action("$ASPPCOM", "$ASPPCOMSTR") - -LinkAction = SCons.Action.Action("$LINKCOM", "$LINKCOMSTR") -ShLinkAction = SCons.Action.Action("$SHLINKCOM", "$SHLINKCOMSTR") - -LdModuleLinkAction = SCons.Action.Action("$LDMODULECOM", "$LDMODULECOMSTR") - -# Common tasks that we allow users to perform in platform-independent -# ways by creating ActionFactory instances. -ActionFactory = SCons.Action.ActionFactory - -def get_paths_str(dest): - # If dest is a list, we need to manually call str() on each element - if SCons.Util.is_List(dest): - elem_strs = [] - for element in dest: - elem_strs.append('"' + str(element) + '"') - return '[' + string.join(elem_strs, ', ') + ']' - else: - return '"' + str(dest) + '"' - -def chmod_func(dest, mode): - SCons.Node.FS.invalidate_node_memos(dest) - if not SCons.Util.is_List(dest): - dest = [dest] - for element in dest: - os.chmod(str(element), mode) - -def chmod_strfunc(dest, mode): - return 'Chmod(%s, 0%o)' % (get_paths_str(dest), mode) - -Chmod = ActionFactory(chmod_func, chmod_strfunc) - -def copy_func(dest, src): - SCons.Node.FS.invalidate_node_memos(dest) - if SCons.Util.is_List(src) and os.path.isdir(dest): - for file in src: - shutil.copy2(file, dest) - return 0 - elif os.path.isfile(src): - return shutil.copy2(src, dest) - else: - return shutil.copytree(src, dest, 1) - -Copy = ActionFactory(copy_func, - lambda dest, src: 'Copy("%s", "%s")' % (dest, src), - convert=str) - -def delete_func(dest, must_exist=0): - SCons.Node.FS.invalidate_node_memos(dest) - if not SCons.Util.is_List(dest): - dest = [dest] - for entry in dest: - entry = str(entry) - if not must_exist and not os.path.exists(entry): - continue - if not os.path.exists(entry) or os.path.isfile(entry): - os.unlink(entry) - continue - else: - shutil.rmtree(entry, 1) - continue - -def delete_strfunc(dest, must_exist=0): - return 'Delete(%s)' % get_paths_str(dest) - -Delete = ActionFactory(delete_func, delete_strfunc) - -def mkdir_func(dest): - SCons.Node.FS.invalidate_node_memos(dest) - if not SCons.Util.is_List(dest): - dest = [dest] - for entry in dest: - try: - os.makedirs(str(entry)) - except os.error, e: - p = str(entry) - if (e[0] == errno.EEXIST or (sys.platform=='win32' and e[0]==183)) \ - and os.path.isdir(str(entry)): - pass # not an error if already exists - else: - raise - -Mkdir = ActionFactory(mkdir_func, - lambda dir: 'Mkdir(%s)' % get_paths_str(dir)) - -def move_func(dest, src): - SCons.Node.FS.invalidate_node_memos(dest) - SCons.Node.FS.invalidate_node_memos(src) - os.rename(src, dest) - -Move = ActionFactory(move_func, - lambda dest, src: 'Move("%s", "%s")' % (dest, src), - convert=str) - -def touch_func(dest): - SCons.Node.FS.invalidate_node_memos(dest) - if not SCons.Util.is_List(dest): - dest = [dest] - for file in dest: - file = str(file) - mtime = int(time.time()) - if os.path.exists(file): - atime = os.path.getatime(file) - else: - open(file, 'w') - atime = mtime - os.utime(file, (atime, mtime)) - -Touch = ActionFactory(touch_func, - lambda file: 'Touch(%s)' % get_paths_str(file)) - -# Internal utility functions - -def _concat(prefix, list, suffix, env, f=lambda x: x, target=None, source=None): - """ - Creates a new list from 'list' by first interpolating each element - in the list using the 'env' dictionary and then calling f on the - list, and finally calling _concat_ixes to concatenate 'prefix' and - 'suffix' onto each element of the list. - """ - if not list: - return list - - l = f(SCons.PathList.PathList(list).subst_path(env, target, source)) - if not l is None: - list = l - - return _concat_ixes(prefix, list, suffix, env) - -def _concat_ixes(prefix, list, suffix, env): - """ - Creates a new list from 'list' by concatenating the 'prefix' and - 'suffix' arguments onto each element of the list. A trailing space - on 'prefix' or leading space on 'suffix' will cause them to be put - into separate list elements rather than being concatenated. - """ - - result = [] - - # ensure that prefix and suffix are strings - prefix = str(env.subst(prefix, SCons.Subst.SUBST_RAW)) - suffix = str(env.subst(suffix, SCons.Subst.SUBST_RAW)) - - for x in list: - if isinstance(x, SCons.Node.FS.File): - result.append(x) - continue - x = str(x) - if x: - - if prefix: - if prefix[-1] == ' ': - result.append(prefix[:-1]) - elif x[:len(prefix)] != prefix: - x = prefix + x - - result.append(x) - - if suffix: - if suffix[0] == ' ': - result.append(suffix[1:]) - elif x[-len(suffix):] != suffix: - result[-1] = result[-1]+suffix - - return result - -def _stripixes(prefix, list, suffix, stripprefixes, stripsuffixes, env, c=None): - """ - This is a wrapper around _concat()/_concat_ixes() that checks for the - existence of prefixes or suffixes on list elements and strips them - where it finds them. This is used by tools (like the GNU linker) - that need to turn something like 'libfoo.a' into '-lfoo'. - """ - - if not list: - return list - - if not callable(c): - env_c = env['_concat'] - if env_c != _concat and callable(env_c): - # There's a custom _concat() method in the construction - # environment, and we've allowed people to set that in - # the past (see test/custom-concat.py), so preserve the - # backwards compatibility. - c = env_c - else: - c = _concat_ixes - - stripprefixes = map(env.subst, SCons.Util.flatten(stripprefixes)) - stripsuffixes = map(env.subst, SCons.Util.flatten(stripsuffixes)) - - stripped = [] - for l in SCons.PathList.PathList(list).subst_path(env, None, None): - if isinstance(l, SCons.Node.FS.File): - stripped.append(l) - continue - - if not SCons.Util.is_String(l): - l = str(l) - - for stripprefix in stripprefixes: - lsp = len(stripprefix) - if l[:lsp] == stripprefix: - l = l[lsp:] - # Do not strip more than one prefix - break - - for stripsuffix in stripsuffixes: - lss = len(stripsuffix) - if l[-lss:] == stripsuffix: - l = l[:-lss] - # Do not strip more than one suffix - break - - stripped.append(l) - - return c(prefix, stripped, suffix, env) - -def _defines(prefix, defs, suffix, env, c=_concat_ixes): - """A wrapper around _concat_ixes that turns a list or string - into a list of C preprocessor command-line definitions. - """ - if SCons.Util.is_List(defs): - l = [] - for d in defs: - if SCons.Util.is_List(d) or type(d) is types.TupleType: - l.append(str(d[0]) + '=' + str(d[1])) - else: - l.append(str(d)) - elif SCons.Util.is_Dict(defs): - # The items in a dictionary are stored in random order, but - # if the order of the command-line options changes from - # invocation to invocation, then the signature of the command - # line will change and we'll get random unnecessary rebuilds. - # Consequently, we have to sort the keys to ensure a - # consistent order... - l = [] - keys = defs.keys() - keys.sort() - for k in keys: - v = defs[k] - if v is None: - l.append(str(k)) - else: - l.append(str(k) + '=' + str(v)) - else: - l = [str(defs)] - return c(prefix, env.subst_path(l), suffix, env) - -class NullCmdGenerator: - """This is a callable class that can be used in place of other - command generators if you don't want them to do anything. - - The __call__ method for this class simply returns the thing - you instantiated it with. - - Example usage: - env["DO_NOTHING"] = NullCmdGenerator - env["LINKCOM"] = "${DO_NOTHING('$LINK $SOURCES $TARGET')}" - """ - - def __init__(self, cmd): - self.cmd = cmd - - def __call__(self, target, source, env, for_signature=None): - return self.cmd - -class Variable_Method_Caller: - """A class for finding a construction variable on the stack and - calling one of its methods. - - We use this to support "construction variables" in our string - eval()s that actually stand in for methods--specifically, use - of "RDirs" in call to _concat that should actually execute the - "TARGET.RDirs" method. (We used to support this by creating a little - "build dictionary" that mapped RDirs to the method, but this got in - the way of Memoizing construction environments, because we had to - create new environment objects to hold the variables.) - """ - def __init__(self, variable, method): - self.variable = variable - self.method = method - def __call__(self, *args, **kw): - try: 1/0 - except ZeroDivisionError: - # Don't start iterating with the current stack-frame to - # prevent creating reference cycles (f_back is safe). - frame = sys.exc_info()[2].tb_frame.f_back - variable = self.variable - while frame: - if frame.f_locals.has_key(variable): - v = frame.f_locals[variable] - if v: - method = getattr(v, self.method) - return apply(method, args, kw) - frame = frame.f_back - return None - -ConstructionEnvironment = { - 'BUILDERS' : {}, - 'SCANNERS' : [], - 'CONFIGUREDIR' : '#/.sconf_temp', - 'CONFIGURELOG' : '#/config.log', - 'CPPSUFFIXES' : SCons.Tool.CSuffixes, - 'DSUFFIXES' : SCons.Tool.DSuffixes, - 'ENV' : {}, - 'IDLSUFFIXES' : SCons.Tool.IDLSuffixes, - 'LATEXSUFFIXES' : SCons.Tool.LaTeXSuffixes, - '_concat' : _concat, - '_defines' : _defines, - '_stripixes' : _stripixes, - '_LIBFLAGS' : '${_concat(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, __env__)}', - '_LIBDIRFLAGS' : '$( ${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)', - '_CPPINCFLAGS' : '$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)', - '_CPPDEFFLAGS' : '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__)}', - 'TEMPFILE' : NullCmdGenerator, - 'Dir' : Variable_Method_Caller('TARGET', 'Dir'), - 'Dirs' : Variable_Method_Caller('TARGET', 'Dirs'), - 'File' : Variable_Method_Caller('TARGET', 'File'), - 'RDirs' : Variable_Method_Caller('TARGET', 'RDirs'), -} - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Environment.py b/3rdParty/SCons/scons-local/SCons/Environment.py deleted file mode 100644 index 9c04d73..0000000 --- a/3rdParty/SCons/scons-local/SCons/Environment.py +++ /dev/null @@ -1,2320 +0,0 @@ -"""SCons.Environment - -Base class for construction Environments. These are -the primary objects used to communicate dependency and -construction information to the build engine. - -Keyword arguments supplied when the construction Environment -is created are construction variables used to initialize the -Environment -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Environment.py 4043 2009/02/23 09:06:45 scons" - - -import copy -import os -import sys -import re -import shlex -import string -from UserDict import UserDict - -import SCons.Action -import SCons.Builder -from SCons.Debug import logInstanceCreation -import SCons.Defaults -import SCons.Errors -import SCons.Memoize -import SCons.Node -import SCons.Node.Alias -import SCons.Node.FS -import SCons.Node.Python -import SCons.Platform -import SCons.SConsign -import SCons.Subst -import SCons.Tool -import SCons.Util -import SCons.Warnings - -class _Null: - pass - -_null = _Null - -_warn_copy_deprecated = True -_warn_source_signatures_deprecated = True -_warn_target_signatures_deprecated = True - -CleanTargets = {} -CalculatorArgs = {} - -semi_deepcopy = SCons.Util.semi_deepcopy - -# Pull UserError into the global name space for the benefit of -# Environment().SourceSignatures(), which has some import statements -# which seem to mess up its ability to reference SCons directly. -UserError = SCons.Errors.UserError - -def alias_builder(env, target, source): - pass - -AliasBuilder = SCons.Builder.Builder(action = alias_builder, - target_factory = SCons.Node.Alias.default_ans.Alias, - source_factory = SCons.Node.FS.Entry, - multi = 1, - is_explicit = None, - name='AliasBuilder') - -def apply_tools(env, tools, toolpath): - # Store the toolpath in the Environment. - if toolpath is not None: - env['toolpath'] = toolpath - - if not tools: - return - # Filter out null tools from the list. - for tool in filter(None, tools): - if SCons.Util.is_List(tool) or type(tool)==type(()): - toolname = tool[0] - toolargs = tool[1] # should be a dict of kw args - tool = apply(env.Tool, [toolname], toolargs) - else: - env.Tool(tool) - -# These names are (or will be) controlled by SCons; users should never -# set or override them. This warning can optionally be turned off, -# but scons will still ignore the illegal variable names even if it's off. -reserved_construction_var_names = [ - 'CHANGED_SOURCES', - 'CHANGED_TARGETS', - 'SOURCE', - 'SOURCES', - 'TARGET', - 'TARGETS', - 'UNCHANGED_SOURCES', - 'UNCHANGED_TARGETS', -] - -future_reserved_construction_var_names = [] - -def copy_non_reserved_keywords(dict): - result = semi_deepcopy(dict) - for k in result.keys(): - if k in reserved_construction_var_names: - msg = "Ignoring attempt to set reserved variable `$%s'" - SCons.Warnings.warn(SCons.Warnings.ReservedVariableWarning, msg % k) - del result[k] - return result - -def _set_reserved(env, key, value): - msg = "Ignoring attempt to set reserved variable `$%s'" - SCons.Warnings.warn(SCons.Warnings.ReservedVariableWarning, msg % key) - -def _set_future_reserved(env, key, value): - env._dict[key] = value - msg = "`$%s' will be reserved in a future release and setting it will become ignored" - SCons.Warnings.warn(SCons.Warnings.FutureReservedVariableWarning, msg % key) - -def _set_BUILDERS(env, key, value): - try: - bd = env._dict[key] - for k in bd.keys(): - del bd[k] - except KeyError: - bd = BuilderDict(kwbd, env) - env._dict[key] = bd - bd.update(value) - -def _del_SCANNERS(env, key): - del env._dict[key] - env.scanner_map_delete() - -def _set_SCANNERS(env, key, value): - env._dict[key] = value - env.scanner_map_delete() - -def _delete_duplicates(l, keep_last): - """Delete duplicates from a sequence, keeping the first or last.""" - seen={} - result=[] - if keep_last: # reverse in & out, then keep first - l.reverse() - for i in l: - try: - if not seen.has_key(i): - result.append(i) - seen[i]=1 - except TypeError: - # probably unhashable. Just keep it. - result.append(i) - if keep_last: - result.reverse() - return result - - - -# The following is partly based on code in a comment added by Peter -# Shannon at the following page (there called the "transplant" class): -# -# ASPN : Python Cookbook : Dynamically added methods to a class -# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/81732 -# -# We had independently been using the idiom as BuilderWrapper, but -# factoring out the common parts into this base class, and making -# BuilderWrapper a subclass that overrides __call__() to enforce specific -# Builder calling conventions, simplified some of our higher-layer code. - -class MethodWrapper: - """ - A generic Wrapper class that associates a method (which can - actually be any callable) with an object. As part of creating this - MethodWrapper object an attribute with the specified (by default, - the name of the supplied method) is added to the underlying object. - When that new "method" is called, our __call__() method adds the - object as the first argument, simulating the Python behavior of - supplying "self" on method calls. - - We hang on to the name by which the method was added to the underlying - base class so that we can provide a method to "clone" ourselves onto - a new underlying object being copied (without which we wouldn't need - to save that info). - """ - def __init__(self, object, method, name=None): - if name is None: - name = method.__name__ - self.object = object - self.method = method - self.name = name - setattr(self.object, name, self) - - def __call__(self, *args, **kwargs): - nargs = (self.object,) + args - return apply(self.method, nargs, kwargs) - - def clone(self, new_object): - """ - Returns an object that re-binds the underlying "method" to - the specified new object. - """ - return self.__class__(new_object, self.method, self.name) - -class BuilderWrapper(MethodWrapper): - """ - A MethodWrapper subclass that that associates an environment with - a Builder. - - This mainly exists to wrap the __call__() function so that all calls - to Builders can have their argument lists massaged in the same way - (treat a lone argument as the source, treat two arguments as target - then source, make sure both target and source are lists) without - having to have cut-and-paste code to do it. - - As a bit of obsessive backwards compatibility, we also intercept - attempts to get or set the "env" or "builder" attributes, which were - the names we used before we put the common functionality into the - MethodWrapper base class. We'll keep this around for a while in case - people shipped Tool modules that reached into the wrapper (like the - Tool/qt.py module does, or did). There shouldn't be a lot attribute - fetching or setting on these, so a little extra work shouldn't hurt. - """ - def __call__(self, target=None, source=_null, *args, **kw): - if source is _null: - source = target - target = None - if not target is None and not SCons.Util.is_List(target): - target = [target] - if not source is None and not SCons.Util.is_List(source): - source = [source] - return apply(MethodWrapper.__call__, (self, target, source) + args, kw) - - def __repr__(self): - return '<BuilderWrapper %s>' % repr(self.name) - - def __str__(self): - return self.__repr__() - - def __getattr__(self, name): - if name == 'env': - return self.object - elif name == 'builder': - return self.method - else: - raise AttributeError, name - - def __setattr__(self, name, value): - if name == 'env': - self.object = value - elif name == 'builder': - self.method = value - else: - self.__dict__[name] = value - - # This allows a Builder to be executed directly - # through the Environment to which it's attached. - # In practice, we shouldn't need this, because - # builders actually get executed through a Node. - # But we do have a unit test for this, and can't - # yet rule out that it would be useful in the - # future, so leave it for now. - #def execute(self, **kw): - # kw['env'] = self.env - # apply(self.builder.execute, (), kw) - -class BuilderDict(UserDict): - """This is a dictionary-like class used by an Environment to hold - the Builders. We need to do this because every time someone changes - the Builders in the Environment's BUILDERS dictionary, we must - update the Environment's attributes.""" - def __init__(self, dict, env): - # Set self.env before calling the superclass initialization, - # because it will end up calling our other methods, which will - # need to point the values in this dictionary to self.env. - self.env = env - UserDict.__init__(self, dict) - - def __semi_deepcopy__(self): - return self.__class__(self.data, self.env) - - def __setitem__(self, item, val): - try: - method = getattr(self.env, item).method - except AttributeError: - pass - else: - self.env.RemoveMethod(method) - UserDict.__setitem__(self, item, val) - BuilderWrapper(self.env, val, item) - - def __delitem__(self, item): - UserDict.__delitem__(self, item) - delattr(self.env, item) - - def update(self, dict): - for i, v in dict.items(): - self.__setitem__(i, v) - - - -_is_valid_var = re.compile(r'[_a-zA-Z]\w*$') - -def is_valid_construction_var(varstr): - """Return if the specified string is a legitimate construction - variable. - """ - return _is_valid_var.match(varstr) - - - -class SubstitutionEnvironment: - """Base class for different flavors of construction environments. - - This class contains a minimal set of methods that handle contruction - variable expansion and conversion of strings to Nodes, which may or - may not be actually useful as a stand-alone class. Which methods - ended up in this class is pretty arbitrary right now. They're - basically the ones which we've empirically determined are common to - the different construction environment subclasses, and most of the - others that use or touch the underlying dictionary of construction - variables. - - Eventually, this class should contain all the methods that we - determine are necessary for a "minimal" interface to the build engine. - A full "native Python" SCons environment has gotten pretty heavyweight - with all of the methods and Tools and construction variables we've - jammed in there, so it would be nice to have a lighter weight - alternative for interfaces that don't need all of the bells and - whistles. (At some point, we'll also probably rename this class - "Base," since that more reflects what we want this class to become, - but because we've released comments that tell people to subclass - Environment.Base to create their own flavors of construction - environment, we'll save that for a future refactoring when this - class actually becomes useful.) - """ - - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - def __init__(self, **kw): - """Initialization of an underlying SubstitutionEnvironment class. - """ - if __debug__: logInstanceCreation(self, 'Environment.SubstitutionEnvironment') - self.fs = SCons.Node.FS.get_default_fs() - self.ans = SCons.Node.Alias.default_ans - self.lookup_list = SCons.Node.arg2nodes_lookups - self._dict = kw.copy() - self._init_special() - self.added_methods = [] - #self._memo = {} - - def _init_special(self): - """Initial the dispatch tables for special handling of - special construction variables.""" - self._special_del = {} - self._special_del['SCANNERS'] = _del_SCANNERS - - self._special_set = {} - for key in reserved_construction_var_names: - self._special_set[key] = _set_reserved - for key in future_reserved_construction_var_names: - self._special_set[key] = _set_future_reserved - self._special_set['BUILDERS'] = _set_BUILDERS - self._special_set['SCANNERS'] = _set_SCANNERS - - # Freeze the keys of self._special_set in a list for use by - # methods that need to check. (Empirically, list scanning has - # gotten better than dict.has_key() in Python 2.5.) - self._special_set_keys = self._special_set.keys() - - def __cmp__(self, other): - return cmp(self._dict, other._dict) - - def __delitem__(self, key): - special = self._special_del.get(key) - if special: - special(self, key) - else: - del self._dict[key] - - def __getitem__(self, key): - return self._dict[key] - - def __setitem__(self, key, value): - # This is heavily used. This implementation is the best we have - # according to the timings in bench/env.__setitem__.py. - # - # The "key in self._special_set_keys" test here seems to perform - # pretty well for the number of keys we have. A hard-coded - # list works a little better in Python 2.5, but that has the - # disadvantage of maybe getting out of sync if we ever add more - # variable names. Using self._special_set.has_key() works a - # little better in Python 2.4, but is worse then this test. - # So right now it seems like a good trade-off, but feel free to - # revisit this with bench/env.__setitem__.py as needed (and - # as newer versions of Python come out). - if key in self._special_set_keys: - self._special_set[key](self, key, value) - else: - # If we already have the entry, then it's obviously a valid - # key and we don't need to check. If we do check, using a - # global, pre-compiled regular expression directly is more - # efficient than calling another function or a method. - if not self._dict.has_key(key) \ - and not _is_valid_var.match(key): - raise SCons.Errors.UserError, "Illegal construction variable `%s'" % key - self._dict[key] = value - - def get(self, key, default=None): - """Emulates the get() method of dictionaries.""" - return self._dict.get(key, default) - - def has_key(self, key): - return self._dict.has_key(key) - - def __contains__(self, key): - return self._dict.__contains__(key) - - def items(self): - return self._dict.items() - - def arg2nodes(self, args, node_factory=_null, lookup_list=_null, **kw): - if node_factory is _null: - node_factory = self.fs.File - if lookup_list is _null: - lookup_list = self.lookup_list - - if not args: - return [] - - args = SCons.Util.flatten(args) - - nodes = [] - for v in args: - if SCons.Util.is_String(v): - n = None - for l in lookup_list: - n = l(v) - if not n is None: - break - if not n is None: - if SCons.Util.is_String(n): - # n = self.subst(n, raw=1, **kw) - kw['raw'] = 1 - n = apply(self.subst, (n,), kw) - if node_factory: - n = node_factory(n) - if SCons.Util.is_List(n): - nodes.extend(n) - else: - nodes.append(n) - elif node_factory: - # v = node_factory(self.subst(v, raw=1, **kw)) - kw['raw'] = 1 - v = node_factory(apply(self.subst, (v,), kw)) - if SCons.Util.is_List(v): - nodes.extend(v) - else: - nodes.append(v) - else: - nodes.append(v) - - return nodes - - def gvars(self): - return self._dict - - def lvars(self): - return {} - - def subst(self, string, raw=0, target=None, source=None, conv=None, executor=None): - """Recursively interpolates construction variables from the - Environment into the specified string, returning the expanded - result. Construction variables are specified by a $ prefix - in the string and begin with an initial underscore or - alphabetic character followed by any number of underscores - or alphanumeric characters. The construction variable names - may be surrounded by curly braces to separate the name from - trailing characters. - """ - gvars = self.gvars() - lvars = self.lvars() - lvars['__env__'] = self - if executor: - lvars.update(executor.get_lvars()) - return SCons.Subst.scons_subst(string, self, raw, target, source, gvars, lvars, conv) - - def subst_kw(self, kw, raw=0, target=None, source=None): - nkw = {} - for k, v in kw.items(): - k = self.subst(k, raw, target, source) - if SCons.Util.is_String(v): - v = self.subst(v, raw, target, source) - nkw[k] = v - return nkw - - def subst_list(self, string, raw=0, target=None, source=None, conv=None, executor=None): - """Calls through to SCons.Subst.scons_subst_list(). See - the documentation for that function.""" - gvars = self.gvars() - lvars = self.lvars() - lvars['__env__'] = self - if executor: - lvars.update(executor.get_lvars()) - return SCons.Subst.scons_subst_list(string, self, raw, target, source, gvars, lvars, conv) - - def subst_path(self, path, target=None, source=None): - """Substitute a path list, turning EntryProxies into Nodes - and leaving Nodes (and other objects) as-is.""" - - if not SCons.Util.is_List(path): - path = [path] - - def s(obj): - """This is the "string conversion" routine that we have our - substitutions use to return Nodes, not strings. This relies - on the fact that an EntryProxy object has a get() method that - returns the underlying Node that it wraps, which is a bit of - architectural dependence that we might need to break or modify - in the future in response to additional requirements.""" - try: - get = obj.get - except AttributeError: - obj = SCons.Util.to_String_for_subst(obj) - else: - obj = get() - return obj - - r = [] - for p in path: - if SCons.Util.is_String(p): - p = self.subst(p, target=target, source=source, conv=s) - if SCons.Util.is_List(p): - if len(p) == 1: - p = p[0] - else: - # We have an object plus a string, or multiple - # objects that we need to smush together. No choice - # but to make them into a string. - p = string.join(map(SCons.Util.to_String_for_subst, p), '') - else: - p = s(p) - r.append(p) - return r - - subst_target_source = subst - - def backtick(self, command): - import subprocess - # common arguments - kw = { 'stdin' : 'devnull', - 'stdout' : subprocess.PIPE, - 'stderr' : subprocess.PIPE, - 'universal_newlines' : True, - } - # if the command is a list, assume it's been quoted - # othewise force a shell - if not SCons.Util.is_List(command): kw['shell'] = True - # run constructed command - #TODO(1.5) p = SCons.Action._subproc(self, command, **kw) - p = apply(SCons.Action._subproc, (self, command), kw) - out,err = p.communicate() - status = p.wait() - if err: - sys.stderr.write(err) - if status: - raise OSError("'%s' exited %d" % (command, status)) - return out - - def AddMethod(self, function, name=None): - """ - Adds the specified function as a method of this construction - environment with the specified name. If the name is omitted, - the default name is the name of the function itself. - """ - method = MethodWrapper(self, function, name) - self.added_methods.append(method) - - def RemoveMethod(self, function): - """ - Removes the specified function's MethodWrapper from the - added_methods list, so we don't re-bind it when making a clone. - """ - is_not_func = lambda dm, f=function: not dm.method is f - self.added_methods = filter(is_not_func, self.added_methods) - - def Override(self, overrides): - """ - Produce a modified environment whose variables are overriden by - the overrides dictionaries. "overrides" is a dictionary that - will override the variables of this environment. - - This function is much more efficient than Clone() or creating - a new Environment because it doesn't copy the construction - environment dictionary, it just wraps the underlying construction - environment, and doesn't even create a wrapper object if there - are no overrides. - """ - if not overrides: return self - o = copy_non_reserved_keywords(overrides) - if not o: return self - overrides = {} - merges = None - for key, value in o.items(): - if key == 'parse_flags': - merges = value - else: - overrides[key] = SCons.Subst.scons_subst_once(value, self, key) - env = OverrideEnvironment(self, overrides) - if merges: env.MergeFlags(merges) - return env - - def ParseFlags(self, *flags): - """ - Parse the set of flags and return a dict with the flags placed - in the appropriate entry. The flags are treated as a typical - set of command-line flags for a GNU-like toolchain and used to - populate the entries in the dict immediately below. If one of - the flag strings begins with a bang (exclamation mark), it is - assumed to be a command and the rest of the string is executed; - the result of that evaluation is then added to the dict. - """ - dict = { - 'ASFLAGS' : SCons.Util.CLVar(''), - 'CFLAGS' : SCons.Util.CLVar(''), - 'CCFLAGS' : SCons.Util.CLVar(''), - 'CPPDEFINES' : [], - 'CPPFLAGS' : SCons.Util.CLVar(''), - 'CPPPATH' : [], - 'FRAMEWORKPATH' : SCons.Util.CLVar(''), - 'FRAMEWORKS' : SCons.Util.CLVar(''), - 'LIBPATH' : [], - 'LIBS' : [], - 'LINKFLAGS' : SCons.Util.CLVar(''), - 'RPATH' : [], - } - - # The use of the "me" parameter to provide our own name for - # recursion is an egregious hack to support Python 2.1 and before. - def do_parse(arg, me, self = self, dict = dict): - # if arg is a sequence, recurse with each element - if not arg: - return - - if not SCons.Util.is_String(arg): - for t in arg: me(t, me) - return - - # if arg is a command, execute it - if arg[0] == '!': - arg = self.backtick(arg[1:]) - - # utility function to deal with -D option - def append_define(name, dict = dict): - t = string.split(name, '=') - if len(t) == 1: - dict['CPPDEFINES'].append(name) - else: - dict['CPPDEFINES'].append([t[0], string.join(t[1:], '=')]) - - # Loop through the flags and add them to the appropriate option. - # This tries to strike a balance between checking for all possible - # flags and keeping the logic to a finite size, so it doesn't - # check for some that don't occur often. It particular, if the - # flag is not known to occur in a config script and there's a way - # of passing the flag to the right place (by wrapping it in a -W - # flag, for example) we don't check for it. Note that most - # preprocessor options are not handled, since unhandled options - # are placed in CCFLAGS, so unless the preprocessor is invoked - # separately, these flags will still get to the preprocessor. - # Other options not currently handled: - # -iqoutedir (preprocessor search path) - # -u symbol (linker undefined symbol) - # -s (linker strip files) - # -static* (linker static binding) - # -shared* (linker dynamic binding) - # -symbolic (linker global binding) - # -R dir (deprecated linker rpath) - # IBM compilers may also accept -qframeworkdir=foo - - params = shlex.split(arg) - append_next_arg_to = None # for multi-word args - for arg in params: - if append_next_arg_to: - if append_next_arg_to == 'CPPDEFINES': - append_define(arg) - elif append_next_arg_to == '-include': - t = ('-include', self.fs.File(arg)) - dict['CCFLAGS'].append(t) - elif append_next_arg_to == '-isysroot': - t = ('-isysroot', arg) - dict['CCFLAGS'].append(t) - dict['LINKFLAGS'].append(t) - elif append_next_arg_to == '-arch': - t = ('-arch', arg) - dict['CCFLAGS'].append(t) - dict['LINKFLAGS'].append(t) - else: - dict[append_next_arg_to].append(arg) - append_next_arg_to = None - elif not arg[0] in ['-', '+']: - dict['LIBS'].append(self.fs.File(arg)) - elif arg[:2] == '-L': - if arg[2:]: - dict['LIBPATH'].append(arg[2:]) - else: - append_next_arg_to = 'LIBPATH' - elif arg[:2] == '-l': - if arg[2:]: - dict['LIBS'].append(arg[2:]) - else: - append_next_arg_to = 'LIBS' - elif arg[:2] == '-I': - if arg[2:]: - dict['CPPPATH'].append(arg[2:]) - else: - append_next_arg_to = 'CPPPATH' - elif arg[:4] == '-Wa,': - dict['ASFLAGS'].append(arg[4:]) - dict['CCFLAGS'].append(arg) - elif arg[:4] == '-Wl,': - if arg[:11] == '-Wl,-rpath=': - dict['RPATH'].append(arg[11:]) - elif arg[:7] == '-Wl,-R,': - dict['RPATH'].append(arg[7:]) - elif arg[:6] == '-Wl,-R': - dict['RPATH'].append(arg[6:]) - else: - dict['LINKFLAGS'].append(arg) - elif arg[:4] == '-Wp,': - dict['CPPFLAGS'].append(arg) - elif arg[:2] == '-D': - if arg[2:]: - append_define(arg[2:]) - else: - append_next_arg_to = 'CPPDEFINES' - elif arg == '-framework': - append_next_arg_to = 'FRAMEWORKS' - elif arg[:14] == '-frameworkdir=': - dict['FRAMEWORKPATH'].append(arg[14:]) - elif arg[:2] == '-F': - if arg[2:]: - dict['FRAMEWORKPATH'].append(arg[2:]) - else: - append_next_arg_to = 'FRAMEWORKPATH' - elif arg == '-mno-cygwin': - dict['CCFLAGS'].append(arg) - dict['LINKFLAGS'].append(arg) - elif arg == '-mwindows': - dict['LINKFLAGS'].append(arg) - elif arg == '-pthread': - dict['CCFLAGS'].append(arg) - dict['LINKFLAGS'].append(arg) - elif arg[:5] == '-std=': - dict['CFLAGS'].append(arg) # C only - elif arg[0] == '+': - dict['CCFLAGS'].append(arg) - dict['LINKFLAGS'].append(arg) - elif arg in ['-include', '-isysroot', '-arch']: - append_next_arg_to = arg - else: - dict['CCFLAGS'].append(arg) - - for arg in flags: - do_parse(arg, do_parse) - return dict - - def MergeFlags(self, args, unique=1, dict=None): - """ - Merge the dict in args into the construction variables of this - env, or the passed-in dict. If args is not a dict, it is - converted into a dict using ParseFlags. If unique is not set, - the flags are appended rather than merged. - """ - - if dict is None: - dict = self - if not SCons.Util.is_Dict(args): - args = self.ParseFlags(args) - if not unique: - apply(self.Append, (), args) - return self - for key, value in args.items(): - if not value: - continue - try: - orig = self[key] - except KeyError: - orig = value - else: - if not orig: - orig = value - elif value: - # Add orig and value. The logic here was lifted from - # part of env.Append() (see there for a lot of comments - # about the order in which things are tried) and is - # used mainly to handle coercion of strings to CLVar to - # "do the right thing" given (e.g.) an original CCFLAGS - # string variable like '-pipe -Wall'. - try: - orig = orig + value - except (KeyError, TypeError): - try: - add_to_orig = orig.append - except AttributeError: - value.insert(0, orig) - orig = value - else: - add_to_orig(value) - t = [] - if key[-4:] == 'PATH': - ### keep left-most occurence - for v in orig: - if v not in t: - t.append(v) - else: - ### keep right-most occurence - orig.reverse() - for v in orig: - if v not in t: - t.insert(0, v) - self[key] = t - return self - -# def MergeShellPaths(self, args, prepend=1): -# """ -# Merge the dict in args into the shell environment in env['ENV']. -# Shell path elements are appended or prepended according to prepend. - -# Uses Pre/AppendENVPath, so it always appends or prepends uniquely. - -# Example: env.MergeShellPaths({'LIBPATH': '/usr/local/lib'}) -# prepends /usr/local/lib to env['ENV']['LIBPATH']. -# """ - -# for pathname, pathval in args.items(): -# if not pathval: -# continue -# if prepend: -# apply(self.PrependENVPath, (pathname, pathval)) -# else: -# apply(self.AppendENVPath, (pathname, pathval)) - - -# Used by the FindSourceFiles() method, below. -# Stuck here for support of pre-2.2 Python versions. -def build_source(ss, result): - for s in ss: - if isinstance(s, SCons.Node.FS.Dir): - build_source(s.all_children(), result) - elif s.has_builder(): - build_source(s.sources, result) - elif isinstance(s.disambiguate(), SCons.Node.FS.File): - result.append(s) - -def default_decide_source(dependency, target, prev_ni): - f = SCons.Defaults.DefaultEnvironment().decide_source - return f(dependency, target, prev_ni) - -def default_decide_target(dependency, target, prev_ni): - f = SCons.Defaults.DefaultEnvironment().decide_target - return f(dependency, target, prev_ni) - -def default_copy_from_cache(src, dst): - f = SCons.Defaults.DefaultEnvironment().copy_from_cache - return f(src, dst) - -class Base(SubstitutionEnvironment): - """Base class for "real" construction Environments. These are the - primary objects used to communicate dependency and construction - information to the build engine. - - Keyword arguments supplied when the construction Environment - is created are construction variables used to initialize the - Environment. - """ - - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - memoizer_counters = [] - - ####################################################################### - # This is THE class for interacting with the SCons build engine, - # and it contains a lot of stuff, so we're going to try to keep this - # a little organized by grouping the methods. - ####################################################################### - - ####################################################################### - # Methods that make an Environment act like a dictionary. These have - # the expected standard names for Python mapping objects. Note that - # we don't actually make an Environment a subclass of UserDict for - # performance reasons. Note also that we only supply methods for - # dictionary functionality that we actually need and use. - ####################################################################### - - def __init__(self, - platform=None, - tools=None, - toolpath=None, - variables=None, - parse_flags = None, - **kw): - """ - Initialization of a basic SCons construction environment, - including setting up special construction variables like BUILDER, - PLATFORM, etc., and searching for and applying available Tools. - - Note that we do *not* call the underlying base class - (SubsitutionEnvironment) initialization, because we need to - initialize things in a very specific order that doesn't work - with the much simpler base class initialization. - """ - if __debug__: logInstanceCreation(self, 'Environment.Base') - self._memo = {} - self.fs = SCons.Node.FS.get_default_fs() - self.ans = SCons.Node.Alias.default_ans - self.lookup_list = SCons.Node.arg2nodes_lookups - self._dict = semi_deepcopy(SCons.Defaults.ConstructionEnvironment) - self._init_special() - self.added_methods = [] - - # We don't use AddMethod, or define these as methods in this - # class, because we *don't* want these functions to be bound - # methods. They need to operate independently so that the - # settings will work properly regardless of whether a given - # target ends up being built with a Base environment or an - # OverrideEnvironment or what have you. - self.decide_target = default_decide_target - self.decide_source = default_decide_source - - self.copy_from_cache = default_copy_from_cache - - self._dict['BUILDERS'] = BuilderDict(self._dict['BUILDERS'], self) - - if platform is None: - platform = self._dict.get('PLATFORM', None) - if platform is None: - platform = SCons.Platform.Platform() - if SCons.Util.is_String(platform): - platform = SCons.Platform.Platform(platform) - self._dict['PLATFORM'] = str(platform) - platform(self) - - # Apply the passed-in and customizable variables to the - # environment before calling the tools, because they may use - # some of them during initialization. - if kw.has_key('options'): - # Backwards compatibility: they may stll be using the - # old "options" keyword. - variables = kw['options'] - del kw['options'] - apply(self.Replace, (), kw) - keys = kw.keys() - if variables: - keys = keys + variables.keys() - variables.Update(self) - - save = {} - for k in keys: - try: - save[k] = self._dict[k] - except KeyError: - # No value may have been set if they tried to pass in a - # reserved variable name like TARGETS. - pass - - SCons.Tool.Initializers(self) - - if tools is None: - tools = self._dict.get('TOOLS', None) - if tools is None: - tools = ['default'] - apply_tools(self, tools, toolpath) - - # Now restore the passed-in and customized variables - # to the environment, since the values the user set explicitly - # should override any values set by the tools. - for key, val in save.items(): - self._dict[key] = val - - # Finally, apply any flags to be merged in - if parse_flags: self.MergeFlags(parse_flags) - - ####################################################################### - # Utility methods that are primarily for internal use by SCons. - # These begin with lower-case letters. - ####################################################################### - - def get_builder(self, name): - """Fetch the builder with the specified name from the environment. - """ - try: - return self._dict['BUILDERS'][name] - except KeyError: - return None - - def get_CacheDir(self): - try: - path = self._CacheDir_path - except AttributeError: - path = SCons.Defaults.DefaultEnvironment()._CacheDir_path - try: - if path == self._last_CacheDir_path: - return self._last_CacheDir - except AttributeError: - pass - cd = SCons.CacheDir.CacheDir(path) - self._last_CacheDir_path = path - self._last_CacheDir = cd - return cd - - def get_factory(self, factory, default='File'): - """Return a factory function for creating Nodes for this - construction environment. - """ - name = default - try: - is_node = issubclass(factory, SCons.Node.Node) - except TypeError: - # The specified factory isn't a Node itself--it's - # most likely None, or possibly a callable. - pass - else: - if is_node: - # The specified factory is a Node (sub)class. Try to - # return the FS method that corresponds to the Node's - # name--that is, we return self.fs.Dir if they want a Dir, - # self.fs.File for a File, etc. - try: name = factory.__name__ - except AttributeError: pass - else: factory = None - if not factory: - # They passed us None, or we picked up a name from a specified - # class, so return the FS method. (Note that we *don't* - # use our own self.{Dir,File} methods because that would - # cause env.subst() to be called twice on the file name, - # interfering with files that have $$ in them.) - factory = getattr(self.fs, name) - return factory - - memoizer_counters.append(SCons.Memoize.CountValue('_gsm')) - - def _gsm(self): - try: - return self._memo['_gsm'] - except KeyError: - pass - - result = {} - - try: - scanners = self._dict['SCANNERS'] - except KeyError: - pass - else: - # Reverse the scanner list so that, if multiple scanners - # claim they can scan the same suffix, earlier scanners - # in the list will overwrite later scanners, so that - # the result looks like a "first match" to the user. - if not SCons.Util.is_List(scanners): - scanners = [scanners] - else: - scanners = scanners[:] # copy so reverse() doesn't mod original - scanners.reverse() - for scanner in scanners: - for k in scanner.get_skeys(self): - if k and self['PLATFORM'] == 'win32': - k = string.lower(k) - result[k] = scanner - - self._memo['_gsm'] = result - - return result - - def get_scanner(self, skey): - """Find the appropriate scanner given a key (usually a file suffix). - """ - if skey and self['PLATFORM'] == 'win32': - skey = string.lower(skey) - return self._gsm().get(skey) - - def scanner_map_delete(self, kw=None): - """Delete the cached scanner map (if we need to). - """ - try: - del self._memo['_gsm'] - except KeyError: - pass - - def _update(self, dict): - """Update an environment's values directly, bypassing the normal - checks that occur when users try to set items. - """ - self._dict.update(dict) - - def get_src_sig_type(self): - try: - return self.src_sig_type - except AttributeError: - t = SCons.Defaults.DefaultEnvironment().src_sig_type - self.src_sig_type = t - return t - - def get_tgt_sig_type(self): - try: - return self.tgt_sig_type - except AttributeError: - t = SCons.Defaults.DefaultEnvironment().tgt_sig_type - self.tgt_sig_type = t - return t - - ####################################################################### - # Public methods for manipulating an Environment. These begin with - # upper-case letters. The essential characteristic of methods in - # this section is that they do *not* have corresponding same-named - # global functions. For example, a stand-alone Append() function - # makes no sense, because Append() is all about appending values to - # an Environment's construction variables. - ####################################################################### - - def Append(self, **kw): - """Append values to existing construction variables - in an Environment. - """ - kw = copy_non_reserved_keywords(kw) - for key, val in kw.items(): - # It would be easier on the eyes to write this using - # "continue" statements whenever we finish processing an item, - # but Python 1.5.2 apparently doesn't let you use "continue" - # within try:-except: blocks, so we have to nest our code. - try: - orig = self._dict[key] - except KeyError: - # No existing variable in the environment, so just set - # it to the new value. - self._dict[key] = val - else: - try: - # Check if the original looks like a dictionary. - # If it is, we can't just try adding the value because - # dictionaries don't have __add__() methods, and - # things like UserList will incorrectly coerce the - # original dict to a list (which we don't want). - update_dict = orig.update - except AttributeError: - try: - # Most straightforward: just try to add them - # together. This will work in most cases, when the - # original and new values are of compatible types. - self._dict[key] = orig + val - except (KeyError, TypeError): - try: - # Check if the original is a list. - add_to_orig = orig.append - except AttributeError: - # The original isn't a list, but the new - # value is (by process of elimination), - # so insert the original in the new value - # (if there's one to insert) and replace - # the variable with it. - if orig: - val.insert(0, orig) - self._dict[key] = val - else: - # The original is a list, so append the new - # value to it (if there's a value to append). - if val: - add_to_orig(val) - else: - # The original looks like a dictionary, so update it - # based on what we think the value looks like. - if SCons.Util.is_List(val): - for v in val: - orig[v] = None - else: - try: - update_dict(val) - except (AttributeError, TypeError, ValueError): - if SCons.Util.is_Dict(val): - for k, v in val.items(): - orig[k] = v - else: - orig[val] = None - self.scanner_map_delete(kw) - - # allow Dirs and strings beginning with # for top-relative - # Note this uses the current env's fs (in self). - def _canonicalize(self, path): - if not SCons.Util.is_String(path): # typically a Dir - path = str(path) - if path and path[0] == '#': - path = str(self.fs.Dir(path)) - return path - - def AppendENVPath(self, name, newpath, envname = 'ENV', - sep = os.pathsep, delete_existing=1): - """Append path elements to the path 'name' in the 'ENV' - dictionary for this environment. Will only add any particular - path once, and will normpath and normcase all paths to help - assure this. This can also handle the case where the env - variable is a list instead of a string. - - If delete_existing is 0, a newpath which is already in the path - will not be moved to the end (it will be left where it is). - """ - - orig = '' - if self._dict.has_key(envname) and self._dict[envname].has_key(name): - orig = self._dict[envname][name] - - nv = SCons.Util.AppendPath(orig, newpath, sep, delete_existing, - canonicalize=self._canonicalize) - - if not self._dict.has_key(envname): - self._dict[envname] = {} - - self._dict[envname][name] = nv - - def AppendUnique(self, delete_existing=0, **kw): - """Append values to existing construction variables - in an Environment, if they're not already there. - If delete_existing is 1, removes existing values first, so - values move to end. - """ - kw = copy_non_reserved_keywords(kw) - for key, val in kw.items(): - if SCons.Util.is_List(val): - val = _delete_duplicates(val, delete_existing) - if not self._dict.has_key(key) or self._dict[key] in ('', None): - self._dict[key] = val - elif SCons.Util.is_Dict(self._dict[key]) and \ - SCons.Util.is_Dict(val): - self._dict[key].update(val) - elif SCons.Util.is_List(val): - dk = self._dict[key] - if not SCons.Util.is_List(dk): - dk = [dk] - if delete_existing: - dk = filter(lambda x, val=val: x not in val, dk) - else: - val = filter(lambda x, dk=dk: x not in dk, val) - self._dict[key] = dk + val - else: - dk = self._dict[key] - if SCons.Util.is_List(dk): - # By elimination, val is not a list. Since dk is a - # list, wrap val in a list first. - if delete_existing: - dk = filter(lambda x, val=val: x not in val, dk) - self._dict[key] = dk + [val] - else: - if not val in dk: - self._dict[key] = dk + [val] - else: - if delete_existing: - dk = filter(lambda x, val=val: x not in val, dk) - self._dict[key] = dk + val - self.scanner_map_delete(kw) - - def Clone(self, tools=[], toolpath=None, parse_flags = None, **kw): - """Return a copy of a construction Environment. The - copy is like a Python "deep copy"--that is, independent - copies are made recursively of each objects--except that - a reference is copied when an object is not deep-copyable - (like a function). There are no references to any mutable - objects in the original Environment. - """ - clone = copy.copy(self) - clone._dict = semi_deepcopy(self._dict) - - try: - cbd = clone._dict['BUILDERS'] - except KeyError: - pass - else: - clone._dict['BUILDERS'] = BuilderDict(cbd, clone) - - # Check the methods added via AddMethod() and re-bind them to - # the cloned environment. Only do this if the attribute hasn't - # been overwritten by the user explicitly and still points to - # the added method. - clone.added_methods = [] - for mw in self.added_methods: - if mw == getattr(self, mw.name): - clone.added_methods.append(mw.clone(clone)) - - clone._memo = {} - - # Apply passed-in variables before the tools - # so the tools can use the new variables - kw = copy_non_reserved_keywords(kw) - new = {} - for key, value in kw.items(): - new[key] = SCons.Subst.scons_subst_once(value, self, key) - apply(clone.Replace, (), new) - - apply_tools(clone, tools, toolpath) - - # apply them again in case the tools overwrote them - apply(clone.Replace, (), new) - - # Finally, apply any flags to be merged in - if parse_flags: clone.MergeFlags(parse_flags) - - if __debug__: logInstanceCreation(self, 'Environment.EnvironmentClone') - return clone - - def Copy(self, *args, **kw): - global _warn_copy_deprecated - if _warn_copy_deprecated: - msg = "The env.Copy() method is deprecated; use the env.Clone() method instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedCopyWarning, msg) - _warn_copy_deprecated = False - return apply(self.Clone, args, kw) - - def _changed_build(self, dependency, target, prev_ni): - if dependency.changed_state(target, prev_ni): - return 1 - return self.decide_source(dependency, target, prev_ni) - - def _changed_content(self, dependency, target, prev_ni): - return dependency.changed_content(target, prev_ni) - - def _changed_source(self, dependency, target, prev_ni): - target_env = dependency.get_build_env() - type = target_env.get_tgt_sig_type() - if type == 'source': - return target_env.decide_source(dependency, target, prev_ni) - else: - return target_env.decide_target(dependency, target, prev_ni) - - def _changed_timestamp_then_content(self, dependency, target, prev_ni): - return dependency.changed_timestamp_then_content(target, prev_ni) - - def _changed_timestamp_newer(self, dependency, target, prev_ni): - return dependency.changed_timestamp_newer(target, prev_ni) - - def _changed_timestamp_match(self, dependency, target, prev_ni): - return dependency.changed_timestamp_match(target, prev_ni) - - def _copy_from_cache(self, src, dst): - return self.fs.copy(src, dst) - - def _copy2_from_cache(self, src, dst): - return self.fs.copy2(src, dst) - - def Decider(self, function): - copy_function = self._copy2_from_cache - if function in ('MD5', 'content'): - if not SCons.Util.md5: - raise UserError, "MD5 signatures are not available in this version of Python." - function = self._changed_content - elif function == 'MD5-timestamp': - function = self._changed_timestamp_then_content - elif function in ('timestamp-newer', 'make'): - function = self._changed_timestamp_newer - copy_function = self._copy_from_cache - elif function == 'timestamp-match': - function = self._changed_timestamp_match - elif not callable(function): - raise UserError, "Unknown Decider value %s" % repr(function) - - # We don't use AddMethod because we don't want to turn the - # function, which only expects three arguments, into a bound - # method, which would add self as an initial, fourth argument. - self.decide_target = function - self.decide_source = function - - self.copy_from_cache = copy_function - - def Detect(self, progs): - """Return the first available program in progs. - """ - if not SCons.Util.is_List(progs): - progs = [ progs ] - for prog in progs: - path = self.WhereIs(prog) - if path: return prog - return None - - def Dictionary(self, *args): - if not args: - return self._dict - dlist = map(lambda x, s=self: s._dict[x], args) - if len(dlist) == 1: - dlist = dlist[0] - return dlist - - def Dump(self, key = None): - """ - Using the standard Python pretty printer, dump the contents of the - scons build environment to stdout. - - If the key passed in is anything other than None, then that will - be used as an index into the build environment dictionary and - whatever is found there will be fed into the pretty printer. Note - that this key is case sensitive. - """ - import pprint - pp = pprint.PrettyPrinter(indent=2) - if key: - dict = self.Dictionary(key) - else: - dict = self.Dictionary() - return pp.pformat(dict) - - def FindIxes(self, paths, prefix, suffix): - """ - Search a list of paths for something that matches the prefix and suffix. - - paths - the list of paths or nodes. - prefix - construction variable for the prefix. - suffix - construction variable for the suffix. - """ - - suffix = self.subst('$'+suffix) - prefix = self.subst('$'+prefix) - - for path in paths: - dir,name = os.path.split(str(path)) - if name[:len(prefix)] == prefix and name[-len(suffix):] == suffix: - return path - - def ParseConfig(self, command, function=None, unique=1): - """ - Use the specified function to parse the output of the command - in order to modify the current environment. The 'command' can - be a string or a list of strings representing a command and - its arguments. 'Function' is an optional argument that takes - the environment, the output of the command, and the unique flag. - If no function is specified, MergeFlags, which treats the output - as the result of a typical 'X-config' command (i.e. gtk-config), - will merge the output into the appropriate variables. - """ - if function is None: - def parse_conf(env, cmd, unique=unique): - return env.MergeFlags(cmd, unique) - function = parse_conf - if SCons.Util.is_List(command): - command = string.join(command) - command = self.subst(command) - return function(self, self.backtick(command)) - - def ParseDepends(self, filename, must_exist=None, only_one=0): - """ - Parse a mkdep-style file for explicit dependencies. This is - completely abusable, and should be unnecessary in the "normal" - case of proper SCons configuration, but it may help make - the transition from a Make hierarchy easier for some people - to swallow. It can also be genuinely useful when using a tool - that can write a .d file, but for which writing a scanner would - be too complicated. - """ - filename = self.subst(filename) - try: - fp = open(filename, 'r') - except IOError: - if must_exist: - raise - return - lines = SCons.Util.LogicalLines(fp).readlines() - lines = filter(lambda l: l[0] != '#', lines) - tdlist = [] - for line in lines: - try: - target, depends = string.split(line, ':', 1) - except (AttributeError, TypeError, ValueError): - # Python 1.5.2 throws TypeError if line isn't a string, - # Python 2.x throws AttributeError because it tries - # to call line.split(). Either can throw ValueError - # if the line doesn't split into two or more elements. - pass - else: - tdlist.append((string.split(target), string.split(depends))) - if only_one: - targets = reduce(lambda x, y: x+y, map(lambda p: p[0], tdlist)) - if len(targets) > 1: - raise SCons.Errors.UserError, "More than one dependency target found in `%s': %s" % (filename, targets) - for target, depends in tdlist: - self.Depends(target, depends) - - def Platform(self, platform): - platform = self.subst(platform) - return SCons.Platform.Platform(platform)(self) - - def Prepend(self, **kw): - """Prepend values to existing construction variables - in an Environment. - """ - kw = copy_non_reserved_keywords(kw) - for key, val in kw.items(): - # It would be easier on the eyes to write this using - # "continue" statements whenever we finish processing an item, - # but Python 1.5.2 apparently doesn't let you use "continue" - # within try:-except: blocks, so we have to nest our code. - try: - orig = self._dict[key] - except KeyError: - # No existing variable in the environment, so just set - # it to the new value. - self._dict[key] = val - else: - try: - # Check if the original looks like a dictionary. - # If it is, we can't just try adding the value because - # dictionaries don't have __add__() methods, and - # things like UserList will incorrectly coerce the - # original dict to a list (which we don't want). - update_dict = orig.update - except AttributeError: - try: - # Most straightforward: just try to add them - # together. This will work in most cases, when the - # original and new values are of compatible types. - self._dict[key] = val + orig - except (KeyError, TypeError): - try: - # Check if the added value is a list. - add_to_val = val.append - except AttributeError: - # The added value isn't a list, but the - # original is (by process of elimination), - # so insert the the new value in the original - # (if there's one to insert). - if val: - orig.insert(0, val) - else: - # The added value is a list, so append - # the original to it (if there's a value - # to append). - if orig: - add_to_val(orig) - self._dict[key] = val - else: - # The original looks like a dictionary, so update it - # based on what we think the value looks like. - if SCons.Util.is_List(val): - for v in val: - orig[v] = None - else: - try: - update_dict(val) - except (AttributeError, TypeError, ValueError): - if SCons.Util.is_Dict(val): - for k, v in val.items(): - orig[k] = v - else: - orig[val] = None - self.scanner_map_delete(kw) - - def PrependENVPath(self, name, newpath, envname = 'ENV', sep = os.pathsep, - delete_existing=1): - """Prepend path elements to the path 'name' in the 'ENV' - dictionary for this environment. Will only add any particular - path once, and will normpath and normcase all paths to help - assure this. This can also handle the case where the env - variable is a list instead of a string. - - If delete_existing is 0, a newpath which is already in the path - will not be moved to the front (it will be left where it is). - """ - - orig = '' - if self._dict.has_key(envname) and self._dict[envname].has_key(name): - orig = self._dict[envname][name] - - nv = SCons.Util.PrependPath(orig, newpath, sep, delete_existing, - canonicalize=self._canonicalize) - - if not self._dict.has_key(envname): - self._dict[envname] = {} - - self._dict[envname][name] = nv - - def PrependUnique(self, delete_existing=0, **kw): - """Prepend values to existing construction variables - in an Environment, if they're not already there. - If delete_existing is 1, removes existing values first, so - values move to front. - """ - kw = copy_non_reserved_keywords(kw) - for key, val in kw.items(): - if SCons.Util.is_List(val): - val = _delete_duplicates(val, not delete_existing) - if not self._dict.has_key(key) or self._dict[key] in ('', None): - self._dict[key] = val - elif SCons.Util.is_Dict(self._dict[key]) and \ - SCons.Util.is_Dict(val): - self._dict[key].update(val) - elif SCons.Util.is_List(val): - dk = self._dict[key] - if not SCons.Util.is_List(dk): - dk = [dk] - if delete_existing: - dk = filter(lambda x, val=val: x not in val, dk) - else: - val = filter(lambda x, dk=dk: x not in dk, val) - self._dict[key] = val + dk - else: - dk = self._dict[key] - if SCons.Util.is_List(dk): - # By elimination, val is not a list. Since dk is a - # list, wrap val in a list first. - if delete_existing: - dk = filter(lambda x, val=val: x not in val, dk) - self._dict[key] = [val] + dk - else: - if not val in dk: - self._dict[key] = [val] + dk - else: - if delete_existing: - dk = filter(lambda x, val=val: x not in val, dk) - self._dict[key] = val + dk - self.scanner_map_delete(kw) - - def Replace(self, **kw): - """Replace existing construction variables in an Environment - with new construction variables and/or values. - """ - try: - kwbd = kw['BUILDERS'] - except KeyError: - pass - else: - kwbd = semi_deepcopy(kwbd) - del kw['BUILDERS'] - self.__setitem__('BUILDERS', kwbd) - kw = copy_non_reserved_keywords(kw) - self._update(semi_deepcopy(kw)) - self.scanner_map_delete(kw) - - def ReplaceIxes(self, path, old_prefix, old_suffix, new_prefix, new_suffix): - """ - Replace old_prefix with new_prefix and old_suffix with new_suffix. - - env - Environment used to interpolate variables. - path - the path that will be modified. - old_prefix - construction variable for the old prefix. - old_suffix - construction variable for the old suffix. - new_prefix - construction variable for the new prefix. - new_suffix - construction variable for the new suffix. - """ - old_prefix = self.subst('$'+old_prefix) - old_suffix = self.subst('$'+old_suffix) - - new_prefix = self.subst('$'+new_prefix) - new_suffix = self.subst('$'+new_suffix) - - dir,name = os.path.split(str(path)) - if name[:len(old_prefix)] == old_prefix: - name = name[len(old_prefix):] - if name[-len(old_suffix):] == old_suffix: - name = name[:-len(old_suffix)] - return os.path.join(dir, new_prefix+name+new_suffix) - - def SetDefault(self, **kw): - for k in kw.keys(): - if self._dict.has_key(k): - del kw[k] - apply(self.Replace, (), kw) - - def _find_toolpath_dir(self, tp): - return self.fs.Dir(self.subst(tp)).srcnode().abspath - - def Tool(self, tool, toolpath=None, **kw): - if SCons.Util.is_String(tool): - tool = self.subst(tool) - if toolpath is None: - toolpath = self.get('toolpath', []) - toolpath = map(self._find_toolpath_dir, toolpath) - tool = apply(SCons.Tool.Tool, (tool, toolpath), kw) - tool(self) - - def WhereIs(self, prog, path=None, pathext=None, reject=[]): - """Find prog in the path. - """ - if path is None: - try: - path = self['ENV']['PATH'] - except KeyError: - pass - elif SCons.Util.is_String(path): - path = self.subst(path) - if pathext is None: - try: - pathext = self['ENV']['PATHEXT'] - except KeyError: - pass - elif SCons.Util.is_String(pathext): - pathext = self.subst(pathext) - prog = self.subst(prog) - path = SCons.Util.WhereIs(prog, path, pathext, reject) - if path: return path - return None - - ####################################################################### - # Public methods for doing real "SCons stuff" (manipulating - # dependencies, setting attributes on targets, etc.). These begin - # with upper-case letters. The essential characteristic of methods - # in this section is that they all *should* have corresponding - # same-named global functions. - ####################################################################### - - def Action(self, *args, **kw): - def subst_string(a, self=self): - if SCons.Util.is_String(a): - a = self.subst(a) - return a - nargs = map(subst_string, args) - nkw = self.subst_kw(kw) - return apply(SCons.Action.Action, nargs, nkw) - - def AddPreAction(self, files, action): - nodes = self.arg2nodes(files, self.fs.Entry) - action = SCons.Action.Action(action) - uniq = {} - for executor in map(lambda n: n.get_executor(), nodes): - uniq[executor] = 1 - for executor in uniq.keys(): - executor.add_pre_action(action) - return nodes - - def AddPostAction(self, files, action): - nodes = self.arg2nodes(files, self.fs.Entry) - action = SCons.Action.Action(action) - uniq = {} - for executor in map(lambda n: n.get_executor(), nodes): - uniq[executor] = 1 - for executor in uniq.keys(): - executor.add_post_action(action) - return nodes - - def Alias(self, target, source=[], action=None, **kw): - tlist = self.arg2nodes(target, self.ans.Alias) - if not SCons.Util.is_List(source): - source = [source] - source = filter(None, source) - - if not action: - if not source: - # There are no source files and no action, so just - # return a target list of classic Alias Nodes, without - # any builder. The externally visible effect is that - # this will make the wrapping Script.BuildTask class - # say that there's "Nothing to be done" for this Alias, - # instead of that it's "up to date." - return tlist - - # No action, but there are sources. Re-call all the target - # builders to add the sources to each target. - result = [] - for t in tlist: - bld = t.get_builder(AliasBuilder) - result.extend(bld(self, t, source)) - return result - - nkw = self.subst_kw(kw) - nkw.update({ - 'action' : SCons.Action.Action(action), - 'source_factory' : self.fs.Entry, - 'multi' : 1, - 'is_explicit' : None, - }) - bld = apply(SCons.Builder.Builder, (), nkw) - - # Apply the Builder separately to each target so that the Aliases - # stay separate. If we did one "normal" Builder call with the - # whole target list, then all of the target Aliases would be - # associated under a single Executor. - result = [] - for t in tlist: - # Calling the convert() method will cause a new Executor to be - # created from scratch, so we have to explicitly initialize - # it with the target's existing sources, plus our new ones, - # so nothing gets lost. - b = t.get_builder() - if b is None or b is AliasBuilder: - b = bld - else: - nkw['action'] = b.action + action - b = apply(SCons.Builder.Builder, (), nkw) - t.convert() - result.extend(b(self, t, t.sources + source)) - return result - - def AlwaysBuild(self, *targets): - tlist = [] - for t in targets: - tlist.extend(self.arg2nodes(t, self.fs.Entry)) - for t in tlist: - t.set_always_build() - return tlist - - def BuildDir(self, *args, **kw): - if kw.has_key('build_dir'): - kw['variant_dir'] = kw['build_dir'] - del kw['build_dir'] - return apply(self.VariantDir, args, kw) - - def Builder(self, **kw): - nkw = self.subst_kw(kw) - return apply(SCons.Builder.Builder, [], nkw) - - def CacheDir(self, path): - import SCons.CacheDir - if not path is None: - path = self.subst(path) - self._CacheDir_path = path - - def Clean(self, targets, files): - global CleanTargets - tlist = self.arg2nodes(targets, self.fs.Entry) - flist = self.arg2nodes(files, self.fs.Entry) - for t in tlist: - try: - CleanTargets[t].extend(flist) - except KeyError: - CleanTargets[t] = flist - - def Configure(self, *args, **kw): - nargs = [self] - if args: - nargs = nargs + self.subst_list(args)[0] - nkw = self.subst_kw(kw) - nkw['_depth'] = kw.get('_depth', 0) + 1 - try: - nkw['custom_tests'] = self.subst_kw(nkw['custom_tests']) - except KeyError: - pass - return apply(SCons.SConf.SConf, nargs, nkw) - - def Command(self, target, source, action, **kw): - """Builds the supplied target files from the supplied - source files using the supplied action. Action may - be any type that the Builder constructor will accept - for an action.""" - bkw = { - 'action' : action, - 'target_factory' : self.fs.Entry, - 'source_factory' : self.fs.Entry, - } - try: bkw['source_scanner'] = kw['source_scanner'] - except KeyError: pass - else: del kw['source_scanner'] - bld = apply(SCons.Builder.Builder, (), bkw) - return apply(bld, (self, target, source), kw) - - def Depends(self, target, dependency): - """Explicity specify that 'target's depend on 'dependency'.""" - tlist = self.arg2nodes(target, self.fs.Entry) - dlist = self.arg2nodes(dependency, self.fs.Entry) - for t in tlist: - t.add_dependency(dlist) - return tlist - - def Dir(self, name, *args, **kw): - """ - """ - s = self.subst(name) - if SCons.Util.is_Sequence(s): - result=[] - for e in s: - result.append(apply(self.fs.Dir, (e,) + args, kw)) - return result - return apply(self.fs.Dir, (s,) + args, kw) - - def NoClean(self, *targets): - """Tags a target so that it will not be cleaned by -c""" - tlist = [] - for t in targets: - tlist.extend(self.arg2nodes(t, self.fs.Entry)) - for t in tlist: - t.set_noclean() - return tlist - - def NoCache(self, *targets): - """Tags a target so that it will not be cached""" - tlist = [] - for t in targets: - tlist.extend(self.arg2nodes(t, self.fs.Entry)) - for t in tlist: - t.set_nocache() - return tlist - - def Entry(self, name, *args, **kw): - """ - """ - s = self.subst(name) - if SCons.Util.is_Sequence(s): - result=[] - for e in s: - result.append(apply(self.fs.Entry, (e,) + args, kw)) - return result - return apply(self.fs.Entry, (s,) + args, kw) - - def Environment(self, **kw): - return apply(SCons.Environment.Environment, [], self.subst_kw(kw)) - - def Execute(self, action, *args, **kw): - """Directly execute an action through an Environment - """ - action = apply(self.Action, (action,) + args, kw) - result = action([], [], self) - if isinstance(result, SCons.Errors.BuildError): - errstr = result.errstr - if result.filename: - errstr = result.filename + ': ' + errstr - sys.stderr.write("scons: *** %s\n" % errstr) - return result.status - else: - return result - - def File(self, name, *args, **kw): - """ - """ - s = self.subst(name) - if SCons.Util.is_Sequence(s): - result=[] - for e in s: - result.append(apply(self.fs.File, (e,) + args, kw)) - return result - return apply(self.fs.File, (s,) + args, kw) - - def FindFile(self, file, dirs): - file = self.subst(file) - nodes = self.arg2nodes(dirs, self.fs.Dir) - return SCons.Node.FS.find_file(file, tuple(nodes)) - - def Flatten(self, sequence): - return SCons.Util.flatten(sequence) - - def GetBuildPath(self, files): - result = map(str, self.arg2nodes(files, self.fs.Entry)) - if SCons.Util.is_List(files): - return result - else: - return result[0] - - def Glob(self, pattern, ondisk=True, source=False, strings=False): - return self.fs.Glob(self.subst(pattern), ondisk, source, strings) - - def Ignore(self, target, dependency): - """Ignore a dependency.""" - tlist = self.arg2nodes(target, self.fs.Entry) - dlist = self.arg2nodes(dependency, self.fs.Entry) - for t in tlist: - t.add_ignore(dlist) - return tlist - - def Literal(self, string): - return SCons.Subst.Literal(string) - - def Local(self, *targets): - ret = [] - for targ in targets: - if isinstance(targ, SCons.Node.Node): - targ.set_local() - ret.append(targ) - else: - for t in self.arg2nodes(targ, self.fs.Entry): - t.set_local() - ret.append(t) - return ret - - def Precious(self, *targets): - tlist = [] - for t in targets: - tlist.extend(self.arg2nodes(t, self.fs.Entry)) - for t in tlist: - t.set_precious() - return tlist - - def Repository(self, *dirs, **kw): - dirs = self.arg2nodes(list(dirs), self.fs.Dir) - apply(self.fs.Repository, dirs, kw) - - def Requires(self, target, prerequisite): - """Specify that 'prerequisite' must be built before 'target', - (but 'target' does not actually depend on 'prerequisite' - and need not be rebuilt if it changes).""" - tlist = self.arg2nodes(target, self.fs.Entry) - plist = self.arg2nodes(prerequisite, self.fs.Entry) - for t in tlist: - t.add_prerequisite(plist) - return tlist - - def Scanner(self, *args, **kw): - nargs = [] - for arg in args: - if SCons.Util.is_String(arg): - arg = self.subst(arg) - nargs.append(arg) - nkw = self.subst_kw(kw) - return apply(SCons.Scanner.Base, nargs, nkw) - - def SConsignFile(self, name=".sconsign", dbm_module=None): - if not name is None: - name = self.subst(name) - if not os.path.isabs(name): - name = os.path.join(str(self.fs.SConstruct_dir), name) - if name: - name = os.path.normpath(name) - sconsign_dir = os.path.dirname(name) - if sconsign_dir and not os.path.exists(sconsign_dir): - self.Execute(SCons.Defaults.Mkdir(sconsign_dir)) - SCons.SConsign.File(name, dbm_module) - - def SideEffect(self, side_effect, target): - """Tell scons that side_effects are built as side - effects of building targets.""" - side_effects = self.arg2nodes(side_effect, self.fs.Entry) - targets = self.arg2nodes(target, self.fs.Entry) - - for side_effect in side_effects: - if side_effect.multiple_side_effect_has_builder(): - raise SCons.Errors.UserError, "Multiple ways to build the same target were specified for: %s" % str(side_effect) - side_effect.add_source(targets) - side_effect.side_effect = 1 - self.Precious(side_effect) - for target in targets: - target.side_effects.append(side_effect) - return side_effects - - def SourceCode(self, entry, builder): - """Arrange for a source code builder for (part of) a tree.""" - entries = self.arg2nodes(entry, self.fs.Entry) - for entry in entries: - entry.set_src_builder(builder) - return entries - - def SourceSignatures(self, type): - global _warn_source_signatures_deprecated - if _warn_source_signatures_deprecated: - msg = "The env.SourceSignatures() method is deprecated;\n" + \ - "\tconvert your build to use the env.Decider() method instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedSourceSignaturesWarning, msg) - _warn_source_signatures_deprecated = False - type = self.subst(type) - self.src_sig_type = type - if type == 'MD5': - if not SCons.Util.md5: - raise UserError, "MD5 signatures are not available in this version of Python." - self.decide_source = self._changed_content - elif type == 'timestamp': - self.decide_source = self._changed_timestamp_match - else: - raise UserError, "Unknown source signature type '%s'" % type - - def Split(self, arg): - """This function converts a string or list into a list of strings - or Nodes. This makes things easier for users by allowing files to - be specified as a white-space separated list to be split. - The input rules are: - - A single string containing names separated by spaces. These will be - split apart at the spaces. - - A single Node instance - - A list containing either strings or Node instances. Any strings - in the list are not split at spaces. - In all cases, the function returns a list of Nodes and strings.""" - if SCons.Util.is_List(arg): - return map(self.subst, arg) - elif SCons.Util.is_String(arg): - return string.split(self.subst(arg)) - else: - return [self.subst(arg)] - - def TargetSignatures(self, type): - global _warn_target_signatures_deprecated - if _warn_target_signatures_deprecated: - msg = "The env.TargetSignatures() method is deprecated;\n" + \ - "\tconvert your build to use the env.Decider() method instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedTargetSignaturesWarning, msg) - _warn_target_signatures_deprecated = False - type = self.subst(type) - self.tgt_sig_type = type - if type in ('MD5', 'content'): - if not SCons.Util.md5: - raise UserError, "MD5 signatures are not available in this version of Python." - self.decide_target = self._changed_content - elif type == 'timestamp': - self.decide_target = self._changed_timestamp_match - elif type == 'build': - self.decide_target = self._changed_build - elif type == 'source': - self.decide_target = self._changed_source - else: - raise UserError, "Unknown target signature type '%s'"%type - - def Value(self, value, built_value=None): - """ - """ - return SCons.Node.Python.Value(value, built_value) - - def VariantDir(self, variant_dir, src_dir, duplicate=1): - variant_dir = self.arg2nodes(variant_dir, self.fs.Dir)[0] - src_dir = self.arg2nodes(src_dir, self.fs.Dir)[0] - self.fs.VariantDir(variant_dir, src_dir, duplicate) - - def FindSourceFiles(self, node='.'): - """ returns a list of all source files. - """ - node = self.arg2nodes(node, self.fs.Entry)[0] - - sources = [] - # Uncomment this and get rid of the global definition when we - # drop support for pre-2.2 Python versions. - #def build_source(ss, result): - # for s in ss: - # if isinstance(s, SCons.Node.FS.Dir): - # build_source(s.all_children(), result) - # elif s.has_builder(): - # build_source(s.sources, result) - # elif isinstance(s.disambiguate(), SCons.Node.FS.File): - # result.append(s) - build_source(node.all_children(), sources) - - # THIS CODE APPEARS TO HAVE NO EFFECT - # # get the final srcnode for all nodes, this means stripping any - # # attached build node by calling the srcnode function - # for file in sources: - # srcnode = file.srcnode() - # while srcnode != file.srcnode(): - # srcnode = file.srcnode() - - # remove duplicates - return list(set(sources)) - - def FindInstalledFiles(self): - """ returns the list of all targets of the Install and InstallAs Builder. - """ - from SCons.Tool import install - if install._UNIQUE_INSTALLED_FILES is None: - install._UNIQUE_INSTALLED_FILES = SCons.Util.uniquer_hashables(install._INSTALLED_FILES) - return install._UNIQUE_INSTALLED_FILES - -class OverrideEnvironment(Base): - """A proxy that overrides variables in a wrapped construction - environment by returning values from an overrides dictionary in - preference to values from the underlying subject environment. - - This is a lightweight (I hope) proxy that passes through most use of - attributes to the underlying Environment.Base class, but has just - enough additional methods defined to act like a real construction - environment with overridden values. It can wrap either a Base - construction environment, or another OverrideEnvironment, which - can in turn nest arbitrary OverrideEnvironments... - - Note that we do *not* call the underlying base class - (SubsitutionEnvironment) initialization, because we get most of those - from proxying the attributes of the subject construction environment. - But because we subclass SubstitutionEnvironment, this class also - has inherited arg2nodes() and subst*() methods; those methods can't - be proxied because they need *this* object's methods to fetch the - values from the overrides dictionary. - """ - - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - def __init__(self, subject, overrides={}): - if __debug__: logInstanceCreation(self, 'Environment.OverrideEnvironment') - self.__dict__['__subject'] = subject - self.__dict__['overrides'] = overrides - - # Methods that make this class act like a proxy. - def __getattr__(self, name): - return getattr(self.__dict__['__subject'], name) - def __setattr__(self, name, value): - setattr(self.__dict__['__subject'], name, value) - - # Methods that make this class act like a dictionary. - def __getitem__(self, key): - try: - return self.__dict__['overrides'][key] - except KeyError: - return self.__dict__['__subject'].__getitem__(key) - def __setitem__(self, key, value): - if not is_valid_construction_var(key): - raise SCons.Errors.UserError, "Illegal construction variable `%s'" % key - self.__dict__['overrides'][key] = value - def __delitem__(self, key): - try: - del self.__dict__['overrides'][key] - except KeyError: - deleted = 0 - else: - deleted = 1 - try: - result = self.__dict__['__subject'].__delitem__(key) - except KeyError: - if not deleted: - raise - result = None - return result - def get(self, key, default=None): - """Emulates the get() method of dictionaries.""" - try: - return self.__dict__['overrides'][key] - except KeyError: - return self.__dict__['__subject'].get(key, default) - def has_key(self, key): - try: - self.__dict__['overrides'][key] - return 1 - except KeyError: - return self.__dict__['__subject'].has_key(key) - def __contains__(self, key): - if self.__dict__['overrides'].__contains__(key): - return 1 - return self.__dict__['__subject'].__contains__(key) - def Dictionary(self): - """Emulates the items() method of dictionaries.""" - d = self.__dict__['__subject'].Dictionary().copy() - d.update(self.__dict__['overrides']) - return d - def items(self): - """Emulates the items() method of dictionaries.""" - return self.Dictionary().items() - - # Overridden private construction environment methods. - def _update(self, dict): - """Update an environment's values directly, bypassing the normal - checks that occur when users try to set items. - """ - self.__dict__['overrides'].update(dict) - - def gvars(self): - return self.__dict__['__subject'].gvars() - - def lvars(self): - lvars = self.__dict__['__subject'].lvars() - lvars.update(self.__dict__['overrides']) - return lvars - - # Overridden public construction environment methods. - def Replace(self, **kw): - kw = copy_non_reserved_keywords(kw) - self.__dict__['overrides'].update(semi_deepcopy(kw)) - -# The entry point that will be used by the external world -# to refer to a construction environment. This allows the wrapper -# interface to extend a construction environment for its own purposes -# by subclassing SCons.Environment.Base and then assigning the -# class to SCons.Environment.Environment. - -Environment = Base - -# An entry point for returning a proxy subclass instance that overrides -# the subst*() methods so they don't actually perform construction -# variable substitution. This is specifically intended to be the shim -# layer in between global function calls (which don't want construction -# variable substitution) and the DefaultEnvironment() (which would -# substitute variables if left to its own devices).""" -# -# We have to wrap this in a function that allows us to delay definition of -# the class until it's necessary, so that when it subclasses Environment -# it will pick up whatever Environment subclass the wrapper interface -# might have assigned to SCons.Environment.Environment. - -def NoSubstitutionProxy(subject): - class _NoSubstitutionProxy(Environment): - def __init__(self, subject): - self.__dict__['__subject'] = subject - def __getattr__(self, name): - return getattr(self.__dict__['__subject'], name) - def __setattr__(self, name, value): - return setattr(self.__dict__['__subject'], name, value) - def raw_to_mode(self, dict): - try: - raw = dict['raw'] - except KeyError: - pass - else: - del dict['raw'] - dict['mode'] = raw - def subst(self, string, *args, **kwargs): - return string - def subst_kw(self, kw, *args, **kwargs): - return kw - def subst_list(self, string, *args, **kwargs): - nargs = (string, self,) + args - nkw = kwargs.copy() - nkw['gvars'] = {} - self.raw_to_mode(nkw) - return apply(SCons.Subst.scons_subst_list, nargs, nkw) - def subst_target_source(self, string, *args, **kwargs): - nargs = (string, self,) + args - nkw = kwargs.copy() - nkw['gvars'] = {} - self.raw_to_mode(nkw) - return apply(SCons.Subst.scons_subst, nargs, nkw) - return _NoSubstitutionProxy(subject) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Errors.py b/3rdParty/SCons/scons-local/SCons/Errors.py deleted file mode 100644 index 1fd5663..0000000 --- a/3rdParty/SCons/scons-local/SCons/Errors.py +++ /dev/null @@ -1,207 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -"""SCons.Errors - -This file contains the exception classes used to handle internal -and user errors in SCons. - -""" - -__revision__ = "src/engine/SCons/Errors.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Util - -import exceptions - -class BuildError(Exception): - """ Errors occuring while building. - - BuildError have the following attributes: - - Information about the cause of the build error: - ----------------------------------------------- - - errstr : a description of the error message - - status : the return code of the action that caused the build - error. Must be set to a non-zero value even if the - build error is not due to an action returning a - non-zero returned code. - - exitstatus : SCons exit status due to this build error. - Must be nonzero unless due to an explicit Exit() - call. Not always the same as status, since - actions return a status code that should be - respected, but SCons typically exits with 2 - irrespective of the return value of the failed - action. - - filename : The name of the file or directory that caused the - build error. Set to None if no files are associated with - this error. This might be different from the target - being built. For example, failure to create the - directory in which the target file will appear. It - can be None if the error is not due to a particular - filename. - - exc_info : Info about exception that caused the build - error. Set to (None, None, None) if this build - error is not due to an exception. - - - Information about the cause of the location of the error: - --------------------------------------------------------- - - node : the error occured while building this target node(s) - - executor : the executor that caused the build to fail (might - be None if the build failures is not due to the - executor failing) - - action : the action that caused the build to fail (might be - None if the build failures is not due to the an - action failure) - - command : the command line for the action that caused the - build to fail (might be None if the build failures - is not due to the an action failure) - """ - - def __init__(self, - node=None, errstr="Unknown error", status=2, exitstatus=2, - filename=None, executor=None, action=None, command=None, - exc_info=(None, None, None)): - - self.errstr = errstr - self.status = status - self.exitstatus = exitstatus - self.filename = filename - self.exc_info = exc_info - - self.node = node - self.executor = executor - self.action = action - self.command = command - - Exception.__init__(self, node, errstr, status, exitstatus, filename, - executor, action, command, exc_info) - - def __str__(self): - if self.filename: - return self.filename + ': ' + self.errstr - else: - return self.errstr - -class InternalError(Exception): - pass - -class UserError(Exception): - pass - -class StopError(Exception): - pass - -class EnvironmentError(Exception): - pass - -class MSVCError(IOError): - pass - -class ExplicitExit(Exception): - def __init__(self, node=None, status=None, *args): - self.node = node - self.status = status - self.exitstatus = status - apply(Exception.__init__, (self,) + args) - -def convert_to_BuildError(status, exc_info=None): - """ - Convert any return code a BuildError Exception. - - `status' can either be a return code or an Exception. - The buildError.status we set here will normally be - used as the exit status of the "scons" process. - """ - if not exc_info and isinstance(status, Exception): - exc_info = (status.__class__, status, None) - - if isinstance(status, BuildError): - buildError = status - buildError.exitstatus = 2 # always exit with 2 on build errors - elif isinstance(status, ExplicitExit): - status = status.status - errstr = 'Explicit exit, status %s' % status - buildError = BuildError( - errstr=errstr, - status=status, # might be 0, OK here - exitstatus=status, # might be 0, OK here - exc_info=exc_info) - # TODO(1.5): - #elif isinstance(status, (StopError, UserError)): - elif isinstance(status, StopError) or isinstance(status, UserError): - buildError = BuildError( - errstr=str(status), - status=2, - exitstatus=2, - exc_info=exc_info) - elif isinstance(status, exceptions.EnvironmentError): - # If an IOError/OSError happens, raise a BuildError. - # Report the name of the file or directory that caused the - # error, which might be different from the target being built - # (for example, failure to create the directory in which the - # target file will appear). - try: filename = status.filename - except AttributeError: filename = None - buildError = BuildError( - errstr=status.strerror, - status=status.errno, - exitstatus=2, - filename=filename, - exc_info=exc_info) - elif isinstance(status, Exception): - buildError = BuildError( - errstr='%s : %s' % (status.__class__.__name__, status), - status=2, - exitstatus=2, - exc_info=exc_info) - elif SCons.Util.is_String(status): - buildError = BuildError( - errstr=status, - status=2, - exitstatus=2) - else: - buildError = BuildError( - errstr="Error %s" % status, - status=status, - exitstatus=2) - - #import sys - #sys.stderr.write("convert_to_BuildError: status %s => (errstr %s, status %s)"%(status,buildError.errstr, buildError.status)) - return buildError - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Executor.py b/3rdParty/SCons/scons-local/SCons/Executor.py deleted file mode 100644 index 0dfeaf1..0000000 --- a/3rdParty/SCons/scons-local/SCons/Executor.py +++ /dev/null @@ -1,636 +0,0 @@ -"""SCons.Executor - -A module for executing actions with specific lists of target and source -Nodes. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Executor.py 4043 2009/02/23 09:06:45 scons" - -import string -import UserList - -from SCons.Debug import logInstanceCreation -import SCons.Errors -import SCons.Memoize - - -class Batch: - """Remembers exact association between targets - and sources of executor.""" - def __init__(self, targets=[], sources=[]): - self.targets = targets - self.sources = sources - - - -class TSList(UserList.UserList): - """A class that implements $TARGETS or $SOURCES expansions by wrapping - an executor Method. This class is used in the Executor.lvars() - to delay creation of NodeList objects until they're needed. - - Note that we subclass UserList.UserList purely so that the - is_Sequence() function will identify an object of this class as - a list during variable expansion. We're not really using any - UserList.UserList methods in practice. - """ - def __init__(self, func): - self.func = func - def __getattr__(self, attr): - nl = self.func() - return getattr(nl, attr) - def __getitem__(self, i): - nl = self.func() - return nl[i] - def __getslice__(self, i, j): - nl = self.func() - i = max(i, 0); j = max(j, 0) - return nl[i:j] - def __str__(self): - nl = self.func() - return str(nl) - def __repr__(self): - nl = self.func() - return repr(nl) - -class TSObject: - """A class that implements $TARGET or $SOURCE expansions by wrapping - an Executor method. - """ - def __init__(self, func): - self.func = func - def __getattr__(self, attr): - n = self.func() - return getattr(n, attr) - def __str__(self): - n = self.func() - if n: - return str(n) - return '' - def __repr__(self): - n = self.func() - if n: - return repr(n) - return '' - -def rfile(node): - """ - A function to return the results of a Node's rfile() method, - if it exists, and the Node itself otherwise (if it's a Value - Node, e.g.). - """ - try: - rfile = node.rfile - except AttributeError: - return node - else: - return rfile() - - -class Executor: - """A class for controlling instances of executing an action. - - This largely exists to hold a single association of an action, - environment, list of environment override dictionaries, targets - and sources for later processing as needed. - """ - - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - memoizer_counters = [] - - def __init__(self, action, env=None, overridelist=[{}], - targets=[], sources=[], builder_kw={}): - if __debug__: logInstanceCreation(self, 'Executor.Executor') - self.set_action_list(action) - self.pre_actions = [] - self.post_actions = [] - self.env = env - self.overridelist = overridelist - if targets or sources: - self.batches = [Batch(targets[:], sources[:])] - else: - self.batches = [] - self.builder_kw = builder_kw - self._memo = {} - - def get_lvars(self): - try: - return self.lvars - except AttributeError: - self.lvars = { - 'CHANGED_SOURCES' : TSList(self._get_changed_sources), - 'CHANGED_TARGETS' : TSList(self._get_changed_targets), - 'SOURCE' : TSObject(self._get_source), - 'SOURCES' : TSList(self._get_sources), - 'TARGET' : TSObject(self._get_target), - 'TARGETS' : TSList(self._get_targets), - 'UNCHANGED_SOURCES' : TSList(self._get_unchanged_sources), - 'UNCHANGED_TARGETS' : TSList(self._get_unchanged_targets), - } - return self.lvars - - def _get_changes(self): - cs = [] - ct = [] - us = [] - ut = [] - for b in self.batches: - if b.targets[0].is_up_to_date(): - us.extend(map(rfile, b.sources)) - ut.extend(b.targets) - else: - cs.extend(map(rfile, b.sources)) - ct.extend(b.targets) - self._changed_sources_list = SCons.Util.NodeList(cs) - self._changed_targets_list = SCons.Util.NodeList(ct) - self._unchanged_sources_list = SCons.Util.NodeList(us) - self._unchanged_targets_list = SCons.Util.NodeList(ut) - - def _get_changed_sources(self, *args, **kw): - try: - return self._changed_sources_list - except AttributeError: - self._get_changes() - return self._changed_sources_list - - def _get_changed_targets(self, *args, **kw): - try: - return self._changed_targets_list - except AttributeError: - self._get_changes() - return self._changed_targets_list - - def _get_source(self, *args, **kw): - #return SCons.Util.NodeList([rfile(self.batches[0].sources[0]).get_subst_proxy()]) - return rfile(self.batches[0].sources[0]).get_subst_proxy() - - def _get_sources(self, *args, **kw): - return SCons.Util.NodeList(map(lambda n: rfile(n).get_subst_proxy(), self.get_all_sources())) - - def _get_target(self, *args, **kw): - #return SCons.Util.NodeList([self.batches[0].targets[0].get_subst_proxy()]) - return self.batches[0].targets[0].get_subst_proxy() - - def _get_targets(self, *args, **kw): - return SCons.Util.NodeList(map(lambda n: n.get_subst_proxy(), self.get_all_targets())) - - def _get_unchanged_sources(self, *args, **kw): - try: - return self._unchanged_sources_list - except AttributeError: - self._get_changes() - return self._unchanged_sources_list - - def _get_unchanged_targets(self, *args, **kw): - try: - return self._unchanged_targets_list - except AttributeError: - self._get_changes() - return self._unchanged_targets_list - - def get_action_targets(self): - if not self.action_list: - return [] - targets_string = self.action_list[0].get_targets(self.env, self) - if targets_string[0] == '$': - targets_string = targets_string[1:] - return self.get_lvars()[targets_string] - - def set_action_list(self, action): - import SCons.Util - if not SCons.Util.is_List(action): - if not action: - import SCons.Errors - raise SCons.Errors.UserError, "Executor must have an action." - action = [action] - self.action_list = action - - def get_action_list(self): - return self.pre_actions + self.action_list + self.post_actions - - def get_all_targets(self): - """Returns all targets for all batches of this Executor.""" - result = [] - for batch in self.batches: - # TODO(1.5): remove the list() cast - result.extend(list(batch.targets)) - return result - - def get_all_sources(self): - """Returns all sources for all batches of this Executor.""" - result = [] - for batch in self.batches: - # TODO(1.5): remove the list() cast - result.extend(list(batch.sources)) - return result - - def get_all_children(self): - """Returns all unique children (dependencies) for all batches - of this Executor. - - The Taskmaster can recognize when it's already evaluated a - Node, so we don't have to make this list unique for its intended - canonical use case, but we expect there to be a lot of redundancy - (long lists of batched .cc files #including the same .h files - over and over), so removing the duplicates once up front should - save the Taskmaster a lot of work. - """ - result = SCons.Util.UniqueList([]) - for target in self.get_all_targets(): - result.extend(target.children()) - return result - - def get_all_prerequisites(self): - """Returns all unique (order-only) prerequisites for all batches - of this Executor. - """ - result = SCons.Util.UniqueList([]) - for target in self.get_all_targets(): - # TODO(1.5): remove the list() cast - result.extend(list(target.prerequisites)) - return result - - def get_action_side_effects(self): - - """Returns all side effects for all batches of this - Executor used by the underlying Action. - """ - result = SCons.Util.UniqueList([]) - for target in self.get_action_targets(): - result.extend(target.side_effects) - return result - - memoizer_counters.append(SCons.Memoize.CountValue('get_build_env')) - - def get_build_env(self): - """Fetch or create the appropriate build Environment - for this Executor. - """ - try: - return self._memo['get_build_env'] - except KeyError: - pass - - # Create the build environment instance with appropriate - # overrides. These get evaluated against the current - # environment's construction variables so that users can - # add to existing values by referencing the variable in - # the expansion. - overrides = {} - for odict in self.overridelist: - overrides.update(odict) - - import SCons.Defaults - env = self.env or SCons.Defaults.DefaultEnvironment() - build_env = env.Override(overrides) - - self._memo['get_build_env'] = build_env - - return build_env - - def get_build_scanner_path(self, scanner): - """Fetch the scanner path for this executor's targets and sources. - """ - env = self.get_build_env() - try: - cwd = self.batches[0].targets[0].cwd - except (IndexError, AttributeError): - cwd = None - return scanner.path(env, cwd, - self.get_all_targets(), - self.get_all_sources()) - - def get_kw(self, kw={}): - result = self.builder_kw.copy() - result.update(kw) - result['executor'] = self - return result - - def do_nothing(self, target, kw): - return 0 - - def do_execute(self, target, kw): - """Actually execute the action list.""" - env = self.get_build_env() - kw = self.get_kw(kw) - status = 0 - for act in self.get_action_list(): - #args = (self.get_all_targets(), self.get_all_sources(), env) - args = ([], [], env) - status = apply(act, args, kw) - if isinstance(status, SCons.Errors.BuildError): - status.executor = self - raise status - elif status: - msg = "Error %s" % status - raise SCons.Errors.BuildError( - errstr=msg, - node=self.batches[0].targets, - executor=self, - action=act) - return status - - # use extra indirection because with new-style objects (Python 2.2 - # and above) we can't override special methods, and nullify() needs - # to be able to do this. - - def __call__(self, target, **kw): - return self.do_execute(target, kw) - - def cleanup(self): - self._memo = {} - - def add_sources(self, sources): - """Add source files to this Executor's list. This is necessary - for "multi" Builders that can be called repeatedly to build up - a source file list for a given target.""" - # TODO(batch): extend to multiple batches - assert (len(self.batches) == 1) - # TODO(batch): remove duplicates? - sources = filter(lambda x, s=self.batches[0].sources: x not in s, sources) - self.batches[0].sources.extend(sources) - - def get_sources(self): - return self.batches[0].sources - - def add_batch(self, targets, sources): - """Add pair of associated target and source to this Executor's list. - This is necessary for "batch" Builders that can be called repeatedly - to build up a list of matching target and source files that will be - used in order to update multiple target files at once from multiple - corresponding source files, for tools like MSVC that support it.""" - self.batches.append(Batch(targets, sources)) - - def prepare(self): - """ - Preparatory checks for whether this Executor can go ahead - and (try to) build its targets. - """ - for s in self.get_all_sources(): - if s.missing(): - msg = "Source `%s' not found, needed by target `%s'." - raise SCons.Errors.StopError, msg % (s, self.batches[0].targets[0]) - - def add_pre_action(self, action): - self.pre_actions.append(action) - - def add_post_action(self, action): - self.post_actions.append(action) - - # another extra indirection for new-style objects and nullify... - - def my_str(self): - env = self.get_build_env() - get = lambda action, t=self.get_all_targets(), s=self.get_all_sources(), e=env: \ - action.genstring(t, s, e) - return string.join(map(get, self.get_action_list()), "\n") - - - def __str__(self): - return self.my_str() - - def nullify(self): - self.cleanup() - self.do_execute = self.do_nothing - self.my_str = lambda S=self: '' - - memoizer_counters.append(SCons.Memoize.CountValue('get_contents')) - - def get_contents(self): - """Fetch the signature contents. This is the main reason this - class exists, so we can compute this once and cache it regardless - of how many target or source Nodes there are. - """ - try: - return self._memo['get_contents'] - except KeyError: - pass - env = self.get_build_env() - get = lambda action, t=self.get_all_targets(), s=self.get_all_sources(), e=env: \ - action.get_contents(t, s, e) - result = string.join(map(get, self.get_action_list()), "") - self._memo['get_contents'] = result - return result - - def get_timestamp(self): - """Fetch a time stamp for this Executor. We don't have one, of - course (only files do), but this is the interface used by the - timestamp module. - """ - return 0 - - def scan_targets(self, scanner): - # TODO(batch): scan by batches - self.scan(scanner, self.get_all_targets()) - - def scan_sources(self, scanner): - # TODO(batch): scan by batches - if self.batches[0].sources: - self.scan(scanner, self.get_all_sources()) - - def scan(self, scanner, node_list): - """Scan a list of this Executor's files (targets or sources) for - implicit dependencies and update all of the targets with them. - This essentially short-circuits an N*M scan of the sources for - each individual target, which is a hell of a lot more efficient. - """ - env = self.get_build_env() - - # TODO(batch): scan by batches) - deps = [] - if scanner: - for node in node_list: - node.disambiguate() - s = scanner.select(node) - if not s: - continue - path = self.get_build_scanner_path(s) - deps.extend(node.get_implicit_deps(env, s, path)) - else: - kw = self.get_kw() - for node in node_list: - node.disambiguate() - scanner = node.get_env_scanner(env, kw) - if not scanner: - continue - scanner = scanner.select(node) - if not scanner: - continue - path = self.get_build_scanner_path(scanner) - deps.extend(node.get_implicit_deps(env, scanner, path)) - - deps.extend(self.get_implicit_deps()) - - for tgt in self.get_all_targets(): - tgt.add_to_implicit(deps) - - def _get_unignored_sources_key(self, node, ignore=()): - return (node,) + tuple(ignore) - - memoizer_counters.append(SCons.Memoize.CountDict('get_unignored_sources', _get_unignored_sources_key)) - - def get_unignored_sources(self, node, ignore=()): - key = (node,) + tuple(ignore) - try: - memo_dict = self._memo['get_unignored_sources'] - except KeyError: - memo_dict = {} - self._memo['get_unignored_sources'] = memo_dict - else: - try: - return memo_dict[key] - except KeyError: - pass - - if node: - # TODO: better way to do this (it's a linear search, - # but it may not be critical path)? - sourcelist = [] - for b in self.batches: - if node in b.targets: - sourcelist = b.sources - break - else: - sourcelist = self.get_all_sources() - if ignore: - idict = {} - for i in ignore: - idict[i] = 1 - sourcelist = filter(lambda s, i=idict: not i.has_key(s), sourcelist) - - memo_dict[key] = sourcelist - - return sourcelist - - def get_implicit_deps(self): - """Return the executor's implicit dependencies, i.e. the nodes of - the commands to be executed.""" - result = [] - build_env = self.get_build_env() - for act in self.get_action_list(): - deps = act.get_implicit_deps(self.get_all_targets(), - self.get_all_sources(), - build_env) - result.extend(deps) - return result - - - -_batch_executors = {} - -def GetBatchExecutor(key): - return _batch_executors[key] - -def AddBatchExecutor(key, executor): - assert not _batch_executors.has_key(key) - _batch_executors[key] = executor - -nullenv = None - - -def get_NullEnvironment(): - """Use singleton pattern for Null Environments.""" - global nullenv - - import SCons.Util - class NullEnvironment(SCons.Util.Null): - import SCons.CacheDir - _CacheDir_path = None - _CacheDir = SCons.CacheDir.CacheDir(None) - def get_CacheDir(self): - return self._CacheDir - - if not nullenv: - nullenv = NullEnvironment() - return nullenv - -class Null: - """A null Executor, with a null build Environment, that does - nothing when the rest of the methods call it. - - This might be able to disapper when we refactor things to - disassociate Builders from Nodes entirely, so we're not - going to worry about unit tests for this--at least for now. - """ - def __init__(self, *args, **kw): - if __debug__: logInstanceCreation(self, 'Executor.Null') - self.batches = [Batch(kw['targets'][:], [])] - def get_build_env(self): - return get_NullEnvironment() - def get_build_scanner_path(self): - return None - def cleanup(self): - pass - def prepare(self): - pass - def get_unignored_sources(self, *args, **kw): - return tuple(()) - def get_action_targets(self): - return [] - def get_action_list(self): - return [] - def get_all_targets(self): - return self.batches[0].targets - def get_all_sources(self): - return self.batches[0].targets[0].sources - def get_all_children(self): - return self.get_all_sources() - def get_all_prerequisites(self): - return [] - def get_action_side_effects(self): - return [] - def __call__(self, *args, **kw): - return 0 - def get_contents(self): - return '' - def _morph(self): - """Morph this Null executor to a real Executor object.""" - batches = self.batches - self.__class__ = Executor - self.__init__([]) - self.batches = batches - - # The following methods require morphing this Null Executor to a - # real Executor object. - - def add_pre_action(self, action): - self._morph() - self.add_pre_action(action) - def add_post_action(self, action): - self._morph() - self.add_post_action(action) - def set_action_list(self, action): - self._morph() - self.set_action_list(action) - - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Job.py b/3rdParty/SCons/scons-local/SCons/Job.py deleted file mode 100644 index 4efddd4..0000000 --- a/3rdParty/SCons/scons-local/SCons/Job.py +++ /dev/null @@ -1,435 +0,0 @@ -"""SCons.Job - -This module defines the Serial and Parallel classes that execute tasks to -complete a build. The Jobs class provides a higher level interface to start, -stop, and wait on jobs. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Job.py 4043 2009/02/23 09:06:45 scons" - -import os -import signal - -import SCons.Errors - -# The default stack size (in kilobytes) of the threads used to execute -# jobs in parallel. -# -# We use a stack size of 256 kilobytes. The default on some platforms -# is too large and prevents us from creating enough threads to fully -# parallelized the build. For example, the default stack size on linux -# is 8 MBytes. - -explicit_stack_size = None -default_stack_size = 256 - -interrupt_msg = 'Build interrupted.' - - -class InterruptState: - def __init__(self): - self.interrupted = False - - def set(self): - self.interrupted = True - - def __call__(self): - return self.interrupted - - -class Jobs: - """An instance of this class initializes N jobs, and provides - methods for starting, stopping, and waiting on all N jobs. - """ - - def __init__(self, num, taskmaster): - """ - create 'num' jobs using the given taskmaster. - - If 'num' is 1 or less, then a serial job will be used, - otherwise a parallel job with 'num' worker threads will - be used. - - The 'num_jobs' attribute will be set to the actual number of jobs - allocated. If more than one job is requested but the Parallel - class can't do it, it gets reset to 1. Wrapping interfaces that - care should check the value of 'num_jobs' after initialization. - """ - - self.job = None - if num > 1: - stack_size = explicit_stack_size - if stack_size is None: - stack_size = default_stack_size - - try: - self.job = Parallel(taskmaster, num, stack_size) - self.num_jobs = num - except NameError: - pass - if self.job is None: - self.job = Serial(taskmaster) - self.num_jobs = 1 - - def run(self, postfunc=lambda: None): - """Run the jobs. - - postfunc() will be invoked after the jobs has run. It will be - invoked even if the jobs are interrupted by a keyboard - interrupt (well, in fact by a signal such as either SIGINT, - SIGTERM or SIGHUP). The execution of postfunc() is protected - against keyboard interrupts and is guaranteed to run to - completion.""" - self._setup_sig_handler() - try: - self.job.start() - finally: - postfunc() - self._reset_sig_handler() - - def were_interrupted(self): - """Returns whether the jobs were interrupted by a signal.""" - return self.job.interrupted() - - def _setup_sig_handler(self): - """Setup an interrupt handler so that SCons can shutdown cleanly in - various conditions: - - a) SIGINT: Keyboard interrupt - b) SIGTERM: kill or system shutdown - c) SIGHUP: Controlling shell exiting - - We handle all of these cases by stopping the taskmaster. It - turns out that it very difficult to stop the build process - by throwing asynchronously an exception such as - KeyboardInterrupt. For example, the python Condition - variables (threading.Condition) and Queue's do not seem to - asynchronous-exception-safe. It would require adding a whole - bunch of try/finally block and except KeyboardInterrupt all - over the place. - - Note also that we have to be careful to handle the case when - SCons forks before executing another process. In that case, we - want the child to exit immediately. - """ - def handler(signum, stack, self=self, parentpid=os.getpid()): - if os.getpid() == parentpid: - self.job.taskmaster.stop() - self.job.interrupted.set() - else: - os._exit(2) - - self.old_sigint = signal.signal(signal.SIGINT, handler) - self.old_sigterm = signal.signal(signal.SIGTERM, handler) - try: - self.old_sighup = signal.signal(signal.SIGHUP, handler) - except AttributeError: - pass - - def _reset_sig_handler(self): - """Restore the signal handlers to their previous state (before the - call to _setup_sig_handler().""" - - signal.signal(signal.SIGINT, self.old_sigint) - signal.signal(signal.SIGTERM, self.old_sigterm) - try: - signal.signal(signal.SIGHUP, self.old_sighup) - except AttributeError: - pass - -class Serial: - """This class is used to execute tasks in series, and is more efficient - than Parallel, but is only appropriate for non-parallel builds. Only - one instance of this class should be in existence at a time. - - This class is not thread safe. - """ - - def __init__(self, taskmaster): - """Create a new serial job given a taskmaster. - - The taskmaster's next_task() method should return the next task - that needs to be executed, or None if there are no more tasks. The - taskmaster's executed() method will be called for each task when it - is successfully executed or failed() will be called if it failed to - execute (e.g. execute() raised an exception).""" - - self.taskmaster = taskmaster - self.interrupted = InterruptState() - - def start(self): - """Start the job. This will begin pulling tasks from the taskmaster - and executing them, and return when there are no more tasks. If a task - fails to execute (i.e. execute() raises an exception), then the job will - stop.""" - - while 1: - task = self.taskmaster.next_task() - - if task is None: - break - - try: - task.prepare() - if task.needs_execute(): - task.execute() - except: - if self.interrupted(): - try: - raise SCons.Errors.BuildError( - task.targets[0], errstr=interrupt_msg) - except: - task.exception_set() - else: - task.exception_set() - - # Let the failed() callback function arrange for the - # build to stop if that's appropriate. - task.failed() - else: - task.executed() - - task.postprocess() - self.taskmaster.cleanup() - - -# Trap import failure so that everything in the Job module but the -# Parallel class (and its dependent classes) will work if the interpreter -# doesn't support threads. -try: - import Queue - import threading -except ImportError: - pass -else: - class Worker(threading.Thread): - """A worker thread waits on a task to be posted to its request queue, - dequeues the task, executes it, and posts a tuple including the task - and a boolean indicating whether the task executed successfully. """ - - def __init__(self, requestQueue, resultsQueue, interrupted): - threading.Thread.__init__(self) - self.setDaemon(1) - self.requestQueue = requestQueue - self.resultsQueue = resultsQueue - self.interrupted = interrupted - self.start() - - def run(self): - while 1: - task = self.requestQueue.get() - - if task is None: - # The "None" value is used as a sentinel by - # ThreadPool.cleanup(). This indicates that there - # are no more tasks, so we should quit. - break - - try: - if self.interrupted(): - raise SCons.Errors.BuildError( - task.targets[0], errstr=interrupt_msg) - task.execute() - except: - task.exception_set() - ok = False - else: - ok = True - - self.resultsQueue.put((task, ok)) - - class ThreadPool: - """This class is responsible for spawning and managing worker threads.""" - - def __init__(self, num, stack_size, interrupted): - """Create the request and reply queues, and 'num' worker threads. - - One must specify the stack size of the worker threads. The - stack size is specified in kilobytes. - """ - self.requestQueue = Queue.Queue(0) - self.resultsQueue = Queue.Queue(0) - - try: - prev_size = threading.stack_size(stack_size*1024) - except AttributeError, e: - # Only print a warning if the stack size has been - # explicitly set. - if not explicit_stack_size is None: - msg = "Setting stack size is unsupported by this version of Python:\n " + \ - e.args[0] - SCons.Warnings.warn(SCons.Warnings.StackSizeWarning, msg) - except ValueError, e: - msg = "Setting stack size failed:\n " + str(e) - SCons.Warnings.warn(SCons.Warnings.StackSizeWarning, msg) - - # Create worker threads - self.workers = [] - for _ in range(num): - worker = Worker(self.requestQueue, self.resultsQueue, interrupted) - self.workers.append(worker) - - # Once we drop Python 1.5 we can change the following to: - #if 'prev_size' in locals(): - if 'prev_size' in locals().keys(): - threading.stack_size(prev_size) - - def put(self, task): - """Put task into request queue.""" - self.requestQueue.put(task) - - def get(self): - """Remove and return a result tuple from the results queue.""" - return self.resultsQueue.get() - - def preparation_failed(self, task): - self.resultsQueue.put((task, False)) - - def cleanup(self): - """ - Shuts down the thread pool, giving each worker thread a - chance to shut down gracefully. - """ - # For each worker thread, put a sentinel "None" value - # on the requestQueue (indicating that there's no work - # to be done) so that each worker thread will get one and - # terminate gracefully. - for _ in self.workers: - self.requestQueue.put(None) - - # Wait for all of the workers to terminate. - # - # If we don't do this, later Python versions (2.4, 2.5) often - # seem to raise exceptions during shutdown. This happens - # in requestQueue.get(), as an assertion failure that - # requestQueue.not_full is notified while not acquired, - # seemingly because the main thread has shut down (or is - # in the process of doing so) while the workers are still - # trying to pull sentinels off the requestQueue. - # - # Normally these terminations should happen fairly quickly, - # but we'll stick a one-second timeout on here just in case - # someone gets hung. - for worker in self.workers: - worker.join(1.0) - self.workers = [] - - class Parallel: - """This class is used to execute tasks in parallel, and is somewhat - less efficient than Serial, but is appropriate for parallel builds. - - This class is thread safe. - """ - - def __init__(self, taskmaster, num, stack_size): - """Create a new parallel job given a taskmaster. - - The taskmaster's next_task() method should return the next - task that needs to be executed, or None if there are no more - tasks. The taskmaster's executed() method will be called - for each task when it is successfully executed or failed() - will be called if the task failed to execute (i.e. execute() - raised an exception). - - Note: calls to taskmaster are serialized, but calls to - execute() on distinct tasks are not serialized, because - that is the whole point of parallel jobs: they can execute - multiple tasks simultaneously. """ - - self.taskmaster = taskmaster - self.interrupted = InterruptState() - self.tp = ThreadPool(num, stack_size, self.interrupted) - - self.maxjobs = num - - def start(self): - """Start the job. This will begin pulling tasks from the - taskmaster and executing them, and return when there are no - more tasks. If a task fails to execute (i.e. execute() raises - an exception), then the job will stop.""" - - jobs = 0 - - while 1: - # Start up as many available tasks as we're - # allowed to. - while jobs < self.maxjobs: - task = self.taskmaster.next_task() - if task is None: - break - - try: - # prepare task for execution - task.prepare() - except: - task.exception_set() - task.failed() - task.postprocess() - else: - if task.needs_execute(): - # dispatch task - self.tp.put(task) - jobs = jobs + 1 - else: - task.executed() - task.postprocess() - - if not task and not jobs: break - - # Let any/all completed tasks finish up before we go - # back and put the next batch of tasks on the queue. - while 1: - task, ok = self.tp.get() - jobs = jobs - 1 - - if ok: - task.executed() - else: - if self.interrupted(): - try: - raise SCons.Errors.BuildError( - task.targets[0], errstr=interrupt_msg) - except: - task.exception_set() - - # Let the failed() callback function arrange - # for the build to stop if that's appropriate. - task.failed() - - task.postprocess() - - if self.tp.resultsQueue.empty(): - break - - self.tp.cleanup() - self.taskmaster.cleanup() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Memoize.py b/3rdParty/SCons/scons-local/SCons/Memoize.py deleted file mode 100644 index dbb0cf1..0000000 --- a/3rdParty/SCons/scons-local/SCons/Memoize.py +++ /dev/null @@ -1,292 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Memoize.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """Memoizer - -A metaclass implementation to count hits and misses of the computed -values that various methods cache in memory. - -Use of this modules assumes that wrapped methods be coded to cache their -values in a consistent way. Here is an example of wrapping a method -that returns a computed value, with no input parameters: - - memoizer_counters = [] # Memoization - - memoizer_counters.append(SCons.Memoize.CountValue('foo')) # Memoization - - def foo(self): - - try: # Memoization - return self._memo['foo'] # Memoization - except KeyError: # Memoization - pass # Memoization - - result = self.compute_foo_value() - - self._memo['foo'] = result # Memoization - - return result - -Here is an example of wrapping a method that will return different values -based on one or more input arguments: - - def _bar_key(self, argument): # Memoization - return argument # Memoization - - memoizer_counters.append(SCons.Memoize.CountDict('bar', _bar_key)) # Memoization - - def bar(self, argument): - - memo_key = argument # Memoization - try: # Memoization - memo_dict = self._memo['bar'] # Memoization - except KeyError: # Memoization - memo_dict = {} # Memoization - self._memo['dict'] = memo_dict # Memoization - else: # Memoization - try: # Memoization - return memo_dict[memo_key] # Memoization - except KeyError: # Memoization - pass # Memoization - - result = self.compute_bar_value(argument) - - memo_dict[memo_key] = result # Memoization - - return result - -At one point we avoided replicating this sort of logic in all the methods -by putting it right into this module, but we've moved away from that at -present (see the "Historical Note," below.). - -Deciding what to cache is tricky, because different configurations -can have radically different performance tradeoffs, and because the -tradeoffs involved are often so non-obvious. Consequently, deciding -whether or not to cache a given method will likely be more of an art than -a science, but should still be based on available data from this module. -Here are some VERY GENERAL guidelines about deciding whether or not to -cache return values from a method that's being called a lot: - - -- The first question to ask is, "Can we change the calling code - so this method isn't called so often?" Sometimes this can be - done by changing the algorithm. Sometimes the *caller* should - be memoized, not the method you're looking at. - - -- The memoized function should be timed with multiple configurations - to make sure it doesn't inadvertently slow down some other - configuration. - - -- When memoizing values based on a dictionary key composed of - input arguments, you don't need to use all of the arguments - if some of them don't affect the return values. - -Historical Note: The initial Memoizer implementation actually handled -the caching of values for the wrapped methods, based on a set of generic -algorithms for computing hashable values based on the method's arguments. -This collected caching logic nicely, but had two drawbacks: - - Running arguments through a generic key-conversion mechanism is slower - (and less flexible) than just coding these things directly. Since the - methods that need memoized values are generally performance-critical, - slowing them down in order to collect the logic isn't the right - tradeoff. - - Use of the memoizer really obscured what was being called, because - all the memoized methods were wrapped with re-used generic methods. - This made it more difficult, for example, to use the Python profiler - to figure out how to optimize the underlying methods. -""" - -import new - -# A flag controlling whether or not we actually use memoization. -use_memoizer = None - -CounterList = [] - -class Counter: - """ - Base class for counting memoization hits and misses. - - We expect that the metaclass initialization will have filled in - the .name attribute that represents the name of the function - being counted. - """ - def __init__(self, method_name): - """ - """ - self.method_name = method_name - self.hit = 0 - self.miss = 0 - CounterList.append(self) - def display(self): - fmt = " %7d hits %7d misses %s()" - print fmt % (self.hit, self.miss, self.name) - def __cmp__(self, other): - try: - return cmp(self.name, other.name) - except AttributeError: - return 0 - -class CountValue(Counter): - """ - A counter class for simple, atomic memoized values. - - A CountValue object should be instantiated in a class for each of - the class's methods that memoizes its return value by simply storing - the return value in its _memo dictionary. - - We expect that the metaclass initialization will fill in the - .underlying_method attribute with the method that we're wrapping. - We then call the underlying_method method after counting whether - its memoized value has already been set (a hit) or not (a miss). - """ - def __call__(self, *args, **kw): - obj = args[0] - if obj._memo.has_key(self.method_name): - self.hit = self.hit + 1 - else: - self.miss = self.miss + 1 - return apply(self.underlying_method, args, kw) - -class CountDict(Counter): - """ - A counter class for memoized values stored in a dictionary, with - keys based on the method's input arguments. - - A CountDict object is instantiated in a class for each of the - class's methods that memoizes its return value in a dictionary, - indexed by some key that can be computed from one or more of - its input arguments. - - We expect that the metaclass initialization will fill in the - .underlying_method attribute with the method that we're wrapping. - We then call the underlying_method method after counting whether the - computed key value is already present in the memoization dictionary - (a hit) or not (a miss). - """ - def __init__(self, method_name, keymaker): - """ - """ - Counter.__init__(self, method_name) - self.keymaker = keymaker - def __call__(self, *args, **kw): - obj = args[0] - try: - memo_dict = obj._memo[self.method_name] - except KeyError: - self.miss = self.miss + 1 - else: - key = apply(self.keymaker, args, kw) - if memo_dict.has_key(key): - self.hit = self.hit + 1 - else: - self.miss = self.miss + 1 - return apply(self.underlying_method, args, kw) - -class Memoizer: - """Object which performs caching of method calls for its 'primary' - instance.""" - - def __init__(self): - pass - -# Find out if we support metaclasses (Python 2.2 and later). - -class M: - def __init__(cls, name, bases, cls_dict): - cls.use_metaclass = 1 - def fake_method(self): - pass - new.instancemethod(fake_method, None, cls) - -try: - class A: - __metaclass__ = M - - use_metaclass = A.use_metaclass -except AttributeError: - use_metaclass = None - reason = 'no metaclasses' -except TypeError: - use_metaclass = None - reason = 'new.instancemethod() bug' -else: - del A - -del M - -if not use_metaclass: - - def Dump(title): - pass - - try: - class Memoized_Metaclass(type): - # Just a place-holder so pre-metaclass Python versions don't - # have to have special code for the Memoized classes. - pass - except TypeError: - class Memoized_Metaclass: - # A place-holder so pre-metaclass Python versions don't - # have to have special code for the Memoized classes. - pass - - def EnableMemoization(): - import SCons.Warnings - msg = 'memoization is not supported in this version of Python (%s)' - raise SCons.Warnings.NoMetaclassSupportWarning, msg % reason - -else: - - def Dump(title=None): - if title: - print title - CounterList.sort() - for counter in CounterList: - counter.display() - - class Memoized_Metaclass(type): - def __init__(cls, name, bases, cls_dict): - super(Memoized_Metaclass, cls).__init__(name, bases, cls_dict) - - for counter in cls_dict.get('memoizer_counters', []): - method_name = counter.method_name - - counter.name = cls.__name__ + '.' + method_name - counter.underlying_method = cls_dict[method_name] - - replacement_method = new.instancemethod(counter, None, cls) - setattr(cls, method_name, replacement_method) - - def EnableMemoization(): - global use_memoizer - use_memoizer = 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Node/Alias.py b/3rdParty/SCons/scons-local/SCons/Node/Alias.py deleted file mode 100644 index a52a3fb..0000000 --- a/3rdParty/SCons/scons-local/SCons/Node/Alias.py +++ /dev/null @@ -1,153 +0,0 @@ - -"""scons.Node.Alias - -Alias nodes. - -This creates a hash of global Aliases (dummy targets). - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Node/Alias.py 4043 2009/02/23 09:06:45 scons" - -import string -import UserDict - -import SCons.Errors -import SCons.Node -import SCons.Util - -class AliasNameSpace(UserDict.UserDict): - def Alias(self, name, **kw): - if isinstance(name, SCons.Node.Alias.Alias): - return name - try: - a = self[name] - except KeyError: - a = apply(SCons.Node.Alias.Alias, (name,), kw) - self[name] = a - return a - - def lookup(self, name, **kw): - try: - return self[name] - except KeyError: - return None - -class AliasNodeInfo(SCons.Node.NodeInfoBase): - current_version_id = 1 - field_list = ['csig'] - def str_to_node(self, s): - return default_ans.Alias(s) - -class AliasBuildInfo(SCons.Node.BuildInfoBase): - current_version_id = 1 - -class Alias(SCons.Node.Node): - - NodeInfo = AliasNodeInfo - BuildInfo = AliasBuildInfo - - def __init__(self, name): - SCons.Node.Node.__init__(self) - self.name = name - - def str_for_display(self): - return '"' + self.__str__() + '"' - - def __str__(self): - return self.name - - def make_ready(self): - self.get_csig() - - really_build = SCons.Node.Node.build - is_up_to_date = SCons.Node.Node.children_are_up_to_date - - def is_under(self, dir): - # Make Alias nodes get built regardless of - # what directory scons was run from. Alias nodes - # are outside the filesystem: - return 1 - - def get_contents(self): - """The contents of an alias is the concatenation - of the content signatures of all its sources.""" - childsigs = map(lambda n: n.get_csig(), self.children()) - return string.join(childsigs, '') - - def sconsign(self): - """An Alias is not recorded in .sconsign files""" - pass - - # - # - # - - def changed_since_last_build(self, target, prev_ni): - cur_csig = self.get_csig() - try: - return cur_csig != prev_ni.csig - except AttributeError: - return 1 - - def build(self): - """A "builder" for aliases.""" - pass - - def convert(self): - try: del self.builder - except AttributeError: pass - self.reset_executor() - self.build = self.really_build - - def get_csig(self): - """ - Generate a node's content signature, the digested signature - of its content. - - node - the node - cache - alternate node to use for the signature cache - returns - the content signature - """ - try: - return self.ninfo.csig - except AttributeError: - pass - - contents = self.get_contents() - csig = SCons.Util.MD5signature(contents) - self.get_ninfo().csig = csig - return csig - -default_ans = AliasNameSpace() - -SCons.Node.arg2nodes_lookups.append(default_ans.lookup) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Node/FS.py b/3rdParty/SCons/scons-local/SCons/Node/FS.py deleted file mode 100644 index abcd8da..0000000 --- a/3rdParty/SCons/scons-local/SCons/Node/FS.py +++ /dev/null @@ -1,3166 +0,0 @@ -"""scons.Node.FS - -File system nodes. - -These Nodes represent the canonical external objects that people think -of when they think of building software: files and directories. - -This holds a "default_fs" variable that should be initialized with an FS -that can be used by scripts or modules looking for the canonical default. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Node/FS.py 4043 2009/02/23 09:06:45 scons" - -from itertools import izip -import cStringIO -import fnmatch -import os -import os.path -import re -import shutil -import stat -import string -import sys -import time - -try: - import codecs -except ImportError: - pass -else: - # TODO(2.2): Remove when 2.3 becomes the minimal supported version. - try: - codecs.BOM_UTF8 - except AttributeError: - codecs.BOM_UTF8 = '\xef\xbb\xbf' - try: - codecs.BOM_UTF16 - except AttributeError: - if sys.byteorder == 'little': - codecs.BOM_UTF16 = '\xff\xfe' - else: - codecs.BOM_UTF16 = '\xfe\xff' - -import SCons.Action -from SCons.Debug import logInstanceCreation -import SCons.Errors -import SCons.Memoize -import SCons.Node -import SCons.Node.Alias -import SCons.Subst -import SCons.Util -import SCons.Warnings - -from SCons.Debug import Trace - -do_store_info = True - - -class EntryProxyAttributeError(AttributeError): - """ - An AttributeError subclass for recording and displaying the name - of the underlying Entry involved in an AttributeError exception. - """ - def __init__(self, entry_proxy, attribute): - AttributeError.__init__(self) - self.entry_proxy = entry_proxy - self.attribute = attribute - def __str__(self): - entry = self.entry_proxy.get() - fmt = "%s instance %s has no attribute %s" - return fmt % (entry.__class__.__name__, - repr(entry.name), - repr(self.attribute)) - -# The max_drift value: by default, use a cached signature value for -# any file that's been untouched for more than two days. -default_max_drift = 2*24*60*60 - -# -# We stringify these file system Nodes a lot. Turning a file system Node -# into a string is non-trivial, because the final string representation -# can depend on a lot of factors: whether it's a derived target or not, -# whether it's linked to a repository or source directory, and whether -# there's duplication going on. The normal technique for optimizing -# calculations like this is to memoize (cache) the string value, so you -# only have to do the calculation once. -# -# A number of the above factors, however, can be set after we've already -# been asked to return a string for a Node, because a Repository() or -# VariantDir() call or the like may not occur until later in SConscript -# files. So this variable controls whether we bother trying to save -# string values for Nodes. The wrapper interface can set this whenever -# they're done mucking with Repository and VariantDir and the other stuff, -# to let this module know it can start returning saved string values -# for Nodes. -# -Save_Strings = None - -def save_strings(val): - global Save_Strings - Save_Strings = val - -# -# Avoid unnecessary function calls by recording a Boolean value that -# tells us whether or not os.path.splitdrive() actually does anything -# on this system, and therefore whether we need to bother calling it -# when looking up path names in various methods below. -# - -do_splitdrive = None - -def initialize_do_splitdrive(): - global do_splitdrive - drive, path = os.path.splitdrive('X:/foo') - do_splitdrive = not not drive - -initialize_do_splitdrive() - -# - -needs_normpath_check = None - -def initialize_normpath_check(): - """ - Initialize the normpath_check regular expression. - - This function is used by the unit tests to re-initialize the pattern - when testing for behavior with different values of os.sep. - """ - global needs_normpath_check - if os.sep == '/': - pattern = r'.*/|\.$|\.\.$' - else: - pattern = r'.*[/%s]|\.$|\.\.$' % re.escape(os.sep) - needs_normpath_check = re.compile(pattern) - -initialize_normpath_check() - -# -# SCons.Action objects for interacting with the outside world. -# -# The Node.FS methods in this module should use these actions to -# create and/or remove files and directories; they should *not* use -# os.{link,symlink,unlink,mkdir}(), etc., directly. -# -# Using these SCons.Action objects ensures that descriptions of these -# external activities are properly displayed, that the displays are -# suppressed when the -s (silent) option is used, and (most importantly) -# the actions are disabled when the the -n option is used, in which case -# there should be *no* changes to the external file system(s)... -# - -if hasattr(os, 'link'): - def _hardlink_func(fs, src, dst): - # If the source is a symlink, we can't just hard-link to it - # because a relative symlink may point somewhere completely - # different. We must disambiguate the symlink and then - # hard-link the final destination file. - while fs.islink(src): - link = fs.readlink(src) - if not os.path.isabs(link): - src = link - else: - src = os.path.join(os.path.dirname(src), link) - fs.link(src, dst) -else: - _hardlink_func = None - -if hasattr(os, 'symlink'): - def _softlink_func(fs, src, dst): - fs.symlink(src, dst) -else: - _softlink_func = None - -def _copy_func(fs, src, dest): - shutil.copy2(src, dest) - st = fs.stat(src) - fs.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE) - - -Valid_Duplicates = ['hard-soft-copy', 'soft-hard-copy', - 'hard-copy', 'soft-copy', 'copy'] - -Link_Funcs = [] # contains the callables of the specified duplication style - -def set_duplicate(duplicate): - # Fill in the Link_Funcs list according to the argument - # (discarding those not available on the platform). - - # Set up the dictionary that maps the argument names to the - # underlying implementations. We do this inside this function, - # not in the top-level module code, so that we can remap os.link - # and os.symlink for testing purposes. - link_dict = { - 'hard' : _hardlink_func, - 'soft' : _softlink_func, - 'copy' : _copy_func - } - - if not duplicate in Valid_Duplicates: - raise SCons.Errors.InternalError, ("The argument of set_duplicate " - "should be in Valid_Duplicates") - global Link_Funcs - Link_Funcs = [] - for func in string.split(duplicate,'-'): - if link_dict[func]: - Link_Funcs.append(link_dict[func]) - -def LinkFunc(target, source, env): - # Relative paths cause problems with symbolic links, so - # we use absolute paths, which may be a problem for people - # who want to move their soft-linked src-trees around. Those - # people should use the 'hard-copy' mode, softlinks cannot be - # used for that; at least I have no idea how ... - src = source[0].abspath - dest = target[0].abspath - dir, file = os.path.split(dest) - if dir and not target[0].fs.isdir(dir): - os.makedirs(dir) - if not Link_Funcs: - # Set a default order of link functions. - set_duplicate('hard-soft-copy') - fs = source[0].fs - # Now link the files with the previously specified order. - for func in Link_Funcs: - try: - func(fs, src, dest) - break - except (IOError, OSError): - # An OSError indicates something happened like a permissions - # problem or an attempt to symlink across file-system - # boundaries. An IOError indicates something like the file - # not existing. In either case, keeping trying additional - # functions in the list and only raise an error if the last - # one failed. - if func == Link_Funcs[-1]: - # exception of the last link method (copy) are fatal - raise - return 0 - -Link = SCons.Action.Action(LinkFunc, None) -def LocalString(target, source, env): - return 'Local copy of %s from %s' % (target[0], source[0]) - -LocalCopy = SCons.Action.Action(LinkFunc, LocalString) - -def UnlinkFunc(target, source, env): - t = target[0] - t.fs.unlink(t.abspath) - return 0 - -Unlink = SCons.Action.Action(UnlinkFunc, None) - -def MkdirFunc(target, source, env): - t = target[0] - if not t.exists(): - t.fs.mkdir(t.abspath) - return 0 - -Mkdir = SCons.Action.Action(MkdirFunc, None, presub=None) - -MkdirBuilder = None - -def get_MkdirBuilder(): - global MkdirBuilder - if MkdirBuilder is None: - import SCons.Builder - import SCons.Defaults - # "env" will get filled in by Executor.get_build_env() - # calling SCons.Defaults.DefaultEnvironment() when necessary. - MkdirBuilder = SCons.Builder.Builder(action = Mkdir, - env = None, - explain = None, - is_explicit = None, - target_scanner = SCons.Defaults.DirEntryScanner, - name = "MkdirBuilder") - return MkdirBuilder - -class _Null: - pass - -_null = _Null() - -DefaultSCCSBuilder = None -DefaultRCSBuilder = None - -def get_DefaultSCCSBuilder(): - global DefaultSCCSBuilder - if DefaultSCCSBuilder is None: - import SCons.Builder - # "env" will get filled in by Executor.get_build_env() - # calling SCons.Defaults.DefaultEnvironment() when necessary. - act = SCons.Action.Action('$SCCSCOM', '$SCCSCOMSTR') - DefaultSCCSBuilder = SCons.Builder.Builder(action = act, - env = None, - name = "DefaultSCCSBuilder") - return DefaultSCCSBuilder - -def get_DefaultRCSBuilder(): - global DefaultRCSBuilder - if DefaultRCSBuilder is None: - import SCons.Builder - # "env" will get filled in by Executor.get_build_env() - # calling SCons.Defaults.DefaultEnvironment() when necessary. - act = SCons.Action.Action('$RCS_COCOM', '$RCS_COCOMSTR') - DefaultRCSBuilder = SCons.Builder.Builder(action = act, - env = None, - name = "DefaultRCSBuilder") - return DefaultRCSBuilder - -# Cygwin's os.path.normcase pretends it's on a case-sensitive filesystem. -_is_cygwin = sys.platform == "cygwin" -if os.path.normcase("TeSt") == os.path.normpath("TeSt") and not _is_cygwin: - def _my_normcase(x): - return x -else: - def _my_normcase(x): - return string.upper(x) - - - -class DiskChecker: - def __init__(self, type, do, ignore): - self.type = type - self.do = do - self.ignore = ignore - self.set_do() - def set_do(self): - self.__call__ = self.do - def set_ignore(self): - self.__call__ = self.ignore - def set(self, list): - if self.type in list: - self.set_do() - else: - self.set_ignore() - -def do_diskcheck_match(node, predicate, errorfmt): - result = predicate() - try: - # If calling the predicate() cached a None value from stat(), - # remove it so it doesn't interfere with later attempts to - # build this Node as we walk the DAG. (This isn't a great way - # to do this, we're reaching into an interface that doesn't - # really belong to us, but it's all about performance, so - # for now we'll just document the dependency...) - if node._memo['stat'] is None: - del node._memo['stat'] - except (AttributeError, KeyError): - pass - if result: - raise TypeError, errorfmt % node.abspath - -def ignore_diskcheck_match(node, predicate, errorfmt): - pass - -def do_diskcheck_rcs(node, name): - try: - rcs_dir = node.rcs_dir - except AttributeError: - if node.entry_exists_on_disk('RCS'): - rcs_dir = node.Dir('RCS') - else: - rcs_dir = None - node.rcs_dir = rcs_dir - if rcs_dir: - return rcs_dir.entry_exists_on_disk(name+',v') - return None - -def ignore_diskcheck_rcs(node, name): - return None - -def do_diskcheck_sccs(node, name): - try: - sccs_dir = node.sccs_dir - except AttributeError: - if node.entry_exists_on_disk('SCCS'): - sccs_dir = node.Dir('SCCS') - else: - sccs_dir = None - node.sccs_dir = sccs_dir - if sccs_dir: - return sccs_dir.entry_exists_on_disk('s.'+name) - return None - -def ignore_diskcheck_sccs(node, name): - return None - -diskcheck_match = DiskChecker('match', do_diskcheck_match, ignore_diskcheck_match) -diskcheck_rcs = DiskChecker('rcs', do_diskcheck_rcs, ignore_diskcheck_rcs) -diskcheck_sccs = DiskChecker('sccs', do_diskcheck_sccs, ignore_diskcheck_sccs) - -diskcheckers = [ - diskcheck_match, - diskcheck_rcs, - diskcheck_sccs, -] - -def set_diskcheck(list): - for dc in diskcheckers: - dc.set(list) - -def diskcheck_types(): - return map(lambda dc: dc.type, diskcheckers) - - - -class EntryProxy(SCons.Util.Proxy): - def __get_abspath(self): - entry = self.get() - return SCons.Subst.SpecialAttrWrapper(entry.get_abspath(), - entry.name + "_abspath") - - def __get_filebase(self): - name = self.get().name - return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(name)[0], - name + "_filebase") - - def __get_suffix(self): - name = self.get().name - return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(name)[1], - name + "_suffix") - - def __get_file(self): - name = self.get().name - return SCons.Subst.SpecialAttrWrapper(name, name + "_file") - - def __get_base_path(self): - """Return the file's directory and file name, with the - suffix stripped.""" - entry = self.get() - return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(entry.get_path())[0], - entry.name + "_base") - - def __get_posix_path(self): - """Return the path with / as the path separator, - regardless of platform.""" - if os.sep == '/': - return self - else: - entry = self.get() - r = string.replace(entry.get_path(), os.sep, '/') - return SCons.Subst.SpecialAttrWrapper(r, entry.name + "_posix") - - def __get_windows_path(self): - """Return the path with \ as the path separator, - regardless of platform.""" - if os.sep == '\\': - return self - else: - entry = self.get() - r = string.replace(entry.get_path(), os.sep, '\\') - return SCons.Subst.SpecialAttrWrapper(r, entry.name + "_windows") - - def __get_srcnode(self): - return EntryProxy(self.get().srcnode()) - - def __get_srcdir(self): - """Returns the directory containing the source node linked to this - node via VariantDir(), or the directory of this node if not linked.""" - return EntryProxy(self.get().srcnode().dir) - - def __get_rsrcnode(self): - return EntryProxy(self.get().srcnode().rfile()) - - def __get_rsrcdir(self): - """Returns the directory containing the source node linked to this - node via VariantDir(), or the directory of this node if not linked.""" - return EntryProxy(self.get().srcnode().rfile().dir) - - def __get_dir(self): - return EntryProxy(self.get().dir) - - dictSpecialAttrs = { "base" : __get_base_path, - "posix" : __get_posix_path, - "windows" : __get_windows_path, - "win32" : __get_windows_path, - "srcpath" : __get_srcnode, - "srcdir" : __get_srcdir, - "dir" : __get_dir, - "abspath" : __get_abspath, - "filebase" : __get_filebase, - "suffix" : __get_suffix, - "file" : __get_file, - "rsrcpath" : __get_rsrcnode, - "rsrcdir" : __get_rsrcdir, - } - - def __getattr__(self, name): - # This is how we implement the "special" attributes - # such as base, posix, srcdir, etc. - try: - attr_function = self.dictSpecialAttrs[name] - except KeyError: - try: - attr = SCons.Util.Proxy.__getattr__(self, name) - except AttributeError, e: - # Raise our own AttributeError subclass with an - # overridden __str__() method that identifies the - # name of the entry that caused the exception. - raise EntryProxyAttributeError(self, name) - return attr - else: - return attr_function(self) - -class Base(SCons.Node.Node): - """A generic class for file system entries. This class is for - when we don't know yet whether the entry being looked up is a file - or a directory. Instances of this class can morph into either - Dir or File objects by a later, more precise lookup. - - Note: this class does not define __cmp__ and __hash__ for - efficiency reasons. SCons does a lot of comparing of - Node.FS.{Base,Entry,File,Dir} objects, so those operations must be - as fast as possible, which means we want to use Python's built-in - object identity comparisons. - """ - - memoizer_counters = [] - - def __init__(self, name, directory, fs): - """Initialize a generic Node.FS.Base object. - - Call the superclass initialization, take care of setting up - our relative and absolute paths, identify our parent - directory, and indicate that this node should use - signatures.""" - if __debug__: logInstanceCreation(self, 'Node.FS.Base') - SCons.Node.Node.__init__(self) - - # Filenames and paths are probably reused and are intern'ed to - # save some memory. - self.name = intern(name) - self.suffix = intern(SCons.Util.splitext(name)[1]) - self.fs = fs - - assert directory, "A directory must be provided" - - self.abspath = intern(directory.entry_abspath(name)) - self.labspath = intern(directory.entry_labspath(name)) - if directory.path == '.': - self.path = intern(name) - else: - self.path = intern(directory.entry_path(name)) - if directory.tpath == '.': - self.tpath = intern(name) - else: - self.tpath = intern(directory.entry_tpath(name)) - self.path_elements = directory.path_elements + [self] - - self.dir = directory - self.cwd = None # will hold the SConscript directory for target nodes - self.duplicate = directory.duplicate - - def str_for_display(self): - return '"' + self.__str__() + '"' - - def must_be_same(self, klass): - """ - This node, which already existed, is being looked up as the - specified klass. Raise an exception if it isn't. - """ - if isinstance(self, klass) or klass is Entry: - return - raise TypeError, "Tried to lookup %s '%s' as a %s." %\ - (self.__class__.__name__, self.path, klass.__name__) - - def get_dir(self): - return self.dir - - def get_suffix(self): - return self.suffix - - def rfile(self): - return self - - def __str__(self): - """A Node.FS.Base object's string representation is its path - name.""" - global Save_Strings - if Save_Strings: - return self._save_str() - return self._get_str() - - memoizer_counters.append(SCons.Memoize.CountValue('_save_str')) - - def _save_str(self): - try: - return self._memo['_save_str'] - except KeyError: - pass - result = intern(self._get_str()) - self._memo['_save_str'] = result - return result - - def _get_str(self): - global Save_Strings - if self.duplicate or self.is_derived(): - return self.get_path() - srcnode = self.srcnode() - if srcnode.stat() is None and self.stat() is not None: - result = self.get_path() - else: - result = srcnode.get_path() - if not Save_Strings: - # We're not at the point where we're saving the string string - # representations of FS Nodes (because we haven't finished - # reading the SConscript files and need to have str() return - # things relative to them). That also means we can't yet - # cache values returned (or not returned) by stat(), since - # Python code in the SConscript files might still create - # or otherwise affect the on-disk file. So get rid of the - # values that the underlying stat() method saved. - try: del self._memo['stat'] - except KeyError: pass - if self is not srcnode: - try: del srcnode._memo['stat'] - except KeyError: pass - return result - - rstr = __str__ - - memoizer_counters.append(SCons.Memoize.CountValue('stat')) - - def stat(self): - try: return self._memo['stat'] - except KeyError: pass - try: result = self.fs.stat(self.abspath) - except os.error: result = None - self._memo['stat'] = result - return result - - def exists(self): - return self.stat() is not None - - def rexists(self): - return self.rfile().exists() - - def getmtime(self): - st = self.stat() - if st: return st[stat.ST_MTIME] - else: return None - - def getsize(self): - st = self.stat() - if st: return st[stat.ST_SIZE] - else: return None - - def isdir(self): - st = self.stat() - return st is not None and stat.S_ISDIR(st[stat.ST_MODE]) - - def isfile(self): - st = self.stat() - return st is not None and stat.S_ISREG(st[stat.ST_MODE]) - - if hasattr(os, 'symlink'): - def islink(self): - try: st = self.fs.lstat(self.abspath) - except os.error: return 0 - return stat.S_ISLNK(st[stat.ST_MODE]) - else: - def islink(self): - return 0 # no symlinks - - def is_under(self, dir): - if self is dir: - return 1 - else: - return self.dir.is_under(dir) - - def set_local(self): - self._local = 1 - - def srcnode(self): - """If this node is in a build path, return the node - corresponding to its source file. Otherwise, return - ourself. - """ - srcdir_list = self.dir.srcdir_list() - if srcdir_list: - srcnode = srcdir_list[0].Entry(self.name) - srcnode.must_be_same(self.__class__) - return srcnode - return self - - def get_path(self, dir=None): - """Return path relative to the current working directory of the - Node.FS.Base object that owns us.""" - if not dir: - dir = self.fs.getcwd() - if self == dir: - return '.' - path_elems = self.path_elements - try: i = path_elems.index(dir) - except ValueError: pass - else: path_elems = path_elems[i+1:] - path_elems = map(lambda n: n.name, path_elems) - return string.join(path_elems, os.sep) - - def set_src_builder(self, builder): - """Set the source code builder for this node.""" - self.sbuilder = builder - if not self.has_builder(): - self.builder_set(builder) - - def src_builder(self): - """Fetch the source code builder for this node. - - If there isn't one, we cache the source code builder specified - for the directory (which in turn will cache the value from its - parent directory, and so on up to the file system root). - """ - try: - scb = self.sbuilder - except AttributeError: - scb = self.dir.src_builder() - self.sbuilder = scb - return scb - - def get_abspath(self): - """Get the absolute path of the file.""" - return self.abspath - - def for_signature(self): - # Return just our name. Even an absolute path would not work, - # because that can change thanks to symlinks or remapped network - # paths. - return self.name - - def get_subst_proxy(self): - try: - return self._proxy - except AttributeError: - ret = EntryProxy(self) - self._proxy = ret - return ret - - def target_from_source(self, prefix, suffix, splitext=SCons.Util.splitext): - """ - - Generates a target entry that corresponds to this entry (usually - a source file) with the specified prefix and suffix. - - Note that this method can be overridden dynamically for generated - files that need different behavior. See Tool/swig.py for - an example. - """ - return self.dir.Entry(prefix + splitext(self.name)[0] + suffix) - - def _Rfindalldirs_key(self, pathlist): - return pathlist - - memoizer_counters.append(SCons.Memoize.CountDict('Rfindalldirs', _Rfindalldirs_key)) - - def Rfindalldirs(self, pathlist): - """ - Return all of the directories for a given path list, including - corresponding "backing" directories in any repositories. - - The Node lookups are relative to this Node (typically a - directory), so memoizing result saves cycles from looking - up the same path for each target in a given directory. - """ - try: - memo_dict = self._memo['Rfindalldirs'] - except KeyError: - memo_dict = {} - self._memo['Rfindalldirs'] = memo_dict - else: - try: - return memo_dict[pathlist] - except KeyError: - pass - - create_dir_relative_to_self = self.Dir - result = [] - for path in pathlist: - if isinstance(path, SCons.Node.Node): - result.append(path) - else: - dir = create_dir_relative_to_self(path) - result.extend(dir.get_all_rdirs()) - - memo_dict[pathlist] = result - - return result - - def RDirs(self, pathlist): - """Search for a list of directories in the Repository list.""" - cwd = self.cwd or self.fs._cwd - return cwd.Rfindalldirs(pathlist) - - memoizer_counters.append(SCons.Memoize.CountValue('rentry')) - - def rentry(self): - try: - return self._memo['rentry'] - except KeyError: - pass - result = self - if not self.exists(): - norm_name = _my_normcase(self.name) - for dir in self.dir.get_all_rdirs(): - try: - node = dir.entries[norm_name] - except KeyError: - if dir.entry_exists_on_disk(self.name): - result = dir.Entry(self.name) - break - self._memo['rentry'] = result - return result - - def _glob1(self, pattern, ondisk=True, source=False, strings=False): - return [] - -class Entry(Base): - """This is the class for generic Node.FS entries--that is, things - that could be a File or a Dir, but we're just not sure yet. - Consequently, the methods in this class really exist just to - transform their associated object into the right class when the - time comes, and then call the same-named method in the transformed - class.""" - - def diskcheck_match(self): - pass - - def disambiguate(self, must_exist=None): - """ - """ - if self.isdir(): - self.__class__ = Dir - self._morph() - elif self.isfile(): - self.__class__ = File - self._morph() - self.clear() - else: - # There was nothing on-disk at this location, so look in - # the src directory. - # - # We can't just use self.srcnode() straight away because - # that would create an actual Node for this file in the src - # directory, and there might not be one. Instead, use the - # dir_on_disk() method to see if there's something on-disk - # with that name, in which case we can go ahead and call - # self.srcnode() to create the right type of entry. - srcdir = self.dir.srcnode() - if srcdir != self.dir and \ - srcdir.entry_exists_on_disk(self.name) and \ - self.srcnode().isdir(): - self.__class__ = Dir - self._morph() - elif must_exist: - msg = "No such file or directory: '%s'" % self.abspath - raise SCons.Errors.UserError, msg - else: - self.__class__ = File - self._morph() - self.clear() - return self - - def rfile(self): - """We're a generic Entry, but the caller is actually looking for - a File at this point, so morph into one.""" - self.__class__ = File - self._morph() - self.clear() - return File.rfile(self) - - def scanner_key(self): - return self.get_suffix() - - def get_contents(self): - """Fetch the contents of the entry. Returns the exact binary - contents of the file.""" - try: - self = self.disambiguate(must_exist=1) - except SCons.Errors.UserError: - # There was nothing on disk with which to disambiguate - # this entry. Leave it as an Entry, but return a null - # string so calls to get_contents() in emitters and the - # like (e.g. in qt.py) don't have to disambiguate by hand - # or catch the exception. - return '' - else: - return self.get_contents() - - def get_text_contents(self): - """Fetch the decoded text contents of a Unicode encoded Entry. - - Since this should return the text contents from the file - system, we check to see into what sort of subclass we should - morph this Entry.""" - try: - self = self.disambiguate(must_exist=1) - except SCons.Errors.UserError: - # There was nothing on disk with which to disambiguate - # this entry. Leave it as an Entry, but return a null - # string so calls to get_text_contents() in emitters and - # the like (e.g. in qt.py) don't have to disambiguate by - # hand or catch the exception. - return '' - else: - return self.get_text_contents() - - def must_be_same(self, klass): - """Called to make sure a Node is a Dir. Since we're an - Entry, we can morph into one.""" - if self.__class__ is not klass: - self.__class__ = klass - self._morph() - self.clear() - - # The following methods can get called before the Taskmaster has - # had a chance to call disambiguate() directly to see if this Entry - # should really be a Dir or a File. We therefore use these to call - # disambiguate() transparently (from our caller's point of view). - # - # Right now, this minimal set of methods has been derived by just - # looking at some of the methods that will obviously be called early - # in any of the various Taskmasters' calling sequences, and then - # empirically figuring out which additional methods are necessary - # to make various tests pass. - - def exists(self): - """Return if the Entry exists. Check the file system to see - what we should turn into first. Assume a file if there's no - directory.""" - return self.disambiguate().exists() - - def rel_path(self, other): - d = self.disambiguate() - if d.__class__ is Entry: - raise "rel_path() could not disambiguate File/Dir" - return d.rel_path(other) - - def new_ninfo(self): - return self.disambiguate().new_ninfo() - - def changed_since_last_build(self, target, prev_ni): - return self.disambiguate().changed_since_last_build(target, prev_ni) - - def _glob1(self, pattern, ondisk=True, source=False, strings=False): - return self.disambiguate()._glob1(pattern, ondisk, source, strings) - - def get_subst_proxy(self): - return self.disambiguate().get_subst_proxy() - -# This is for later so we can differentiate between Entry the class and Entry -# the method of the FS class. -_classEntry = Entry - - -class LocalFS: - - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - # This class implements an abstraction layer for operations involving - # a local file system. Essentially, this wraps any function in - # the os, os.path or shutil modules that we use to actually go do - # anything with or to the local file system. - # - # Note that there's a very good chance we'll refactor this part of - # the architecture in some way as we really implement the interface(s) - # for remote file system Nodes. For example, the right architecture - # might be to have this be a subclass instead of a base class. - # Nevertheless, we're using this as a first step in that direction. - # - # We're not using chdir() yet because the calling subclass method - # needs to use os.chdir() directly to avoid recursion. Will we - # really need this one? - #def chdir(self, path): - # return os.chdir(path) - def chmod(self, path, mode): - return os.chmod(path, mode) - def copy(self, src, dst): - return shutil.copy(src, dst) - def copy2(self, src, dst): - return shutil.copy2(src, dst) - def exists(self, path): - return os.path.exists(path) - def getmtime(self, path): - return os.path.getmtime(path) - def getsize(self, path): - return os.path.getsize(path) - def isdir(self, path): - return os.path.isdir(path) - def isfile(self, path): - return os.path.isfile(path) - def link(self, src, dst): - return os.link(src, dst) - def lstat(self, path): - return os.lstat(path) - def listdir(self, path): - return os.listdir(path) - def makedirs(self, path): - return os.makedirs(path) - def mkdir(self, path): - return os.mkdir(path) - def rename(self, old, new): - return os.rename(old, new) - def stat(self, path): - return os.stat(path) - def symlink(self, src, dst): - return os.symlink(src, dst) - def open(self, path): - return open(path) - def unlink(self, path): - return os.unlink(path) - - if hasattr(os, 'symlink'): - def islink(self, path): - return os.path.islink(path) - else: - def islink(self, path): - return 0 # no symlinks - - if hasattr(os, 'readlink'): - def readlink(self, file): - return os.readlink(file) - else: - def readlink(self, file): - return '' - - -#class RemoteFS: -# # Skeleton for the obvious methods we might need from the -# # abstraction layer for a remote filesystem. -# def upload(self, local_src, remote_dst): -# pass -# def download(self, remote_src, local_dst): -# pass - - -class FS(LocalFS): - - memoizer_counters = [] - - def __init__(self, path = None): - """Initialize the Node.FS subsystem. - - The supplied path is the top of the source tree, where we - expect to find the top-level build file. If no path is - supplied, the current directory is the default. - - The path argument must be a valid absolute path. - """ - if __debug__: logInstanceCreation(self, 'Node.FS') - - self._memo = {} - - self.Root = {} - self.SConstruct_dir = None - self.max_drift = default_max_drift - - self.Top = None - if path is None: - self.pathTop = os.getcwd() - else: - self.pathTop = path - self.defaultDrive = _my_normcase(os.path.splitdrive(self.pathTop)[0]) - - self.Top = self.Dir(self.pathTop) - self.Top.path = '.' - self.Top.tpath = '.' - self._cwd = self.Top - - DirNodeInfo.fs = self - FileNodeInfo.fs = self - - def set_SConstruct_dir(self, dir): - self.SConstruct_dir = dir - - def get_max_drift(self): - return self.max_drift - - def set_max_drift(self, max_drift): - self.max_drift = max_drift - - def getcwd(self): - return self._cwd - - def chdir(self, dir, change_os_dir=0): - """Change the current working directory for lookups. - If change_os_dir is true, we will also change the "real" cwd - to match. - """ - curr=self._cwd - try: - if dir is not None: - self._cwd = dir - if change_os_dir: - os.chdir(dir.abspath) - except OSError: - self._cwd = curr - raise - - def get_root(self, drive): - """ - Returns the root directory for the specified drive, creating - it if necessary. - """ - drive = _my_normcase(drive) - try: - return self.Root[drive] - except KeyError: - root = RootDir(drive, self) - self.Root[drive] = root - if not drive: - self.Root[self.defaultDrive] = root - elif drive == self.defaultDrive: - self.Root[''] = root - return root - - def _lookup(self, p, directory, fsclass, create=1): - """ - The generic entry point for Node lookup with user-supplied data. - - This translates arbitrary input into a canonical Node.FS object - of the specified fsclass. The general approach for strings is - to turn it into a fully normalized absolute path and then call - the root directory's lookup_abs() method for the heavy lifting. - - If the path name begins with '#', it is unconditionally - interpreted relative to the top-level directory of this FS. '#' - is treated as a synonym for the top-level SConstruct directory, - much like '~' is treated as a synonym for the user's home - directory in a UNIX shell. So both '#foo' and '#/foo' refer - to the 'foo' subdirectory underneath the top-level SConstruct - directory. - - If the path name is relative, then the path is looked up relative - to the specified directory, or the current directory (self._cwd, - typically the SConscript directory) if the specified directory - is None. - """ - if isinstance(p, Base): - # It's already a Node.FS object. Make sure it's the right - # class and return. - p.must_be_same(fsclass) - return p - # str(p) in case it's something like a proxy object - p = str(p) - - initial_hash = (p[0:1] == '#') - if initial_hash: - # There was an initial '#', so we strip it and override - # whatever directory they may have specified with the - # top-level SConstruct directory. - p = p[1:] - directory = self.Top - - if directory and not isinstance(directory, Dir): - directory = self.Dir(directory) - - if do_splitdrive: - drive, p = os.path.splitdrive(p) - else: - drive = '' - if drive and not p: - # This causes a naked drive letter to be treated as a synonym - # for the root directory on that drive. - p = os.sep - absolute = os.path.isabs(p) - - needs_normpath = needs_normpath_check.match(p) - - if initial_hash or not absolute: - # This is a relative lookup, either to the top-level - # SConstruct directory (because of the initial '#') or to - # the current directory (the path name is not absolute). - # Add the string to the appropriate directory lookup path, - # after which the whole thing gets normalized. - if not directory: - directory = self._cwd - if p: - p = directory.labspath + '/' + p - else: - p = directory.labspath - - if needs_normpath: - p = os.path.normpath(p) - - if drive or absolute: - root = self.get_root(drive) - else: - if not directory: - directory = self._cwd - root = directory.root - - if os.sep != '/': - p = string.replace(p, os.sep, '/') - return root._lookup_abs(p, fsclass, create) - - def Entry(self, name, directory = None, create = 1): - """Look up or create a generic Entry node with the specified name. - If the name is a relative path (begins with ./, ../, or a file - name), then it is looked up relative to the supplied directory - node, or to the top level directory of the FS (supplied at - construction time) if no directory is supplied. - """ - return self._lookup(name, directory, Entry, create) - - def File(self, name, directory = None, create = 1): - """Look up or create a File node with the specified name. If - the name is a relative path (begins with ./, ../, or a file name), - then it is looked up relative to the supplied directory node, - or to the top level directory of the FS (supplied at construction - time) if no directory is supplied. - - This method will raise TypeError if a directory is found at the - specified path. - """ - return self._lookup(name, directory, File, create) - - def Dir(self, name, directory = None, create = True): - """Look up or create a Dir node with the specified name. If - the name is a relative path (begins with ./, ../, or a file name), - then it is looked up relative to the supplied directory node, - or to the top level directory of the FS (supplied at construction - time) if no directory is supplied. - - This method will raise TypeError if a normal file is found at the - specified path. - """ - return self._lookup(name, directory, Dir, create) - - def VariantDir(self, variant_dir, src_dir, duplicate=1): - """Link the supplied variant directory to the source directory - for purposes of building files.""" - - if not isinstance(src_dir, SCons.Node.Node): - src_dir = self.Dir(src_dir) - if not isinstance(variant_dir, SCons.Node.Node): - variant_dir = self.Dir(variant_dir) - if src_dir.is_under(variant_dir): - raise SCons.Errors.UserError, "Source directory cannot be under variant directory." - if variant_dir.srcdir: - if variant_dir.srcdir == src_dir: - return # We already did this. - raise SCons.Errors.UserError, "'%s' already has a source directory: '%s'."%(variant_dir, variant_dir.srcdir) - variant_dir.link(src_dir, duplicate) - - def Repository(self, *dirs): - """Specify Repository directories to search.""" - for d in dirs: - if not isinstance(d, SCons.Node.Node): - d = self.Dir(d) - self.Top.addRepository(d) - - def variant_dir_target_climb(self, orig, dir, tail): - """Create targets in corresponding variant directories - - Climb the directory tree, and look up path names - relative to any linked variant directories we find. - - Even though this loops and walks up the tree, we don't memoize - the return value because this is really only used to process - the command-line targets. - """ - targets = [] - message = None - fmt = "building associated VariantDir targets: %s" - start_dir = dir - while dir: - for bd in dir.variant_dirs: - if start_dir.is_under(bd): - # If already in the build-dir location, don't reflect - return [orig], fmt % str(orig) - p = apply(os.path.join, [bd.path] + tail) - targets.append(self.Entry(p)) - tail = [dir.name] + tail - dir = dir.up() - if targets: - message = fmt % string.join(map(str, targets)) - return targets, message - - def Glob(self, pathname, ondisk=True, source=True, strings=False, cwd=None): - """ - Globs - - This is mainly a shim layer - """ - if cwd is None: - cwd = self.getcwd() - return cwd.glob(pathname, ondisk, source, strings) - -class DirNodeInfo(SCons.Node.NodeInfoBase): - # This should get reset by the FS initialization. - current_version_id = 1 - - fs = None - - def str_to_node(self, s): - top = self.fs.Top - root = top.root - if do_splitdrive: - drive, s = os.path.splitdrive(s) - if drive: - root = self.fs.get_root(drive) - if not os.path.isabs(s): - s = top.labspath + '/' + s - return root._lookup_abs(s, Entry) - -class DirBuildInfo(SCons.Node.BuildInfoBase): - current_version_id = 1 - -glob_magic_check = re.compile('[*?[]') - -def has_glob_magic(s): - return glob_magic_check.search(s) is not None - -class Dir(Base): - """A class for directories in a file system. - """ - - memoizer_counters = [] - - NodeInfo = DirNodeInfo - BuildInfo = DirBuildInfo - - def __init__(self, name, directory, fs): - if __debug__: logInstanceCreation(self, 'Node.FS.Dir') - Base.__init__(self, name, directory, fs) - self._morph() - - def _morph(self): - """Turn a file system Node (either a freshly initialized directory - object or a separate Entry object) into a proper directory object. - - Set up this directory's entries and hook it into the file - system tree. Specify that directories (this Node) don't use - signatures for calculating whether they're current. - """ - - self.repositories = [] - self.srcdir = None - - self.entries = {} - self.entries['.'] = self - self.entries['..'] = self.dir - self.cwd = self - self.searched = 0 - self._sconsign = None - self.variant_dirs = [] - self.root = self.dir.root - - # Don't just reset the executor, replace its action list, - # because it might have some pre-or post-actions that need to - # be preserved. - self.builder = get_MkdirBuilder() - self.get_executor().set_action_list(self.builder.action) - - def diskcheck_match(self): - diskcheck_match(self, self.isfile, - "File %s found where directory expected.") - - def __clearRepositoryCache(self, duplicate=None): - """Called when we change the repository(ies) for a directory. - This clears any cached information that is invalidated by changing - the repository.""" - - for node in self.entries.values(): - if node != self.dir: - if node != self and isinstance(node, Dir): - node.__clearRepositoryCache(duplicate) - else: - node.clear() - try: - del node._srcreps - except AttributeError: - pass - if duplicate is not None: - node.duplicate=duplicate - - def __resetDuplicate(self, node): - if node != self: - node.duplicate = node.get_dir().duplicate - - def Entry(self, name): - """ - Looks up or creates an entry node named 'name' relative to - this directory. - """ - return self.fs.Entry(name, self) - - def Dir(self, name, create=True): - """ - Looks up or creates a directory node named 'name' relative to - this directory. - """ - return self.fs.Dir(name, self, create) - - def File(self, name): - """ - Looks up or creates a file node named 'name' relative to - this directory. - """ - return self.fs.File(name, self) - - def _lookup_rel(self, name, klass, create=1): - """ - Looks up a *normalized* relative path name, relative to this - directory. - - This method is intended for use by internal lookups with - already-normalized path data. For general-purpose lookups, - use the Entry(), Dir() and File() methods above. - - This method does *no* input checking and will die or give - incorrect results if it's passed a non-normalized path name (e.g., - a path containing '..'), an absolute path name, a top-relative - ('#foo') path name, or any kind of object. - """ - name = self.entry_labspath(name) - return self.root._lookup_abs(name, klass, create) - - def link(self, srcdir, duplicate): - """Set this directory as the variant directory for the - supplied source directory.""" - self.srcdir = srcdir - self.duplicate = duplicate - self.__clearRepositoryCache(duplicate) - srcdir.variant_dirs.append(self) - - def getRepositories(self): - """Returns a list of repositories for this directory. - """ - if self.srcdir and not self.duplicate: - return self.srcdir.get_all_rdirs() + self.repositories - return self.repositories - - memoizer_counters.append(SCons.Memoize.CountValue('get_all_rdirs')) - - def get_all_rdirs(self): - try: - return list(self._memo['get_all_rdirs']) - except KeyError: - pass - - result = [self] - fname = '.' - dir = self - while dir: - for rep in dir.getRepositories(): - result.append(rep.Dir(fname)) - if fname == '.': - fname = dir.name - else: - fname = dir.name + os.sep + fname - dir = dir.up() - - self._memo['get_all_rdirs'] = list(result) - - return result - - def addRepository(self, dir): - if dir != self and not dir in self.repositories: - self.repositories.append(dir) - dir.tpath = '.' - self.__clearRepositoryCache() - - def up(self): - return self.entries['..'] - - def _rel_path_key(self, other): - return str(other) - - memoizer_counters.append(SCons.Memoize.CountDict('rel_path', _rel_path_key)) - - def rel_path(self, other): - """Return a path to "other" relative to this directory. - """ - - # This complicated and expensive method, which constructs relative - # paths between arbitrary Node.FS objects, is no longer used - # by SCons itself. It was introduced to store dependency paths - # in .sconsign files relative to the target, but that ended up - # being significantly inefficient. - # - # We're continuing to support the method because some SConstruct - # files out there started using it when it was available, and - # we're all about backwards compatibility.. - - try: - memo_dict = self._memo['rel_path'] - except KeyError: - memo_dict = {} - self._memo['rel_path'] = memo_dict - else: - try: - return memo_dict[other] - except KeyError: - pass - - if self is other: - result = '.' - - elif not other in self.path_elements: - try: - other_dir = other.get_dir() - except AttributeError: - result = str(other) - else: - if other_dir is None: - result = other.name - else: - dir_rel_path = self.rel_path(other_dir) - if dir_rel_path == '.': - result = other.name - else: - result = dir_rel_path + os.sep + other.name - else: - i = self.path_elements.index(other) + 1 - - path_elems = ['..'] * (len(self.path_elements) - i) \ - + map(lambda n: n.name, other.path_elements[i:]) - - result = string.join(path_elems, os.sep) - - memo_dict[other] = result - - return result - - def get_env_scanner(self, env, kw={}): - import SCons.Defaults - return SCons.Defaults.DirEntryScanner - - def get_target_scanner(self): - import SCons.Defaults - return SCons.Defaults.DirEntryScanner - - def get_found_includes(self, env, scanner, path): - """Return this directory's implicit dependencies. - - We don't bother caching the results because the scan typically - shouldn't be requested more than once (as opposed to scanning - .h file contents, which can be requested as many times as the - files is #included by other files). - """ - if not scanner: - return [] - # Clear cached info for this Dir. If we already visited this - # directory on our walk down the tree (because we didn't know at - # that point it was being used as the source for another Node) - # then we may have calculated build signature before realizing - # we had to scan the disk. Now that we have to, though, we need - # to invalidate the old calculated signature so that any node - # dependent on our directory structure gets one that includes - # info about everything on disk. - self.clear() - return scanner(self, env, path) - - # - # Taskmaster interface subsystem - # - - def prepare(self): - pass - - def build(self, **kw): - """A null "builder" for directories.""" - global MkdirBuilder - if self.builder is not MkdirBuilder: - apply(SCons.Node.Node.build, [self,], kw) - - # - # - # - - def _create(self): - """Create this directory, silently and without worrying about - whether the builder is the default or not.""" - listDirs = [] - parent = self - while parent: - if parent.exists(): - break - listDirs.append(parent) - p = parent.up() - if p is None: - # Don't use while: - else: for this condition because - # if so, then parent is None and has no .path attribute. - raise SCons.Errors.StopError, parent.path - parent = p - listDirs.reverse() - for dirnode in listDirs: - try: - # Don't call dirnode.build(), call the base Node method - # directly because we definitely *must* create this - # directory. The dirnode.build() method will suppress - # the build if it's the default builder. - SCons.Node.Node.build(dirnode) - dirnode.get_executor().nullify() - # The build() action may or may not have actually - # created the directory, depending on whether the -n - # option was used or not. Delete the _exists and - # _rexists attributes so they can be reevaluated. - dirnode.clear() - except OSError: - pass - - def multiple_side_effect_has_builder(self): - global MkdirBuilder - return self.builder is not MkdirBuilder and self.has_builder() - - def alter_targets(self): - """Return any corresponding targets in a variant directory. - """ - return self.fs.variant_dir_target_climb(self, self, []) - - def scanner_key(self): - """A directory does not get scanned.""" - return None - - def get_text_contents(self): - """We already emit things in text, so just return the binary - version.""" - return self.get_contents() - - def get_contents(self): - """Return content signatures and names of all our children - separated by new-lines. Ensure that the nodes are sorted.""" - contents = [] - name_cmp = lambda a, b: cmp(a.name, b.name) - sorted_children = self.children()[:] - sorted_children.sort(name_cmp) - for node in sorted_children: - contents.append('%s %s\n' % (node.get_csig(), node.name)) - return string.join(contents, '') - - def get_csig(self): - """Compute the content signature for Directory nodes. In - general, this is not needed and the content signature is not - stored in the DirNodeInfo. However, if get_contents on a Dir - node is called which has a child directory, the child - directory should return the hash of its contents.""" - contents = self.get_contents() - return SCons.Util.MD5signature(contents) - - def do_duplicate(self, src): - pass - - changed_since_last_build = SCons.Node.Node.state_has_changed - - def is_up_to_date(self): - """If any child is not up-to-date, then this directory isn't, - either.""" - if self.builder is not MkdirBuilder and not self.exists(): - return 0 - up_to_date = SCons.Node.up_to_date - for kid in self.children(): - if kid.get_state() > up_to_date: - return 0 - return 1 - - def rdir(self): - if not self.exists(): - norm_name = _my_normcase(self.name) - for dir in self.dir.get_all_rdirs(): - try: node = dir.entries[norm_name] - except KeyError: node = dir.dir_on_disk(self.name) - if node and node.exists() and \ - (isinstance(dir, Dir) or isinstance(dir, Entry)): - return node - return self - - def sconsign(self): - """Return the .sconsign file info for this directory, - creating it first if necessary.""" - if not self._sconsign: - import SCons.SConsign - self._sconsign = SCons.SConsign.ForDirectory(self) - return self._sconsign - - def srcnode(self): - """Dir has a special need for srcnode()...if we - have a srcdir attribute set, then that *is* our srcnode.""" - if self.srcdir: - return self.srcdir - return Base.srcnode(self) - - def get_timestamp(self): - """Return the latest timestamp from among our children""" - stamp = 0 - for kid in self.children(): - if kid.get_timestamp() > stamp: - stamp = kid.get_timestamp() - return stamp - - def entry_abspath(self, name): - return self.abspath + os.sep + name - - def entry_labspath(self, name): - return self.labspath + '/' + name - - def entry_path(self, name): - return self.path + os.sep + name - - def entry_tpath(self, name): - return self.tpath + os.sep + name - - def entry_exists_on_disk(self, name): - try: - d = self.on_disk_entries - except AttributeError: - d = {} - try: - entries = os.listdir(self.abspath) - except OSError: - pass - else: - for entry in map(_my_normcase, entries): - d[entry] = True - self.on_disk_entries = d - if sys.platform == 'win32': - name = _my_normcase(name) - result = d.get(name) - if result is None: - # Belt-and-suspenders for Windows: check directly for - # 8.3 file names that don't show up in os.listdir(). - result = os.path.exists(self.abspath + os.sep + name) - d[name] = result - return result - else: - return d.has_key(name) - - memoizer_counters.append(SCons.Memoize.CountValue('srcdir_list')) - - def srcdir_list(self): - try: - return self._memo['srcdir_list'] - except KeyError: - pass - - result = [] - - dirname = '.' - dir = self - while dir: - if dir.srcdir: - result.append(dir.srcdir.Dir(dirname)) - dirname = dir.name + os.sep + dirname - dir = dir.up() - - self._memo['srcdir_list'] = result - - return result - - def srcdir_duplicate(self, name): - for dir in self.srcdir_list(): - if self.is_under(dir): - # We shouldn't source from something in the build path; - # variant_dir is probably under src_dir, in which case - # we are reflecting. - break - if dir.entry_exists_on_disk(name): - srcnode = dir.Entry(name).disambiguate() - if self.duplicate: - node = self.Entry(name).disambiguate() - node.do_duplicate(srcnode) - return node - else: - return srcnode - return None - - def _srcdir_find_file_key(self, filename): - return filename - - memoizer_counters.append(SCons.Memoize.CountDict('srcdir_find_file', _srcdir_find_file_key)) - - def srcdir_find_file(self, filename): - try: - memo_dict = self._memo['srcdir_find_file'] - except KeyError: - memo_dict = {} - self._memo['srcdir_find_file'] = memo_dict - else: - try: - return memo_dict[filename] - except KeyError: - pass - - def func(node): - if (isinstance(node, File) or isinstance(node, Entry)) and \ - (node.is_derived() or node.exists()): - return node - return None - - norm_name = _my_normcase(filename) - - for rdir in self.get_all_rdirs(): - try: node = rdir.entries[norm_name] - except KeyError: node = rdir.file_on_disk(filename) - else: node = func(node) - if node: - result = (node, self) - memo_dict[filename] = result - return result - - for srcdir in self.srcdir_list(): - for rdir in srcdir.get_all_rdirs(): - try: node = rdir.entries[norm_name] - except KeyError: node = rdir.file_on_disk(filename) - else: node = func(node) - if node: - result = (File(filename, self, self.fs), srcdir) - memo_dict[filename] = result - return result - - result = (None, None) - memo_dict[filename] = result - return result - - def dir_on_disk(self, name): - if self.entry_exists_on_disk(name): - try: return self.Dir(name) - except TypeError: pass - node = self.srcdir_duplicate(name) - if isinstance(node, File): - return None - return node - - def file_on_disk(self, name): - if self.entry_exists_on_disk(name) or \ - diskcheck_rcs(self, name) or \ - diskcheck_sccs(self, name): - try: return self.File(name) - except TypeError: pass - node = self.srcdir_duplicate(name) - if isinstance(node, Dir): - return None - return node - - def walk(self, func, arg): - """ - Walk this directory tree by calling the specified function - for each directory in the tree. - - This behaves like the os.path.walk() function, but for in-memory - Node.FS.Dir objects. The function takes the same arguments as - the functions passed to os.path.walk(): - - func(arg, dirname, fnames) - - Except that "dirname" will actually be the directory *Node*, - not the string. The '.' and '..' entries are excluded from - fnames. The fnames list may be modified in-place to filter the - subdirectories visited or otherwise impose a specific order. - The "arg" argument is always passed to func() and may be used - in any way (or ignored, passing None is common). - """ - entries = self.entries - names = entries.keys() - names.remove('.') - names.remove('..') - func(arg, self, names) - select_dirs = lambda n, e=entries: isinstance(e[n], Dir) - for dirname in filter(select_dirs, names): - entries[dirname].walk(func, arg) - - def glob(self, pathname, ondisk=True, source=False, strings=False): - """ - Returns a list of Nodes (or strings) matching a specified - pathname pattern. - - Pathname patterns follow UNIX shell semantics: * matches - any-length strings of any characters, ? matches any character, - and [] can enclose lists or ranges of characters. Matches do - not span directory separators. - - The matches take into account Repositories, returning local - Nodes if a corresponding entry exists in a Repository (either - an in-memory Node or something on disk). - - By defafult, the glob() function matches entries that exist - on-disk, in addition to in-memory Nodes. Setting the "ondisk" - argument to False (or some other non-true value) causes the glob() - function to only match in-memory Nodes. The default behavior is - to return both the on-disk and in-memory Nodes. - - The "source" argument, when true, specifies that corresponding - source Nodes must be returned if you're globbing in a build - directory (initialized with VariantDir()). The default behavior - is to return Nodes local to the VariantDir(). - - The "strings" argument, when true, returns the matches as strings, - not Nodes. The strings are path names relative to this directory. - - The underlying algorithm is adapted from the glob.glob() function - in the Python library (but heavily modified), and uses fnmatch() - under the covers. - """ - dirname, basename = os.path.split(pathname) - if not dirname: - return self._glob1(basename, ondisk, source, strings) - if has_glob_magic(dirname): - list = self.glob(dirname, ondisk, source, strings=False) - else: - list = [self.Dir(dirname, create=True)] - result = [] - for dir in list: - r = dir._glob1(basename, ondisk, source, strings) - if strings: - r = map(lambda x, d=str(dir): os.path.join(d, x), r) - result.extend(r) - result.sort(lambda a, b: cmp(str(a), str(b))) - return result - - def _glob1(self, pattern, ondisk=True, source=False, strings=False): - """ - Globs for and returns a list of entry names matching a single - pattern in this directory. - - This searches any repositories and source directories for - corresponding entries and returns a Node (or string) relative - to the current directory if an entry is found anywhere. - - TODO: handle pattern with no wildcard - """ - search_dir_list = self.get_all_rdirs() - for srcdir in self.srcdir_list(): - search_dir_list.extend(srcdir.get_all_rdirs()) - - selfEntry = self.Entry - names = [] - for dir in search_dir_list: - # We use the .name attribute from the Node because the keys of - # the dir.entries dictionary are normalized (that is, all upper - # case) on case-insensitive systems like Windows. - #node_names = [ v.name for k, v in dir.entries.items() if k not in ('.', '..') ] - entry_names = filter(lambda n: n not in ('.', '..'), dir.entries.keys()) - node_names = map(lambda n, e=dir.entries: e[n].name, entry_names) - names.extend(node_names) - if not strings: - # Make sure the working directory (self) actually has - # entries for all Nodes in repositories or variant dirs. - for name in node_names: selfEntry(name) - if ondisk: - try: - disk_names = os.listdir(dir.abspath) - except os.error: - continue - names.extend(disk_names) - if not strings: - # We're going to return corresponding Nodes in - # the local directory, so we need to make sure - # those Nodes exist. We only want to create - # Nodes for the entries that will match the - # specified pattern, though, which means we - # need to filter the list here, even though - # the overall list will also be filtered later, - # after we exit this loop. - if pattern[0] != '.': - #disk_names = [ d for d in disk_names if d[0] != '.' ] - disk_names = filter(lambda x: x[0] != '.', disk_names) - disk_names = fnmatch.filter(disk_names, pattern) - dirEntry = dir.Entry - for name in disk_names: - # Add './' before disk filename so that '#' at - # beginning of filename isn't interpreted. - name = './' + name - node = dirEntry(name).disambiguate() - n = selfEntry(name) - if n.__class__ != node.__class__: - n.__class__ = node.__class__ - n._morph() - - names = set(names) - if pattern[0] != '.': - #names = [ n for n in names if n[0] != '.' ] - names = filter(lambda x: x[0] != '.', names) - names = fnmatch.filter(names, pattern) - - if strings: - return names - - #return [ self.entries[_my_normcase(n)] for n in names ] - return map(lambda n, e=self.entries: e[_my_normcase(n)], names) - -class RootDir(Dir): - """A class for the root directory of a file system. - - This is the same as a Dir class, except that the path separator - ('/' or '\\') is actually part of the name, so we don't need to - add a separator when creating the path names of entries within - this directory. - """ - def __init__(self, name, fs): - if __debug__: logInstanceCreation(self, 'Node.FS.RootDir') - # We're going to be our own parent directory (".." entry and .dir - # attribute) so we have to set up some values so Base.__init__() - # won't gag won't it calls some of our methods. - self.abspath = '' - self.labspath = '' - self.path = '' - self.tpath = '' - self.path_elements = [] - self.duplicate = 0 - self.root = self - Base.__init__(self, name, self, fs) - - # Now set our paths to what we really want them to be: the - # initial drive letter (the name) plus the directory separator, - # except for the "lookup abspath," which does not have the - # drive letter. - self.abspath = name + os.sep - self.labspath = '' - self.path = name + os.sep - self.tpath = name + os.sep - self._morph() - - self._lookupDict = {} - - # The // and os.sep + os.sep entries are necessary because - # os.path.normpath() seems to preserve double slashes at the - # beginning of a path (presumably for UNC path names), but - # collapses triple slashes to a single slash. - self._lookupDict[''] = self - self._lookupDict['/'] = self - self._lookupDict['//'] = self - self._lookupDict[os.sep] = self - self._lookupDict[os.sep + os.sep] = self - - def must_be_same(self, klass): - if klass is Dir: - return - Base.must_be_same(self, klass) - - def _lookup_abs(self, p, klass, create=1): - """ - Fast (?) lookup of a *normalized* absolute path. - - This method is intended for use by internal lookups with - already-normalized path data. For general-purpose lookups, - use the FS.Entry(), FS.Dir() or FS.File() methods. - - The caller is responsible for making sure we're passed a - normalized absolute path; we merely let Python's dictionary look - up and return the One True Node.FS object for the path. - - If no Node for the specified "p" doesn't already exist, and - "create" is specified, the Node may be created after recursive - invocation to find or create the parent directory or directories. - """ - k = _my_normcase(p) - try: - result = self._lookupDict[k] - except KeyError: - if not create: - raise SCons.Errors.UserError - # There is no Node for this path name, and we're allowed - # to create it. - dir_name, file_name = os.path.split(p) - dir_node = self._lookup_abs(dir_name, Dir) - result = klass(file_name, dir_node, self.fs) - - # Double-check on disk (as configured) that the Node we - # created matches whatever is out there in the real world. - result.diskcheck_match() - - self._lookupDict[k] = result - dir_node.entries[_my_normcase(file_name)] = result - dir_node.implicit = None - else: - # There is already a Node for this path name. Allow it to - # complain if we were looking for an inappropriate type. - result.must_be_same(klass) - return result - - def __str__(self): - return self.abspath - - def entry_abspath(self, name): - return self.abspath + name - - def entry_labspath(self, name): - return '/' + name - - def entry_path(self, name): - return self.path + name - - def entry_tpath(self, name): - return self.tpath + name - - def is_under(self, dir): - if self is dir: - return 1 - else: - return 0 - - def up(self): - return None - - def get_dir(self): - return None - - def src_builder(self): - return _null - -class FileNodeInfo(SCons.Node.NodeInfoBase): - current_version_id = 1 - - field_list = ['csig', 'timestamp', 'size'] - - # This should get reset by the FS initialization. - fs = None - - def str_to_node(self, s): - top = self.fs.Top - root = top.root - if do_splitdrive: - drive, s = os.path.splitdrive(s) - if drive: - root = self.fs.get_root(drive) - if not os.path.isabs(s): - s = top.labspath + '/' + s - return root._lookup_abs(s, Entry) - -class FileBuildInfo(SCons.Node.BuildInfoBase): - current_version_id = 1 - - def convert_to_sconsign(self): - """ - Converts this FileBuildInfo object for writing to a .sconsign file - - This replaces each Node in our various dependency lists with its - usual string representation: relative to the top-level SConstruct - directory, or an absolute path if it's outside. - """ - if os.sep == '/': - node_to_str = str - else: - def node_to_str(n): - try: - s = n.path - except AttributeError: - s = str(n) - else: - s = string.replace(s, os.sep, '/') - return s - for attr in ['bsources', 'bdepends', 'bimplicit']: - try: - val = getattr(self, attr) - except AttributeError: - pass - else: - setattr(self, attr, map(node_to_str, val)) - def convert_from_sconsign(self, dir, name): - """ - Converts a newly-read FileBuildInfo object for in-SCons use - - For normal up-to-date checking, we don't have any conversion to - perform--but we're leaving this method here to make that clear. - """ - pass - def prepare_dependencies(self): - """ - Prepares a FileBuildInfo object for explaining what changed - - The bsources, bdepends and bimplicit lists have all been - stored on disk as paths relative to the top-level SConstruct - directory. Convert the strings to actual Nodes (for use by the - --debug=explain code and --implicit-cache). - """ - attrs = [ - ('bsources', 'bsourcesigs'), - ('bdepends', 'bdependsigs'), - ('bimplicit', 'bimplicitsigs'), - ] - for (nattr, sattr) in attrs: - try: - strings = getattr(self, nattr) - nodeinfos = getattr(self, sattr) - except AttributeError: - continue - nodes = [] - for s, ni in izip(strings, nodeinfos): - if not isinstance(s, SCons.Node.Node): - s = ni.str_to_node(s) - nodes.append(s) - setattr(self, nattr, nodes) - def format(self, names=0): - result = [] - bkids = self.bsources + self.bdepends + self.bimplicit - bkidsigs = self.bsourcesigs + self.bdependsigs + self.bimplicitsigs - for bkid, bkidsig in izip(bkids, bkidsigs): - result.append(str(bkid) + ': ' + - string.join(bkidsig.format(names=names), ' ')) - result.append('%s [%s]' % (self.bactsig, self.bact)) - return string.join(result, '\n') - -class File(Base): - """A class for files in a file system. - """ - - memoizer_counters = [] - - NodeInfo = FileNodeInfo - BuildInfo = FileBuildInfo - - md5_chunksize = 64 - - def diskcheck_match(self): - diskcheck_match(self, self.isdir, - "Directory %s found where file expected.") - - def __init__(self, name, directory, fs): - if __debug__: logInstanceCreation(self, 'Node.FS.File') - Base.__init__(self, name, directory, fs) - self._morph() - - def Entry(self, name): - """Create an entry node named 'name' relative to - the directory of this file.""" - return self.dir.Entry(name) - - def Dir(self, name, create=True): - """Create a directory node named 'name' relative to - the directory of this file.""" - return self.dir.Dir(name, create=create) - - def Dirs(self, pathlist): - """Create a list of directories relative to the SConscript - directory of this file.""" - # TODO(1.5) - # return [self.Dir(p) for p in pathlist] - return map(lambda p, s=self: s.Dir(p), pathlist) - - def File(self, name): - """Create a file node named 'name' relative to - the directory of this file.""" - return self.dir.File(name) - - #def generate_build_dict(self): - # """Return an appropriate dictionary of values for building - # this File.""" - # return {'Dir' : self.Dir, - # 'File' : self.File, - # 'RDirs' : self.RDirs} - - def _morph(self): - """Turn a file system node into a File object.""" - self.scanner_paths = {} - if not hasattr(self, '_local'): - self._local = 0 - - # If there was already a Builder set on this entry, then - # we need to make sure we call the target-decider function, - # not the source-decider. Reaching in and doing this by hand - # is a little bogus. We'd prefer to handle this by adding - # an Entry.builder_set() method that disambiguates like the - # other methods, but that starts running into problems with the - # fragile way we initialize Dir Nodes with their Mkdir builders, - # yet still allow them to be overridden by the user. Since it's - # not clear right now how to fix that, stick with what works - # until it becomes clear... - if self.has_builder(): - self.changed_since_last_build = self.decide_target - - def scanner_key(self): - return self.get_suffix() - - def get_contents(self): - if not self.rexists(): - return '' - fname = self.rfile().abspath - try: - contents = open(fname, "rb").read() - except EnvironmentError, e: - if not e.filename: - e.filename = fname - raise - return contents - - try: - import codecs - except ImportError: - get_text_contents = get_contents - else: - # This attempts to figure out what the encoding of the text is - # based upon the BOM bytes, and then decodes the contents so that - # it's a valid python string. - def get_text_contents(self): - contents = self.get_contents() - if contents.startswith(codecs.BOM_UTF8): - contents = contents.decode('utf-8') - elif contents.startswith(codecs.BOM_UTF16): - contents = contents.decode('utf-16') - return contents - - def get_content_hash(self): - """ - Compute and return the MD5 hash for this file. - """ - if not self.rexists(): - return SCons.Util.MD5signature('') - fname = self.rfile().abspath - try: - cs = SCons.Util.MD5filesignature(fname, - chunksize=SCons.Node.FS.File.md5_chunksize*1024) - except EnvironmentError, e: - if not e.filename: - e.filename = fname - raise - return cs - - - memoizer_counters.append(SCons.Memoize.CountValue('get_size')) - - def get_size(self): - try: - return self._memo['get_size'] - except KeyError: - pass - - if self.rexists(): - size = self.rfile().getsize() - else: - size = 0 - - self._memo['get_size'] = size - - return size - - memoizer_counters.append(SCons.Memoize.CountValue('get_timestamp')) - - def get_timestamp(self): - try: - return self._memo['get_timestamp'] - except KeyError: - pass - - if self.rexists(): - timestamp = self.rfile().getmtime() - else: - timestamp = 0 - - self._memo['get_timestamp'] = timestamp - - return timestamp - - def store_info(self): - # Merge our build information into the already-stored entry. - # This accomodates "chained builds" where a file that's a target - # in one build (SConstruct file) is a source in a different build. - # See test/chained-build.py for the use case. - if do_store_info: - self.dir.sconsign().store_info(self.name, self) - - convert_copy_attrs = [ - 'bsources', - 'bimplicit', - 'bdepends', - 'bact', - 'bactsig', - 'ninfo', - ] - - - convert_sig_attrs = [ - 'bsourcesigs', - 'bimplicitsigs', - 'bdependsigs', - ] - - def convert_old_entry(self, old_entry): - # Convert a .sconsign entry from before the Big Signature - # Refactoring, doing what we can to convert its information - # to the new .sconsign entry format. - # - # The old format looked essentially like this: - # - # BuildInfo - # .ninfo (NodeInfo) - # .bsig - # .csig - # .timestamp - # .size - # .bsources - # .bsourcesigs ("signature" list) - # .bdepends - # .bdependsigs ("signature" list) - # .bimplicit - # .bimplicitsigs ("signature" list) - # .bact - # .bactsig - # - # The new format looks like this: - # - # .ninfo (NodeInfo) - # .bsig - # .csig - # .timestamp - # .size - # .binfo (BuildInfo) - # .bsources - # .bsourcesigs (NodeInfo list) - # .bsig - # .csig - # .timestamp - # .size - # .bdepends - # .bdependsigs (NodeInfo list) - # .bsig - # .csig - # .timestamp - # .size - # .bimplicit - # .bimplicitsigs (NodeInfo list) - # .bsig - # .csig - # .timestamp - # .size - # .bact - # .bactsig - # - # The basic idea of the new structure is that a NodeInfo always - # holds all available information about the state of a given Node - # at a certain point in time. The various .b*sigs lists can just - # be a list of pointers to the .ninfo attributes of the different - # dependent nodes, without any copying of information until it's - # time to pickle it for writing out to a .sconsign file. - # - # The complicating issue is that the *old* format only stored one - # "signature" per dependency, based on however the *last* build - # was configured. We don't know from just looking at it whether - # it was a build signature, a content signature, or a timestamp - # "signature". Since we no longer use build signatures, the - # best we can do is look at the length and if it's thirty two, - # assume that it was (or might have been) a content signature. - # If it was actually a build signature, then it will cause a - # rebuild anyway when it doesn't match the new content signature, - # but that's probably the best we can do. - import SCons.SConsign - new_entry = SCons.SConsign.SConsignEntry() - new_entry.binfo = self.new_binfo() - binfo = new_entry.binfo - for attr in self.convert_copy_attrs: - try: - value = getattr(old_entry, attr) - except AttributeError: - continue - setattr(binfo, attr, value) - delattr(old_entry, attr) - for attr in self.convert_sig_attrs: - try: - sig_list = getattr(old_entry, attr) - except AttributeError: - continue - value = [] - for sig in sig_list: - ninfo = self.new_ninfo() - if len(sig) == 32: - ninfo.csig = sig - else: - ninfo.timestamp = sig - value.append(ninfo) - setattr(binfo, attr, value) - delattr(old_entry, attr) - return new_entry - - memoizer_counters.append(SCons.Memoize.CountValue('get_stored_info')) - - def get_stored_info(self): - try: - return self._memo['get_stored_info'] - except KeyError: - pass - - try: - sconsign_entry = self.dir.sconsign().get_entry(self.name) - except (KeyError, EnvironmentError): - import SCons.SConsign - sconsign_entry = SCons.SConsign.SConsignEntry() - sconsign_entry.binfo = self.new_binfo() - sconsign_entry.ninfo = self.new_ninfo() - else: - if isinstance(sconsign_entry, FileBuildInfo): - # This is a .sconsign file from before the Big Signature - # Refactoring; convert it as best we can. - sconsign_entry = self.convert_old_entry(sconsign_entry) - try: - delattr(sconsign_entry.ninfo, 'bsig') - except AttributeError: - pass - - self._memo['get_stored_info'] = sconsign_entry - - return sconsign_entry - - def get_stored_implicit(self): - binfo = self.get_stored_info().binfo - binfo.prepare_dependencies() - try: return binfo.bimplicit - except AttributeError: return None - - def rel_path(self, other): - return self.dir.rel_path(other) - - def _get_found_includes_key(self, env, scanner, path): - return (id(env), id(scanner), path) - - memoizer_counters.append(SCons.Memoize.CountDict('get_found_includes', _get_found_includes_key)) - - def get_found_includes(self, env, scanner, path): - """Return the included implicit dependencies in this file. - Cache results so we only scan the file once per path - regardless of how many times this information is requested. - """ - memo_key = (id(env), id(scanner), path) - try: - memo_dict = self._memo['get_found_includes'] - except KeyError: - memo_dict = {} - self._memo['get_found_includes'] = memo_dict - else: - try: - return memo_dict[memo_key] - except KeyError: - pass - - if scanner: - # result = [n.disambiguate() for n in scanner(self, env, path)] - result = scanner(self, env, path) - result = map(lambda N: N.disambiguate(), result) - else: - result = [] - - memo_dict[memo_key] = result - - return result - - def _createDir(self): - # ensure that the directories for this node are - # created. - self.dir._create() - - def push_to_cache(self): - """Try to push the node into a cache - """ - # This should get called before the Nodes' .built() method is - # called, which would clear the build signature if the file has - # a source scanner. - # - # We have to clear the local memoized values *before* we push - # the node to cache so that the memoization of the self.exists() - # return value doesn't interfere. - if self.nocache: - return - self.clear_memoized_values() - if self.exists(): - self.get_build_env().get_CacheDir().push(self) - - def retrieve_from_cache(self): - """Try to retrieve the node's content from a cache - - This method is called from multiple threads in a parallel build, - so only do thread safe stuff here. Do thread unsafe stuff in - built(). - - Returns true iff the node was successfully retrieved. - """ - if self.nocache: - return None - if not self.is_derived(): - return None - return self.get_build_env().get_CacheDir().retrieve(self) - - def visited(self): - if self.exists(): - self.get_build_env().get_CacheDir().push_if_forced(self) - - ninfo = self.get_ninfo() - - csig = self.get_max_drift_csig() - if csig: - ninfo.csig = csig - - ninfo.timestamp = self.get_timestamp() - ninfo.size = self.get_size() - - if not self.has_builder(): - # This is a source file, but it might have been a target file - # in another build that included more of the DAG. Copy - # any build information that's stored in the .sconsign file - # into our binfo object so it doesn't get lost. - old = self.get_stored_info() - self.get_binfo().__dict__.update(old.binfo.__dict__) - - self.store_info() - - def find_src_builder(self): - if self.rexists(): - return None - scb = self.dir.src_builder() - if scb is _null: - if diskcheck_sccs(self.dir, self.name): - scb = get_DefaultSCCSBuilder() - elif diskcheck_rcs(self.dir, self.name): - scb = get_DefaultRCSBuilder() - else: - scb = None - if scb is not None: - try: - b = self.builder - except AttributeError: - b = None - if b is None: - self.builder_set(scb) - return scb - - def has_src_builder(self): - """Return whether this Node has a source builder or not. - - If this Node doesn't have an explicit source code builder, this - is where we figure out, on the fly, if there's a transparent - source code builder for it. - - Note that if we found a source builder, we also set the - self.builder attribute, so that all of the methods that actually - *build* this file don't have to do anything different. - """ - try: - scb = self.sbuilder - except AttributeError: - scb = self.sbuilder = self.find_src_builder() - return scb is not None - - def alter_targets(self): - """Return any corresponding targets in a variant directory. - """ - if self.is_derived(): - return [], None - return self.fs.variant_dir_target_climb(self, self.dir, [self.name]) - - def _rmv_existing(self): - self.clear_memoized_values() - e = Unlink(self, [], None) - if isinstance(e, SCons.Errors.BuildError): - raise e - - # - # Taskmaster interface subsystem - # - - def make_ready(self): - self.has_src_builder() - self.get_binfo() - - def prepare(self): - """Prepare for this file to be created.""" - SCons.Node.Node.prepare(self) - - if self.get_state() != SCons.Node.up_to_date: - if self.exists(): - if self.is_derived() and not self.precious: - self._rmv_existing() - else: - try: - self._createDir() - except SCons.Errors.StopError, drive: - desc = "No drive `%s' for target `%s'." % (drive, self) - raise SCons.Errors.StopError, desc - - # - # - # - - def remove(self): - """Remove this file.""" - if self.exists() or self.islink(): - self.fs.unlink(self.path) - return 1 - return None - - def do_duplicate(self, src): - self._createDir() - Unlink(self, None, None) - e = Link(self, src, None) - if isinstance(e, SCons.Errors.BuildError): - desc = "Cannot duplicate `%s' in `%s': %s." % (src.path, self.dir.path, e.errstr) - raise SCons.Errors.StopError, desc - self.linked = 1 - # The Link() action may or may not have actually - # created the file, depending on whether the -n - # option was used or not. Delete the _exists and - # _rexists attributes so they can be reevaluated. - self.clear() - - memoizer_counters.append(SCons.Memoize.CountValue('exists')) - - def exists(self): - try: - return self._memo['exists'] - except KeyError: - pass - # Duplicate from source path if we are set up to do this. - if self.duplicate and not self.is_derived() and not self.linked: - src = self.srcnode() - if src is not self: - # At this point, src is meant to be copied in a variant directory. - src = src.rfile() - if src.abspath != self.abspath: - if src.exists(): - self.do_duplicate(src) - # Can't return 1 here because the duplication might - # not actually occur if the -n option is being used. - else: - # The source file does not exist. Make sure no old - # copy remains in the variant directory. - if Base.exists(self) or self.islink(): - self.fs.unlink(self.path) - # Return None explicitly because the Base.exists() call - # above will have cached its value if the file existed. - self._memo['exists'] = None - return None - result = Base.exists(self) - self._memo['exists'] = result - return result - - # - # SIGNATURE SUBSYSTEM - # - - def get_max_drift_csig(self): - """ - Returns the content signature currently stored for this node - if it's been unmodified longer than the max_drift value, or the - max_drift value is 0. Returns None otherwise. - """ - old = self.get_stored_info() - mtime = self.get_timestamp() - - max_drift = self.fs.max_drift - if max_drift > 0: - if (time.time() - mtime) > max_drift: - try: - n = old.ninfo - if n.timestamp and n.csig and n.timestamp == mtime: - return n.csig - except AttributeError: - pass - elif max_drift == 0: - try: - return old.ninfo.csig - except AttributeError: - pass - - return None - - def get_csig(self): - """ - Generate a node's content signature, the digested signature - of its content. - - node - the node - cache - alternate node to use for the signature cache - returns - the content signature - """ - ninfo = self.get_ninfo() - try: - return ninfo.csig - except AttributeError: - pass - - csig = self.get_max_drift_csig() - if csig is None: - - try: - if self.get_size() < SCons.Node.FS.File.md5_chunksize: - contents = self.get_contents() - else: - csig = self.get_content_hash() - except IOError: - # This can happen if there's actually a directory on-disk, - # which can be the case if they've disabled disk checks, - # or if an action with a File target actually happens to - # create a same-named directory by mistake. - csig = '' - else: - if not csig: - csig = SCons.Util.MD5signature(contents) - - ninfo.csig = csig - - return csig - - # - # DECISION SUBSYSTEM - # - - def builder_set(self, builder): - SCons.Node.Node.builder_set(self, builder) - self.changed_since_last_build = self.decide_target - - def changed_content(self, target, prev_ni): - cur_csig = self.get_csig() - try: - return cur_csig != prev_ni.csig - except AttributeError: - return 1 - - def changed_state(self, target, prev_ni): - return self.state != SCons.Node.up_to_date - - def changed_timestamp_then_content(self, target, prev_ni): - if not self.changed_timestamp_match(target, prev_ni): - try: - self.get_ninfo().csig = prev_ni.csig - except AttributeError: - pass - return False - return self.changed_content(target, prev_ni) - - def changed_timestamp_newer(self, target, prev_ni): - try: - return self.get_timestamp() > target.get_timestamp() - except AttributeError: - return 1 - - def changed_timestamp_match(self, target, prev_ni): - try: - return self.get_timestamp() != prev_ni.timestamp - except AttributeError: - return 1 - - def decide_source(self, target, prev_ni): - return target.get_build_env().decide_source(self, target, prev_ni) - - def decide_target(self, target, prev_ni): - return target.get_build_env().decide_target(self, target, prev_ni) - - # Initialize this Node's decider function to decide_source() because - # every file is a source file until it has a Builder attached... - changed_since_last_build = decide_source - - def is_up_to_date(self): - T = 0 - if T: Trace('is_up_to_date(%s):' % self) - if not self.exists(): - if T: Trace(' not self.exists():') - # The file doesn't exist locally... - r = self.rfile() - if r != self: - # ...but there is one in a Repository... - if not self.changed(r): - if T: Trace(' changed(%s):' % r) - # ...and it's even up-to-date... - if self._local: - # ...and they'd like a local copy. - e = LocalCopy(self, r, None) - if isinstance(e, SCons.Errors.BuildError): - raise - self.store_info() - if T: Trace(' 1\n') - return 1 - self.changed() - if T: Trace(' None\n') - return None - else: - r = self.changed() - if T: Trace(' self.exists(): %s\n' % r) - return not r - - memoizer_counters.append(SCons.Memoize.CountValue('rfile')) - - def rfile(self): - try: - return self._memo['rfile'] - except KeyError: - pass - result = self - if not self.exists(): - norm_name = _my_normcase(self.name) - for dir in self.dir.get_all_rdirs(): - try: node = dir.entries[norm_name] - except KeyError: node = dir.file_on_disk(self.name) - if node and node.exists() and \ - (isinstance(node, File) or isinstance(node, Entry) \ - or not node.is_derived()): - result = node - # Copy over our local attributes to the repository - # Node so we identify shared object files in the - # repository and don't assume they're static. - # - # This isn't perfect; the attribute would ideally - # be attached to the object in the repository in - # case it was built statically in the repository - # and we changed it to shared locally, but that's - # rarely the case and would only occur if you - # intentionally used the same suffix for both - # shared and static objects anyway. So this - # should work well in practice. - result.attributes = self.attributes - break - self._memo['rfile'] = result - return result - - def rstr(self): - return str(self.rfile()) - - def get_cachedir_csig(self): - """ - Fetch a Node's content signature for purposes of computing - another Node's cachesig. - - This is a wrapper around the normal get_csig() method that handles - the somewhat obscure case of using CacheDir with the -n option. - Any files that don't exist would normally be "built" by fetching - them from the cache, but the normal get_csig() method will try - to open up the local file, which doesn't exist because the -n - option meant we didn't actually pull the file from cachedir. - But since the file *does* actually exist in the cachedir, we - can use its contents for the csig. - """ - try: - return self.cachedir_csig - except AttributeError: - pass - - cachedir, cachefile = self.get_build_env().get_CacheDir().cachepath(self) - if not self.exists() and cachefile and os.path.exists(cachefile): - self.cachedir_csig = SCons.Util.MD5filesignature(cachefile, \ - SCons.Node.FS.File.md5_chunksize * 1024) - else: - self.cachedir_csig = self.get_csig() - return self.cachedir_csig - - def get_cachedir_bsig(self): - try: - return self.cachesig - except AttributeError: - pass - - # Add the path to the cache signature, because multiple - # targets built by the same action will all have the same - # build signature, and we have to differentiate them somehow. - children = self.children() - executor = self.get_executor() - # sigs = [n.get_cachedir_csig() for n in children] - sigs = map(lambda n: n.get_cachedir_csig(), children) - sigs.append(SCons.Util.MD5signature(executor.get_contents())) - sigs.append(self.path) - result = self.cachesig = SCons.Util.MD5collect(sigs) - return result - - -default_fs = None - -def get_default_fs(): - global default_fs - if not default_fs: - default_fs = FS() - return default_fs - -class FileFinder: - """ - """ - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - memoizer_counters = [] - - def __init__(self): - self._memo = {} - - def filedir_lookup(self, p, fd=None): - """ - A helper method for find_file() that looks up a directory for - a file we're trying to find. This only creates the Dir Node if - it exists on-disk, since if the directory doesn't exist we know - we won't find any files in it... :-) - - It would be more compact to just use this as a nested function - with a default keyword argument (see the commented-out version - below), but that doesn't work unless you have nested scopes, - so we define it here just so this work under Python 1.5.2. - """ - if fd is None: - fd = self.default_filedir - dir, name = os.path.split(fd) - drive, d = os.path.splitdrive(dir) - if not name and d[:1] in ('/', os.sep): - #return p.fs.get_root(drive).dir_on_disk(name) - return p.fs.get_root(drive) - if dir: - p = self.filedir_lookup(p, dir) - if not p: - return None - norm_name = _my_normcase(name) - try: - node = p.entries[norm_name] - except KeyError: - return p.dir_on_disk(name) - if isinstance(node, Dir): - return node - if isinstance(node, Entry): - node.must_be_same(Dir) - return node - return None - - def _find_file_key(self, filename, paths, verbose=None): - return (filename, paths) - - memoizer_counters.append(SCons.Memoize.CountDict('find_file', _find_file_key)) - - def find_file(self, filename, paths, verbose=None): - """ - find_file(str, [Dir()]) -> [nodes] - - filename - a filename to find - paths - a list of directory path *nodes* to search in. Can be - represented as a list, a tuple, or a callable that is - called with no arguments and returns the list or tuple. - - returns - the node created from the found file. - - Find a node corresponding to either a derived file or a file - that exists already. - - Only the first file found is returned, and none is returned - if no file is found. - """ - memo_key = self._find_file_key(filename, paths) - try: - memo_dict = self._memo['find_file'] - except KeyError: - memo_dict = {} - self._memo['find_file'] = memo_dict - else: - try: - return memo_dict[memo_key] - except KeyError: - pass - - if verbose and not callable(verbose): - if not SCons.Util.is_String(verbose): - verbose = "find_file" - verbose = ' %s: ' % verbose - verbose = lambda s, v=verbose: sys.stdout.write(v + s) - - filedir, filename = os.path.split(filename) - if filedir: - # More compact code that we can't use until we drop - # support for Python 1.5.2: - # - #def filedir_lookup(p, fd=filedir): - # """ - # A helper function that looks up a directory for a file - # we're trying to find. This only creates the Dir Node - # if it exists on-disk, since if the directory doesn't - # exist we know we won't find any files in it... :-) - # """ - # dir, name = os.path.split(fd) - # if dir: - # p = filedir_lookup(p, dir) - # if not p: - # return None - # norm_name = _my_normcase(name) - # try: - # node = p.entries[norm_name] - # except KeyError: - # return p.dir_on_disk(name) - # if isinstance(node, Dir): - # return node - # if isinstance(node, Entry): - # node.must_be_same(Dir) - # return node - # if isinstance(node, Dir) or isinstance(node, Entry): - # return node - # return None - #paths = filter(None, map(filedir_lookup, paths)) - - self.default_filedir = filedir - paths = filter(None, map(self.filedir_lookup, paths)) - - result = None - for dir in paths: - if verbose: - verbose("looking for '%s' in '%s' ...\n" % (filename, dir)) - node, d = dir.srcdir_find_file(filename) - if node: - if verbose: - verbose("... FOUND '%s' in '%s'\n" % (filename, d)) - result = node - break - - memo_dict[memo_key] = result - - return result - -find_file = FileFinder().find_file - - -def invalidate_node_memos(targets): - """ - Invalidate the memoized values of all Nodes (files or directories) - that are associated with the given entries. Has been added to - clear the cache of nodes affected by a direct execution of an - action (e.g. Delete/Copy/Chmod). Existing Node caches become - inconsistent if the action is run through Execute(). The argument - `targets` can be a single Node object or filename, or a sequence - of Nodes/filenames. - """ - from traceback import extract_stack - - # First check if the cache really needs to be flushed. Only - # actions run in the SConscript with Execute() seem to be - # affected. XXX The way to check if Execute() is in the stacktrace - # is a very dirty hack and should be replaced by a more sensible - # solution. - for f in extract_stack(): - if f[2] == 'Execute' and f[0][-14:] == 'Environment.py': - break - else: - # Dont have to invalidate, so return - return - - if not SCons.Util.is_List(targets): - targets = [targets] - - for entry in targets: - # If the target is a Node object, clear the cache. If it is a - # filename, look up potentially existing Node object first. - try: - entry.clear_memoized_values() - except AttributeError: - # Not a Node object, try to look up Node by filename. XXX - # This creates Node objects even for those filenames which - # do not correspond to an existing Node object. - node = get_default_fs().Entry(entry) - if node: - node.clear_memoized_values() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Node/Python.py b/3rdParty/SCons/scons-local/SCons/Node/Python.py deleted file mode 100644 index 9a22f42..0000000 --- a/3rdParty/SCons/scons-local/SCons/Node/Python.py +++ /dev/null @@ -1,125 +0,0 @@ -"""scons.Node.Python - -Python nodes. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Node/Python.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Node - -class ValueNodeInfo(SCons.Node.NodeInfoBase): - current_version_id = 1 - - field_list = ['csig'] - - def str_to_node(self, s): - return Value(s) - -class ValueBuildInfo(SCons.Node.BuildInfoBase): - current_version_id = 1 - -class Value(SCons.Node.Node): - """A class for Python variables, typically passed on the command line - or generated by a script, but not from a file or some other source. - """ - - NodeInfo = ValueNodeInfo - BuildInfo = ValueBuildInfo - - def __init__(self, value, built_value=None): - SCons.Node.Node.__init__(self) - self.value = value - if not built_value is None: - self.built_value = built_value - - def str_for_display(self): - return repr(self.value) - - def __str__(self): - return str(self.value) - - def make_ready(self): - self.get_csig() - - def build(self, **kw): - if not hasattr(self, 'built_value'): - apply (SCons.Node.Node.build, (self,), kw) - - is_up_to_date = SCons.Node.Node.children_are_up_to_date - - def is_under(self, dir): - # Make Value nodes get built regardless of - # what directory scons was run from. Value nodes - # are outside the filesystem: - return 1 - - def write(self, built_value): - """Set the value of the node.""" - self.built_value = built_value - - def read(self): - """Return the value. If necessary, the value is built.""" - self.build() - if not hasattr(self, 'built_value'): - self.built_value = self.value - return self.built_value - - def get_contents(self): - """By the assumption that the node.built_value is a - deterministic product of the sources, the contents of a Value - are the concatenation of all the contents of its sources. As - the value need not be built when get_contents() is called, we - cannot use the actual node.built_value.""" - contents = str(self.value) - for kid in self.children(None): - contents = contents + kid.get_contents() - return contents - - def changed_since_last_build(self, target, prev_ni): - cur_csig = self.get_csig() - try: - return cur_csig != prev_ni.csig - except AttributeError: - return 1 - - def get_csig(self, calc=None): - """Because we're a Python value node and don't have a real - timestamp, we get to ignore the calculator and just use the - value contents.""" - try: - return self.ninfo.csig - except AttributeError: - pass - contents = self.get_contents() - self.get_ninfo().csig = contents - return contents - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Node/__init__.py b/3rdParty/SCons/scons-local/SCons/Node/__init__.py deleted file mode 100644 index abb746e..0000000 --- a/3rdParty/SCons/scons-local/SCons/Node/__init__.py +++ /dev/null @@ -1,1341 +0,0 @@ -"""SCons.Node - -The Node package for the SCons software construction utility. - -This is, in many ways, the heart of SCons. - -A Node is where we encapsulate all of the dependency information about -any thing that SCons can build, or about any thing which SCons can use -to build some other thing. The canonical "thing," of course, is a file, -but a Node can also represent something remote (like a web page) or -something completely abstract (like an Alias). - -Each specific type of "thing" is specifically represented by a subclass -of the Node base class: Node.FS.File for files, Node.Alias for aliases, -etc. Dependency information is kept here in the base class, and -information specific to files/aliases/etc. is in the subclass. The -goal, if we've done this correctly, is that any type of "thing" should -be able to depend on any other type of "thing." - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Node/__init__.py 4043 2009/02/23 09:06:45 scons" - -import copy -from itertools import chain, izip -import string -import UserList - -from SCons.Debug import logInstanceCreation -import SCons.Executor -import SCons.Memoize -import SCons.Util - -from SCons.Debug import Trace - -def classname(obj): - return string.split(str(obj.__class__), '.')[-1] - -# Node states -# -# These are in "priority" order, so that the maximum value for any -# child/dependency of a node represents the state of that node if -# it has no builder of its own. The canonical example is a file -# system directory, which is only up to date if all of its children -# were up to date. -no_state = 0 -pending = 1 -executing = 2 -up_to_date = 3 -executed = 4 -failed = 5 - -StateString = { - 0 : "no_state", - 1 : "pending", - 2 : "executing", - 3 : "up_to_date", - 4 : "executed", - 5 : "failed", -} - -# controls whether implicit dependencies are cached: -implicit_cache = 0 - -# controls whether implicit dep changes are ignored: -implicit_deps_unchanged = 0 - -# controls whether the cached implicit deps are ignored: -implicit_deps_changed = 0 - -# A variable that can be set to an interface-specific function be called -# to annotate a Node with information about its creation. -def do_nothing(node): pass - -Annotate = do_nothing - -# Classes for signature info for Nodes. - -class NodeInfoBase: - """ - The generic base class for signature information for a Node. - - Node subclasses should subclass NodeInfoBase to provide their own - logic for dealing with their own Node-specific signature information. - """ - current_version_id = 1 - def __init__(self, node): - # Create an object attribute from the class attribute so it ends up - # in the pickled data in the .sconsign file. - self._version_id = self.current_version_id - def update(self, node): - try: - field_list = self.field_list - except AttributeError: - return - for f in field_list: - try: - delattr(self, f) - except AttributeError: - pass - try: - func = getattr(node, 'get_' + f) - except AttributeError: - pass - else: - setattr(self, f, func()) - def convert(self, node, val): - pass - def merge(self, other): - self.__dict__.update(other.__dict__) - def format(self, field_list=None, names=0): - if field_list is None: - try: - field_list = self.field_list - except AttributeError: - field_list = self.__dict__.keys() - field_list.sort() - fields = [] - for field in field_list: - try: - f = getattr(self, field) - except AttributeError: - f = None - f = str(f) - if names: - f = field + ': ' + f - fields.append(f) - return fields - -class BuildInfoBase: - """ - The generic base class for build information for a Node. - - This is what gets stored in a .sconsign file for each target file. - It contains a NodeInfo instance for this node (signature information - that's specific to the type of Node) and direct attributes for the - generic build stuff we have to track: sources, explicit dependencies, - implicit dependencies, and action information. - """ - current_version_id = 1 - def __init__(self, node): - # Create an object attribute from the class attribute so it ends up - # in the pickled data in the .sconsign file. - self._version_id = self.current_version_id - self.bsourcesigs = [] - self.bdependsigs = [] - self.bimplicitsigs = [] - self.bactsig = None - def merge(self, other): - self.__dict__.update(other.__dict__) - -class Node: - """The base Node class, for entities that we know how to - build, or use to build other Nodes. - """ - - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - memoizer_counters = [] - - class Attrs: - pass - - def __init__(self): - if __debug__: logInstanceCreation(self, 'Node.Node') - # Note that we no longer explicitly initialize a self.builder - # attribute to None here. That's because the self.builder - # attribute may be created on-the-fly later by a subclass (the - # canonical example being a builder to fetch a file from a - # source code system like CVS or Subversion). - - # Each list of children that we maintain is accompanied by a - # dictionary used to look up quickly whether a node is already - # present in the list. Empirical tests showed that it was - # fastest to maintain them as side-by-side Node attributes in - # this way, instead of wrapping up each list+dictionary pair in - # a class. (Of course, we could always still do that in the - # future if we had a good reason to...). - self.sources = [] # source files used to build node - self.sources_set = set() - self._specific_sources = False - self.depends = [] # explicit dependencies (from Depends) - self.depends_set = set() - self.ignore = [] # dependencies to ignore - self.ignore_set = set() - self.prerequisites = SCons.Util.UniqueList() - self.implicit = None # implicit (scanned) dependencies (None means not scanned yet) - self.waiting_parents = set() - self.waiting_s_e = set() - self.ref_count = 0 - self.wkids = None # Kids yet to walk, when it's an array - - self.env = None - self.state = no_state - self.precious = None - self.noclean = 0 - self.nocache = 0 - self.always_build = None - self.includes = None - self.attributes = self.Attrs() # Generic place to stick information about the Node. - self.side_effect = 0 # true iff this node is a side effect - self.side_effects = [] # the side effects of building this target - self.linked = 0 # is this node linked to the variant directory? - - self.clear_memoized_values() - - # Let the interface in which the build engine is embedded - # annotate this Node with its own info (like a description of - # what line in what file created the node, for example). - Annotate(self) - - def disambiguate(self, must_exist=None): - return self - - def get_suffix(self): - return '' - - memoizer_counters.append(SCons.Memoize.CountValue('get_build_env')) - - def get_build_env(self): - """Fetch the appropriate Environment to build this node. - """ - try: - return self._memo['get_build_env'] - except KeyError: - pass - result = self.get_executor().get_build_env() - self._memo['get_build_env'] = result - return result - - def get_build_scanner_path(self, scanner): - """Fetch the appropriate scanner path for this node.""" - return self.get_executor().get_build_scanner_path(scanner) - - def set_executor(self, executor): - """Set the action executor for this node.""" - self.executor = executor - - def get_executor(self, create=1): - """Fetch the action executor for this node. Create one if - there isn't already one, and requested to do so.""" - try: - executor = self.executor - except AttributeError: - if not create: - raise - try: - act = self.builder.action - except AttributeError: - executor = SCons.Executor.Null(targets=[self]) - else: - executor = SCons.Executor.Executor(act, - self.env or self.builder.env, - [self.builder.overrides], - [self], - self.sources) - self.executor = executor - return executor - - def executor_cleanup(self): - """Let the executor clean up any cached information.""" - try: - executor = self.get_executor(create=None) - except AttributeError: - pass - else: - executor.cleanup() - - def reset_executor(self): - "Remove cached executor; forces recompute when needed." - try: - delattr(self, 'executor') - except AttributeError: - pass - - def push_to_cache(self): - """Try to push a node into a cache - """ - pass - - def retrieve_from_cache(self): - """Try to retrieve the node's content from a cache - - This method is called from multiple threads in a parallel build, - so only do thread safe stuff here. Do thread unsafe stuff in - built(). - - Returns true iff the node was successfully retrieved. - """ - return 0 - - # - # Taskmaster interface subsystem - # - - def make_ready(self): - """Get a Node ready for evaluation. - - This is called before the Taskmaster decides if the Node is - up-to-date or not. Overriding this method allows for a Node - subclass to be disambiguated if necessary, or for an implicit - source builder to be attached. - """ - pass - - def prepare(self): - """Prepare for this Node to be built. - - This is called after the Taskmaster has decided that the Node - is out-of-date and must be rebuilt, but before actually calling - the method to build the Node. - - This default implementation checks that explicit or implicit - dependencies either exist or are derived, and initializes the - BuildInfo structure that will hold the information about how - this node is, uh, built. - - (The existence of source files is checked separately by the - Executor, which aggregates checks for all of the targets built - by a specific action.) - - Overriding this method allows for for a Node subclass to remove - the underlying file from the file system. Note that subclass - methods should call this base class method to get the child - check and the BuildInfo structure. - """ - for d in self.depends: - if d.missing(): - msg = "Explicit dependency `%s' not found, needed by target `%s'." - raise SCons.Errors.StopError, msg % (d, self) - if not self.implicit is None: - for i in self.implicit: - if i.missing(): - msg = "Implicit dependency `%s' not found, needed by target `%s'." - raise SCons.Errors.StopError, msg % (i, self) - self.binfo = self.get_binfo() - - def build(self, **kw): - """Actually build the node. - - This is called by the Taskmaster after it's decided that the - Node is out-of-date and must be rebuilt, and after the prepare() - method has gotten everything, uh, prepared. - - This method is called from multiple threads in a parallel build, - so only do thread safe stuff here. Do thread unsafe stuff - in built(). - - """ - try: - apply(self.get_executor(), (self,), kw) - except SCons.Errors.BuildError, e: - e.node = self - raise - - def built(self): - """Called just after this node is successfully built.""" - - # Clear the implicit dependency caches of any Nodes - # waiting for this Node to be built. - for parent in self.waiting_parents: - parent.implicit = None - - self.clear() - - self.ninfo.update(self) - - def visited(self): - """Called just after this node has been visited (with or - without a build).""" - try: - binfo = self.binfo - except AttributeError: - # Apparently this node doesn't need build info, so - # don't bother calculating or storing it. - pass - else: - self.ninfo.update(self) - self.store_info() - - # - # - # - - def add_to_waiting_s_e(self, node): - self.waiting_s_e.add(node) - - def add_to_waiting_parents(self, node): - """ - Returns the number of nodes added to our waiting parents list: - 1 if we add a unique waiting parent, 0 if not. (Note that the - returned values are intended to be used to increment a reference - count, so don't think you can "clean up" this function by using - True and False instead...) - """ - wp = self.waiting_parents - if node in wp: - return 0 - wp.add(node) - return 1 - - def postprocess(self): - """Clean up anything we don't need to hang onto after we've - been built.""" - self.executor_cleanup() - self.waiting_parents = set() - - def clear(self): - """Completely clear a Node of all its cached state (so that it - can be re-evaluated by interfaces that do continuous integration - builds). - """ - # The del_binfo() call here isn't necessary for normal execution, - # but is for interactive mode, where we might rebuild the same - # target and need to start from scratch. - self.del_binfo() - self.clear_memoized_values() - self.ninfo = self.new_ninfo() - self.executor_cleanup() - try: - delattr(self, '_calculated_sig') - except AttributeError: - pass - self.includes = None - - def clear_memoized_values(self): - self._memo = {} - - def builder_set(self, builder): - self.builder = builder - try: - del self.executor - except AttributeError: - pass - - def has_builder(self): - """Return whether this Node has a builder or not. - - In Boolean tests, this turns out to be a *lot* more efficient - than simply examining the builder attribute directly ("if - node.builder: ..."). When the builder attribute is examined - directly, it ends up calling __getattr__ for both the __len__ - and __nonzero__ attributes on instances of our Builder Proxy - class(es), generating a bazillion extra calls and slowing - things down immensely. - """ - try: - b = self.builder - except AttributeError: - # There was no explicit builder for this Node, so initialize - # the self.builder attribute to None now. - b = self.builder = None - return not b is None - - def set_explicit(self, is_explicit): - self.is_explicit = is_explicit - - def has_explicit_builder(self): - """Return whether this Node has an explicit builder - - This allows an internal Builder created by SCons to be marked - non-explicit, so that it can be overridden by an explicit - builder that the user supplies (the canonical example being - directories).""" - try: - return self.is_explicit - except AttributeError: - self.is_explicit = None - return self.is_explicit - - def get_builder(self, default_builder=None): - """Return the set builder, or a specified default value""" - try: - return self.builder - except AttributeError: - return default_builder - - multiple_side_effect_has_builder = has_builder - - def is_derived(self): - """ - Returns true iff this node is derived (i.e. built). - - This should return true only for nodes whose path should be in - the variant directory when duplicate=0 and should contribute their build - signatures when they are used as source files to other derived files. For - example: source with source builders are not derived in this sense, - and hence should not return true. - """ - return self.has_builder() or self.side_effect - - def alter_targets(self): - """Return a list of alternate targets for this Node. - """ - return [], None - - def get_found_includes(self, env, scanner, path): - """Return the scanned include lines (implicit dependencies) - found in this node. - - The default is no implicit dependencies. We expect this method - to be overridden by any subclass that can be scanned for - implicit dependencies. - """ - return [] - - def get_implicit_deps(self, env, scanner, path): - """Return a list of implicit dependencies for this node. - - This method exists to handle recursive invocation of the scanner - on the implicit dependencies returned by the scanner, if the - scanner's recursive flag says that we should. - """ - if not scanner: - return [] - - # Give the scanner a chance to select a more specific scanner - # for this Node. - #scanner = scanner.select(self) - - nodes = [self] - seen = {} - seen[self] = 1 - deps = [] - while nodes: - n = nodes.pop(0) - d = filter(lambda x, seen=seen: not seen.has_key(x), - n.get_found_includes(env, scanner, path)) - if d: - deps.extend(d) - for n in d: - seen[n] = 1 - nodes.extend(scanner.recurse_nodes(d)) - - return deps - - def get_env_scanner(self, env, kw={}): - return env.get_scanner(self.scanner_key()) - - def get_target_scanner(self): - return self.builder.target_scanner - - def get_source_scanner(self, node): - """Fetch the source scanner for the specified node - - NOTE: "self" is the target being built, "node" is - the source file for which we want to fetch the scanner. - - Implies self.has_builder() is true; again, expect to only be - called from locations where this is already verified. - - This function may be called very often; it attempts to cache - the scanner found to improve performance. - """ - scanner = None - try: - scanner = self.builder.source_scanner - except AttributeError: - pass - if not scanner: - # The builder didn't have an explicit scanner, so go look up - # a scanner from env['SCANNERS'] based on the node's scanner - # key (usually the file extension). - scanner = self.get_env_scanner(self.get_build_env()) - if scanner: - scanner = scanner.select(node) - return scanner - - def add_to_implicit(self, deps): - if not hasattr(self, 'implicit') or self.implicit is None: - self.implicit = [] - self.implicit_set = set() - self._children_reset() - self._add_child(self.implicit, self.implicit_set, deps) - - def scan(self): - """Scan this node's dependents for implicit dependencies.""" - # Don't bother scanning non-derived files, because we don't - # care what their dependencies are. - # Don't scan again, if we already have scanned. - if not self.implicit is None: - return - self.implicit = [] - self.implicit_set = set() - self._children_reset() - if not self.has_builder(): - return - - build_env = self.get_build_env() - executor = self.get_executor() - - # Here's where we implement --implicit-cache. - if implicit_cache and not implicit_deps_changed: - implicit = self.get_stored_implicit() - if implicit is not None: - # We now add the implicit dependencies returned from the - # stored .sconsign entry to have already been converted - # to Nodes for us. (We used to run them through a - # source_factory function here.) - - # Update all of the targets with them. This - # essentially short-circuits an N*M scan of the - # sources for each individual target, which is a hell - # of a lot more efficient. - for tgt in executor.get_all_targets(): - tgt.add_to_implicit(implicit) - - if implicit_deps_unchanged or self.is_up_to_date(): - return - # one of this node's sources has changed, - # so we must recalculate the implicit deps: - self.implicit = [] - self.implicit_set = set() - - # Have the executor scan the sources. - executor.scan_sources(self.builder.source_scanner) - - # If there's a target scanner, have the executor scan the target - # node itself and associated targets that might be built. - scanner = self.get_target_scanner() - if scanner: - executor.scan_targets(scanner) - - def scanner_key(self): - return None - - def select_scanner(self, scanner): - """Selects a scanner for this Node. - - This is a separate method so it can be overridden by Node - subclasses (specifically, Node.FS.Dir) that *must* use their - own Scanner and don't select one the Scanner.Selector that's - configured for the target. - """ - return scanner.select(self) - - def env_set(self, env, safe=0): - if safe and self.env: - return - self.env = env - - # - # SIGNATURE SUBSYSTEM - # - - NodeInfo = NodeInfoBase - BuildInfo = BuildInfoBase - - def new_ninfo(self): - ninfo = self.NodeInfo(self) - return ninfo - - def get_ninfo(self): - try: - return self.ninfo - except AttributeError: - self.ninfo = self.new_ninfo() - return self.ninfo - - def new_binfo(self): - binfo = self.BuildInfo(self) - return binfo - - def get_binfo(self): - """ - Fetch a node's build information. - - node - the node whose sources will be collected - cache - alternate node to use for the signature cache - returns - the build signature - - This no longer handles the recursive descent of the - node's children's signatures. We expect that they're - already built and updated by someone else, if that's - what's wanted. - """ - try: - return self.binfo - except AttributeError: - pass - - binfo = self.new_binfo() - self.binfo = binfo - - executor = self.get_executor() - ignore_set = self.ignore_set - - if self.has_builder(): - binfo.bact = str(executor) - binfo.bactsig = SCons.Util.MD5signature(executor.get_contents()) - - if self._specific_sources: - sources = [] - for s in self.sources: - if s not in ignore_set: - sources.append(s) - else: - sources = executor.get_unignored_sources(self, self.ignore) - seen = set() - bsources = [] - bsourcesigs = [] - for s in sources: - if not s in seen: - seen.add(s) - bsources.append(s) - bsourcesigs.append(s.get_ninfo()) - binfo.bsources = bsources - binfo.bsourcesigs = bsourcesigs - - depends = self.depends - dependsigs = [] - for d in depends: - if d not in ignore_set: - dependsigs.append(d.get_ninfo()) - binfo.bdepends = depends - binfo.bdependsigs = dependsigs - - implicit = self.implicit or [] - implicitsigs = [] - for i in implicit: - if i not in ignore_set: - implicitsigs.append(i.get_ninfo()) - binfo.bimplicit = implicit - binfo.bimplicitsigs = implicitsigs - - return binfo - - def del_binfo(self): - """Delete the build info from this node.""" - try: - delattr(self, 'binfo') - except AttributeError: - pass - - def get_csig(self): - try: - return self.ninfo.csig - except AttributeError: - ninfo = self.get_ninfo() - ninfo.csig = SCons.Util.MD5signature(self.get_contents()) - return self.ninfo.csig - - def get_cachedir_csig(self): - return self.get_csig() - - def store_info(self): - """Make the build signature permanent (that is, store it in the - .sconsign file or equivalent).""" - pass - - def do_not_store_info(self): - pass - - def get_stored_info(self): - return None - - def get_stored_implicit(self): - """Fetch the stored implicit dependencies""" - return None - - # - # - # - - def set_precious(self, precious = 1): - """Set the Node's precious value.""" - self.precious = precious - - def set_noclean(self, noclean = 1): - """Set the Node's noclean value.""" - # Make sure noclean is an integer so the --debug=stree - # output in Util.py can use it as an index. - self.noclean = noclean and 1 or 0 - - def set_nocache(self, nocache = 1): - """Set the Node's nocache value.""" - # Make sure nocache is an integer so the --debug=stree - # output in Util.py can use it as an index. - self.nocache = nocache and 1 or 0 - - def set_always_build(self, always_build = 1): - """Set the Node's always_build value.""" - self.always_build = always_build - - def exists(self): - """Does this node exists?""" - # All node exist by default: - return 1 - - def rexists(self): - """Does this node exist locally or in a repositiory?""" - # There are no repositories by default: - return self.exists() - - def missing(self): - return not self.is_derived() and \ - not self.linked and \ - not self.rexists() - - def remove(self): - """Remove this Node: no-op by default.""" - return None - - def add_dependency(self, depend): - """Adds dependencies.""" - try: - self._add_child(self.depends, self.depends_set, depend) - except TypeError, e: - e = e.args[0] - if SCons.Util.is_List(e): - s = map(str, e) - else: - s = str(e) - raise SCons.Errors.UserError("attempted to add a non-Node dependency to %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e))) - - def add_prerequisite(self, prerequisite): - """Adds prerequisites""" - self.prerequisites.extend(prerequisite) - self._children_reset() - - def add_ignore(self, depend): - """Adds dependencies to ignore.""" - try: - self._add_child(self.ignore, self.ignore_set, depend) - except TypeError, e: - e = e.args[0] - if SCons.Util.is_List(e): - s = map(str, e) - else: - s = str(e) - raise SCons.Errors.UserError("attempted to ignore a non-Node dependency of %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e))) - - def add_source(self, source): - """Adds sources.""" - if self._specific_sources: - return - try: - self._add_child(self.sources, self.sources_set, source) - except TypeError, e: - e = e.args[0] - if SCons.Util.is_List(e): - s = map(str, e) - else: - s = str(e) - raise SCons.Errors.UserError("attempted to add a non-Node as source of %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e))) - - def _add_child(self, collection, set, child): - """Adds 'child' to 'collection', first checking 'set' to see if it's - already present.""" - #if type(child) is not type([]): - # child = [child] - #for c in child: - # if not isinstance(c, Node): - # raise TypeError, c - added = None - for c in child: - if c not in set: - set.add(c) - collection.append(c) - added = 1 - if added: - self._children_reset() - - def set_specific_source(self, source): - self.add_source(source) - self._specific_sources = True - - def add_wkid(self, wkid): - """Add a node to the list of kids waiting to be evaluated""" - if self.wkids != None: - self.wkids.append(wkid) - - def _children_reset(self): - self.clear_memoized_values() - # We need to let the Executor clear out any calculated - # build info that it's cached so we can re-calculate it. - self.executor_cleanup() - - memoizer_counters.append(SCons.Memoize.CountValue('_children_get')) - - def _children_get(self): - try: - return self._memo['children_get'] - except KeyError: - pass - - # The return list may contain duplicate Nodes, especially in - # source trees where there are a lot of repeated #includes - # of a tangle of .h files. Profiling shows, however, that - # eliminating the duplicates with a brute-force approach that - # preserves the order (that is, something like: - # - # u = [] - # for n in list: - # if n not in u: - # u.append(n)" - # - # takes more cycles than just letting the underlying methods - # hand back cached values if a Node's information is requested - # multiple times. (Other methods of removing duplicates, like - # using dictionary keys, lose the order, and the only ordered - # dictionary patterns I found all ended up using "not in" - # internally anyway...) - if self.ignore_set: - if self.implicit is None: - iter = chain(self.sources,self.depends) - else: - iter = chain(self.sources, self.depends, self.implicit) - - children = [] - for i in iter: - if i not in self.ignore_set: - children.append(i) - else: - if self.implicit is None: - children = self.sources + self.depends - else: - children = self.sources + self.depends + self.implicit - - self._memo['children_get'] = children - return children - - def all_children(self, scan=1): - """Return a list of all the node's direct children.""" - if scan: - self.scan() - - # The return list may contain duplicate Nodes, especially in - # source trees where there are a lot of repeated #includes - # of a tangle of .h files. Profiling shows, however, that - # eliminating the duplicates with a brute-force approach that - # preserves the order (that is, something like: - # - # u = [] - # for n in list: - # if n not in u: - # u.append(n)" - # - # takes more cycles than just letting the underlying methods - # hand back cached values if a Node's information is requested - # multiple times. (Other methods of removing duplicates, like - # using dictionary keys, lose the order, and the only ordered - # dictionary patterns I found all ended up using "not in" - # internally anyway...) - if self.implicit is None: - return self.sources + self.depends - else: - return self.sources + self.depends + self.implicit - - def children(self, scan=1): - """Return a list of the node's direct children, minus those - that are ignored by this node.""" - if scan: - self.scan() - return self._children_get() - - def set_state(self, state): - self.state = state - - def get_state(self): - return self.state - - def state_has_changed(self, target, prev_ni): - return (self.state != SCons.Node.up_to_date) - - def get_env(self): - env = self.env - if not env: - import SCons.Defaults - env = SCons.Defaults.DefaultEnvironment() - return env - - def changed_since_last_build(self, target, prev_ni): - """ - - Must be overridden in a specific subclass to return True if this - Node (a dependency) has changed since the last time it was used - to build the specified target. prev_ni is this Node's state (for - example, its file timestamp, length, maybe content signature) - as of the last time the target was built. - - Note that this method is called through the dependency, not the - target, because a dependency Node must be able to use its own - logic to decide if it changed. For example, File Nodes need to - obey if we're configured to use timestamps, but Python Value Nodes - never use timestamps and always use the content. If this method - were called through the target, then each Node's implementation - of this method would have to have more complicated logic to - handle all the different Node types on which it might depend. - """ - raise NotImplementedError - - def Decider(self, function): - SCons.Util.AddMethod(self, function, 'changed_since_last_build') - - def changed(self, node=None): - """ - Returns if the node is up-to-date with respect to the BuildInfo - stored last time it was built. The default behavior is to compare - it against our own previously stored BuildInfo, but the stored - BuildInfo from another Node (typically one in a Repository) - can be used instead. - - Note that we now *always* check every dependency. We used to - short-circuit the check by returning as soon as we detected - any difference, but we now rely on checking every dependency - to make sure that any necessary Node information (for example, - the content signature of an #included .h file) is updated. - """ - t = 0 - if t: Trace('changed(%s [%s], %s)' % (self, classname(self), node)) - if node is None: - node = self - - result = False - - bi = node.get_stored_info().binfo - then = bi.bsourcesigs + bi.bdependsigs + bi.bimplicitsigs - children = self.children() - - diff = len(children) - len(then) - if diff: - # The old and new dependency lists are different lengths. - # This always indicates that the Node must be rebuilt. - # We also extend the old dependency list with enough None - # entries to equal the new dependency list, for the benefit - # of the loop below that updates node information. - then.extend([None] * diff) - if t: Trace(': old %s new %s' % (len(then), len(children))) - result = True - - for child, prev_ni in izip(children, then): - if child.changed_since_last_build(self, prev_ni): - if t: Trace(': %s changed' % child) - result = True - - contents = self.get_executor().get_contents() - if self.has_builder(): - import SCons.Util - newsig = SCons.Util.MD5signature(contents) - if bi.bactsig != newsig: - if t: Trace(': bactsig %s != newsig %s' % (bi.bactsig, newsig)) - result = True - - if not result: - if t: Trace(': up to date') - - if t: Trace('\n') - - return result - - def is_up_to_date(self): - """Default check for whether the Node is current: unknown Node - subtypes are always out of date, so they will always get built.""" - return None - - def children_are_up_to_date(self): - """Alternate check for whether the Node is current: If all of - our children were up-to-date, then this Node was up-to-date, too. - - The SCons.Node.Alias and SCons.Node.Python.Value subclasses - rebind their current() method to this method.""" - # Allow the children to calculate their signatures. - self.binfo = self.get_binfo() - if self.always_build: - return None - state = 0 - for kid in self.children(None): - s = kid.get_state() - if s and (not state or s > state): - state = s - return (state == 0 or state == SCons.Node.up_to_date) - - def is_literal(self): - """Always pass the string representation of a Node to - the command interpreter literally.""" - return 1 - - def render_include_tree(self): - """ - Return a text representation, suitable for displaying to the - user, of the include tree for the sources of this node. - """ - if self.is_derived() and self.env: - env = self.get_build_env() - for s in self.sources: - scanner = self.get_source_scanner(s) - if scanner: - path = self.get_build_scanner_path(scanner) - else: - path = None - def f(node, env=env, scanner=scanner, path=path): - return node.get_found_includes(env, scanner, path) - return SCons.Util.render_tree(s, f, 1) - else: - return None - - def get_abspath(self): - """ - Return an absolute path to the Node. This will return simply - str(Node) by default, but for Node types that have a concept of - relative path, this might return something different. - """ - return str(self) - - def for_signature(self): - """ - Return a string representation of the Node that will always - be the same for this particular Node, no matter what. This - is by contrast to the __str__() method, which might, for - instance, return a relative path for a file Node. The purpose - of this method is to generate a value to be used in signature - calculation for the command line used to build a target, and - we use this method instead of str() to avoid unnecessary - rebuilds. This method does not need to return something that - would actually work in a command line; it can return any kind of - nonsense, so long as it does not change. - """ - return str(self) - - def get_string(self, for_signature): - """This is a convenience function designed primarily to be - used in command generators (i.e., CommandGeneratorActions or - Environment variables that are callable), which are called - with a for_signature argument that is nonzero if the command - generator is being called to generate a signature for the - command line, which determines if we should rebuild or not. - - Such command generators should use this method in preference - to str(Node) when converting a Node to a string, passing - in the for_signature parameter, such that we will call - Node.for_signature() or str(Node) properly, depending on whether - we are calculating a signature or actually constructing a - command line.""" - if for_signature: - return self.for_signature() - return str(self) - - def get_subst_proxy(self): - """ - This method is expected to return an object that will function - exactly like this Node, except that it implements any additional - special features that we would like to be in effect for - Environment variable substitution. The principle use is that - some Nodes would like to implement a __getattr__() method, - but putting that in the Node type itself has a tendency to kill - performance. We instead put it in a proxy and return it from - this method. It is legal for this method to return self - if no new functionality is needed for Environment substitution. - """ - return self - - def explain(self): - if not self.exists(): - return "building `%s' because it doesn't exist\n" % self - - if self.always_build: - return "rebuilding `%s' because AlwaysBuild() is specified\n" % self - - old = self.get_stored_info() - if old is None: - return None - - old = old.binfo - old.prepare_dependencies() - - try: - old_bkids = old.bsources + old.bdepends + old.bimplicit - old_bkidsigs = old.bsourcesigs + old.bdependsigs + old.bimplicitsigs - except AttributeError: - return "Cannot explain why `%s' is being rebuilt: No previous build information found\n" % self - - new = self.get_binfo() - - new_bkids = new.bsources + new.bdepends + new.bimplicit - new_bkidsigs = new.bsourcesigs + new.bdependsigs + new.bimplicitsigs - - osig = dict(izip(old_bkids, old_bkidsigs)) - nsig = dict(izip(new_bkids, new_bkidsigs)) - - # The sources and dependencies we'll want to report are all stored - # as relative paths to this target's directory, but we want to - # report them relative to the top-level SConstruct directory, - # so we only print them after running them through this lambda - # to turn them into the right relative Node and then return - # its string. - def stringify( s, E=self.dir.Entry ) : - if hasattr( s, 'dir' ) : - return str(E(s)) - return str(s) - - lines = [] - - removed = filter(lambda x, nk=new_bkids: not x in nk, old_bkids) - if removed: - removed = map(stringify, removed) - fmt = "`%s' is no longer a dependency\n" - lines.extend(map(lambda s, fmt=fmt: fmt % s, removed)) - - for k in new_bkids: - if not k in old_bkids: - lines.append("`%s' is a new dependency\n" % stringify(k)) - elif k.changed_since_last_build(self, osig[k]): - lines.append("`%s' changed\n" % stringify(k)) - - if len(lines) == 0 and old_bkids != new_bkids: - lines.append("the dependency order changed:\n" + - "%sold: %s\n" % (' '*15, map(stringify, old_bkids)) + - "%snew: %s\n" % (' '*15, map(stringify, new_bkids))) - - if len(lines) == 0: - def fmt_with_title(title, strlines): - lines = string.split(strlines, '\n') - sep = '\n' + ' '*(15 + len(title)) - return ' '*15 + title + string.join(lines, sep) + '\n' - if old.bactsig != new.bactsig: - if old.bact == new.bact: - lines.append("the contents of the build action changed\n" + - fmt_with_title('action: ', new.bact)) - else: - lines.append("the build action changed:\n" + - fmt_with_title('old: ', old.bact) + - fmt_with_title('new: ', new.bact)) - - if len(lines) == 0: - return "rebuilding `%s' for unknown reasons\n" % self - - preamble = "rebuilding `%s' because" % self - if len(lines) == 1: - return "%s %s" % (preamble, lines[0]) - else: - lines = ["%s:\n" % preamble] + lines - return string.join(lines, ' '*11) - -try: - [].extend(UserList.UserList([])) -except TypeError: - # Python 1.5.2 doesn't allow a list to be extended by list-like - # objects (such as UserList instances), so just punt and use - # real lists. - def NodeList(l): - return l -else: - class NodeList(UserList.UserList): - def __str__(self): - return str(map(str, self.data)) - -def get_children(node, parent): return node.children() -def ignore_cycle(node, stack): pass -def do_nothing(node, parent): pass - -class Walker: - """An iterator for walking a Node tree. - - This is depth-first, children are visited before the parent. - The Walker object can be initialized with any node, and - returns the next node on the descent with each next() call. - 'kids_func' is an optional function that will be called to - get the children of a node instead of calling 'children'. - 'cycle_func' is an optional function that will be called - when a cycle is detected. - - This class does not get caught in node cycles caused, for example, - by C header file include loops. - """ - def __init__(self, node, kids_func=get_children, - cycle_func=ignore_cycle, - eval_func=do_nothing): - self.kids_func = kids_func - self.cycle_func = cycle_func - self.eval_func = eval_func - node.wkids = copy.copy(kids_func(node, None)) - self.stack = [node] - self.history = {} # used to efficiently detect and avoid cycles - self.history[node] = None - - def next(self): - """Return the next node for this walk of the tree. - - This function is intentionally iterative, not recursive, - to sidestep any issues of stack size limitations. - """ - - while self.stack: - if self.stack[-1].wkids: - node = self.stack[-1].wkids.pop(0) - if not self.stack[-1].wkids: - self.stack[-1].wkids = None - if self.history.has_key(node): - self.cycle_func(node, self.stack) - else: - node.wkids = copy.copy(self.kids_func(node, self.stack[-1])) - self.stack.append(node) - self.history[node] = None - else: - node = self.stack.pop() - del self.history[node] - if node: - if self.stack: - parent = self.stack[-1] - else: - parent = None - self.eval_func(node, parent) - return node - return None - - def is_done(self): - return not self.stack - - -arg2nodes_lookups = [] - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Options/BoolOption.py b/3rdParty/SCons/scons-local/SCons/Options/BoolOption.py deleted file mode 100644 index f74854a..0000000 --- a/3rdParty/SCons/scons-local/SCons/Options/BoolOption.py +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Options/BoolOption.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -warned = False - -def BoolOption(*args, **kw): - global warned - if not warned: - msg = "The BoolOption() function is deprecated; use the BoolVariable() function instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - return apply(SCons.Variables.BoolVariable, args, kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Options/EnumOption.py b/3rdParty/SCons/scons-local/SCons/Options/EnumOption.py deleted file mode 100644 index 1546ec9..0000000 --- a/3rdParty/SCons/scons-local/SCons/Options/EnumOption.py +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Options/EnumOption.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -warned = False - -def EnumOption(*args, **kw): - global warned - if not warned: - msg = "The EnumOption() function is deprecated; use the EnumVariable() function instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - return apply(SCons.Variables.EnumVariable, args, kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Options/ListOption.py b/3rdParty/SCons/scons-local/SCons/Options/ListOption.py deleted file mode 100644 index fbc7160..0000000 --- a/3rdParty/SCons/scons-local/SCons/Options/ListOption.py +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Options/ListOption.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -warned = False - -def ListOption(*args, **kw): - global warned - if not warned: - msg = "The ListOption() function is deprecated; use the ListVariable() function instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - return apply(SCons.Variables.ListVariable, args, kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Options/PackageOption.py b/3rdParty/SCons/scons-local/SCons/Options/PackageOption.py deleted file mode 100644 index 656c87b..0000000 --- a/3rdParty/SCons/scons-local/SCons/Options/PackageOption.py +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Options/PackageOption.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -warned = False - -def PackageOption(*args, **kw): - global warned - if not warned: - msg = "The PackageOption() function is deprecated; use the PackageVariable() function instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - return apply(SCons.Variables.PackageVariable, args, kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Options/PathOption.py b/3rdParty/SCons/scons-local/SCons/Options/PathOption.py deleted file mode 100644 index afcf919..0000000 --- a/3rdParty/SCons/scons-local/SCons/Options/PathOption.py +++ /dev/null @@ -1,76 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Options/PathOption.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -warned = False - -class _PathOptionClass: - def warn(self): - global warned - if not warned: - msg = "The PathOption() function is deprecated; use the PathVariable() function instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - - def __call__(self, *args, **kw): - self.warn() - return apply(SCons.Variables.PathVariable, args, kw) - - def PathAccept(self, *args, **kw): - self.warn() - return apply(SCons.Variables.PathVariable.PathAccept, args, kw) - - def PathIsDir(self, *args, **kw): - self.warn() - return apply(SCons.Variables.PathVariable.PathIsDir, args, kw) - - def PathIsDirCreate(self, *args, **kw): - self.warn() - return apply(SCons.Variables.PathVariable.PathIsDirCreate, args, kw) - - def PathIsFile(self, *args, **kw): - self.warn() - return apply(SCons.Variables.PathVariable.PathIsFile, args, kw) - - def PathExists(self, *args, **kw): - self.warn() - return apply(SCons.Variables.PathVariable.PathExists, args, kw) - -PathOption = _PathOptionClass() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Options/__init__.py b/3rdParty/SCons/scons-local/SCons/Options/__init__.py deleted file mode 100644 index 053b565..0000000 --- a/3rdParty/SCons/scons-local/SCons/Options/__init__.py +++ /dev/null @@ -1,74 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Options/__init__.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -from BoolOption import BoolOption # okay -from EnumOption import EnumOption # okay -from ListOption import ListOption # naja -from PackageOption import PackageOption # naja -from PathOption import PathOption # okay - -warned = False - -class Options(SCons.Variables.Variables): - def __init__(self, *args, **kw): - global warned - if not warned: - msg = "The Options class is deprecated; use the Variables class instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - apply(SCons.Variables.Variables.__init__, - (self,) + args, - kw) - - def AddOptions(self, *args, **kw): - return apply(SCons.Variables.Variables.AddVariables, - (self,) + args, - kw) - - def UnknownOptions(self, *args, **kw): - return apply(SCons.Variables.Variables.UnknownVariables, - (self,) + args, - kw) - - def FormatOptionHelpText(self, *args, **kw): - return apply(SCons.Variables.Variables.FormatVariableHelpText, - (self,) + args, - kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/PathList.py b/3rdParty/SCons/scons-local/SCons/PathList.py deleted file mode 100644 index 78aafe1..0000000 --- a/3rdParty/SCons/scons-local/SCons/PathList.py +++ /dev/null @@ -1,232 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/PathList.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """SCons.PathList - -A module for handling lists of directory paths (the sort of things -that get set as CPPPATH, LIBPATH, etc.) with as much caching of data and -efficiency as we can while still keeping the evaluation delayed so that we -Do the Right Thing (almost) regardless of how the variable is specified. - -""" - -import os -import string - -import SCons.Memoize -import SCons.Node -import SCons.Util - -# -# Variables to specify the different types of entries in a PathList object: -# - -TYPE_STRING_NO_SUBST = 0 # string with no '$' -TYPE_STRING_SUBST = 1 # string containing '$' -TYPE_OBJECT = 2 # other object - -def node_conv(obj): - """ - This is the "string conversion" routine that we have our substitutions - use to return Nodes, not strings. This relies on the fact that an - EntryProxy object has a get() method that returns the underlying - Node that it wraps, which is a bit of architectural dependence - that we might need to break or modify in the future in response to - additional requirements. - """ - try: - get = obj.get - except AttributeError: - if isinstance(obj, SCons.Node.Node) or SCons.Util.is_Sequence( obj ): - result = obj - else: - result = str(obj) - else: - result = get() - return result - -class _PathList: - """ - An actual PathList object. - """ - def __init__(self, pathlist): - """ - Initializes a PathList object, canonicalizing the input and - pre-processing it for quicker substitution later. - - The stored representation of the PathList is a list of tuples - containing (type, value), where the "type" is one of the TYPE_* - variables defined above. We distinguish between: - - strings that contain no '$' and therefore need no - delayed-evaluation string substitution (we expect that there - will be many of these and that we therefore get a pretty - big win from avoiding string substitution) - - strings that contain '$' and therefore need substitution - (the hard case is things like '${TARGET.dir}/include', - which require re-evaluation for every target + source) - - other objects (which may be something like an EntryProxy - that needs a method called to return a Node) - - Pre-identifying the type of each element in the PathList up-front - and storing the type in the list of tuples is intended to reduce - the amount of calculation when we actually do the substitution - over and over for each target. - """ - if SCons.Util.is_String(pathlist): - pathlist = string.split(pathlist, os.pathsep) - elif not SCons.Util.is_Sequence(pathlist): - pathlist = [pathlist] - - pl = [] - for p in pathlist: - try: - index = string.find(p, '$') - except (AttributeError, TypeError): - type = TYPE_OBJECT - else: - if index == -1: - type = TYPE_STRING_NO_SUBST - else: - type = TYPE_STRING_SUBST - pl.append((type, p)) - - self.pathlist = tuple(pl) - - def __len__(self): return len(self.pathlist) - - def __getitem__(self, i): return self.pathlist[i] - - def subst_path(self, env, target, source): - """ - Performs construction variable substitution on a pre-digested - PathList for a specific target and source. - """ - result = [] - for type, value in self.pathlist: - if type == TYPE_STRING_SUBST: - value = env.subst(value, target=target, source=source, - conv=node_conv) - if SCons.Util.is_Sequence(value): - result.extend(value) - continue - - elif type == TYPE_OBJECT: - value = node_conv(value) - if value: - result.append(value) - return tuple(result) - - -class PathListCache: - """ - A class to handle caching of PathList lookups. - - This class gets instantiated once and then deleted from the namespace, - so it's used as a Singleton (although we don't enforce that in the - usual Pythonic ways). We could have just made the cache a dictionary - in the module namespace, but putting it in this class allows us to - use the same Memoizer pattern that we use elsewhere to count cache - hits and misses, which is very valuable. - - Lookup keys in the cache are computed by the _PathList_key() method. - Cache lookup should be quick, so we don't spend cycles canonicalizing - all forms of the same lookup key. For example, 'x:y' and ['x', - 'y'] logically represent the same list, but we don't bother to - split string representations and treat those two equivalently. - (Note, however, that we do, treat lists and tuples the same.) - - The main type of duplication we're trying to catch will come from - looking up the same path list from two different clones of the - same construction environment. That is, given - - env2 = env1.Clone() - - both env1 and env2 will have the same CPPPATH value, and we can - cheaply avoid re-parsing both values of CPPPATH by using the - common value from this cache. - """ - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - memoizer_counters = [] - - def __init__(self): - self._memo = {} - - def _PathList_key(self, pathlist): - """ - Returns the key for memoization of PathLists. - - Note that we want this to be pretty quick, so we don't completely - canonicalize all forms of the same list. For example, - 'dir1:$ROOT/dir2' and ['$ROOT/dir1', 'dir'] may logically - represent the same list if you're executing from $ROOT, but - we're not going to bother splitting strings into path elements, - or massaging strings into Nodes, to identify that equivalence. - We just want to eliminate obvious redundancy from the normal - case of re-using exactly the same cloned value for a path. - """ - if SCons.Util.is_Sequence(pathlist): - pathlist = tuple(SCons.Util.flatten(pathlist)) - return pathlist - - memoizer_counters.append(SCons.Memoize.CountDict('PathList', _PathList_key)) - - def PathList(self, pathlist): - """ - Returns the cached _PathList object for the specified pathlist, - creating and caching a new object as necessary. - """ - pathlist = self._PathList_key(pathlist) - try: - memo_dict = self._memo['PathList'] - except KeyError: - memo_dict = {} - self._memo['PathList'] = memo_dict - else: - try: - return memo_dict[pathlist] - except KeyError: - pass - - result = _PathList(pathlist) - - memo_dict[pathlist] = result - - return result - -PathList = PathListCache().PathList - - -del PathListCache - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Platform/__init__.py b/3rdParty/SCons/scons-local/SCons/Platform/__init__.py deleted file mode 100644 index 9c23554..0000000 --- a/3rdParty/SCons/scons-local/SCons/Platform/__init__.py +++ /dev/null @@ -1,233 +0,0 @@ -"""SCons.Platform - -SCons platform selection. - -This looks for modules that define a callable object that can modify a -construction environment as appropriate for a given platform. - -Note that we take a more simplistic view of "platform" than Python does. -We're looking for a single string that determines a set of -tool-independent variables with which to initialize a construction -environment. Consequently, we'll examine both sys.platform and os.name -(and anything else that might come in to play) in order to return some -specification which is unique enough for our purposes. - -Note that because this subsysem just *selects* a callable that can -modify a construction environment, it's possible for people to define -their own "platform specification" in an arbitrary callable function. -No one needs to use or tie in to this subsystem in order to roll -their own platform definition. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Platform/__init__.py 4043 2009/02/23 09:06:45 scons" - -import imp -import os -import string -import sys -import tempfile - -import SCons.Errors -import SCons.Subst -import SCons.Tool - -def platform_default(): - """Return the platform string for our execution environment. - - The returned value should map to one of the SCons/Platform/*.py - files. Since we're architecture independent, though, we don't - care about the machine architecture. - """ - osname = os.name - if osname == 'java': - osname = os._osType - if osname == 'posix': - if sys.platform == 'cygwin': - return 'cygwin' - elif string.find(sys.platform, 'irix') != -1: - return 'irix' - elif string.find(sys.platform, 'sunos') != -1: - return 'sunos' - elif string.find(sys.platform, 'hp-ux') != -1: - return 'hpux' - elif string.find(sys.platform, 'aix') != -1: - return 'aix' - elif string.find(sys.platform, 'darwin') != -1: - return 'darwin' - else: - return 'posix' - elif os.name == 'os2': - return 'os2' - else: - return sys.platform - -def platform_module(name = platform_default()): - """Return the imported module for the platform. - - This looks for a module name that matches the specified argument. - If the name is unspecified, we fetch the appropriate default for - our execution environment. - """ - full_name = 'SCons.Platform.' + name - if not sys.modules.has_key(full_name): - if os.name == 'java': - eval(full_name) - else: - try: - file, path, desc = imp.find_module(name, - sys.modules['SCons.Platform'].__path__) - try: - mod = imp.load_module(full_name, file, path, desc) - finally: - if file: - file.close() - except ImportError: - try: - import zipimport - importer = zipimport.zipimporter( sys.modules['SCons.Platform'].__path__[0] ) - mod = importer.load_module(full_name) - except ImportError: - raise SCons.Errors.UserError, "No platform named '%s'" % name - setattr(SCons.Platform, name, mod) - return sys.modules[full_name] - -def DefaultToolList(platform, env): - """Select a default tool list for the specified platform. - """ - return SCons.Tool.tool_list(platform, env) - -class PlatformSpec: - def __init__(self, name): - self.name = name - - def __str__(self): - return self.name - -class TempFileMunge: - """A callable class. You can set an Environment variable to this, - then call it with a string argument, then it will perform temporary - file substitution on it. This is used to circumvent the long command - line limitation. - - Example usage: - env["TEMPFILE"] = TempFileMunge - env["LINKCOM"] = "${TEMPFILE('$LINK $TARGET $SOURCES')}" - - By default, the name of the temporary file used begins with a - prefix of '@'. This may be configred for other tool chains by - setting '$TEMPFILEPREFIX'. - - env["TEMPFILEPREFIX"] = '-@' # diab compiler - env["TEMPFILEPREFIX"] = '-via' # arm tool chain - """ - def __init__(self, cmd): - self.cmd = cmd - - def __call__(self, target, source, env, for_signature): - if for_signature: - # If we're being called for signature calculation, it's - # because we're being called by the string expansion in - # Subst.py, which has the logic to strip any $( $) that - # may be in the command line we squirreled away. So we - # just return the raw command line and let the upper - # string substitution layers do their thing. - return self.cmd - - # Now we're actually being called because someone is actually - # going to try to execute the command, so we have to do our - # own expansion. - cmd = env.subst_list(self.cmd, SCons.Subst.SUBST_CMD, target, source)[0] - try: - maxline = int(env.subst('$MAXLINELENGTH')) - except ValueError: - maxline = 2048 - - if (reduce(lambda x, y: x + len(y), cmd, 0) + len(cmd)) <= maxline: - return self.cmd - - # We do a normpath because mktemp() has what appears to be - # a bug in Windows that will use a forward slash as a path - # delimiter. Windows's link mistakes that for a command line - # switch and barfs. - # - # We use the .lnk suffix for the benefit of the Phar Lap - # linkloc linker, which likes to append an .lnk suffix if - # none is given. - tmp = os.path.normpath(tempfile.mktemp('.lnk')) - native_tmp = SCons.Util.get_native_path(tmp) - - if env['SHELL'] and env['SHELL'] == 'sh': - # The sh shell will try to escape the backslashes in the - # path, so unescape them. - native_tmp = string.replace(native_tmp, '\\', r'\\\\') - # In Cygwin, we want to use rm to delete the temporary - # file, because del does not exist in the sh shell. - rm = env.Detect('rm') or 'del' - else: - # Don't use 'rm' if the shell is not sh, because rm won't - # work with the Windows shells (cmd.exe or command.com) or - # Windows path names. - rm = 'del' - - prefix = env.subst('$TEMPFILEPREFIX') - if not prefix: - prefix = '@' - - args = map(SCons.Subst.quote_spaces, cmd[1:]) - open(tmp, 'w').write(string.join(args, " ") + "\n") - # XXX Using the SCons.Action.print_actions value directly - # like this is bogus, but expedient. This class should - # really be rewritten as an Action that defines the - # __call__() and strfunction() methods and lets the - # normal action-execution logic handle whether or not to - # print/execute the action. The problem, though, is all - # of that is decided before we execute this method as - # part of expanding the $TEMPFILE construction variable. - # Consequently, refactoring this will have to wait until - # we get more flexible with allowing Actions to exist - # independently and get strung together arbitrarily like - # Ant tasks. In the meantime, it's going to be more - # user-friendly to not let obsession with architectural - # purity get in the way of just being helpful, so we'll - # reach into SCons.Action directly. - if SCons.Action.print_actions: - print("Using tempfile "+native_tmp+" for command line:\n"+ - str(cmd[0]) + " " + string.join(args," ")) - return [ cmd[0], prefix + native_tmp + '\n' + rm, native_tmp ] - -def Platform(name = platform_default()): - """Select a canned Platform specification. - """ - module = platform_module(name) - spec = PlatformSpec(name) - spec.__call__ = module.generate - return spec - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Platform/aix.py b/3rdParty/SCons/scons-local/SCons/Platform/aix.py deleted file mode 100644 index c3f5d0f..0000000 --- a/3rdParty/SCons/scons-local/SCons/Platform/aix.py +++ /dev/null @@ -1,70 +0,0 @@ -"""engine.SCons.Platform.aix - -Platform-specific initialization for IBM AIX systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Platform/aix.py 4043 2009/02/23 09:06:45 scons" - -import os -import string - -import posix - -def get_xlc(env, xlc=None, xlc_r=None, packages=[]): - # Use the AIX package installer tool lslpp to figure out where a - # given xl* compiler is installed and what version it is. - xlcPath = None - xlcVersion = None - - if xlc is None: - xlc = env.get('CC', 'xlc') - if xlc_r is None: - xlc_r = xlc + '_r' - for package in packages: - cmd = "lslpp -fc " + package + " 2>/dev/null | egrep '" + xlc + "([^-_a-zA-Z0-9].*)?$'" - line = os.popen(cmd).readline() - if line: - v, p = string.split(line, ':')[1:3] - xlcVersion = string.split(v)[1] - xlcPath = string.split(p)[0] - xlcPath = xlcPath[:xlcPath.rindex('/')] - break - return (xlcPath, xlc, xlc_r, xlcVersion) - -def generate(env): - posix.generate(env) - #Based on AIX 5.2: ARG_MAX=24576 - 3000 for environment expansion - env['MAXLINELENGTH'] = 21576 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Platform/cygwin.py b/3rdParty/SCons/scons-local/SCons/Platform/cygwin.py deleted file mode 100644 index cdc516d..0000000 --- a/3rdParty/SCons/scons-local/SCons/Platform/cygwin.py +++ /dev/null @@ -1,55 +0,0 @@ -"""SCons.Platform.cygwin - -Platform-specific initialization for Cygwin systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Platform/cygwin.py 4043 2009/02/23 09:06:45 scons" - -import posix -from SCons.Platform import TempFileMunge - -def generate(env): - posix.generate(env) - - env['PROGPREFIX'] = '' - env['PROGSUFFIX'] = '.exe' - env['SHLIBPREFIX'] = '' - env['SHLIBSUFFIX'] = '.dll' - env['LIBPREFIXES'] = [ '$LIBPREFIX', '$SHLIBPREFIX' ] - env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ] - env['TEMPFILE'] = TempFileMunge - env['TEMPFILEPREFIX'] = '@' - env['MAXLINELENGTH'] = 2048 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Platform/darwin.py b/3rdParty/SCons/scons-local/SCons/Platform/darwin.py deleted file mode 100644 index a92b2f1..0000000 --- a/3rdParty/SCons/scons-local/SCons/Platform/darwin.py +++ /dev/null @@ -1,46 +0,0 @@ -"""engine.SCons.Platform.darwin - -Platform-specific initialization for Mac OS X systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Platform/darwin.py 4043 2009/02/23 09:06:45 scons" - -import posix - -def generate(env): - posix.generate(env) - env['SHLIBSUFFIX'] = '.dylib' - env['ENV']['PATH'] = env['ENV']['PATH'] + ':/sw/bin' - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Platform/hpux.py b/3rdParty/SCons/scons-local/SCons/Platform/hpux.py deleted file mode 100644 index aa90e71..0000000 --- a/3rdParty/SCons/scons-local/SCons/Platform/hpux.py +++ /dev/null @@ -1,46 +0,0 @@ -"""engine.SCons.Platform.hpux - -Platform-specific initialization for HP-UX systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Platform/hpux.py 4043 2009/02/23 09:06:45 scons" - -import posix - -def generate(env): - posix.generate(env) - #Based on HP-UX11i: ARG_MAX=2048000 - 3000 for environment expansion - env['MAXLINELENGTH'] = 2045000 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Platform/irix.py b/3rdParty/SCons/scons-local/SCons/Platform/irix.py deleted file mode 100644 index a20a7de..0000000 --- a/3rdParty/SCons/scons-local/SCons/Platform/irix.py +++ /dev/null @@ -1,44 +0,0 @@ -"""SCons.Platform.irix - -Platform-specific initialization for SGI IRIX systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Platform/irix.py 4043 2009/02/23 09:06:45 scons" - -import posix - -def generate(env): - posix.generate(env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Platform/os2.py b/3rdParty/SCons/scons-local/SCons/Platform/os2.py deleted file mode 100644 index f8fa379..0000000 --- a/3rdParty/SCons/scons-local/SCons/Platform/os2.py +++ /dev/null @@ -1,55 +0,0 @@ -"""SCons.Platform.os2 - -Platform-specific initialization for OS/2 systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Platform/os2.py 4043 2009/02/23 09:06:45 scons" - -def generate(env): - if not env.has_key('ENV'): - env['ENV'] = {} - env['OBJPREFIX'] = '' - env['OBJSUFFIX'] = '.obj' - env['SHOBJPREFIX'] = '$OBJPREFIX' - env['SHOBJSUFFIX'] = '$OBJSUFFIX' - env['PROGPREFIX'] = '' - env['PROGSUFFIX'] = '.exe' - env['LIBPREFIX'] = '' - env['LIBSUFFIX'] = '.lib' - env['SHLIBPREFIX'] = '' - env['SHLIBSUFFIX'] = '.dll' - env['LIBPREFIXES'] = '$LIBPREFIX' - env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ] - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Platform/posix.py b/3rdParty/SCons/scons-local/SCons/Platform/posix.py deleted file mode 100644 index 0a31dd6..0000000 --- a/3rdParty/SCons/scons-local/SCons/Platform/posix.py +++ /dev/null @@ -1,264 +0,0 @@ -"""SCons.Platform.posix - -Platform-specific initialization for POSIX (Linux, UNIX, etc.) systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Platform/posix.py 4043 2009/02/23 09:06:45 scons" - -import errno -import os -import os.path -import string -import subprocess -import sys -import select - -import SCons.Util -from SCons.Platform import TempFileMunge - -exitvalmap = { - 2 : 127, - 13 : 126, -} - -def escape(arg): - "escape shell special characters" - slash = '\\' - special = '"$()' - - arg = string.replace(arg, slash, slash+slash) - for c in special: - arg = string.replace(arg, c, slash+c) - - return '"' + arg + '"' - -def exec_system(l, env): - stat = os.system(string.join(l)) - if stat & 0xff: - return stat | 0x80 - return stat >> 8 - -def exec_spawnvpe(l, env): - stat = os.spawnvpe(os.P_WAIT, l[0], l, env) - # os.spawnvpe() returns the actual exit code, not the encoding - # returned by os.waitpid() or os.system(). - return stat - -def exec_fork(l, env): - pid = os.fork() - if not pid: - # Child process. - exitval = 127 - try: - os.execvpe(l[0], l, env) - except OSError, e: - exitval = exitvalmap.get(e[0], e[0]) - sys.stderr.write("scons: %s: %s\n" % (l[0], e[1])) - os._exit(exitval) - else: - # Parent process. - pid, stat = os.waitpid(pid, 0) - if stat & 0xff: - return stat | 0x80 - return stat >> 8 - -def _get_env_command(sh, escape, cmd, args, env): - s = string.join(args) - if env: - l = ['env', '-'] + \ - map(lambda t, e=escape: e(t[0])+'='+e(t[1]), env.items()) + \ - [sh, '-c', escape(s)] - s = string.join(l) - return s - -def env_spawn(sh, escape, cmd, args, env): - return exec_system([_get_env_command( sh, escape, cmd, args, env)], env) - -def spawnvpe_spawn(sh, escape, cmd, args, env): - return exec_spawnvpe([sh, '-c', string.join(args)], env) - -def fork_spawn(sh, escape, cmd, args, env): - return exec_fork([sh, '-c', string.join(args)], env) - -def process_cmd_output(cmd_stdout, cmd_stderr, stdout, stderr): - stdout_eof = stderr_eof = 0 - while not (stdout_eof and stderr_eof): - try: - (i,o,e) = select.select([cmd_stdout, cmd_stderr], [], []) - if cmd_stdout in i: - str = cmd_stdout.read() - if len(str) == 0: - stdout_eof = 1 - elif stdout != None: - stdout.write(str) - if cmd_stderr in i: - str = cmd_stderr.read() - if len(str) == 0: - #sys.__stderr__.write( "stderr_eof=1\n" ) - stderr_eof = 1 - else: - #sys.__stderr__.write( "str(stderr) = %s\n" % str ) - stderr.write(str) - except select.error, (_errno, _strerror): - if _errno != errno.EINTR: - raise - -def exec_popen3(l, env, stdout, stderr): - proc = subprocess.Popen(string.join(l), - stdout=stdout, - stderr=stderr, - shell=True) - stat = proc.wait() - if stat & 0xff: - return stat | 0x80 - return stat >> 8 - -def exec_piped_fork(l, env, stdout, stderr): - # spawn using fork / exec and providing a pipe for the command's - # stdout / stderr stream - if stdout != stderr: - (rFdOut, wFdOut) = os.pipe() - (rFdErr, wFdErr) = os.pipe() - else: - (rFdOut, wFdOut) = os.pipe() - rFdErr = rFdOut - wFdErr = wFdOut - # do the fork - pid = os.fork() - if not pid: - # Child process - os.close( rFdOut ) - if rFdOut != rFdErr: - os.close( rFdErr ) - os.dup2( wFdOut, 1 ) # is there some symbolic way to do that ? - os.dup2( wFdErr, 2 ) - os.close( wFdOut ) - if stdout != stderr: - os.close( wFdErr ) - exitval = 127 - try: - os.execvpe(l[0], l, env) - except OSError, e: - exitval = exitvalmap.get(e[0], e[0]) - stderr.write("scons: %s: %s\n" % (l[0], e[1])) - os._exit(exitval) - else: - # Parent process - pid, stat = os.waitpid(pid, 0) - os.close( wFdOut ) - if stdout != stderr: - os.close( wFdErr ) - childOut = os.fdopen( rFdOut ) - if stdout != stderr: - childErr = os.fdopen( rFdErr ) - else: - childErr = childOut - process_cmd_output(childOut, childErr, stdout, stderr) - os.close( rFdOut ) - if stdout != stderr: - os.close( rFdErr ) - if stat & 0xff: - return stat | 0x80 - return stat >> 8 - -def piped_env_spawn(sh, escape, cmd, args, env, stdout, stderr): - # spawn using Popen3 combined with the env command - # the command name and the command's stdout is written to stdout - # the command's stderr is written to stderr - return exec_popen3([_get_env_command(sh, escape, cmd, args, env)], - env, stdout, stderr) - -def piped_fork_spawn(sh, escape, cmd, args, env, stdout, stderr): - # spawn using fork / exec and providing a pipe for the command's - # stdout / stderr stream - return exec_piped_fork([sh, '-c', string.join(args)], - env, stdout, stderr) - - - -def generate(env): - # If os.spawnvpe() exists, we use it to spawn commands. Otherwise - # if the env utility exists, we use os.system() to spawn commands, - # finally we fall back on os.fork()/os.exec(). - # - # os.spawnvpe() is prefered because it is the most efficient. But - # for Python versions without it, os.system() is prefered because it - # is claimed that it works better with threads (i.e. -j) and is more - # efficient than forking Python. - # - # NB: Other people on the scons-users mailing list have claimed that - # os.fork()/os.exec() works better than os.system(). There may just - # not be a default that works best for all users. - - if os.__dict__.has_key('spawnvpe'): - spawn = spawnvpe_spawn - elif env.Detect('env'): - spawn = env_spawn - else: - spawn = fork_spawn - - if env.Detect('env'): - pspawn = piped_env_spawn - else: - pspawn = piped_fork_spawn - - if not env.has_key('ENV'): - env['ENV'] = {} - env['ENV']['PATH'] = '/usr/local/bin:/opt/bin:/bin:/usr/bin' - env['OBJPREFIX'] = '' - env['OBJSUFFIX'] = '.o' - env['SHOBJPREFIX'] = '$OBJPREFIX' - env['SHOBJSUFFIX'] = '$OBJSUFFIX' - env['PROGPREFIX'] = '' - env['PROGSUFFIX'] = '' - env['LIBPREFIX'] = 'lib' - env['LIBSUFFIX'] = '.a' - env['SHLIBPREFIX'] = '$LIBPREFIX' - env['SHLIBSUFFIX'] = '.so' - env['LIBPREFIXES'] = [ '$LIBPREFIX' ] - env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ] - env['PSPAWN'] = pspawn - env['SPAWN'] = spawn - env['SHELL'] = 'sh' - env['ESCAPE'] = escape - env['TEMPFILE'] = TempFileMunge - env['TEMPFILEPREFIX'] = '@' - #Based on LINUX: ARG_MAX=ARG_MAX=131072 - 3000 for environment expansion - #Note: specific platforms might rise or lower this value - env['MAXLINELENGTH'] = 128072 - - # This platform supports RPATH specifications. - env['__RPATH'] = '$_RPATH' - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Platform/sunos.py b/3rdParty/SCons/scons-local/SCons/Platform/sunos.py deleted file mode 100644 index 74f298a..0000000 --- a/3rdParty/SCons/scons-local/SCons/Platform/sunos.py +++ /dev/null @@ -1,50 +0,0 @@ -"""engine.SCons.Platform.sunos - -Platform-specific initialization for Sun systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Platform/sunos.py 4043 2009/02/23 09:06:45 scons" - -import posix - -def generate(env): - posix.generate(env) - # Based on sunSparc 8:32bit - # ARG_MAX=1048320 - 3000 for environment expansion - env['MAXLINELENGTH'] = 1045320 - env['PKGINFO'] = 'pkginfo' - env['PKGCHK'] = '/usr/sbin/pkgchk' - env['ENV']['PATH'] = env['ENV']['PATH'] + ':/opt/SUNWspro/bin:/usr/ccs/bin' - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Platform/win32.py b/3rdParty/SCons/scons-local/SCons/Platform/win32.py deleted file mode 100644 index 64b83a7..0000000 --- a/3rdParty/SCons/scons-local/SCons/Platform/win32.py +++ /dev/null @@ -1,337 +0,0 @@ -"""SCons.Platform.win32 - -Platform-specific initialization for Win32 systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Platform/win32.py 4043 2009/02/23 09:06:45 scons" - -import os -import os.path -import string -import sys -import tempfile - -from SCons.Platform.posix import exitvalmap -from SCons.Platform import TempFileMunge -import SCons.Util - - - -try: - import msvcrt - import win32api - import win32con - - msvcrt.get_osfhandle - win32api.SetHandleInformation - win32con.HANDLE_FLAG_INHERIT -except ImportError: - parallel_msg = \ - "you do not seem to have the pywin32 extensions installed;\n" + \ - "\tparallel (-j) builds may not work reliably with open Python files." -except AttributeError: - parallel_msg = \ - "your pywin32 extensions do not support file handle operations;\n" + \ - "\tparallel (-j) builds may not work reliably with open Python files." -else: - parallel_msg = None - - import __builtin__ - - _builtin_file = __builtin__.file - _builtin_open = __builtin__.open - - def _scons_file(*args, **kw): - fp = apply(_builtin_file, args, kw) - win32api.SetHandleInformation(msvcrt.get_osfhandle(fp.fileno()), - win32con.HANDLE_FLAG_INHERIT, - 0) - return fp - - def _scons_open(*args, **kw): - fp = apply(_builtin_open, args, kw) - win32api.SetHandleInformation(msvcrt.get_osfhandle(fp.fileno()), - win32con.HANDLE_FLAG_INHERIT, - 0) - return fp - - __builtin__.file = _scons_file - __builtin__.open = _scons_open - - - -# The upshot of all this is that, if you are using Python 1.5.2, -# you had better have cmd or command.com in your PATH when you run -# scons. - -def piped_spawn(sh, escape, cmd, args, env, stdout, stderr): - # There is no direct way to do that in python. What we do - # here should work for most cases: - # In case stdout (stderr) is not redirected to a file, - # we redirect it into a temporary file tmpFileStdout - # (tmpFileStderr) and copy the contents of this file - # to stdout (stderr) given in the argument - if not sh: - sys.stderr.write("scons: Could not find command interpreter, is it in your PATH?\n") - return 127 - else: - # one temporary file for stdout and stderr - tmpFileStdout = os.path.normpath(tempfile.mktemp()) - tmpFileStderr = os.path.normpath(tempfile.mktemp()) - - # check if output is redirected - stdoutRedirected = 0 - stderrRedirected = 0 - for arg in args: - # are there more possibilities to redirect stdout ? - if (string.find( arg, ">", 0, 1 ) != -1 or - string.find( arg, "1>", 0, 2 ) != -1): - stdoutRedirected = 1 - # are there more possibilities to redirect stderr ? - if string.find( arg, "2>", 0, 2 ) != -1: - stderrRedirected = 1 - - # redirect output of non-redirected streams to our tempfiles - if stdoutRedirected == 0: - args.append(">" + str(tmpFileStdout)) - if stderrRedirected == 0: - args.append("2>" + str(tmpFileStderr)) - - # actually do the spawn - try: - args = [sh, '/C', escape(string.join(args)) ] - ret = os.spawnve(os.P_WAIT, sh, args, env) - except OSError, e: - # catch any error - try: - ret = exitvalmap[e[0]] - except KeyError: - sys.stderr.write("scons: unknown OSError exception code %d - %s: %s\n" % (e[0], cmd, e[1])) - if stderr != None: - stderr.write("scons: %s: %s\n" % (cmd, e[1])) - # copy child output from tempfiles to our streams - # and do clean up stuff - if stdout != None and stdoutRedirected == 0: - try: - stdout.write(open( tmpFileStdout, "r" ).read()) - os.remove( tmpFileStdout ) - except (IOError, OSError): - pass - - if stderr != None and stderrRedirected == 0: - try: - stderr.write(open( tmpFileStderr, "r" ).read()) - os.remove( tmpFileStderr ) - except (IOError, OSError): - pass - return ret - -def exec_spawn(l, env): - try: - result = os.spawnve(os.P_WAIT, l[0], l, env) - except OSError, e: - try: - result = exitvalmap[e[0]] - sys.stderr.write("scons: %s: %s\n" % (l[0], e[1])) - except KeyError: - result = 127 - if len(l) > 2: - if len(l[2]) < 1000: - command = string.join(l[0:3]) - else: - command = l[0] - else: - command = l[0] - sys.stderr.write("scons: unknown OSError exception code %d - '%s': %s\n" % (e[0], command, e[1])) - return result - -def spawn(sh, escape, cmd, args, env): - if not sh: - sys.stderr.write("scons: Could not find command interpreter, is it in your PATH?\n") - return 127 - return exec_spawn([sh, '/C', escape(string.join(args))], env) - -# Windows does not allow special characters in file names anyway, so no -# need for a complex escape function, we will just quote the arg, except -# that "cmd /c" requires that if an argument ends with a backslash it -# needs to be escaped so as not to interfere with closing double quote -# that we add. -def escape(x): - if x[-1] == '\\': - x = x + '\\' - return '"' + x + '"' - -# Get the windows system directory name -_system_root = None - -def get_system_root(): - global _system_root - if _system_root is not None: - return _system_root - - # A resonable default if we can't read the registry - val = os.environ.get('SystemRoot', "C:/WINDOWS") - - if SCons.Util.can_read_reg: - try: - # Look for Windows NT system root - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Microsoft\\Windows NT\\CurrentVersion') - val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') - except SCons.Util.RegError: - try: - # Okay, try the Windows 9x system root - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Microsoft\\Windows\\CurrentVersion') - val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') - except KeyboardInterrupt: - raise - except: - pass - _system_root = val - return val - -# Get the location of the program files directory -def get_program_files_dir(): - # Now see if we can look in the registry... - val = '' - if SCons.Util.can_read_reg: - try: - # Look for Windows Program Files directory - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Microsoft\\Windows\\CurrentVersion') - val, tok = SCons.Util.RegQueryValueEx(k, 'ProgramFilesDir') - except SCons.Util.RegError: - val = '' - pass - - if val == '': - # A reasonable default if we can't read the registry - # (Actually, it's pretty reasonable even if we can :-) - val = os.path.join(os.path.dirname(get_system_root()),"Program Files") - - return val - -def generate(env): - # Attempt to find cmd.exe (for WinNT/2k/XP) or - # command.com for Win9x - cmd_interp = '' - # First see if we can look in the registry... - if SCons.Util.can_read_reg: - try: - # Look for Windows NT system root - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Microsoft\\Windows NT\\CurrentVersion') - val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') - cmd_interp = os.path.join(val, 'System32\\cmd.exe') - except SCons.Util.RegError: - try: - # Okay, try the Windows 9x system root - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Microsoft\\Windows\\CurrentVersion') - val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') - cmd_interp = os.path.join(val, 'command.com') - except KeyboardInterrupt: - raise - except: - pass - - # For the special case of not having access to the registry, we - # use a temporary path and pathext to attempt to find the command - # interpreter. If we fail, we try to find the interpreter through - # the env's PATH. The problem with that is that it might not - # contain an ENV and a PATH. - if not cmd_interp: - systemroot = get_system_root() - tmp_path = systemroot + os.pathsep + \ - os.path.join(systemroot,'System32') - tmp_pathext = '.com;.exe;.bat;.cmd' - if os.environ.has_key('PATHEXT'): - tmp_pathext = os.environ['PATHEXT'] - cmd_interp = SCons.Util.WhereIs('cmd', tmp_path, tmp_pathext) - if not cmd_interp: - cmd_interp = SCons.Util.WhereIs('command', tmp_path, tmp_pathext) - - if not cmd_interp: - cmd_interp = env.Detect('cmd') - if not cmd_interp: - cmd_interp = env.Detect('command') - - - if not env.has_key('ENV'): - env['ENV'] = {} - - # Import things from the external environment to the construction - # environment's ENV. This is a potential slippery slope, because we - # *don't* want to make builds dependent on the user's environment by - # default. We're doing this for SystemRoot, though, because it's - # needed for anything that uses sockets, and seldom changes, and - # for SystemDrive because it's related. - # - # Weigh the impact carefully before adding other variables to this list. - import_env = [ 'SystemDrive', 'SystemRoot', 'TEMP', 'TMP' ] - for var in import_env: - v = os.environ.get(var) - if v: - env['ENV'][var] = v - - if not env['ENV'].has_key('COMSPEC'): - v = os.environ.get("COMSPEC") - if v: - env['ENV']['COMSPEC'] = v - - env.AppendENVPath('PATH', get_system_root() + '\System32') - - env['ENV']['PATHEXT'] = '.COM;.EXE;.BAT;.CMD' - env['OBJPREFIX'] = '' - env['OBJSUFFIX'] = '.obj' - env['SHOBJPREFIX'] = '$OBJPREFIX' - env['SHOBJSUFFIX'] = '$OBJSUFFIX' - env['PROGPREFIX'] = '' - env['PROGSUFFIX'] = '.exe' - env['LIBPREFIX'] = '' - env['LIBSUFFIX'] = '.lib' - env['SHLIBPREFIX'] = '' - env['SHLIBSUFFIX'] = '.dll' - env['LIBPREFIXES'] = [ '$LIBPREFIX' ] - env['LIBSUFFIXES'] = [ '$LIBSUFFIX' ] - env['PSPAWN'] = piped_spawn - env['SPAWN'] = spawn - env['SHELL'] = cmd_interp - env['TEMPFILE'] = TempFileMunge - env['TEMPFILEPREFIX'] = '@' - env['MAXLINELENGTH'] = 2048 - env['ESCAPE'] = escape - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/SConf.py b/3rdParty/SCons/scons-local/SCons/SConf.py deleted file mode 100644 index 923247c8..0000000 --- a/3rdParty/SCons/scons-local/SCons/SConf.py +++ /dev/null @@ -1,1029 +0,0 @@ -"""SCons.SConf - -Autoconf-like configuration support. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/SConf.py 4043 2009/02/23 09:06:45 scons" - -import os -import re -import string -import StringIO -import sys -import traceback -import types - -import SCons.Action -import SCons.Builder -import SCons.Errors -import SCons.Job -import SCons.Node.FS -import SCons.Taskmaster -import SCons.Util -import SCons.Warnings -import SCons.Conftest - -from SCons.Debug import Trace - -# Turn off the Conftest error logging -SCons.Conftest.LogInputFiles = 0 -SCons.Conftest.LogErrorMessages = 0 - -# Set -build_type = None -build_types = ['clean', 'help'] - -def SetBuildType(type): - global build_type - build_type = type - -# to be set, if we are in dry-run mode -dryrun = 0 - -AUTO=0 # use SCons dependency scanning for up-to-date checks -FORCE=1 # force all tests to be rebuilt -CACHE=2 # force all tests to be taken from cache (raise an error, if necessary) -cache_mode = AUTO - -def SetCacheMode(mode): - """Set the Configure cache mode. mode must be one of "auto", "force", - or "cache".""" - global cache_mode - if mode == "auto": - cache_mode = AUTO - elif mode == "force": - cache_mode = FORCE - elif mode == "cache": - cache_mode = CACHE - else: - raise ValueError, "SCons.SConf.SetCacheMode: Unknown mode " + mode - -progress_display = SCons.Util.display # will be overwritten by SCons.Script -def SetProgressDisplay(display): - """Set the progress display to use (called from SCons.Script)""" - global progress_display - progress_display = display - -SConfFS = None - -_ac_build_counter = 0 # incremented, whenever TryBuild is called -_ac_config_logs = {} # all config.log files created in this build -_ac_config_hs = {} # all config.h files created in this build -sconf_global = None # current sconf object - -def _createConfigH(target, source, env): - t = open(str(target[0]), "w") - defname = re.sub('[^A-Za-z0-9_]', '_', string.upper(str(target[0]))) - t.write("""#ifndef %(DEFNAME)s_SEEN -#define %(DEFNAME)s_SEEN - -""" % {'DEFNAME' : defname}) - t.write(source[0].get_contents()) - t.write(""" -#endif /* %(DEFNAME)s_SEEN */ -""" % {'DEFNAME' : defname}) - t.close() - -def _stringConfigH(target, source, env): - return "scons: Configure: creating " + str(target[0]) - -def CreateConfigHBuilder(env): - """Called just before the building targets phase begins.""" - if len(_ac_config_hs) == 0: - return - action = SCons.Action.Action(_createConfigH, - _stringConfigH) - sconfigHBld = SCons.Builder.Builder(action=action) - env.Append( BUILDERS={'SConfigHBuilder':sconfigHBld} ) - for k in _ac_config_hs.keys(): - env.SConfigHBuilder(k, env.Value(_ac_config_hs[k])) - -class SConfWarning(SCons.Warnings.Warning): - pass -SCons.Warnings.enableWarningClass(SConfWarning) - -# some error definitions -class SConfError(SCons.Errors.UserError): - def __init__(self,msg): - SCons.Errors.UserError.__init__(self,msg) - -class ConfigureDryRunError(SConfError): - """Raised when a file or directory needs to be updated during a Configure - process, but the user requested a dry-run""" - def __init__(self,target): - if not isinstance(target, SCons.Node.FS.File): - msg = 'Cannot create configure directory "%s" within a dry-run.' % str(target) - else: - msg = 'Cannot update configure test "%s" within a dry-run.' % str(target) - SConfError.__init__(self,msg) - -class ConfigureCacheError(SConfError): - """Raised when a use explicitely requested the cache feature, but the test - is run the first time.""" - def __init__(self,target): - SConfError.__init__(self, '"%s" is not yet built and cache is forced.' % str(target)) - -# define actions for building text files -def _createSource( target, source, env ): - fd = open(str(target[0]), "w") - fd.write(source[0].get_contents()) - fd.close() -def _stringSource( target, source, env ): - return (str(target[0]) + ' <-\n |' + - string.replace( source[0].get_contents(), - '\n', "\n |" ) ) - -# python 2.2 introduces types.BooleanType -BooleanTypes = [types.IntType] -if hasattr(types, 'BooleanType'): BooleanTypes.append(types.BooleanType) - -class SConfBuildInfo(SCons.Node.FS.FileBuildInfo): - """ - Special build info for targets of configure tests. Additional members - are result (did the builder succeed last time?) and string, which - contains messages of the original build phase. - """ - result = None # -> 0/None -> no error, != 0 error - string = None # the stdout / stderr output when building the target - - def set_build_result(self, result, string): - self.result = result - self.string = string - - -class Streamer: - """ - 'Sniffer' for a file-like writable object. Similar to the unix tool tee. - """ - def __init__(self, orig): - self.orig = orig - self.s = StringIO.StringIO() - - def write(self, str): - if self.orig: - self.orig.write(str) - self.s.write(str) - - def writelines(self, lines): - for l in lines: - self.write(l + '\n') - - def getvalue(self): - """ - Return everything written to orig since the Streamer was created. - """ - return self.s.getvalue() - - def flush(self): - if self.orig: - self.orig.flush() - self.s.flush() - - -class SConfBuildTask(SCons.Taskmaster.AlwaysTask): - """ - This is almost the same as SCons.Script.BuildTask. Handles SConfErrors - correctly and knows about the current cache_mode. - """ - def display(self, message): - if sconf_global.logstream: - sconf_global.logstream.write("scons: Configure: " + message + "\n") - - def display_cached_string(self, bi): - """ - Logs the original builder messages, given the SConfBuildInfo instance - bi. - """ - if not isinstance(bi, SConfBuildInfo): - SCons.Warnings.warn(SConfWarning, - "The stored build information has an unexpected class: %s" % bi.__class__) - else: - self.display("The original builder output was:\n" + - string.replace(" |" + str(bi.string), - "\n", "\n |")) - - def failed(self): - # check, if the reason was a ConfigureDryRunError or a - # ConfigureCacheError and if yes, reraise the exception - exc_type = self.exc_info()[0] - if issubclass(exc_type, SConfError): - raise - elif issubclass(exc_type, SCons.Errors.BuildError): - # we ignore Build Errors (occurs, when a test doesn't pass) - # Clear the exception to prevent the contained traceback - # to build a reference cycle. - self.exc_clear() - else: - self.display('Caught exception while building "%s":\n' % - self.targets[0]) - try: - excepthook = sys.excepthook - except AttributeError: - # Earlier versions of Python don't have sys.excepthook... - def excepthook(type, value, tb): - traceback.print_tb(tb) - print type, value - apply(excepthook, self.exc_info()) - return SCons.Taskmaster.Task.failed(self) - - def collect_node_states(self): - # returns (is_up_to_date, cached_error, cachable) - # where is_up_to_date is 1, if the node(s) are up_to_date - # cached_error is 1, if the node(s) are up_to_date, but the - # build will fail - # cachable is 0, if some nodes are not in our cache - T = 0 - changed = False - cached_error = False - cachable = True - for t in self.targets: - if T: Trace('%s' % (t)) - bi = t.get_stored_info().binfo - if isinstance(bi, SConfBuildInfo): - if T: Trace(': SConfBuildInfo') - if cache_mode == CACHE: - t.set_state(SCons.Node.up_to_date) - if T: Trace(': set_state(up_to-date)') - else: - if T: Trace(': get_state() %s' % t.get_state()) - if T: Trace(': changed() %s' % t.changed()) - if (t.get_state() != SCons.Node.up_to_date and t.changed()): - changed = True - if T: Trace(': changed %s' % changed) - cached_error = cached_error or bi.result - else: - if T: Trace(': else') - # the node hasn't been built in a SConf context or doesn't - # exist - cachable = False - changed = ( t.get_state() != SCons.Node.up_to_date ) - if T: Trace(': changed %s' % changed) - if T: Trace('\n') - return (not changed, cached_error, cachable) - - def execute(self): - if not self.targets[0].has_builder(): - return - - sconf = sconf_global - - is_up_to_date, cached_error, cachable = self.collect_node_states() - - if cache_mode == CACHE and not cachable: - raise ConfigureCacheError(self.targets[0]) - elif cache_mode == FORCE: - is_up_to_date = 0 - - if cached_error and is_up_to_date: - self.display("Building \"%s\" failed in a previous run and all " - "its sources are up to date." % str(self.targets[0])) - binfo = self.targets[0].get_stored_info().binfo - self.display_cached_string(binfo) - raise SCons.Errors.BuildError # will be 'caught' in self.failed - elif is_up_to_date: - self.display("\"%s\" is up to date." % str(self.targets[0])) - binfo = self.targets[0].get_stored_info().binfo - self.display_cached_string(binfo) - elif dryrun: - raise ConfigureDryRunError(self.targets[0]) - else: - # note stdout and stderr are the same here - s = sys.stdout = sys.stderr = Streamer(sys.stdout) - try: - env = self.targets[0].get_build_env() - if cache_mode == FORCE: - # Set up the Decider() to force rebuilds by saying - # that every source has changed. Note that we still - # call the environment's underlying source decider so - # that the correct .sconsign info will get calculated - # and keep the build state consistent. - def force_build(dependency, target, prev_ni, - env_decider=env.decide_source): - env_decider(dependency, target, prev_ni) - return True - env.Decider(force_build) - env['PSTDOUT'] = env['PSTDERR'] = s - try: - sconf.cached = 0 - self.targets[0].build() - finally: - sys.stdout = sys.stderr = env['PSTDOUT'] = \ - env['PSTDERR'] = sconf.logstream - except KeyboardInterrupt: - raise - except SystemExit: - exc_value = sys.exc_info()[1] - raise SCons.Errors.ExplicitExit(self.targets[0],exc_value.code) - except Exception, e: - for t in self.targets: - binfo = t.get_binfo() - binfo.__class__ = SConfBuildInfo - binfo.set_build_result(1, s.getvalue()) - sconsign_entry = SCons.SConsign.SConsignEntry() - sconsign_entry.binfo = binfo - #sconsign_entry.ninfo = self.get_ninfo() - # We'd like to do this as follows: - # t.store_info(binfo) - # However, we need to store it as an SConfBuildInfo - # object, and store_info() will turn it into a - # regular FileNodeInfo if the target is itself a - # regular File. - sconsign = t.dir.sconsign() - sconsign.set_entry(t.name, sconsign_entry) - sconsign.merge() - raise e - else: - for t in self.targets: - binfo = t.get_binfo() - binfo.__class__ = SConfBuildInfo - binfo.set_build_result(0, s.getvalue()) - sconsign_entry = SCons.SConsign.SConsignEntry() - sconsign_entry.binfo = binfo - #sconsign_entry.ninfo = self.get_ninfo() - # We'd like to do this as follows: - # t.store_info(binfo) - # However, we need to store it as an SConfBuildInfo - # object, and store_info() will turn it into a - # regular FileNodeInfo if the target is itself a - # regular File. - sconsign = t.dir.sconsign() - sconsign.set_entry(t.name, sconsign_entry) - sconsign.merge() - -class SConfBase: - """This is simply a class to represent a configure context. After - creating a SConf object, you can call any tests. After finished with your - tests, be sure to call the Finish() method, which returns the modified - environment. - Some words about caching: In most cases, it is not necessary to cache - Test results explicitely. Instead, we use the scons dependency checking - mechanism. For example, if one wants to compile a test program - (SConf.TryLink), the compiler is only called, if the program dependencies - have changed. However, if the program could not be compiled in a former - SConf run, we need to explicitely cache this error. - """ - - def __init__(self, env, custom_tests = {}, conf_dir='$CONFIGUREDIR', - log_file='$CONFIGURELOG', config_h = None, _depth = 0): - """Constructor. Pass additional tests in the custom_tests-dictinary, - e.g. custom_tests={'CheckPrivate':MyPrivateTest}, where MyPrivateTest - defines a custom test. - Note also the conf_dir and log_file arguments (you may want to - build tests in the VariantDir, not in the SourceDir) - """ - global SConfFS - if not SConfFS: - SConfFS = SCons.Node.FS.default_fs or \ - SCons.Node.FS.FS(env.fs.pathTop) - if not sconf_global is None: - raise (SCons.Errors.UserError, - "Only one SConf object may be active at one time") - self.env = env - if log_file != None: - log_file = SConfFS.File(env.subst(log_file)) - self.logfile = log_file - self.logstream = None - self.lastTarget = None - self.depth = _depth - self.cached = 0 # will be set, if all test results are cached - - # add default tests - default_tests = { - 'CheckCC' : CheckCC, - 'CheckCXX' : CheckCXX, - 'CheckSHCC' : CheckSHCC, - 'CheckSHCXX' : CheckSHCXX, - 'CheckFunc' : CheckFunc, - 'CheckType' : CheckType, - 'CheckTypeSize' : CheckTypeSize, - 'CheckDeclaration' : CheckDeclaration, - 'CheckHeader' : CheckHeader, - 'CheckCHeader' : CheckCHeader, - 'CheckCXXHeader' : CheckCXXHeader, - 'CheckLib' : CheckLib, - 'CheckLibWithHeader' : CheckLibWithHeader, - } - self.AddTests(default_tests) - self.AddTests(custom_tests) - self.confdir = SConfFS.Dir(env.subst(conf_dir)) - if not config_h is None: - config_h = SConfFS.File(config_h) - self.config_h = config_h - self._startup() - - def Finish(self): - """Call this method after finished with your tests: - env = sconf.Finish() - """ - self._shutdown() - return self.env - - def Define(self, name, value = None, comment = None): - """ - Define a pre processor symbol name, with the optional given value in the - current config header. - - If value is None (default), then #define name is written. If value is not - none, then #define name value is written. - - comment is a string which will be put as a C comment in the - header, to explain the meaning of the value (appropriate C comments /* and - */ will be put automatically.""" - lines = [] - if comment: - comment_str = "/* %s */" % comment - lines.append(comment_str) - - if value is not None: - define_str = "#define %s %s" % (name, value) - else: - define_str = "#define %s" % name - lines.append(define_str) - lines.append('') - - self.config_h_text = self.config_h_text + string.join(lines, '\n') - - def BuildNodes(self, nodes): - """ - Tries to build the given nodes immediately. Returns 1 on success, - 0 on error. - """ - if self.logstream != None: - # override stdout / stderr to write in log file - oldStdout = sys.stdout - sys.stdout = self.logstream - oldStderr = sys.stderr - sys.stderr = self.logstream - - # the engine assumes the current path is the SConstruct directory ... - old_fs_dir = SConfFS.getcwd() - old_os_dir = os.getcwd() - SConfFS.chdir(SConfFS.Top, change_os_dir=1) - - # Because we take responsibility here for writing out our - # own .sconsign info (see SConfBuildTask.execute(), above), - # we override the store_info() method with a null place-holder - # so we really control how it gets written. - for n in nodes: - n.store_info = n.do_not_store_info - - ret = 1 - - try: - # ToDo: use user options for calc - save_max_drift = SConfFS.get_max_drift() - SConfFS.set_max_drift(0) - tm = SCons.Taskmaster.Taskmaster(nodes, SConfBuildTask) - # we don't want to build tests in parallel - jobs = SCons.Job.Jobs(1, tm ) - jobs.run() - for n in nodes: - state = n.get_state() - if (state != SCons.Node.executed and - state != SCons.Node.up_to_date): - # the node could not be built. we return 0 in this case - ret = 0 - finally: - SConfFS.set_max_drift(save_max_drift) - os.chdir(old_os_dir) - SConfFS.chdir(old_fs_dir, change_os_dir=0) - if self.logstream != None: - # restore stdout / stderr - sys.stdout = oldStdout - sys.stderr = oldStderr - return ret - - def pspawn_wrapper(self, sh, escape, cmd, args, env): - """Wrapper function for handling piped spawns. - - This looks to the calling interface (in Action.py) like a "normal" - spawn, but associates the call with the PSPAWN variable from - the construction environment and with the streams to which we - want the output logged. This gets slid into the construction - environment as the SPAWN variable so Action.py doesn't have to - know or care whether it's spawning a piped command or not. - """ - return self.pspawn(sh, escape, cmd, args, env, self.logstream, self.logstream) - - - def TryBuild(self, builder, text = None, extension = ""): - """Low level TryBuild implementation. Normally you don't need to - call that - you can use TryCompile / TryLink / TryRun instead - """ - global _ac_build_counter - - # Make sure we have a PSPAWN value, and save the current - # SPAWN value. - try: - self.pspawn = self.env['PSPAWN'] - except KeyError: - raise SCons.Errors.UserError('Missing PSPAWN construction variable.') - try: - save_spawn = self.env['SPAWN'] - except KeyError: - raise SCons.Errors.UserError('Missing SPAWN construction variable.') - - nodesToBeBuilt = [] - - f = "conftest_" + str(_ac_build_counter) - pref = self.env.subst( builder.builder.prefix ) - suff = self.env.subst( builder.builder.suffix ) - target = self.confdir.File(pref + f + suff) - - try: - # Slide our wrapper into the construction environment as - # the SPAWN function. - self.env['SPAWN'] = self.pspawn_wrapper - sourcetext = self.env.Value(text) - - if text != None: - textFile = self.confdir.File(f + extension) - textFileNode = self.env.SConfSourceBuilder(target=textFile, - source=sourcetext) - nodesToBeBuilt.extend(textFileNode) - source = textFileNode - else: - source = None - - nodes = builder(target = target, source = source) - if not SCons.Util.is_List(nodes): - nodes = [nodes] - nodesToBeBuilt.extend(nodes) - result = self.BuildNodes(nodesToBeBuilt) - - finally: - self.env['SPAWN'] = save_spawn - - _ac_build_counter = _ac_build_counter + 1 - if result: - self.lastTarget = nodes[0] - else: - self.lastTarget = None - - return result - - def TryAction(self, action, text = None, extension = ""): - """Tries to execute the given action with optional source file - contents <text> and optional source file extension <extension>, - Returns the status (0 : failed, 1 : ok) and the contents of the - output file. - """ - builder = SCons.Builder.Builder(action=action) - self.env.Append( BUILDERS = {'SConfActionBuilder' : builder} ) - ok = self.TryBuild(self.env.SConfActionBuilder, text, extension) - del self.env['BUILDERS']['SConfActionBuilder'] - if ok: - outputStr = self.lastTarget.get_contents() - return (1, outputStr) - return (0, "") - - def TryCompile( self, text, extension): - """Compiles the program given in text to an env.Object, using extension - as file extension (e.g. '.c'). Returns 1, if compilation was - successful, 0 otherwise. The target is saved in self.lastTarget (for - further processing). - """ - return self.TryBuild(self.env.Object, text, extension) - - def TryLink( self, text, extension ): - """Compiles the program given in text to an executable env.Program, - using extension as file extension (e.g. '.c'). Returns 1, if - compilation was successful, 0 otherwise. The target is saved in - self.lastTarget (for further processing). - """ - return self.TryBuild(self.env.Program, text, extension ) - - def TryRun(self, text, extension ): - """Compiles and runs the program given in text, using extension - as file extension (e.g. '.c'). Returns (1, outputStr) on success, - (0, '') otherwise. The target (a file containing the program's stdout) - is saved in self.lastTarget (for further processing). - """ - ok = self.TryLink(text, extension) - if( ok ): - prog = self.lastTarget - pname = str(prog) - output = SConfFS.File(pname+'.out') - node = self.env.Command(output, prog, [ [ pname, ">", "${TARGET}"] ]) - ok = self.BuildNodes(node) - if ok: - outputStr = output.get_contents() - return( 1, outputStr) - return (0, "") - - class TestWrapper: - """A wrapper around Tests (to ensure sanity)""" - def __init__(self, test, sconf): - self.test = test - self.sconf = sconf - def __call__(self, *args, **kw): - if not self.sconf.active: - raise (SCons.Errors.UserError, - "Test called after sconf.Finish()") - context = CheckContext(self.sconf) - ret = apply(self.test, (context,) + args, kw) - if not self.sconf.config_h is None: - self.sconf.config_h_text = self.sconf.config_h_text + context.config_h - context.Result("error: no result") - return ret - - def AddTest(self, test_name, test_instance): - """Adds test_class to this SConf instance. It can be called with - self.test_name(...)""" - setattr(self, test_name, SConfBase.TestWrapper(test_instance, self)) - - def AddTests(self, tests): - """Adds all the tests given in the tests dictionary to this SConf - instance - """ - for name in tests.keys(): - self.AddTest(name, tests[name]) - - def _createDir( self, node ): - dirName = str(node) - if dryrun: - if not os.path.isdir( dirName ): - raise ConfigureDryRunError(dirName) - else: - if not os.path.isdir( dirName ): - os.makedirs( dirName ) - node._exists = 1 - - def _startup(self): - """Private method. Set up logstream, and set the environment - variables necessary for a piped build - """ - global _ac_config_logs - global sconf_global - global SConfFS - - self.lastEnvFs = self.env.fs - self.env.fs = SConfFS - self._createDir(self.confdir) - self.confdir.up().add_ignore( [self.confdir] ) - - if self.logfile != None and not dryrun: - # truncate logfile, if SConf.Configure is called for the first time - # in a build - if _ac_config_logs.has_key(self.logfile): - log_mode = "a" - else: - _ac_config_logs[self.logfile] = None - log_mode = "w" - fp = open(str(self.logfile), log_mode) - self.logstream = SCons.Util.Unbuffered(fp) - # logfile may stay in a build directory, so we tell - # the build system not to override it with a eventually - # existing file with the same name in the source directory - self.logfile.dir.add_ignore( [self.logfile] ) - - tb = traceback.extract_stack()[-3-self.depth] - old_fs_dir = SConfFS.getcwd() - SConfFS.chdir(SConfFS.Top, change_os_dir=0) - self.logstream.write('file %s,line %d:\n\tConfigure(confdir = %s)\n' % - (tb[0], tb[1], str(self.confdir)) ) - SConfFS.chdir(old_fs_dir) - else: - self.logstream = None - # we use a special builder to create source files from TEXT - action = SCons.Action.Action(_createSource, - _stringSource) - sconfSrcBld = SCons.Builder.Builder(action=action) - self.env.Append( BUILDERS={'SConfSourceBuilder':sconfSrcBld} ) - self.config_h_text = _ac_config_hs.get(self.config_h, "") - self.active = 1 - # only one SConf instance should be active at a time ... - sconf_global = self - - def _shutdown(self): - """Private method. Reset to non-piped spawn""" - global sconf_global, _ac_config_hs - - if not self.active: - raise SCons.Errors.UserError, "Finish may be called only once!" - if self.logstream != None and not dryrun: - self.logstream.write("\n") - self.logstream.close() - self.logstream = None - # remove the SConfSourceBuilder from the environment - blds = self.env['BUILDERS'] - del blds['SConfSourceBuilder'] - self.env.Replace( BUILDERS=blds ) - self.active = 0 - sconf_global = None - if not self.config_h is None: - _ac_config_hs[self.config_h] = self.config_h_text - self.env.fs = self.lastEnvFs - -class CheckContext: - """Provides a context for configure tests. Defines how a test writes to the - screen and log file. - - A typical test is just a callable with an instance of CheckContext as - first argument: - - def CheckCustom(context, ...) - context.Message('Checking my weird test ... ') - ret = myWeirdTestFunction(...) - context.Result(ret) - - Often, myWeirdTestFunction will be one of - context.TryCompile/context.TryLink/context.TryRun. The results of - those are cached, for they are only rebuild, if the dependencies have - changed. - """ - - def __init__(self, sconf): - """Constructor. Pass the corresponding SConf instance.""" - self.sconf = sconf - self.did_show_result = 0 - - # for Conftest.py: - self.vardict = {} - self.havedict = {} - self.headerfilename = None - self.config_h = "" # config_h text will be stored here - # we don't regenerate the config.h file after each test. That means, - # that tests won't be able to include the config.h file, and so - # they can't do an #ifdef HAVE_XXX_H. This shouldn't be a major - # issue, though. If it turns out, that we need to include config.h - # in tests, we must ensure, that the dependencies are worked out - # correctly. Note that we can't use Conftest.py's support for config.h, - # cause we will need to specify a builder for the config.h file ... - - def Message(self, text): - """Inform about what we are doing right now, e.g. - 'Checking for SOMETHING ... ' - """ - self.Display(text) - self.sconf.cached = 1 - self.did_show_result = 0 - - def Result(self, res): - """Inform about the result of the test. res may be an integer or a - string. In case of an integer, the written text will be 'ok' or - 'failed'. - The result is only displayed when self.did_show_result is not set. - """ - if type(res) in BooleanTypes: - if res: - text = "yes" - else: - text = "no" - elif type(res) == types.StringType: - text = res - else: - raise TypeError, "Expected string, int or bool, got " + str(type(res)) - - if self.did_show_result == 0: - # Didn't show result yet, do it now. - self.Display(text + "\n") - self.did_show_result = 1 - - def TryBuild(self, *args, **kw): - return apply(self.sconf.TryBuild, args, kw) - - def TryAction(self, *args, **kw): - return apply(self.sconf.TryAction, args, kw) - - def TryCompile(self, *args, **kw): - return apply(self.sconf.TryCompile, args, kw) - - def TryLink(self, *args, **kw): - return apply(self.sconf.TryLink, args, kw) - - def TryRun(self, *args, **kw): - return apply(self.sconf.TryRun, args, kw) - - def __getattr__( self, attr ): - if( attr == 'env' ): - return self.sconf.env - elif( attr == 'lastTarget' ): - return self.sconf.lastTarget - else: - raise AttributeError, "CheckContext instance has no attribute '%s'" % attr - - #### Stuff used by Conftest.py (look there for explanations). - - def BuildProg(self, text, ext): - self.sconf.cached = 1 - # TODO: should use self.vardict for $CC, $CPPFLAGS, etc. - return not self.TryBuild(self.env.Program, text, ext) - - def CompileProg(self, text, ext): - self.sconf.cached = 1 - # TODO: should use self.vardict for $CC, $CPPFLAGS, etc. - return not self.TryBuild(self.env.Object, text, ext) - - def CompileSharedObject(self, text, ext): - self.sconf.cached = 1 - # TODO: should use self.vardict for $SHCC, $CPPFLAGS, etc. - return not self.TryBuild(self.env.SharedObject, text, ext) - - def RunProg(self, text, ext): - self.sconf.cached = 1 - # TODO: should use self.vardict for $CC, $CPPFLAGS, etc. - st, out = self.TryRun(text, ext) - return not st, out - - def AppendLIBS(self, lib_name_list): - oldLIBS = self.env.get( 'LIBS', [] ) - self.env.Append(LIBS = lib_name_list) - return oldLIBS - - def SetLIBS(self, val): - oldLIBS = self.env.get( 'LIBS', [] ) - self.env.Replace(LIBS = val) - return oldLIBS - - def Display(self, msg): - if self.sconf.cached: - # We assume that Display is called twice for each test here - # once for the Checking for ... message and once for the result. - # The self.sconf.cached flag can only be set between those calls - msg = "(cached) " + msg - self.sconf.cached = 0 - progress_display(msg, append_newline=0) - self.Log("scons: Configure: " + msg + "\n") - - def Log(self, msg): - if self.sconf.logstream != None: - self.sconf.logstream.write(msg) - - #### End of stuff used by Conftest.py. - - -def SConf(*args, **kw): - if kw.get(build_type, True): - kw['_depth'] = kw.get('_depth', 0) + 1 - for bt in build_types: - try: - del kw[bt] - except KeyError: - pass - return apply(SConfBase, args, kw) - else: - return SCons.Util.Null() - - -def CheckFunc(context, function_name, header = None, language = None): - res = SCons.Conftest.CheckFunc(context, function_name, header = header, language = language) - context.did_show_result = 1 - return not res - -def CheckType(context, type_name, includes = "", language = None): - res = SCons.Conftest.CheckType(context, type_name, - header = includes, language = language) - context.did_show_result = 1 - return not res - -def CheckTypeSize(context, type_name, includes = "", language = None, expect = None): - res = SCons.Conftest.CheckTypeSize(context, type_name, - header = includes, language = language, - expect = expect) - context.did_show_result = 1 - return res - -def CheckDeclaration(context, declaration, includes = "", language = None): - res = SCons.Conftest.CheckDeclaration(context, declaration, - includes = includes, - language = language) - context.did_show_result = 1 - return not res - -def createIncludesFromHeaders(headers, leaveLast, include_quotes = '""'): - # used by CheckHeader and CheckLibWithHeader to produce C - #include - # statements from the specified header (list) - if not SCons.Util.is_List(headers): - headers = [headers] - l = [] - if leaveLast: - lastHeader = headers[-1] - headers = headers[:-1] - else: - lastHeader = None - for s in headers: - l.append("#include %s%s%s\n" - % (include_quotes[0], s, include_quotes[1])) - return string.join(l, ''), lastHeader - -def CheckHeader(context, header, include_quotes = '<>', language = None): - """ - A test for a C or C++ header file. - """ - prog_prefix, hdr_to_check = \ - createIncludesFromHeaders(header, 1, include_quotes) - res = SCons.Conftest.CheckHeader(context, hdr_to_check, prog_prefix, - language = language, - include_quotes = include_quotes) - context.did_show_result = 1 - return not res - -def CheckCC(context): - res = SCons.Conftest.CheckCC(context) - return not res - -def CheckCXX(context): - res = SCons.Conftest.CheckCXX(context) - return not res - -def CheckSHCC(context): - res = SCons.Conftest.CheckSHCC(context) - return not res - -def CheckSHCXX(context): - res = SCons.Conftest.CheckSHCXX(context) - return not res - -# Bram: Make this function obsolete? CheckHeader() is more generic. - -def CheckCHeader(context, header, include_quotes = '""'): - """ - A test for a C header file. - """ - return CheckHeader(context, header, include_quotes, language = "C") - - -# Bram: Make this function obsolete? CheckHeader() is more generic. - -def CheckCXXHeader(context, header, include_quotes = '""'): - """ - A test for a C++ header file. - """ - return CheckHeader(context, header, include_quotes, language = "C++") - - -def CheckLib(context, library = None, symbol = "main", - header = None, language = None, autoadd = 1): - """ - A test for a library. See also CheckLibWithHeader. - Note that library may also be None to test whether the given symbol - compiles without flags. - """ - - if library == []: - library = [None] - - if not SCons.Util.is_List(library): - library = [library] - - # ToDo: accept path for the library - res = SCons.Conftest.CheckLib(context, library, symbol, header = header, - language = language, autoadd = autoadd) - context.did_show_result = 1 - return not res - -# XXX -# Bram: Can only include one header and can't use #ifdef HAVE_HEADER_H. - -def CheckLibWithHeader(context, libs, header, language, - call = None, autoadd = 1): - # ToDo: accept path for library. Support system header files. - """ - Another (more sophisticated) test for a library. - Checks, if library and header is available for language (may be 'C' - or 'CXX'). Call maybe be a valid expression _with_ a trailing ';'. - As in CheckLib, we support library=None, to test if the call compiles - without extra link flags. - """ - prog_prefix, dummy = \ - createIncludesFromHeaders(header, 0) - if libs == []: - libs = [None] - - if not SCons.Util.is_List(libs): - libs = [libs] - - res = SCons.Conftest.CheckLib(context, libs, None, prog_prefix, - call = call, language = language, autoadd = autoadd) - context.did_show_result = 1 - return not res - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/SConsign.py b/3rdParty/SCons/scons-local/SCons/SConsign.py deleted file mode 100644 index d7a8ab2..0000000 --- a/3rdParty/SCons/scons-local/SCons/SConsign.py +++ /dev/null @@ -1,381 +0,0 @@ -"""SCons.SConsign - -Writing and reading information to the .sconsign file or files. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/SConsign.py 4043 2009/02/23 09:06:45 scons" - -import cPickle -import os -import os.path - -import SCons.dblite -import SCons.Warnings - -def corrupt_dblite_warning(filename): - SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning, - "Ignoring corrupt .sconsign file: %s"%filename) - -SCons.dblite.ignore_corrupt_dbfiles = 1 -SCons.dblite.corruption_warning = corrupt_dblite_warning - -#XXX Get rid of the global array so this becomes re-entrant. -sig_files = [] - -# Info for the database SConsign implementation (now the default): -# "DataBase" is a dictionary that maps top-level SConstruct directories -# to open database handles. -# "DB_Module" is the Python database module to create the handles. -# "DB_Name" is the base name of the database file (minus any -# extension the underlying DB module will add). -DataBase = {} -DB_Module = SCons.dblite -DB_Name = ".sconsign" -DB_sync_list = [] - -def Get_DataBase(dir): - global DataBase, DB_Module, DB_Name - top = dir.fs.Top - if not os.path.isabs(DB_Name) and top.repositories: - mode = "c" - for d in [top] + top.repositories: - if dir.is_under(d): - try: - return DataBase[d], mode - except KeyError: - path = d.entry_abspath(DB_Name) - try: db = DataBase[d] = DB_Module.open(path, mode) - except (IOError, OSError): pass - else: - if mode != "r": - DB_sync_list.append(db) - return db, mode - mode = "r" - try: - return DataBase[top], "c" - except KeyError: - db = DataBase[top] = DB_Module.open(DB_Name, "c") - DB_sync_list.append(db) - return db, "c" - except TypeError: - print "DataBase =", DataBase - raise - -def Reset(): - """Reset global state. Used by unit tests that end up using - SConsign multiple times to get a clean slate for each test.""" - global sig_files, DB_sync_list - sig_files = [] - DB_sync_list = [] - -normcase = os.path.normcase - -def write(): - global sig_files - for sig_file in sig_files: - sig_file.write(sync=0) - for db in DB_sync_list: - try: - syncmethod = db.sync - except AttributeError: - pass # Not all anydbm modules have sync() methods. - else: - syncmethod() - -class SConsignEntry: - """ - Wrapper class for the generic entry in a .sconsign file. - The Node subclass populates it with attributes as it pleases. - - XXX As coded below, we do expect a '.binfo' attribute to be added, - but we'll probably generalize this in the next refactorings. - """ - current_version_id = 1 - def __init__(self): - # Create an object attribute from the class attribute so it ends up - # in the pickled data in the .sconsign file. - _version_id = self.current_version_id - def convert_to_sconsign(self): - self.binfo.convert_to_sconsign() - def convert_from_sconsign(self, dir, name): - self.binfo.convert_from_sconsign(dir, name) - -class Base: - """ - This is the controlling class for the signatures for the collection of - entries associated with a specific directory. The actual directory - association will be maintained by a subclass that is specific to - the underlying storage method. This class provides a common set of - methods for fetching and storing the individual bits of information - that make up signature entry. - """ - def __init__(self): - self.entries = {} - self.dirty = False - self.to_be_merged = {} - - def get_entry(self, filename): - """ - Fetch the specified entry attribute. - """ - return self.entries[filename] - - def set_entry(self, filename, obj): - """ - Set the entry. - """ - self.entries[filename] = obj - self.dirty = True - - def do_not_set_entry(self, filename, obj): - pass - - def store_info(self, filename, node): - entry = node.get_stored_info() - entry.binfo.merge(node.get_binfo()) - self.to_be_merged[filename] = node - self.dirty = True - - def do_not_store_info(self, filename, node): - pass - - def merge(self): - for key, node in self.to_be_merged.items(): - entry = node.get_stored_info() - try: - ninfo = entry.ninfo - except AttributeError: - # This happens with SConf Nodes, because the configuration - # subsystem takes direct control over how the build decision - # is made and its information stored. - pass - else: - ninfo.merge(node.get_ninfo()) - self.entries[key] = entry - self.to_be_merged = {} - -class DB(Base): - """ - A Base subclass that reads and writes signature information - from a global .sconsign.db* file--the actual file suffix is - determined by the database module. - """ - def __init__(self, dir): - Base.__init__(self) - - self.dir = dir - - db, mode = Get_DataBase(dir) - - # Read using the path relative to the top of the Repository - # (self.dir.tpath) from which we're fetching the signature - # information. - path = normcase(dir.tpath) - try: - rawentries = db[path] - except KeyError: - pass - else: - try: - self.entries = cPickle.loads(rawentries) - if type(self.entries) is not type({}): - self.entries = {} - raise TypeError - except KeyboardInterrupt: - raise - except Exception, e: - SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning, - "Ignoring corrupt sconsign entry : %s (%s)\n"%(self.dir.tpath, e)) - for key, entry in self.entries.items(): - entry.convert_from_sconsign(dir, key) - - if mode == "r": - # This directory is actually under a repository, which means - # likely they're reaching in directly for a dependency on - # a file there. Don't actually set any entry info, so we - # won't try to write to that .sconsign.dblite file. - self.set_entry = self.do_not_set_entry - self.store_info = self.do_not_store_info - - global sig_files - sig_files.append(self) - - def write(self, sync=1): - if not self.dirty: - return - - self.merge() - - db, mode = Get_DataBase(self.dir) - - # Write using the path relative to the top of the SConstruct - # directory (self.dir.path), not relative to the top of - # the Repository; we only write to our own .sconsign file, - # not to .sconsign files in Repositories. - path = normcase(self.dir.path) - for key, entry in self.entries.items(): - entry.convert_to_sconsign() - db[path] = cPickle.dumps(self.entries, 1) - - if sync: - try: - syncmethod = db.sync - except AttributeError: - # Not all anydbm modules have sync() methods. - pass - else: - syncmethod() - -class Dir(Base): - def __init__(self, fp=None, dir=None): - """ - fp - file pointer to read entries from - """ - Base.__init__(self) - - if not fp: - return - - self.entries = cPickle.load(fp) - if type(self.entries) is not type({}): - self.entries = {} - raise TypeError - - if dir: - for key, entry in self.entries.items(): - entry.convert_from_sconsign(dir, key) - -class DirFile(Dir): - """ - Encapsulates reading and writing a per-directory .sconsign file. - """ - def __init__(self, dir): - """ - dir - the directory for the file - """ - - self.dir = dir - self.sconsign = os.path.join(dir.path, '.sconsign') - - try: - fp = open(self.sconsign, 'rb') - except IOError: - fp = None - - try: - Dir.__init__(self, fp, dir) - except KeyboardInterrupt: - raise - except: - SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning, - "Ignoring corrupt .sconsign file: %s"%self.sconsign) - - global sig_files - sig_files.append(self) - - def write(self, sync=1): - """ - Write the .sconsign file to disk. - - Try to write to a temporary file first, and rename it if we - succeed. If we can't write to the temporary file, it's - probably because the directory isn't writable (and if so, - how did we build anything in this directory, anyway?), so - try to write directly to the .sconsign file as a backup. - If we can't rename, try to copy the temporary contents back - to the .sconsign file. Either way, always try to remove - the temporary file at the end. - """ - if not self.dirty: - return - - self.merge() - - temp = os.path.join(self.dir.path, '.scons%d' % os.getpid()) - try: - file = open(temp, 'wb') - fname = temp - except IOError: - try: - file = open(self.sconsign, 'wb') - fname = self.sconsign - except IOError: - return - for key, entry in self.entries.items(): - entry.convert_to_sconsign() - cPickle.dump(self.entries, file, 1) - file.close() - if fname != self.sconsign: - try: - mode = os.stat(self.sconsign)[0] - os.chmod(self.sconsign, 0666) - os.unlink(self.sconsign) - except (IOError, OSError): - # Try to carry on in the face of either OSError - # (things like permission issues) or IOError (disk - # or network issues). If there's a really dangerous - # issue, it should get re-raised by the calls below. - pass - try: - os.rename(fname, self.sconsign) - except OSError: - # An OSError failure to rename may indicate something - # like the directory has no write permission, but - # the .sconsign file itself might still be writable, - # so try writing on top of it directly. An IOError - # here, or in any of the following calls, would get - # raised, indicating something like a potentially - # serious disk or network issue. - open(self.sconsign, 'wb').write(open(fname, 'rb').read()) - os.chmod(self.sconsign, mode) - try: - os.unlink(temp) - except (IOError, OSError): - pass - -ForDirectory = DB - -def File(name, dbm_module=None): - """ - Arrange for all signatures to be stored in a global .sconsign.db* - file. - """ - global ForDirectory, DB_Name, DB_Module - if name is None: - ForDirectory = DirFile - DB_Module = None - else: - ForDirectory = DB - DB_Name = name - if not dbm_module is None: - DB_Module = dbm_module - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Scanner/C.py b/3rdParty/SCons/scons-local/SCons/Scanner/C.py deleted file mode 100644 index dccd3be..0000000 --- a/3rdParty/SCons/scons-local/SCons/Scanner/C.py +++ /dev/null @@ -1,132 +0,0 @@ -"""SCons.Scanner.C - -This module implements the depenency scanner for C/C++ code. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Scanner/C.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Node.FS -import SCons.Scanner -import SCons.Util - -import SCons.cpp - -class SConsCPPScanner(SCons.cpp.PreProcessor): - """ - SCons-specific subclass of the cpp.py module's processing. - - We subclass this so that: 1) we can deal with files represented - by Nodes, not strings; 2) we can keep track of the files that are - missing. - """ - def __init__(self, *args, **kw): - apply(SCons.cpp.PreProcessor.__init__, (self,)+args, kw) - self.missing = [] - def initialize_result(self, fname): - self.result = SCons.Util.UniqueList([fname]) - def finalize_result(self, fname): - return self.result[1:] - def find_include_file(self, t): - keyword, quote, fname = t - result = SCons.Node.FS.find_file(fname, self.searchpath[quote]) - if not result: - self.missing.append((fname, self.current_file)) - return result - def read_file(self, file): - try: - fp = open(str(file.rfile())) - except EnvironmentError, e: - self.missing.append((file, self.current_file)) - return '' - else: - return fp.read() - -def dictify_CPPDEFINES(env): - cppdefines = env.get('CPPDEFINES', {}) - if cppdefines is None: - return {} - if SCons.Util.is_Sequence(cppdefines): - result = {} - for c in cppdefines: - if SCons.Util.is_Sequence(c): - result[c[0]] = c[1] - else: - result[c] = None - return result - if not SCons.Util.is_Dict(cppdefines): - return {cppdefines : None} - return cppdefines - -class SConsCPPScannerWrapper: - """ - The SCons wrapper around a cpp.py scanner. - - This is the actual glue between the calling conventions of generic - SCons scanners, and the (subclass of) cpp.py class that knows how - to look for #include lines with reasonably real C-preprocessor-like - evaluation of #if/#ifdef/#else/#elif lines. - """ - def __init__(self, name, variable): - self.name = name - self.path = SCons.Scanner.FindPathDirs(variable) - def __call__(self, node, env, path = ()): - cpp = SConsCPPScanner(current = node.get_dir(), - cpppath = path, - dict = dictify_CPPDEFINES(env)) - result = cpp(node) - for included, includer in cpp.missing: - fmt = "No dependency generated for file: %s (included from: %s) -- file not found" - SCons.Warnings.warn(SCons.Warnings.DependencyWarning, - fmt % (included, includer)) - return result - - def recurse_nodes(self, nodes): - return nodes - def select(self, node): - return self - -def CScanner(): - """Return a prototype Scanner instance for scanning source files - that use the C pre-processor""" - - # Here's how we would (or might) use the CPP scanner code above that - # knows how to evaluate #if/#ifdef/#else/#elif lines when searching - # for #includes. This is commented out for now until we add the - # right configurability to let users pick between the scanners. - #return SConsCPPScannerWrapper("CScanner", "CPPPATH") - - cs = SCons.Scanner.ClassicCPP("CScanner", - "$CPPSUFFIXES", - "CPPPATH", - '^[ \t]*#[ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")') - return cs - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Scanner/D.py b/3rdParty/SCons/scons-local/SCons/Scanner/D.py deleted file mode 100644 index 311e1af..0000000 --- a/3rdParty/SCons/scons-local/SCons/Scanner/D.py +++ /dev/null @@ -1,74 +0,0 @@ -"""SCons.Scanner.D - -Scanner for the Digital Mars "D" programming language. - -Coded by Andy Friesen -17 Nov 2003 - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Scanner/D.py 4043 2009/02/23 09:06:45 scons" - -import re -import string - -import SCons.Scanner - -def DScanner(): - """Return a prototype Scanner instance for scanning D source files""" - ds = D() - return ds - -class D(SCons.Scanner.Classic): - def __init__ (self): - SCons.Scanner.Classic.__init__ (self, - name = "DScanner", - suffixes = '$DSUFFIXES', - path_variable = 'DPATH', - regex = 'import\s+(?:[a-zA-Z0-9_.]+)\s*(?:,\s*(?:[a-zA-Z0-9_.]+)\s*)*;') - - self.cre2 = re.compile ('(?:import\s)?\s*([a-zA-Z0-9_.]+)\s*(?:,|;)', re.M) - - def find_include(self, include, source_dir, path): - # translate dots (package separators) to slashes - inc = string.replace(include, '.', '/') - - i = SCons.Node.FS.find_file(inc + '.d', (source_dir,) + path) - if i is None: - i = SCons.Node.FS.find_file (inc + '.di', (source_dir,) + path) - return i, include - - def find_include_names(self, node): - includes = [] - for i in self.cre.findall(node.get_text_contents()): - includes = includes + self.cre2.findall(i) - return includes - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Scanner/Dir.py b/3rdParty/SCons/scons-local/SCons/Scanner/Dir.py deleted file mode 100644 index aaf92d6..0000000 --- a/3rdParty/SCons/scons-local/SCons/Scanner/Dir.py +++ /dev/null @@ -1,111 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Scanner/Dir.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Node.FS -import SCons.Scanner - -def only_dirs(nodes): - is_Dir = lambda n: isinstance(n.disambiguate(), SCons.Node.FS.Dir) - return filter(is_Dir, nodes) - -def DirScanner(**kw): - """Return a prototype Scanner instance for scanning - directories for on-disk files""" - kw['node_factory'] = SCons.Node.FS.Entry - kw['recursive'] = only_dirs - return apply(SCons.Scanner.Base, (scan_on_disk, "DirScanner"), kw) - -def DirEntryScanner(**kw): - """Return a prototype Scanner instance for "scanning" - directory Nodes for their in-memory entries""" - kw['node_factory'] = SCons.Node.FS.Entry - kw['recursive'] = None - return apply(SCons.Scanner.Base, (scan_in_memory, "DirEntryScanner"), kw) - -skip_entry = {} - -skip_entry_list = [ - '.', - '..', - '.sconsign', - # Used by the native dblite.py module. - '.sconsign.dblite', - # Used by dbm and dumbdbm. - '.sconsign.dir', - # Used by dbm. - '.sconsign.pag', - # Used by dumbdbm. - '.sconsign.dat', - '.sconsign.bak', - # Used by some dbm emulations using Berkeley DB. - '.sconsign.db', -] - -for skip in skip_entry_list: - skip_entry[skip] = 1 - skip_entry[SCons.Node.FS._my_normcase(skip)] = 1 - -do_not_scan = lambda k: not skip_entry.has_key(k) - -def scan_on_disk(node, env, path=()): - """ - Scans a directory for on-disk files and directories therein. - - Looking up the entries will add these to the in-memory Node tree - representation of the file system, so all we have to do is just - that and then call the in-memory scanning function. - """ - try: - flist = node.fs.listdir(node.abspath) - except (IOError, OSError): - return [] - e = node.Entry - for f in filter(do_not_scan, flist): - # Add ./ to the beginning of the file name so if it begins with a - # '#' we don't look it up relative to the top-level directory. - e('./' + f) - return scan_in_memory(node, env, path) - -def scan_in_memory(node, env, path=()): - """ - "Scans" a Node.FS.Dir for its in-memory entries. - """ - try: - entries = node.entries - except AttributeError: - # It's not a Node.FS.Dir (or doesn't look enough like one for - # our purposes), which can happen if a target list containing - # mixed Node types (Dirs and Files, for example) has a Dir as - # the first entry. - return [] - entry_list = filter(do_not_scan, entries.keys()) - entry_list.sort() - return map(lambda n, e=entries: e[n], entry_list) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Scanner/Fortran.py b/3rdParty/SCons/scons-local/SCons/Scanner/Fortran.py deleted file mode 100644 index 92f511a..0000000 --- a/3rdParty/SCons/scons-local/SCons/Scanner/Fortran.py +++ /dev/null @@ -1,320 +0,0 @@ -"""SCons.Scanner.Fortran - -This module implements the dependency scanner for Fortran code. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Scanner/Fortran.py 4043 2009/02/23 09:06:45 scons" - -import re -import string - -import SCons.Node -import SCons.Node.FS -import SCons.Scanner -import SCons.Util -import SCons.Warnings - -class F90Scanner(SCons.Scanner.Classic): - """ - A Classic Scanner subclass for Fortran source files which takes - into account both USE and INCLUDE statements. This scanner will - work for both F77 and F90 (and beyond) compilers. - - Currently, this scanner assumes that the include files do not contain - USE statements. To enable the ability to deal with USE statements - in include files, add logic right after the module names are found - to loop over each include file, search for and locate each USE - statement, and append each module name to the list of dependencies. - Caching the search results in a common dictionary somewhere so that - the same include file is not searched multiple times would be a - smart thing to do. - """ - - def __init__(self, name, suffixes, path_variable, - use_regex, incl_regex, def_regex, *args, **kw): - - self.cre_use = re.compile(use_regex, re.M) - self.cre_incl = re.compile(incl_regex, re.M) - self.cre_def = re.compile(def_regex, re.M) - - def _scan(node, env, path, self=self): - node = node.rfile() - - if not node.exists(): - return [] - - return self.scan(node, env, path) - - kw['function'] = _scan - kw['path_function'] = SCons.Scanner.FindPathDirs(path_variable) - kw['recursive'] = 1 - kw['skeys'] = suffixes - kw['name'] = name - - apply(SCons.Scanner.Current.__init__, (self,) + args, kw) - - def scan(self, node, env, path=()): - - # cache the includes list in node so we only scan it once: - if node.includes != None: - mods_and_includes = node.includes - else: - # retrieve all included filenames - includes = self.cre_incl.findall(node.get_text_contents()) - # retrieve all USE'd module names - modules = self.cre_use.findall(node.get_text_contents()) - # retrieve all defined module names - defmodules = self.cre_def.findall(node.get_text_contents()) - - # Remove all USE'd module names that are defined in the same file - d = {} - for m in defmodules: - d[m] = 1 - modules = filter(lambda m, d=d: not d.has_key(m), modules) - #modules = self.undefinedModules(modules, defmodules) - - # Convert module name to a .mod filename - suffix = env.subst('$FORTRANMODSUFFIX') - modules = map(lambda x, s=suffix: string.lower(x) + s, modules) - # Remove unique items from the list - mods_and_includes = SCons.Util.unique(includes+modules) - node.includes = mods_and_includes - - # This is a hand-coded DSU (decorate-sort-undecorate, or - # Schwartzian transform) pattern. The sort key is the raw name - # of the file as specifed on the USE or INCLUDE line, which lets - # us keep the sort order constant regardless of whether the file - # is actually found in a Repository or locally. - nodes = [] - source_dir = node.get_dir() - if callable(path): - path = path() - for dep in mods_and_includes: - n, i = self.find_include(dep, source_dir, path) - - if n is None: - SCons.Warnings.warn(SCons.Warnings.DependencyWarning, - "No dependency generated for file: %s (referenced by: %s) -- file not found" % (i, node)) - else: - sortkey = self.sort_key(dep) - nodes.append((sortkey, n)) - - nodes.sort() - nodes = map(lambda pair: pair[1], nodes) - return nodes - -def FortranScan(path_variable="FORTRANPATH"): - """Return a prototype Scanner instance for scanning source files - for Fortran USE & INCLUDE statements""" - -# The USE statement regex matches the following: -# -# USE module_name -# USE :: module_name -# USE, INTRINSIC :: module_name -# USE, NON_INTRINSIC :: module_name -# -# Limitations -# -# -- While the regex can handle multiple USE statements on one line, -# it cannot properly handle them if they are commented out. -# In either of the following cases: -# -# ! USE mod_a ; USE mod_b [entire line is commented out] -# USE mod_a ! ; USE mod_b [in-line comment of second USE statement] -# -# the second module name (mod_b) will be picked up as a dependency -# even though it should be ignored. The only way I can see -# to rectify this would be to modify the scanner to eliminate -# the call to re.findall, read in the contents of the file, -# treating the comment character as an end-of-line character -# in addition to the normal linefeed, loop over each line, -# weeding out the comments, and looking for the USE statements. -# One advantage to this is that the regex passed to the scanner -# would no longer need to match a semicolon. -# -# -- I question whether or not we need to detect dependencies to -# INTRINSIC modules because these are built-in to the compiler. -# If we consider them a dependency, will SCons look for them, not -# find them, and kill the build? Or will we there be standard -# compiler-specific directories we will need to point to so the -# compiler and SCons can locate the proper object and mod files? - -# Here is a breakdown of the regex: -# -# (?i) : regex is case insensitive -# ^ : start of line -# (?: : group a collection of regex symbols without saving the match as a "group" -# ^|; : matches either the start of the line or a semicolon - semicolon -# ) : end the unsaved grouping -# \s* : any amount of white space -# USE : match the string USE, case insensitive -# (?: : group a collection of regex symbols without saving the match as a "group" -# \s+| : match one or more whitespace OR .... (the next entire grouped set of regex symbols) -# (?: : group a collection of regex symbols without saving the match as a "group" -# (?: : establish another unsaved grouping of regex symbols -# \s* : any amount of white space -# , : match a comma -# \s* : any amount of white space -# (?:NON_)? : optionally match the prefix NON_, case insensitive -# INTRINSIC : match the string INTRINSIC, case insensitive -# )? : optionally match the ", INTRINSIC/NON_INTRINSIC" grouped expression -# \s* : any amount of white space -# :: : match a double colon that must appear after the INTRINSIC/NON_INTRINSIC attribute -# ) : end the unsaved grouping -# ) : end the unsaved grouping -# \s* : match any amount of white space -# (\w+) : match the module name that is being USE'd -# -# - use_regex = "(?i)(?:^|;)\s*USE(?:\s+|(?:(?:\s*,\s*(?:NON_)?INTRINSIC)?\s*::))\s*(\w+)" - - -# The INCLUDE statement regex matches the following: -# -# INCLUDE 'some_Text' -# INCLUDE "some_Text" -# INCLUDE "some_Text" ; INCLUDE "some_Text" -# INCLUDE kind_"some_Text" -# INCLUDE kind_'some_Text" -# -# where some_Text can include any alphanumeric and/or special character -# as defined by the Fortran 2003 standard. -# -# Limitations: -# -# -- The Fortran standard dictates that a " or ' in the INCLUDE'd -# string must be represented as a "" or '', if the quotes that wrap -# the entire string are either a ' or ", respectively. While the -# regular expression below can detect the ' or " characters just fine, -# the scanning logic, presently is unable to detect them and reduce -# them to a single instance. This probably isn't an issue since, -# in practice, ' or " are not generally used in filenames. -# -# -- This regex will not properly deal with multiple INCLUDE statements -# when the entire line has been commented out, ala -# -# ! INCLUDE 'some_file' ; INCLUDE 'some_file' -# -# In such cases, it will properly ignore the first INCLUDE file, -# but will actually still pick up the second. Interestingly enough, -# the regex will properly deal with these cases: -# -# INCLUDE 'some_file' -# INCLUDE 'some_file' !; INCLUDE 'some_file' -# -# To get around the above limitation, the FORTRAN programmer could -# simply comment each INCLUDE statement separately, like this -# -# ! INCLUDE 'some_file' !; INCLUDE 'some_file' -# -# The way I see it, the only way to get around this limitation would -# be to modify the scanning logic to replace the calls to re.findall -# with a custom loop that processes each line separately, throwing -# away fully commented out lines before attempting to match against -# the INCLUDE syntax. -# -# Here is a breakdown of the regex: -# -# (?i) : regex is case insensitive -# (?: : begin a non-saving group that matches the following: -# ^ : either the start of the line -# | : or -# ['">]\s*; : a semicolon that follows a single quote, -# double quote or greater than symbol (with any -# amount of whitespace in between). This will -# allow the regex to match multiple INCLUDE -# statements per line (although it also requires -# the positive lookahead assertion that is -# used below). It will even properly deal with -# (i.e. ignore) cases in which the additional -# INCLUDES are part of an in-line comment, ala -# " INCLUDE 'someFile' ! ; INCLUDE 'someFile2' " -# ) : end of non-saving group -# \s* : any amount of white space -# INCLUDE : match the string INCLUDE, case insensitive -# \s+ : match one or more white space characters -# (?\w+_)? : match the optional "kind-param _" prefix allowed by the standard -# [<"'] : match the include delimiter - an apostrophe, double quote, or less than symbol -# (.+?) : match one or more characters that make up -# the included path and file name and save it -# in a group. The Fortran standard allows for -# any non-control character to be used. The dot -# operator will pick up any character, including -# control codes, but I can't conceive of anyone -# putting control codes in their file names. -# The question mark indicates it is non-greedy so -# that regex will match only up to the next quote, -# double quote, or greater than symbol -# (?=["'>]) : positive lookahead assertion to match the include -# delimiter - an apostrophe, double quote, or -# greater than symbol. This level of complexity -# is required so that the include delimiter is -# not consumed by the match, thus allowing the -# sub-regex discussed above to uniquely match a -# set of semicolon-separated INCLUDE statements -# (as allowed by the F2003 standard) - - include_regex = """(?i)(?:^|['">]\s*;)\s*INCLUDE\s+(?:\w+_)?[<"'](.+?)(?=["'>])""" - -# The MODULE statement regex finds module definitions by matching -# the following: -# -# MODULE module_name -# -# but *not* the following: -# -# MODULE PROCEDURE procedure_name -# -# Here is a breakdown of the regex: -# -# (?i) : regex is case insensitive -# ^\s* : any amount of white space -# MODULE : match the string MODULE, case insensitive -# \s+ : match one or more white space characters -# (?!PROCEDURE) : but *don't* match if the next word matches -# PROCEDURE (negative lookahead assertion), -# case insensitive -# (\w+) : match one or more alphanumeric characters -# that make up the defined module name and -# save it in a group - - def_regex = """(?i)^\s*MODULE\s+(?!PROCEDURE)(\w+)""" - - scanner = F90Scanner("FortranScan", - "$FORTRANSUFFIXES", - path_variable, - use_regex, - include_regex, - def_regex) - return scanner - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Scanner/IDL.py b/3rdParty/SCons/scons-local/SCons/Scanner/IDL.py deleted file mode 100644 index 57a8a6a..0000000 --- a/3rdParty/SCons/scons-local/SCons/Scanner/IDL.py +++ /dev/null @@ -1,48 +0,0 @@ -"""SCons.Scanner.IDL - -This module implements the depenency scanner for IDL (Interface -Definition Language) files. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Scanner/IDL.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Node.FS -import SCons.Scanner - -def IDLScan(): - """Return a prototype Scanner instance for scanning IDL source files""" - cs = SCons.Scanner.ClassicCPP("IDLScan", - "$IDLSUFFIXES", - "CPPPATH", - '^[ \t]*(?:#[ \t]*include|[ \t]*import)[ \t]+(<|")([^>"]+)(>|")') - return cs - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Scanner/LaTeX.py b/3rdParty/SCons/scons-local/SCons/Scanner/LaTeX.py deleted file mode 100644 index fe6f7e1..0000000 --- a/3rdParty/SCons/scons-local/SCons/Scanner/LaTeX.py +++ /dev/null @@ -1,343 +0,0 @@ -"""SCons.Scanner.LaTeX - -This module implements the dependency scanner for LaTeX code. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Scanner/LaTeX.py 4043 2009/02/23 09:06:45 scons" - -import os.path -import string -import re - -import SCons.Scanner -import SCons.Util - -# list of graphics file extensions for TeX and LaTeX -TexGraphics = ['.eps', '.ps'] -LatexGraphics = ['.pdf', '.png', '.jpg', '.gif', '.tif'] - -# Used as a return value of modify_env_var if the variable is not set. -class _Null: - pass -_null = _Null - -# The user specifies the paths in env[variable], similar to other builders. -# They may be relative and must be converted to absolute, as expected -# by LaTeX and Co. The environment may already have some paths in -# env['ENV'][var]. These paths are honored, but the env[var] paths have -# higher precedence. All changes are un-done on exit. -def modify_env_var(env, var, abspath): - try: - save = env['ENV'][var] - except KeyError: - save = _null - env.PrependENVPath(var, abspath) - try: - if SCons.Util.is_List(env[var]): - #TODO(1.5) - #env.PrependENVPath(var, [os.path.abspath(str(p)) for p in env[var]]) - env.PrependENVPath(var, map(lambda p: os.path.abspath(str(p)), env[var])) - else: - # Split at os.pathsep to convert into absolute path - #TODO(1.5) env.PrependENVPath(var, [os.path.abspath(p) for p in str(env[var]).split(os.pathsep)]) - env.PrependENVPath(var, map(lambda p: os.path.abspath(p), string.split(str(env[var]), os.pathsep))) - except KeyError: - pass - - # Convert into a string explicitly to append ":" (without which it won't search system - # paths as well). The problem is that env.AppendENVPath(var, ":") - # does not work, refuses to append ":" (os.pathsep). - - if SCons.Util.is_List(env['ENV'][var]): - # TODO(1.5) - #env['ENV'][var] = os.pathsep.join(env['ENV'][var]) - env['ENV'][var] = string.join(env['ENV'][var], os.pathsep) - # Append the trailing os.pathsep character here to catch the case with no env[var] - env['ENV'][var] = env['ENV'][var] + os.pathsep - - return save - -class FindENVPathDirs: - """A class to bind a specific *PATH variable name to a function that - will return all of the *path directories.""" - def __init__(self, variable): - self.variable = variable - def __call__(self, env, dir=None, target=None, source=None, argument=None): - import SCons.PathList - try: - path = env['ENV'][self.variable] - except KeyError: - return () - - dir = dir or env.fs._cwd - path = SCons.PathList.PathList(path).subst_path(env, target, source) - return tuple(dir.Rfindalldirs(path)) - - - -def LaTeXScanner(): - """Return a prototype Scanner instance for scanning LaTeX source files - when built with latex. - """ - ds = LaTeX(name = "LaTeXScanner", - suffixes = '$LATEXSUFFIXES', - # in the search order, see below in LaTeX class docstring - graphics_extensions = TexGraphics, - recursive = 0) - return ds - -def PDFLaTeXScanner(): - """Return a prototype Scanner instance for scanning LaTeX source files - when built with pdflatex. - """ - ds = LaTeX(name = "PDFLaTeXScanner", - suffixes = '$LATEXSUFFIXES', - # in the search order, see below in LaTeX class docstring - graphics_extensions = LatexGraphics, - recursive = 0) - return ds - -class LaTeX(SCons.Scanner.Base): - """Class for scanning LaTeX files for included files. - - Unlike most scanners, which use regular expressions that just - return the included file name, this returns a tuple consisting - of the keyword for the inclusion ("include", "includegraphics", - "input", or "bibliography"), and then the file name itself. - Based on a quick look at LaTeX documentation, it seems that we - should append .tex suffix for the "include" keywords, append .tex if - there is no extension for the "input" keyword, and need to add .bib - for the "bibliography" keyword that does not accept extensions by itself. - - Finally, if there is no extension for an "includegraphics" keyword - latex will append .ps or .eps to find the file, while pdftex may use .pdf, - .jpg, .tif, .mps, or .png. - - The actual subset and search order may be altered by - DeclareGraphicsExtensions command. This complication is ignored. - The default order corresponds to experimentation with teTeX - $ latex --version - pdfeTeX 3.141592-1.21a-2.2 (Web2C 7.5.4) - kpathsea version 3.5.4 - The order is: - ['.eps', '.ps'] for latex - ['.png', '.pdf', '.jpg', '.tif']. - - Another difference is that the search path is determined by the type - of the file being searched: - env['TEXINPUTS'] for "input" and "include" keywords - env['TEXINPUTS'] for "includegraphics" keyword - env['BIBINPUTS'] for "bibliography" keyword - env['BSTINPUTS'] for "bibliographystyle" keyword - - FIXME: also look for the class or style in document[class|style]{} - FIXME: also look for the argument of bibliographystyle{} - """ - keyword_paths = {'include': 'TEXINPUTS', - 'input': 'TEXINPUTS', - 'includegraphics': 'TEXINPUTS', - 'bibliography': 'BIBINPUTS', - 'bibliographystyle': 'BSTINPUTS', - 'usepackage': 'TEXINPUTS'} - env_variables = SCons.Util.unique(keyword_paths.values()) - - def __init__(self, name, suffixes, graphics_extensions, *args, **kw): - - # We have to include \n with the % we exclude from the first part - # part of the regex because the expression is compiled with re.M. - # Without the \n, the ^ could match the beginning of a *previous* - # line followed by one or more newline characters (i.e. blank - # lines), interfering with a match on the next line. - regex = r'^[^%\n]*\\(include|includegraphics(?:\[[^\]]+\])?|input|bibliography|usepackage){([^}]*)}' - self.cre = re.compile(regex, re.M) - self.graphics_extensions = graphics_extensions - - def _scan(node, env, path=(), self=self): - node = node.rfile() - if not node.exists(): - return [] - return self.scan(node, path) - - class FindMultiPathDirs: - """The stock FindPathDirs function has the wrong granularity: - it is called once per target, while we need the path that depends - on what kind of included files is being searched. This wrapper - hides multiple instances of FindPathDirs, one per the LaTeX path - variable in the environment. When invoked, the function calculates - and returns all the required paths as a dictionary (converted into - a tuple to become hashable). Then the scan function converts it - back and uses a dictionary of tuples rather than a single tuple - of paths. - """ - def __init__(self, dictionary): - self.dictionary = {} - for k,n in dictionary.items(): - self.dictionary[k] = ( SCons.Scanner.FindPathDirs(n), - FindENVPathDirs(n) ) - - def __call__(self, env, dir=None, target=None, source=None, - argument=None): - di = {} - for k,(c,cENV) in self.dictionary.items(): - di[k] = ( c(env, dir=None, target=None, source=None, - argument=None) , - cENV(env, dir=None, target=None, source=None, - argument=None) ) - # To prevent "dict is not hashable error" - return tuple(di.items()) - - class LaTeXScanCheck: - """Skip all but LaTeX source files, i.e., do not scan *.eps, - *.pdf, *.jpg, etc. - """ - def __init__(self, suffixes): - self.suffixes = suffixes - def __call__(self, node, env): - current = not node.has_builder() or node.is_up_to_date() - scannable = node.get_suffix() in env.subst_list(self.suffixes)[0] - # Returning false means that the file is not scanned. - return scannable and current - - kw['function'] = _scan - kw['path_function'] = FindMultiPathDirs(LaTeX.keyword_paths) - kw['recursive'] = 1 - kw['skeys'] = suffixes - kw['scan_check'] = LaTeXScanCheck(suffixes) - kw['name'] = name - - apply(SCons.Scanner.Base.__init__, (self,) + args, kw) - - def _latex_names(self, include): - filename = include[1] - if include[0] == 'input': - base, ext = os.path.splitext( filename ) - if ext == "": - return [filename + '.tex'] - if (include[0] == 'include'): - return [filename + '.tex'] - if include[0] == 'bibliography': - base, ext = os.path.splitext( filename ) - if ext == "": - return [filename + '.bib'] - if include[0] == 'usepackage': - base, ext = os.path.splitext( filename ) - if ext == "": - return [filename + '.sty'] - if include[0] == 'includegraphics': - base, ext = os.path.splitext( filename ) - if ext == "": - #TODO(1.5) return [filename + e for e in self.graphics_extensions] - #return map(lambda e, f=filename: f+e, self.graphics_extensions + TexGraphics) - # use the line above to find dependency for PDF builder when only .eps figure is present - # Since it will be found if the user tell scons how to make the pdf figure leave it out for now. - return map(lambda e, f=filename: f+e, self.graphics_extensions) - return [filename] - - def sort_key(self, include): - return SCons.Node.FS._my_normcase(str(include)) - - def find_include(self, include, source_dir, path): - try: - sub_path = path[include[0]] - except (IndexError, KeyError): - sub_path = () - try_names = self._latex_names(include) - for n in try_names: - # see if we find it using the path in env[var] - i = SCons.Node.FS.find_file(n, (source_dir,) + sub_path[0]) - if i: - return i, include - # see if we find it using the path in env['ENV'][var] - i = SCons.Node.FS.find_file(n, (source_dir,) + sub_path[1]) - if i: - return i, include - return i, include - - def scan(self, node, path=()): - # Modify the default scan function to allow for the regular - # expression to return a comma separated list of file names - # as can be the case with the bibliography keyword. - - # Cache the includes list in node so we only scan it once: - path_dict = dict(list(path)) - noopt_cre = re.compile('\[.*$') - if node.includes != None: - includes = node.includes - else: - includes = self.cre.findall(node.get_text_contents()) - # 1. Split comma-separated lines, e.g. - # ('bibliography', 'phys,comp') - # should become two entries - # ('bibliography', 'phys') - # ('bibliography', 'comp') - # 2. Remove the options, e.g., such as - # ('includegraphics[clip,width=0.7\\linewidth]', 'picture.eps') - # should become - # ('includegraphics', 'picture.eps') - split_includes = [] - for include in includes: - inc_type = noopt_cre.sub('', include[0]) - inc_list = string.split(include[1],',') - for j in range(len(inc_list)): - split_includes.append( (inc_type, inc_list[j]) ) - # - includes = split_includes - node.includes = includes - - # This is a hand-coded DSU (decorate-sort-undecorate, or - # Schwartzian transform) pattern. The sort key is the raw name - # of the file as specifed on the \include, \input, etc. line. - # TODO: what about the comment in the original Classic scanner: - # """which lets - # us keep the sort order constant regardless of whether the file - # is actually found in a Repository or locally.""" - nodes = [] - source_dir = node.get_dir() - for include in includes: - # - # Handle multiple filenames in include[1] - # - n, i = self.find_include(include, source_dir, path_dict) - if n is None: - # Do not bother with 'usepackage' warnings, as they most - # likely refer to system-level files - if include[0] != 'usepackage': - SCons.Warnings.warn(SCons.Warnings.DependencyWarning, - "No dependency generated for file: %s (included from: %s) -- file not found" % (i, node)) - else: - sortkey = self.sort_key(n) - nodes.append((sortkey, n)) - # - nodes.sort() - nodes = map(lambda pair: pair[1], nodes) - return nodes - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Scanner/Prog.py b/3rdParty/SCons/scons-local/SCons/Scanner/Prog.py deleted file mode 100644 index 47054a8..0000000 --- a/3rdParty/SCons/scons-local/SCons/Scanner/Prog.py +++ /dev/null @@ -1,103 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Scanner/Prog.py 4043 2009/02/23 09:06:45 scons" - -import string - -import SCons.Node -import SCons.Node.FS -import SCons.Scanner -import SCons.Util - -# global, set by --debug=findlibs -print_find_libs = None - -def ProgramScanner(**kw): - """Return a prototype Scanner instance for scanning executable - files for static-lib dependencies""" - kw['path_function'] = SCons.Scanner.FindPathDirs('LIBPATH') - ps = apply(SCons.Scanner.Base, [scan, "ProgramScanner"], kw) - return ps - -def scan(node, env, libpath = ()): - """ - This scanner scans program files for static-library - dependencies. It will search the LIBPATH environment variable - for libraries specified in the LIBS variable, returning any - files it finds as dependencies. - """ - try: - libs = env['LIBS'] - except KeyError: - # There are no LIBS in this environment, so just return a null list: - return [] - if SCons.Util.is_String(libs): - libs = string.split(libs) - else: - libs = SCons.Util.flatten(libs) - - try: - prefix = env['LIBPREFIXES'] - if not SCons.Util.is_List(prefix): - prefix = [ prefix ] - except KeyError: - prefix = [ '' ] - - try: - suffix = env['LIBSUFFIXES'] - if not SCons.Util.is_List(suffix): - suffix = [ suffix ] - except KeyError: - suffix = [ '' ] - - pairs = [] - for suf in map(env.subst, suffix): - for pref in map(env.subst, prefix): - pairs.append((pref, suf)) - - result = [] - - if callable(libpath): - libpath = libpath() - - find_file = SCons.Node.FS.find_file - adjustixes = SCons.Util.adjustixes - for lib in libs: - if SCons.Util.is_String(lib): - lib = env.subst(lib) - for pref, suf in pairs: - l = adjustixes(lib, pref, suf) - l = find_file(l, libpath, verbose=print_find_libs) - if l: - result.append(l) - else: - result.append(lib) - - return result - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Scanner/RC.py b/3rdParty/SCons/scons-local/SCons/Scanner/RC.py deleted file mode 100644 index e804a3f..0000000 --- a/3rdParty/SCons/scons-local/SCons/Scanner/RC.py +++ /dev/null @@ -1,55 +0,0 @@ -"""SCons.Scanner.RC - -This module implements the depenency scanner for RC (Interface -Definition Language) files. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Scanner/RC.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Node.FS -import SCons.Scanner -import re - -def RCScan(): - """Return a prototype Scanner instance for scanning RC source files""" - - res_re= r'^(?:\s*#\s*(?:include)|' \ - '.*?\s+(?:ICON|BITMAP|CURSOR|HTML|FONT|MESSAGETABLE|TYPELIB|REGISTRY|D3DFX)' \ - '\s*.*?)' \ - '\s*(<|"| )([^>"\s]+)(?:[>" ])*$' - resScanner = SCons.Scanner.ClassicCPP( "ResourceScanner", - "$RCSUFFIXES", - "CPPPATH", - res_re ) - - return resScanner - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Scanner/__init__.py b/3rdParty/SCons/scons-local/SCons/Scanner/__init__.py deleted file mode 100644 index f5ce271..0000000 --- a/3rdParty/SCons/scons-local/SCons/Scanner/__init__.py +++ /dev/null @@ -1,417 +0,0 @@ -"""SCons.Scanner - -The Scanner package for the SCons software construction utility. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Scanner/__init__.py 4043 2009/02/23 09:06:45 scons" - -import re -import string - -import SCons.Node.FS -import SCons.Util - - -class _Null: - pass - -# This is used instead of None as a default argument value so None can be -# used as an actual argument value. -_null = _Null - -def Scanner(function, *args, **kw): - """ - Public interface factory function for creating different types - of Scanners based on the different types of "functions" that may - be supplied. - - TODO: Deprecate this some day. We've moved the functionality - inside the Base class and really don't need this factory function - any more. It was, however, used by some of our Tool modules, so - the call probably ended up in various people's custom modules - patterned on SCons code. - """ - if SCons.Util.is_Dict(function): - return apply(Selector, (function,) + args, kw) - else: - return apply(Base, (function,) + args, kw) - - - -class FindPathDirs: - """A class to bind a specific *PATH variable name to a function that - will return all of the *path directories.""" - def __init__(self, variable): - self.variable = variable - def __call__(self, env, dir=None, target=None, source=None, argument=None): - import SCons.PathList - try: - path = env[self.variable] - except KeyError: - return () - - dir = dir or env.fs._cwd - path = SCons.PathList.PathList(path).subst_path(env, target, source) - return tuple(dir.Rfindalldirs(path)) - - - -class Base: - """ - The base class for dependency scanners. This implements - straightforward, single-pass scanning of a single file. - """ - - def __init__(self, - function, - name = "NONE", - argument = _null, - skeys = _null, - path_function = None, - node_class = SCons.Node.FS.Entry, - node_factory = None, - scan_check = None, - recursive = None): - """ - Construct a new scanner object given a scanner function. - - 'function' - a scanner function taking two or three - arguments and returning a list of strings. - - 'name' - a name for identifying this scanner object. - - 'argument' - an optional argument that, if specified, will be - passed to both the scanner function and the path_function. - - 'skeys' - an optional list argument that can be used to determine - which scanner should be used for a given Node. In the case of File - nodes, for example, the 'skeys' would be file suffixes. - - 'path_function' - a function that takes four or five arguments - (a construction environment, Node for the directory containing - the SConscript file that defined the primary target, list of - target nodes, list of source nodes, and optional argument for - this instance) and returns a tuple of the directories that can - be searched for implicit dependency files. May also return a - callable() which is called with no args and returns the tuple - (supporting Bindable class). - - 'node_class' - the class of Nodes which this scan will return. - If node_class is None, then this scanner will not enforce any - Node conversion and will return the raw results from the - underlying scanner function. - - 'node_factory' - the factory function to be called to translate - the raw results returned by the scanner function into the - expected node_class objects. - - 'scan_check' - a function to be called to first check whether - this node really needs to be scanned. - - 'recursive' - specifies that this scanner should be invoked - recursively on all of the implicit dependencies it returns - (the canonical example being #include lines in C source files). - May be a callable, which will be called to filter the list - of nodes found to select a subset for recursive scanning - (the canonical example being only recursively scanning - subdirectories within a directory). - - The scanner function's first argument will be a Node that should - be scanned for dependencies, the second argument will be an - Environment object, the third argument will be the tuple of paths - returned by the path_function, and the fourth argument will be - the value passed into 'argument', and the returned list should - contain the Nodes for all the direct dependencies of the file. - - Examples: - - s = Scanner(my_scanner_function) - - s = Scanner(function = my_scanner_function) - - s = Scanner(function = my_scanner_function, argument = 'foo') - - """ - - # Note: this class could easily work with scanner functions that take - # something other than a filename as an argument (e.g. a database - # node) and a dependencies list that aren't file names. All that - # would need to be changed is the documentation. - - self.function = function - self.path_function = path_function - self.name = name - self.argument = argument - - if skeys is _null: - if SCons.Util.is_Dict(function): - skeys = function.keys() - else: - skeys = [] - self.skeys = skeys - - self.node_class = node_class - self.node_factory = node_factory - self.scan_check = scan_check - if callable(recursive): - self.recurse_nodes = recursive - elif recursive: - self.recurse_nodes = self._recurse_all_nodes - else: - self.recurse_nodes = self._recurse_no_nodes - - def path(self, env, dir=None, target=None, source=None): - if not self.path_function: - return () - if not self.argument is _null: - return self.path_function(env, dir, target, source, self.argument) - else: - return self.path_function(env, dir, target, source) - - def __call__(self, node, env, path = ()): - """ - This method scans a single object. 'node' is the node - that will be passed to the scanner function, and 'env' is the - environment that will be passed to the scanner function. A list of - direct dependency nodes for the specified node will be returned. - """ - if self.scan_check and not self.scan_check(node, env): - return [] - - self = self.select(node) - - if not self.argument is _null: - list = self.function(node, env, path, self.argument) - else: - list = self.function(node, env, path) - - kw = {} - if hasattr(node, 'dir'): - kw['directory'] = node.dir - node_factory = env.get_factory(self.node_factory) - nodes = [] - for l in list: - if self.node_class and not isinstance(l, self.node_class): - l = apply(node_factory, (l,), kw) - nodes.append(l) - return nodes - - def __cmp__(self, other): - try: - return cmp(self.__dict__, other.__dict__) - except AttributeError: - # other probably doesn't have a __dict__ - return cmp(self.__dict__, other) - - def __hash__(self): - return id(self) - - def __str__(self): - return self.name - - def add_skey(self, skey): - """Add a skey to the list of skeys""" - self.skeys.append(skey) - - def get_skeys(self, env=None): - if env and SCons.Util.is_String(self.skeys): - return env.subst_list(self.skeys)[0] - return self.skeys - - def select(self, node): - if SCons.Util.is_Dict(self.function): - key = node.scanner_key() - try: - return self.function[key] - except KeyError: - return None - else: - return self - - def _recurse_all_nodes(self, nodes): - return nodes - - def _recurse_no_nodes(self, nodes): - return [] - - recurse_nodes = _recurse_no_nodes - - def add_scanner(self, skey, scanner): - self.function[skey] = scanner - self.add_skey(skey) - - -class Selector(Base): - """ - A class for selecting a more specific scanner based on the - scanner_key() (suffix) for a specific Node. - - TODO: This functionality has been moved into the inner workings of - the Base class, and this class will be deprecated at some point. - (It was never exposed directly as part of the public interface, - although it is used by the Scanner() factory function that was - used by various Tool modules and therefore was likely a template - for custom modules that may be out there.) - """ - def __init__(self, dict, *args, **kw): - apply(Base.__init__, (self, None,)+args, kw) - self.dict = dict - self.skeys = dict.keys() - - def __call__(self, node, env, path = ()): - return self.select(node)(node, env, path) - - def select(self, node): - try: - return self.dict[node.scanner_key()] - except KeyError: - return None - - def add_scanner(self, skey, scanner): - self.dict[skey] = scanner - self.add_skey(skey) - - -class Current(Base): - """ - A class for scanning files that are source files (have no builder) - or are derived files and are current (which implies that they exist, - either locally or in a repository). - """ - - def __init__(self, *args, **kw): - def current_check(node, env): - return not node.has_builder() or node.is_up_to_date() - kw['scan_check'] = current_check - apply(Base.__init__, (self,) + args, kw) - -class Classic(Current): - """ - A Scanner subclass to contain the common logic for classic CPP-style - include scanning, but which can be customized to use different - regular expressions to find the includes. - - Note that in order for this to work "out of the box" (without - overriding the find_include() and sort_key() methods), the regular - expression passed to the constructor must return the name of the - include file in group 0. - """ - - def __init__(self, name, suffixes, path_variable, regex, *args, **kw): - - self.cre = re.compile(regex, re.M) - - def _scan(node, env, path=(), self=self): - node = node.rfile() - if not node.exists(): - return [] - return self.scan(node, path) - - kw['function'] = _scan - kw['path_function'] = FindPathDirs(path_variable) - kw['recursive'] = 1 - kw['skeys'] = suffixes - kw['name'] = name - - apply(Current.__init__, (self,) + args, kw) - - def find_include(self, include, source_dir, path): - n = SCons.Node.FS.find_file(include, (source_dir,) + tuple(path)) - return n, include - - def sort_key(self, include): - return SCons.Node.FS._my_normcase(include) - - def find_include_names(self, node): - return self.cre.findall(node.get_text_contents()) - - def scan(self, node, path=()): - - # cache the includes list in node so we only scan it once: - if node.includes != None: - includes = node.includes - else: - includes = self.find_include_names (node) - # Intern the names of the include files. Saves some memory - # if the same header is included many times. - try: - node.includes = map(intern, includes) - except TypeError: - node.includes = includes - - # This is a hand-coded DSU (decorate-sort-undecorate, or - # Schwartzian transform) pattern. The sort key is the raw name - # of the file as specifed on the #include line (including the - # " or <, since that may affect what file is found), which lets - # us keep the sort order constant regardless of whether the file - # is actually found in a Repository or locally. - nodes = [] - source_dir = node.get_dir() - if callable(path): - path = path() - for include in includes: - n, i = self.find_include(include, source_dir, path) - - if n is None: - SCons.Warnings.warn(SCons.Warnings.DependencyWarning, - "No dependency generated for file: %s (included from: %s) -- file not found" % (i, node)) - else: - sortkey = self.sort_key(include) - nodes.append((sortkey, n)) - - nodes.sort() - nodes = map(lambda pair: pair[1], nodes) - return nodes - -class ClassicCPP(Classic): - """ - A Classic Scanner subclass which takes into account the type of - bracketing used to include the file, and uses classic CPP rules - for searching for the files based on the bracketing. - - Note that in order for this to work, the regular expression passed - to the constructor must return the leading bracket in group 0, and - the contained filename in group 1. - """ - def find_include(self, include, source_dir, path): - if include[0] == '"': - paths = (source_dir,) + tuple(path) - else: - paths = tuple(path) + (source_dir,) - - n = SCons.Node.FS.find_file(include[1], paths) - - return n, intern(include[1]) - - def sort_key(self, include): - return SCons.Node.FS._my_normcase(string.join(include)) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Script/Interactive.py b/3rdParty/SCons/scons-local/SCons/Script/Interactive.py deleted file mode 100644 index 75ca1c7..0000000 --- a/3rdParty/SCons/scons-local/SCons/Script/Interactive.py +++ /dev/null @@ -1,386 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Script/Interactive.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """ -SCons interactive mode -""" - -# TODO: -# -# This has the potential to grow into something with a really big life -# of its own, which might or might not be a good thing. Nevertheless, -# here are some enhancements that will probably be requested some day -# and are worth keeping in mind (assuming this takes off): -# -# - A command to re-read / re-load the SConscript files. This may -# involve allowing people to specify command-line options (e.g. -f, -# -I, --no-site-dir) that affect how the SConscript files are read. -# -# - Additional command-line options on the "build" command. -# -# Of the supported options that seemed to make sense (after a quick -# pass through the list), the ones that seemed likely enough to be -# used are listed in the man page and have explicit test scripts. -# -# These had code changed in Script/Main.py to support them, but didn't -# seem likely to be used regularly, so had no test scripts added: -# -# build --diskcheck=* -# build --implicit-cache=* -# build --implicit-deps-changed=* -# build --implicit-deps-unchanged=* -# -# These look like they should "just work" with no changes to the -# existing code, but like those above, look unlikely to be used and -# therefore had no test scripts added: -# -# build --random -# -# These I'm not sure about. They might be useful for individual -# "build" commands, and may even work, but they seem unlikely enough -# that we'll wait until they're requested before spending any time on -# writing test scripts for them, or investigating whether they work. -# -# build -q [??? is there a useful analog to the exit status?] -# build --duplicate= -# build --profile= -# build --max-drift= -# build --warn=* -# build --Y -# -# - Most of the SCons command-line options that the "build" command -# supports should be settable as default options that apply to all -# subsequent "build" commands. Maybe a "set {option}" command that -# maps to "SetOption('{option}')". -# -# - Need something in the 'help' command that prints the -h output. -# -# - A command to run the configure subsystem separately (must see how -# this interacts with the new automake model). -# -# - Command-line completion of target names; maybe even of SCons options? -# Completion is something that's supported by the Python cmd module, -# so this should be doable without too much trouble. -# - -import cmd -import copy -import os -import re -import shlex -import string -import sys - -try: - import readline -except ImportError: - pass - -class SConsInteractiveCmd(cmd.Cmd): - """\ - build [TARGETS] Build the specified TARGETS and their dependencies. - 'b' is a synonym. - clean [TARGETS] Clean (remove) the specified TARGETS and their - dependencies. 'c' is a synonym. - exit Exit SCons interactive mode. - help [COMMAND] Prints help for the specified COMMAND. 'h' and - '?' are synonyms. - shell [COMMANDLINE] Execute COMMANDLINE in a subshell. 'sh' and '!' - are synonyms. - version Prints SCons version information. - """ - - synonyms = { - 'b' : 'build', - 'c' : 'clean', - 'h' : 'help', - 'scons' : 'build', - 'sh' : 'shell', - } - - def __init__(self, **kw): - cmd.Cmd.__init__(self) - for key, val in kw.items(): - setattr(self, key, val) - - if sys.platform == 'win32': - self.shell_variable = 'COMSPEC' - else: - self.shell_variable = 'SHELL' - - def default(self, argv): - print "*** Unknown command: %s" % argv[0] - - def onecmd(self, line): - line = string.strip(line) - if not line: - print self.lastcmd - return self.emptyline() - self.lastcmd = line - if line[0] == '!': - line = 'shell ' + line[1:] - elif line[0] == '?': - line = 'help ' + line[1:] - if os.sep == '\\': - line = string.replace(line, '\\', '\\\\') - argv = shlex.split(line) - argv[0] = self.synonyms.get(argv[0], argv[0]) - if not argv[0]: - return self.default(line) - else: - try: - func = getattr(self, 'do_' + argv[0]) - except AttributeError: - return self.default(argv) - return func(argv) - - def do_build(self, argv): - """\ - build [TARGETS] Build the specified TARGETS and their - dependencies. 'b' is a synonym. - """ - import SCons.Node - import SCons.SConsign - import SCons.Script.Main - - options = copy.deepcopy(self.options) - - options, targets = self.parser.parse_args(argv[1:], values=options) - - SCons.Script.COMMAND_LINE_TARGETS = targets - - if targets: - SCons.Script.BUILD_TARGETS = targets - else: - # If the user didn't specify any targets on the command line, - # use the list of default targets. - SCons.Script.BUILD_TARGETS = SCons.Script._build_plus_default - - nodes = SCons.Script.Main._build_targets(self.fs, - options, - targets, - self.target_top) - - if not nodes: - return - - # Call each of the Node's alter_targets() methods, which may - # provide additional targets that ended up as part of the build - # (the canonical example being a VariantDir() when we're building - # from a source directory) and which we therefore need their - # state cleared, too. - x = [] - for n in nodes: - x.extend(n.alter_targets()[0]) - nodes.extend(x) - - # Clean up so that we can perform the next build correctly. - # - # We do this by walking over all the children of the targets, - # and clearing their state. - # - # We currently have to re-scan each node to find their - # children, because built nodes have already been partially - # cleared and don't remember their children. (In scons - # 0.96.1 and earlier, this wasn't the case, and we didn't - # have to re-scan the nodes.) - # - # Because we have to re-scan each node, we can't clear the - # nodes as we walk over them, because we may end up rescanning - # a cleared node as we scan a later node. Therefore, only - # store the list of nodes that need to be cleared as we walk - # the tree, and clear them in a separate pass. - # - # XXX: Someone more familiar with the inner workings of scons - # may be able to point out a more efficient way to do this. - - SCons.Script.Main.progress_display("scons: Clearing cached node information ...") - - seen_nodes = {} - - def get_unseen_children(node, parent, seen_nodes=seen_nodes): - def is_unseen(node, seen_nodes=seen_nodes): - return not seen_nodes.has_key(node) - return filter(is_unseen, node.children(scan=1)) - - def add_to_seen_nodes(node, parent, seen_nodes=seen_nodes): - seen_nodes[node] = 1 - - # If this file is in a VariantDir and has a - # corresponding source file in the source tree, remember the - # node in the source tree, too. This is needed in - # particular to clear cached implicit dependencies on the - # source file, since the scanner will scan it if the - # VariantDir was created with duplicate=0. - try: - rfile_method = node.rfile - except AttributeError: - return - else: - rfile = rfile_method() - if rfile != node: - seen_nodes[rfile] = 1 - - for node in nodes: - walker = SCons.Node.Walker(node, - kids_func=get_unseen_children, - eval_func=add_to_seen_nodes) - n = walker.next() - while n: - n = walker.next() - - for node in seen_nodes.keys(): - # Call node.clear() to clear most of the state - node.clear() - # node.clear() doesn't reset node.state, so call - # node.set_state() to reset it manually - node.set_state(SCons.Node.no_state) - node.implicit = None - - # Debug: Uncomment to verify that all Taskmaster reference - # counts have been reset to zero. - #if node.ref_count != 0: - # from SCons.Debug import Trace - # Trace('node %s, ref_count %s !!!\n' % (node, node.ref_count)) - - SCons.SConsign.Reset() - SCons.Script.Main.progress_display("scons: done clearing node information.") - - def do_clean(self, argv): - """\ - clean [TARGETS] Clean (remove) the specified TARGETS - and their dependencies. 'c' is a synonym. - """ - return self.do_build(['build', '--clean'] + argv[1:]) - - def do_EOF(self, argv): - print - self.do_exit(argv) - - def _do_one_help(self, arg): - try: - # If help_<arg>() exists, then call it. - func = getattr(self, 'help_' + arg) - except AttributeError: - try: - func = getattr(self, 'do_' + arg) - except AttributeError: - doc = None - else: - doc = self._doc_to_help(func) - if doc: - sys.stdout.write(doc + '\n') - sys.stdout.flush() - else: - doc = self.strip_initial_spaces(func()) - if doc: - sys.stdout.write(doc + '\n') - sys.stdout.flush() - - def _doc_to_help(self, obj): - doc = obj.__doc__ - if doc is None: - return '' - return self._strip_initial_spaces(doc) - - def _strip_initial_spaces(self, s): - #lines = s.split('\n') - lines = string.split(s, '\n') - spaces = re.match(' *', lines[0]).group(0) - #def strip_spaces(l): - # if l.startswith(spaces): - # l = l[len(spaces):] - # return l - #return '\n'.join([ strip_spaces(l) for l in lines ]) - def strip_spaces(l, spaces=spaces): - if l[:len(spaces)] == spaces: - l = l[len(spaces):] - return l - lines = map(strip_spaces, lines) - return string.join(lines, '\n') - - def do_exit(self, argv): - """\ - exit Exit SCons interactive mode. - """ - sys.exit(0) - - def do_help(self, argv): - """\ - help [COMMAND] Prints help for the specified COMMAND. 'h' - and '?' are synonyms. - """ - if argv[1:]: - for arg in argv[1:]: - if self._do_one_help(arg): - break - else: - # If bare 'help' is called, print this class's doc - # string (if it has one). - doc = self._doc_to_help(self.__class__) - if doc: - sys.stdout.write(doc + '\n') - sys.stdout.flush() - - def do_shell(self, argv): - """\ - shell [COMMANDLINE] Execute COMMANDLINE in a subshell. 'sh' and - '!' are synonyms. - """ - import subprocess - argv = argv[1:] - if not argv: - argv = os.environ[self.shell_variable] - try: - # Per "[Python-Dev] subprocess insufficiently platform-independent?" - # http://mail.python.org/pipermail/python-dev/2008-August/081979.html "+ - # Doing the right thing with an argument list currently - # requires different shell= values on Windows and Linux. - p = subprocess.Popen(argv, shell=(sys.platform=='win32')) - except EnvironmentError, e: - sys.stderr.write('scons: %s: %s\n' % (argv[0], e.strerror)) - else: - p.wait() - - def do_version(self, argv): - """\ - version Prints SCons version information. - """ - sys.stdout.write(self.parser.version + '\n') - -def interact(fs, parser, options, targets, target_top): - c = SConsInteractiveCmd(prompt = 'scons>>> ', - fs = fs, - parser = parser, - options = options, - targets = targets, - target_top = target_top) - c.cmdloop() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Script/Main.py b/3rdParty/SCons/scons-local/SCons/Script/Main.py deleted file mode 100644 index 537bcf1..0000000 --- a/3rdParty/SCons/scons-local/SCons/Script/Main.py +++ /dev/null @@ -1,1331 +0,0 @@ -"""SCons.Script - -This file implements the main() function used by the scons script. - -Architecturally, this *is* the scons script, and will likely only be -called from the external "scons" wrapper. Consequently, anything here -should not be, or be considered, part of the build engine. If it's -something that we expect other software to want to use, it should go in -some other module. If it's specific to the "scons" script invocation, -it goes here. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Script/Main.py 4043 2009/02/23 09:06:45 scons" - -import os -import os.path -import string -import sys -import time -import traceback - -# Strip the script directory from sys.path() so on case-insensitive -# (Windows) systems Python doesn't think that the "scons" script is the -# "SCons" package. Replace it with our own version directory so, if -# if they're there, we pick up the right version of the build engine -# modules. -#sys.path = [os.path.join(sys.prefix, -# 'lib', -# 'scons-%d' % SCons.__version__)] + sys.path[1:] - -import SCons.CacheDir -import SCons.Debug -import SCons.Defaults -import SCons.Environment -import SCons.Errors -import SCons.Job -import SCons.Node -import SCons.Node.FS -import SCons.SConf -import SCons.Script -import SCons.Taskmaster -import SCons.Util -import SCons.Warnings - -import SCons.Script.Interactive - -def fetch_win32_parallel_msg(): - # A subsidiary function that exists solely to isolate this import - # so we don't have to pull it in on all platforms, and so that an - # in-line "import" statement in the _main() function below doesn't - # cause warnings about local names shadowing use of the 'SCons' - # globl in nest scopes and UnboundLocalErrors and the like in some - # versions (2.1) of Python. - import SCons.Platform.win32 - return SCons.Platform.win32.parallel_msg - -# - -class SConsPrintHelpException(Exception): - pass - -display = SCons.Util.display -progress_display = SCons.Util.DisplayEngine() - -first_command_start = None -last_command_end = None - -class Progressor: - prev = '' - count = 0 - target_string = '$TARGET' - - def __init__(self, obj, interval=1, file=None, overwrite=False): - if file is None: - file = sys.stdout - - self.obj = obj - self.file = file - self.interval = interval - self.overwrite = overwrite - - if callable(obj): - self.func = obj - elif SCons.Util.is_List(obj): - self.func = self.spinner - elif string.find(obj, self.target_string) != -1: - self.func = self.replace_string - else: - self.func = self.string - - def write(self, s): - self.file.write(s) - self.file.flush() - self.prev = s - - def erase_previous(self): - if self.prev: - length = len(self.prev) - if self.prev[-1] in ('\n', '\r'): - length = length - 1 - self.write(' ' * length + '\r') - self.prev = '' - - def spinner(self, node): - self.write(self.obj[self.count % len(self.obj)]) - - def string(self, node): - self.write(self.obj) - - def replace_string(self, node): - self.write(string.replace(self.obj, self.target_string, str(node))) - - def __call__(self, node): - self.count = self.count + 1 - if (self.count % self.interval) == 0: - if self.overwrite: - self.erase_previous() - self.func(node) - -ProgressObject = SCons.Util.Null() - -def Progress(*args, **kw): - global ProgressObject - ProgressObject = apply(Progressor, args, kw) - -# Task control. -# - -_BuildFailures = [] - -def GetBuildFailures(): - return _BuildFailures - -class BuildTask(SCons.Taskmaster.OutOfDateTask): - """An SCons build task.""" - progress = ProgressObject - - def display(self, message): - display('scons: ' + message) - - def prepare(self): - self.progress(self.targets[0]) - return SCons.Taskmaster.OutOfDateTask.prepare(self) - - def needs_execute(self): - if SCons.Taskmaster.OutOfDateTask.needs_execute(self): - return True - if self.top and self.targets[0].has_builder(): - display("scons: `%s' is up to date." % str(self.node)) - return False - - def execute(self): - if print_time: - start_time = time.time() - global first_command_start - if first_command_start is None: - first_command_start = start_time - SCons.Taskmaster.OutOfDateTask.execute(self) - if print_time: - global cumulative_command_time - global last_command_end - finish_time = time.time() - last_command_end = finish_time - cumulative_command_time = cumulative_command_time+finish_time-start_time - sys.stdout.write("Command execution time: %f seconds\n"%(finish_time-start_time)) - - def do_failed(self, status=2): - _BuildFailures.append(self.exception[1]) - global exit_status - global this_build_status - if self.options.ignore_errors: - SCons.Taskmaster.OutOfDateTask.executed(self) - elif self.options.keep_going: - SCons.Taskmaster.OutOfDateTask.fail_continue(self) - exit_status = status - this_build_status = status - else: - SCons.Taskmaster.OutOfDateTask.fail_stop(self) - exit_status = status - this_build_status = status - - def executed(self): - t = self.targets[0] - if self.top and not t.has_builder() and not t.side_effect: - if not t.exists(): - errstr="Do not know how to make target `%s'." % t - sys.stderr.write("scons: *** " + errstr) - if not self.options.keep_going: - sys.stderr.write(" Stop.") - sys.stderr.write("\n") - try: - raise SCons.Errors.BuildError(t, errstr) - except KeyboardInterrupt: - raise - except: - self.exception_set() - self.do_failed() - else: - print "scons: Nothing to be done for `%s'." % t - SCons.Taskmaster.OutOfDateTask.executed(self) - else: - SCons.Taskmaster.OutOfDateTask.executed(self) - - def failed(self): - # Handle the failure of a build task. The primary purpose here - # is to display the various types of Errors and Exceptions - # appropriately. - exc_info = self.exc_info() - try: - t, e, tb = exc_info - except ValueError: - t, e = exc_info - tb = None - - if t is None: - # The Taskmaster didn't record an exception for this Task; - # see if the sys module has one. - try: - t, e, tb = sys.exc_info()[:] - except ValueError: - t, e = exc_info - tb = None - - # Deprecated string exceptions will have their string stored - # in the first entry of the tuple. - if e is None: - e = t - - buildError = SCons.Errors.convert_to_BuildError(e) - if not buildError.node: - buildError.node = self.node - - node = buildError.node - if not SCons.Util.is_List(node): - node = [ node ] - nodename = string.join(map(str, node), ', ') - - errfmt = "scons: *** [%s] %s\n" - sys.stderr.write(errfmt % (nodename, buildError)) - - if (buildError.exc_info[2] and buildError.exc_info[1] and - # TODO(1.5) - #not isinstance( - # buildError.exc_info[1], - # (EnvironmentError, SCons.Errors.StopError, SCons.Errors.UserError))): - not isinstance(buildError.exc_info[1], EnvironmentError) and - not isinstance(buildError.exc_info[1], SCons.Errors.StopError) and - not isinstance(buildError.exc_info[1], SCons.Errors.UserError)): - type, value, trace = buildError.exc_info - traceback.print_exception(type, value, trace) - elif tb and print_stacktrace: - sys.stderr.write("scons: internal stack trace:\n") - traceback.print_tb(tb, file=sys.stderr) - - self.exception = (e, buildError, tb) # type, value, traceback - self.do_failed(buildError.exitstatus) - - self.exc_clear() - - def postprocess(self): - if self.top: - t = self.targets[0] - for tp in self.options.tree_printers: - tp.display(t) - if self.options.debug_includes: - tree = t.render_include_tree() - if tree: - print - print tree - SCons.Taskmaster.OutOfDateTask.postprocess(self) - - def make_ready(self): - """Make a task ready for execution""" - SCons.Taskmaster.OutOfDateTask.make_ready(self) - if self.out_of_date and self.options.debug_explain: - explanation = self.out_of_date[0].explain() - if explanation: - sys.stdout.write("scons: " + explanation) - -class CleanTask(SCons.Taskmaster.AlwaysTask): - """An SCons clean task.""" - def fs_delete(self, path, pathstr, remove=1): - try: - if os.path.lexists(path): - if os.path.isfile(path) or os.path.islink(path): - if remove: os.unlink(path) - display("Removed " + pathstr) - elif os.path.isdir(path) and not os.path.islink(path): - # delete everything in the dir - entries = os.listdir(path) - # Sort for deterministic output (os.listdir() Can - # return entries in a random order). - entries.sort() - for e in entries: - p = os.path.join(path, e) - s = os.path.join(pathstr, e) - if os.path.isfile(p): - if remove: os.unlink(p) - display("Removed " + s) - else: - self.fs_delete(p, s, remove) - # then delete dir itself - if remove: os.rmdir(path) - display("Removed directory " + pathstr) - else: - errstr = "Path '%s' exists but isn't a file or directory." - raise SCons.Errors.UserError(errstr % (pathstr)) - except SCons.Errors.UserError, e: - print e - except (IOError, OSError), e: - print "scons: Could not remove '%s':" % pathstr, e.strerror - - def show(self): - target = self.targets[0] - if (target.has_builder() or target.side_effect) and not target.noclean: - for t in self.targets: - if not t.isdir(): - display("Removed " + str(t)) - if SCons.Environment.CleanTargets.has_key(target): - files = SCons.Environment.CleanTargets[target] - for f in files: - self.fs_delete(f.abspath, str(f), 0) - - def remove(self): - target = self.targets[0] - if (target.has_builder() or target.side_effect) and not target.noclean: - for t in self.targets: - try: - removed = t.remove() - except OSError, e: - # An OSError may indicate something like a permissions - # issue, an IOError would indicate something like - # the file not existing. In either case, print a - # message and keep going to try to remove as many - # targets aa possible. - print "scons: Could not remove '%s':" % str(t), e.strerror - else: - if removed: - display("Removed " + str(t)) - if SCons.Environment.CleanTargets.has_key(target): - files = SCons.Environment.CleanTargets[target] - for f in files: - self.fs_delete(f.abspath, str(f)) - - execute = remove - - # We want the Taskmaster to update the Node states (and therefore - # handle reference counts, etc.), but we don't want to call - # back to the Node's post-build methods, which would do things - # we don't want, like store .sconsign information. - executed = SCons.Taskmaster.Task.executed_without_callbacks - - # Have the taskmaster arrange to "execute" all of the targets, because - # we'll figure out ourselves (in remove() or show() above) whether - # anything really needs to be done. - make_ready = SCons.Taskmaster.Task.make_ready_all - - def prepare(self): - pass - -class QuestionTask(SCons.Taskmaster.AlwaysTask): - """An SCons task for the -q (question) option.""" - def prepare(self): - pass - - def execute(self): - if self.targets[0].get_state() != SCons.Node.up_to_date or \ - (self.top and not self.targets[0].exists()): - global exit_status - global this_build_status - exit_status = 1 - this_build_status = 1 - self.tm.stop() - - def executed(self): - pass - - -class TreePrinter: - def __init__(self, derived=False, prune=False, status=False): - self.derived = derived - self.prune = prune - self.status = status - def get_all_children(self, node): - return node.all_children() - def get_derived_children(self, node): - children = node.all_children(None) - return filter(lambda x: x.has_builder(), children) - def display(self, t): - if self.derived: - func = self.get_derived_children - else: - func = self.get_all_children - s = self.status and 2 or 0 - SCons.Util.print_tree(t, func, prune=self.prune, showtags=s) - - -def python_version_string(): - return string.split(sys.version)[0] - -def python_version_unsupported(version=sys.version_info): - return version < (1, 5, 2) - -def python_version_deprecated(version=sys.version_info): - return version < (2, 2, 0) - - -# Global variables - -print_objects = 0 -print_memoizer = 0 -print_stacktrace = 0 -print_time = 0 -sconscript_time = 0 -cumulative_command_time = 0 -exit_status = 0 # final exit status, assume success by default -this_build_status = 0 # "exit status" of an individual build -num_jobs = None -delayed_warnings = [] - -class FakeOptionParser: - """ - A do-nothing option parser, used for the initial OptionsParser variable. - - During normal SCons operation, the OptionsParser is created right - away by the main() function. Certain tests scripts however, can - introspect on different Tool modules, the initialization of which - can try to add a new, local option to an otherwise uninitialized - OptionsParser object. This allows that introspection to happen - without blowing up. - - """ - class FakeOptionValues: - def __getattr__(self, attr): - return None - values = FakeOptionValues() - def add_local_option(self, *args, **kw): - pass - -OptionsParser = FakeOptionParser() - -def AddOption(*args, **kw): - if not kw.has_key('default'): - kw['default'] = None - result = apply(OptionsParser.add_local_option, args, kw) - return result - -def GetOption(name): - return getattr(OptionsParser.values, name) - -def SetOption(name, value): - return OptionsParser.values.set_option(name, value) - -# -class Stats: - def __init__(self): - self.stats = [] - self.labels = [] - self.append = self.do_nothing - self.print_stats = self.do_nothing - def enable(self, outfp): - self.outfp = outfp - self.append = self.do_append - self.print_stats = self.do_print - def do_nothing(self, *args, **kw): - pass - -class CountStats(Stats): - def do_append(self, label): - self.labels.append(label) - self.stats.append(SCons.Debug.fetchLoggedInstances()) - def do_print(self): - stats_table = {} - for s in self.stats: - for n in map(lambda t: t[0], s): - stats_table[n] = [0, 0, 0, 0] - i = 0 - for s in self.stats: - for n, c in s: - stats_table[n][i] = c - i = i + 1 - keys = stats_table.keys() - keys.sort() - self.outfp.write("Object counts:\n") - pre = [" "] - post = [" %s\n"] - l = len(self.stats) - fmt1 = string.join(pre + [' %7s']*l + post, '') - fmt2 = string.join(pre + [' %7d']*l + post, '') - labels = self.labels[:l] - labels.append(("", "Class")) - self.outfp.write(fmt1 % tuple(map(lambda x: x[0], labels))) - self.outfp.write(fmt1 % tuple(map(lambda x: x[1], labels))) - for k in keys: - r = stats_table[k][:l] + [k] - self.outfp.write(fmt2 % tuple(r)) - -count_stats = CountStats() - -class MemStats(Stats): - def do_append(self, label): - self.labels.append(label) - self.stats.append(SCons.Debug.memory()) - def do_print(self): - fmt = 'Memory %-32s %12d\n' - for label, stats in map(None, self.labels, self.stats): - self.outfp.write(fmt % (label, stats)) - -memory_stats = MemStats() - -# utility functions - -def _scons_syntax_error(e): - """Handle syntax errors. Print out a message and show where the error - occurred. - """ - etype, value, tb = sys.exc_info() - lines = traceback.format_exception_only(etype, value) - for line in lines: - sys.stderr.write(line+'\n') - sys.exit(2) - -def find_deepest_user_frame(tb): - """ - Find the deepest stack frame that is not part of SCons. - - Input is a "pre-processed" stack trace in the form - returned by traceback.extract_tb() or traceback.extract_stack() - """ - - tb.reverse() - - # find the deepest traceback frame that is not part - # of SCons: - for frame in tb: - filename = frame[0] - if string.find(filename, os.sep+'SCons'+os.sep) == -1: - return frame - return tb[0] - -def _scons_user_error(e): - """Handle user errors. Print out a message and a description of the - error, along with the line number and routine where it occured. - The file and line number will be the deepest stack frame that is - not part of SCons itself. - """ - global print_stacktrace - etype, value, tb = sys.exc_info() - if print_stacktrace: - traceback.print_exception(etype, value, tb) - filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_tb(tb)) - sys.stderr.write("\nscons: *** %s\n" % value) - sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine)) - sys.exit(2) - -def _scons_user_warning(e): - """Handle user warnings. Print out a message and a description of - the warning, along with the line number and routine where it occured. - The file and line number will be the deepest stack frame that is - not part of SCons itself. - """ - etype, value, tb = sys.exc_info() - filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_tb(tb)) - sys.stderr.write("\nscons: warning: %s\n" % e) - sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine)) - -def _scons_internal_warning(e): - """Slightly different from _scons_user_warning in that we use the - *current call stack* rather than sys.exc_info() to get our stack trace. - This is used by the warnings framework to print warnings.""" - filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_stack()) - sys.stderr.write("\nscons: warning: %s\n" % e[0]) - sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine)) - -def _scons_internal_error(): - """Handle all errors but user errors. Print out a message telling - the user what to do in this case and print a normal trace. - """ - print 'internal error' - traceback.print_exc() - sys.exit(2) - -def _SConstruct_exists(dirname='', repositories=[], filelist=None): - """This function checks that an SConstruct file exists in a directory. - If so, it returns the path of the file. By default, it checks the - current directory. - """ - if not filelist: - filelist = ['SConstruct', 'Sconstruct', 'sconstruct'] - for file in filelist: - sfile = os.path.join(dirname, file) - if os.path.isfile(sfile): - return sfile - if not os.path.isabs(sfile): - for rep in repositories: - if os.path.isfile(os.path.join(rep, sfile)): - return sfile - return None - -def _set_debug_values(options): - global print_memoizer, print_objects, print_stacktrace, print_time - - debug_values = options.debug - - if "count" in debug_values: - # All of the object counts are within "if __debug__:" blocks, - # which get stripped when running optimized (with python -O or - # from compiled *.pyo files). Provide a warning if __debug__ is - # stripped, so it doesn't just look like --debug=count is broken. - enable_count = False - if __debug__: enable_count = True - if enable_count: - count_stats.enable(sys.stdout) - else: - msg = "--debug=count is not supported when running SCons\n" + \ - "\twith the python -O option or optimized (.pyo) modules." - SCons.Warnings.warn(SCons.Warnings.NoObjectCountWarning, msg) - if "dtree" in debug_values: - options.tree_printers.append(TreePrinter(derived=True)) - options.debug_explain = ("explain" in debug_values) - if "findlibs" in debug_values: - SCons.Scanner.Prog.print_find_libs = "findlibs" - options.debug_includes = ("includes" in debug_values) - print_memoizer = ("memoizer" in debug_values) - if "memory" in debug_values: - memory_stats.enable(sys.stdout) - print_objects = ("objects" in debug_values) - if "presub" in debug_values: - SCons.Action.print_actions_presub = 1 - if "stacktrace" in debug_values: - print_stacktrace = 1 - if "stree" in debug_values: - options.tree_printers.append(TreePrinter(status=True)) - if "time" in debug_values: - print_time = 1 - if "tree" in debug_values: - options.tree_printers.append(TreePrinter()) - -def _create_path(plist): - path = '.' - for d in plist: - if os.path.isabs(d): - path = d - else: - path = path + '/' + d - return path - -def _load_site_scons_dir(topdir, site_dir_name=None): - """Load the site_scons dir under topdir. - Adds site_scons to sys.path, imports site_scons/site_init.py, - and adds site_scons/site_tools to default toolpath.""" - if site_dir_name: - err_if_not_found = True # user specified: err if missing - else: - site_dir_name = "site_scons" - err_if_not_found = False - - site_dir = os.path.join(topdir.path, site_dir_name) - if not os.path.exists(site_dir): - if err_if_not_found: - raise SCons.Errors.UserError, "site dir %s not found."%site_dir - return - - site_init_filename = "site_init.py" - site_init_modname = "site_init" - site_tools_dirname = "site_tools" - sys.path = [os.path.abspath(site_dir)] + sys.path - site_init_file = os.path.join(site_dir, site_init_filename) - site_tools_dir = os.path.join(site_dir, site_tools_dirname) - if os.path.exists(site_init_file): - import imp - try: - fp, pathname, description = imp.find_module(site_init_modname, - [site_dir]) - try: - imp.load_module(site_init_modname, fp, pathname, description) - finally: - if fp: - fp.close() - except ImportError, e: - sys.stderr.write("Can't import site init file '%s': %s\n"%(site_init_file, e)) - raise - except Exception, e: - sys.stderr.write("Site init file '%s' raised exception: %s\n"%(site_init_file, e)) - raise - if os.path.exists(site_tools_dir): - SCons.Tool.DefaultToolpath.append(os.path.abspath(site_tools_dir)) - -def version_string(label, module): - version = module.__version__ - build = module.__build__ - if build: - if build[0] != '.': - build = '.' + build - version = version + build - fmt = "\t%s: v%s, %s, by %s on %s\n" - return fmt % (label, - version, - module.__date__, - module.__developer__, - module.__buildsys__) - -def _main(parser): - global exit_status - global this_build_status - - options = parser.values - - # Here's where everything really happens. - - # First order of business: set up default warnings and then - # handle the user's warning options, so that we can issue (or - # suppress) appropriate warnings about anything that might happen, - # as configured by the user. - - default_warnings = [ SCons.Warnings.CorruptSConsignWarning, - SCons.Warnings.DeprecatedWarning, - SCons.Warnings.DuplicateEnvironmentWarning, - SCons.Warnings.FutureReservedVariableWarning, - SCons.Warnings.LinkWarning, - SCons.Warnings.MissingSConscriptWarning, - SCons.Warnings.NoMD5ModuleWarning, - SCons.Warnings.NoMetaclassSupportWarning, - SCons.Warnings.NoObjectCountWarning, - SCons.Warnings.NoParallelSupportWarning, - SCons.Warnings.MisleadingKeywordsWarning, - SCons.Warnings.ReservedVariableWarning, - SCons.Warnings.StackSizeWarning, - ] - - for warning in default_warnings: - SCons.Warnings.enableWarningClass(warning) - SCons.Warnings._warningOut = _scons_internal_warning - SCons.Warnings.process_warn_strings(options.warn) - - # Now that we have the warnings configuration set up, we can actually - # issue (or suppress) any warnings about warning-worthy things that - # occurred while the command-line options were getting parsed. - try: - dw = options.delayed_warnings - except AttributeError: - pass - else: - delayed_warnings.extend(dw) - for warning_type, message in delayed_warnings: - SCons.Warnings.warn(warning_type, message) - - if options.diskcheck: - SCons.Node.FS.set_diskcheck(options.diskcheck) - - # Next, we want to create the FS object that represents the outside - # world's file system, as that's central to a lot of initialization. - # To do this, however, we need to be in the directory from which we - # want to start everything, which means first handling any relevant - # options that might cause us to chdir somewhere (-C, -D, -U, -u). - if options.directory: - cdir = _create_path(options.directory) - try: - os.chdir(cdir) - except OSError: - sys.stderr.write("Could not change directory to %s\n" % cdir) - - target_top = None - if options.climb_up: - target_top = '.' # directory to prepend to targets - script_dir = os.getcwd() # location of script - while script_dir and not _SConstruct_exists(script_dir, - options.repository, - options.file): - script_dir, last_part = os.path.split(script_dir) - if last_part: - target_top = os.path.join(last_part, target_top) - else: - script_dir = '' - if script_dir and script_dir != os.getcwd(): - display("scons: Entering directory `%s'" % script_dir) - os.chdir(script_dir) - - # Now that we're in the top-level SConstruct directory, go ahead - # and initialize the FS object that represents the file system, - # and make it the build engine default. - fs = SCons.Node.FS.get_default_fs() - - for rep in options.repository: - fs.Repository(rep) - - # Now that we have the FS object, the next order of business is to - # check for an SConstruct file (or other specified config file). - # If there isn't one, we can bail before doing any more work. - scripts = [] - if options.file: - scripts.extend(options.file) - if not scripts: - sfile = _SConstruct_exists(repositories=options.repository, - filelist=options.file) - if sfile: - scripts.append(sfile) - - if not scripts: - if options.help: - # There's no SConstruct, but they specified -h. - # Give them the options usage now, before we fail - # trying to read a non-existent SConstruct file. - raise SConsPrintHelpException - raise SCons.Errors.UserError, "No SConstruct file found." - - if scripts[0] == "-": - d = fs.getcwd() - else: - d = fs.File(scripts[0]).dir - fs.set_SConstruct_dir(d) - - _set_debug_values(options) - SCons.Node.implicit_cache = options.implicit_cache - SCons.Node.implicit_deps_changed = options.implicit_deps_changed - SCons.Node.implicit_deps_unchanged = options.implicit_deps_unchanged - - if options.no_exec: - SCons.SConf.dryrun = 1 - SCons.Action.execute_actions = None - if options.question: - SCons.SConf.dryrun = 1 - if options.clean: - SCons.SConf.SetBuildType('clean') - if options.help: - SCons.SConf.SetBuildType('help') - SCons.SConf.SetCacheMode(options.config) - SCons.SConf.SetProgressDisplay(progress_display) - - if options.no_progress or options.silent: - progress_display.set_mode(0) - - if options.site_dir: - _load_site_scons_dir(d, options.site_dir) - elif not options.no_site_dir: - _load_site_scons_dir(d) - - if options.include_dir: - sys.path = options.include_dir + sys.path - - # That should cover (most of) the options. Next, set up the variables - # that hold command-line arguments, so the SConscript files that we - # read and execute have access to them. - targets = [] - xmit_args = [] - for a in parser.largs: - if a[0] == '-': - continue - if '=' in a: - xmit_args.append(a) - else: - targets.append(a) - SCons.Script._Add_Targets(targets + parser.rargs) - SCons.Script._Add_Arguments(xmit_args) - - # If stdout is not a tty, replace it with a wrapper object to call flush - # after every write. - # - # Tty devices automatically flush after every newline, so the replacement - # isn't necessary. Furthermore, if we replace sys.stdout, the readline - # module will no longer work. This affects the behavior during - # --interactive mode. --interactive should only be used when stdin and - # stdout refer to a tty. - if not sys.stdout.isatty(): - sys.stdout = SCons.Util.Unbuffered(sys.stdout) - if not sys.stderr.isatty(): - sys.stderr = SCons.Util.Unbuffered(sys.stderr) - - memory_stats.append('before reading SConscript files:') - count_stats.append(('pre-', 'read')) - - # And here's where we (finally) read the SConscript files. - - progress_display("scons: Reading SConscript files ...") - - start_time = time.time() - try: - for script in scripts: - SCons.Script._SConscript._SConscript(fs, script) - except SCons.Errors.StopError, e: - # We had problems reading an SConscript file, such as it - # couldn't be copied in to the VariantDir. Since we're just - # reading SConscript files and haven't started building - # things yet, stop regardless of whether they used -i or -k - # or anything else. - sys.stderr.write("scons: *** %s Stop.\n" % e) - exit_status = 2 - sys.exit(exit_status) - global sconscript_time - sconscript_time = time.time() - start_time - - progress_display("scons: done reading SConscript files.") - - memory_stats.append('after reading SConscript files:') - count_stats.append(('post-', 'read')) - - # Re-{enable,disable} warnings in case they disabled some in - # the SConscript file. - # - # We delay enabling the PythonVersionWarning class until here so that, - # if they explicity disabled it in either in the command line or in - # $SCONSFLAGS, or in the SConscript file, then the search through - # the list of deprecated warning classes will find that disabling - # first and not issue the warning. - SCons.Warnings.enableWarningClass(SCons.Warnings.PythonVersionWarning) - SCons.Warnings.process_warn_strings(options.warn) - - # Now that we've read the SConscript files, we can check for the - # warning about deprecated Python versions--delayed until here - # in case they disabled the warning in the SConscript files. - if python_version_deprecated(): - msg = "Support for pre-2.2 Python (%s) is deprecated.\n" + \ - " If this will cause hardship, contact dev@scons.tigris.org." - SCons.Warnings.warn(SCons.Warnings.PythonVersionWarning, - msg % python_version_string()) - - if not options.help: - SCons.SConf.CreateConfigHBuilder(SCons.Defaults.DefaultEnvironment()) - - # Now re-parse the command-line options (any to the left of a '--' - # argument, that is) with any user-defined command-line options that - # the SConscript files may have added to the parser object. This will - # emit the appropriate error message and exit if any unknown option - # was specified on the command line. - - parser.preserve_unknown_options = False - parser.parse_args(parser.largs, options) - - if options.help: - help_text = SCons.Script.help_text - if help_text is None: - # They specified -h, but there was no Help() inside the - # SConscript files. Give them the options usage. - raise SConsPrintHelpException - else: - print help_text - print "Use scons -H for help about command-line options." - exit_status = 0 - return - - # Change directory to the top-level SConstruct directory, then tell - # the Node.FS subsystem that we're all done reading the SConscript - # files and calling Repository() and VariantDir() and changing - # directories and the like, so it can go ahead and start memoizing - # the string values of file system nodes. - - fs.chdir(fs.Top) - - SCons.Node.FS.save_strings(1) - - # Now that we've read the SConscripts we can set the options - # that are SConscript settable: - SCons.Node.implicit_cache = options.implicit_cache - SCons.Node.FS.set_duplicate(options.duplicate) - fs.set_max_drift(options.max_drift) - - SCons.Job.explicit_stack_size = options.stack_size - - if options.md5_chunksize: - SCons.Node.FS.File.md5_chunksize = options.md5_chunksize - - platform = SCons.Platform.platform_module() - - if options.interactive: - SCons.Script.Interactive.interact(fs, OptionsParser, options, - targets, target_top) - - else: - - # Build the targets - nodes = _build_targets(fs, options, targets, target_top) - if not nodes: - exit_status = 2 - -def _build_targets(fs, options, targets, target_top): - - global this_build_status - this_build_status = 0 - - progress_display.set_mode(not (options.no_progress or options.silent)) - display.set_mode(not options.silent) - SCons.Action.print_actions = not options.silent - SCons.Action.execute_actions = not options.no_exec - SCons.Node.FS.do_store_info = not options.no_exec - SCons.SConf.dryrun = options.no_exec - - if options.diskcheck: - SCons.Node.FS.set_diskcheck(options.diskcheck) - - SCons.CacheDir.cache_enabled = not options.cache_disable - SCons.CacheDir.cache_debug = options.cache_debug - SCons.CacheDir.cache_force = options.cache_force - SCons.CacheDir.cache_show = options.cache_show - - if options.no_exec: - CleanTask.execute = CleanTask.show - else: - CleanTask.execute = CleanTask.remove - - lookup_top = None - if targets or SCons.Script.BUILD_TARGETS != SCons.Script._build_plus_default: - # They specified targets on the command line or modified - # BUILD_TARGETS in the SConscript file(s), so if they used -u, - # -U or -D, we have to look up targets relative to the top, - # but we build whatever they specified. - if target_top: - lookup_top = fs.Dir(target_top) - target_top = None - - targets = SCons.Script.BUILD_TARGETS - else: - # There are no targets specified on the command line, - # so if they used -u, -U or -D, we may have to restrict - # what actually gets built. - d = None - if target_top: - if options.climb_up == 1: - # -u, local directory and below - target_top = fs.Dir(target_top) - lookup_top = target_top - elif options.climb_up == 2: - # -D, all Default() targets - target_top = None - lookup_top = None - elif options.climb_up == 3: - # -U, local SConscript Default() targets - target_top = fs.Dir(target_top) - def check_dir(x, target_top=target_top): - if hasattr(x, 'cwd') and not x.cwd is None: - cwd = x.cwd.srcnode() - return cwd == target_top - else: - # x doesn't have a cwd, so it's either not a target, - # or not a file, so go ahead and keep it as a default - # target and let the engine sort it out: - return 1 - d = filter(check_dir, SCons.Script.DEFAULT_TARGETS) - SCons.Script.DEFAULT_TARGETS[:] = d - target_top = None - lookup_top = None - - targets = SCons.Script._Get_Default_Targets(d, fs) - - if not targets: - sys.stderr.write("scons: *** No targets specified and no Default() targets found. Stop.\n") - return None - - def Entry(x, ltop=lookup_top, ttop=target_top, fs=fs): - if isinstance(x, SCons.Node.Node): - node = x - else: - node = None - # Why would ltop be None? Unfortunately this happens. - if ltop == None: ltop = '' - # Curdir becomes important when SCons is called with -u, -C, - # or similar option that changes directory, and so the paths - # of targets given on the command line need to be adjusted. - curdir = os.path.join(os.getcwd(), str(ltop)) - for lookup in SCons.Node.arg2nodes_lookups: - node = lookup(x, curdir=curdir) - if node != None: - break - if node is None: - node = fs.Entry(x, directory=ltop, create=1) - if ttop and not node.is_under(ttop): - if isinstance(node, SCons.Node.FS.Dir) and ttop.is_under(node): - node = ttop - else: - node = None - return node - - nodes = filter(None, map(Entry, targets)) - - task_class = BuildTask # default action is to build targets - opening_message = "Building targets ..." - closing_message = "done building targets." - if options.keep_going: - failure_message = "done building targets (errors occurred during build)." - else: - failure_message = "building terminated because of errors." - if options.question: - task_class = QuestionTask - try: - if options.clean: - task_class = CleanTask - opening_message = "Cleaning targets ..." - closing_message = "done cleaning targets." - if options.keep_going: - failure_message = "done cleaning targets (errors occurred during clean)." - else: - failure_message = "cleaning terminated because of errors." - except AttributeError: - pass - - task_class.progress = ProgressObject - - if options.random: - def order(dependencies): - """Randomize the dependencies.""" - import random - # This is cribbed from the implementation of - # random.shuffle() in Python 2.X. - d = dependencies - for i in xrange(len(d)-1, 0, -1): - j = int(random.random() * (i+1)) - d[i], d[j] = d[j], d[i] - return d - else: - def order(dependencies): - """Leave the order of dependencies alone.""" - return dependencies - - if options.taskmastertrace_file == '-': - tmtrace = sys.stdout - elif options.taskmastertrace_file: - tmtrace = open(options.taskmastertrace_file, 'wb') - else: - tmtrace = None - taskmaster = SCons.Taskmaster.Taskmaster(nodes, task_class, order, tmtrace) - - # Let the BuildTask objects get at the options to respond to the - # various print_* settings, tree_printer list, etc. - BuildTask.options = options - - global num_jobs - num_jobs = options.num_jobs - jobs = SCons.Job.Jobs(num_jobs, taskmaster) - if num_jobs > 1: - msg = None - if jobs.num_jobs == 1: - msg = "parallel builds are unsupported by this version of Python;\n" + \ - "\tignoring -j or num_jobs option.\n" - elif sys.platform == 'win32': - msg = fetch_win32_parallel_msg() - if msg: - SCons.Warnings.warn(SCons.Warnings.NoParallelSupportWarning, msg) - - memory_stats.append('before building targets:') - count_stats.append(('pre-', 'build')) - - def jobs_postfunc( - jobs=jobs, - options=options, - closing_message=closing_message, - failure_message=failure_message - ): - if jobs.were_interrupted(): - if not options.no_progress and not options.silent: - sys.stderr.write("scons: Build interrupted.\n") - global exit_status - global this_build_status - exit_status = 2 - this_build_status = 2 - - if this_build_status: - progress_display("scons: " + failure_message) - else: - progress_display("scons: " + closing_message) - if not options.no_exec: - if jobs.were_interrupted(): - progress_display("scons: writing .sconsign file.") - SCons.SConsign.write() - - progress_display("scons: " + opening_message) - jobs.run(postfunc = jobs_postfunc) - - memory_stats.append('after building targets:') - count_stats.append(('post-', 'build')) - - return nodes - -def _exec_main(parser, values): - sconsflags = os.environ.get('SCONSFLAGS', '') - all_args = string.split(sconsflags) + sys.argv[1:] - - options, args = parser.parse_args(all_args, values) - - if type(options.debug) == type([]) and "pdb" in options.debug: - import pdb - pdb.Pdb().runcall(_main, parser) - elif options.profile_file: - try: - from cProfile import Profile - except ImportError, e: - from profile import Profile - - # Some versions of Python 2.4 shipped a profiler that had the - # wrong 'c_exception' entry in its dispatch table. Make sure - # we have the right one. (This may put an unnecessary entry - # in the table in earlier versions of Python, but its presence - # shouldn't hurt anything). - try: - dispatch = Profile.dispatch - except AttributeError: - pass - else: - dispatch['c_exception'] = Profile.trace_dispatch_return - - prof = Profile() - try: - prof.runcall(_main, parser) - except SConsPrintHelpException, e: - prof.dump_stats(options.profile_file) - raise e - except SystemExit: - pass - prof.dump_stats(options.profile_file) - else: - _main(parser) - -def main(): - global OptionsParser - global exit_status - global first_command_start - - # Check up front for a Python version we do not support. We - # delay the check for deprecated Python versions until later, - # after the SConscript files have been read, in case they - # disable that warning. - if python_version_unsupported(): - msg = "scons: *** SCons version %s does not run under Python version %s.\n" - sys.stderr.write(msg % (SCons.__version__, python_version_string())) - sys.exit(1) - - parts = ["SCons by Steven Knight et al.:\n"] - try: - import __main__ - parts.append(version_string("script", __main__)) - except (ImportError, AttributeError): - # On Windows there is no scons.py, so there is no - # __main__.__version__, hence there is no script version. - pass - parts.append(version_string("engine", SCons)) - parts.append("Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation") - version = string.join(parts, '') - - import SConsOptions - parser = SConsOptions.Parser(version) - values = SConsOptions.SConsValues(parser.get_default_values()) - - OptionsParser = parser - - try: - _exec_main(parser, values) - except SystemExit, s: - if s: - exit_status = s - except KeyboardInterrupt: - print("scons: Build interrupted.") - sys.exit(2) - except SyntaxError, e: - _scons_syntax_error(e) - except SCons.Errors.InternalError: - _scons_internal_error() - except SCons.Errors.UserError, e: - _scons_user_error(e) - except SConsPrintHelpException: - parser.print_help() - exit_status = 0 - except SCons.Errors.BuildError, e: - exit_status = e.exitstatus - except: - # An exception here is likely a builtin Python exception Python - # code in an SConscript file. Show them precisely what the - # problem was and where it happened. - SCons.Script._SConscript.SConscript_exception() - sys.exit(2) - - memory_stats.print_stats() - count_stats.print_stats() - - if print_objects: - SCons.Debug.listLoggedInstances('*') - #SCons.Debug.dumpLoggedInstances('*') - - if print_memoizer: - SCons.Memoize.Dump("Memoizer (memory cache) hits and misses:") - - # Dump any development debug info that may have been enabled. - # These are purely for internal debugging during development, so - # there's no need to control them with --debug= options; they're - # controlled by changing the source code. - SCons.Debug.dump_caller_counts() - SCons.Taskmaster.dump_stats() - - if print_time: - total_time = time.time() - SCons.Script.start_time - if num_jobs == 1: - ct = cumulative_command_time - else: - if last_command_end is None or first_command_start is None: - ct = 0.0 - else: - ct = last_command_end - first_command_start - scons_time = total_time - sconscript_time - ct - print "Total build time: %f seconds"%total_time - print "Total SConscript file execution time: %f seconds"%sconscript_time - print "Total SCons execution time: %f seconds"%scons_time - print "Total command execution time: %f seconds"%ct - - sys.exit(exit_status) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Script/SConsOptions.py b/3rdParty/SCons/scons-local/SCons/Script/SConsOptions.py deleted file mode 100644 index 7724590..0000000 --- a/3rdParty/SCons/scons-local/SCons/Script/SConsOptions.py +++ /dev/null @@ -1,946 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Script/SConsOptions.py 4043 2009/02/23 09:06:45 scons" - -import optparse -import re -import string -import sys -import textwrap - -try: - no_hyphen_re = re.compile(r'(\s+|(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))') -except re.error: - # Pre-2.0 Python versions don't have the (?<= negative - # look-behind assertion. - no_hyphen_re = re.compile(r'(\s+|-*\w{2,}-(?=\w{2,}))') - -try: - from gettext import gettext -except ImportError: - def gettext(message): - return message -_ = gettext - -import SCons.Node.FS -import SCons.Warnings - -OptionValueError = optparse.OptionValueError -SUPPRESS_HELP = optparse.SUPPRESS_HELP - -diskcheck_all = SCons.Node.FS.diskcheck_types() - -def diskcheck_convert(value): - if value is None: - return [] - if not SCons.Util.is_List(value): - value = string.split(value, ',') - result = [] - for v in map(string.lower, value): - if v == 'all': - result = diskcheck_all - elif v == 'none': - result = [] - elif v in diskcheck_all: - result.append(v) - else: - raise ValueError, v - return result - -class SConsValues(optparse.Values): - """ - Holder class for uniform access to SCons options, regardless - of whether or not they can be set on the command line or in the - SConscript files (using the SetOption() function). - - A SCons option value can originate three different ways: - - 1) set on the command line; - 2) set in an SConscript file; - 3) the default setting (from the the op.add_option() - calls in the Parser() function, below). - - The command line always overrides a value set in a SConscript file, - which in turn always overrides default settings. Because we want - to support user-specified options in the SConscript file itself, - though, we may not know about all of the options when the command - line is first parsed, so we can't make all the necessary precedence - decisions at the time the option is configured. - - The solution implemented in this class is to keep these different sets - of settings separate (command line, SConscript file, and default) - and to override the __getattr__() method to check them in turn. - This should allow the rest of the code to just fetch values as - attributes of an instance of this class, without having to worry - about where they came from. - - Note that not all command line options are settable from SConscript - files, and the ones that are must be explicitly added to the - "settable" list in this class, and optionally validated and coerced - in the set_option() method. - """ - - def __init__(self, defaults): - self.__dict__['__defaults__'] = defaults - self.__dict__['__SConscript_settings__'] = {} - - def __getattr__(self, attr): - """ - Fetches an options value, checking first for explicit settings - from the command line (which are direct attributes), then the - SConscript file settings, then the default values. - """ - try: - return self.__dict__[attr] - except KeyError: - try: - return self.__dict__['__SConscript_settings__'][attr] - except KeyError: - return getattr(self.__dict__['__defaults__'], attr) - - settable = [ - 'clean', - 'diskcheck', - 'duplicate', - 'help', - 'implicit_cache', - 'max_drift', - 'md5_chunksize', - 'no_exec', - 'num_jobs', - 'random', - 'stack_size', - 'warn', - ] - - def set_option(self, name, value): - """ - Sets an option from an SConscript file. - """ - if not name in self.settable: - raise SCons.Errors.UserError, "This option is not settable from a SConscript file: %s"%name - - if name == 'num_jobs': - try: - value = int(value) - if value < 1: - raise ValueError - except ValueError: - raise SCons.Errors.UserError, "A positive integer is required: %s"%repr(value) - elif name == 'max_drift': - try: - value = int(value) - except ValueError: - raise SCons.Errors.UserError, "An integer is required: %s"%repr(value) - elif name == 'duplicate': - try: - value = str(value) - except ValueError: - raise SCons.Errors.UserError, "A string is required: %s"%repr(value) - if not value in SCons.Node.FS.Valid_Duplicates: - raise SCons.Errors.UserError, "Not a valid duplication style: %s" % value - # Set the duplicate style right away so it can affect linking - # of SConscript files. - SCons.Node.FS.set_duplicate(value) - elif name == 'diskcheck': - try: - value = diskcheck_convert(value) - except ValueError, v: - raise SCons.Errors.UserError, "Not a valid diskcheck value: %s"%v - if not self.__dict__.has_key('diskcheck'): - # No --diskcheck= option was specified on the command line. - # Set this right away so it can affect the rest of the - # file/Node lookups while processing the SConscript files. - SCons.Node.FS.set_diskcheck(value) - elif name == 'stack_size': - try: - value = int(value) - except ValueError: - raise SCons.Errors.UserError, "An integer is required: %s"%repr(value) - elif name == 'md5_chunksize': - try: - value = int(value) - except ValueError: - raise SCons.Errors.UserError, "An integer is required: %s"%repr(value) - elif name == 'warn': - if SCons.Util.is_String(value): - value = [value] - value = self.__SConscript_settings__.get(name, []) + value - SCons.Warnings.process_warn_strings(value) - - self.__SConscript_settings__[name] = value - -class SConsOption(optparse.Option): - def convert_value(self, opt, value): - if value is not None: - if self.nargs in (1, '?'): - return self.check_value(opt, value) - else: - return tuple(map(lambda v, o=opt, s=self: s.check_value(o, v), value)) - - def process(self, opt, value, values, parser): - - # First, convert the value(s) to the right type. Howl if any - # value(s) are bogus. - value = self.convert_value(opt, value) - - # And then take whatever action is expected of us. - # This is a separate method to make life easier for - # subclasses to add new actions. - return self.take_action( - self.action, self.dest, opt, value, values, parser) - - def _check_nargs_optional(self): - if self.nargs == '?' and self._short_opts: - fmt = "option %s: nargs='?' is incompatible with short options" - raise SCons.Errors.UserError, fmt % self._short_opts[0] - - try: - _orig_CONST_ACTIONS = optparse.Option.CONST_ACTIONS - - _orig_CHECK_METHODS = optparse.Option.CHECK_METHODS - - except AttributeError: - # optparse.Option had no CONST_ACTIONS before Python 2.5. - - _orig_CONST_ACTIONS = ("store_const",) - - def _check_const(self): - if self.action not in self.CONST_ACTIONS and self.const is not None: - raise OptionError( - "'const' must not be supplied for action %r" % self.action, - self) - - # optparse.Option collects its list of unbound check functions - # up front. This sucks because it means we can't just override - # the _check_const() function like a normal method, we have to - # actually replace it in the list. This seems to be the most - # straightforward way to do that. - - _orig_CHECK_METHODS = [optparse.Option._check_action, - optparse.Option._check_type, - optparse.Option._check_choice, - optparse.Option._check_dest, - _check_const, - optparse.Option._check_nargs, - optparse.Option._check_callback] - - CHECK_METHODS = _orig_CHECK_METHODS + [_check_nargs_optional] - - CONST_ACTIONS = _orig_CONST_ACTIONS + optparse.Option.TYPED_ACTIONS - -class SConsOptionGroup(optparse.OptionGroup): - """ - A subclass for SCons-specific option groups. - - The only difference between this and the base class is that we print - the group's help text flush left, underneath their own title but - lined up with the normal "SCons Options". - """ - def format_help(self, formatter): - """ - Format an option group's help text, outdenting the title so it's - flush with the "SCons Options" title we print at the top. - """ - formatter.dedent() - result = formatter.format_heading(self.title) - formatter.indent() - result = result + optparse.OptionContainer.format_help(self, formatter) - return result - -class SConsOptionParser(optparse.OptionParser): - preserve_unknown_options = False - - def error(self, msg): - self.print_usage(sys.stderr) - sys.stderr.write("SCons error: %s\n" % msg) - sys.exit(2) - - def _process_long_opt(self, rargs, values): - """ - SCons-specific processing of long options. - - This is copied directly from the normal - optparse._process_long_opt() method, except that, if configured - to do so, we catch the exception thrown when an unknown option - is encountered and just stick it back on the "leftover" arguments - for later (re-)processing. - """ - arg = rargs.pop(0) - - # Value explicitly attached to arg? Pretend it's the next - # argument. - if "=" in arg: - (opt, next_arg) = string.split(arg, "=", 1) - rargs.insert(0, next_arg) - had_explicit_value = True - else: - opt = arg - had_explicit_value = False - - try: - opt = self._match_long_opt(opt) - except optparse.BadOptionError: - if self.preserve_unknown_options: - # SCons-specific: if requested, add unknown options to - # the "leftover arguments" list for later processing. - self.largs.append(arg) - if had_explicit_value: - # The unknown option will be re-processed later, - # so undo the insertion of the explicit value. - rargs.pop(0) - return - raise - - option = self._long_opt[opt] - if option.takes_value(): - nargs = option.nargs - if nargs == '?': - if had_explicit_value: - value = rargs.pop(0) - else: - value = option.const - elif len(rargs) < nargs: - if nargs == 1: - self.error(_("%s option requires an argument") % opt) - else: - self.error(_("%s option requires %d arguments") - % (opt, nargs)) - elif nargs == 1: - value = rargs.pop(0) - else: - value = tuple(rargs[0:nargs]) - del rargs[0:nargs] - - elif had_explicit_value: - self.error(_("%s option does not take a value") % opt) - - else: - value = None - - option.process(opt, value, values, self) - - def add_local_option(self, *args, **kw): - """ - Adds a local option to the parser. - - This is initiated by a SetOption() call to add a user-defined - command-line option. We add the option to a separate option - group for the local options, creating the group if necessary. - """ - try: - group = self.local_option_group - except AttributeError: - group = SConsOptionGroup(self, 'Local Options') - group = self.add_option_group(group) - self.local_option_group = group - - result = apply(group.add_option, args, kw) - - if result: - # The option was added succesfully. We now have to add the - # default value to our object that holds the default values - # (so that an attempt to fetch the option's attribute will - # yield the default value when not overridden) and then - # we re-parse the leftover command-line options, so that - # any value overridden on the command line is immediately - # available if the user turns around and does a GetOption() - # right away. - setattr(self.values.__defaults__, result.dest, result.default) - self.parse_args(self.largs, self.values) - - return result - -class SConsIndentedHelpFormatter(optparse.IndentedHelpFormatter): - def format_usage(self, usage): - return "usage: %s\n" % usage - - def format_heading(self, heading): - """ - This translates any heading of "options" or "Options" into - "SCons Options." Unfortunately, we have to do this here, - because those titles are hard-coded in the optparse calls. - """ - if heading == 'options': - # The versions of optparse.py shipped with Pythons 2.3 and - # 2.4 pass this in uncapitalized; override that so we get - # consistent output on all versions. - heading = "Options" - if heading == 'Options': - heading = "SCons Options" - return optparse.IndentedHelpFormatter.format_heading(self, heading) - - def format_option(self, option): - """ - A copy of the normal optparse.IndentedHelpFormatter.format_option() - method. This has been snarfed so we can modify text wrapping to - out liking: - - -- add our own regular expression that doesn't break on hyphens - (so things like --no-print-directory don't get broken); - - -- wrap the list of options themselves when it's too long - (the wrapper.fill(opts) call below); - - -- set the subsequent_indent when wrapping the help_text. - """ - # The help for each option consists of two parts: - # * the opt strings and metavars - # eg. ("-x", or "-fFILENAME, --file=FILENAME") - # * the user-supplied help string - # eg. ("turn on expert mode", "read data from FILENAME") - # - # If possible, we write both of these on the same line: - # -x turn on expert mode - # - # But if the opt string list is too long, we put the help - # string on a second line, indented to the same column it would - # start in if it fit on the first line. - # -fFILENAME, --file=FILENAME - # read data from FILENAME - result = [] - - try: - opts = self.option_strings[option] - except AttributeError: - # The Python 2.3 version of optparse attaches this to - # to the option argument, not to this object. - opts = option.option_strings - - opt_width = self.help_position - self.current_indent - 2 - if len(opts) > opt_width: - wrapper = textwrap.TextWrapper(width=self.width, - initial_indent = ' ', - subsequent_indent = ' ') - wrapper.wordsep_re = no_hyphen_re - opts = wrapper.fill(opts) + '\n' - indent_first = self.help_position - else: # start help on same line as opts - opts = "%*s%-*s " % (self.current_indent, "", opt_width, opts) - indent_first = 0 - result.append(opts) - if option.help: - - try: - expand_default = self.expand_default - except AttributeError: - # The HelpFormatter base class in the Python 2.3 version - # of optparse has no expand_default() method. - help_text = option.help - else: - help_text = expand_default(option) - - # SCons: indent every line of the help text but the first. - wrapper = textwrap.TextWrapper(width=self.help_width, - subsequent_indent = ' ') - wrapper.wordsep_re = no_hyphen_re - help_lines = wrapper.wrap(help_text) - result.append("%*s%s\n" % (indent_first, "", help_lines[0])) - for line in help_lines[1:]: - result.append("%*s%s\n" % (self.help_position, "", line)) - elif opts[-1] != "\n": - result.append("\n") - return string.join(result, "") - - # For consistent help output across Python versions, we provide a - # subclass copy of format_option_strings() and these two variables. - # This is necessary (?) for Python2.3, which otherwise concatenates - # a short option with its metavar. - _short_opt_fmt = "%s %s" - _long_opt_fmt = "%s=%s" - - def format_option_strings(self, option): - """Return a comma-separated list of option strings & metavariables.""" - if option.takes_value(): - metavar = option.metavar or string.upper(option.dest) - short_opts = [] - for sopt in option._short_opts: - short_opts.append(self._short_opt_fmt % (sopt, metavar)) - long_opts = [] - for lopt in option._long_opts: - long_opts.append(self._long_opt_fmt % (lopt, metavar)) - else: - short_opts = option._short_opts - long_opts = option._long_opts - - if self.short_first: - opts = short_opts + long_opts - else: - opts = long_opts + short_opts - - return string.join(opts, ", ") - -def Parser(version): - """ - Returns an options parser object initialized with the standard - SCons options. - """ - - formatter = SConsIndentedHelpFormatter(max_help_position=30) - - op = SConsOptionParser(option_class=SConsOption, - add_help_option=False, - formatter=formatter, - usage="usage: scons [OPTION] [TARGET] ...",) - - op.preserve_unknown_options = True - op.version = version - - # Add the options to the parser we just created. - # - # These are in the order we want them to show up in the -H help - # text, basically alphabetical. Each op.add_option() call below - # should have a consistent format: - # - # op.add_option("-L", "--long-option-name", - # nargs=1, type="string", - # dest="long_option_name", default='foo', - # action="callback", callback=opt_long_option, - # help="help text goes here", - # metavar="VAR") - # - # Even though the optparse module constructs reasonable default - # destination names from the long option names, we're going to be - # explicit about each one for easier readability and so this code - # will at least show up when grepping the source for option attribute - # names, or otherwise browsing the source code. - - # options ignored for compatibility - def opt_ignore(option, opt, value, parser): - sys.stderr.write("Warning: ignoring %s option\n" % opt) - op.add_option("-b", "-d", "-e", "-m", "-S", "-t", "-w", - "--environment-overrides", - "--no-keep-going", - "--no-print-directory", - "--print-directory", - "--stop", - "--touch", - action="callback", callback=opt_ignore, - help="Ignored for compatibility.") - - op.add_option('-c', '--clean', '--remove', - dest="clean", default=False, - action="store_true", - help="Remove specified targets and dependencies.") - - op.add_option('-C', '--directory', - nargs=1, type="string", - dest="directory", default=[], - action="append", - help="Change to DIR before doing anything.", - metavar="DIR") - - op.add_option('--cache-debug', - nargs=1, - dest="cache_debug", default=None, - action="store", - help="Print CacheDir debug info to FILE.", - metavar="FILE") - - op.add_option('--cache-disable', '--no-cache', - dest='cache_disable', default=False, - action="store_true", - help="Do not retrieve built targets from CacheDir.") - - op.add_option('--cache-force', '--cache-populate', - dest='cache_force', default=False, - action="store_true", - help="Copy already-built targets into the CacheDir.") - - op.add_option('--cache-show', - dest='cache_show', default=False, - action="store_true", - help="Print build actions for files from CacheDir.") - - config_options = ["auto", "force" ,"cache"] - - def opt_config(option, opt, value, parser, c_options=config_options): - if not value in c_options: - raise OptionValueError("Warning: %s is not a valid config type" % value) - setattr(parser.values, option.dest, value) - opt_config_help = "Controls Configure subsystem: %s." \ - % string.join(config_options, ", ") - op.add_option('--config', - nargs=1, type="string", - dest="config", default="auto", - action="callback", callback=opt_config, - help = opt_config_help, - metavar="MODE") - - op.add_option('-D', - dest="climb_up", default=None, - action="store_const", const=2, - help="Search up directory tree for SConstruct, " - "build all Default() targets.") - - deprecated_debug_options = { - "dtree" : '; please use --tree=derived instead', - "nomemoizer" : ' and has no effect', - "stree" : '; please use --tree=all,status instead', - "tree" : '; please use --tree=all instead', - } - - debug_options = ["count", "explain", "findlibs", - "includes", "memoizer", "memory", "objects", - "pdb", "presub", "stacktrace", - "time"] + deprecated_debug_options.keys() - - def opt_debug(option, opt, value, parser, - debug_options=debug_options, - deprecated_debug_options=deprecated_debug_options): - if value in debug_options: - parser.values.debug.append(value) - if value in deprecated_debug_options.keys(): - try: - parser.values.delayed_warnings - except AttributeError: - parser.values.delayed_warnings = [] - msg = deprecated_debug_options[value] - w = "The --debug=%s option is deprecated%s." % (value, msg) - t = (SCons.Warnings.DeprecatedWarning, w) - parser.values.delayed_warnings.append(t) - else: - raise OptionValueError("Warning: %s is not a valid debug type" % value) - opt_debug_help = "Print various types of debugging information: %s." \ - % string.join(debug_options, ", ") - op.add_option('--debug', - nargs=1, type="string", - dest="debug", default=[], - action="callback", callback=opt_debug, - help=opt_debug_help, - metavar="TYPE") - - def opt_diskcheck(option, opt, value, parser): - try: - diskcheck_value = diskcheck_convert(value) - except ValueError, e: - raise OptionValueError("Warning: `%s' is not a valid diskcheck type" % e) - setattr(parser.values, option.dest, diskcheck_value) - - op.add_option('--diskcheck', - nargs=1, type="string", - dest='diskcheck', default=None, - action="callback", callback=opt_diskcheck, - help="Enable specific on-disk checks.", - metavar="TYPE") - - def opt_duplicate(option, opt, value, parser): - if not value in SCons.Node.FS.Valid_Duplicates: - raise OptionValueError("`%s' is not a valid duplication style." % value) - setattr(parser.values, option.dest, value) - # Set the duplicate style right away so it can affect linking - # of SConscript files. - SCons.Node.FS.set_duplicate(value) - - opt_duplicate_help = "Set the preferred duplication methods. Must be one of " \ - + string.join(SCons.Node.FS.Valid_Duplicates, ", ") - - op.add_option('--duplicate', - nargs=1, type="string", - dest="duplicate", default='hard-soft-copy', - action="callback", callback=opt_duplicate, - help=opt_duplicate_help) - - op.add_option('-f', '--file', '--makefile', '--sconstruct', - nargs=1, type="string", - dest="file", default=[], - action="append", - help="Read FILE as the top-level SConstruct file.") - - op.add_option('-h', '--help', - dest="help", default=False, - action="store_true", - help="Print defined help message, or this one.") - - op.add_option("-H", "--help-options", - action="help", - help="Print this message and exit.") - - op.add_option('-i', '--ignore-errors', - dest='ignore_errors', default=False, - action="store_true", - help="Ignore errors from build actions.") - - op.add_option('-I', '--include-dir', - nargs=1, - dest='include_dir', default=[], - action="append", - help="Search DIR for imported Python modules.", - metavar="DIR") - - op.add_option('--implicit-cache', - dest='implicit_cache', default=False, - action="store_true", - help="Cache implicit dependencies") - - def opt_implicit_deps(option, opt, value, parser): - setattr(parser.values, 'implicit_cache', True) - setattr(parser.values, option.dest, True) - - op.add_option('--implicit-deps-changed', - dest="implicit_deps_changed", default=False, - action="callback", callback=opt_implicit_deps, - help="Ignore cached implicit dependencies.") - - op.add_option('--implicit-deps-unchanged', - dest="implicit_deps_unchanged", default=False, - action="callback", callback=opt_implicit_deps, - help="Ignore changes in implicit dependencies.") - - op.add_option('--interact', '--interactive', - dest='interactive', default=False, - action="store_true", - help="Run in interactive mode.") - - op.add_option('-j', '--jobs', - nargs=1, type="int", - dest="num_jobs", default=1, - action="store", - help="Allow N jobs at once.", - metavar="N") - - op.add_option('-k', '--keep-going', - dest='keep_going', default=False, - action="store_true", - help="Keep going when a target can't be made.") - - op.add_option('--max-drift', - nargs=1, type="int", - dest='max_drift', default=SCons.Node.FS.default_max_drift, - action="store", - help="Set maximum system clock drift to N seconds.", - metavar="N") - - op.add_option('--md5-chunksize', - nargs=1, type="int", - dest='md5_chunksize', default=SCons.Node.FS.File.md5_chunksize, - action="store", - help="Set chunk-size for MD5 signature computation to N kilobytes.", - metavar="N") - - op.add_option('-n', '--no-exec', '--just-print', '--dry-run', '--recon', - dest='no_exec', default=False, - action="store_true", - help="Don't build; just print commands.") - - op.add_option('--no-site-dir', - dest='no_site_dir', default=False, - action="store_true", - help="Don't search or use the usual site_scons dir.") - - op.add_option('--profile', - nargs=1, - dest="profile_file", default=None, - action="store", - help="Profile SCons and put results in FILE.", - metavar="FILE") - - op.add_option('-q', '--question', - dest="question", default=False, - action="store_true", - help="Don't build; exit status says if up to date.") - - op.add_option('-Q', - dest='no_progress', default=False, - action="store_true", - help="Suppress \"Reading/Building\" progress messages.") - - op.add_option('--random', - dest="random", default=False, - action="store_true", - help="Build dependencies in random order.") - - op.add_option('-s', '--silent', '--quiet', - dest="silent", default=False, - action="store_true", - help="Don't print commands.") - - op.add_option('--site-dir', - nargs=1, - dest='site_dir', default=None, - action="store", - help="Use DIR instead of the usual site_scons dir.", - metavar="DIR") - - op.add_option('--stack-size', - nargs=1, type="int", - dest='stack_size', - action="store", - help="Set the stack size of the threads used to run jobs to N kilobytes.", - metavar="N") - - op.add_option('--taskmastertrace', - nargs=1, - dest="taskmastertrace_file", default=None, - action="store", - help="Trace Node evaluation to FILE.", - metavar="FILE") - - tree_options = ["all", "derived", "prune", "status"] - - def opt_tree(option, opt, value, parser, tree_options=tree_options): - import Main - tp = Main.TreePrinter() - for o in string.split(value, ','): - if o == 'all': - tp.derived = False - elif o == 'derived': - tp.derived = True - elif o == 'prune': - tp.prune = True - elif o == 'status': - tp.status = True - else: - raise OptionValueError("Warning: %s is not a valid --tree option" % o) - parser.values.tree_printers.append(tp) - - opt_tree_help = "Print a dependency tree in various formats: %s." \ - % string.join(tree_options, ", ") - - op.add_option('--tree', - nargs=1, type="string", - dest="tree_printers", default=[], - action="callback", callback=opt_tree, - help=opt_tree_help, - metavar="OPTIONS") - - op.add_option('-u', '--up', '--search-up', - dest="climb_up", default=0, - action="store_const", const=1, - help="Search up directory tree for SConstruct, " - "build targets at or below current directory.") - - op.add_option('-U', - dest="climb_up", default=0, - action="store_const", const=3, - help="Search up directory tree for SConstruct, " - "build Default() targets from local SConscript.") - - def opt_version(option, opt, value, parser): - sys.stdout.write(parser.version + '\n') - sys.exit(0) - op.add_option("-v", "--version", - action="callback", callback=opt_version, - help="Print the SCons version number and exit.") - - def opt_warn(option, opt, value, parser, tree_options=tree_options): - if SCons.Util.is_String(value): - value = string.split(value, ',') - parser.values.warn.extend(value) - - op.add_option('--warn', '--warning', - nargs=1, type="string", - dest="warn", default=[], - action="callback", callback=opt_warn, - help="Enable or disable warnings.", - metavar="WARNING-SPEC") - - op.add_option('-Y', '--repository', '--srcdir', - nargs=1, - dest="repository", default=[], - action="append", - help="Search REPOSITORY for source and target files.") - - # Options from Make and Cons classic that we do not yet support, - # but which we may support someday and whose (potential) meanings - # we don't want to change. These all get a "the -X option is not - # yet implemented" message and don't show up in the help output. - - def opt_not_yet(option, opt, value, parser): - msg = "Warning: the %s option is not yet implemented\n" % opt - sys.stderr.write(msg) - sys.exit(0) - - - op.add_option('-l', '--load-average', '--max-load', - nargs=1, type="int", - dest="load_average", default=0, - action="callback", callback=opt_not_yet, - # action="store", - # help="Don't start multiple jobs unless load is below " - # "LOAD-AVERAGE." - help=SUPPRESS_HELP) - op.add_option('--list-actions', - dest="list_actions", - action="callback", callback=opt_not_yet, - # help="Don't build; list files and build actions." - help=SUPPRESS_HELP) - op.add_option('--list-derived', - dest="list_derived", - action="callback", callback=opt_not_yet, - # help="Don't build; list files that would be built." - help=SUPPRESS_HELP) - op.add_option('--list-where', - dest="list_where", - action="callback", callback=opt_not_yet, - # help="Don't build; list files and where defined." - help=SUPPRESS_HELP) - op.add_option('-o', '--old-file', '--assume-old', - nargs=1, type="string", - dest="old_file", default=[], - action="callback", callback=opt_not_yet, - # action="append", - # help = "Consider FILE to be old; don't rebuild it." - help=SUPPRESS_HELP) - op.add_option('--override', - nargs=1, type="string", - action="callback", callback=opt_not_yet, - dest="override", - # help="Override variables as specified in FILE." - help=SUPPRESS_HELP) - op.add_option('-p', - action="callback", callback=opt_not_yet, - dest="p", - # help="Print internal environments/objects." - help=SUPPRESS_HELP) - op.add_option('-r', '-R', '--no-builtin-rules', '--no-builtin-variables', - action="callback", callback=opt_not_yet, - dest="no_builtin_rules", - # help="Clear default environments and variables." - help=SUPPRESS_HELP) - op.add_option('--write-filenames', - nargs=1, type="string", - dest="write_filenames", - action="callback", callback=opt_not_yet, - # help="Write all filenames examined into FILE." - help=SUPPRESS_HELP) - op.add_option('-W', '--new-file', '--assume-new', '--what-if', - nargs=1, type="string", - dest="new_file", - action="callback", callback=opt_not_yet, - # help="Consider FILE to be changed." - help=SUPPRESS_HELP) - op.add_option('--warn-undefined-variables', - dest="warn_undefined_variables", - action="callback", callback=opt_not_yet, - # help="Warn when an undefined variable is referenced." - help=SUPPRESS_HELP) - - return op - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Script/SConscript.py b/3rdParty/SCons/scons-local/SCons/Script/SConscript.py deleted file mode 100644 index cde6dec..0000000 --- a/3rdParty/SCons/scons-local/SCons/Script/SConscript.py +++ /dev/null @@ -1,638 +0,0 @@ -"""SCons.Script.SConscript - -This module defines the Python API provided to SConscript and SConstruct -files. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Script/SConscript.py 4043 2009/02/23 09:06:45 scons" - -import SCons -import SCons.Action -import SCons.Builder -import SCons.Defaults -import SCons.Environment -import SCons.Errors -import SCons.Node -import SCons.Node.Alias -import SCons.Node.FS -import SCons.Platform -import SCons.SConf -import SCons.Script.Main -import SCons.Tool -import SCons.Util - -import os -import os.path -import re -import string -import sys -import traceback -import types -import UserList - -# The following variables used to live in this module. Some -# SConscript files out there may have referred to them directly as -# SCons.Script.SConscript.*. This is now supported by some special -# handling towards the bottom of the SConscript.__init__.py module. -#Arguments = {} -#ArgList = [] -#BuildTargets = TargetList() -#CommandLineTargets = [] -#DefaultTargets = [] - -class SConscriptReturn(Exception): - pass - -launch_dir = os.path.abspath(os.curdir) - -GlobalDict = None - -# global exports set by Export(): -global_exports = {} - -# chdir flag -sconscript_chdir = 1 - -def get_calling_namespaces(): - """Return the locals and globals for the function that called - into this module in the current call stack.""" - try: 1/0 - except ZeroDivisionError: - # Don't start iterating with the current stack-frame to - # prevent creating reference cycles (f_back is safe). - frame = sys.exc_info()[2].tb_frame.f_back - - # Find the first frame that *isn't* from this file. This means - # that we expect all of the SCons frames that implement an Export() - # or SConscript() call to be in this file, so that we can identify - # the first non-Script.SConscript frame as the user's local calling - # environment, and the locals and globals dictionaries from that - # frame as the calling namespaces. See the comment below preceding - # the DefaultEnvironmentCall block for even more explanation. - while frame.f_globals.get("__name__") == __name__: - frame = frame.f_back - - return frame.f_locals, frame.f_globals - - -def compute_exports(exports): - """Compute a dictionary of exports given one of the parameters - to the Export() function or the exports argument to SConscript().""" - - loc, glob = get_calling_namespaces() - - retval = {} - try: - for export in exports: - if SCons.Util.is_Dict(export): - retval.update(export) - else: - try: - retval[export] = loc[export] - except KeyError: - retval[export] = glob[export] - except KeyError, x: - raise SCons.Errors.UserError, "Export of non-existent variable '%s'"%x - - return retval - -class Frame: - """A frame on the SConstruct/SConscript call stack""" - def __init__(self, fs, exports, sconscript): - self.globals = BuildDefaultGlobals() - self.retval = None - self.prev_dir = fs.getcwd() - self.exports = compute_exports(exports) # exports from the calling SConscript - # make sure the sconscript attr is a Node. - if isinstance(sconscript, SCons.Node.Node): - self.sconscript = sconscript - elif sconscript == '-': - self.sconscript = None - else: - self.sconscript = fs.File(str(sconscript)) - -# the SConstruct/SConscript call stack: -call_stack = [] - -# For documentation on the methods in this file, see the scons man-page - -def Return(*vars, **kw): - retval = [] - try: - fvars = SCons.Util.flatten(vars) - for var in fvars: - for v in string.split(var): - retval.append(call_stack[-1].globals[v]) - except KeyError, x: - raise SCons.Errors.UserError, "Return of non-existent variable '%s'"%x - - if len(retval) == 1: - call_stack[-1].retval = retval[0] - else: - call_stack[-1].retval = tuple(retval) - - stop = kw.get('stop', True) - - if stop: - raise SConscriptReturn - - -stack_bottom = '% Stack boTTom %' # hard to define a variable w/this name :) - -def _SConscript(fs, *files, **kw): - top = fs.Top - sd = fs.SConstruct_dir.rdir() - exports = kw.get('exports', []) - - # evaluate each SConscript file - results = [] - for fn in files: - call_stack.append(Frame(fs, exports, fn)) - old_sys_path = sys.path - try: - SCons.Script.sconscript_reading = SCons.Script.sconscript_reading + 1 - if fn == "-": - exec sys.stdin in call_stack[-1].globals - else: - if isinstance(fn, SCons.Node.Node): - f = fn - else: - f = fs.File(str(fn)) - _file_ = None - - # Change directory to the top of the source - # tree to make sure the os's cwd and the cwd of - # fs match so we can open the SConscript. - fs.chdir(top, change_os_dir=1) - if f.rexists(): - _file_ = open(f.rfile().get_abspath(), "r") - elif f.has_src_builder(): - # The SConscript file apparently exists in a source - # code management system. Build it, but then clear - # the builder so that it doesn't get built *again* - # during the actual build phase. - f.build() - f.built() - f.builder_set(None) - if f.exists(): - _file_ = open(f.get_abspath(), "r") - if _file_: - # Chdir to the SConscript directory. Use a path - # name relative to the SConstruct file so that if - # we're using the -f option, we're essentially - # creating a parallel SConscript directory structure - # in our local directory tree. - # - # XXX This is broken for multiple-repository cases - # where the SConstruct and SConscript files might be - # in different Repositories. For now, cross that - # bridge when someone comes to it. - try: - src_dir = kw['src_dir'] - except KeyError: - ldir = fs.Dir(f.dir.get_path(sd)) - else: - ldir = fs.Dir(src_dir) - if not ldir.is_under(f.dir): - # They specified a source directory, but - # it's above the SConscript directory. - # Do the sensible thing and just use the - # SConcript directory. - ldir = fs.Dir(f.dir.get_path(sd)) - try: - fs.chdir(ldir, change_os_dir=sconscript_chdir) - except OSError: - # There was no local directory, so we should be - # able to chdir to the Repository directory. - # Note that we do this directly, not through - # fs.chdir(), because we still need to - # interpret the stuff within the SConscript file - # relative to where we are logically. - fs.chdir(ldir, change_os_dir=0) - # TODO Not sure how to handle src_dir here - os.chdir(f.rfile().dir.get_abspath()) - - # Append the SConscript directory to the beginning - # of sys.path so Python modules in the SConscript - # directory can be easily imported. - sys.path = [ f.dir.get_abspath() ] + sys.path - - # This is the magic line that actually reads up - # and executes the stuff in the SConscript file. - # The locals for this frame contain the special - # bottom-of-the-stack marker so that any - # exceptions that occur when processing this - # SConscript can base the printed frames at this - # level and not show SCons internals as well. - call_stack[-1].globals.update({stack_bottom:1}) - old_file = call_stack[-1].globals.get('__file__') - try: - del call_stack[-1].globals['__file__'] - except KeyError: - pass - try: - try: - exec _file_ in call_stack[-1].globals - except SConscriptReturn: - pass - finally: - if old_file is not None: - call_stack[-1].globals.update({__file__:old_file}) - else: - SCons.Warnings.warn(SCons.Warnings.MissingSConscriptWarning, - "Ignoring missing SConscript '%s'" % f.path) - - finally: - SCons.Script.sconscript_reading = SCons.Script.sconscript_reading - 1 - sys.path = old_sys_path - frame = call_stack.pop() - try: - fs.chdir(frame.prev_dir, change_os_dir=sconscript_chdir) - except OSError: - # There was no local directory, so chdir to the - # Repository directory. Like above, we do this - # directly. - fs.chdir(frame.prev_dir, change_os_dir=0) - rdir = frame.prev_dir.rdir() - rdir._create() # Make sure there's a directory there. - try: - os.chdir(rdir.get_abspath()) - except OSError, e: - # We still couldn't chdir there, so raise the error, - # but only if actions are being executed. - # - # If the -n option was used, the directory would *not* - # have been created and we should just carry on and - # let things muddle through. This isn't guaranteed - # to work if the SConscript files are reading things - # from disk (for example), but it should work well - # enough for most configurations. - if SCons.Action.execute_actions: - raise e - - results.append(frame.retval) - - # if we only have one script, don't return a tuple - if len(results) == 1: - return results[0] - else: - return tuple(results) - -def SConscript_exception(file=sys.stderr): - """Print an exception stack trace just for the SConscript file(s). - This will show users who have Python errors where the problem is, - without cluttering the output with all of the internal calls leading - up to where we exec the SConscript.""" - exc_type, exc_value, exc_tb = sys.exc_info() - tb = exc_tb - while tb and not tb.tb_frame.f_locals.has_key(stack_bottom): - tb = tb.tb_next - if not tb: - # We did not find our exec statement, so this was actually a bug - # in SCons itself. Show the whole stack. - tb = exc_tb - stack = traceback.extract_tb(tb) - try: - type = exc_type.__name__ - except AttributeError: - type = str(exc_type) - if type[:11] == "exceptions.": - type = type[11:] - file.write('%s: %s:\n' % (type, exc_value)) - for fname, line, func, text in stack: - file.write(' File "%s", line %d:\n' % (fname, line)) - file.write(' %s\n' % text) - -def annotate(node): - """Annotate a node with the stack frame describing the - SConscript file and line number that created it.""" - tb = sys.exc_info()[2] - while tb and not tb.tb_frame.f_locals.has_key(stack_bottom): - tb = tb.tb_next - if not tb: - # We did not find any exec of an SConscript file: what?! - raise SCons.Errors.InternalError, "could not find SConscript stack frame" - node.creator = traceback.extract_stack(tb)[0] - -# The following line would cause each Node to be annotated using the -# above function. Unfortunately, this is a *huge* performance hit, so -# leave this disabled until we find a more efficient mechanism. -#SCons.Node.Annotate = annotate - -class SConsEnvironment(SCons.Environment.Base): - """An Environment subclass that contains all of the methods that - are particular to the wrapper SCons interface and which aren't - (or shouldn't be) part of the build engine itself. - - Note that not all of the methods of this class have corresponding - global functions, there are some private methods. - """ - - # - # Private methods of an SConsEnvironment. - # - def _exceeds_version(self, major, minor, v_major, v_minor): - """Return 1 if 'major' and 'minor' are greater than the version - in 'v_major' and 'v_minor', and 0 otherwise.""" - return (major > v_major or (major == v_major and minor > v_minor)) - - def _get_major_minor_revision(self, version_string): - """Split a version string into major, minor and (optionally) - revision parts. - - This is complicated by the fact that a version string can be - something like 3.2b1.""" - version = string.split(string.split(version_string, ' ')[0], '.') - v_major = int(version[0]) - v_minor = int(re.match('\d+', version[1]).group()) - if len(version) >= 3: - v_revision = int(re.match('\d+', version[2]).group()) - else: - v_revision = 0 - return v_major, v_minor, v_revision - - def _get_SConscript_filenames(self, ls, kw): - """ - Convert the parameters passed to # SConscript() calls into a list - of files and export variables. If the parameters are invalid, - throws SCons.Errors.UserError. Returns a tuple (l, e) where l - is a list of SConscript filenames and e is a list of exports. - """ - exports = [] - - if len(ls) == 0: - try: - dirs = kw["dirs"] - except KeyError: - raise SCons.Errors.UserError, \ - "Invalid SConscript usage - no parameters" - - if not SCons.Util.is_List(dirs): - dirs = [ dirs ] - dirs = map(str, dirs) - - name = kw.get('name', 'SConscript') - - files = map(lambda n, name = name: os.path.join(n, name), dirs) - - elif len(ls) == 1: - - files = ls[0] - - elif len(ls) == 2: - - files = ls[0] - exports = self.Split(ls[1]) - - else: - - raise SCons.Errors.UserError, \ - "Invalid SConscript() usage - too many arguments" - - if not SCons.Util.is_List(files): - files = [ files ] - - if kw.get('exports'): - exports.extend(self.Split(kw['exports'])) - - variant_dir = kw.get('variant_dir') or kw.get('build_dir') - if variant_dir: - if len(files) != 1: - raise SCons.Errors.UserError, \ - "Invalid SConscript() usage - can only specify one SConscript with a variant_dir" - duplicate = kw.get('duplicate', 1) - src_dir = kw.get('src_dir') - if not src_dir: - src_dir, fname = os.path.split(str(files[0])) - files = [os.path.join(str(variant_dir), fname)] - else: - if not isinstance(src_dir, SCons.Node.Node): - src_dir = self.fs.Dir(src_dir) - fn = files[0] - if not isinstance(fn, SCons.Node.Node): - fn = self.fs.File(fn) - if fn.is_under(src_dir): - # Get path relative to the source directory. - fname = fn.get_path(src_dir) - files = [os.path.join(str(variant_dir), fname)] - else: - files = [fn.abspath] - kw['src_dir'] = variant_dir - self.fs.VariantDir(variant_dir, src_dir, duplicate) - - return (files, exports) - - # - # Public methods of an SConsEnvironment. These get - # entry points in the global name space so they can be called - # as global functions. - # - - def Configure(self, *args, **kw): - if not SCons.Script.sconscript_reading: - raise SCons.Errors.UserError, "Calling Configure from Builders is not supported." - kw['_depth'] = kw.get('_depth', 0) + 1 - return apply(SCons.Environment.Base.Configure, (self,)+args, kw) - - def Default(self, *targets): - SCons.Script._Set_Default_Targets(self, targets) - - def EnsureSConsVersion(self, major, minor, revision=0): - """Exit abnormally if the SCons version is not late enough.""" - scons_ver = self._get_major_minor_revision(SCons.__version__) - if scons_ver < (major, minor, revision): - if revision: - scons_ver_string = '%d.%d.%d' % (major, minor, revision) - else: - scons_ver_string = '%d.%d' % (major, minor) - print "SCons %s or greater required, but you have SCons %s" % \ - (scons_ver_string, SCons.__version__) - sys.exit(2) - - def EnsurePythonVersion(self, major, minor): - """Exit abnormally if the Python version is not late enough.""" - try: - v_major, v_minor, v_micro, release, serial = sys.version_info - python_ver = (v_major, v_minor) - except AttributeError: - python_ver = self._get_major_minor_revision(sys.version)[:2] - if python_ver < (major, minor): - v = string.split(sys.version, " ", 1)[0] - print "Python %d.%d or greater required, but you have Python %s" %(major,minor,v) - sys.exit(2) - - def Exit(self, value=0): - sys.exit(value) - - def Export(self, *vars): - for var in vars: - global_exports.update(compute_exports(self.Split(var))) - - def GetLaunchDir(self): - global launch_dir - return launch_dir - - def GetOption(self, name): - name = self.subst(name) - return SCons.Script.Main.GetOption(name) - - def Help(self, text): - text = self.subst(text, raw=1) - SCons.Script.HelpFunction(text) - - def Import(self, *vars): - try: - frame = call_stack[-1] - globals = frame.globals - exports = frame.exports - for var in vars: - var = self.Split(var) - for v in var: - if v == '*': - globals.update(global_exports) - globals.update(exports) - else: - if exports.has_key(v): - globals[v] = exports[v] - else: - globals[v] = global_exports[v] - except KeyError,x: - raise SCons.Errors.UserError, "Import of non-existent variable '%s'"%x - - def SConscript(self, *ls, **kw): - def subst_element(x, subst=self.subst): - if SCons.Util.is_List(x): - x = map(subst, x) - else: - x = subst(x) - return x - ls = map(subst_element, ls) - subst_kw = {} - for key, val in kw.items(): - if SCons.Util.is_String(val): - val = self.subst(val) - elif SCons.Util.is_List(val): - result = [] - for v in val: - if SCons.Util.is_String(v): - v = self.subst(v) - result.append(v) - val = result - subst_kw[key] = val - - files, exports = self._get_SConscript_filenames(ls, subst_kw) - subst_kw['exports'] = exports - return apply(_SConscript, [self.fs,] + files, subst_kw) - - def SConscriptChdir(self, flag): - global sconscript_chdir - sconscript_chdir = flag - - def SetOption(self, name, value): - name = self.subst(name) - SCons.Script.Main.SetOption(name, value) - -# -# -# -SCons.Environment.Environment = SConsEnvironment - -def Configure(*args, **kw): - if not SCons.Script.sconscript_reading: - raise SCons.Errors.UserError, "Calling Configure from Builders is not supported." - kw['_depth'] = 1 - return apply(SCons.SConf.SConf, args, kw) - -# It's very important that the DefaultEnvironmentCall() class stay in this -# file, with the get_calling_namespaces() function, the compute_exports() -# function, the Frame class and the SConsEnvironment.Export() method. -# These things make up the calling stack leading up to the actual global -# Export() or SConscript() call that the user issued. We want to allow -# users to export local variables that they define, like so: -# -# def func(): -# x = 1 -# Export('x') -# -# To support this, the get_calling_namespaces() function assumes that -# the *first* stack frame that's not from this file is the local frame -# for the Export() or SConscript() call. - -_DefaultEnvironmentProxy = None - -def get_DefaultEnvironmentProxy(): - global _DefaultEnvironmentProxy - if not _DefaultEnvironmentProxy: - default_env = SCons.Defaults.DefaultEnvironment() - _DefaultEnvironmentProxy = SCons.Environment.NoSubstitutionProxy(default_env) - return _DefaultEnvironmentProxy - -class DefaultEnvironmentCall: - """A class that implements "global function" calls of - Environment methods by fetching the specified method from the - DefaultEnvironment's class. Note that this uses an intermediate - proxy class instead of calling the DefaultEnvironment method - directly so that the proxy can override the subst() method and - thereby prevent expansion of construction variables (since from - the user's point of view this was called as a global function, - with no associated construction environment).""" - def __init__(self, method_name, subst=0): - self.method_name = method_name - if subst: - self.factory = SCons.Defaults.DefaultEnvironment - else: - self.factory = get_DefaultEnvironmentProxy - def __call__(self, *args, **kw): - env = self.factory() - method = getattr(env, self.method_name) - return apply(method, args, kw) - - -def BuildDefaultGlobals(): - """ - Create a dictionary containing all the default globals for - SConstruct and SConscript files. - """ - - global GlobalDict - if GlobalDict is None: - GlobalDict = {} - - import SCons.Script - d = SCons.Script.__dict__ - def not_a_module(m, d=d, mtype=type(SCons.Script)): - return type(d[m]) != mtype - for m in filter(not_a_module, dir(SCons.Script)): - GlobalDict[m] = d[m] - - return GlobalDict.copy() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Script/__init__.py b/3rdParty/SCons/scons-local/SCons/Script/__init__.py deleted file mode 100644 index fcfb717..0000000 --- a/3rdParty/SCons/scons-local/SCons/Script/__init__.py +++ /dev/null @@ -1,414 +0,0 @@ -"""SCons.Script - -This file implements the main() function used by the scons script. - -Architecturally, this *is* the scons script, and will likely only be -called from the external "scons" wrapper. Consequently, anything here -should not be, or be considered, part of the build engine. If it's -something that we expect other software to want to use, it should go in -some other module. If it's specific to the "scons" script invocation, -it goes here. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Script/__init__.py 4043 2009/02/23 09:06:45 scons" - -import time -start_time = time.time() - -import os -import string -import sys -import UserList - -# Special chicken-and-egg handling of the "--debug=memoizer" flag: -# -# SCons.Memoize contains a metaclass implementation that affects how -# the other classes are instantiated. The Memoizer may add shim methods -# to classes that have methods that cache computed values in order to -# count and report the hits and misses. -# -# If we wait to enable the Memoization until after we've parsed the -# command line options normally, it will be too late, because the Memoizer -# will have already analyzed the classes that it's Memoizing and decided -# to not add the shims. So we use a special-case, up-front check for -# the "--debug=memoizer" flag and enable Memoizer before we import any -# of the other modules that use it. - -_args = sys.argv + string.split(os.environ.get('SCONSFLAGS', '')) -if "--debug=memoizer" in _args: - import SCons.Memoize - import SCons.Warnings - try: - SCons.Memoize.EnableMemoization() - except SCons.Warnings.Warning: - # Some warning was thrown (inability to --debug=memoizer on - # Python 1.5.2 because it doesn't have metaclasses). Arrange - # for it to be displayed or not after warnings are configured. - import Main - exc_type, exc_value, tb = sys.exc_info() - Main.delayed_warnings.append((exc_type, exc_value)) -del _args - -import SCons.Action -import SCons.Builder -import SCons.Environment -import SCons.Node.FS -import SCons.Options -import SCons.Platform -import SCons.Scanner -import SCons.SConf -import SCons.Subst -import SCons.Tool -import SCons.Util -import SCons.Variables -import SCons.Defaults - -import Main - -main = Main.main - -# The following are global class definitions and variables that used to -# live directly in this module back before 0.96.90, when it contained -# a lot of code. Some SConscript files in widely-distributed packages -# (Blender is the specific example) actually reached into SCons.Script -# directly to use some of these. Rather than break those SConscript -# files, we're going to propagate these names into the SCons.Script -# namespace here. -# -# Some of these are commented out because it's *really* unlikely anyone -# used them, but we're going to leave the comment here to try to make -# it obvious what to do if the situation arises. -BuildTask = Main.BuildTask -CleanTask = Main.CleanTask -QuestionTask = Main.QuestionTask -#PrintHelp = Main.PrintHelp -#SConscriptSettableOptions = Main.SConscriptSettableOptions - -AddOption = Main.AddOption -GetOption = Main.GetOption -SetOption = Main.SetOption -Progress = Main.Progress -GetBuildFailures = Main.GetBuildFailures - -#keep_going_on_error = Main.keep_going_on_error -#print_dtree = Main.print_dtree -#print_explanations = Main.print_explanations -#print_includes = Main.print_includes -#print_objects = Main.print_objects -#print_time = Main.print_time -#print_tree = Main.print_tree -#memory_stats = Main.memory_stats -#ignore_errors = Main.ignore_errors -#sconscript_time = Main.sconscript_time -#command_time = Main.command_time -#exit_status = Main.exit_status -#profiling = Main.profiling -#repositories = Main.repositories - -# -import SConscript -_SConscript = SConscript - -call_stack = _SConscript.call_stack - -# -Action = SCons.Action.Action -AddMethod = SCons.Util.AddMethod -AllowSubstExceptions = SCons.Subst.SetAllowableExceptions -Builder = SCons.Builder.Builder -Configure = _SConscript.Configure -Environment = SCons.Environment.Environment -#OptParser = SCons.SConsOptions.OptParser -FindPathDirs = SCons.Scanner.FindPathDirs -Platform = SCons.Platform.Platform -Return = _SConscript.Return -Scanner = SCons.Scanner.Base -Tool = SCons.Tool.Tool -WhereIs = SCons.Util.WhereIs - -# -BoolVariable = SCons.Variables.BoolVariable -EnumVariable = SCons.Variables.EnumVariable -ListVariable = SCons.Variables.ListVariable -PackageVariable = SCons.Variables.PackageVariable -PathVariable = SCons.Variables.PathVariable - -# Deprecated names that will go away some day. -BoolOption = SCons.Options.BoolOption -EnumOption = SCons.Options.EnumOption -ListOption = SCons.Options.ListOption -PackageOption = SCons.Options.PackageOption -PathOption = SCons.Options.PathOption - -# Action factories. -Chmod = SCons.Defaults.Chmod -Copy = SCons.Defaults.Copy -Delete = SCons.Defaults.Delete -Mkdir = SCons.Defaults.Mkdir -Move = SCons.Defaults.Move -Touch = SCons.Defaults.Touch - -# Pre-made, public scanners. -CScanner = SCons.Tool.CScanner -DScanner = SCons.Tool.DScanner -DirScanner = SCons.Defaults.DirScanner -ProgramScanner = SCons.Tool.ProgramScanner -SourceFileScanner = SCons.Tool.SourceFileScanner - -# Functions we might still convert to Environment methods. -CScan = SCons.Defaults.CScan -DefaultEnvironment = SCons.Defaults.DefaultEnvironment - -# Other variables we provide. -class TargetList(UserList.UserList): - def _do_nothing(self, *args, **kw): - pass - def _add_Default(self, list): - self.extend(list) - def _clear(self): - del self[:] - -ARGUMENTS = {} -ARGLIST = [] -BUILD_TARGETS = TargetList() -COMMAND_LINE_TARGETS = [] -DEFAULT_TARGETS = [] - -# BUILD_TARGETS can be modified in the SConscript files. If so, we -# want to treat the modified BUILD_TARGETS list as if they specified -# targets on the command line. To do that, though, we need to know if -# BUILD_TARGETS was modified through "official" APIs or by hand. We do -# this by updating two lists in parallel, the documented BUILD_TARGETS -# list, above, and this internal _build_plus_default targets list which -# should only have "official" API changes. Then Script/Main.py can -# compare these two afterwards to figure out if the user added their -# own targets to BUILD_TARGETS. -_build_plus_default = TargetList() - -def _Add_Arguments(alist): - for arg in alist: - a, b = string.split(arg, '=', 1) - ARGUMENTS[a] = b - ARGLIST.append((a, b)) - -def _Add_Targets(tlist): - if tlist: - COMMAND_LINE_TARGETS.extend(tlist) - BUILD_TARGETS.extend(tlist) - BUILD_TARGETS._add_Default = BUILD_TARGETS._do_nothing - BUILD_TARGETS._clear = BUILD_TARGETS._do_nothing - _build_plus_default.extend(tlist) - _build_plus_default._add_Default = _build_plus_default._do_nothing - _build_plus_default._clear = _build_plus_default._do_nothing - -def _Set_Default_Targets_Has_Been_Called(d, fs): - return DEFAULT_TARGETS - -def _Set_Default_Targets_Has_Not_Been_Called(d, fs): - if d is None: - d = [fs.Dir('.')] - return d - -_Get_Default_Targets = _Set_Default_Targets_Has_Not_Been_Called - -def _Set_Default_Targets(env, tlist): - global DEFAULT_TARGETS - global _Get_Default_Targets - _Get_Default_Targets = _Set_Default_Targets_Has_Been_Called - for t in tlist: - if t is None: - # Delete the elements from the list in-place, don't - # reassign an empty list to DEFAULT_TARGETS, so that the - # variables will still point to the same object we point to. - del DEFAULT_TARGETS[:] - BUILD_TARGETS._clear() - _build_plus_default._clear() - elif isinstance(t, SCons.Node.Node): - DEFAULT_TARGETS.append(t) - BUILD_TARGETS._add_Default([t]) - _build_plus_default._add_Default([t]) - else: - nodes = env.arg2nodes(t, env.fs.Entry) - DEFAULT_TARGETS.extend(nodes) - BUILD_TARGETS._add_Default(nodes) - _build_plus_default._add_Default(nodes) - -# -help_text = None - -def HelpFunction(text): - global help_text - if SCons.Script.help_text is None: - SCons.Script.help_text = text - else: - help_text = help_text + text - -# -# Will be non-zero if we are reading an SConscript file. -sconscript_reading = 0 - -# -def Variables(files=[], args=ARGUMENTS): - return SCons.Variables.Variables(files, args) - -def Options(files=[], args=ARGUMENTS): - return SCons.Options.Options(files, args) - -# The list of global functions to add to the SConscript name space -# that end up calling corresponding methods or Builders in the -# DefaultEnvironment(). -GlobalDefaultEnvironmentFunctions = [ - # Methods from the SConsEnvironment class, above. - 'Default', - 'EnsurePythonVersion', - 'EnsureSConsVersion', - 'Exit', - 'Export', - 'GetLaunchDir', - 'Help', - 'Import', - #'SConscript', is handled separately, below. - 'SConscriptChdir', - - # Methods from the Environment.Base class. - 'AddPostAction', - 'AddPreAction', - 'Alias', - 'AlwaysBuild', - 'BuildDir', - 'CacheDir', - 'Clean', - #The Command() method is handled separately, below. - 'Decider', - 'Depends', - 'Dir', - 'NoClean', - 'NoCache', - 'Entry', - 'Execute', - 'File', - 'FindFile', - 'FindInstalledFiles', - 'FindSourceFiles', - 'Flatten', - 'GetBuildPath', - 'Glob', - 'Ignore', - 'Install', - 'InstallAs', - 'Literal', - 'Local', - 'ParseDepends', - 'Precious', - 'Repository', - 'Requires', - 'SConsignFile', - 'SideEffect', - 'SourceCode', - 'SourceSignatures', - 'Split', - 'Tag', - 'TargetSignatures', - 'Value', - 'VariantDir', -] - -GlobalDefaultBuilders = [ - # Supported builders. - 'CFile', - 'CXXFile', - 'DVI', - 'Jar', - 'Java', - 'JavaH', - 'Library', - 'M4', - 'MSVSProject', - 'Object', - 'PCH', - 'PDF', - 'PostScript', - 'Program', - 'RES', - 'RMIC', - 'SharedLibrary', - 'SharedObject', - 'StaticLibrary', - 'StaticObject', - 'Tar', - 'TypeLibrary', - 'Zip', - 'Package', -] - -for name in GlobalDefaultEnvironmentFunctions + GlobalDefaultBuilders: - exec "%s = _SConscript.DefaultEnvironmentCall(%s)" % (name, repr(name)) -del name - -# There are a handful of variables that used to live in the -# Script/SConscript.py module that some SConscript files out there were -# accessing directly as SCons.Script.SConscript.*. The problem is that -# "SConscript" in this namespace is no longer a module, it's a global -# function call--or more precisely, an object that implements a global -# function call through the default Environment. Nevertheless, we can -# maintain backwards compatibility for SConscripts that were reaching in -# this way by hanging some attributes off the "SConscript" object here. -SConscript = _SConscript.DefaultEnvironmentCall('SConscript') - -# Make SConscript look enough like the module it used to be so -# that pychecker doesn't barf. -SConscript.__name__ = 'SConscript' - -SConscript.Arguments = ARGUMENTS -SConscript.ArgList = ARGLIST -SConscript.BuildTargets = BUILD_TARGETS -SConscript.CommandLineTargets = COMMAND_LINE_TARGETS -SConscript.DefaultTargets = DEFAULT_TARGETS - -# The global Command() function must be handled differently than the -# global functions for other construction environment methods because -# we want people to be able to use Actions that must expand $TARGET -# and $SOURCE later, when (and if) the Action is invoked to build -# the target(s). We do this with the subst=1 argument, which creates -# a DefaultEnvironmentCall instance that wraps up a normal default -# construction environment that performs variable substitution, not a -# proxy that doesn't. -# -# There's a flaw here, though, because any other $-variables on a command -# line will *also* be expanded, each to a null string, but that should -# only be a problem in the unusual case where someone was passing a '$' -# on a command line and *expected* the $ to get through to the shell -# because they were calling Command() and not env.Command()... This is -# unlikely enough that we're going to leave this as is and cross that -# bridge if someone actually comes to it. -Command = _SConscript.DefaultEnvironmentCall('Command', subst=1) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Sig.py b/3rdParty/SCons/scons-local/SCons/Sig.py deleted file mode 100644 index 6feb19c..0000000 --- a/3rdParty/SCons/scons-local/SCons/Sig.py +++ /dev/null @@ -1,63 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Sig.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """Place-holder for the old SCons.Sig module hierarchy - -This is no longer used, but code out there (such as the NSIS module on -the SCons wiki) may try to import SCons.Sig. If so, we generate a warning -that points them to the line that caused the import, and don't die. - -If someone actually tried to use the sub-modules or functions within -the package (for example, SCons.Sig.MD5.signature()), then they'll still -get an AttributeError, but at least they'll know where to start looking. -""" - -import SCons.Util -import SCons.Warnings - -msg = 'The SCons.Sig module no longer exists.\n' \ - ' Remove the following "import SCons.Sig" line to eliminate this warning:' - -SCons.Warnings.warn(SCons.Warnings.DeprecatedWarning, msg) - -default_calc = None -default_module = None - -class MD5Null(SCons.Util.Null): - def __repr__(self): - return "MD5Null()" - -class TimeStampNull(SCons.Util.Null): - def __repr__(self): - return "TimeStampNull()" - -MD5 = MD5Null() -TimeStamp = TimeStampNull() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Subst.py b/3rdParty/SCons/scons-local/SCons/Subst.py deleted file mode 100644 index 1127424..0000000 --- a/3rdParty/SCons/scons-local/SCons/Subst.py +++ /dev/null @@ -1,911 +0,0 @@ -"""SCons.Subst - -SCons string substitution. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Subst.py 4043 2009/02/23 09:06:45 scons" - -import re -import string -import types -import UserList -import UserString - -import SCons.Errors - -from SCons.Util import is_String, is_Sequence - -# Indexed by the SUBST_* constants below. -_strconv = [SCons.Util.to_String_for_subst, - SCons.Util.to_String_for_subst, - SCons.Util.to_String_for_signature] - - - -AllowableExceptions = (IndexError, NameError) - -def SetAllowableExceptions(*excepts): - global AllowableExceptions - AllowableExceptions = filter(None, excepts) - -def raise_exception(exception, target, s): - name = exception.__class__.__name__ - msg = "%s `%s' trying to evaluate `%s'" % (name, exception, s) - if target: - raise SCons.Errors.BuildError, (target[0], msg) - else: - raise SCons.Errors.UserError, msg - - - -class Literal: - """A wrapper for a string. If you use this object wrapped - around a string, then it will be interpreted as literal. - When passed to the command interpreter, all special - characters will be escaped.""" - def __init__(self, lstr): - self.lstr = lstr - - def __str__(self): - return self.lstr - - def escape(self, escape_func): - return escape_func(self.lstr) - - def for_signature(self): - return self.lstr - - def is_literal(self): - return 1 - -class SpecialAttrWrapper: - """This is a wrapper for what we call a 'Node special attribute.' - This is any of the attributes of a Node that we can reference from - Environment variable substitution, such as $TARGET.abspath or - $SOURCES[1].filebase. We implement the same methods as Literal - so we can handle special characters, plus a for_signature method, - such that we can return some canonical string during signature - calculation to avoid unnecessary rebuilds.""" - - def __init__(self, lstr, for_signature=None): - """The for_signature parameter, if supplied, will be the - canonical string we return from for_signature(). Else - we will simply return lstr.""" - self.lstr = lstr - if for_signature: - self.forsig = for_signature - else: - self.forsig = lstr - - def __str__(self): - return self.lstr - - def escape(self, escape_func): - return escape_func(self.lstr) - - def for_signature(self): - return self.forsig - - def is_literal(self): - return 1 - -def quote_spaces(arg): - """Generic function for putting double quotes around any string that - has white space in it.""" - if ' ' in arg or '\t' in arg: - return '"%s"' % arg - else: - return str(arg) - -class CmdStringHolder(UserString.UserString): - """This is a special class used to hold strings generated by - scons_subst() and scons_subst_list(). It defines a special method - escape(). When passed a function with an escape algorithm for a - particular platform, it will return the contained string with the - proper escape sequences inserted. - """ - def __init__(self, cmd, literal=None): - UserString.UserString.__init__(self, cmd) - self.literal = literal - - def is_literal(self): - return self.literal - - def escape(self, escape_func, quote_func=quote_spaces): - """Escape the string with the supplied function. The - function is expected to take an arbitrary string, then - return it with all special characters escaped and ready - for passing to the command interpreter. - - After calling this function, the next call to str() will - return the escaped string. - """ - - if self.is_literal(): - return escape_func(self.data) - elif ' ' in self.data or '\t' in self.data: - return quote_func(self.data) - else: - return self.data - -def escape_list(list, escape_func): - """Escape a list of arguments by running the specified escape_func - on every object in the list that has an escape() method.""" - def escape(obj, escape_func=escape_func): - try: - e = obj.escape - except AttributeError: - return obj - else: - return e(escape_func) - return map(escape, list) - -class NLWrapper: - """A wrapper class that delays turning a list of sources or targets - into a NodeList until it's needed. The specified function supplied - when the object is initialized is responsible for turning raw nodes - into proxies that implement the special attributes like .abspath, - .source, etc. This way, we avoid creating those proxies just - "in case" someone is going to use $TARGET or the like, and only - go through the trouble if we really have to. - - In practice, this might be a wash performance-wise, but it's a little - cleaner conceptually... - """ - - def __init__(self, list, func): - self.list = list - self.func = func - def _return_nodelist(self): - return self.nodelist - def _gen_nodelist(self): - list = self.list - if list is None: - list = [] - elif not is_Sequence(list): - list = [list] - # The map(self.func) call is what actually turns - # a list into appropriate proxies. - self.nodelist = SCons.Util.NodeList(map(self.func, list)) - self._create_nodelist = self._return_nodelist - return self.nodelist - _create_nodelist = _gen_nodelist - - -class Targets_or_Sources(UserList.UserList): - """A class that implements $TARGETS or $SOURCES expansions by in turn - wrapping a NLWrapper. This class handles the different methods used - to access the list, calling the NLWrapper to create proxies on demand. - - Note that we subclass UserList.UserList purely so that the - is_Sequence() function will identify an object of this class as - a list during variable expansion. We're not really using any - UserList.UserList methods in practice. - """ - def __init__(self, nl): - self.nl = nl - def __getattr__(self, attr): - nl = self.nl._create_nodelist() - return getattr(nl, attr) - def __getitem__(self, i): - nl = self.nl._create_nodelist() - return nl[i] - def __getslice__(self, i, j): - nl = self.nl._create_nodelist() - i = max(i, 0); j = max(j, 0) - return nl[i:j] - def __str__(self): - nl = self.nl._create_nodelist() - return str(nl) - def __repr__(self): - nl = self.nl._create_nodelist() - return repr(nl) - -class Target_or_Source: - """A class that implements $TARGET or $SOURCE expansions by in turn - wrapping a NLWrapper. This class handles the different methods used - to access an individual proxy Node, calling the NLWrapper to create - a proxy on demand. - """ - def __init__(self, nl): - self.nl = nl - def __getattr__(self, attr): - nl = self.nl._create_nodelist() - try: - nl0 = nl[0] - except IndexError: - # If there is nothing in the list, then we have no attributes to - # pass through, so raise AttributeError for everything. - raise AttributeError, "NodeList has no attribute: %s" % attr - return getattr(nl0, attr) - def __str__(self): - nl = self.nl._create_nodelist() - if nl: - return str(nl[0]) - return '' - def __repr__(self): - nl = self.nl._create_nodelist() - if nl: - return repr(nl[0]) - return '' - -class NullNodeList(SCons.Util.NullSeq): - def __call__(self, *args, **kwargs): return '' - def __str__(self): return '' - # TODO(1.5): unneeded after new-style classes introduce iterators - def __getitem__(self, i): - raise IndexError - -NullNodesList = NullNodeList() - -def subst_dict(target, source): - """Create a dictionary for substitution of special - construction variables. - - This translates the following special arguments: - - target - the target (object or array of objects), - used to generate the TARGET and TARGETS - construction variables - - source - the source (object or array of objects), - used to generate the SOURCES and SOURCE - construction variables - """ - dict = {} - - if target: - def get_tgt_subst_proxy(thing): - try: - subst_proxy = thing.get_subst_proxy() - except AttributeError: - subst_proxy = thing # probably a string, just return it - return subst_proxy - tnl = NLWrapper(target, get_tgt_subst_proxy) - dict['TARGETS'] = Targets_or_Sources(tnl) - dict['TARGET'] = Target_or_Source(tnl) - - # This is a total cheat, but hopefully this dictionary goes - # away soon anyway. We just let these expand to $TARGETS - # because that's "good enough" for the use of ToolSurrogates - # (see test/ToolSurrogate.py) to generate documentation. - dict['CHANGED_TARGETS'] = '$TARGETS' - dict['UNCHANGED_TARGETS'] = '$TARGETS' - else: - dict['TARGETS'] = NullNodesList - dict['TARGET'] = NullNodesList - - if source: - def get_src_subst_proxy(node): - try: - rfile = node.rfile - except AttributeError: - pass - else: - node = rfile() - try: - return node.get_subst_proxy() - except AttributeError: - return node # probably a String, just return it - snl = NLWrapper(source, get_src_subst_proxy) - dict['SOURCES'] = Targets_or_Sources(snl) - dict['SOURCE'] = Target_or_Source(snl) - - # This is a total cheat, but hopefully this dictionary goes - # away soon anyway. We just let these expand to $TARGETS - # because that's "good enough" for the use of ToolSurrogates - # (see test/ToolSurrogate.py) to generate documentation. - dict['CHANGED_SOURCES'] = '$SOURCES' - dict['UNCHANGED_SOURCES'] = '$SOURCES' - else: - dict['SOURCES'] = NullNodesList - dict['SOURCE'] = NullNodesList - - return dict - -# Constants for the "mode" parameter to scons_subst_list() and -# scons_subst(). SUBST_RAW gives the raw command line. SUBST_CMD -# gives a command line suitable for passing to a shell. SUBST_SIG -# gives a command line appropriate for calculating the signature -# of a command line...if this changes, we should rebuild. -SUBST_CMD = 0 -SUBST_RAW = 1 -SUBST_SIG = 2 - -_rm = re.compile(r'\$[()]') -_remove = re.compile(r'\$\([^\$]*(\$[^\)][^\$]*)*\$\)') - -# Indexed by the SUBST_* constants above. -_regex_remove = [ _rm, None, _remove ] - -def _rm_list(list): - #return [ l for l in list if not l in ('$(', '$)') ] - return filter(lambda l: not l in ('$(', '$)'), list) - -def _remove_list(list): - result = [] - do_append = result.append - for l in list: - if l == '$(': - do_append = lambda x: None - elif l == '$)': - do_append = result.append - else: - do_append(l) - return result - -# Indexed by the SUBST_* constants above. -_list_remove = [ _rm_list, None, _remove_list ] - -# Regular expressions for splitting strings and handling substitutions, -# for use by the scons_subst() and scons_subst_list() functions: -# -# The first expression compiled matches all of the $-introduced tokens -# that we need to process in some way, and is used for substitutions. -# The expressions it matches are: -# -# "$$" -# "$(" -# "$)" -# "$variable" [must begin with alphabetic or underscore] -# "${any stuff}" -# -# The second expression compiled is used for splitting strings into tokens -# to be processed, and it matches all of the tokens listed above, plus -# the following that affect how arguments do or don't get joined together: -# -# " " [white space] -# "non-white-space" [without any dollar signs] -# "$" [single dollar sign] -# -_dollar_exps_str = r'\$[\$\(\)]|\$[_a-zA-Z][\.\w]*|\${[^}]*}' -_dollar_exps = re.compile(r'(%s)' % _dollar_exps_str) -_separate_args = re.compile(r'(%s|\s+|[^\s\$]+|\$)' % _dollar_exps_str) - -# This regular expression is used to replace strings of multiple white -# space characters in the string result from the scons_subst() function. -_space_sep = re.compile(r'[\t ]+(?![^{]*})') - -def scons_subst(strSubst, env, mode=SUBST_RAW, target=None, source=None, gvars={}, lvars={}, conv=None): - """Expand a string or list containing construction variable - substitutions. - - This is the work-horse function for substitutions in file names - and the like. The companion scons_subst_list() function (below) - handles separating command lines into lists of arguments, so see - that function if that's what you're looking for. - """ - if type(strSubst) == types.StringType and string.find(strSubst, '$') < 0: - return strSubst - - class StringSubber: - """A class to construct the results of a scons_subst() call. - - This binds a specific construction environment, mode, target and - source with two methods (substitute() and expand()) that handle - the expansion. - """ - def __init__(self, env, mode, conv, gvars): - self.env = env - self.mode = mode - self.conv = conv - self.gvars = gvars - - def expand(self, s, lvars): - """Expand a single "token" as necessary, returning an - appropriate string containing the expansion. - - This handles expanding different types of things (strings, - lists, callables) appropriately. It calls the wrapper - substitute() method to re-expand things as necessary, so that - the results of expansions of side-by-side strings still get - re-evaluated separately, not smushed together. - """ - if is_String(s): - try: - s0, s1 = s[:2] - except (IndexError, ValueError): - return s - if s0 != '$': - return s - if s1 == '$': - return '$' - elif s1 in '()': - return s - else: - key = s[1:] - if key[0] == '{' or string.find(key, '.') >= 0: - if key[0] == '{': - key = key[1:-1] - try: - s = eval(key, self.gvars, lvars) - except KeyboardInterrupt: - raise - except Exception, e: - if e.__class__ in AllowableExceptions: - return '' - raise_exception(e, lvars['TARGETS'], s) - else: - if lvars.has_key(key): - s = lvars[key] - elif self.gvars.has_key(key): - s = self.gvars[key] - elif not NameError in AllowableExceptions: - raise_exception(NameError(key), lvars['TARGETS'], s) - else: - return '' - - # Before re-expanding the result, handle - # recursive expansion by copying the local - # variable dictionary and overwriting a null - # string for the value of the variable name - # we just expanded. - # - # This could potentially be optimized by only - # copying lvars when s contains more expansions, - # but lvars is usually supposed to be pretty - # small, and deeply nested variable expansions - # are probably more the exception than the norm, - # so it should be tolerable for now. - lv = lvars.copy() - var = string.split(key, '.')[0] - lv[var] = '' - return self.substitute(s, lv) - elif is_Sequence(s): - def func(l, conv=self.conv, substitute=self.substitute, lvars=lvars): - return conv(substitute(l, lvars)) - return map(func, s) - elif callable(s): - try: - s = s(target=lvars['TARGETS'], - source=lvars['SOURCES'], - env=self.env, - for_signature=(self.mode != SUBST_CMD)) - except TypeError: - # This probably indicates that it's a callable - # object that doesn't match our calling arguments - # (like an Action). - if self.mode == SUBST_RAW: - return s - s = self.conv(s) - return self.substitute(s, lvars) - elif s is None: - return '' - else: - return s - - def substitute(self, args, lvars): - """Substitute expansions in an argument or list of arguments. - - This serves as a wrapper for splitting up a string into - separate tokens. - """ - if is_String(args) and not isinstance(args, CmdStringHolder): - args = str(args) # In case it's a UserString. - try: - def sub_match(match, conv=self.conv, expand=self.expand, lvars=lvars): - return conv(expand(match.group(1), lvars)) - result = _dollar_exps.sub(sub_match, args) - except TypeError: - # If the internal conversion routine doesn't return - # strings (it could be overridden to return Nodes, for - # example), then the 1.5.2 re module will throw this - # exception. Back off to a slower, general-purpose - # algorithm that works for all data types. - args = _separate_args.findall(args) - result = [] - for a in args: - result.append(self.conv(self.expand(a, lvars))) - if len(result) == 1: - result = result[0] - else: - result = string.join(map(str, result), '') - return result - else: - return self.expand(args, lvars) - - if conv is None: - conv = _strconv[mode] - - # Doing this every time is a bit of a waste, since the Executor - # has typically already populated the OverrideEnvironment with - # $TARGET/$SOURCE variables. We're keeping this (for now), though, - # because it supports existing behavior that allows us to call - # an Action directly with an arbitrary target+source pair, which - # we use in Tool/tex.py to handle calling $BIBTEX when necessary. - # If we dropped that behavior (or found another way to cover it), - # we could get rid of this call completely and just rely on the - # Executor setting the variables. - if not lvars.has_key('TARGET'): - d = subst_dict(target, source) - if d: - lvars = lvars.copy() - lvars.update(d) - - # We're (most likely) going to eval() things. If Python doesn't - # find a __builtins__ value in the global dictionary used for eval(), - # it copies the current global values for you. Avoid this by - # setting it explicitly and then deleting, so we don't pollute the - # construction environment Dictionary(ies) that are typically used - # for expansion. - gvars['__builtins__'] = __builtins__ - - ss = StringSubber(env, mode, conv, gvars) - result = ss.substitute(strSubst, lvars) - - try: - del gvars['__builtins__'] - except KeyError: - pass - - if is_String(result): - # Remove $(-$) pairs and any stuff in between, - # if that's appropriate. - remove = _regex_remove[mode] - if remove: - result = remove.sub('', result) - if mode != SUBST_RAW: - # Compress strings of white space characters into - # a single space. - result = string.strip(_space_sep.sub(' ', result)) - elif is_Sequence(result): - remove = _list_remove[mode] - if remove: - result = remove(result) - - return result - -#Subst_List_Strings = {} - -def scons_subst_list(strSubst, env, mode=SUBST_RAW, target=None, source=None, gvars={}, lvars={}, conv=None): - """Substitute construction variables in a string (or list or other - object) and separate the arguments into a command list. - - The companion scons_subst() function (above) handles basic - substitutions within strings, so see that function instead - if that's what you're looking for. - """ -# try: -# Subst_List_Strings[strSubst] = Subst_List_Strings[strSubst] + 1 -# except KeyError: -# Subst_List_Strings[strSubst] = 1 -# import SCons.Debug -# SCons.Debug.caller_trace(1) - class ListSubber(UserList.UserList): - """A class to construct the results of a scons_subst_list() call. - - Like StringSubber, this class binds a specific construction - environment, mode, target and source with two methods - (substitute() and expand()) that handle the expansion. - - In addition, however, this class is used to track the state of - the result(s) we're gathering so we can do the appropriate thing - whenever we have to append another word to the result--start a new - line, start a new word, append to the current word, etc. We do - this by setting the "append" attribute to the right method so - that our wrapper methods only need ever call ListSubber.append(), - and the rest of the object takes care of doing the right thing - internally. - """ - def __init__(self, env, mode, conv, gvars): - UserList.UserList.__init__(self, []) - self.env = env - self.mode = mode - self.conv = conv - self.gvars = gvars - - if self.mode == SUBST_RAW: - self.add_strip = lambda x, s=self: s.append(x) - else: - self.add_strip = lambda x, s=self: None - self.in_strip = None - self.next_line() - - def expand(self, s, lvars, within_list): - """Expand a single "token" as necessary, appending the - expansion to the current result. - - This handles expanding different types of things (strings, - lists, callables) appropriately. It calls the wrapper - substitute() method to re-expand things as necessary, so that - the results of expansions of side-by-side strings still get - re-evaluated separately, not smushed together. - """ - - if is_String(s): - try: - s0, s1 = s[:2] - except (IndexError, ValueError): - self.append(s) - return - if s0 != '$': - self.append(s) - return - if s1 == '$': - self.append('$') - elif s1 == '(': - self.open_strip('$(') - elif s1 == ')': - self.close_strip('$)') - else: - key = s[1:] - if key[0] == '{' or string.find(key, '.') >= 0: - if key[0] == '{': - key = key[1:-1] - try: - s = eval(key, self.gvars, lvars) - except KeyboardInterrupt: - raise - except Exception, e: - if e.__class__ in AllowableExceptions: - return - raise_exception(e, lvars['TARGETS'], s) - else: - if lvars.has_key(key): - s = lvars[key] - elif self.gvars.has_key(key): - s = self.gvars[key] - elif not NameError in AllowableExceptions: - raise_exception(NameError(), lvars['TARGETS'], s) - else: - return - - # Before re-expanding the result, handle - # recursive expansion by copying the local - # variable dictionary and overwriting a null - # string for the value of the variable name - # we just expanded. - lv = lvars.copy() - var = string.split(key, '.')[0] - lv[var] = '' - self.substitute(s, lv, 0) - self.this_word() - elif is_Sequence(s): - for a in s: - self.substitute(a, lvars, 1) - self.next_word() - elif callable(s): - try: - s = s(target=lvars['TARGETS'], - source=lvars['SOURCES'], - env=self.env, - for_signature=(self.mode != SUBST_CMD)) - except TypeError: - # This probably indicates that it's a callable - # object that doesn't match our calling arguments - # (like an Action). - if self.mode == SUBST_RAW: - self.append(s) - return - s = self.conv(s) - self.substitute(s, lvars, within_list) - elif s is None: - self.this_word() - else: - self.append(s) - - def substitute(self, args, lvars, within_list): - """Substitute expansions in an argument or list of arguments. - - This serves as a wrapper for splitting up a string into - separate tokens. - """ - - if is_String(args) and not isinstance(args, CmdStringHolder): - args = str(args) # In case it's a UserString. - args = _separate_args.findall(args) - for a in args: - if a[0] in ' \t\n\r\f\v': - if '\n' in a: - self.next_line() - elif within_list: - self.append(a) - else: - self.next_word() - else: - self.expand(a, lvars, within_list) - else: - self.expand(args, lvars, within_list) - - def next_line(self): - """Arrange for the next word to start a new line. This - is like starting a new word, except that we have to append - another line to the result.""" - UserList.UserList.append(self, []) - self.next_word() - - def this_word(self): - """Arrange for the next word to append to the end of the - current last word in the result.""" - self.append = self.add_to_current_word - - def next_word(self): - """Arrange for the next word to start a new word.""" - self.append = self.add_new_word - - def add_to_current_word(self, x): - """Append the string x to the end of the current last word - in the result. If that is not possible, then just add - it as a new word. Make sure the entire concatenated string - inherits the object attributes of x (in particular, the - escape function) by wrapping it as CmdStringHolder.""" - - if not self.in_strip or self.mode != SUBST_SIG: - try: - current_word = self[-1][-1] - except IndexError: - self.add_new_word(x) - else: - # All right, this is a hack and it should probably - # be refactored out of existence in the future. - # The issue is that we want to smoosh words together - # and make one file name that gets escaped if - # we're expanding something like foo$EXTENSION, - # but we don't want to smoosh them together if - # it's something like >$TARGET, because then we'll - # treat the '>' like it's part of the file name. - # So for now, just hard-code looking for the special - # command-line redirection characters... - try: - last_char = str(current_word)[-1] - except IndexError: - last_char = '\0' - if last_char in '<>|': - self.add_new_word(x) - else: - y = current_word + x - - # We used to treat a word appended to a literal - # as a literal itself, but this caused problems - # with interpreting quotes around space-separated - # targets on command lines. Removing this makes - # none of the "substantive" end-to-end tests fail, - # so we'll take this out but leave it commented - # for now in case there's a problem not covered - # by the test cases and we need to resurrect this. - #literal1 = self.literal(self[-1][-1]) - #literal2 = self.literal(x) - y = self.conv(y) - if is_String(y): - #y = CmdStringHolder(y, literal1 or literal2) - y = CmdStringHolder(y, None) - self[-1][-1] = y - - def add_new_word(self, x): - if not self.in_strip or self.mode != SUBST_SIG: - literal = self.literal(x) - x = self.conv(x) - if is_String(x): - x = CmdStringHolder(x, literal) - self[-1].append(x) - self.append = self.add_to_current_word - - def literal(self, x): - try: - l = x.is_literal - except AttributeError: - return None - else: - return l() - - def open_strip(self, x): - """Handle the "open strip" $( token.""" - self.add_strip(x) - self.in_strip = 1 - - def close_strip(self, x): - """Handle the "close strip" $) token.""" - self.add_strip(x) - self.in_strip = None - - if conv is None: - conv = _strconv[mode] - - # Doing this every time is a bit of a waste, since the Executor - # has typically already populated the OverrideEnvironment with - # $TARGET/$SOURCE variables. We're keeping this (for now), though, - # because it supports existing behavior that allows us to call - # an Action directly with an arbitrary target+source pair, which - # we use in Tool/tex.py to handle calling $BIBTEX when necessary. - # If we dropped that behavior (or found another way to cover it), - # we could get rid of this call completely and just rely on the - # Executor setting the variables. - if not lvars.has_key('TARGET'): - d = subst_dict(target, source) - if d: - lvars = lvars.copy() - lvars.update(d) - - # We're (most likely) going to eval() things. If Python doesn't - # find a __builtins__ value in the global dictionary used for eval(), - # it copies the current global values for you. Avoid this by - # setting it explicitly and then deleting, so we don't pollute the - # construction environment Dictionary(ies) that are typically used - # for expansion. - gvars['__builtins__'] = __builtins__ - - ls = ListSubber(env, mode, conv, gvars) - ls.substitute(strSubst, lvars, 0) - - try: - del gvars['__builtins__'] - except KeyError: - pass - - return ls.data - -def scons_subst_once(strSubst, env, key): - """Perform single (non-recursive) substitution of a single - construction variable keyword. - - This is used when setting a variable when copying or overriding values - in an Environment. We want to capture (expand) the old value before - we override it, so people can do things like: - - env2 = env.Clone(CCFLAGS = '$CCFLAGS -g') - - We do this with some straightforward, brute-force code here... - """ - if type(strSubst) == types.StringType and string.find(strSubst, '$') < 0: - return strSubst - - matchlist = ['$' + key, '${' + key + '}'] - val = env.get(key, '') - def sub_match(match, val=val, matchlist=matchlist): - a = match.group(1) - if a in matchlist: - a = val - if is_Sequence(a): - return string.join(map(str, a)) - else: - return str(a) - - if is_Sequence(strSubst): - result = [] - for arg in strSubst: - if is_String(arg): - if arg in matchlist: - arg = val - if is_Sequence(arg): - result.extend(arg) - else: - result.append(arg) - else: - result.append(_dollar_exps.sub(sub_match, arg)) - else: - result.append(arg) - return result - elif is_String(strSubst): - return _dollar_exps.sub(sub_match, strSubst) - else: - return strSubst - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Taskmaster.py b/3rdParty/SCons/scons-local/SCons/Taskmaster.py deleted file mode 100644 index a33233d..0000000 --- a/3rdParty/SCons/scons-local/SCons/Taskmaster.py +++ /dev/null @@ -1,1030 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__doc__ = """ -Generic Taskmaster module for the SCons build engine. - -This module contains the primary interface(s) between a wrapping user -interface and the SCons build engine. There are two key classes here: - - Taskmaster - This is the main engine for walking the dependency graph and - calling things to decide what does or doesn't need to be built. - - Task - This is the base class for allowing a wrapping interface to - decide what does or doesn't actually need to be done. The - intention is for a wrapping interface to subclass this as - appropriate for different types of behavior it may need. - - The canonical example is the SCons native Python interface, - which has Task subclasses that handle its specific behavior, - like printing "`foo' is up to date" when a top-level target - doesn't need to be built, and handling the -c option by removing - targets as its "build" action. There is also a separate subclass - for suppressing this output when the -q option is used. - - The Taskmaster instantiates a Task object for each (set of) - target(s) that it decides need to be evaluated and/or built. -""" - -__revision__ = "src/engine/SCons/Taskmaster.py 4043 2009/02/23 09:06:45 scons" - -from itertools import chain -import operator -import string -import sys -import traceback - -import SCons.Errors -import SCons.Node -import SCons.Warnings - -StateString = SCons.Node.StateString -NODE_NO_STATE = SCons.Node.no_state -NODE_PENDING = SCons.Node.pending -NODE_EXECUTING = SCons.Node.executing -NODE_UP_TO_DATE = SCons.Node.up_to_date -NODE_EXECUTED = SCons.Node.executed -NODE_FAILED = SCons.Node.failed - - -# A subsystem for recording stats about how different Nodes are handled by -# the main Taskmaster loop. There's no external control here (no need for -# a --debug= option); enable it by changing the value of CollectStats. - -CollectStats = None - -class Stats: - """ - A simple class for holding statistics about the disposition of a - Node by the Taskmaster. If we're collecting statistics, each Node - processed by the Taskmaster gets one of these attached, in which case - the Taskmaster records its decision each time it processes the Node. - (Ideally, that's just once per Node.) - """ - def __init__(self): - """ - Instantiates a Taskmaster.Stats object, initializing all - appropriate counters to zero. - """ - self.considered = 0 - self.already_handled = 0 - self.problem = 0 - self.child_failed = 0 - self.not_built = 0 - self.side_effects = 0 - self.build = 0 - -StatsNodes = [] - -fmt = "%(considered)3d "\ - "%(already_handled)3d " \ - "%(problem)3d " \ - "%(child_failed)3d " \ - "%(not_built)3d " \ - "%(side_effects)3d " \ - "%(build)3d " - -def dump_stats(): - StatsNodes.sort(lambda a, b: cmp(str(a), str(b))) - for n in StatsNodes: - print (fmt % n.stats.__dict__) + str(n) - - - -class Task: - """ - Default SCons build engine task. - - This controls the interaction of the actual building of node - and the rest of the engine. - - This is expected to handle all of the normally-customizable - aspects of controlling a build, so any given application - *should* be able to do what it wants by sub-classing this - class and overriding methods as appropriate. If an application - needs to customze something by sub-classing Taskmaster (or - some other build engine class), we should first try to migrate - that functionality into this class. - - Note that it's generally a good idea for sub-classes to call - these methods explicitly to update state, etc., rather than - roll their own interaction with Taskmaster from scratch. - """ - def __init__(self, tm, targets, top, node): - self.tm = tm - self.targets = targets - self.top = top - self.node = node - self.exc_clear() - - def trace_message(self, method, node, description='node'): - fmt = '%-20s %s %s\n' - return fmt % (method + ':', description, self.tm.trace_node(node)) - - def display(self, message): - """ - Hook to allow the calling interface to display a message. - - This hook gets called as part of preparing a task for execution - (that is, a Node to be built). As part of figuring out what Node - should be built next, the actually target list may be altered, - along with a message describing the alteration. The calling - interface can subclass Task and provide a concrete implementation - of this method to see those messages. - """ - pass - - def prepare(self): - """ - Called just before the task is executed. - - This is mainly intended to give the target Nodes a chance to - unlink underlying files and make all necessary directories before - the Action is actually called to build the targets. - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.prepare()', self.node)) - - # Now that it's the appropriate time, give the TaskMaster a - # chance to raise any exceptions it encountered while preparing - # this task. - self.exception_raise() - - if self.tm.message: - self.display(self.tm.message) - self.tm.message = None - - # Let the targets take care of any necessary preparations. - # This includes verifying that all of the necessary sources - # and dependencies exist, removing the target file(s), etc. - # - # As of April 2008, the get_executor().prepare() method makes - # sure that all of the aggregate sources necessary to build this - # Task's target(s) exist in one up-front check. The individual - # target t.prepare() methods check that each target's explicit - # or implicit dependencies exists, and also initialize the - # .sconsign info. - executor = self.targets[0].get_executor() - executor.prepare() - for t in executor.get_action_targets(): - t.prepare() - for s in t.side_effects: - s.prepare() - - def get_target(self): - """Fetch the target being built or updated by this task. - """ - return self.node - - def needs_execute(self): - # TODO(deprecate): "return True" is the old default behavior; - # change it to NotImplementedError (after running through the - # Deprecation Cycle) so the desired behavior is explicitly - # determined by which concrete subclass is used. - #raise NotImplementedError - msg = ('Direct use of the Taskmaster.Task class will be deprecated\n' - + '\tin a future release.') - SCons.Warnings.warn(SCons.Warnings.TaskmasterNeedsExecuteWarning, msg) - return True - - def execute(self): - """ - Called to execute the task. - - This method is called from multiple threads in a parallel build, - so only do thread safe stuff here. Do thread unsafe stuff in - prepare(), executed() or failed(). - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.execute()', self.node)) - - try: - everything_was_cached = 1 - for t in self.targets: - if t.retrieve_from_cache(): - # Call the .built() method without calling the - # .push_to_cache() method, since we just got the - # target from the cache and don't need to push - # it back there. - t.set_state(NODE_EXECUTED) - t.built() - else: - everything_was_cached = 0 - break - if not everything_was_cached: - self.targets[0].build() - except SystemExit: - exc_value = sys.exc_info()[1] - raise SCons.Errors.ExplicitExit(self.targets[0], exc_value.code) - except SCons.Errors.UserError: - raise - except SCons.Errors.BuildError: - raise - except Exception, e: - buildError = SCons.Errors.convert_to_BuildError(e) - buildError.node = self.targets[0] - buildError.exc_info = sys.exc_info() - raise buildError - - def executed_without_callbacks(self): - """ - Called when the task has been successfully executed - and the Taskmaster instance doesn't want to call - the Node's callback methods. - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.executed_without_callbacks()', - self.node)) - - for t in self.targets: - if t.get_state() == NODE_EXECUTING: - for side_effect in t.side_effects: - side_effect.set_state(NODE_NO_STATE) - t.set_state(NODE_EXECUTED) - - def executed_with_callbacks(self): - """ - Called when the task has been successfully executed and - the Taskmaster instance wants to call the Node's callback - methods. - - This may have been a do-nothing operation (to preserve build - order), so we must check the node's state before deciding whether - it was "built", in which case we call the appropriate Node method. - In any event, we always call "visited()", which will handle any - post-visit actions that must take place regardless of whether - or not the target was an actual built target or a source Node. - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.executed_with_callbacks()', - self.node)) - - for t in self.targets: - if t.get_state() == NODE_EXECUTING: - for side_effect in t.side_effects: - side_effect.set_state(NODE_NO_STATE) - t.set_state(NODE_EXECUTED) - t.push_to_cache() - t.built() - t.visited() - - executed = executed_with_callbacks - - def failed(self): - """ - Default action when a task fails: stop the build. - - Note: Although this function is normally invoked on nodes in - the executing state, it might also be invoked on up-to-date - nodes when using Configure(). - """ - self.fail_stop() - - def fail_stop(self): - """ - Explicit stop-the-build failure. - - This sets failure status on the target nodes and all of - their dependent parent nodes. - - Note: Although this function is normally invoked on nodes in - the executing state, it might also be invoked on up-to-date - nodes when using Configure(). - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.failed_stop()', self.node)) - - # Invoke will_not_build() to clean-up the pending children - # list. - self.tm.will_not_build(self.targets, lambda n: n.set_state(NODE_FAILED)) - - # Tell the taskmaster to not start any new tasks - self.tm.stop() - - # We're stopping because of a build failure, but give the - # calling Task class a chance to postprocess() the top-level - # target under which the build failure occurred. - self.targets = [self.tm.current_top] - self.top = 1 - - def fail_continue(self): - """ - Explicit continue-the-build failure. - - This sets failure status on the target nodes and all of - their dependent parent nodes. - - Note: Although this function is normally invoked on nodes in - the executing state, it might also be invoked on up-to-date - nodes when using Configure(). - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.failed_continue()', self.node)) - - self.tm.will_not_build(self.targets, lambda n: n.set_state(NODE_FAILED)) - - def make_ready_all(self): - """ - Marks all targets in a task ready for execution. - - This is used when the interface needs every target Node to be - visited--the canonical example being the "scons -c" option. - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.make_ready_all()', self.node)) - - self.out_of_date = self.targets[:] - for t in self.targets: - t.disambiguate().set_state(NODE_EXECUTING) - for s in t.side_effects: - s.set_state(NODE_EXECUTING) - - def make_ready_current(self): - """ - Marks all targets in a task ready for execution if any target - is not current. - - This is the default behavior for building only what's necessary. - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.make_ready_current()', - self.node)) - - self.out_of_date = [] - needs_executing = False - for t in self.targets: - try: - t.disambiguate().make_ready() - is_up_to_date = not t.has_builder() or \ - (not t.always_build and t.is_up_to_date()) - except EnvironmentError, e: - raise SCons.Errors.BuildError(node=t, errstr=e.strerror, filename=e.filename) - - if not is_up_to_date: - self.out_of_date.append(t) - needs_executing = True - - if needs_executing: - for t in self.targets: - t.set_state(NODE_EXECUTING) - for s in t.side_effects: - s.set_state(NODE_EXECUTING) - else: - for t in self.targets: - # We must invoke visited() to ensure that the node - # information has been computed before allowing the - # parent nodes to execute. (That could occur in a - # parallel build...) - t.visited() - t.set_state(NODE_UP_TO_DATE) - - make_ready = make_ready_current - - def postprocess(self): - """ - Post-processes a task after it's been executed. - - This examines all the targets just built (or not, we don't care - if the build was successful, or even if there was no build - because everything was up-to-date) to see if they have any - waiting parent Nodes, or Nodes waiting on a common side effect, - that can be put back on the candidates list. - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.postprocess()', self.node)) - - # We may have built multiple targets, some of which may have - # common parents waiting for this build. Count up how many - # targets each parent was waiting for so we can subtract the - # values later, and so we *don't* put waiting side-effect Nodes - # back on the candidates list if the Node is also a waiting - # parent. - - targets = set(self.targets) - - pending_children = self.tm.pending_children - parents = {} - for t in targets: - # A node can only be in the pending_children set if it has - # some waiting_parents. - if t.waiting_parents: - if T: T.write(self.trace_message('Task.postprocess()', - t, - 'removing')) - pending_children.discard(t) - for p in t.waiting_parents: - parents[p] = parents.get(p, 0) + 1 - - for t in targets: - for s in t.side_effects: - if s.get_state() == NODE_EXECUTING: - s.set_state(NODE_NO_STATE) - for p in s.waiting_parents: - parents[p] = parents.get(p, 0) + 1 - for p in s.waiting_s_e: - if p.ref_count == 0: - self.tm.candidates.append(p) - - for p, subtract in parents.items(): - p.ref_count = p.ref_count - subtract - if T: T.write(self.trace_message('Task.postprocess()', - p, - 'adjusted parent ref count')) - if p.ref_count == 0: - self.tm.candidates.append(p) - - for t in targets: - t.postprocess() - - # Exception handling subsystem. - # - # Exceptions that occur while walking the DAG or examining Nodes - # must be raised, but must be raised at an appropriate time and in - # a controlled manner so we can, if necessary, recover gracefully, - # possibly write out signature information for Nodes we've updated, - # etc. This is done by having the Taskmaster tell us about the - # exception, and letting - - def exc_info(self): - """ - Returns info about a recorded exception. - """ - return self.exception - - def exc_clear(self): - """ - Clears any recorded exception. - - This also changes the "exception_raise" attribute to point - to the appropriate do-nothing method. - """ - self.exception = (None, None, None) - self.exception_raise = self._no_exception_to_raise - - def exception_set(self, exception=None): - """ - Records an exception to be raised at the appropriate time. - - This also changes the "exception_raise" attribute to point - to the method that will, in fact - """ - if not exception: - exception = sys.exc_info() - self.exception = exception - self.exception_raise = self._exception_raise - - def _no_exception_to_raise(self): - pass - - def _exception_raise(self): - """ - Raises a pending exception that was recorded while getting a - Task ready for execution. - """ - exc = self.exc_info()[:] - try: - exc_type, exc_value, exc_traceback = exc - except ValueError: - exc_type, exc_value = exc - exc_traceback = None - raise exc_type, exc_value, exc_traceback - -class AlwaysTask(Task): - def needs_execute(self): - """ - Always returns True (indicating this Task should always - be executed). - - Subclasses that need this behavior (as opposed to the default - of only executing Nodes that are out of date w.r.t. their - dependencies) can use this as follows: - - class MyTaskSubclass(SCons.Taskmaster.Task): - needs_execute = SCons.Taskmaster.Task.execute_always - """ - return True - -class OutOfDateTask(Task): - def needs_execute(self): - """ - Returns True (indicating this Task should be executed) if this - Task's target state indicates it needs executing, which has - already been determined by an earlier up-to-date check. - """ - return self.targets[0].get_state() == SCons.Node.executing - - -def find_cycle(stack, visited): - if stack[-1] in visited: - return None - visited.add(stack[-1]) - for n in stack[-1].waiting_parents: - stack.append(n) - if stack[0] == stack[-1]: - return stack - if find_cycle(stack, visited): - return stack - stack.pop() - return None - - -class Taskmaster: - """ - The Taskmaster for walking the dependency DAG. - """ - - def __init__(self, targets=[], tasker=None, order=None, trace=None): - self.original_top = targets - self.top_targets_left = targets[:] - self.top_targets_left.reverse() - self.candidates = [] - if tasker is None: - tasker = OutOfDateTask - self.tasker = tasker - if not order: - order = lambda l: l - self.order = order - self.message = None - self.trace = trace - self.next_candidate = self.find_next_candidate - self.pending_children = set() - - def find_next_candidate(self): - """ - Returns the next candidate Node for (potential) evaluation. - - The candidate list (really a stack) initially consists of all of - the top-level (command line) targets provided when the Taskmaster - was initialized. While we walk the DAG, visiting Nodes, all the - children that haven't finished processing get pushed on to the - candidate list. Each child can then be popped and examined in - turn for whether *their* children are all up-to-date, in which - case a Task will be created for their actual evaluation and - potential building. - - Here is where we also allow candidate Nodes to alter the list of - Nodes that should be examined. This is used, for example, when - invoking SCons in a source directory. A source directory Node can - return its corresponding build directory Node, essentially saying, - "Hey, you really need to build this thing over here instead." - """ - try: - return self.candidates.pop() - except IndexError: - pass - try: - node = self.top_targets_left.pop() - except IndexError: - return None - self.current_top = node - alt, message = node.alter_targets() - if alt: - self.message = message - self.candidates.append(node) - self.candidates.extend(self.order(alt)) - node = self.candidates.pop() - return node - - def no_next_candidate(self): - """ - Stops Taskmaster processing by not returning a next candidate. - - Note that we have to clean-up the Taskmaster candidate list - because the cycle detection depends on the fact all nodes have - been processed somehow. - """ - while self.candidates: - candidates = self.candidates - self.candidates = [] - self.will_not_build(candidates) - return None - - def _validate_pending_children(self): - """ - Validate the content of the pending_children set. Assert if an - internal error is found. - - This function is used strictly for debugging the taskmaster by - checking that no invariants are violated. It is not used in - normal operation. - - The pending_children set is used to detect cycles in the - dependency graph. We call a "pending child" a child that is - found in the "pending" state when checking the dependencies of - its parent node. - - A pending child can occur when the Taskmaster completes a loop - through a cycle. For example, lets imagine a graph made of - three node (A, B and C) making a cycle. The evaluation starts - at node A. The taskmaster first consider whether node A's - child B is up-to-date. Then, recursively, node B needs to - check whether node C is up-to-date. This leaves us with a - dependency graph looking like: - - Next candidate \ - \ - Node A (Pending) --> Node B(Pending) --> Node C (NoState) - ^ | - | | - +-------------------------------------+ - - Now, when the Taskmaster examines the Node C's child Node A, - it finds that Node A is in the "pending" state. Therefore, - Node A is a pending child of node C. - - Pending children indicate that the Taskmaster has potentially - loop back through a cycle. We say potentially because it could - also occur when a DAG is evaluated in parallel. For example, - consider the following graph: - - - Node A (Pending) --> Node B(Pending) --> Node C (Pending) --> ... - | ^ - | | - +----------> Node D (NoState) --------+ - / - Next candidate / - - The Taskmaster first evaluates the nodes A, B, and C and - starts building some children of node C. Assuming, that the - maximum parallel level has not been reached, the Taskmaster - will examine Node D. It will find that Node C is a pending - child of Node D. - - In summary, evaluating a graph with a cycle will always - involve a pending child at one point. A pending child might - indicate either a cycle or a diamond-shaped DAG. Only a - fraction of the nodes ends-up being a "pending child" of - another node. This keeps the pending_children set small in - practice. - - We can differentiate between the two cases if we wait until - the end of the build. At this point, all the pending children - nodes due to a diamond-shaped DAG will have been properly - built (or will have failed to build). But, the pending - children involved in a cycle will still be in the pending - state. - - The taskmaster removes nodes from the pending_children set as - soon as a pending_children node moves out of the pending - state. This also helps to keep the pending_children set small. - """ - - for n in self.pending_children: - assert n.state in (NODE_PENDING, NODE_EXECUTING), \ - (str(n), StateString[n.state]) - assert len(n.waiting_parents) != 0, (str(n), len(n.waiting_parents)) - for p in n.waiting_parents: - assert p.ref_count > 0, (str(n), str(p), p.ref_count) - - - def trace_message(self, message): - return 'Taskmaster: %s\n' % message - - def trace_node(self, node): - return '<%-10s %-3s %s>' % (StateString[node.get_state()], - node.ref_count, - repr(str(node))) - - def _find_next_ready_node(self): - """ - Finds the next node that is ready to be built. - - This is *the* main guts of the DAG walk. We loop through the - list of candidates, looking for something that has no un-built - children (i.e., that is a leaf Node or has dependencies that are - all leaf Nodes or up-to-date). Candidate Nodes are re-scanned - (both the target Node itself and its sources, which are always - scanned in the context of a given target) to discover implicit - dependencies. A Node that must wait for some children to be - built will be put back on the candidates list after the children - have finished building. A Node that has been put back on the - candidates list in this way may have itself (or its sources) - re-scanned, in order to handle generated header files (e.g.) and - the implicit dependencies therein. - - Note that this method does not do any signature calculation or - up-to-date check itself. All of that is handled by the Task - class. This is purely concerned with the dependency graph walk. - """ - - self.ready_exc = None - - T = self.trace - if T: T.write('\n' + self.trace_message('Looking for a node to evaluate')) - - while 1: - node = self.next_candidate() - if node is None: - if T: T.write(self.trace_message('No candidate anymore.') + '\n') - return None - - node = node.disambiguate() - state = node.get_state() - - # For debugging only: - # - # try: - # self._validate_pending_children() - # except: - # self.ready_exc = sys.exc_info() - # return node - - if CollectStats: - if not hasattr(node, 'stats'): - node.stats = Stats() - StatsNodes.append(node) - S = node.stats - S.considered = S.considered + 1 - else: - S = None - - if T: T.write(self.trace_message(' Considering node %s and its children:' % self.trace_node(node))) - - if state == NODE_NO_STATE: - # Mark this node as being on the execution stack: - node.set_state(NODE_PENDING) - elif state > NODE_PENDING: - # Skip this node if it has already been evaluated: - if S: S.already_handled = S.already_handled + 1 - if T: T.write(self.trace_message(' already handled (executed)')) - continue - - executor = node.get_executor() - - try: - children = executor.get_all_children() - except SystemExit: - exc_value = sys.exc_info()[1] - e = SCons.Errors.ExplicitExit(node, exc_value.code) - self.ready_exc = (SCons.Errors.ExplicitExit, e) - if T: T.write(self.trace_message(' SystemExit')) - return node - except Exception, e: - # We had a problem just trying to figure out the - # children (like a child couldn't be linked in to a - # VariantDir, or a Scanner threw something). Arrange to - # raise the exception when the Task is "executed." - self.ready_exc = sys.exc_info() - if S: S.problem = S.problem + 1 - if T: T.write(self.trace_message(' exception %s while scanning children.\n' % e)) - return node - - children_not_visited = [] - children_pending = set() - children_not_ready = [] - children_failed = False - - for child in chain(children, executor.get_all_prerequisites()): - childstate = child.get_state() - - if T: T.write(self.trace_message(' ' + self.trace_node(child))) - - if childstate == NODE_NO_STATE: - children_not_visited.append(child) - elif childstate == NODE_PENDING: - children_pending.add(child) - elif childstate == NODE_FAILED: - children_failed = True - - if childstate <= NODE_EXECUTING: - children_not_ready.append(child) - - - # These nodes have not even been visited yet. Add - # them to the list so that on some next pass we can - # take a stab at evaluating them (or their children). - children_not_visited.reverse() - self.candidates.extend(self.order(children_not_visited)) - #if T and children_not_visited: - # T.write(self.trace_message(' adding to candidates: %s' % map(str, children_not_visited))) - # T.write(self.trace_message(' candidates now: %s\n' % map(str, self.candidates))) - - # Skip this node if any of its children have failed. - # - # This catches the case where we're descending a top-level - # target and one of our children failed while trying to be - # built by a *previous* descent of an earlier top-level - # target. - # - # It can also occur if a node is reused in multiple - # targets. One first descends though the one of the - # target, the next time occurs through the other target. - # - # Note that we can only have failed_children if the - # --keep-going flag was used, because without it the build - # will stop before diving in the other branch. - # - # Note that even if one of the children fails, we still - # added the other children to the list of candidate nodes - # to keep on building (--keep-going). - if children_failed: - for n in executor.get_action_targets(): - n.set_state(NODE_FAILED) - - if S: S.child_failed = S.child_failed + 1 - if T: T.write(self.trace_message('****** %s\n' % self.trace_node(node))) - continue - - if children_not_ready: - for child in children_not_ready: - # We're waiting on one or more derived targets - # that have not yet finished building. - if S: S.not_built = S.not_built + 1 - - # Add this node to the waiting parents lists of - # anything we're waiting on, with a reference - # count so we can be put back on the list for - # re-evaluation when they've all finished. - node.ref_count = node.ref_count + child.add_to_waiting_parents(node) - if T: T.write(self.trace_message(' adjusted ref count: %s, child %s' % - (self.trace_node(node), repr(str(child))))) - - if T: - for pc in children_pending: - T.write(self.trace_message(' adding %s to the pending children set\n' % - self.trace_node(pc))) - self.pending_children = self.pending_children | children_pending - - continue - - # Skip this node if it has side-effects that are - # currently being built: - wait_side_effects = False - for se in executor.get_action_side_effects(): - if se.get_state() == NODE_EXECUTING: - se.add_to_waiting_s_e(node) - wait_side_effects = True - - if wait_side_effects: - if S: S.side_effects = S.side_effects + 1 - continue - - # The default when we've gotten through all of the checks above: - # this node is ready to be built. - if S: S.build = S.build + 1 - if T: T.write(self.trace_message('Evaluating %s\n' % - self.trace_node(node))) - - # For debugging only: - # - # try: - # self._validate_pending_children() - # except: - # self.ready_exc = sys.exc_info() - # return node - - return node - - return None - - def next_task(self): - """ - Returns the next task to be executed. - - This simply asks for the next Node to be evaluated, and then wraps - it in the specific Task subclass with which we were initialized. - """ - node = self._find_next_ready_node() - - if node is None: - return None - - tlist = node.get_executor().get_all_targets() - - task = self.tasker(self, tlist, node in self.original_top, node) - try: - task.make_ready() - except: - # We had a problem just trying to get this task ready (like - # a child couldn't be linked in to a VariantDir when deciding - # whether this node is current). Arrange to raise the - # exception when the Task is "executed." - self.ready_exc = sys.exc_info() - - if self.ready_exc: - task.exception_set(self.ready_exc) - - self.ready_exc = None - - return task - - def will_not_build(self, nodes, node_func=lambda n: None): - """ - Perform clean-up about nodes that will never be built. Invokes - a user defined function on all of these nodes (including all - of their parents). - """ - - T = self.trace - - pending_children = self.pending_children - - to_visit = set(nodes) - pending_children = pending_children - to_visit - - if T: - for n in nodes: - T.write(self.trace_message(' removing node %s from the pending children set\n' % - self.trace_node(n))) - try: - while 1: - try: - node = to_visit.pop() - except AttributeError: - # Python 1.5.2 - if len(to_visit): - node = to_visit[0] - to_visit.remove(node) - else: - break - - node_func(node) - - # Prune recursion by flushing the waiting children - # list immediately. - parents = node.waiting_parents - node.waiting_parents = set() - - to_visit = to_visit | parents - pending_children = pending_children - parents - - for p in parents: - p.ref_count = p.ref_count - 1 - if T: T.write(self.trace_message(' removing parent %s from the pending children set\n' % - self.trace_node(p))) - except KeyError: - # The container to_visit has been emptied. - pass - - # We have the stick back the pending_children list into the - # task master because the python 1.5.2 compatibility does not - # allow us to use in-place updates - self.pending_children = pending_children - - def stop(self): - """ - Stops the current build completely. - """ - self.next_candidate = self.no_next_candidate - - def cleanup(self): - """ - Check for dependency cycles. - """ - if not self.pending_children: - return - - # TODO(1.5) - #nclist = [ (n, find_cycle([n], set())) for n in self.pending_children ] - nclist = map(lambda n: (n, find_cycle([n], set())), self.pending_children) - - # TODO(1.5) - #genuine_cycles = [ - # node for node, cycle in nclist - # if cycle or node.get_state() != NODE_EXECUTED - #] - genuine_cycles = filter(lambda t: t[1] or t[0].get_state() != NODE_EXECUTED, nclist) - if not genuine_cycles: - # All of the "cycles" found were single nodes in EXECUTED state, - # which is to say, they really weren't cycles. Just return. - return - - desc = 'Found dependency cycle(s):\n' - for node, cycle in nclist: - if cycle: - desc = desc + " " + string.join(map(str, cycle), " -> ") + "\n" - else: - desc = desc + \ - " Internal Error: no cycle found for node %s (%s) in state %s\n" % \ - (node, repr(node), StateString[node.get_state()]) - - raise SCons.Errors.UserError, desc - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/386asm.py b/3rdParty/SCons/scons-local/SCons/Tool/386asm.py deleted file mode 100644 index 19dd14c..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/386asm.py +++ /dev/null @@ -1,61 +0,0 @@ -"""SCons.Tool.386asm - -Tool specification for the 386ASM assembler for the Phar Lap ETS embedded -operating system. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/386asm.py 4043 2009/02/23 09:06:45 scons" - -from SCons.Tool.PharLapCommon import addPharLapPaths -import SCons.Util - -as_module = __import__('as', globals(), locals(), []) - -def generate(env): - """Add Builders and construction variables for ar to an Environment.""" - as_module.generate(env) - - env['AS'] = '386asm' - env['ASFLAGS'] = SCons.Util.CLVar('') - env['ASPPFLAGS'] = '$ASFLAGS' - env['ASCOM'] = '$AS $ASFLAGS $SOURCES -o $TARGET' - env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $SOURCES -o $TARGET' - - addPharLapPaths(env) - -def exists(env): - return env.Detect('386asm') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/BitKeeper.py b/3rdParty/SCons/scons-local/SCons/Tool/BitKeeper.py deleted file mode 100644 index 61476ca..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/BitKeeper.py +++ /dev/null @@ -1,65 +0,0 @@ -"""SCons.Tool.BitKeeper.py - -Tool-specific initialization for the BitKeeper source code control -system. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/BitKeeper.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add a Builder factory function and construction variables for - BitKeeper to an Environment.""" - - def BitKeeperFactory(env=env): - """ """ - act = SCons.Action.Action("$BITKEEPERCOM", "$BITKEEPERCOMSTR") - return SCons.Builder.Builder(action = act, env = env) - - #setattr(env, 'BitKeeper', BitKeeperFactory) - env.BitKeeper = BitKeeperFactory - - env['BITKEEPER'] = 'bk' - env['BITKEEPERGET'] = '$BITKEEPER get' - env['BITKEEPERGETFLAGS'] = SCons.Util.CLVar('') - env['BITKEEPERCOM'] = '$BITKEEPERGET $BITKEEPERGETFLAGS $TARGET' - -def exists(env): - return env.Detect('bk') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/CVS.py b/3rdParty/SCons/scons-local/SCons/Tool/CVS.py deleted file mode 100644 index 0782970..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/CVS.py +++ /dev/null @@ -1,73 +0,0 @@ -"""SCons.Tool.CVS.py - -Tool-specific initialization for CVS. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/CVS.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add a Builder factory function and construction variables for - CVS to an Environment.""" - - def CVSFactory(repos, module='', env=env): - """ """ - # fail if repos is not an absolute path name? - if module != '': - # Don't use os.path.join() because the name we fetch might - # be across a network and must use POSIX slashes as separators. - module = module + '/' - env['CVSCOM'] = '$CVS $CVSFLAGS co $CVSCOFLAGS -d ${TARGET.dir} $CVSMODULE${TARGET.posix}' - act = SCons.Action.Action('$CVSCOM', '$CVSCOMSTR') - return SCons.Builder.Builder(action = act, - env = env, - CVSREPOSITORY = repos, - CVSMODULE = module) - - #setattr(env, 'CVS', CVSFactory) - env.CVS = CVSFactory - - env['CVS'] = 'cvs' - env['CVSFLAGS'] = SCons.Util.CLVar('-d $CVSREPOSITORY') - env['CVSCOFLAGS'] = SCons.Util.CLVar('') - env['CVSCOM'] = '$CVS $CVSFLAGS co $CVSCOFLAGS ${TARGET.posix}' - -def exists(env): - return env.Detect('cvs') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/FortranCommon.py b/3rdParty/SCons/scons-local/SCons/Tool/FortranCommon.py deleted file mode 100644 index 2cc4387..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/FortranCommon.py +++ /dev/null @@ -1,247 +0,0 @@ -"""SCons.Tool.FortranCommon - -Stuff for processing Fortran, common to all fortran dialects. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/FortranCommon.py 4043 2009/02/23 09:06:45 scons" - -import re -import string -import os.path - -import SCons.Action -import SCons.Defaults -import SCons.Scanner.Fortran -import SCons.Tool -import SCons.Util - -def isfortran(env, source): - """Return 1 if any of code in source has fortran files in it, 0 - otherwise.""" - try: - fsuffixes = env['FORTRANSUFFIXES'] - except KeyError: - # If no FORTRANSUFFIXES, no fortran tool, so there is no need to look - # for fortran sources. - return 0 - - if not source: - # Source might be None for unusual cases like SConf. - return 0 - for s in source: - if s.sources: - ext = os.path.splitext(str(s.sources[0]))[1] - if ext in fsuffixes: - return 1 - return 0 - -def _fortranEmitter(target, source, env): - node = source[0].rfile() - if not node.exists() and not node.is_derived(): - print "Could not locate " + str(node.name) - return ([], []) - mod_regex = """(?i)^\s*MODULE\s+(?!PROCEDURE)(\w+)""" - cre = re.compile(mod_regex,re.M) - # Retrieve all USE'd module names - modules = cre.findall(node.get_text_contents()) - # Remove unique items from the list - modules = SCons.Util.unique(modules) - # Convert module name to a .mod filename - suffix = env.subst('$FORTRANMODSUFFIX', target=target, source=source) - moddir = env.subst('$FORTRANMODDIR', target=target, source=source) - modules = map(lambda x, s=suffix: string.lower(x) + s, modules) - for m in modules: - target.append(env.fs.File(m, moddir)) - return (target, source) - -def FortranEmitter(target, source, env): - target, source = _fortranEmitter(target, source, env) - return SCons.Defaults.StaticObjectEmitter(target, source, env) - -def ShFortranEmitter(target, source, env): - target, source = _fortranEmitter(target, source, env) - return SCons.Defaults.SharedObjectEmitter(target, source, env) - -def ComputeFortranSuffixes(suffixes, ppsuffixes): - """suffixes are fortran source files, and ppsuffixes the ones to be - pre-processed. Both should be sequences, not strings.""" - assert len(suffixes) > 0 - s = suffixes[0] - sup = string.upper(s) - upper_suffixes = map(string.upper, suffixes) - if SCons.Util.case_sensitive_suffixes(s, sup): - ppsuffixes.extend(upper_suffixes) - else: - suffixes.extend(upper_suffixes) - -def CreateDialectActions(dialect): - """Create dialect specific actions.""" - CompAction = SCons.Action.Action('$%sCOM ' % dialect, '$%sCOMSTR' % dialect) - CompPPAction = SCons.Action.Action('$%sPPCOM ' % dialect, '$%sPPCOMSTR' % dialect) - ShCompAction = SCons.Action.Action('$SH%sCOM ' % dialect, '$SH%sCOMSTR' % dialect) - ShCompPPAction = SCons.Action.Action('$SH%sPPCOM ' % dialect, '$SH%sPPCOMSTR' % dialect) - - return CompAction, CompPPAction, ShCompAction, ShCompPPAction - -def DialectAddToEnv(env, dialect, suffixes, ppsuffixes, support_module = 0): - """Add dialect specific construction variables.""" - ComputeFortranSuffixes(suffixes, ppsuffixes) - - fscan = SCons.Scanner.Fortran.FortranScan("%sPATH" % dialect) - - for suffix in suffixes + ppsuffixes: - SCons.Tool.SourceFileScanner.add_scanner(suffix, fscan) - - env.AppendUnique(FORTRANSUFFIXES = suffixes + ppsuffixes) - - compaction, compppaction, shcompaction, shcompppaction = \ - CreateDialectActions(dialect) - - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - for suffix in suffixes: - static_obj.add_action(suffix, compaction) - shared_obj.add_action(suffix, shcompaction) - static_obj.add_emitter(suffix, FortranEmitter) - shared_obj.add_emitter(suffix, ShFortranEmitter) - - for suffix in ppsuffixes: - static_obj.add_action(suffix, compppaction) - shared_obj.add_action(suffix, shcompppaction) - static_obj.add_emitter(suffix, FortranEmitter) - shared_obj.add_emitter(suffix, ShFortranEmitter) - - if not env.has_key('%sFLAGS' % dialect): - env['%sFLAGS' % dialect] = SCons.Util.CLVar('') - - if not env.has_key('SH%sFLAGS' % dialect): - env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS' % dialect) - - # If a tool does not define fortran prefix/suffix for include path, use C ones - if not env.has_key('INC%sPREFIX' % dialect): - env['INC%sPREFIX' % dialect] = '$INCPREFIX' - - if not env.has_key('INC%sSUFFIX' % dialect): - env['INC%sSUFFIX' % dialect] = '$INCSUFFIX' - - env['_%sINCFLAGS' % dialect] = '$( ${_concat(INC%sPREFIX, %sPATH, INC%sSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' % (dialect, dialect, dialect) - - if support_module == 1: - env['%sCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect) - env['%sPPCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect) - env['SH%sCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect) - env['SH%sPPCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect) - else: - env['%sCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect) - env['%sPPCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect) - env['SH%sCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect) - env['SH%sPPCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect) - -def add_fortran_to_env(env): - """Add Builders and construction variables for Fortran to an Environment.""" - try: - FortranSuffixes = env['FORTRANFILESUFFIXES'] - except KeyError: - FortranSuffixes = ['.f', '.for', '.ftn'] - - #print "Adding %s to fortran suffixes" % FortranSuffixes - try: - FortranPPSuffixes = env['FORTRANPPFILESUFFIXES'] - except KeyError: - FortranPPSuffixes = ['.fpp', '.FPP'] - - DialectAddToEnv(env, "FORTRAN", FortranSuffixes, - FortranPPSuffixes, support_module = 1) - - env['FORTRANMODPREFIX'] = '' # like $LIBPREFIX - env['FORTRANMODSUFFIX'] = '.mod' # like $LIBSUFFIX - - env['FORTRANMODDIR'] = '' # where the compiler should place .mod files - env['FORTRANMODDIRPREFIX'] = '' # some prefix to $FORTRANMODDIR - similar to $INCPREFIX - env['FORTRANMODDIRSUFFIX'] = '' # some suffix to $FORTRANMODDIR - similar to $INCSUFFIX - env['_FORTRANMODFLAG'] = '$( ${_concat(FORTRANMODDIRPREFIX, FORTRANMODDIR, FORTRANMODDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' - -def add_f77_to_env(env): - """Add Builders and construction variables for f77 to an Environment.""" - try: - F77Suffixes = env['F77FILESUFFIXES'] - except KeyError: - F77Suffixes = ['.f77'] - - #print "Adding %s to f77 suffixes" % F77Suffixes - try: - F77PPSuffixes = env['F77PPFILESUFFIXES'] - except KeyError: - F77PPSuffixes = [] - - DialectAddToEnv(env, "F77", F77Suffixes, F77PPSuffixes) - -def add_f90_to_env(env): - """Add Builders and construction variables for f90 to an Environment.""" - try: - F90Suffixes = env['F90FILESUFFIXES'] - except KeyError: - F90Suffixes = ['.f90'] - - #print "Adding %s to f90 suffixes" % F90Suffixes - try: - F90PPSuffixes = env['F90PPFILESUFFIXES'] - except KeyError: - F90PPSuffixes = [] - - DialectAddToEnv(env, "F90", F90Suffixes, F90PPSuffixes, - support_module = 1) - -def add_f95_to_env(env): - """Add Builders and construction variables for f95 to an Environment.""" - try: - F95Suffixes = env['F95FILESUFFIXES'] - except KeyError: - F95Suffixes = ['.f95'] - - #print "Adding %s to f95 suffixes" % F95Suffixes - try: - F95PPSuffixes = env['F95PPFILESUFFIXES'] - except KeyError: - F95PPSuffixes = [] - - DialectAddToEnv(env, "F95", F95Suffixes, F95PPSuffixes, - support_module = 1) - -def add_all_to_env(env): - """Add builders and construction variables for all supported fortran - dialects.""" - add_fortran_to_env(env) - add_f77_to_env(env) - add_f90_to_env(env) - add_f95_to_env(env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/JavaCommon.py b/3rdParty/SCons/scons-local/SCons/Tool/JavaCommon.py deleted file mode 100644 index cc3e421..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/JavaCommon.py +++ /dev/null @@ -1,323 +0,0 @@ -"""SCons.Tool.JavaCommon - -Stuff for processing Java. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/JavaCommon.py 4043 2009/02/23 09:06:45 scons" - -import os -import os.path -import re -import string - -java_parsing = 1 - -default_java_version = '1.4' - -if java_parsing: - # Parse Java files for class names. - # - # This is a really cool parser from Charles Crain - # that finds appropriate class names in Java source. - - # A regular expression that will find, in a java file: - # newlines; - # double-backslashes; - # a single-line comment "//"; - # single or double quotes preceeded by a backslash; - # single quotes, double quotes, open or close braces, semi-colons, - # periods, open or close parentheses; - # floating-point numbers; - # any alphanumeric token (keyword, class name, specifier); - # any alphanumeric token surrounded by angle brackets (generics); - # the multi-line comment begin and end tokens /* and */; - # array declarations "[]". - _reToken = re.compile(r'(\n|\\\\|//|\\[\'"]|[\'"\{\}\;\.\(\)]|' + - r'\d*\.\d*|[A-Za-z_][\w\$\.]*|<[A-Za-z_]\w+>|' + - r'/\*|\*/|\[\])') - - class OuterState: - """The initial state for parsing a Java file for classes, - interfaces, and anonymous inner classes.""" - def __init__(self, version=default_java_version): - - if not version in ('1.1', '1.2', '1.3','1.4', '1.5', '1.6'): - msg = "Java version %s not supported" % version - raise NotImplementedError, msg - - self.version = version - self.listClasses = [] - self.listOutputs = [] - self.stackBrackets = [] - self.brackets = 0 - self.nextAnon = 1 - self.localClasses = [] - self.stackAnonClassBrackets = [] - self.anonStacksStack = [[0]] - self.package = None - - def trace(self): - pass - - def __getClassState(self): - try: - return self.classState - except AttributeError: - ret = ClassState(self) - self.classState = ret - return ret - - def __getPackageState(self): - try: - return self.packageState - except AttributeError: - ret = PackageState(self) - self.packageState = ret - return ret - - def __getAnonClassState(self): - try: - return self.anonState - except AttributeError: - self.outer_state = self - ret = SkipState(1, AnonClassState(self)) - self.anonState = ret - return ret - - def __getSkipState(self): - try: - return self.skipState - except AttributeError: - ret = SkipState(1, self) - self.skipState = ret - return ret - - def __getAnonStack(self): - return self.anonStacksStack[-1] - - def openBracket(self): - self.brackets = self.brackets + 1 - - def closeBracket(self): - self.brackets = self.brackets - 1 - if len(self.stackBrackets) and \ - self.brackets == self.stackBrackets[-1]: - self.listOutputs.append(string.join(self.listClasses, '$')) - self.localClasses.pop() - self.listClasses.pop() - self.anonStacksStack.pop() - self.stackBrackets.pop() - if len(self.stackAnonClassBrackets) and \ - self.brackets == self.stackAnonClassBrackets[-1]: - self.__getAnonStack().pop() - self.stackAnonClassBrackets.pop() - - def parseToken(self, token): - if token[:2] == '//': - return IgnoreState('\n', self) - elif token == '/*': - return IgnoreState('*/', self) - elif token == '{': - self.openBracket() - elif token == '}': - self.closeBracket() - elif token in [ '"', "'" ]: - return IgnoreState(token, self) - elif token == "new": - # anonymous inner class - if len(self.listClasses) > 0: - return self.__getAnonClassState() - return self.__getSkipState() # Skip the class name - elif token in ['class', 'interface', 'enum']: - if len(self.listClasses) == 0: - self.nextAnon = 1 - self.stackBrackets.append(self.brackets) - return self.__getClassState() - elif token == 'package': - return self.__getPackageState() - elif token == '.': - # Skip the attribute, it might be named "class", in which - # case we don't want to treat the following token as - # an inner class name... - return self.__getSkipState() - return self - - def addAnonClass(self): - """Add an anonymous inner class""" - if self.version in ('1.1', '1.2', '1.3', '1.4'): - clazz = self.listClasses[0] - self.listOutputs.append('%s$%d' % (clazz, self.nextAnon)) - elif self.version in ('1.5', '1.6'): - self.stackAnonClassBrackets.append(self.brackets) - className = [] - className.extend(self.listClasses) - self.__getAnonStack()[-1] = self.__getAnonStack()[-1] + 1 - for anon in self.__getAnonStack(): - className.append(str(anon)) - self.listOutputs.append(string.join(className, '$')) - - self.nextAnon = self.nextAnon + 1 - self.__getAnonStack().append(0) - - def setPackage(self, package): - self.package = package - - class AnonClassState: - """A state that looks for anonymous inner classes.""" - def __init__(self, old_state): - # outer_state is always an instance of OuterState - self.outer_state = old_state.outer_state - self.old_state = old_state - self.brace_level = 0 - def parseToken(self, token): - # This is an anonymous class if and only if the next - # non-whitespace token is a bracket. Everything between - # braces should be parsed as normal java code. - if token[:2] == '//': - return IgnoreState('\n', self) - elif token == '/*': - return IgnoreState('*/', self) - elif token == '\n': - return self - elif token[0] == '<' and token[-1] == '>': - return self - elif token == '(': - self.brace_level = self.brace_level + 1 - return self - if self.brace_level > 0: - if token == 'new': - # look further for anonymous inner class - return SkipState(1, AnonClassState(self)) - elif token in [ '"', "'" ]: - return IgnoreState(token, self) - elif token == ')': - self.brace_level = self.brace_level - 1 - return self - if token == '{': - self.outer_state.addAnonClass() - return self.old_state.parseToken(token) - - class SkipState: - """A state that will skip a specified number of tokens before - reverting to the previous state.""" - def __init__(self, tokens_to_skip, old_state): - self.tokens_to_skip = tokens_to_skip - self.old_state = old_state - def parseToken(self, token): - self.tokens_to_skip = self.tokens_to_skip - 1 - if self.tokens_to_skip < 1: - return self.old_state - return self - - class ClassState: - """A state we go into when we hit a class or interface keyword.""" - def __init__(self, outer_state): - # outer_state is always an instance of OuterState - self.outer_state = outer_state - def parseToken(self, token): - # the next non-whitespace token should be the name of the class - if token == '\n': - return self - # If that's an inner class which is declared in a method, it - # requires an index prepended to the class-name, e.g. - # 'Foo$1Inner' (Tigris Issue 2087) - if self.outer_state.localClasses and \ - self.outer_state.stackBrackets[-1] > \ - self.outer_state.stackBrackets[-2]+1: - locals = self.outer_state.localClasses[-1] - try: - idx = locals[token] - locals[token] = locals[token]+1 - except KeyError: - locals[token] = 1 - token = str(locals[token]) + token - self.outer_state.localClasses.append({}) - self.outer_state.listClasses.append(token) - self.outer_state.anonStacksStack.append([0]) - return self.outer_state - - class IgnoreState: - """A state that will ignore all tokens until it gets to a - specified token.""" - def __init__(self, ignore_until, old_state): - self.ignore_until = ignore_until - self.old_state = old_state - def parseToken(self, token): - if self.ignore_until == token: - return self.old_state - return self - - class PackageState: - """The state we enter when we encounter the package keyword. - We assume the next token will be the package name.""" - def __init__(self, outer_state): - # outer_state is always an instance of OuterState - self.outer_state = outer_state - def parseToken(self, token): - self.outer_state.setPackage(token) - return self.outer_state - - def parse_java_file(fn, version=default_java_version): - return parse_java(open(fn, 'r').read(), version) - - def parse_java(contents, version=default_java_version, trace=None): - """Parse a .java file and return a double of package directory, - plus a list of .class files that compiling that .java file will - produce""" - package = None - initial = OuterState(version) - currstate = initial - for token in _reToken.findall(contents): - # The regex produces a bunch of groups, but only one will - # have anything in it. - currstate = currstate.parseToken(token) - if trace: trace(token, currstate) - if initial.package: - package = string.replace(initial.package, '.', os.sep) - return (package, initial.listOutputs) - -else: - # Don't actually parse Java files for class names. - # - # We might make this a configurable option in the future if - # Java-file parsing takes too long (although it shouldn't relative - # to how long the Java compiler itself seems to take...). - - def parse_java_file(fn): - """ "Parse" a .java file. - - This actually just splits the file name, so the assumption here - is that the file name matches the public class name, and that - the path to the file is the same as the package name. - """ - return os.path.split(file) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/MSCommon/__init__.py b/3rdParty/SCons/scons-local/SCons/Tool/MSCommon/__init__.py deleted file mode 100644 index 66afde3..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/MSCommon/__init__.py +++ /dev/null @@ -1,49 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/MSCommon/__init__.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """ -Common functions for Microsoft Visual Studio and Visual C/C++. -""" - -import copy -import os -import re -import subprocess - -import SCons.Errors -import SCons.Platform.win32 -import SCons.Util - -from SCons.Tool.MSCommon.vs import detect_msvs, \ - get_default_version, \ - get_vs_by_version, \ - merge_default_version, \ - query_versions - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/MSCommon/common.py b/3rdParty/SCons/scons-local/SCons/Tool/MSCommon/common.py deleted file mode 100644 index 0cac163..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/MSCommon/common.py +++ /dev/null @@ -1,179 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/MSCommon/common.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """ -Common helper functions for working with -""" - -import copy -import os -import subprocess -import re - -import SCons.Util - - -logfile = os.environ.get('SCONS_MSCOMMON_DEBUG') -if logfile: - try: - import logging - except ImportError: - debug = lambda x: open(logfile, 'a').write(x + '\n') - else: - logging.basicConfig(filename=logfile, level=logging.DEBUG) - debug = logging.debug -else: - debug = lambda x: None - - -# TODO(sgk): unused -def is_win64(): - """Return true if running on windows 64 bits.""" - # Unfortunately, python does not seem to have anything useful: neither - # sys.platform nor os.name gives something different on windows running on - # 32 bits or 64 bits. Note that we don't care about whether python itself - # is 32 or 64 bits here - value = "Software\Wow6432Node" - yo = SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, value)[0] - if yo is None: - return 0 - else: - return 1 - -def read_reg(value): - return SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, value)[0] - - -# Functions for fetching environment variable settings from batch files. - -def normalize_env(env, keys): - """Given a dictionary representing a shell environment, add the variables - from os.environ needed for the processing of .bat files; the keys are - controlled by the keys argument. - - It also makes sure the environment values are correctly encoded. - - Note: the environment is copied""" - normenv = {} - if env: - for k in env.keys(): - normenv[k] = copy.deepcopy(env[k]).encode('mbcs') - - for k in keys: - if os.environ.has_key(k): - normenv[k] = os.environ[k].encode('mbcs') - - return normenv - -def get_output(vcbat, args = None, env = None): - """Parse the output of given bat file, with given args.""" - if args: - debug("Calling '%s %s'" % (vcbat, args)) - popen = subprocess.Popen('"%s" %s & set' % (vcbat, args), - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - env=env) - else: - debug("Calling '%s'" % vcbat) - popen = subprocess.Popen('"%s" & set' % vcbat, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - env=env) - - # Use the .stdout and .stderr attributes directly because the - # .communicate() method uses the threading module on Windows - # and won't work under Pythons not built with threading. - stdout = popen.stdout.read() - if popen.wait() != 0: - raise IOError(popen.stderr.read().decode("mbcs")) - - output = stdout.decode("mbcs") - return output - -def parse_output(output, keep = ("INCLUDE", "LIB", "LIBPATH", "PATH")): - # dkeep is a dict associating key: path_list, where key is one item from - # keep, and pat_list the associated list of paths - - # TODO(1.5): replace with the following list comprehension: - #dkeep = dict([(i, []) for i in keep]) - dkeep = dict(map(lambda i: (i, []), keep)) - - # rdk will keep the regex to match the .bat file output line starts - rdk = {} - for i in keep: - rdk[i] = re.compile('%s=(.*)' % i, re.I) - - def add_env(rmatch, key): - plist = rmatch.group(1).split(os.pathsep) - for p in plist: - # Do not add empty paths (when a var ends with ;) - if p: - p = p.encode('mbcs') - # XXX: For some reason, VC98 .bat file adds "" around the PATH - # values, and it screws up the environment later, so we strip - # it. - p = p.strip('"') - dkeep[key].append(p) - - for line in output.splitlines(): - for k,v in rdk.items(): - m = v.match(line) - if m: - add_env(m, k) - - return dkeep - -# TODO(sgk): unused -def output_to_dict(output): - """Given an output string, parse it to find env variables. - - Return a dict where keys are variables names, and values their content""" - envlinem = re.compile(r'^([a-zA-z0-9]+)=([\S\s]*)$') - parsedenv = {} - for line in output.splitlines(): - m = envlinem.match(line) - if m: - parsedenv[m.group(1)] = m.group(2) - return parsedenv - -# TODO(sgk): unused -def get_new(l1, l2): - """Given two list l1 and l2, return the items in l2 which are not in l1. - Order is maintained.""" - - # We don't try to be smart: lists are small, and this is not the bottleneck - # is any case - new = [] - for i in l2: - if i not in l1: - new.append(i) - - return new - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/MSCommon/netframework.py b/3rdParty/SCons/scons-local/SCons/Tool/MSCommon/netframework.py deleted file mode 100644 index 33a0224..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/MSCommon/netframework.py +++ /dev/null @@ -1,84 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/MSCommon/netframework.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """ -""" - -import os -import re -import string - -from common import read_reg, debug - -# Original value recorded by dcournapeau -_FRAMEWORKDIR_HKEY_ROOT = r'Software\Microsoft\.NETFramework\InstallRoot' -# On SGK's system -_FRAMEWORKDIR_HKEY_ROOT = r'Software\Microsoft\Microsoft SDKs\.NETFramework\v2.0\InstallationFolder' - -def find_framework_root(): - # XXX: find it from environment (FrameworkDir) - try: - froot = read_reg(_FRAMEWORKDIR_HKEY_ROOT) - debug("Found framework install root in registry: %s" % froot) - except WindowsError, e: - debug("Could not read reg key %s" % _FRAMEWORKDIR_HKEY_ROOT) - return None - - if not os.path.exists(froot): - debug("%s not found on fs" % froot) - return None - - return froot - -def query_versions(): - froot = find_framework_root() - if froot: - contents = os.listdir(froot) - - l = re.compile('v[0-9]+.*') - versions = filter(lambda e, l=l: l.match(e), contents) - - def versrt(a,b): - # since version numbers aren't really floats... - aa = a[1:] - bb = b[1:] - aal = string.split(aa, '.') - bbl = string.split(bb, '.') - # sequence comparison in python is lexicographical - # which is exactly what we want. - # Note we sort backwards so the highest version is first. - return cmp(bbl,aal) - - versions.sort(versrt) - else: - versions = [] - - return versions - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/MSCommon/sdk.py b/3rdParty/SCons/scons-local/SCons/Tool/MSCommon/sdk.py deleted file mode 100644 index e11df4e..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/MSCommon/sdk.py +++ /dev/null @@ -1,257 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/MSCommon/sdk.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """Module to detect the Platform/Windows SDK - -PSDK 2003 R1 is the earliest version detected. -""" - -import os - -import SCons.Errors -from SCons.Tool.MSCommon.common import debug, read_reg -import SCons.Util - -# SDK Checks. This is of course a mess as everything else on MS platforms. Here -# is what we do to detect the SDK: -# -# For Windows SDK >= 6.0: just look into the registry entries: -# HKLM\Software\Microsoft\Microsoft SDKs\Windows -# All the keys in there are the available versions. -# -# For Platform SDK before 6.0 (2003 server R1 and R2, etc...), there does not -# seem to be any sane registry key, so the precise location is hardcoded. -# -# For versions below 2003R1, it seems the PSDK is included with Visual Studio? -# -# Also, per the following: -# http://benjamin.smedbergs.us/blog/tag/atl/ -# VC++ Professional comes with the SDK, VC++ Express does not. - -# Location of the SDK (checked for 6.1 only) -_CURINSTALLED_SDK_HKEY_ROOT = \ - r"Software\Microsoft\Microsoft SDKs\Windows\CurrentInstallFolder" - - -class SDKDefinition: - """ - An abstract base class for trying to find installed SDK directories. - """ - def __init__(self, version, **kw): - self.version = version - self.__dict__.update(kw) - - def find_sdk_dir(self): - """Try to find the MS SDK from the registry. - - Return None if failed or the directory does not exist. - """ - if not SCons.Util.can_read_reg: - debug('find_sdk_dir(): can not read registry') - return None - - hkey = self.HKEY_FMT % self.hkey_data - - try: - sdk_dir = read_reg(hkey) - except WindowsError, e: - debug('find_sdk_dir(): no registry key %s' % hkey) - return None - - if not os.path.exists(sdk_dir): - debug('find_sdk_dir(): %s not on file system' % sdk_dir) - return None - - ftc = os.path.join(sdk_dir, self.sanity_check_file) - if not os.path.exists(ftc): - debug("find_sdk_dir(): sanity check %s not found" % ftc) - return None - - return sdk_dir - - def get_sdk_dir(self): - """Return the MSSSDK given the version string.""" - try: - return self._sdk_dir - except AttributeError: - sdk_dir = self.find_sdk_dir() - self._sdk_dir = sdk_dir - return sdk_dir - -class WindowsSDK(SDKDefinition): - """ - A subclass for trying to find installed Windows SDK directories. - """ - HKEY_FMT = r'Software\Microsoft\Microsoft SDKs\Windows\v%s\InstallationFolder' - def __init__(self, *args, **kw): - apply(SDKDefinition.__init__, (self,)+args, kw) - self.hkey_data = self.version - -class PlatformSDK(SDKDefinition): - """ - A subclass for trying to find installed Platform SDK directories. - """ - HKEY_FMT = r'Software\Microsoft\MicrosoftSDK\InstalledSDKS\%s\Install Dir' - def __init__(self, *args, **kw): - apply(SDKDefinition.__init__, (self,)+args, kw) - self.hkey_data = self.uuid - -# The list of support SDKs which we know how to detect. -# -# The first SDK found in the list is the one used by default if there -# are multiple SDKs installed. Barring good reasons to the contrary, -# this means we should list SDKs with from most recent to oldest. -# -# If you update this list, update the documentation in Tool/mssdk.xml. -SupportedSDKList = [ - WindowsSDK('6.1', - sanity_check_file=r'include\windows.h'), - - WindowsSDK('6.0A', - sanity_check_file=r'include\windows.h'), - - WindowsSDK('6.0', - sanity_check_file=r'bin\gacutil.exe'), - - PlatformSDK('2003R2', - sanity_check_file=r'SetEnv.Cmd', - uuid="D2FF9F89-8AA2-4373-8A31-C838BF4DBBE1"), - - PlatformSDK('2003R1', - sanity_check_file=r'SetEnv.Cmd', - uuid="8F9E5EF3-A9A5-491B-A889-C58EFFECE8B3"), -] - -SupportedSDKMap = {} -for sdk in SupportedSDKList: - SupportedSDKMap[sdk.version] = sdk - - -# Finding installed SDKs isn't cheap, because it goes not only to the -# registry but also to the disk to sanity-check that there is, in fact, -# an SDK installed there and that the registry entry isn't just stale. -# Find this information once, when requested, and cache it. - -InstalledSDKList = None -InstalledSDKMap = None - -def get_installed_sdks(): - global InstalledSDKList - global InstalledSDKMap - if InstalledSDKList is None: - InstalledSDKList = [] - InstalledSDKMap = {} - for sdk in SupportedSDKList: - debug('trying to find SDK %s' % sdk.version) - if sdk.get_sdk_dir(): - debug('found SDK %s' % sdk.version) - InstalledSDKList.append(sdk) - InstalledSDKMap[sdk.version] = sdk - return InstalledSDKList - - -# We may be asked to update multiple construction environments with -# SDK information. When doing this, we check on-disk for whether -# the SDK has 'mfc' and 'atl' subdirectories. Since going to disk -# is expensive, cache results by directory. - -SDKEnvironmentUpdates = {} - -def set_sdk_by_directory(env, sdk_dir): - global SDKEnvironmentUpdates - try: - env_tuple_list = SDKEnvironmentUpdates[sdk_dir] - except KeyError: - env_tuple_list = [] - SDKEnvironmentUpdates[sdk_dir] = env_tuple_list - - include_path = os.path.join(sdk_dir, 'include') - mfc_path = os.path.join(include_path, 'mfc') - atl_path = os.path.join(include_path, 'atl') - - if os.path.exists(mfc_path): - env_tuple_list.append(('INCLUDE', mfc_path)) - if os.path.exists(atl_path): - env_tuple_list.append(('INCLUDE', atl_path)) - env_tuple_list.append(('INCLUDE', include_path)) - - env_tuple_list.append(('LIB', os.path.join(sdk_dir, 'lib'))) - env_tuple_list.append(('LIBPATH', os.path.join(sdk_dir, 'lib'))) - env_tuple_list.append(('PATH', os.path.join(sdk_dir, 'bin'))) - - for variable, directory in env_tuple_list: - env.PrependENVPath(variable, directory) - - -# TODO(sgk): currently unused; remove? -def get_cur_sdk_dir_from_reg(): - """Try to find the platform sdk directory from the registry. - - Return None if failed or the directory does not exist""" - if not SCons.Util.can_read_reg: - debug('SCons cannot read registry') - return None - - try: - val = read_reg(_CURINSTALLED_SDK_HKEY_ROOT) - debug("Found current sdk dir in registry: %s" % val) - except WindowsError, e: - debug("Did not find current sdk in registry") - return None - - if not os.path.exists(val): - debug("Current sdk dir %s not on fs" % val) - return None - - return val - - -def detect_sdk(): - return (len(get_installed_sdks()) > 0) - -def set_sdk_by_version(env, mssdk): - if not SupportedSDKMap.has_key(mssdk): - msg = "SDK version %s is not supported" % repr(mssdk) - raise SCons.Errors.UserError, msg - get_installed_sdks() - sdk = InstalledSDKMap.get(mssdk) - if not sdk: - msg = "SDK version %s is not installed" % repr(mssdk) - raise SCons.Errors.UserError, msg - set_sdk_by_directory(env, sdk.get_sdk_dir()) - -def set_default_sdk(env, msver): - """Set up the default Platform/Windows SDK.""" - # For MSVS < 8, use integrated windows sdk by default - if msver >= 8: - sdks = get_installed_sdks() - if len(sdks) > 0: - set_sdk_by_directory(env, sdks[0].get_sdk_dir()) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/MSCommon/vs.py b/3rdParty/SCons/scons-local/SCons/Tool/MSCommon/vs.py deleted file mode 100644 index 2203e20..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/MSCommon/vs.py +++ /dev/null @@ -1,495 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/MSCommon/vs.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """Module to detect Visual Studio and/or Visual C/C++ -""" - -import os - -import SCons.Errors -import SCons.Util - -from SCons.Tool.MSCommon.common import debug, \ - read_reg, \ - normalize_env, \ - get_output, \ - parse_output - -class VisualStudio: - """ - An abstract base class for trying to find installed versions of - Visual Studio. - """ - def __init__(self, version, **kw): - self.version = version - self.__dict__.update(kw) - self._cache = {} - - # - - def find_batch_file(self): - """Try to find the Visual Studio or Visual C/C++ batch file. - - Return None if failed or the batch file does not exist. - """ - pdir = self.get_vc_product_dir() - if not pdir: - debug('find_batch_file(): no pdir') - return None - batch_file = os.path.normpath(os.path.join(pdir, self.batch_file)) - batch_file = os.path.normpath(batch_file) - if not os.path.isfile(batch_file): - debug('find_batch_file(): %s not on file system' % batch_file) - return None - return batch_file - - def find_executable(self): - pdir = self.get_vc_product_dir() - if not pdir: - debug('find_executable(): no pdir') - return None - executable = os.path.join(pdir, self.executable_path) - executable = os.path.normpath(executable) - if not os.path.isfile(executable): - debug('find_executable(): %s not on file system' % executable) - return None - return executable - - def find_vc_product_dir(self): - if not SCons.Util.can_read_reg: - debug('find_vc_product_dir(): can not read registry') - return None - key = self.hkey_root + '\\' + self.vc_product_dir_key - try: - comps = read_reg(key) - except WindowsError, e: - debug('find_vc_product_dir(): no registry key %s' % key) - else: - if self.batch_file_dir_reg_relpath: - comps = os.path.join(comps, self.batch_file_dir_reg_relpath) - comps = os.path.normpath(comps) - if os.path.exists(comps): - return comps - else: - debug('find_vc_product_dir(): %s not on file system' % comps) - - d = os.environ.get(self.common_tools_var) - if not d: - msg = 'find_vc_product_dir(): no %s variable' - debug(msg % self.common_tools_var) - return None - if not os.path.isdir(d): - debug('find_vc_product_dir(): %s not on file system' % d) - return None - if self.batch_file_dir_env_relpath: - d = os.path.join(d, self.batch_file_dir_env_relpath) - d = os.path.normpath(d) - return d - - # - - def get_batch_file(self): - try: - return self._cache['batch_file'] - except KeyError: - batch_file = self.find_batch_file() - self._cache['batch_file'] = batch_file - return batch_file - - def get_executable(self): - try: - return self._cache['executable'] - except KeyError: - executable = self.find_executable() - self._cache['executable'] = executable - return executable - - def get_supported_arch(self): - try: - return self._cache['supported_arch'] - except KeyError: - # RDEVE: for the time being use hardcoded lists - # supported_arch = self.find_supported_arch() - self._cache['supported_arch'] = self.supported_arch - return self.supported_arch - - def get_vc_product_dir(self): - try: - return self._cache['vc_product_dir'] - except KeyError: - vc_product_dir = self.find_vc_product_dir() - self._cache['vc_product_dir'] = vc_product_dir - return vc_product_dir - - def reset(self): - self._cache = {} - -# The list of supported Visual Studio versions we know how to detect. -# -# How to look for .bat file ? -# - VS 2008 Express (x86): -# * from registry key productdir, gives the full path to vsvarsall.bat. In -# HKEY_LOCAL_MACHINE): -# Software\Microsoft\VCEpress\9.0\Setup\VC\productdir -# * from environmnent variable VS90COMNTOOLS: the path is then ..\..\VC -# relatively to the path given by the variable. -# -# - VS 2008 Express (WoW6432: 32 bits on windows x64): -# Software\Wow6432Node\Microsoft\VCEpress\9.0\Setup\VC\productdir -# -# - VS 2005 Express (x86): -# * from registry key productdir, gives the full path to vsvarsall.bat. In -# HKEY_LOCAL_MACHINE): -# Software\Microsoft\VCEpress\8.0\Setup\VC\productdir -# * from environmnent variable VS80COMNTOOLS: the path is then ..\..\VC -# relatively to the path given by the variable. -# -# - VS 2005 Express (WoW6432: 32 bits on windows x64): does not seem to have a -# productdir ? -# -# - VS 2003 .Net (pro edition ? x86): -# * from registry key productdir. The path is then ..\Common7\Tools\ -# relatively to the key. The key is in HKEY_LOCAL_MACHINE): -# Software\Microsoft\VisualStudio\7.1\Setup\VC\productdir -# * from environmnent variable VS71COMNTOOLS: the path is the full path to -# vsvars32.bat -# -# - VS 98 (VS 6): -# * from registry key productdir. The path is then Bin -# relatively to the key. The key is in HKEY_LOCAL_MACHINE): -# Software\Microsoft\VisualStudio\6.0\Setup\VC98\productdir -# -# The first version found in the list is the one used by default if -# there are multiple versions installed. Barring good reasons to -# the contrary, this means we should list versions from most recent -# to oldest. Pro versions get listed before Express versions on the -# assumption that, by default, you'd rather use the version you paid -# good money for in preference to whatever Microsoft makes available -# for free. -# -# If you update this list, update the documentation in Tool/msvs.xml. - -SupportedVSList = [ - # Visual Studio 2010 - # TODO: find the settings, perhaps from someone with a CTP copy? - #VisualStudio('TBD', - # hkey_root=r'TBD', - # common_tools_var='TBD', - # batch_file='TBD', - # vc_product_dir_key=r'TBD', - # batch_file_dir_reg_relpath=None, - # batch_file_dir_env_relpath=r'TBD', - # executable_path=r'TBD', - # default_dirname='TBD', - #), - - # Visual Studio 2008 - # The batch file we look for is in the VC directory, - # so the devenv.com executable is up in ..\..\Common7\IDE. - VisualStudio('9.0', - hkey_root=r'Software\Microsoft\VisualStudio\9.0', - common_tools_var='VS90COMNTOOLS', - batch_file='vcvarsall.bat', - vc_product_dir_key=r'Setup\VC\ProductDir', - batch_file_dir_reg_relpath=None, - batch_file_dir_env_relpath=r'..\..\VC', - executable_path=r'..\Common7\IDE\devenv.com', - default_dirname='Microsoft Visual Studio 9', - supported_arch=['x86', 'amd64'], - ), - - # Visual C++ 2008 Express Edition - # The batch file we look for is in the VC directory, - # so the VCExpress.exe executable is up in ..\..\Common7\IDE. - VisualStudio('9.0Exp', - hkey_root=r'Software\Microsoft\VisualStudio\9.0', - common_tools_var='VS90COMNTOOLS', - batch_file='vcvarsall.bat', - vc_product_dir_key=r'Setup\VC\ProductDir', - batch_file_dir_reg_relpath=None, - batch_file_dir_env_relpath=r'..\..\VC', - executable_path=r'..\Common7\IDE\VCExpress.exe', - default_dirname='Microsoft Visual Studio 9', - supported_arch=['x86'], - ), - - # Visual Studio 2005 - # The batch file we look for is in the VC directory, - # so the devenv.com executable is up in ..\..\Common7\IDE. - VisualStudio('8.0', - hkey_root=r'Software\Microsoft\VisualStudio\8.0', - common_tools_var='VS80COMNTOOLS', - batch_file='vcvarsall.bat', - vc_product_dir_key=r'Setup\VC\ProductDir', - batch_file_dir_reg_relpath=None, - batch_file_dir_env_relpath=r'..\..\VC', - executable_path=r'..\Common7\IDE\devenv.com', - default_dirname='Microsoft Visual Studio 8', - supported_arch=['x86', 'amd64'], - ), - - # Visual C++ 2005 Express Edition - # The batch file we look for is in the VC directory, - # so the VCExpress.exe executable is up in ..\..\Common7\IDE. - VisualStudio('8.0Exp', - hkey_root=r'Software\Microsoft\VCExpress\8.0', - common_tools_var='VS80COMNTOOLS', - batch_file='vcvarsall.bat', - vc_product_dir_key=r'Setup\VC\ProductDir', - batch_file_dir_reg_relpath=None, - batch_file_dir_env_relpath=r'..\..\VC', - # The batch file is in the VC directory, so - # so the devenv.com executable is next door in ..\IDE. - executable_path=r'..\Common7\IDE\VCExpress.exe', - default_dirname='Microsoft Visual Studio 8', - supported_arch=['x86'], - ), - - # Visual Studio .NET 2003 - # The batch file we look for is in the Common7\Tools directory, - # so the devenv.com executable is next door in ..\IDE. - VisualStudio('7.1', - hkey_root=r'Software\Microsoft\VisualStudio\7.1', - common_tools_var='VS71COMNTOOLS', - batch_file='vsvars32.bat', - vc_product_dir_key=r'Setup\VC\ProductDir', - batch_file_dir_reg_relpath=r'..\Common7\Tools', - batch_file_dir_env_relpath=None, - executable_path=r'..\IDE\devenv.com', - default_dirname='Microsoft Visual Studio .NET', - supported_arch=['x86'], - ), - - # Visual Studio .NET - # The batch file we look for is in the Common7\Tools directory, - # so the devenv.com executable is next door in ..\IDE. - VisualStudio('7.0', - hkey_root=r'Software\Microsoft\VisualStudio\7.0', - common_tools_var='VS70COMNTOOLS', - batch_file='vsvars32.bat', - vc_product_dir_key=r'Setup\VC\ProductDir', - batch_file_dir_reg_relpath=r'..\Common7\Tools', - batch_file_dir_env_relpath=None, - executable_path=r'..\IDE\devenv.com', - default_dirname='Microsoft Visual Studio .NET', - supported_arch=['x86'], - ), - - # Visual Studio 6.0 - VisualStudio('6.0', - hkey_root=r'Software\Microsoft\VisualStudio\6.0', - common_tools_var='VS60COMNTOOLS', - batch_file='vcvars32.bat', - vc_product_dir_key='Setup\Microsoft Visual C++\ProductDir', - batch_file_dir_reg_relpath='Bin', - batch_file_dir_env_relpath=None, - executable_path=r'Common\MSDev98\Bin\MSDEV.COM', - default_dirname='Microsoft Visual Studio', - supported_arch=['x86'], - ), -] - -SupportedVSMap = {} -for vs in SupportedVSList: - SupportedVSMap[vs.version] = vs - - -# Finding installed versions of Visual Studio isn't cheap, because it -# goes not only to the registry but also to the disk to sanity-check -# that there is, in fact, a Visual Studio directory there and that the -# registry entry isn't just stale. Find this information once, when -# requested, and cache it. - -InstalledVSList = None -InstalledVSMap = None - -def get_installed_visual_studios(): - global InstalledVSList - global InstalledVSMap - if InstalledVSList is None: - InstalledVSList = [] - InstalledVSMap = {} - for vs in SupportedVSList: - debug('trying to find VS %s' % vs.version) - if vs.get_executable(): - debug('found VS %s' % vs.version) - InstalledVSList.append(vs) - InstalledVSMap[vs.version] = vs - return InstalledVSList - -def reset_installed_visual_studios(): - global InstalledVSList - global InstalledVSMap - InstalledVSList = None - InstalledVSMap = None - for vs in SupportedVSList: - vs.reset() - - -# We may be asked to update multiple construction environments with -# SDK information. When doing this, we check on-disk for whether -# the SDK has 'mfc' and 'atl' subdirectories. Since going to disk -# is expensive, cache results by directory. - -#SDKEnvironmentUpdates = {} -# -#def set_sdk_by_directory(env, sdk_dir): -# global SDKEnvironmentUpdates -# try: -# env_tuple_list = SDKEnvironmentUpdates[sdk_dir] -# except KeyError: -# env_tuple_list = [] -# SDKEnvironmentUpdates[sdk_dir] = env_tuple_list -# -# include_path = os.path.join(sdk_dir, 'include') -# mfc_path = os.path.join(include_path, 'mfc') -# atl_path = os.path.join(include_path, 'atl') -# -# if os.path.exists(mfc_path): -# env_tuple_list.append(('INCLUDE', mfc_path)) -# if os.path.exists(atl_path): -# env_tuple_list.append(('INCLUDE', atl_path)) -# env_tuple_list.append(('INCLUDE', include_path)) -# -# env_tuple_list.append(('LIB', os.path.join(sdk_dir, 'lib'))) -# env_tuple_list.append(('LIBPATH', os.path.join(sdk_dir, 'lib'))) -# env_tuple_list.append(('PATH', os.path.join(sdk_dir, 'bin'))) -# -# for variable, directory in env_tuple_list: -# env.PrependENVPath(variable, directory) - -def detect_msvs(): - return (len(get_installed_visual_studios()) > 0) - -def get_vs_by_version(msvs): - if not SupportedVSMap.has_key(msvs): - msg = "Visual Studio version %s is not supported" % repr(msvs) - raise SCons.Errors.UserError, msg - get_installed_visual_studios() - vs = InstalledVSMap.get(msvs) - # Some check like this would let us provide a useful error message - # if they try to set a Visual Studio version that's not installed. - # However, we also want to be able to run tests (like the unit - # tests) on systems that don't, or won't ever, have it installed. - # It might be worth resurrecting this, with some configurable - # setting that the tests can use to bypass the check. - #if not vs: - # msg = "Visual Studio version %s is not installed" % repr(msvs) - # raise SCons.Errors.UserError, msg - return vs - -def get_default_version(env): - """Returns the default version string to use for MSVS. - - If no version was requested by the user through the MSVS environment - variable, query all the available the visual studios through - query_versions, and take the highest one. - - Return - ------ - version: str - the default version. - """ - if not env.has_key('MSVS') or not SCons.Util.is_Dict(env['MSVS']): - # TODO(1.5): - #versions = [vs.version for vs in get_installed_visual_studios()] - versions = map(lambda vs: vs.version, get_installed_visual_studios()) - env['MSVS'] = {'VERSIONS' : versions} - else: - versions = env['MSVS'].get('VERSIONS', []) - - if not env.has_key('MSVS_VERSION'): - if versions: - env['MSVS_VERSION'] = versions[0] #use highest version by default - else: - env['MSVS_VERSION'] = SupportedVSList[0].version - - env['MSVS']['VERSION'] = env['MSVS_VERSION'] - - return env['MSVS_VERSION'] - -def get_default_arch(env): - """Return the default arch to use for MSVS - - if no version was requested by the user through the MSVS_ARCH environment - variable, select x86 - - Return - ------ - arch: str - """ - arch = env.get('MSVS_ARCH', 'x86') - - msvs = InstalledVSMap.get(env['MSVS_VERSION']) - - if not msvs: - arch = 'x86' - elif not arch in msvs.get_supported_arch(): - fmt = "Visual Studio version %s does not support architecture %s" - raise SCons.Errors.UserError, fmt % (env['MSVS_VERSION'], arch) - - return arch - -def merge_default_version(env): - version = get_default_version(env) - arch = get_default_arch(env) - - msvs = get_vs_by_version(version) - if msvs is None: - return - batfilename = msvs.get_batch_file() - - # XXX: I think this is broken. This will silently set a bogus tool instead - # of failing, but there is no other way with the current scons tool - # framework - if batfilename is not None: - - vars = ('LIB', 'LIBPATH', 'PATH', 'INCLUDE') - - msvs_list = get_installed_visual_studios() - # TODO(1.5): - #vscommonvarnames = [ vs.common_tools_var for vs in msvs_list ] - vscommonvarnames = map(lambda vs: vs.common_tools_var, msvs_list) - nenv = normalize_env(env['ENV'], vscommonvarnames + ['COMSPEC']) - output = get_output(batfilename, arch, env=nenv) - vars = parse_output(output, vars) - - for k, v in vars.items(): - env.PrependENVPath(k, v, delete_existing=1) - -def query_versions(): - """Query the system to get available versions of VS. A version is - considered when a batfile is found.""" - msvs_list = get_installed_visual_studios() - # TODO(1.5) - #versions = [ msvs.version for msvs in msvs_list ] - versions = map(lambda msvs: msvs.version, msvs_list) - return versions - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/Perforce.py b/3rdParty/SCons/scons-local/SCons/Tool/Perforce.py deleted file mode 100644 index 2dbdbbb..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/Perforce.py +++ /dev/null @@ -1,104 +0,0 @@ -"""SCons.Tool.Perforce.py - -Tool-specific initialization for Perforce Source Code Management system. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/Perforce.py 4043 2009/02/23 09:06:45 scons" - -import os - -import SCons.Action -import SCons.Builder -import SCons.Node.FS -import SCons.Util - -# This function should maybe be moved to SCons.Util? -from SCons.Tool.PharLapCommon import addPathIfNotExists - - - -# Variables that we want to import from the base OS environment. -_import_env = [ 'P4PORT', 'P4CLIENT', 'P4USER', 'USER', 'USERNAME', 'P4PASSWD', - 'P4CHARSET', 'P4LANGUAGE', 'SystemRoot' ] - -PerforceAction = SCons.Action.Action('$P4COM', '$P4COMSTR') - -def generate(env): - """Add a Builder factory function and construction variables for - Perforce to an Environment.""" - - def PerforceFactory(env=env): - """ """ - return SCons.Builder.Builder(action = PerforceAction, env = env) - - #setattr(env, 'Perforce', PerforceFactory) - env.Perforce = PerforceFactory - - env['P4'] = 'p4' - env['P4FLAGS'] = SCons.Util.CLVar('') - env['P4COM'] = '$P4 $P4FLAGS sync $TARGET' - try: - environ = env['ENV'] - except KeyError: - environ = {} - env['ENV'] = environ - - # Perforce seems to use the PWD environment variable rather than - # calling getcwd() for itself, which is odd. If no PWD variable - # is present, p4 WILL call getcwd, but this seems to cause problems - # with good ol' Windows's tilde-mangling for long file names. - environ['PWD'] = env.Dir('#').get_abspath() - - for var in _import_env: - v = os.environ.get(var) - if v: - environ[var] = v - - if SCons.Util.can_read_reg: - # If we can read the registry, add the path to Perforce to our environment. - try: - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Perforce\\environment') - val, tok = SCons.Util.RegQueryValueEx(k, 'P4INSTROOT') - addPathIfNotExists(environ, 'PATH', val) - except SCons.Util.RegError: - # Can't detect where Perforce is, hope the user has it set in the - # PATH. - pass - -def exists(env): - return env.Detect('p4') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/PharLapCommon.py b/3rdParty/SCons/scons-local/SCons/Tool/PharLapCommon.py deleted file mode 100644 index 1d7779e..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/PharLapCommon.py +++ /dev/null @@ -1,138 +0,0 @@ -"""SCons.Tool.PharLapCommon - -This module contains common code used by all Tools for the -Phar Lap ETS tool chain. Right now, this is linkloc and -386asm. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/PharLapCommon.py 4043 2009/02/23 09:06:45 scons" - -import os -import os.path -import SCons.Errors -import SCons.Util -import re -import string - -def getPharLapPath(): - """Reads the registry to find the installed path of the Phar Lap ETS - development kit. - - Raises UserError if no installed version of Phar Lap can - be found.""" - - if not SCons.Util.can_read_reg: - raise SCons.Errors.InternalError, "No Windows registry module was found" - try: - k=SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, - 'SOFTWARE\\Pharlap\\ETS') - val, type = SCons.Util.RegQueryValueEx(k, 'BaseDir') - - # The following is a hack...there is (not surprisingly) - # an odd issue in the Phar Lap plug in that inserts - # a bunch of junk data after the phar lap path in the - # registry. We must trim it. - idx=val.find('\0') - if idx >= 0: - val = val[:idx] - - return os.path.normpath(val) - except SCons.Util.RegError: - raise SCons.Errors.UserError, "Cannot find Phar Lap ETS path in the registry. Is it installed properly?" - -REGEX_ETS_VER = re.compile(r'#define\s+ETS_VER\s+([0-9]+)') - -def getPharLapVersion(): - """Returns the version of the installed ETS Tool Suite as a - decimal number. This version comes from the ETS_VER #define in - the embkern.h header. For example, '#define ETS_VER 1010' (which - is what Phar Lap 10.1 defines) would cause this method to return - 1010. Phar Lap 9.1 does not have such a #define, but this method - will return 910 as a default. - - Raises UserError if no installed version of Phar Lap can - be found.""" - - include_path = os.path.join(getPharLapPath(), os.path.normpath("include/embkern.h")) - if not os.path.exists(include_path): - raise SCons.Errors.UserError, "Cannot find embkern.h in ETS include directory.\nIs Phar Lap ETS installed properly?" - mo = REGEX_ETS_VER.search(open(include_path, 'r').read()) - if mo: - return int(mo.group(1)) - # Default return for Phar Lap 9.1 - return 910 - -def addPathIfNotExists(env_dict, key, path, sep=os.pathsep): - """This function will take 'key' out of the dictionary - 'env_dict', then add the path 'path' to that key if it is not - already there. This treats the value of env_dict[key] as if it - has a similar format to the PATH variable...a list of paths - separated by tokens. The 'path' will get added to the list if it - is not already there.""" - try: - is_list = 1 - paths = env_dict[key] - if not SCons.Util.is_List(env_dict[key]): - paths = string.split(paths, sep) - is_list = 0 - if not os.path.normcase(path) in map(os.path.normcase, paths): - paths = [ path ] + paths - if is_list: - env_dict[key] = paths - else: - env_dict[key] = string.join(paths, sep) - except KeyError: - env_dict[key] = path - -def addPharLapPaths(env): - """This function adds the path to the Phar Lap binaries, includes, - and libraries, if they are not already there.""" - ph_path = getPharLapPath() - - try: - env_dict = env['ENV'] - except KeyError: - env_dict = {} - env['ENV'] = env_dict - addPathIfNotExists(env_dict, 'PATH', - os.path.join(ph_path, 'bin')) - addPathIfNotExists(env_dict, 'INCLUDE', - os.path.join(ph_path, 'include')) - addPathIfNotExists(env_dict, 'LIB', - os.path.join(ph_path, 'lib')) - addPathIfNotExists(env_dict, 'LIB', - os.path.join(ph_path, os.path.normpath('lib/vclib'))) - - env['PHARLAP_PATH'] = getPharLapPath() - env['PHARLAP_VERSION'] = str(getPharLapVersion()) - - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/RCS.py b/3rdParty/SCons/scons-local/SCons/Tool/RCS.py deleted file mode 100644 index 96ee313..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/RCS.py +++ /dev/null @@ -1,64 +0,0 @@ -"""SCons.Tool.RCS.py - -Tool-specific initialization for RCS. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/RCS.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add a Builder factory function and construction variables for - RCS to an Environment.""" - - def RCSFactory(env=env): - """ """ - act = SCons.Action.Action('$RCS_COCOM', '$RCS_COCOMSTR') - return SCons.Builder.Builder(action = act, env = env) - - #setattr(env, 'RCS', RCSFactory) - env.RCS = RCSFactory - - env['RCS'] = 'rcs' - env['RCS_CO'] = 'co' - env['RCS_COFLAGS'] = SCons.Util.CLVar('') - env['RCS_COCOM'] = '$RCS_CO $RCS_COFLAGS $TARGET' - -def exists(env): - return env.Detect('rcs') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/SCCS.py b/3rdParty/SCons/scons-local/SCons/Tool/SCCS.py deleted file mode 100644 index 7baa34c..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/SCCS.py +++ /dev/null @@ -1,64 +0,0 @@ -"""SCons.Tool.SCCS.py - -Tool-specific initialization for SCCS. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/SCCS.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add a Builder factory function and construction variables for - SCCS to an Environment.""" - - def SCCSFactory(env=env): - """ """ - act = SCons.Action.Action('$SCCSCOM', '$SCCSCOMSTR') - return SCons.Builder.Builder(action = act, env = env) - - #setattr(env, 'SCCS', SCCSFactory) - env.SCCS = SCCSFactory - - env['SCCS'] = 'sccs' - env['SCCSFLAGS'] = SCons.Util.CLVar('') - env['SCCSGETFLAGS'] = SCons.Util.CLVar('') - env['SCCSCOM'] = '$SCCS $SCCSFLAGS get $SCCSGETFLAGS $TARGET' - -def exists(env): - return env.Detect('sccs') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/Subversion.py b/3rdParty/SCons/scons-local/SCons/Tool/Subversion.py deleted file mode 100644 index 063bf8d..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/Subversion.py +++ /dev/null @@ -1,71 +0,0 @@ -"""SCons.Tool.Subversion.py - -Tool-specific initialization for Subversion. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/Subversion.py 4043 2009/02/23 09:06:45 scons" - -import os.path - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add a Builder factory function and construction variables for - Subversion to an Environment.""" - - def SubversionFactory(repos, module='', env=env): - """ """ - # fail if repos is not an absolute path name? - if module != '': - module = os.path.join(module, '') - act = SCons.Action.Action('$SVNCOM', '$SVNCOMSTR') - return SCons.Builder.Builder(action = act, - env = env, - SVNREPOSITORY = repos, - SVNMODULE = module) - - #setattr(env, 'Subversion', SubversionFactory) - env.Subversion = SubversionFactory - - env['SVN'] = 'svn' - env['SVNFLAGS'] = SCons.Util.CLVar('') - env['SVNCOM'] = '$SVN $SVNFLAGS cat $SVNREPOSITORY/$SVNMODULE$TARGET > $TARGET' - -def exists(env): - return env.Detect('svn') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/__init__.py b/3rdParty/SCons/scons-local/SCons/Tool/__init__.py deleted file mode 100644 index 5b31300..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/__init__.py +++ /dev/null @@ -1,673 +0,0 @@ -"""SCons.Tool - -SCons tool selection. - -This looks for modules that define a callable object that can modify -a construction environment as appropriate for a given tool (or tool -chain). - -Note that because this subsystem just *selects* a callable that can -modify a construction environment, it's possible for people to define -their own "tool specification" in an arbitrary callable function. No -one needs to use or tie in to this subsystem in order to roll their own -tool definition. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/__init__.py 4043 2009/02/23 09:06:45 scons" - -import imp -import sys - -import SCons.Builder -import SCons.Errors -import SCons.Node.FS -import SCons.Scanner -import SCons.Scanner.C -import SCons.Scanner.D -import SCons.Scanner.LaTeX -import SCons.Scanner.Prog - -DefaultToolpath=[] - -CScanner = SCons.Scanner.C.CScanner() -DScanner = SCons.Scanner.D.DScanner() -LaTeXScanner = SCons.Scanner.LaTeX.LaTeXScanner() -PDFLaTeXScanner = SCons.Scanner.LaTeX.PDFLaTeXScanner() -ProgramScanner = SCons.Scanner.Prog.ProgramScanner() -SourceFileScanner = SCons.Scanner.Base({}, name='SourceFileScanner') - -CSuffixes = [".c", ".C", ".cxx", ".cpp", ".c++", ".cc", - ".h", ".H", ".hxx", ".hpp", ".hh", - ".F", ".fpp", ".FPP", - ".m", ".mm", - ".S", ".spp", ".SPP"] - -DSuffixes = ['.d'] - -IDLSuffixes = [".idl", ".IDL"] - -LaTeXSuffixes = [".tex", ".ltx", ".latex"] - -for suffix in CSuffixes: - SourceFileScanner.add_scanner(suffix, CScanner) - -for suffix in DSuffixes: - SourceFileScanner.add_scanner(suffix, DScanner) - -# FIXME: what should be done here? Two scanners scan the same extensions, -# but look for different files, e.g., "picture.eps" vs. "picture.pdf". -# The builders for DVI and PDF explicitly reference their scanners -# I think that means this is not needed??? -for suffix in LaTeXSuffixes: - SourceFileScanner.add_scanner(suffix, LaTeXScanner) - SourceFileScanner.add_scanner(suffix, PDFLaTeXScanner) - -class Tool: - def __init__(self, name, toolpath=[], **kw): - self.name = name - self.toolpath = toolpath + DefaultToolpath - # remember these so we can merge them into the call - self.init_kw = kw - - module = self._tool_module() - self.generate = module.generate - self.exists = module.exists - if hasattr(module, 'options'): - self.options = module.options - - def _tool_module(self): - # TODO: Interchange zipimport with normal initilization for better error reporting - oldpythonpath = sys.path - sys.path = self.toolpath + sys.path - - try: - try: - file, path, desc = imp.find_module(self.name, self.toolpath) - try: - return imp.load_module(self.name, file, path, desc) - finally: - if file: - file.close() - except ImportError, e: - if str(e)!="No module named %s"%self.name: - raise SCons.Errors.EnvironmentError, e - try: - import zipimport - except ImportError: - pass - else: - for aPath in self.toolpath: - try: - importer = zipimport.zipimporter(aPath) - return importer.load_module(self.name) - except ImportError, e: - pass - finally: - sys.path = oldpythonpath - - full_name = 'SCons.Tool.' + self.name - try: - return sys.modules[full_name] - except KeyError: - try: - smpath = sys.modules['SCons.Tool'].__path__ - try: - file, path, desc = imp.find_module(self.name, smpath) - module = imp.load_module(full_name, file, path, desc) - setattr(SCons.Tool, self.name, module) - if file: - file.close() - return module - except ImportError, e: - if str(e)!="No module named %s"%self.name: - raise SCons.Errors.EnvironmentError, e - try: - import zipimport - importer = zipimport.zipimporter( sys.modules['SCons.Tool'].__path__[0] ) - module = importer.load_module(full_name) - setattr(SCons.Tool, self.name, module) - return module - except ImportError, e: - m = "No tool named '%s': %s" % (self.name, e) - raise SCons.Errors.EnvironmentError, m - except ImportError, e: - m = "No tool named '%s': %s" % (self.name, e) - raise SCons.Errors.EnvironmentError, m - - def __call__(self, env, *args, **kw): - if self.init_kw is not None: - # Merge call kws into init kws; - # but don't bash self.init_kw. - if kw is not None: - call_kw = kw - kw = self.init_kw.copy() - kw.update(call_kw) - else: - kw = self.init_kw - env.Append(TOOLS = [ self.name ]) - if hasattr(self, 'options'): - import SCons.Variables - if not env.has_key('options'): - from SCons.Script import ARGUMENTS - env['options']=SCons.Variables.Variables(args=ARGUMENTS) - opts=env['options'] - - self.options(opts) - opts.Update(env) - - apply(self.generate, ( env, ) + args, kw) - - def __str__(self): - return self.name - -########################################################################## -# Create common executable program / library / object builders - -def createProgBuilder(env): - """This is a utility function that creates the Program - Builder in an Environment if it is not there already. - - If it is already there, we return the existing one. - """ - - try: - program = env['BUILDERS']['Program'] - except KeyError: - import SCons.Defaults - program = SCons.Builder.Builder(action = SCons.Defaults.LinkAction, - emitter = '$PROGEMITTER', - prefix = '$PROGPREFIX', - suffix = '$PROGSUFFIX', - src_suffix = '$OBJSUFFIX', - src_builder = 'Object', - target_scanner = ProgramScanner) - env['BUILDERS']['Program'] = program - - return program - -def createStaticLibBuilder(env): - """This is a utility function that creates the StaticLibrary - Builder in an Environment if it is not there already. - - If it is already there, we return the existing one. - """ - - try: - static_lib = env['BUILDERS']['StaticLibrary'] - except KeyError: - action_list = [ SCons.Action.Action("$ARCOM", "$ARCOMSTR") ] - if env.Detect('ranlib'): - ranlib_action = SCons.Action.Action("$RANLIBCOM", "$RANLIBCOMSTR") - action_list.append(ranlib_action) - - static_lib = SCons.Builder.Builder(action = action_list, - emitter = '$LIBEMITTER', - prefix = '$LIBPREFIX', - suffix = '$LIBSUFFIX', - src_suffix = '$OBJSUFFIX', - src_builder = 'StaticObject') - env['BUILDERS']['StaticLibrary'] = static_lib - env['BUILDERS']['Library'] = static_lib - - return static_lib - -def createSharedLibBuilder(env): - """This is a utility function that creates the SharedLibrary - Builder in an Environment if it is not there already. - - If it is already there, we return the existing one. - """ - - try: - shared_lib = env['BUILDERS']['SharedLibrary'] - except KeyError: - import SCons.Defaults - action_list = [ SCons.Defaults.SharedCheck, - SCons.Defaults.ShLinkAction ] - shared_lib = SCons.Builder.Builder(action = action_list, - emitter = "$SHLIBEMITTER", - prefix = '$SHLIBPREFIX', - suffix = '$SHLIBSUFFIX', - target_scanner = ProgramScanner, - src_suffix = '$SHOBJSUFFIX', - src_builder = 'SharedObject') - env['BUILDERS']['SharedLibrary'] = shared_lib - - return shared_lib - -def createLoadableModuleBuilder(env): - """This is a utility function that creates the LoadableModule - Builder in an Environment if it is not there already. - - If it is already there, we return the existing one. - """ - - try: - ld_module = env['BUILDERS']['LoadableModule'] - except KeyError: - import SCons.Defaults - action_list = [ SCons.Defaults.SharedCheck, - SCons.Defaults.LdModuleLinkAction ] - ld_module = SCons.Builder.Builder(action = action_list, - emitter = "$LDMODULEEMITTER", - prefix = '$LDMODULEPREFIX', - suffix = '$LDMODULESUFFIX', - target_scanner = ProgramScanner, - src_suffix = '$SHOBJSUFFIX', - src_builder = 'SharedObject') - env['BUILDERS']['LoadableModule'] = ld_module - - return ld_module - -def createObjBuilders(env): - """This is a utility function that creates the StaticObject - and SharedObject Builders in an Environment if they - are not there already. - - If they are there already, we return the existing ones. - - This is a separate function because soooo many Tools - use this functionality. - - The return is a 2-tuple of (StaticObject, SharedObject) - """ - - - try: - static_obj = env['BUILDERS']['StaticObject'] - except KeyError: - static_obj = SCons.Builder.Builder(action = {}, - emitter = {}, - prefix = '$OBJPREFIX', - suffix = '$OBJSUFFIX', - src_builder = ['CFile', 'CXXFile'], - source_scanner = SourceFileScanner, - single_source = 1) - env['BUILDERS']['StaticObject'] = static_obj - env['BUILDERS']['Object'] = static_obj - - try: - shared_obj = env['BUILDERS']['SharedObject'] - except KeyError: - shared_obj = SCons.Builder.Builder(action = {}, - emitter = {}, - prefix = '$SHOBJPREFIX', - suffix = '$SHOBJSUFFIX', - src_builder = ['CFile', 'CXXFile'], - source_scanner = SourceFileScanner, - single_source = 1) - env['BUILDERS']['SharedObject'] = shared_obj - - return (static_obj, shared_obj) - -def createCFileBuilders(env): - """This is a utility function that creates the CFile/CXXFile - Builders in an Environment if they - are not there already. - - If they are there already, we return the existing ones. - - This is a separate function because soooo many Tools - use this functionality. - - The return is a 2-tuple of (CFile, CXXFile) - """ - - try: - c_file = env['BUILDERS']['CFile'] - except KeyError: - c_file = SCons.Builder.Builder(action = {}, - emitter = {}, - suffix = {None:'$CFILESUFFIX'}) - env['BUILDERS']['CFile'] = c_file - - env.SetDefault(CFILESUFFIX = '.c') - - try: - cxx_file = env['BUILDERS']['CXXFile'] - except KeyError: - cxx_file = SCons.Builder.Builder(action = {}, - emitter = {}, - suffix = {None:'$CXXFILESUFFIX'}) - env['BUILDERS']['CXXFile'] = cxx_file - env.SetDefault(CXXFILESUFFIX = '.cc') - - return (c_file, cxx_file) - -########################################################################## -# Create common Java builders - -def CreateJarBuilder(env): - try: - java_jar = env['BUILDERS']['Jar'] - except KeyError: - fs = SCons.Node.FS.get_default_fs() - jar_com = SCons.Action.Action('$JARCOM', '$JARCOMSTR') - java_jar = SCons.Builder.Builder(action = jar_com, - suffix = '$JARSUFFIX', - src_suffix = '$JAVACLASSSUFIX', - src_builder = 'JavaClassFile', - source_factory = fs.Entry) - env['BUILDERS']['Jar'] = java_jar - return java_jar - -def CreateJavaHBuilder(env): - try: - java_javah = env['BUILDERS']['JavaH'] - except KeyError: - fs = SCons.Node.FS.get_default_fs() - java_javah_com = SCons.Action.Action('$JAVAHCOM', '$JAVAHCOMSTR') - java_javah = SCons.Builder.Builder(action = java_javah_com, - src_suffix = '$JAVACLASSSUFFIX', - target_factory = fs.Entry, - source_factory = fs.File, - src_builder = 'JavaClassFile') - env['BUILDERS']['JavaH'] = java_javah - return java_javah - -def CreateJavaClassFileBuilder(env): - try: - java_class_file = env['BUILDERS']['JavaClassFile'] - except KeyError: - fs = SCons.Node.FS.get_default_fs() - javac_com = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR') - java_class_file = SCons.Builder.Builder(action = javac_com, - emitter = {}, - #suffix = '$JAVACLASSSUFFIX', - src_suffix = '$JAVASUFFIX', - src_builder = ['JavaFile'], - target_factory = fs.Entry, - source_factory = fs.File) - env['BUILDERS']['JavaClassFile'] = java_class_file - return java_class_file - -def CreateJavaClassDirBuilder(env): - try: - java_class_dir = env['BUILDERS']['JavaClassDir'] - except KeyError: - fs = SCons.Node.FS.get_default_fs() - javac_com = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR') - java_class_dir = SCons.Builder.Builder(action = javac_com, - emitter = {}, - target_factory = fs.Dir, - source_factory = fs.Dir) - env['BUILDERS']['JavaClassDir'] = java_class_dir - return java_class_dir - -def CreateJavaFileBuilder(env): - try: - java_file = env['BUILDERS']['JavaFile'] - except KeyError: - java_file = SCons.Builder.Builder(action = {}, - emitter = {}, - suffix = {None:'$JAVASUFFIX'}) - env['BUILDERS']['JavaFile'] = java_file - env['JAVASUFFIX'] = '.java' - return java_file - -class ToolInitializerMethod: - """ - This is added to a construction environment in place of a - method(s) normally called for a Builder (env.Object, env.StaticObject, - etc.). When called, it has its associated ToolInitializer - object search the specified list of tools and apply the first - one that exists to the construction environment. It then calls - whatever builder was (presumably) added to the construction - environment in place of this particular instance. - """ - def __init__(self, name, initializer): - """ - Note: we store the tool name as __name__ so it can be used by - the class that attaches this to a construction environment. - """ - self.__name__ = name - self.initializer = initializer - - def get_builder(self, env): - """ - Returns the appropriate real Builder for this method name - after having the associated ToolInitializer object apply - the appropriate Tool module. - """ - builder = getattr(env, self.__name__) - - self.initializer.apply_tools(env) - - builder = getattr(env, self.__name__) - if builder is self: - # There was no Builder added, which means no valid Tool - # for this name was found (or possibly there's a mismatch - # between the name we were called by and the Builder name - # added by the Tool module). - return None - - self.initializer.remove_methods(env) - - return builder - - def __call__(self, env, *args, **kw): - """ - """ - builder = self.get_builder(env) - if builder is None: - return [], [] - return apply(builder, args, kw) - -class ToolInitializer: - """ - A class for delayed initialization of Tools modules. - - Instances of this class associate a list of Tool modules with - a list of Builder method names that will be added by those Tool - modules. As part of instantiating this object for a particular - construction environment, we also add the appropriate - ToolInitializerMethod objects for the various Builder methods - that we want to use to delay Tool searches until necessary. - """ - def __init__(self, env, tools, names): - if not SCons.Util.is_List(tools): - tools = [tools] - if not SCons.Util.is_List(names): - names = [names] - self.env = env - self.tools = tools - self.names = names - self.methods = {} - for name in names: - method = ToolInitializerMethod(name, self) - self.methods[name] = method - env.AddMethod(method) - - def remove_methods(self, env): - """ - Removes the methods that were added by the tool initialization - so we no longer copy and re-bind them when the construction - environment gets cloned. - """ - for method in self.methods.values(): - env.RemoveMethod(method) - - def apply_tools(self, env): - """ - Searches the list of associated Tool modules for one that - exists, and applies that to the construction environment. - """ - for t in self.tools: - tool = SCons.Tool.Tool(t) - if tool.exists(env): - env.Tool(tool) - return - - # If we fall through here, there was no tool module found. - # This is where we can put an informative error message - # about the inability to find the tool. We'll start doing - # this as we cut over more pre-defined Builder+Tools to use - # the ToolInitializer class. - -def Initializers(env): - ToolInitializer(env, ['install'], ['_InternalInstall', '_InternalInstallAs']) - def Install(self, *args, **kw): - return apply(self._InternalInstall, args, kw) - def InstallAs(self, *args, **kw): - return apply(self._InternalInstallAs, args, kw) - env.AddMethod(Install) - env.AddMethod(InstallAs) - -def FindTool(tools, env): - for tool in tools: - t = Tool(tool) - if t.exists(env): - return tool - return None - -def FindAllTools(tools, env): - def ToolExists(tool, env=env): - return Tool(tool).exists(env) - return filter (ToolExists, tools) - -def tool_list(platform, env): - - # XXX this logic about what tool to prefer on which platform - # should be moved into either the platform files or - # the tool files themselves. - # The search orders here are described in the man page. If you - # change these search orders, update the man page as well. - if str(platform) == 'win32': - "prefer Microsoft tools on Windows" - linkers = ['mslink', 'gnulink', 'ilink', 'linkloc', 'ilink32' ] - c_compilers = ['msvc', 'mingw', 'gcc', 'intelc', 'icl', 'icc', 'cc', 'bcc32' ] - cxx_compilers = ['msvc', 'intelc', 'icc', 'g++', 'c++', 'bcc32' ] - assemblers = ['masm', 'nasm', 'gas', '386asm' ] - fortran_compilers = ['gfortran', 'g77', 'ifl', 'cvf', 'f95', 'f90', 'fortran'] - ars = ['mslib', 'ar', 'tlib'] - elif str(platform) == 'os2': - "prefer IBM tools on OS/2" - linkers = ['ilink', 'gnulink', 'mslink'] - c_compilers = ['icc', 'gcc', 'msvc', 'cc'] - cxx_compilers = ['icc', 'g++', 'msvc', 'c++'] - assemblers = ['nasm', 'masm', 'gas'] - fortran_compilers = ['ifl', 'g77'] - ars = ['ar', 'mslib'] - elif str(platform) == 'irix': - "prefer MIPSPro on IRIX" - linkers = ['sgilink', 'gnulink'] - c_compilers = ['sgicc', 'gcc', 'cc'] - cxx_compilers = ['sgic++', 'g++', 'c++'] - assemblers = ['as', 'gas'] - fortran_compilers = ['f95', 'f90', 'f77', 'g77', 'fortran'] - ars = ['sgiar'] - elif str(platform) == 'sunos': - "prefer Forte tools on SunOS" - linkers = ['sunlink', 'gnulink'] - c_compilers = ['suncc', 'gcc', 'cc'] - cxx_compilers = ['sunc++', 'g++', 'c++'] - assemblers = ['as', 'gas'] - fortran_compilers = ['sunf95', 'sunf90', 'sunf77', 'f95', 'f90', 'f77', - 'gfortran', 'g77', 'fortran'] - ars = ['sunar'] - elif str(platform) == 'hpux': - "prefer aCC tools on HP-UX" - linkers = ['hplink', 'gnulink'] - c_compilers = ['hpcc', 'gcc', 'cc'] - cxx_compilers = ['hpc++', 'g++', 'c++'] - assemblers = ['as', 'gas'] - fortran_compilers = ['f95', 'f90', 'f77', 'g77', 'fortran'] - ars = ['ar'] - elif str(platform) == 'aix': - "prefer AIX Visual Age tools on AIX" - linkers = ['aixlink', 'gnulink'] - c_compilers = ['aixcc', 'gcc', 'cc'] - cxx_compilers = ['aixc++', 'g++', 'c++'] - assemblers = ['as', 'gas'] - fortran_compilers = ['f95', 'f90', 'aixf77', 'g77', 'fortran'] - ars = ['ar'] - elif str(platform) == 'darwin': - "prefer GNU tools on Mac OS X, except for some linkers and IBM tools" - linkers = ['applelink', 'gnulink'] - c_compilers = ['gcc', 'cc'] - cxx_compilers = ['g++', 'c++'] - assemblers = ['as'] - fortran_compilers = ['gfortran', 'f95', 'f90', 'g77'] - ars = ['ar'] - else: - "prefer GNU tools on all other platforms" - linkers = ['gnulink', 'mslink', 'ilink'] - c_compilers = ['gcc', 'msvc', 'intelc', 'icc', 'cc'] - cxx_compilers = ['g++', 'msvc', 'intelc', 'icc', 'c++'] - assemblers = ['gas', 'nasm', 'masm'] - fortran_compilers = ['gfortran', 'g77', 'ifort', 'ifl', 'f95', 'f90', 'f77'] - ars = ['ar', 'mslib'] - - c_compiler = FindTool(c_compilers, env) or c_compilers[0] - - # XXX this logic about what tool provides what should somehow be - # moved into the tool files themselves. - if c_compiler and c_compiler == 'mingw': - # MinGW contains a linker, C compiler, C++ compiler, - # Fortran compiler, archiver and assembler: - cxx_compiler = None - linker = None - assembler = None - fortran_compiler = None - ar = None - else: - # Don't use g++ if the C compiler has built-in C++ support: - if c_compiler in ('msvc', 'intelc', 'icc'): - cxx_compiler = None - else: - cxx_compiler = FindTool(cxx_compilers, env) or cxx_compilers[0] - linker = FindTool(linkers, env) or linkers[0] - assembler = FindTool(assemblers, env) or assemblers[0] - fortran_compiler = FindTool(fortran_compilers, env) or fortran_compilers[0] - ar = FindTool(ars, env) or ars[0] - - other_tools = FindAllTools(['BitKeeper', 'CVS', - 'dmd', - 'filesystem', - 'dvipdf', 'dvips', 'gs', - 'jar', 'javac', 'javah', - 'latex', 'lex', - 'm4', 'midl', 'msvs', - 'pdflatex', 'pdftex', 'Perforce', - 'RCS', 'rmic', 'rpcgen', - 'SCCS', - # 'Subversion', - 'swig', - 'tar', 'tex', - 'yacc', 'zip', 'rpm', 'wix'], - env) - - tools = ([linker, c_compiler, cxx_compiler, - fortran_compiler, assembler, ar] - + other_tools) - - return filter(lambda x: x, tools) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/aixc++.py b/3rdParty/SCons/scons-local/SCons/Tool/aixc++.py deleted file mode 100644 index e22f736..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/aixc++.py +++ /dev/null @@ -1,82 +0,0 @@ -"""SCons.Tool.aixc++ - -Tool-specific initialization for IBM xlC / Visual Age C++ compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/aixc++.py 4043 2009/02/23 09:06:45 scons" - -import os.path - -import SCons.Platform.aix - -cplusplus = __import__('c++', globals(), locals(), []) - -packages = ['vacpp.cmp.core', 'vacpp.cmp.batch', 'vacpp.cmp.C', 'ibmcxx.cmp'] - -def get_xlc(env): - xlc = env.get('CXX', 'xlC') - xlc_r = env.get('SHCXX', 'xlC_r') - return SCons.Platform.aix.get_xlc(env, xlc, xlc_r, packages) - -def smart_cxxflags(source, target, env, for_signature): - build_dir = env.GetBuildPath() - if build_dir: - return '-qtempinc=' + os.path.join(build_dir, 'tempinc') - return '' - -def generate(env): - """Add Builders and construction variables for xlC / Visual Age - suite to an Environment.""" - path, _cxx, _shcxx, version = get_xlc(env) - if path: - _cxx = os.path.join(path, _cxx) - _shcxx = os.path.join(path, _shcxx) - - cplusplus.generate(env) - - env['CXX'] = _cxx - env['SHCXX'] = _shcxx - env['CXXVERSION'] = version - env['SHOBJSUFFIX'] = '.pic.o' - -def exists(env): - path, _cxx, _shcxx, version = get_xlc(env) - if path and _cxx: - xlc = os.path.join(path, _cxx) - if os.path.exists(xlc): - return xlc - return None - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/aixcc.py b/3rdParty/SCons/scons-local/SCons/Tool/aixcc.py deleted file mode 100644 index dccb926..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/aixcc.py +++ /dev/null @@ -1,74 +0,0 @@ -"""SCons.Tool.aixcc - -Tool-specific initialization for IBM xlc / Visual Age C compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/aixcc.py 4043 2009/02/23 09:06:45 scons" - -import os.path - -import SCons.Platform.aix - -import cc - -packages = ['vac.C', 'ibmcxx.cmp'] - -def get_xlc(env): - xlc = env.get('CC', 'xlc') - xlc_r = env.get('SHCC', 'xlc_r') - return SCons.Platform.aix.get_xlc(env, xlc, xlc_r, packages) - -def generate(env): - """Add Builders and construction variables for xlc / Visual Age - suite to an Environment.""" - path, _cc, _shcc, version = get_xlc(env) - if path: - _cc = os.path.join(path, _cc) - _shcc = os.path.join(path, _shcc) - - cc.generate(env) - - env['CC'] = _cc - env['SHCC'] = _shcc - env['CCVERSION'] = version - -def exists(env): - path, _cc, _shcc, version = get_xlc(env) - if path and _cc: - xlc = os.path.join(path, _cc) - if os.path.exists(xlc): - return xlc - return None - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/aixf77.py b/3rdParty/SCons/scons-local/SCons/Tool/aixf77.py deleted file mode 100644 index 8bb022a..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/aixf77.py +++ /dev/null @@ -1,80 +0,0 @@ -"""engine.SCons.Tool.aixf77 - -Tool-specific initialization for IBM Visual Age f77 Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/aixf77.py 4043 2009/02/23 09:06:45 scons" - -import os.path - -#import SCons.Platform.aix - -import f77 - -# It would be good to look for the AIX F77 package the same way we're now -# looking for the C and C++ packages. This should be as easy as supplying -# the correct package names in the following list and uncommenting the -# SCons.Platform.aix_get_xlc() call the in the function below. -packages = [] - -def get_xlf77(env): - xlf77 = env.get('F77', 'xlf77') - xlf77_r = env.get('SHF77', 'xlf77_r') - #return SCons.Platform.aix.get_xlc(env, xlf77, xlf77_r, packages) - return (None, xlf77, xlf77_r, None) - -def generate(env): - """ - Add Builders and construction variables for the Visual Age FORTRAN - compiler to an Environment. - """ - path, _f77, _shf77, version = get_xlf77(env) - if path: - _f77 = os.path.join(path, _f77) - _shf77 = os.path.join(path, _shf77) - - f77.generate(env) - - env['F77'] = _f77 - env['SHF77'] = _shf77 - -def exists(env): - path, _f77, _shf77, version = get_xlf77(env) - if path and _f77: - xlf77 = os.path.join(path, _f77) - if os.path.exists(xlf77): - return xlf77 - return None - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/aixlink.py b/3rdParty/SCons/scons-local/SCons/Tool/aixlink.py deleted file mode 100644 index 7f96c4a..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/aixlink.py +++ /dev/null @@ -1,76 +0,0 @@ -"""SCons.Tool.aixlink - -Tool-specific initialization for the IBM Visual Age linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/aixlink.py 4043 2009/02/23 09:06:45 scons" - -import os -import os.path - -import SCons.Util - -import aixcc -import link - -cplusplus = __import__('c++', globals(), locals(), []) - -def smart_linkflags(source, target, env, for_signature): - if cplusplus.iscplusplus(source): - build_dir = env.subst('$BUILDDIR', target=target, source=source) - if build_dir: - return '-qtempinc=' + os.path.join(build_dir, 'tempinc') - return '' - -def generate(env): - """ - Add Builders and construction variables for Visual Age linker to - an Environment. - """ - link.generate(env) - - env['SMARTLINKFLAGS'] = smart_linkflags - env['LINKFLAGS'] = SCons.Util.CLVar('$SMARTLINKFLAGS') - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -qmkshrobj -qsuppress=1501-218') - env['SHLIBSUFFIX'] = '.a' - -def exists(env): - path, _cc, _shcc, version = aixcc.get_xlc(env) - if path and _cc: - xlc = os.path.join(path, _cc) - if os.path.exists(xlc): - return xlc - return None - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/applelink.py b/3rdParty/SCons/scons-local/SCons/Tool/applelink.py deleted file mode 100644 index 826b119..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/applelink.py +++ /dev/null @@ -1,71 +0,0 @@ -"""SCons.Tool.applelink - -Tool-specific initialization for the Apple gnu-like linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/applelink.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Util - -# Even though the Mac is based on the GNU toolchain, it doesn't understand -# the -rpath option, so we use the "link" tool instead of "gnulink". -import link - -def generate(env): - """Add Builders and construction variables for applelink to an - Environment.""" - link.generate(env) - - env['FRAMEWORKPATHPREFIX'] = '-F' - env['_FRAMEWORKPATH'] = '${_concat(FRAMEWORKPATHPREFIX, FRAMEWORKPATH, "", __env__)}' - env['_FRAMEWORKS'] = '${_concat("-framework ", FRAMEWORKS, "", __env__)}' - env['LINKCOM'] = env['LINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS' - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -dynamiclib') - env['SHLINKCOM'] = env['SHLINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS' - - # override the default for loadable modules, which are different - # on OS X than dynamic shared libs. echoing what XCode does for - # pre/suffixes: - env['LDMODULEPREFIX'] = '' - env['LDMODULESUFFIX'] = '' - env['LDMODULEFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -bundle') - env['LDMODULECOM'] = '$LDMODULE -o ${TARGET} $LDMODULEFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS' - - - -def exists(env): - return env['PLATFORM'] == 'darwin' - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/ar.py b/3rdParty/SCons/scons-local/SCons/Tool/ar.py deleted file mode 100644 index fbff55c..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/ar.py +++ /dev/null @@ -1,63 +0,0 @@ -"""SCons.Tool.ar - -Tool-specific initialization for ar (library archive). - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/ar.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Defaults -import SCons.Tool -import SCons.Util - - -def generate(env): - """Add Builders and construction variables for ar to an Environment.""" - SCons.Tool.createStaticLibBuilder(env) - - env['AR'] = 'ar' - env['ARFLAGS'] = SCons.Util.CLVar('rc') - env['ARCOM'] = '$AR $ARFLAGS $TARGET $SOURCES' - env['LIBPREFIX'] = 'lib' - env['LIBSUFFIX'] = '.a' - - if env.Detect('ranlib'): - env['RANLIB'] = 'ranlib' - env['RANLIBFLAGS'] = SCons.Util.CLVar('') - env['RANLIBCOM'] = '$RANLIB $RANLIBFLAGS $TARGET' - -def exists(env): - return env.Detect('ar') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/as.py b/3rdParty/SCons/scons-local/SCons/Tool/as.py deleted file mode 100644 index 635df6d..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/as.py +++ /dev/null @@ -1,78 +0,0 @@ -"""SCons.Tool.as - -Tool-specific initialization for as, the generic Posix assembler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/as.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Defaults -import SCons.Tool -import SCons.Util - -assemblers = ['as'] - -ASSuffixes = ['.s', '.asm', '.ASM'] -ASPPSuffixes = ['.spp', '.SPP', '.sx'] -if SCons.Util.case_sensitive_suffixes('.s', '.S'): - ASPPSuffixes.extend(['.S']) -else: - ASSuffixes.extend(['.S']) - -def generate(env): - """Add Builders and construction variables for as to an Environment.""" - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - for suffix in ASSuffixes: - static_obj.add_action(suffix, SCons.Defaults.ASAction) - shared_obj.add_action(suffix, SCons.Defaults.ASAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - for suffix in ASPPSuffixes: - static_obj.add_action(suffix, SCons.Defaults.ASPPAction) - shared_obj.add_action(suffix, SCons.Defaults.ASPPAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - env['AS'] = env.Detect(assemblers) or 'as' - env['ASFLAGS'] = SCons.Util.CLVar('') - env['ASCOM'] = '$AS $ASFLAGS -o $TARGET $SOURCES' - env['ASPPFLAGS'] = '$ASFLAGS' - env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES' - -def exists(env): - return env.Detect(assemblers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/bcc32.py b/3rdParty/SCons/scons-local/SCons/Tool/bcc32.py deleted file mode 100644 index e92b654..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/bcc32.py +++ /dev/null @@ -1,82 +0,0 @@ -"""SCons.Tool.bcc32 - -XXX - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/bcc32.py 4043 2009/02/23 09:06:45 scons" - -import os -import os.path -import string - -import SCons.Defaults -import SCons.Tool -import SCons.Util - -def findIt(program, env): - # First search in the SCons path and then the OS path: - borwin = env.WhereIs(program) or SCons.Util.WhereIs(program) - if borwin: - dir = os.path.dirname(borwin) - env.PrependENVPath('PATH', dir) - return borwin - -def generate(env): - findIt('bcc32', env) - """Add Builders and construction variables for bcc to an - Environment.""" - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - for suffix in ['.c', '.cpp']: - static_obj.add_action(suffix, SCons.Defaults.CAction) - shared_obj.add_action(suffix, SCons.Defaults.ShCAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - env['CC'] = 'bcc32' - env['CCFLAGS'] = SCons.Util.CLVar('') - env['CFLAGS'] = SCons.Util.CLVar('') - env['CCCOM'] = '$CC -q $CFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o$TARGET $SOURCES' - env['SHCC'] = '$CC' - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') - env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS') - env['SHCCCOM'] = '$SHCC -WD $SHCFLAGS $SHCCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o$TARGET $SOURCES' - env['CPPDEFPREFIX'] = '-D' - env['CPPDEFSUFFIX'] = '' - env['INCPREFIX'] = '-I' - env['INCSUFFIX'] = '' - env['SHOBJSUFFIX'] = '.dll' - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0 - env['CFILESUFFIX'] = '.cpp' - -def exists(env): - return findIt('bcc32', env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/c++.py b/3rdParty/SCons/scons-local/SCons/Tool/c++.py deleted file mode 100644 index fabcbd7..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/c++.py +++ /dev/null @@ -1,99 +0,0 @@ -"""SCons.Tool.c++ - -Tool-specific initialization for generic Posix C++ compilers. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/c++.py 4043 2009/02/23 09:06:45 scons" - -import os.path - -import SCons.Tool -import SCons.Defaults -import SCons.Util - -compilers = ['CC', 'c++'] - -CXXSuffixes = ['.cpp', '.cc', '.cxx', '.c++', '.C++', '.mm'] -if SCons.Util.case_sensitive_suffixes('.c', '.C'): - CXXSuffixes.append('.C') - -def iscplusplus(source): - if not source: - # Source might be None for unusual cases like SConf. - return 0 - for s in source: - if s.sources: - ext = os.path.splitext(str(s.sources[0]))[1] - if ext in CXXSuffixes: - return 1 - return 0 - -def generate(env): - """ - Add Builders and construction variables for Visual Age C++ compilers - to an Environment. - """ - import SCons.Tool - import SCons.Tool.cc - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - for suffix in CXXSuffixes: - static_obj.add_action(suffix, SCons.Defaults.CXXAction) - shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - SCons.Tool.cc.add_common_cc_variables(env) - - env['CXX'] = 'c++' - env['CXXFLAGS'] = SCons.Util.CLVar('') - env['CXXCOM'] = '$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM $SOURCES' - env['SHCXX'] = '$CXX' - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') - env['SHCXXCOM'] = '$SHCXX -o $TARGET -c $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES' - - env['CPPDEFPREFIX'] = '-D' - env['CPPDEFSUFFIX'] = '' - env['INCPREFIX'] = '-I' - env['INCSUFFIX'] = '' - env['SHOBJSUFFIX'] = '.os' - env['OBJSUFFIX'] = '.o' - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0 - - env['CXXFILESUFFIX'] = '.cc' - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/cc.py b/3rdParty/SCons/scons-local/SCons/Tool/cc.py deleted file mode 100644 index 82d4565..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/cc.py +++ /dev/null @@ -1,114 +0,0 @@ -"""SCons.Tool.cc - -Tool-specific initialization for generic Posix C compilers. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/cc.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Tool -import SCons.Defaults -import SCons.Util - -CSuffixes = ['.c', '.m'] -if not SCons.Util.case_sensitive_suffixes('.c', '.C'): - CSuffixes.append('.C') - -def add_common_cc_variables(env): - """ - Add underlying common "C compiler" variables that - are used by multiple tools (specifically, c++). - """ - if not env.has_key('_CCCOMCOM'): - env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS' - # It's a hack to test for darwin here, but the alternative - # of creating an applecc.py to contain this seems overkill. - # Maybe someday the Apple platform will require more setup and - # this logic will be moved. - env['FRAMEWORKS'] = SCons.Util.CLVar('') - env['FRAMEWORKPATH'] = SCons.Util.CLVar('') - if env['PLATFORM'] == 'darwin': - env['_CCCOMCOM'] = env['_CCCOMCOM'] + ' $_FRAMEWORKPATH' - - if not env.has_key('CCFLAGS'): - env['CCFLAGS'] = SCons.Util.CLVar('') - - if not env.has_key('SHCCFLAGS'): - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') - -def generate(env): - """ - Add Builders and construction variables for C compilers to an Environment. - """ - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - for suffix in CSuffixes: - static_obj.add_action(suffix, SCons.Defaults.CAction) - shared_obj.add_action(suffix, SCons.Defaults.ShCAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) -#<<<<<<< .working -# -# env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS' -# # It's a hack to test for darwin here, but the alternative of creating -# # an applecc.py to contain this seems overkill. Maybe someday the Apple -# # platform will require more setup and this logic will be moved. -# env['FRAMEWORKS'] = SCons.Util.CLVar('') -# env['FRAMEWORKPATH'] = SCons.Util.CLVar('') -# if env['PLATFORM'] == 'darwin': -# env['_CCCOMCOM'] = env['_CCCOMCOM'] + ' $_FRAMEWORKPATH' -#======= -#>>>>>>> .merge-right.r1907 - - add_common_cc_variables(env) - - env['CC'] = 'cc' - env['CFLAGS'] = SCons.Util.CLVar('') - env['CCCOM'] = '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES' - env['SHCC'] = '$CC' - env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS') - env['SHCCCOM'] = '$SHCC -o $TARGET -c $SHCFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES' - - env['CPPDEFPREFIX'] = '-D' - env['CPPDEFSUFFIX'] = '' - env['INCPREFIX'] = '-I' - env['INCSUFFIX'] = '' - env['SHOBJSUFFIX'] = '.os' - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0 - - env['CFILESUFFIX'] = '.c' - -def exists(env): - return env.Detect('cc') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/cvf.py b/3rdParty/SCons/scons-local/SCons/Tool/cvf.py deleted file mode 100644 index e743654..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/cvf.py +++ /dev/null @@ -1,58 +0,0 @@ -"""engine.SCons.Tool.cvf - -Tool-specific initialization for the Compaq Visual Fortran compiler. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/cvf.py 4043 2009/02/23 09:06:45 scons" - -import fortran - -compilers = ['f90'] - -def generate(env): - """Add Builders and construction variables for compaq visual fortran to an Environment.""" - - fortran.generate(env) - - env['FORTRAN'] = 'f90' - env['FORTRANCOM'] = '$FORTRAN $FORTRANFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}' - env['FORTRANPPCOM'] = '$FORTRAN $FORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}' - env['SHFORTRANCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}' - env['SHFORTRANPPCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}' - env['OBJSUFFIX'] = '.obj' - env['FORTRANMODDIR'] = '${TARGET.dir}' - env['FORTRANMODDIRPREFIX'] = '/module:' - env['FORTRANMODDIRSUFFIX'] = '' - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/default.py b/3rdParty/SCons/scons-local/SCons/Tool/default.py deleted file mode 100644 index a7df8aa..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/default.py +++ /dev/null @@ -1,50 +0,0 @@ -"""SCons.Tool.default - -Initialization with a default tool list. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/default.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Tool - -def generate(env): - """Add default tools.""" - for t in SCons.Tool.tool_list(env['PLATFORM'], env): - SCons.Tool.Tool(t)(env) - -def exists(env): - return 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/dmd.py b/3rdParty/SCons/scons-local/SCons/Tool/dmd.py deleted file mode 100644 index 1e67822..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/dmd.py +++ /dev/null @@ -1,224 +0,0 @@ -"""SCons.Tool.dmd - -Tool-specific initialization for the Digital Mars D compiler. -(http://digitalmars.com/d) - -Coded by Andy Friesen (andy@ikagames.com) -15 November 2003 - -There are a number of problems with this script at this point in time. -The one that irritates me the most is the Windows linker setup. The D -linker doesn't have a way to add lib paths on the commandline, as far -as I can see. You have to specify paths relative to the SConscript or -use absolute paths. To hack around it, add '#/blah'. This will link -blah.lib from the directory where SConstruct resides. - -Compiler variables: - DC - The name of the D compiler to use. Defaults to dmd or gdmd, - whichever is found. - DPATH - List of paths to search for import modules. - DVERSIONS - List of version tags to enable when compiling. - DDEBUG - List of debug tags to enable when compiling. - -Linker related variables: - LIBS - List of library files to link in. - DLINK - Name of the linker to use. Defaults to dmd or gdmd. - DLINKFLAGS - List of linker flags. - -Lib tool variables: - DLIB - Name of the lib tool to use. Defaults to lib. - DLIBFLAGS - List of flags to pass to the lib tool. - LIBS - Same as for the linker. (libraries to pull into the .lib) -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/dmd.py 4043 2009/02/23 09:06:45 scons" - -import os -import string - -import SCons.Action -import SCons.Builder -import SCons.Defaults -import SCons.Scanner.D -import SCons.Tool - -# Adapted from c++.py -def isD(source): - if not source: - return 0 - - for s in source: - if s.sources: - ext = os.path.splitext(str(s.sources[0]))[1] - if ext == '.d': - return 1 - return 0 - -smart_link = {} - -smart_lib = {} - -def generate(env): - global smart_link - global smart_lib - - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - DAction = SCons.Action.Action('$DCOM', '$DCOMSTR') - - static_obj.add_action('.d', DAction) - shared_obj.add_action('.d', DAction) - static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter) - - dc = env.Detect(['dmd', 'gdmd']) - env['DC'] = dc - env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of$TARGET $SOURCES' - env['_DINCFLAGS'] = '$( ${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' - env['_DVERFLAGS'] = '$( ${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)} $)' - env['_DDEBUGFLAGS'] = '$( ${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)} $)' - env['_DFLAGS'] = '$( ${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)} $)' - - env['DPATH'] = ['#/'] - env['DFLAGS'] = [] - env['DVERSIONS'] = [] - env['DDEBUG'] = [] - - if dc: - # Add the path to the standard library. - # This is merely for the convenience of the dependency scanner. - dmd_path = env.WhereIs(dc) - if dmd_path: - x = string.rindex(dmd_path, dc) - phobosDir = dmd_path[:x] + '/../src/phobos' - if os.path.isdir(phobosDir): - env.Append(DPATH = [phobosDir]) - - env['DINCPREFIX'] = '-I' - env['DINCSUFFIX'] = '' - env['DVERPREFIX'] = '-version=' - env['DVERSUFFIX'] = '' - env['DDEBUGPREFIX'] = '-debug=' - env['DDEBUGSUFFIX'] = '' - env['DFLAGPREFIX'] = '-' - env['DFLAGSUFFIX'] = '' - env['DFILESUFFIX'] = '.d' - - # Need to use the Digital Mars linker/lib on windows. - # *nix can just use GNU link. - if env['PLATFORM'] == 'win32': - env['DLINK'] = '$DC' - env['DLINKCOM'] = '$DLINK -of$TARGET $SOURCES $DFLAGS $DLINKFLAGS $_DLINKLIBFLAGS' - env['DLIB'] = 'lib' - env['DLIBCOM'] = '$DLIB $_DLIBFLAGS -c $TARGET $SOURCES $_DLINKLIBFLAGS' - - env['_DLINKLIBFLAGS'] = '$( ${_concat(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' - env['_DLIBFLAGS'] = '$( ${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)} $)' - env['DLINKFLAGS'] = [] - env['DLIBLINKPREFIX'] = '' - env['DLIBLINKSUFFIX'] = '.lib' - env['DLIBFLAGPREFIX'] = '-' - env['DLIBFLAGSUFFIX'] = '' - env['DLINKFLAGPREFIX'] = '-' - env['DLINKFLAGSUFFIX'] = '' - - SCons.Tool.createStaticLibBuilder(env) - - # Basically, we hijack the link and ar builders with our own. - # these builders check for the presence of D source, and swap out - # the system's defaults for the Digital Mars tools. If there's no D - # source, then we silently return the previous settings. - linkcom = env.get('LINKCOM') - try: - env['SMART_LINKCOM'] = smart_link[linkcom] - except KeyError: - def _smartLink(source, target, env, for_signature, - defaultLinker=linkcom): - if isD(source): - # XXX I'm not sure how to add a $DLINKCOMSTR variable - # so that it works with this _smartLink() logic, - # and I don't have a D compiler/linker to try it out, - # so we'll leave it alone for now. - return '$DLINKCOM' - else: - return defaultLinker - env['SMART_LINKCOM'] = smart_link[linkcom] = _smartLink - - arcom = env.get('ARCOM') - try: - env['SMART_ARCOM'] = smart_lib[arcom] - except KeyError: - def _smartLib(source, target, env, for_signature, - defaultLib=arcom): - if isD(source): - # XXX I'm not sure how to add a $DLIBCOMSTR variable - # so that it works with this _smartLib() logic, and - # I don't have a D compiler/archiver to try it out, - # so we'll leave it alone for now. - return '$DLIBCOM' - else: - return defaultLib - env['SMART_ARCOM'] = smart_lib[arcom] = _smartLib - - # It is worth noting that the final space in these strings is - # absolutely pivotal. SCons sees these as actions and not generators - # if it is not there. (very bad) - env['ARCOM'] = '$SMART_ARCOM ' - env['LINKCOM'] = '$SMART_LINKCOM ' - else: # assuming linux - linkcom = env.get('LINKCOM') - try: - env['SMART_LINKCOM'] = smart_link[linkcom] - except KeyError: - def _smartLink(source, target, env, for_signature, - defaultLinker=linkcom, dc=dc): - if isD(source): - try: - libs = env['LIBS'] - except KeyError: - libs = [] - if 'phobos' not in libs: - if dc is 'dmd': - env.Append(LIBS = ['phobos']) - elif dc is 'gdmd': - env.Append(LIBS = ['gphobos']) - if 'pthread' not in libs: - env.Append(LIBS = ['pthread']) - if 'm' not in libs: - env.Append(LIBS = ['m']) - return defaultLinker - env['SMART_LINKCOM'] = smart_link[linkcom] = _smartLink - - env['LINKCOM'] = '$SMART_LINKCOM ' - -def exists(env): - return env.Detect(['dmd', 'gdmd']) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/dvi.py b/3rdParty/SCons/scons-local/SCons/Tool/dvi.py deleted file mode 100644 index 8d67697..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/dvi.py +++ /dev/null @@ -1,64 +0,0 @@ -"""SCons.Tool.dvi - -Common DVI Builder definition for various other Tool modules that use it. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/dvi.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Builder -import SCons.Tool - -DVIBuilder = None - -def generate(env): - try: - env['BUILDERS']['DVI'] - except KeyError: - global DVIBuilder - - if DVIBuilder is None: - # The suffix is hard-coded to '.dvi', not configurable via a - # construction variable like $DVISUFFIX, because the output - # file name is hard-coded within TeX. - DVIBuilder = SCons.Builder.Builder(action = {}, - source_scanner = SCons.Tool.LaTeXScanner, - suffix = '.dvi', - emitter = {}, - source_ext_match = None) - - env['BUILDERS']['DVI'] = DVIBuilder - -def exists(env): - # This only puts a skeleton Builder in place, so if someone - # references this Tool directly, it's always "available." - return 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/dvipdf.py b/3rdParty/SCons/scons-local/SCons/Tool/dvipdf.py deleted file mode 100644 index 1fbf4b3..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/dvipdf.py +++ /dev/null @@ -1,125 +0,0 @@ -"""SCons.Tool.dvipdf - -Tool-specific initialization for dvipdf. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/dvipdf.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Action -import SCons.Defaults -import SCons.Tool.pdf -import SCons.Tool.tex -import SCons.Util - -_null = SCons.Scanner.LaTeX._null - -def DviPdfPsFunction(XXXDviAction, target = None, source= None, env=None): - """A builder for DVI files that sets the TEXPICTS environment - variable before running dvi2ps or dvipdf.""" - - try: - abspath = source[0].attributes.path - except AttributeError : - abspath = '' - - saved_env = SCons.Scanner.LaTeX.modify_env_var(env, 'TEXPICTS', abspath) - - result = XXXDviAction(target, source, env) - - if saved_env is _null: - try: - del env['ENV']['TEXPICTS'] - except KeyError: - pass # was never set - else: - env['ENV']['TEXPICTS'] = saved_env - - return result - -def DviPdfFunction(target = None, source= None, env=None): - result = DviPdfPsFunction(PDFAction,target,source,env) - return result - -def DviPdfStrFunction(target = None, source= None, env=None): - """A strfunction for dvipdf that returns the appropriate - command string for the no_exec options.""" - if env.GetOption("no_exec"): - result = env.subst('$DVIPDFCOM',0,target,source) - else: - result = '' - return result - -PDFAction = None -DVIPDFAction = None - -def PDFEmitter(target, source, env): - """Strips any .aux or .log files from the input source list. - These are created by the TeX Builder that in all likelihood was - used to generate the .dvi file we're using as input, and we only - care about the .dvi file. - """ - def strip_suffixes(n): - return not SCons.Util.splitext(str(n))[1] in ['.aux', '.log'] - source = filter(strip_suffixes, source) - return (target, source) - -def generate(env): - """Add Builders and construction variables for dvipdf to an Environment.""" - global PDFAction - if PDFAction is None: - PDFAction = SCons.Action.Action('$DVIPDFCOM', '$DVIPDFCOMSTR') - - global DVIPDFAction - if DVIPDFAction is None: - DVIPDFAction = SCons.Action.Action(DviPdfFunction, strfunction = DviPdfStrFunction) - - import pdf - pdf.generate(env) - - bld = env['BUILDERS']['PDF'] - bld.add_action('.dvi', DVIPDFAction) - bld.add_emitter('.dvi', PDFEmitter) - - env['DVIPDF'] = 'dvipdf' - env['DVIPDFFLAGS'] = SCons.Util.CLVar('') - env['DVIPDFCOM'] = 'cd ${TARGET.dir} && $DVIPDF $DVIPDFFLAGS ${SOURCE.file} ${TARGET.file}' - - # Deprecated synonym. - env['PDFCOM'] = ['$DVIPDFCOM'] - -def exists(env): - return env.Detect('dvipdf') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/dvips.py b/3rdParty/SCons/scons-local/SCons/Tool/dvips.py deleted file mode 100644 index 7242622..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/dvips.py +++ /dev/null @@ -1,94 +0,0 @@ -"""SCons.Tool.dvips - -Tool-specific initialization for dvips. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/dvips.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Action -import SCons.Builder -import SCons.Tool.dvipdf -import SCons.Util - -def DviPsFunction(target = None, source= None, env=None): - result = SCons.Tool.dvipdf.DviPdfPsFunction(PSAction,target,source,env) - return result - -def DviPsStrFunction(target = None, source= None, env=None): - """A strfunction for dvipdf that returns the appropriate - command string for the no_exec options.""" - if env.GetOption("no_exec"): - result = env.subst('$PSCOM',0,target,source) - else: - result = '' - return result - -PSAction = None -DVIPSAction = None -PSBuilder = None - -def generate(env): - """Add Builders and construction variables for dvips to an Environment.""" - global PSAction - if PSAction is None: - PSAction = SCons.Action.Action('$PSCOM', '$PSCOMSTR') - - global DVIPSAction - if DVIPSAction is None: - DVIPSAction = SCons.Action.Action(DviPsFunction, strfunction = DviPsStrFunction) - - global PSBuilder - if PSBuilder is None: - PSBuilder = SCons.Builder.Builder(action = PSAction, - prefix = '$PSPREFIX', - suffix = '$PSSUFFIX', - src_suffix = '.dvi', - src_builder = 'DVI', - single_source=True) - - env['BUILDERS']['PostScript'] = PSBuilder - - env['DVIPS'] = 'dvips' - env['DVIPSFLAGS'] = SCons.Util.CLVar('') - # I'm not quite sure I got the directories and filenames right for variant_dir - # We need to be in the correct directory for the sake of latex \includegraphics eps included files. - env['PSCOM'] = 'cd ${TARGET.dir} && $DVIPS $DVIPSFLAGS -o ${TARGET.file} ${SOURCE.file}' - env['PSPREFIX'] = '' - env['PSSUFFIX'] = '.ps' - -def exists(env): - return env.Detect('dvips') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/f77.py b/3rdParty/SCons/scons-local/SCons/Tool/f77.py deleted file mode 100644 index e9299bc..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/f77.py +++ /dev/null @@ -1,62 +0,0 @@ -"""engine.SCons.Tool.f77 - -Tool-specific initialization for the generic Posix f77 Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/f77.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Defaults -import SCons.Scanner.Fortran -import SCons.Tool -import SCons.Util -from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env - -compilers = ['f77'] - -def generate(env): - add_all_to_env(env) - add_f77_to_env(env) - - fcomp = env.Detect(compilers) or 'f77' - env['F77'] = fcomp - env['SHF77'] = fcomp - - env['FORTRAN'] = fcomp - env['SHFORTRAN'] = fcomp - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/f90.py b/3rdParty/SCons/scons-local/SCons/Tool/f90.py deleted file mode 100644 index 58ccc6b..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/f90.py +++ /dev/null @@ -1,62 +0,0 @@ -"""engine.SCons.Tool.f90 - -Tool-specific initialization for the generic Posix f90 Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/f90.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Defaults -import SCons.Scanner.Fortran -import SCons.Tool -import SCons.Util -from SCons.Tool.FortranCommon import add_all_to_env, add_f90_to_env - -compilers = ['f90'] - -def generate(env): - add_all_to_env(env) - add_f90_to_env(env) - - fc = env.Detect(compilers) or 'f90' - env['F90'] = fc - env['SHF90'] = fc - - env['FORTRAN'] = fc - env['SHFORTRAN'] = fc - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/f95.py b/3rdParty/SCons/scons-local/SCons/Tool/f95.py deleted file mode 100644 index 1097212..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/f95.py +++ /dev/null @@ -1,63 +0,0 @@ -"""engine.SCons.Tool.f95 - -Tool-specific initialization for the generic Posix f95 Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/f95.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Defaults -import SCons.Tool -import SCons.Util -import fortran -from SCons.Tool.FortranCommon import add_all_to_env, add_f95_to_env - -compilers = ['f95'] - -def generate(env): - add_all_to_env(env) - add_f95_to_env(env) - - fcomp = env.Detect(compilers) or 'f95' - env['F95'] = fcomp - env['SHF95'] = fcomp - - env['FORTRAN'] = fcomp - env['SHFORTRAN'] = fcomp - - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/filesystem.py b/3rdParty/SCons/scons-local/SCons/Tool/filesystem.py deleted file mode 100644 index 0c34337..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/filesystem.py +++ /dev/null @@ -1,98 +0,0 @@ -"""SCons.Tool.filesystem - -Tool-specific initialization for the filesystem tools. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/filesystem.py 4043 2009/02/23 09:06:45 scons" - -import SCons -from SCons.Tool.install import copyFunc - -copyToBuilder, copyAsBuilder = None, None - -def copyto_emitter(target, source, env): - """ changes the path of the source to be under the target (which - are assumed to be directories. - """ - n_target = [] - - for t in target: - n_target = n_target + map( lambda s, t=t: t.File( str( s ) ), source ) - - return (n_target, source) - -def copy_action_func(target, source, env): - assert( len(target) == len(source) ), "\ntarget: %s\nsource: %s" %(map(str, target),map(str, source)) - - for t, s in zip(target, source): - if copyFunc(t.get_path(), s.get_path(), env): - return 1 - - return 0 - -def copy_action_str(target, source, env): - return env.subst_target_source(env['COPYSTR'], 0, target, source) - -copy_action = SCons.Action.Action( copy_action_func, copy_action_str ) - -def generate(env): - try: - env['BUILDERS']['CopyTo'] - env['BUILDERS']['CopyAs'] - except KeyError, e: - global copyToBuilder - if copyToBuilder is None: - copyToBuilder = SCons.Builder.Builder( - action = copy_action, - target_factory = env.fs.Dir, - source_factory = env.fs.Entry, - multi = 1, - emitter = [ copyto_emitter, ] ) - - global copyAsBuilder - if copyAsBuilder is None: - copyAsBuilder = SCons.Builder.Builder( - action = copy_action, - target_factory = env.fs.Entry, - source_factory = env.fs.Entry ) - - env['BUILDERS']['CopyTo'] = copyToBuilder - env['BUILDERS']['CopyAs'] = copyAsBuilder - - env['COPYSTR'] = 'Copy file(s): "$SOURCES" to "$TARGETS"' - -def exists(env): - return 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/fortran.py b/3rdParty/SCons/scons-local/SCons/Tool/fortran.py deleted file mode 100644 index 83dc43a..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/fortran.py +++ /dev/null @@ -1,63 +0,0 @@ -"""SCons.Tool.fortran - -Tool-specific initialization for a generic Posix f77/f90 Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/fortran.py 4043 2009/02/23 09:06:45 scons" - -import re -import string - -import SCons.Action -import SCons.Defaults -import SCons.Scanner.Fortran -import SCons.Tool -import SCons.Util -from SCons.Tool.FortranCommon import add_all_to_env, add_fortran_to_env - -compilers = ['f95', 'f90', 'f77'] - -def generate(env): - add_all_to_env(env) - add_fortran_to_env(env) - - fc = env.Detect(compilers) or 'f77' - env['SHFORTRAN'] = fc - env['FORTRAN'] = fc - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/g++.py b/3rdParty/SCons/scons-local/SCons/Tool/g++.py deleted file mode 100644 index d21643b..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/g++.py +++ /dev/null @@ -1,90 +0,0 @@ -"""SCons.Tool.g++ - -Tool-specific initialization for g++. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/g++.py 4043 2009/02/23 09:06:45 scons" - -import os.path -import re -import subprocess - -import SCons.Tool -import SCons.Util - -cplusplus = __import__('c++', globals(), locals(), []) - -compilers = ['g++'] - -def generate(env): - """Add Builders and construction variables for g++ to an Environment.""" - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - cplusplus.generate(env) - - env['CXX'] = env.Detect(compilers) - - # platform specific settings - if env['PLATFORM'] == 'aix': - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS -mminimal-toc') - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 - env['SHOBJSUFFIX'] = '$OBJSUFFIX' - elif env['PLATFORM'] == 'hpux': - env['SHOBJSUFFIX'] = '.pic.o' - elif env['PLATFORM'] == 'sunos': - env['SHOBJSUFFIX'] = '.pic.o' - # determine compiler version - if env['CXX']: - #pipe = SCons.Action._subproc(env, [env['CXX'], '-dumpversion'], - pipe = SCons.Action._subproc(env, [env['CXX'], '--version'], - stdin = 'devnull', - stderr = 'devnull', - stdout = subprocess.PIPE) - if pipe.wait() != 0: return - # -dumpversion was added in GCC 3.0. As long as we're supporting - # GCC versions older than that, we should use --version and a - # regular expression. - #line = pipe.stdout.read().strip() - #if line: - # env['CXXVERSION'] = line - line = pipe.stdout.readline() - match = re.search(r'[0-9]+(\.[0-9]+)+', line) - if match: - env['CXXVERSION'] = match.group(0) - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/g77.py b/3rdParty/SCons/scons-local/SCons/Tool/g77.py deleted file mode 100644 index 84b0ed9..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/g77.py +++ /dev/null @@ -1,73 +0,0 @@ -"""engine.SCons.Tool.g77 - -Tool-specific initialization for g77. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/g77.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Util -from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env - -compilers = ['g77', 'f77'] - -def generate(env): - """Add Builders and construction variables for g77 to an Environment.""" - add_all_to_env(env) - add_f77_to_env(env) - - fcomp = env.Detect(compilers) or 'g77' - if env['PLATFORM'] in ['cygwin', 'win32']: - env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS') - env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS') - else: - env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -fPIC') - env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS -fPIC') - - env['FORTRAN'] = fcomp - env['SHFORTRAN'] = '$FORTRAN' - - env['F77'] = fcomp - env['SHF77'] = '$F77' - - env['INCFORTRANPREFIX'] = "-I" - env['INCFORTRANSUFFIX'] = "" - - env['INCF77PREFIX'] = "-I" - env['INCF77SUFFIX'] = "" - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/gas.py b/3rdParty/SCons/scons-local/SCons/Tool/gas.py deleted file mode 100644 index 997690f..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/gas.py +++ /dev/null @@ -1,53 +0,0 @@ -"""SCons.Tool.gas - -Tool-specific initialization for as, the Gnu assembler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/gas.py 4043 2009/02/23 09:06:45 scons" - -as_module = __import__('as', globals(), locals(), []) - -assemblers = ['as', 'gas'] - -def generate(env): - """Add Builders and construction variables for as to an Environment.""" - as_module.generate(env) - - env['AS'] = env.Detect(assemblers) or 'as' - -def exists(env): - return env.Detect(assemblers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/gcc.py b/3rdParty/SCons/scons-local/SCons/Tool/gcc.py deleted file mode 100644 index 90dd4d0..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/gcc.py +++ /dev/null @@ -1,80 +0,0 @@ -"""SCons.Tool.gcc - -Tool-specific initialization for gcc. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/gcc.py 4043 2009/02/23 09:06:45 scons" - -import cc -import os -import re -import subprocess - -import SCons.Util - -compilers = ['gcc', 'cc'] - -def generate(env): - """Add Builders and construction variables for gcc to an Environment.""" - cc.generate(env) - - env['CC'] = env.Detect(compilers) or 'gcc' - if env['PLATFORM'] in ['cygwin', 'win32']: - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') - else: - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS -fPIC') - # determine compiler version - if env['CC']: - #pipe = SCons.Action._subproc(env, [env['CC'], '-dumpversion'], - pipe = SCons.Action._subproc(env, [env['CC'], '--version'], - stdin = 'devnull', - stderr = 'devnull', - stdout = subprocess.PIPE) - if pipe.wait() != 0: return - # -dumpversion was added in GCC 3.0. As long as we're supporting - # GCC versions older than that, we should use --version and a - # regular expression. - #line = pipe.stdout.read().strip() - #if line: - # env['CCVERSION'] = line - line = pipe.stdout.readline() - match = re.search(r'[0-9]+(\.[0-9]+)+', line) - if match: - env['CCVERSION'] = match.group(0) - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/gfortran.py b/3rdParty/SCons/scons-local/SCons/Tool/gfortran.py deleted file mode 100644 index 0a67b4c..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/gfortran.py +++ /dev/null @@ -1,64 +0,0 @@ -"""SCons.Tool.gfortran - -Tool-specific initialization for gfortran, the GNU Fortran 95/Fortran -2003 compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/gfortran.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Util - -import fortran - -def generate(env): - """Add Builders and construction variables for gfortran to an - Environment.""" - fortran.generate(env) - - for dialect in ['F77', 'F90', 'FORTRAN', 'F95']: - env['%s' % dialect] = 'gfortran' - env['SH%s' % dialect] = '$%s' % dialect - if env['PLATFORM'] in ['cygwin', 'win32']: - env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS' % dialect) - else: - env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS -fPIC' % dialect) - - env['INC%sPREFIX' % dialect] = "-I" - env['INC%sSUFFIX' % dialect] = "" - -def exists(env): - return env.Detect('gfortran') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/gnulink.py b/3rdParty/SCons/scons-local/SCons/Tool/gnulink.py deleted file mode 100644 index ca9672e..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/gnulink.py +++ /dev/null @@ -1,63 +0,0 @@ -"""SCons.Tool.gnulink - -Tool-specific initialization for the gnu linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/gnulink.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Util - -import link - -linkers = ['g++', 'gcc'] - -def generate(env): - """Add Builders and construction variables for gnulink to an Environment.""" - link.generate(env) - - if env['PLATFORM'] == 'hpux': - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared -fPIC') - - # __RPATH is set to $_RPATH in the platform specification if that - # platform supports it. - env.Append(LINKFLAGS=['$__RPATH']) - env['RPATHPREFIX'] = '-Wl,-rpath=' - env['RPATHSUFFIX'] = '' - env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}' - -def exists(env): - return env.Detect(linkers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/gs.py b/3rdParty/SCons/scons-local/SCons/Tool/gs.py deleted file mode 100644 index 28b14f3..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/gs.py +++ /dev/null @@ -1,81 +0,0 @@ -"""SCons.Tool.gs - -Tool-specific initialization for Ghostscript. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/gs.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Action -import SCons.Platform -import SCons.Util - -# Ghostscript goes by different names on different platforms... -platform = SCons.Platform.platform_default() - -if platform == 'os2': - gs = 'gsos2' -elif platform == 'win32': - gs = 'gswin32c' -else: - gs = 'gs' - -GhostscriptAction = None - -def generate(env): - """Add Builders and construction variables for Ghostscript to an - Environment.""" - - global GhostscriptAction - if GhostscriptAction is None: - GhostscriptAction = SCons.Action.Action('$GSCOM', '$GSCOMSTR') - - import pdf - pdf.generate(env) - - bld = env['BUILDERS']['PDF'] - bld.add_action('.ps', GhostscriptAction) - - env['GS'] = gs - env['GSFLAGS'] = SCons.Util.CLVar('-dNOPAUSE -dBATCH -sDEVICE=pdfwrite') - env['GSCOM'] = '$GS $GSFLAGS -sOutputFile=$TARGET $SOURCES' - - -def exists(env): - if env.has_key('PS2PDF'): - return env.Detect(env['PS2PDF']) - else: - return env.Detect(gs) or SCons.Util.WhereIs(gs) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/hpc++.py b/3rdParty/SCons/scons-local/SCons/Tool/hpc++.py deleted file mode 100644 index 0754611..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/hpc++.py +++ /dev/null @@ -1,85 +0,0 @@ -"""SCons.Tool.hpc++ - -Tool-specific initialization for c++ on HP/UX. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/hpc++.py 4043 2009/02/23 09:06:45 scons" - -import os.path -import string - -import SCons.Util - -cplusplus = __import__('c++', globals(), locals(), []) - -acc = None - -# search for the acc compiler and linker front end - -try: - dirs = os.listdir('/opt') -except (IOError, OSError): - # Not being able to read the directory because it doesn't exist - # (IOError) or isn't readable (OSError) is okay. - dirs = [] - -for dir in dirs: - cc = '/opt/' + dir + '/bin/aCC' - if os.path.exists(cc): - acc = cc - break - - -def generate(env): - """Add Builders and construction variables for g++ to an Environment.""" - cplusplus.generate(env) - - if acc: - env['CXX'] = acc or 'aCC' - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z') - # determine version of aCC - line = os.popen(acc + ' -V 2>&1').readline().rstrip() - if string.find(line, 'aCC: HP ANSI C++') == 0: - env['CXXVERSION'] = string.split(line)[-1] - - if env['PLATFORM'] == 'cygwin': - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') - else: - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z') - -def exists(env): - return acc - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/hpcc.py b/3rdParty/SCons/scons-local/SCons/Tool/hpcc.py deleted file mode 100644 index 2762015..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/hpcc.py +++ /dev/null @@ -1,53 +0,0 @@ -"""SCons.Tool.hpcc - -Tool-specific initialization for HP aCC and cc. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/hpcc.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Util - -import cc - -def generate(env): - """Add Builders and construction variables for aCC & cc to an Environment.""" - cc.generate(env) - - env['CXX'] = 'aCC' - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS +Z') - -def exists(env): - return env.Detect('aCC') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/hplink.py b/3rdParty/SCons/scons-local/SCons/Tool/hplink.py deleted file mode 100644 index f47a436..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/hplink.py +++ /dev/null @@ -1,77 +0,0 @@ -"""SCons.Tool.hplink - -Tool-specific initialization for the HP linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/hplink.py 4043 2009/02/23 09:06:45 scons" - -import os -import os.path - -import SCons.Util - -import link - -ccLinker = None - -# search for the acc compiler and linker front end - -try: - dirs = os.listdir('/opt') -except (IOError, OSError): - # Not being able to read the directory because it doesn't exist - # (IOError) or isn't readable (OSError) is okay. - dirs = [] - -for dir in dirs: - linker = '/opt/' + dir + '/bin/aCC' - if os.path.exists(linker): - ccLinker = linker - break - -def generate(env): - """ - Add Builders and construction variables for Visual Age linker to - an Environment. - """ - link.generate(env) - - env['LINKFLAGS'] = SCons.Util.CLVar('-Wl,+s -Wl,+vnocompatwarnings') - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -b') - env['SHLIBSUFFIX'] = '.sl' - -def exists(env): - return ccLinker - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/icc.py b/3rdParty/SCons/scons-local/SCons/Tool/icc.py deleted file mode 100644 index e2a7388..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/icc.py +++ /dev/null @@ -1,59 +0,0 @@ -"""engine.SCons.Tool.icc - -Tool-specific initialization for the OS/2 icc compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/icc.py 4043 2009/02/23 09:06:45 scons" - -import cc - -def generate(env): - """Add Builders and construction variables for the OS/2 to an Environment.""" - cc.generate(env) - - env['CC'] = 'icc' - env['CCCOM'] = '$CC $CFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET' - env['CXXCOM'] = '$CXX $CXXFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET' - env['CPPDEFPREFIX'] = '/D' - env['CPPDEFSUFFIX'] = '' - env['INCPREFIX'] = '/I' - env['INCSUFFIX'] = '' - env['CFILESUFFIX'] = '.c' - env['CXXFILESUFFIX'] = '.cc' - -def exists(env): - return env.Detect('icc') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/icl.py b/3rdParty/SCons/scons-local/SCons/Tool/icl.py deleted file mode 100644 index afead06..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/icl.py +++ /dev/null @@ -1,52 +0,0 @@ -"""engine.SCons.Tool.icl - -Tool-specific initialization for the Intel C/C++ compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/icl.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Tool.intelc - -# This has been completely superceded by intelc.py, which can -# handle both Windows and Linux versions. - -def generate(*args, **kw): - """Add Builders and construction variables for icl to an Environment.""" - return apply(SCons.Tool.intelc.generate, args, kw) - -def exists(*args, **kw): - return apply(SCons.Tool.intelc.exists, args, kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/ifl.py b/3rdParty/SCons/scons-local/SCons/Tool/ifl.py deleted file mode 100644 index f728ed5..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/ifl.py +++ /dev/null @@ -1,72 +0,0 @@ -"""SCons.Tool.ifl - -Tool-specific initialization for the Intel Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/ifl.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Defaults -from SCons.Scanner.Fortran import FortranScan -from FortranCommon import add_all_to_env - -def generate(env): - """Add Builders and construction variables for ifl to an Environment.""" - fscan = FortranScan("FORTRANPATH") - SCons.Tool.SourceFileScanner.add_scanner('.i', fscan) - SCons.Tool.SourceFileScanner.add_scanner('.i90', fscan) - - if not env.has_key('FORTRANFILESUFFIXES'): - env['FORTRANFILESUFFIXES'] = ['.i'] - else: - env['FORTRANFILESUFFIXES'].append('.i') - - if not env.has_key('F90FILESUFFIXES'): - env['F90FILESUFFIXES'] = ['.i90'] - else: - env['F90FILESUFFIXES'].append('.i90') - - add_all_to_env(env) - - env['FORTRAN'] = 'ifl' - env['SHFORTRAN'] = '$FORTRAN' - env['FORTRANCOM'] = '$FORTRAN $FORTRANFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET' - env['FORTRANPPCOM'] = '$FORTRAN $FORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET' - env['SHFORTRANCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET' - env['SHFORTRANPPCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET' - -def exists(env): - return env.Detect('ifl') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/ifort.py b/3rdParty/SCons/scons-local/SCons/Tool/ifort.py deleted file mode 100644 index 2ef55f3..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/ifort.py +++ /dev/null @@ -1,89 +0,0 @@ -"""SCons.Tool.ifort - -Tool-specific initialization for newer versions of the Intel Fortran Compiler -for Linux/Windows (and possibly Mac OS X). - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/ifort.py 4043 2009/02/23 09:06:45 scons" - -import string - -import SCons.Defaults -from SCons.Scanner.Fortran import FortranScan -from FortranCommon import add_all_to_env - -def generate(env): - """Add Builders and construction variables for ifort to an Environment.""" - # ifort supports Fortran 90 and Fortran 95 - # Additionally, ifort recognizes more file extensions. - fscan = FortranScan("FORTRANPATH") - SCons.Tool.SourceFileScanner.add_scanner('.i', fscan) - SCons.Tool.SourceFileScanner.add_scanner('.i90', fscan) - - if not env.has_key('FORTRANFILESUFFIXES'): - env['FORTRANFILESUFFIXES'] = ['.i'] - else: - env['FORTRANFILESUFFIXES'].append('.i') - - if not env.has_key('F90FILESUFFIXES'): - env['F90FILESUFFIXES'] = ['.i90'] - else: - env['F90FILESUFFIXES'].append('.i90') - - add_all_to_env(env) - - fc = 'ifort' - - for dialect in ['F77', 'F90', 'FORTRAN', 'F95']: - env['%s' % dialect] = fc - env['SH%s' % dialect] = '$%s' % dialect - env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS -fPIC' % dialect) - - if env['PLATFORM'] == 'win32': - # On Windows, the ifort compiler specifies the object on the - # command line with -object:, not -o. Massage the necessary - # command-line construction variables. - for dialect in ['F77', 'F90', 'FORTRAN', 'F95']: - for var in ['%sCOM' % dialect, '%sPPCOM' % dialect, - 'SH%sCOM' % dialect, 'SH%sPPCOM' % dialect]: - env[var] = string.replace(env[var], '-o $TARGET', '-object:$TARGET') - env['FORTRANMODDIRPREFIX'] = "/module:" - else: - env['FORTRANMODDIRPREFIX'] = "-module " - -def exists(env): - return env.Detect('ifort') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/ilink.py b/3rdParty/SCons/scons-local/SCons/Tool/ilink.py deleted file mode 100644 index 94a6f63..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/ilink.py +++ /dev/null @@ -1,59 +0,0 @@ -"""SCons.Tool.ilink - -Tool-specific initialization for the OS/2 ilink linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/ilink.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Defaults -import SCons.Tool -import SCons.Util - -def generate(env): - """Add Builders and construction variables for ilink to an Environment.""" - SCons.Tool.createProgBuilder(env) - - env['LINK'] = 'ilink' - env['LINKFLAGS'] = SCons.Util.CLVar('') - env['LINKCOM'] = '$LINK $LINKFLAGS /O:$TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' - env['LIBDIRPREFIX']='/LIBPATH:' - env['LIBDIRSUFFIX']='' - env['LIBLINKPREFIX']='' - env['LIBLINKSUFFIX']='$LIBSUFFIX' - -def exists(env): - return env.Detect('ilink') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/ilink32.py b/3rdParty/SCons/scons-local/SCons/Tool/ilink32.py deleted file mode 100644 index 474649d..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/ilink32.py +++ /dev/null @@ -1,60 +0,0 @@ -"""SCons.Tool.ilink32 - -XXX - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/ilink32.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Tool -import SCons.Tool.bcc32 -import SCons.Util - -def generate(env): - """Add Builders and construction variables for Borland ilink to an - Environment.""" - SCons.Tool.createSharedLibBuilder(env) - SCons.Tool.createProgBuilder(env) - - env['LINK'] = '$CC' - env['LINKFLAGS'] = SCons.Util.CLVar('') - env['LINKCOM'] = '$LINK -q $LINKFLAGS -e$TARGET $SOURCES $LIBS' - env['LIBDIRPREFIX']='' - env['LIBDIRSUFFIX']='' - env['LIBLINKPREFIX']='' - env['LIBLINKSUFFIX']='$LIBSUFFIX' - - -def exists(env): - # Uses bcc32 to do linking as it generally knows where the standard - # LIBS are and set up the linking correctly - return SCons.Tool.bcc32.findIt('bcc32', env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/install.py b/3rdParty/SCons/scons-local/SCons/Tool/install.py deleted file mode 100644 index 9596db1..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/install.py +++ /dev/null @@ -1,229 +0,0 @@ -"""SCons.Tool.install - -Tool-specific initialization for the install tool. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/install.py 4043 2009/02/23 09:06:45 scons" - -import os -import shutil -import stat - -import SCons.Action -from SCons.Util import make_path_relative - -# -# We keep track of *all* installed files. -_INSTALLED_FILES = [] -_UNIQUE_INSTALLED_FILES = None - -# -# Functions doing the actual work of the Install Builder. -# -def copyFunc(dest, source, env): - """Install a source file or directory into a destination by copying, - (including copying permission/mode bits).""" - - if os.path.isdir(source): - if os.path.exists(dest): - if not os.path.isdir(dest): - raise SCons.Errors.UserError, "cannot overwrite non-directory `%s' with a directory `%s'" % (str(dest), str(source)) - else: - parent = os.path.split(dest)[0] - if not os.path.exists(parent): - os.makedirs(parent) - shutil.copytree(source, dest) - else: - shutil.copy2(source, dest) - st = os.stat(source) - os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE) - - return 0 - -def installFunc(target, source, env): - """Install a source file into a target using the function specified - as the INSTALL construction variable.""" - try: - install = env['INSTALL'] - except KeyError: - raise SCons.Errors.UserError('Missing INSTALL construction variable.') - - assert len(target)==len(source), \ - "Installing source %s into target %s: target and source lists must have same length."%(map(str, source), map(str, target)) - for t,s in zip(target,source): - if install(t.get_path(),s.get_path(),env): - return 1 - - return 0 - -def stringFunc(target, source, env): - installstr = env.get('INSTALLSTR') - if installstr: - return env.subst_target_source(installstr, 1, target, source) - target = str(target[0]) - source = str(source[0]) - if os.path.isdir(source): - type = 'directory' - else: - type = 'file' - return 'Install %s: "%s" as "%s"' % (type, source, target) - -# -# Emitter functions -# -def add_targets_to_INSTALLED_FILES(target, source, env): - """ an emitter that adds all target files to the list stored in the - _INSTALLED_FILES global variable. This way all installed files of one - scons call will be collected. - """ - global _INSTALLED_FILES, _UNIQUE_INSTALLED_FILES - _INSTALLED_FILES.extend(target) - _UNIQUE_INSTALLED_FILES = None - return (target, source) - -class DESTDIR_factory: - """ a node factory, where all files will be relative to the dir supplied - in the constructor. - """ - def __init__(self, env, dir): - self.env = env - self.dir = env.arg2nodes( dir, env.fs.Dir )[0] - - def Entry(self, name): - name = make_path_relative(name) - return self.dir.Entry(name) - - def Dir(self, name): - name = make_path_relative(name) - return self.dir.Dir(name) - -# -# The Builder Definition -# -install_action = SCons.Action.Action(installFunc, stringFunc) -installas_action = SCons.Action.Action(installFunc, stringFunc) - -BaseInstallBuilder = None - -def InstallBuilderWrapper(env, target=None, source=None, dir=None, **kw): - if target and dir: - import SCons.Errors - raise SCons.Errors.UserError, "Both target and dir defined for Install(), only one may be defined." - if not dir: - dir=target - - import SCons.Script - install_sandbox = SCons.Script.GetOption('install_sandbox') - if install_sandbox: - target_factory = DESTDIR_factory(env, install_sandbox) - else: - target_factory = env.fs - - try: - dnodes = env.arg2nodes(dir, target_factory.Dir) - except TypeError: - raise SCons.Errors.UserError, "Target `%s' of Install() is a file, but should be a directory. Perhaps you have the Install() arguments backwards?" % str(dir) - sources = env.arg2nodes(source, env.fs.Entry) - tgt = [] - for dnode in dnodes: - for src in sources: - # Prepend './' so the lookup doesn't interpret an initial - # '#' on the file name portion as meaning the Node should - # be relative to the top-level SConstruct directory. - target = env.fs.Entry('.'+os.sep+src.name, dnode) - #tgt.extend(BaseInstallBuilder(env, target, src, **kw)) - tgt.extend(apply(BaseInstallBuilder, (env, target, src), kw)) - return tgt - -def InstallAsBuilderWrapper(env, target=None, source=None, **kw): - result = [] - for src, tgt in map(lambda x, y: (x, y), source, target): - #result.extend(BaseInstallBuilder(env, tgt, src, **kw)) - result.extend(apply(BaseInstallBuilder, (env, tgt, src), kw)) - return result - -added = None - -def generate(env): - - from SCons.Script import AddOption, GetOption - global added - if not added: - added = 1 - AddOption('--install-sandbox', - dest='install_sandbox', - type="string", - action="store", - help='A directory under which all installed files will be placed.') - - global BaseInstallBuilder - if BaseInstallBuilder is None: - install_sandbox = GetOption('install_sandbox') - if install_sandbox: - target_factory = DESTDIR_factory(env, install_sandbox) - else: - target_factory = env.fs - - BaseInstallBuilder = SCons.Builder.Builder( - action = install_action, - target_factory = target_factory.Entry, - source_factory = env.fs.Entry, - multi = 1, - emitter = [ add_targets_to_INSTALLED_FILES, ], - name = 'InstallBuilder') - - env['BUILDERS']['_InternalInstall'] = InstallBuilderWrapper - env['BUILDERS']['_InternalInstallAs'] = InstallAsBuilderWrapper - - # We'd like to initialize this doing something like the following, - # but there isn't yet support for a ${SOURCE.type} expansion that - # will print "file" or "directory" depending on what's being - # installed. For now we punt by not initializing it, and letting - # the stringFunc() that we put in the action fall back to the - # hand-crafted default string if it's not set. - # - #try: - # env['INSTALLSTR'] - #except KeyError: - # env['INSTALLSTR'] = 'Install ${SOURCE.type}: "$SOURCES" as "$TARGETS"' - - try: - env['INSTALL'] - except KeyError: - env['INSTALL'] = copyFunc - -def exists(env): - return 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/intelc.py b/3rdParty/SCons/scons-local/SCons/Tool/intelc.py deleted file mode 100644 index 3ced16a..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/intelc.py +++ /dev/null @@ -1,488 +0,0 @@ -"""SCons.Tool.icl - -Tool-specific initialization for the Intel C/C++ compiler. -Supports Linux and Windows compilers, v7 and up. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/intelc.py 4043 2009/02/23 09:06:45 scons" - -import math, sys, os.path, glob, string, re - -is_windows = sys.platform == 'win32' -is_win64 = is_windows and (os.environ['PROCESSOR_ARCHITECTURE'] == 'AMD64' or - (os.environ.has_key('PROCESSOR_ARCHITEW6432') and - os.environ['PROCESSOR_ARCHITEW6432'] == 'AMD64')) -is_linux = sys.platform == 'linux2' -is_mac = sys.platform == 'darwin' - -if is_windows: - import SCons.Tool.msvc -elif is_linux: - import SCons.Tool.gcc -elif is_mac: - import SCons.Tool.gcc -import SCons.Util -import SCons.Warnings - -# Exceptions for this tool -class IntelCError(SCons.Errors.InternalError): - pass -class MissingRegistryError(IntelCError): # missing registry entry - pass -class MissingDirError(IntelCError): # dir not found - pass -class NoRegistryModuleError(IntelCError): # can't read registry at all - pass - -def uniquify(s): - """Return a sequence containing only one copy of each unique element from input sequence s. - Does not preserve order. - Input sequence must be hashable (i.e. must be usable as a dictionary key).""" - u = {} - for x in s: - u[x] = 1 - return u.keys() - -def linux_ver_normalize(vstr): - """Normalize a Linux compiler version number. - Intel changed from "80" to "9.0" in 2005, so we assume if the number - is greater than 60 it's an old-style number and otherwise new-style. - Always returns an old-style float like 80 or 90 for compatibility with Windows. - Shades of Y2K!""" - # Check for version number like 9.1.026: return 91.026 - m = re.match(r'([0-9]+)\.([0-9]+)\.([0-9]+)', vstr) - if m: - vmaj,vmin,build = m.groups() - return float(vmaj) * 10 + float(vmin) + float(build) / 1000.; - else: - f = float(vstr) - if is_windows: - return f - else: - if f < 60: return f * 10.0 - else: return f - -def check_abi(abi): - """Check for valid ABI (application binary interface) name, - and map into canonical one""" - if not abi: - return None - abi = abi.lower() - # valid_abis maps input name to canonical name - if is_windows: - valid_abis = {'ia32' : 'ia32', - 'x86' : 'ia32', - 'ia64' : 'ia64', - 'em64t' : 'em64t', - 'amd64' : 'em64t'} - if is_linux: - valid_abis = {'ia32' : 'ia32', - 'x86' : 'ia32', - 'x86_64' : 'x86_64', - 'em64t' : 'x86_64', - 'amd64' : 'x86_64'} - if is_mac: - valid_abis = {'ia32' : 'ia32', - 'x86' : 'ia32', - 'x86_64' : 'x86_64', - 'em64t' : 'x86_64'} - try: - abi = valid_abis[abi] - except KeyError: - raise SCons.Errors.UserError, \ - "Intel compiler: Invalid ABI %s, valid values are %s"% \ - (abi, valid_abis.keys()) - return abi - -def vercmp(a, b): - """Compare strings as floats, - but Intel changed Linux naming convention at 9.0""" - return cmp(linux_ver_normalize(b), linux_ver_normalize(a)) - -def get_version_from_list(v, vlist): - """See if we can match v (string) in vlist (list of strings) - Linux has to match in a fuzzy way.""" - if is_windows: - # Simple case, just find it in the list - if v in vlist: return v - else: return None - else: - # Fuzzy match: normalize version number first, but still return - # original non-normalized form. - fuzz = 0.001 - for vi in vlist: - if math.fabs(linux_ver_normalize(vi) - linux_ver_normalize(v)) < fuzz: - return vi - # Not found - return None - -def get_intel_registry_value(valuename, version=None, abi=None): - """ - Return a value from the Intel compiler registry tree. (Windows only) - """ - # Open the key: - if is_win64: - K = 'Software\\Wow6432Node\\Intel\\Compilers\\C++\\' + version + '\\'+abi.upper() - else: - K = 'Software\\Intel\\Compilers\\C++\\' + version + '\\'+abi.upper() - try: - k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K) - except SCons.Util.RegError: - raise MissingRegistryError, \ - "%s was not found in the registry, for Intel compiler version %s, abi='%s'"%(K, version,abi) - - # Get the value: - try: - v = SCons.Util.RegQueryValueEx(k, valuename)[0] - return v # or v.encode('iso-8859-1', 'replace') to remove unicode? - except SCons.Util.RegError: - raise MissingRegistryError, \ - "%s\\%s was not found in the registry."%(K, valuename) - - -def get_all_compiler_versions(): - """Returns a sorted list of strings, like "70" or "80" or "9.0" - with most recent compiler version first. - """ - versions=[] - if is_windows: - if is_win64: - keyname = 'Software\\WoW6432Node\\Intel\\Compilers\\C++' - else: - keyname = 'Software\\Intel\\Compilers\\C++' - try: - k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, - keyname) - except WindowsError: - return [] - i = 0 - versions = [] - try: - while i < 100: - subkey = SCons.Util.RegEnumKey(k, i) # raises EnvironmentError - # Check that this refers to an existing dir. - # This is not 100% perfect but should catch common - # installation issues like when the compiler was installed - # and then the install directory deleted or moved (rather - # than uninstalling properly), so the registry values - # are still there. - ok = False - for try_abi in ('IA32', 'IA32e', 'IA64', 'EM64T'): - try: - d = get_intel_registry_value('ProductDir', subkey, try_abi) - except MissingRegistryError: - continue # not found in reg, keep going - if os.path.exists(d): ok = True - if ok: - versions.append(subkey) - else: - try: - # Registry points to nonexistent dir. Ignore this - # version. - value = get_intel_registry_value('ProductDir', subkey, 'IA32') - except MissingRegistryError, e: - - # Registry key is left dangling (potentially - # after uninstalling). - - print \ - "scons: *** Ignoring the registry key for the Intel compiler version %s.\n" \ - "scons: *** It seems that the compiler was uninstalled and that the registry\n" \ - "scons: *** was not cleaned up properly.\n" % subkey - else: - print "scons: *** Ignoring "+str(value) - - i = i + 1 - except EnvironmentError: - # no more subkeys - pass - elif is_linux: - for d in glob.glob('/opt/intel_cc_*'): - # Typical dir here is /opt/intel_cc_80. - m = re.search(r'cc_(.*)$', d) - if m: - versions.append(m.group(1)) - for d in glob.glob('/opt/intel/cc*/*'): - # Typical dir here is /opt/intel/cc/9.0 for IA32, - # /opt/intel/cce/9.0 for EMT64 (AMD64) - m = re.search(r'([0-9.]+)$', d) - if m: - versions.append(m.group(1)) - elif is_mac: - for d in glob.glob('/opt/intel/cc*/*'): - # Typical dir here is /opt/intel/cc/9.0 for IA32, - # /opt/intel/cce/9.0 for EMT64 (AMD64) - m = re.search(r'([0-9.]+)$', d) - if m: - versions.append(m.group(1)) - versions = uniquify(versions) # remove dups - versions.sort(vercmp) - return versions - -def get_intel_compiler_top(version, abi): - """ - Return the main path to the top-level dir of the Intel compiler, - using the given version. - The compiler will be in <top>/bin/icl.exe (icc on linux), - the include dir is <top>/include, etc. - """ - - if is_windows: - if not SCons.Util.can_read_reg: - raise NoRegistryModuleError, "No Windows registry module was found" - top = get_intel_registry_value('ProductDir', version, abi) - if not os.path.exists(os.path.join(top, "Bin", "icl.exe")): - raise MissingDirError, \ - "Can't find Intel compiler in %s"%(top) - elif is_mac or is_linux: - # first dir is new (>=9.0) style, second is old (8.0) style. - dirs=('/opt/intel/cc/%s', '/opt/intel_cc_%s') - if abi == 'x86_64': - dirs=('/opt/intel/cce/%s',) # 'e' stands for 'em64t', aka x86_64 aka amd64 - top=None - for d in dirs: - if os.path.exists(os.path.join(d%version, "bin", "icc")): - top = d%version - break - if not top: - raise MissingDirError, \ - "Can't find version %s Intel compiler in %s (abi='%s')"%(version,top, abi) - return top - - -def generate(env, version=None, abi=None, topdir=None, verbose=0): - """Add Builders and construction variables for Intel C/C++ compiler - to an Environment. - args: - version: (string) compiler version to use, like "80" - abi: (string) 'win32' or whatever Itanium version wants - topdir: (string) compiler top dir, like - "c:\Program Files\Intel\Compiler70" - If topdir is used, version and abi are ignored. - verbose: (int) if >0, prints compiler version used. - """ - if not (is_mac or is_linux or is_windows): - # can't handle this platform - return - - if is_windows: - SCons.Tool.msvc.generate(env) - elif is_linux: - SCons.Tool.gcc.generate(env) - elif is_mac: - SCons.Tool.gcc.generate(env) - - # if version is unspecified, use latest - vlist = get_all_compiler_versions() - if not version: - if vlist: - version = vlist[0] - else: - # User may have specified '90' but we need to get actual dirname '9.0'. - # get_version_from_list does that mapping. - v = get_version_from_list(version, vlist) - if not v: - raise SCons.Errors.UserError, \ - "Invalid Intel compiler version %s: "%version + \ - "installed versions are %s"%(', '.join(vlist)) - version = v - - # if abi is unspecified, use ia32 - # alternatives are ia64 for Itanium, or amd64 or em64t or x86_64 (all synonyms here) - abi = check_abi(abi) - if abi is None: - if is_mac or is_linux: - # Check if we are on 64-bit linux, default to 64 then. - uname_m = os.uname()[4] - if uname_m == 'x86_64': - abi = 'x86_64' - else: - abi = 'ia32' - else: - if is_win64: - abi = 'em64t' - else: - abi = 'ia32' - - if version and not topdir: - try: - topdir = get_intel_compiler_top(version, abi) - except (SCons.Util.RegError, IntelCError): - topdir = None - - if not topdir: - # Normally this is an error, but it might not be if the compiler is - # on $PATH and the user is importing their env. - class ICLTopDirWarning(SCons.Warnings.Warning): - pass - if (is_mac or is_linux) and not env.Detect('icc') or \ - is_windows and not env.Detect('icl'): - - SCons.Warnings.enableWarningClass(ICLTopDirWarning) - SCons.Warnings.warn(ICLTopDirWarning, - "Failed to find Intel compiler for version='%s', abi='%s'"% - (str(version), str(abi))) - else: - # should be cleaned up to say what this other version is - # since in this case we have some other Intel compiler installed - SCons.Warnings.enableWarningClass(ICLTopDirWarning) - SCons.Warnings.warn(ICLTopDirWarning, - "Can't find Intel compiler top dir for version='%s', abi='%s'"% - (str(version), str(abi))) - - if topdir: - if verbose: - print "Intel C compiler: using version %s (%g), abi %s, in '%s'"%\ - (repr(version), linux_ver_normalize(version),abi,topdir) - if is_linux: - # Show the actual compiler version by running the compiler. - os.system('%s/bin/icc --version'%topdir) - if is_mac: - # Show the actual compiler version by running the compiler. - os.system('%s/bin/icc --version'%topdir) - - env['INTEL_C_COMPILER_TOP'] = topdir - if is_linux: - paths={'INCLUDE' : 'include', - 'LIB' : 'lib', - 'PATH' : 'bin', - 'LD_LIBRARY_PATH' : 'lib'} - for p in paths.keys(): - env.PrependENVPath(p, os.path.join(topdir, paths[p])) - if is_mac: - paths={'INCLUDE' : 'include', - 'LIB' : 'lib', - 'PATH' : 'bin', - 'LD_LIBRARY_PATH' : 'lib'} - for p in paths.keys(): - env.PrependENVPath(p, os.path.join(topdir, paths[p])) - if is_windows: - # env key reg valname default subdir of top - paths=(('INCLUDE', 'IncludeDir', 'Include'), - ('LIB' , 'LibDir', 'Lib'), - ('PATH' , 'BinDir', 'Bin')) - # We are supposed to ignore version if topdir is set, so set - # it to the emptry string if it's not already set. - if version is None: - version = '' - # Each path has a registry entry, use that or default to subdir - for p in paths: - try: - path=get_intel_registry_value(p[1], version, abi) - # These paths may have $(ICInstallDir) - # which needs to be substituted with the topdir. - path=path.replace('$(ICInstallDir)', topdir + os.sep) - except IntelCError: - # Couldn't get it from registry: use default subdir of topdir - env.PrependENVPath(p[0], os.path.join(topdir, p[2])) - else: - env.PrependENVPath(p[0], string.split(path, os.pathsep)) - # print "ICL %s: %s, final=%s"%(p[0], path, str(env['ENV'][p[0]])) - - if is_windows: - env['CC'] = 'icl' - env['CXX'] = 'icl' - env['LINK'] = 'xilink' - else: - env['CC'] = 'icc' - env['CXX'] = 'icpc' - # Don't reset LINK here; - # use smart_link which should already be here from link.py. - #env['LINK'] = '$CC' - env['AR'] = 'xiar' - env['LD'] = 'xild' # not used by default - - # This is not the exact (detailed) compiler version, - # just the major version as determined above or specified - # by the user. It is a float like 80 or 90, in normalized form for Linux - # (i.e. even for Linux 9.0 compiler, still returns 90 rather than 9.0) - if version: - env['INTEL_C_COMPILER_VERSION']=linux_ver_normalize(version) - - if is_windows: - # Look for license file dir - # in system environment, registry, and default location. - envlicdir = os.environ.get("INTEL_LICENSE_FILE", '') - K = ('SOFTWARE\Intel\Licenses') - try: - k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K) - reglicdir = SCons.Util.RegQueryValueEx(k, "w_cpp")[0] - except (AttributeError, SCons.Util.RegError): - reglicdir = "" - defaultlicdir = r'C:\Program Files\Common Files\Intel\Licenses' - - licdir = None - for ld in [envlicdir, reglicdir]: - # If the string contains an '@', then assume it's a network - # license (port@system) and good by definition. - if ld and (string.find(ld, '@') != -1 or os.path.exists(ld)): - licdir = ld - break - if not licdir: - licdir = defaultlicdir - if not os.path.exists(licdir): - class ICLLicenseDirWarning(SCons.Warnings.Warning): - pass - SCons.Warnings.enableWarningClass(ICLLicenseDirWarning) - SCons.Warnings.warn(ICLLicenseDirWarning, - "Intel license dir was not found." - " Tried using the INTEL_LICENSE_FILE environment variable (%s), the registry (%s) and the default path (%s)." - " Using the default path as a last resort." - % (envlicdir, reglicdir, defaultlicdir)) - env['ENV']['INTEL_LICENSE_FILE'] = licdir - -def exists(env): - if not (is_mac or is_linux or is_windows): - # can't handle this platform - return 0 - - try: - versions = get_all_compiler_versions() - except (SCons.Util.RegError, IntelCError): - versions = None - detected = versions is not None and len(versions) > 0 - if not detected: - # try env.Detect, maybe that will work - if is_windows: - return env.Detect('icl') - elif is_linux: - return env.Detect('icc') - elif is_mac: - return env.Detect('icc') - return detected - -# end of file - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/jar.py b/3rdParty/SCons/scons-local/SCons/Tool/jar.py deleted file mode 100644 index ddd5f66..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/jar.py +++ /dev/null @@ -1,110 +0,0 @@ -"""SCons.Tool.jar - -Tool-specific initialization for jar. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/jar.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Subst -import SCons.Util - -def jarSources(target, source, env, for_signature): - """Only include sources that are not a manifest file.""" - try: - env['JARCHDIR'] - except KeyError: - jarchdir_set = False - else: - jarchdir_set = True - jarchdir = env.subst('$JARCHDIR', target=target, source=source) - if jarchdir: - jarchdir = env.fs.Dir(jarchdir) - result = [] - for src in source: - contents = src.get_text_contents() - if contents[:16] != "Manifest-Version": - if jarchdir_set: - _chdir = jarchdir - else: - try: - _chdir = src.attributes.java_classdir - except AttributeError: - _chdir = None - if _chdir: - # If we are changing the dir with -C, then sources should - # be relative to that directory. - src = SCons.Subst.Literal(src.get_path(_chdir)) - result.append('-C') - result.append(_chdir) - result.append(src) - return result - -def jarManifest(target, source, env, for_signature): - """Look in sources for a manifest file, if any.""" - for src in source: - contents = src.get_text_contents() - if contents[:16] == "Manifest-Version": - return src - return '' - -def jarFlags(target, source, env, for_signature): - """If we have a manifest, make sure that the 'm' - flag is specified.""" - jarflags = env.subst('$JARFLAGS', target=target, source=source) - for src in source: - contents = src.get_text_contents() - if contents[:16] == "Manifest-Version": - if not 'm' in jarflags: - return jarflags + 'm' - break - return jarflags - -def generate(env): - """Add Builders and construction variables for jar to an Environment.""" - SCons.Tool.CreateJarBuilder(env) - - env['JAR'] = 'jar' - env['JARFLAGS'] = SCons.Util.CLVar('cf') - env['_JARFLAGS'] = jarFlags - env['_JARMANIFEST'] = jarManifest - env['_JARSOURCES'] = jarSources - env['_JARCOM'] = '$JAR $_JARFLAGS $TARGET $_JARMANIFEST $_JARSOURCES' - env['JARCOM'] = "${TEMPFILE('$_JARCOM')}" - env['JARSUFFIX'] = '.jar' - -def exists(env): - return env.Detect('jar') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/javac.py b/3rdParty/SCons/scons-local/SCons/Tool/javac.py deleted file mode 100644 index f528ca2..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/javac.py +++ /dev/null @@ -1,234 +0,0 @@ -"""SCons.Tool.javac - -Tool-specific initialization for javac. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/javac.py 4043 2009/02/23 09:06:45 scons" - -import os -import os.path -import string - -import SCons.Action -import SCons.Builder -from SCons.Node.FS import _my_normcase -from SCons.Tool.JavaCommon import parse_java_file -import SCons.Util - -def classname(path): - """Turn a string (path name) into a Java class name.""" - return string.replace(os.path.normpath(path), os.sep, '.') - -def emit_java_classes(target, source, env): - """Create and return lists of source java files - and their corresponding target class files. - """ - java_suffix = env.get('JAVASUFFIX', '.java') - class_suffix = env.get('JAVACLASSSUFFIX', '.class') - - target[0].must_be_same(SCons.Node.FS.Dir) - classdir = target[0] - - s = source[0].rentry().disambiguate() - if isinstance(s, SCons.Node.FS.File): - sourcedir = s.dir.rdir() - elif isinstance(s, SCons.Node.FS.Dir): - sourcedir = s.rdir() - else: - raise SCons.Errors.UserError("Java source must be File or Dir, not '%s'" % s.__class__) - - slist = [] - js = _my_normcase(java_suffix) - find_java = lambda n, js=js, ljs=len(js): _my_normcase(n[-ljs:]) == js - for entry in source: - entry = entry.rentry().disambiguate() - if isinstance(entry, SCons.Node.FS.File): - slist.append(entry) - elif isinstance(entry, SCons.Node.FS.Dir): - result = SCons.Util.OrderedDict() - def visit(arg, dirname, names, fj=find_java, dirnode=entry.rdir()): - java_files = filter(fj, names) - # The on-disk entries come back in arbitrary order. Sort - # them so our target and source lists are determinate. - java_files.sort() - mydir = dirnode.Dir(dirname) - java_paths = map(lambda f, d=mydir: d.File(f), java_files) - for jp in java_paths: - arg[jp] = True - - os.path.walk(entry.rdir().get_abspath(), visit, result) - entry.walk(visit, result) - - slist.extend(result.keys()) - else: - raise SCons.Errors.UserError("Java source must be File or Dir, not '%s'" % entry.__class__) - - version = env.get('JAVAVERSION', '1.4') - full_tlist = [] - for f in slist: - tlist = [] - source_file_based = True - pkg_dir = None - if not f.is_derived(): - pkg_dir, classes = parse_java_file(f.rfile().get_abspath(), version) - if classes: - source_file_based = False - if pkg_dir: - d = target[0].Dir(pkg_dir) - p = pkg_dir + os.sep - else: - d = target[0] - p = '' - for c in classes: - t = d.File(c + class_suffix) - t.attributes.java_classdir = classdir - t.attributes.java_sourcedir = sourcedir - t.attributes.java_classname = classname(p + c) - tlist.append(t) - - if source_file_based: - base = f.name[:-len(java_suffix)] - if pkg_dir: - t = target[0].Dir(pkg_dir).File(base + class_suffix) - else: - t = target[0].File(base + class_suffix) - t.attributes.java_classdir = classdir - t.attributes.java_sourcedir = f.dir - t.attributes.java_classname = classname(base) - tlist.append(t) - - for t in tlist: - t.set_specific_source([f]) - - full_tlist.extend(tlist) - - return full_tlist, slist - -JavaAction = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR') - -JavaBuilder = SCons.Builder.Builder(action = JavaAction, - emitter = emit_java_classes, - target_factory = SCons.Node.FS.Entry, - source_factory = SCons.Node.FS.Entry) - -class pathopt: - """ - Callable object for generating javac-style path options from - a construction variable (e.g. -classpath, -sourcepath). - """ - def __init__(self, opt, var, default=None): - self.opt = opt - self.var = var - self.default = default - - def __call__(self, target, source, env, for_signature): - path = env[self.var] - if path and not SCons.Util.is_List(path): - path = [path] - if self.default: - path = path + [ env[self.default] ] - if path: - return [self.opt, string.join(path, os.pathsep)] - #return self.opt + " " + string.join(path, os.pathsep) - else: - return [] - #return "" - -def Java(env, target, source, *args, **kw): - """ - A pseudo-Builder wrapper around the separate JavaClass{File,Dir} - Builders. - """ - if not SCons.Util.is_List(target): - target = [target] - if not SCons.Util.is_List(source): - source = [source] - - # Pad the target list with repetitions of the last element in the - # list so we have a target for every source element. - target = target + ([target[-1]] * (len(source) - len(target))) - - java_suffix = env.subst('$JAVASUFFIX') - result = [] - - for t, s in zip(target, source): - if isinstance(s, SCons.Node.FS.Base): - if isinstance(s, SCons.Node.FS.File): - b = env.JavaClassFile - else: - b = env.JavaClassDir - else: - if os.path.isfile(s): - b = env.JavaClassFile - elif os.path.isdir(s): - b = env.JavaClassDir - elif s[-len(java_suffix):] == java_suffix: - b = env.JavaClassFile - else: - b = env.JavaClassDir - result.extend(apply(b, (t, s) + args, kw)) - - return result - -def generate(env): - """Add Builders and construction variables for javac to an Environment.""" - java_file = SCons.Tool.CreateJavaFileBuilder(env) - java_class = SCons.Tool.CreateJavaClassFileBuilder(env) - java_class_dir = SCons.Tool.CreateJavaClassDirBuilder(env) - java_class.add_emitter(None, emit_java_classes) - java_class.add_emitter(env.subst('$JAVASUFFIX'), emit_java_classes) - java_class_dir.emitter = emit_java_classes - - env.AddMethod(Java) - - env['JAVAC'] = 'javac' - env['JAVACFLAGS'] = SCons.Util.CLVar('') - env['JAVABOOTCLASSPATH'] = [] - env['JAVACLASSPATH'] = [] - env['JAVASOURCEPATH'] = [] - env['_javapathopt'] = pathopt - env['_JAVABOOTCLASSPATH'] = '${_javapathopt("-bootclasspath", "JAVABOOTCLASSPATH")} ' - env['_JAVACLASSPATH'] = '${_javapathopt("-classpath", "JAVACLASSPATH")} ' - env['_JAVASOURCEPATH'] = '${_javapathopt("-sourcepath", "JAVASOURCEPATH", "_JAVASOURCEPATHDEFAULT")} ' - env['_JAVASOURCEPATHDEFAULT'] = '${TARGET.attributes.java_sourcedir}' - env['_JAVACCOM'] = '$JAVAC $JAVACFLAGS $_JAVABOOTCLASSPATH $_JAVACLASSPATH -d ${TARGET.attributes.java_classdir} $_JAVASOURCEPATH $SOURCES' - env['JAVACCOM'] = "${TEMPFILE('$_JAVACCOM')}" - env['JAVACLASSSUFFIX'] = '.class' - env['JAVASUFFIX'] = '.java' - -def exists(env): - return 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/javah.py b/3rdParty/SCons/scons-local/SCons/Tool/javah.py deleted file mode 100644 index dc18a08..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/javah.py +++ /dev/null @@ -1,138 +0,0 @@ -"""SCons.Tool.javah - -Tool-specific initialization for javah. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/javah.py 4043 2009/02/23 09:06:45 scons" - -import os.path -import string - -import SCons.Action -import SCons.Builder -import SCons.Node.FS -import SCons.Tool.javac -import SCons.Util - -def emit_java_headers(target, source, env): - """Create and return lists of Java stub header files that will - be created from a set of class files. - """ - class_suffix = env.get('JAVACLASSSUFFIX', '.class') - classdir = env.get('JAVACLASSDIR') - - if not classdir: - try: - s = source[0] - except IndexError: - classdir = '.' - else: - try: - classdir = s.attributes.java_classdir - except AttributeError: - classdir = '.' - classdir = env.Dir(classdir).rdir() - - if str(classdir) == '.': - c_ = None - else: - c_ = str(classdir) + os.sep - - slist = [] - for src in source: - try: - classname = src.attributes.java_classname - except AttributeError: - classname = str(src) - if c_ and classname[:len(c_)] == c_: - classname = classname[len(c_):] - if class_suffix and classname[-len(class_suffix):] == class_suffix: - classname = classname[:-len(class_suffix)] - classname = SCons.Tool.javac.classname(classname) - s = src.rfile() - s.attributes.java_classname = classname - slist.append(s) - - s = source[0].rfile() - if not hasattr(s.attributes, 'java_classdir'): - s.attributes.java_classdir = classdir - - if target[0].__class__ is SCons.Node.FS.File: - tlist = target - else: - if not isinstance(target[0], SCons.Node.FS.Dir): - target[0].__class__ = SCons.Node.FS.Dir - target[0]._morph() - tlist = [] - for s in source: - fname = string.replace(s.attributes.java_classname, '.', '_') + '.h' - t = target[0].File(fname) - t.attributes.java_lookupdir = target[0] - tlist.append(t) - - return tlist, source - -def JavaHOutFlagGenerator(target, source, env, for_signature): - try: - t = target[0] - except (AttributeError, IndexError, TypeError): - t = target - try: - return '-d ' + str(t.attributes.java_lookupdir) - except AttributeError: - return '-o ' + str(t) - -def getJavaHClassPath(env,target, source, for_signature): - path = "${SOURCE.attributes.java_classdir}" - if env.has_key('JAVACLASSPATH') and env['JAVACLASSPATH']: - path = SCons.Util.AppendPath(path, env['JAVACLASSPATH']) - return "-classpath %s" % (path) - -def generate(env): - """Add Builders and construction variables for javah to an Environment.""" - java_javah = SCons.Tool.CreateJavaHBuilder(env) - java_javah.emitter = emit_java_headers - - env['_JAVAHOUTFLAG'] = JavaHOutFlagGenerator - env['JAVAH'] = 'javah' - env['JAVAHFLAGS'] = SCons.Util.CLVar('') - env['_JAVAHCLASSPATH'] = getJavaHClassPath - env['JAVAHCOM'] = '$JAVAH $JAVAHFLAGS $_JAVAHOUTFLAG $_JAVAHCLASSPATH ${SOURCES.attributes.java_classname}' - env['JAVACLASSSUFFIX'] = '.class' - -def exists(env): - return env.Detect('javah') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/latex.py b/3rdParty/SCons/scons-local/SCons/Tool/latex.py deleted file mode 100644 index 310f1ab..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/latex.py +++ /dev/null @@ -1,82 +0,0 @@ -"""SCons.Tool.latex - -Tool-specific initialization for LaTeX. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/latex.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Action -import SCons.Defaults -import SCons.Scanner.LaTeX -import SCons.Util -import SCons.Tool -import SCons.Tool.tex - -LaTeXAction = None - -def LaTeXAuxFunction(target = None, source= None, env=None): - result = SCons.Tool.tex.InternalLaTeXAuxAction( LaTeXAction, target, source, env ) - return result - -LaTeXAuxAction = SCons.Action.Action(LaTeXAuxFunction, - strfunction=SCons.Tool.tex.TeXLaTeXStrFunction) - -def generate(env): - """Add Builders and construction variables for LaTeX to an Environment.""" - global LaTeXAction - if LaTeXAction is None: - LaTeXAction = SCons.Action.Action('$LATEXCOM', '$LATEXCOMSTR') - - import dvi - dvi.generate(env) - - import pdf - pdf.generate(env) - - bld = env['BUILDERS']['DVI'] - bld.add_action('.ltx', LaTeXAuxAction) - bld.add_action('.latex', LaTeXAuxAction) - bld.add_emitter('.ltx', SCons.Tool.tex.tex_eps_emitter) - bld.add_emitter('.latex', SCons.Tool.tex.tex_eps_emitter) - - env['LATEX'] = 'latex' - env['LATEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode') - env['LATEXCOM'] = 'cd ${TARGET.dir} && $LATEX $LATEXFLAGS ${SOURCE.file}' - env['LATEXRETRIES'] = 3 - -def exists(env): - return env.Detect('latex') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/lex.py b/3rdParty/SCons/scons-local/SCons/Tool/lex.py deleted file mode 100644 index 656d5a6..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/lex.py +++ /dev/null @@ -1,99 +0,0 @@ -"""SCons.Tool.lex - -Tool-specific initialization for lex. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/lex.py 4043 2009/02/23 09:06:45 scons" - -import os.path - -import string - -import SCons.Action -import SCons.Tool -import SCons.Util - -LexAction = SCons.Action.Action("$LEXCOM", "$LEXCOMSTR") - -def lexEmitter(target, source, env): - sourceBase, sourceExt = os.path.splitext(SCons.Util.to_String(source[0])) - - if sourceExt == ".lm": # If using Objective-C - target = [sourceBase + ".m"] # the extension is ".m". - - # This emitter essentially tries to add to the target all extra - # files generated by flex. - - # Different options that are used to trigger the creation of extra files. - fileGenOptions = ["--header-file=", "--tables-file="] - - lexflags = env.subst("$LEXFLAGS", target=target, source=source) - for option in SCons.Util.CLVar(lexflags): - for fileGenOption in fileGenOptions: - l = len(fileGenOption) - if option[:l] == fileGenOption: - # A file generating option is present, so add the - # file name to the target list. - fileName = string.strip(option[l:]) - target.append(fileName) - return (target, source) - -def generate(env): - """Add Builders and construction variables for lex to an Environment.""" - c_file, cxx_file = SCons.Tool.createCFileBuilders(env) - - # C - c_file.add_action(".l", LexAction) - c_file.add_emitter(".l", lexEmitter) - - c_file.add_action(".lex", LexAction) - c_file.add_emitter(".lex", lexEmitter) - - # Objective-C - cxx_file.add_action(".lm", LexAction) - cxx_file.add_emitter(".lm", lexEmitter) - - # C++ - cxx_file.add_action(".ll", LexAction) - cxx_file.add_emitter(".ll", lexEmitter) - - env["LEX"] = env.Detect("flex") or "lex" - env["LEXFLAGS"] = SCons.Util.CLVar("") - env["LEXCOM"] = "$LEX $LEXFLAGS -t $SOURCES > $TARGET" - -def exists(env): - return env.Detect(["flex", "lex"]) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/link.py b/3rdParty/SCons/scons-local/SCons/Tool/link.py deleted file mode 100644 index 8192637..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/link.py +++ /dev/null @@ -1,121 +0,0 @@ -"""SCons.Tool.link - -Tool-specific initialization for the generic Posix linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/link.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Defaults -import SCons.Tool -import SCons.Util -import SCons.Warnings - -from SCons.Tool.FortranCommon import isfortran - -cplusplus = __import__('c++', globals(), locals(), []) - -issued_mixed_link_warning = False - -def smart_link(source, target, env, for_signature): - has_cplusplus = cplusplus.iscplusplus(source) - has_fortran = isfortran(env, source) - if has_cplusplus and has_fortran: - global issued_mixed_link_warning - if not issued_mixed_link_warning: - msg = "Using $CXX to link Fortran and C++ code together.\n\t" + \ - "This may generate a buggy executable if the '%s'\n\t" + \ - "compiler does not know how to deal with Fortran runtimes." - SCons.Warnings.warn(SCons.Warnings.FortranCxxMixWarning, - msg % env.subst('$CXX')) - issued_mixed_link_warning = True - return '$CXX' - elif has_fortran: - return '$FORTRAN' - elif has_cplusplus: - return '$CXX' - return '$CC' - -def shlib_emitter(target, source, env): - for tgt in target: - tgt.attributes.shared = 1 - return (target, source) - -def generate(env): - """Add Builders and construction variables for gnulink to an Environment.""" - SCons.Tool.createSharedLibBuilder(env) - SCons.Tool.createProgBuilder(env) - - env['SHLINK'] = '$LINK' - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared') - env['SHLINKCOM'] = '$SHLINK -o $TARGET $SHLINKFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' - # don't set up the emitter, cause AppendUnique will generate a list - # starting with None :-( - env.Append(SHLIBEMITTER = [shlib_emitter]) - env['SMARTLINK'] = smart_link - env['LINK'] = "$SMARTLINK" - env['LINKFLAGS'] = SCons.Util.CLVar('') - env['LINKCOM'] = '$LINK -o $TARGET $LINKFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' - env['LIBDIRPREFIX']='-L' - env['LIBDIRSUFFIX']='' - env['_LIBFLAGS']='${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}' - env['LIBLINKPREFIX']='-l' - env['LIBLINKSUFFIX']='' - - if env['PLATFORM'] == 'hpux': - env['SHLIBSUFFIX'] = '.sl' - elif env['PLATFORM'] == 'aix': - env['SHLIBSUFFIX'] = '.a' - - # For most platforms, a loadable module is the same as a shared - # library. Platforms which are different can override these, but - # setting them the same means that LoadableModule works everywhere. - SCons.Tool.createLoadableModuleBuilder(env) - env['LDMODULE'] = '$SHLINK' - # don't set up the emitter, cause AppendUnique will generate a list - # starting with None :-( - env.Append(LDMODULEEMITTER='$SHLIBEMITTER') - env['LDMODULEPREFIX'] = '$SHLIBPREFIX' - env['LDMODULESUFFIX'] = '$SHLIBSUFFIX' - env['LDMODULEFLAGS'] = '$SHLINKFLAGS' - env['LDMODULECOM'] = '$LDMODULE -o $TARGET $LDMODULEFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' - - - -def exists(env): - # This module isn't really a Tool on its own, it's common logic for - # other linkers. - return None - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/linkloc.py b/3rdParty/SCons/scons-local/SCons/Tool/linkloc.py deleted file mode 100644 index 7fd3a3b..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/linkloc.py +++ /dev/null @@ -1,112 +0,0 @@ -"""SCons.Tool.linkloc - -Tool specification for the LinkLoc linker for the Phar Lap ETS embedded -operating system. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/linkloc.py 4043 2009/02/23 09:06:45 scons" - -import os.path -import re - -import SCons.Action -import SCons.Defaults -import SCons.Errors -import SCons.Tool -import SCons.Util - -from SCons.Tool.MSCommon import detect_msvs, merge_default_version -from SCons.Tool.PharLapCommon import addPharLapPaths - -_re_linker_command = re.compile(r'(\s)@\s*([^\s]+)') - -def repl_linker_command(m): - # Replaces any linker command file directives (e.g. "@foo.lnk") with - # the actual contents of the file. - try: - f=open(m.group(2), "r") - return m.group(1) + f.read() - except IOError: - # the linker should return an error if it can't - # find the linker command file so we will remain quiet. - # However, we will replace the @ with a # so we will not continue - # to find it with recursive substitution - return m.group(1) + '#' + m.group(2) - -class LinklocGenerator: - def __init__(self, cmdline): - self.cmdline = cmdline - - def __call__(self, env, target, source, for_signature): - if for_signature: - # Expand the contents of any linker command files recursively - subs = 1 - strsub = env.subst(self.cmdline, target=target, source=source) - while subs: - strsub, subs = _re_linker_command.subn(repl_linker_command, strsub) - return strsub - else: - return "${TEMPFILE('" + self.cmdline + "')}" - -def generate(env): - """Add Builders and construction variables for ar to an Environment.""" - SCons.Tool.createSharedLibBuilder(env) - SCons.Tool.createProgBuilder(env) - - env['SUBST_CMD_FILE'] = LinklocGenerator - env['SHLINK'] = '$LINK' - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS') - env['SHLINKCOM'] = '${SUBST_CMD_FILE("$SHLINK $SHLINKFLAGS $_LIBDIRFLAGS $_LIBFLAGS -dll $TARGET $SOURCES")}' - env['SHLIBEMITTER']= None - env['LINK'] = "linkloc" - env['LINKFLAGS'] = SCons.Util.CLVar('') - env['LINKCOM'] = '${SUBST_CMD_FILE("$LINK $LINKFLAGS $_LIBDIRFLAGS $_LIBFLAGS -exe $TARGET $SOURCES")}' - env['LIBDIRPREFIX']='-libpath ' - env['LIBDIRSUFFIX']='' - env['LIBLINKPREFIX']='-lib ' - env['LIBLINKSUFFIX']='$LIBSUFFIX' - - # Set-up ms tools paths for default version - merge_default_version(env) - - addPharLapPaths(env) - -def exists(env): - if detect_msvs(): - return env.Detect('linkloc') - else: - return 0 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/m4.py b/3rdParty/SCons/scons-local/SCons/Tool/m4.py deleted file mode 100644 index 1ce3eac..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/m4.py +++ /dev/null @@ -1,63 +0,0 @@ -"""SCons.Tool.m4 - -Tool-specific initialization for m4. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/m4.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add Builders and construction variables for m4 to an Environment.""" - M4Action = SCons.Action.Action('$M4COM', '$M4COMSTR') - bld = SCons.Builder.Builder(action = M4Action, src_suffix = '.m4') - - env['BUILDERS']['M4'] = bld - - # .m4 files might include other files, and it would be pretty hard - # to write a scanner for it, so let's just cd to the dir of the m4 - # file and run from there. - # The src_suffix setup is like so: file.c.m4 -> file.c, - # file.cpp.m4 -> file.cpp etc. - env['M4'] = 'm4' - env['M4FLAGS'] = SCons.Util.CLVar('-E') - env['M4COM'] = 'cd ${SOURCE.rsrcdir} && $M4 $M4FLAGS < ${SOURCE.file} > ${TARGET.abspath}' - -def exists(env): - return env.Detect('m4') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/masm.py b/3rdParty/SCons/scons-local/SCons/Tool/masm.py deleted file mode 100644 index b22a514..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/masm.py +++ /dev/null @@ -1,77 +0,0 @@ -"""SCons.Tool.masm - -Tool-specific initialization for the Microsoft Assembler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/masm.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Defaults -import SCons.Tool -import SCons.Util - -ASSuffixes = ['.s', '.asm', '.ASM'] -ASPPSuffixes = ['.spp', '.SPP', '.sx'] -if SCons.Util.case_sensitive_suffixes('.s', '.S'): - ASPPSuffixes.extend(['.S']) -else: - ASSuffixes.extend(['.S']) - -def generate(env): - """Add Builders and construction variables for masm to an Environment.""" - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - for suffix in ASSuffixes: - static_obj.add_action(suffix, SCons.Defaults.ASAction) - shared_obj.add_action(suffix, SCons.Defaults.ASAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - for suffix in ASPPSuffixes: - static_obj.add_action(suffix, SCons.Defaults.ASPPAction) - shared_obj.add_action(suffix, SCons.Defaults.ASPPAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - env['AS'] = 'ml' - env['ASFLAGS'] = SCons.Util.CLVar('/nologo') - env['ASPPFLAGS'] = '$ASFLAGS' - env['ASCOM'] = '$AS $ASFLAGS /c /Fo$TARGET $SOURCES' - env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c /Fo$TARGET $SOURCES' - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 - -def exists(env): - return env.Detect('ml') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/midl.py b/3rdParty/SCons/scons-local/SCons/Tool/midl.py deleted file mode 100644 index 4c69358..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/midl.py +++ /dev/null @@ -1,90 +0,0 @@ -"""SCons.Tool.midl - -Tool-specific initialization for midl (Microsoft IDL compiler). - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/midl.py 4043 2009/02/23 09:06:45 scons" - -import string - -import SCons.Action -import SCons.Builder -import SCons.Defaults -import SCons.Scanner.IDL -import SCons.Util - -from MSCommon import detect_msvs - -def midl_emitter(target, source, env): - """Produces a list of outputs from the MIDL compiler""" - base, ext = SCons.Util.splitext(str(target[0])) - tlb = target[0] - incl = base + '.h' - interface = base + '_i.c' - t = [tlb, incl, interface] - - midlcom = env['MIDLCOM'] - - if string.find(midlcom, '/proxy') != -1: - proxy = base + '_p.c' - t.append(proxy) - if string.find(midlcom, '/dlldata') != -1: - dlldata = base + '_data.c' - t.append(dlldata) - - return (t,source) - -idl_scanner = SCons.Scanner.IDL.IDLScan() - -midl_action = SCons.Action.Action('$MIDLCOM', '$MIDLCOMSTR') - -midl_builder = SCons.Builder.Builder(action = midl_action, - src_suffix = '.idl', - suffix='.tlb', - emitter = midl_emitter, - source_scanner = idl_scanner) - -def generate(env): - """Add Builders and construction variables for midl to an Environment.""" - - env['MIDL'] = 'MIDL.EXE' - env['MIDLFLAGS'] = SCons.Util.CLVar('/nologo') - env['MIDLCOM'] = '$MIDL $MIDLFLAGS /tlb ${TARGETS[0]} /h ${TARGETS[1]} /iid ${TARGETS[2]} /proxy ${TARGETS[3]} /dlldata ${TARGETS[4]} $SOURCE 2> NUL' - env['BUILDERS']['TypeLibrary'] = midl_builder - -def exists(env): - return detect_msvs() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/mingw.py b/3rdParty/SCons/scons-local/SCons/Tool/mingw.py deleted file mode 100644 index aab45bb..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/mingw.py +++ /dev/null @@ -1,159 +0,0 @@ -"""SCons.Tool.gcc - -Tool-specific initialization for MinGW (http://www.mingw.org/) - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/mingw.py 4043 2009/02/23 09:06:45 scons" - -import os -import os.path -import string - -import SCons.Action -import SCons.Builder -import SCons.Defaults -import SCons.Tool -import SCons.Util - -# This is what we search for to find mingw: -key_program = 'mingw32-gcc' - -def find(env): - # First search in the SCons path and then the OS path: - return env.WhereIs(key_program) or SCons.Util.WhereIs(key_program) - -def shlib_generator(target, source, env, for_signature): - cmd = SCons.Util.CLVar(['$SHLINK', '$SHLINKFLAGS']) - - dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX') - if dll: cmd.extend(['-o', dll]) - - cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS']) - - implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX') - if implib: cmd.append('-Wl,--out-implib,'+implib.get_string(for_signature)) - - def_target = env.FindIxes(target, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX') - insert_def = env.subst("$WINDOWS_INSERT_DEF") - if not insert_def in ['', '0', 0] and def_target: \ - cmd.append('-Wl,--output-def,'+def_target.get_string(for_signature)) - - return [cmd] - -def shlib_emitter(target, source, env): - dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX') - no_import_lib = env.get('no_import_lib', 0) - - if not dll: - raise SCons.Errors.UserError, "A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX") - - if not no_import_lib and \ - not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'): - - # Append an import library to the list of targets. - target.append(env.ReplaceIxes(dll, - 'SHLIBPREFIX', 'SHLIBSUFFIX', - 'LIBPREFIX', 'LIBSUFFIX')) - - # Append a def file target if there isn't already a def file target - # or a def file source. There is no option to disable def file - # target emitting, because I can't figure out why someone would ever - # want to turn it off. - def_source = env.FindIxes(source, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX') - def_target = env.FindIxes(target, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX') - if not def_source and not def_target: - target.append(env.ReplaceIxes(dll, - 'SHLIBPREFIX', 'SHLIBSUFFIX', - 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')) - - return (target, source) - - -shlib_action = SCons.Action.Action(shlib_generator, generator=1) - -res_action = SCons.Action.Action('$RCCOM', '$RCCOMSTR') - -res_builder = SCons.Builder.Builder(action=res_action, suffix='.o', - source_scanner=SCons.Tool.SourceFileScanner) -SCons.Tool.SourceFileScanner.add_scanner('.rc', SCons.Defaults.CScan) - -def generate(env): - mingw = find(env) - if mingw: - dir = os.path.dirname(mingw) - env.PrependENVPath('PATH', dir ) - - - # Most of mingw is the same as gcc and friends... - gnu_tools = ['gcc', 'g++', 'gnulink', 'ar', 'gas', 'm4'] - for tool in gnu_tools: - SCons.Tool.Tool(tool)(env) - - #... but a few things differ: - env['CC'] = 'gcc' - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') - env['CXX'] = 'g++' - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared') - env['SHLINKCOM'] = shlib_action - env['LDMODULECOM'] = shlib_action - env.Append(SHLIBEMITTER = [shlib_emitter]) - env['AS'] = 'as' - - env['WIN32DEFPREFIX'] = '' - env['WIN32DEFSUFFIX'] = '.def' - env['WINDOWSDEFPREFIX'] = '${WIN32DEFPREFIX}' - env['WINDOWSDEFSUFFIX'] = '${WIN32DEFSUFFIX}' - - env['SHOBJSUFFIX'] = '.o' - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 - - env['RC'] = 'windres' - env['RCFLAGS'] = SCons.Util.CLVar('') - env['RCINCFLAGS'] = '$( ${_concat(RCINCPREFIX, CPPPATH, RCINCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' - env['RCINCPREFIX'] = '--include-dir ' - env['RCINCSUFFIX'] = '' - env['RCCOM'] = '$RC $_CPPDEFFLAGS $RCINCFLAGS ${RCINCPREFIX} ${SOURCE.dir} $RCFLAGS -i $SOURCE -o $TARGET' - env['BUILDERS']['RES'] = res_builder - - # Some setting from the platform also have to be overridden: - env['OBJSUFFIX'] = '.o' - env['LIBPREFIX'] = 'lib' - env['LIBSUFFIX'] = '.a' - -def exists(env): - return find(env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/mslib.py b/3rdParty/SCons/scons-local/SCons/Tool/mslib.py deleted file mode 100644 index f76ac9d..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/mslib.py +++ /dev/null @@ -1,64 +0,0 @@ -"""SCons.Tool.mslib - -Tool-specific initialization for lib (MicroSoft library archiver). - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/mslib.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Defaults -import SCons.Tool -import SCons.Tool.msvs -import SCons.Tool.msvc -import SCons.Util - -from MSCommon import detect_msvs, merge_default_version - -def generate(env): - """Add Builders and construction variables for lib to an Environment.""" - SCons.Tool.createStaticLibBuilder(env) - - # Set-up ms tools paths for default version - merge_default_version(env) - - env['AR'] = 'lib' - env['ARFLAGS'] = SCons.Util.CLVar('/nologo') - env['ARCOM'] = "${TEMPFILE('$AR $ARFLAGS /OUT:$TARGET $SOURCES')}" - env['LIBPREFIX'] = '' - env['LIBSUFFIX'] = '.lib' - -def exists(env): - return detect_msvs() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/mslink.py b/3rdParty/SCons/scons-local/SCons/Tool/mslink.py deleted file mode 100644 index 1bad3c9..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/mslink.py +++ /dev/null @@ -1,265 +0,0 @@ -"""SCons.Tool.mslink - -Tool-specific initialization for the Microsoft linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/mslink.py 4043 2009/02/23 09:06:45 scons" - -import os.path - -import SCons.Action -import SCons.Defaults -import SCons.Errors -import SCons.Platform.win32 -import SCons.Tool -import SCons.Tool.msvc -import SCons.Tool.msvs -import SCons.Util - -from MSCommon import merge_default_version, detect_msvs - -def pdbGenerator(env, target, source, for_signature): - try: - return ['/PDB:%s' % target[0].attributes.pdb, '/DEBUG'] - except (AttributeError, IndexError): - return None - -def _dllTargets(target, source, env, for_signature, paramtp): - listCmd = [] - dll = env.FindIxes(target, '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp) - if dll: listCmd.append("/out:%s"%dll.get_string(for_signature)) - - implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX') - if implib: listCmd.append("/implib:%s"%implib.get_string(for_signature)) - - return listCmd - -def _dllSources(target, source, env, for_signature, paramtp): - listCmd = [] - - deffile = env.FindIxes(source, "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX") - for src in source: - # Check explicitly for a non-None deffile so that the __cmp__ - # method of the base SCons.Util.Proxy class used for some Node - # proxies doesn't try to use a non-existent __dict__ attribute. - if deffile and src == deffile: - # Treat this source as a .def file. - listCmd.append("/def:%s" % src.get_string(for_signature)) - else: - # Just treat it as a generic source file. - listCmd.append(src) - return listCmd - -def windowsShlinkTargets(target, source, env, for_signature): - return _dllTargets(target, source, env, for_signature, 'SHLIB') - -def windowsShlinkSources(target, source, env, for_signature): - return _dllSources(target, source, env, for_signature, 'SHLIB') - -def _windowsLdmodTargets(target, source, env, for_signature): - """Get targets for loadable modules.""" - return _dllTargets(target, source, env, for_signature, 'LDMODULE') - -def _windowsLdmodSources(target, source, env, for_signature): - """Get sources for loadable modules.""" - return _dllSources(target, source, env, for_signature, 'LDMODULE') - -def _dllEmitter(target, source, env, paramtp): - """Common implementation of dll emitter.""" - SCons.Tool.msvc.validate_vars(env) - - extratargets = [] - extrasources = [] - - dll = env.FindIxes(target, '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp) - no_import_lib = env.get('no_import_lib', 0) - - if not dll: - raise SCons.Errors.UserError, 'A shared library should have exactly one target with the suffix: %s' % env.subst('$%sSUFFIX' % paramtp) - - insert_def = env.subst("$WINDOWS_INSERT_DEF") - if not insert_def in ['', '0', 0] and \ - not env.FindIxes(source, "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX"): - - # append a def file to the list of sources - extrasources.append( - env.ReplaceIxes(dll, - '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp, - "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX")) - - version_num, suite = SCons.Tool.msvs.msvs_parse_version(env.get('MSVS_VERSION', '6.0')) - if version_num >= 8.0 and env.get('WINDOWS_INSERT_MANIFEST', 0): - # MSVC 8 automatically generates .manifest files that must be installed - extratargets.append( - env.ReplaceIxes(dll, - '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp, - "WINDOWSSHLIBMANIFESTPREFIX", "WINDOWSSHLIBMANIFESTSUFFIX")) - - if env.has_key('PDB') and env['PDB']: - pdb = env.arg2nodes('$PDB', target=target, source=source)[0] - extratargets.append(pdb) - target[0].attributes.pdb = pdb - - if not no_import_lib and \ - not env.FindIxes(target, "LIBPREFIX", "LIBSUFFIX"): - # Append an import library to the list of targets. - extratargets.append( - env.ReplaceIxes(dll, - '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp, - "LIBPREFIX", "LIBSUFFIX")) - # and .exp file is created if there are exports from a DLL - extratargets.append( - env.ReplaceIxes(dll, - '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp, - "WINDOWSEXPPREFIX", "WINDOWSEXPSUFFIX")) - - return (target+extratargets, source+extrasources) - -def windowsLibEmitter(target, source, env): - return _dllEmitter(target, source, env, 'SHLIB') - -def ldmodEmitter(target, source, env): - """Emitter for loadable modules. - - Loadable modules are identical to shared libraries on Windows, but building - them is subject to different parameters (LDMODULE*). - """ - return _dllEmitter(target, source, env, 'LDMODULE') - -def prog_emitter(target, source, env): - SCons.Tool.msvc.validate_vars(env) - - extratargets = [] - - exe = env.FindIxes(target, "PROGPREFIX", "PROGSUFFIX") - if not exe: - raise SCons.Errors.UserError, "An executable should have exactly one target with the suffix: %s" % env.subst("$PROGSUFFIX") - - version_num, suite = SCons.Tool.msvs.msvs_parse_version(env.get('MSVS_VERSION', '6.0')) - if version_num >= 8.0 and env.get('WINDOWS_INSERT_MANIFEST', 0): - # MSVC 8 automatically generates .manifest files that have to be installed - extratargets.append( - env.ReplaceIxes(exe, - "PROGPREFIX", "PROGSUFFIX", - "WINDOWSPROGMANIFESTPREFIX", "WINDOWSPROGMANIFESTSUFFIX")) - - if env.has_key('PDB') and env['PDB']: - pdb = env.arg2nodes('$PDB', target=target, source=source)[0] - extratargets.append(pdb) - target[0].attributes.pdb = pdb - - return (target+extratargets,source) - -def RegServerFunc(target, source, env): - if env.has_key('register') and env['register']: - ret = regServerAction([target[0]], [source[0]], env) - if ret: - raise SCons.Errors.UserError, "Unable to register %s" % target[0] - else: - print "Registered %s sucessfully" % target[0] - return ret - return 0 - -regServerAction = SCons.Action.Action("$REGSVRCOM", "$REGSVRCOMSTR") -regServerCheck = SCons.Action.Action(RegServerFunc, None) -shlibLinkAction = SCons.Action.Action('${TEMPFILE("$SHLINK $SHLINKFLAGS $_SHLINK_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_SHLINK_SOURCES")}') -compositeShLinkAction = shlibLinkAction + regServerCheck -ldmodLinkAction = SCons.Action.Action('${TEMPFILE("$LDMODULE $LDMODULEFLAGS $_LDMODULE_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_LDMODULE_SOURCES")}') -compositeLdmodAction = ldmodLinkAction + regServerCheck - -def generate(env): - """Add Builders and construction variables for ar to an Environment.""" - SCons.Tool.createSharedLibBuilder(env) - SCons.Tool.createProgBuilder(env) - - env['SHLINK'] = '$LINK' - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS /dll') - env['_SHLINK_TARGETS'] = windowsShlinkTargets - env['_SHLINK_SOURCES'] = windowsShlinkSources - env['SHLINKCOM'] = compositeShLinkAction - env.Append(SHLIBEMITTER = [windowsLibEmitter]) - env['LINK'] = 'link' - env['LINKFLAGS'] = SCons.Util.CLVar('/nologo') - env['_PDB'] = pdbGenerator - env['LINKCOM'] = '${TEMPFILE("$LINK $LINKFLAGS /OUT:$TARGET.windows $_LIBDIRFLAGS $_LIBFLAGS $_PDB $SOURCES.windows")}' - env.Append(PROGEMITTER = [prog_emitter]) - env['LIBDIRPREFIX']='/LIBPATH:' - env['LIBDIRSUFFIX']='' - env['LIBLINKPREFIX']='' - env['LIBLINKSUFFIX']='$LIBSUFFIX' - - env['WIN32DEFPREFIX'] = '' - env['WIN32DEFSUFFIX'] = '.def' - env['WIN32_INSERT_DEF'] = 0 - env['WINDOWSDEFPREFIX'] = '${WIN32DEFPREFIX}' - env['WINDOWSDEFSUFFIX'] = '${WIN32DEFSUFFIX}' - env['WINDOWS_INSERT_DEF'] = '${WIN32_INSERT_DEF}' - - env['WIN32EXPPREFIX'] = '' - env['WIN32EXPSUFFIX'] = '.exp' - env['WINDOWSEXPPREFIX'] = '${WIN32EXPPREFIX}' - env['WINDOWSEXPSUFFIX'] = '${WIN32EXPSUFFIX}' - - env['WINDOWSSHLIBMANIFESTPREFIX'] = '' - env['WINDOWSSHLIBMANIFESTSUFFIX'] = '${SHLIBSUFFIX}.manifest' - env['WINDOWSPROGMANIFESTPREFIX'] = '' - env['WINDOWSPROGMANIFESTSUFFIX'] = '${PROGSUFFIX}.manifest' - - env['REGSVRACTION'] = regServerCheck - env['REGSVR'] = os.path.join(SCons.Platform.win32.get_system_root(),'System32','regsvr32') - env['REGSVRFLAGS'] = '/s ' - env['REGSVRCOM'] = '$REGSVR $REGSVRFLAGS ${TARGET.windows}' - - # Set-up ms tools paths for default version - merge_default_version(env) - - # Loadable modules are on Windows the same as shared libraries, but they - # are subject to different build parameters (LDMODULE* variables). - # Therefore LDMODULE* variables correspond as much as possible to - # SHLINK*/SHLIB* ones. - SCons.Tool.createLoadableModuleBuilder(env) - env['LDMODULE'] = '$SHLINK' - env['LDMODULEPREFIX'] = '$SHLIBPREFIX' - env['LDMODULESUFFIX'] = '$SHLIBSUFFIX' - env['LDMODULEFLAGS'] = '$SHLINKFLAGS' - env['_LDMODULE_TARGETS'] = _windowsLdmodTargets - env['_LDMODULE_SOURCES'] = _windowsLdmodSources - env['LDMODULEEMITTER'] = [ldmodEmitter] - env['LDMODULECOM'] = compositeLdmodAction - -def exists(env): - return detect_msvs() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/mssdk.py b/3rdParty/SCons/scons-local/SCons/Tool/mssdk.py deleted file mode 100644 index 4277d58..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/mssdk.py +++ /dev/null @@ -1,64 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/mssdk.py 4043 2009/02/23 09:06:45 scons" - -"""engine.SCons.Tool.mssdk - -Tool-specific initialization for Microsoft SDKs, both Platform -SDKs and Windows SDKs. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -from SCons.Tool.MSCommon.sdk import detect_sdk, \ - set_default_sdk, \ - set_sdk_by_directory, \ - set_sdk_by_version - -def generate(env): - """Add construction variables for an MS SDK to an Environment.""" - if env.has_key('MSSDK_DIR'): - set_sdk_by_directory(env, env.subst('$MSSDK_DIR')) - return - - if env.has_key('MSSDK_VERSION'): - set_sdk_by_version(env, env.subst('$MSSDK_VERSION')) - return - - if env.has_key('MSVS_VERSION'): - set_default_sdk(env, env['MSVS_VERSION']) - - #print "No MSVS_VERSION: this is likely to be a bug" - return - -def exists(env): - return detect_sdk() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/msvc.py b/3rdParty/SCons/scons-local/SCons/Tool/msvc.py deleted file mode 100644 index bd29ed0..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/msvc.py +++ /dev/null @@ -1,260 +0,0 @@ -"""engine.SCons.Tool.msvc - -Tool-specific initialization for Microsoft Visual C/C++. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/msvc.py 4043 2009/02/23 09:06:45 scons" - -import os.path -import re -import string -import sys - -import SCons.Action -import SCons.Builder -import SCons.Errors -import SCons.Platform.win32 -import SCons.Tool -import SCons.Tool.msvs -import SCons.Util -import SCons.Warnings -import SCons.Scanner.RC - -from MSCommon import merge_default_version, detect_msvs - -CSuffixes = ['.c', '.C'] -CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++'] - -def validate_vars(env): - """Validate the PCH and PCHSTOP construction variables.""" - if env.has_key('PCH') and env['PCH']: - if not env.has_key('PCHSTOP'): - raise SCons.Errors.UserError, "The PCHSTOP construction must be defined if PCH is defined." - if not SCons.Util.is_String(env['PCHSTOP']): - raise SCons.Errors.UserError, "The PCHSTOP construction variable must be a string: %r"%env['PCHSTOP'] - -def pch_emitter(target, source, env): - """Adds the object file target.""" - - validate_vars(env) - - pch = None - obj = None - - for t in target: - if SCons.Util.splitext(str(t))[1] == '.pch': - pch = t - if SCons.Util.splitext(str(t))[1] == '.obj': - obj = t - - if not obj: - obj = SCons.Util.splitext(str(pch))[0]+'.obj' - - target = [pch, obj] # pch must be first, and obj second for the PCHCOM to work - - return (target, source) - -def object_emitter(target, source, env, parent_emitter): - """Sets up the PCH dependencies for an object file.""" - - validate_vars(env) - - parent_emitter(target, source, env) - - if env.has_key('PCH') and env['PCH']: - env.Depends(target, env['PCH']) - - return (target, source) - -def static_object_emitter(target, source, env): - return object_emitter(target, source, env, - SCons.Defaults.StaticObjectEmitter) - -def shared_object_emitter(target, source, env): - return object_emitter(target, source, env, - SCons.Defaults.SharedObjectEmitter) - -pch_action = SCons.Action.Action('$PCHCOM', '$PCHCOMSTR') -pch_builder = SCons.Builder.Builder(action=pch_action, suffix='.pch', - emitter=pch_emitter, - source_scanner=SCons.Tool.SourceFileScanner) - - -# Logic to build .rc files into .res files (resource files) -res_scanner = SCons.Scanner.RC.RCScan() -res_action = SCons.Action.Action('$RCCOM', '$RCCOMSTR') -res_builder = SCons.Builder.Builder(action=res_action, - src_suffix='.rc', - suffix='.res', - src_builder=[], - source_scanner=res_scanner) - -def msvc_batch_key(action, env, target, source): - """ - Returns a key to identify unique batches of sources for compilation. - - If batching is enabled (via the $MSVC_BATCH setting), then all - target+source pairs that use the same action, defined by the same - environment, and have the same target and source directories, will - be batched. - - Returning None specifies that the specified target+source should not - be batched with other compilations. - """ - b = env.subst('$MSVC_BATCH') - if b in (None, '', '0'): - # We're not using batching; return no key. - return None - t = target[0] - s = source[0] - if os.path.splitext(t.name)[0] != os.path.splitext(s.name)[0]: - # The base names are different, so this *must* be compiled - # separately; return no key. - return None - return (id(action), id(env), t.dir, s.dir) - -def msvc_output_flag(target, source, env, for_signature): - """ - Returns the correct /Fo flag for batching. - - If batching is disabled or there's only one source file, then we - return an /Fo string that specifies the target explicitly. Otherwise, - we return an /Fo string that just specifies the first target's - directory (where the Visual C/C++ compiler will put the .obj files). - """ - b = env.subst('$MSVC_BATCH') - if b in (None, '', '0') or len(source) == 1: - return '/Fo$TARGET' - else: - # The Visual C/C++ compiler requires a \ at the end of the /Fo - # option to indicate an output directory. We use os.sep here so - # that the test(s) for this can be run on non-Windows systems - # without having a hard-coded backslash mess up command-line - # argument parsing. - return '/Fo${TARGET.dir}' + os.sep - -CAction = SCons.Action.Action("$CCCOM", "$CCCOMSTR", - batch_key=msvc_batch_key, - targets='$CHANGED_TARGETS') -ShCAction = SCons.Action.Action("$SHCCCOM", "$SHCCCOMSTR", - batch_key=msvc_batch_key, - targets='$CHANGED_TARGETS') -CXXAction = SCons.Action.Action("$CXXCOM", "$CXXCOMSTR", - batch_key=msvc_batch_key, - targets='$CHANGED_TARGETS') -ShCXXAction = SCons.Action.Action("$SHCXXCOM", "$SHCXXCOMSTR", - batch_key=msvc_batch_key, - targets='$CHANGED_TARGETS') - -def generate(env): - """Add Builders and construction variables for MSVC++ to an Environment.""" - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - # TODO(batch): shouldn't reach in to cmdgen this way; necessary - # for now to bypass the checks in Builder.DictCmdGenerator.__call__() - # and allow .cc and .cpp to be compiled in the same command line. - static_obj.cmdgen.source_ext_match = False - shared_obj.cmdgen.source_ext_match = False - - for suffix in CSuffixes: - static_obj.add_action(suffix, CAction) - shared_obj.add_action(suffix, ShCAction) - static_obj.add_emitter(suffix, static_object_emitter) - shared_obj.add_emitter(suffix, shared_object_emitter) - - for suffix in CXXSuffixes: - static_obj.add_action(suffix, CXXAction) - shared_obj.add_action(suffix, ShCXXAction) - static_obj.add_emitter(suffix, static_object_emitter) - shared_obj.add_emitter(suffix, shared_object_emitter) - - env['CCPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Z7") or ""}']) - env['CCPCHFLAGS'] = SCons.Util.CLVar(['${(PCH and "/Yu%s /Fp%s"%(PCHSTOP or "",File(PCH))) or ""}']) - env['_MSVC_OUTPUT_FLAG'] = msvc_output_flag - env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $CCPCHFLAGS $CCPDBFLAGS' - env['CC'] = 'cl' - env['CCFLAGS'] = SCons.Util.CLVar('/nologo') - env['CFLAGS'] = SCons.Util.CLVar('') - env['CCCOM'] = '$CC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CFLAGS $CCFLAGS $_CCCOMCOM' - env['SHCC'] = '$CC' - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') - env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS') - env['SHCCCOM'] = '$SHCC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCFLAGS $SHCCFLAGS $_CCCOMCOM' - env['CXX'] = '$CC' - env['CXXFLAGS'] = SCons.Util.CLVar('$( /TP $)') - env['CXXCOM'] = '$CXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CXXFLAGS $CCFLAGS $_CCCOMCOM' - env['SHCXX'] = '$CXX' - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') - env['SHCXXCOM'] = '$SHCXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM' - env['CPPDEFPREFIX'] = '/D' - env['CPPDEFSUFFIX'] = '' - env['INCPREFIX'] = '/I' - env['INCSUFFIX'] = '' -# env.Append(OBJEMITTER = [static_object_emitter]) -# env.Append(SHOBJEMITTER = [shared_object_emitter]) - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 - - env['RC'] = 'rc' - env['RCFLAGS'] = SCons.Util.CLVar('') - env['RCSUFFIXES']=['.rc','.rc2'] - env['RCCOM'] = '$RC $_CPPDEFFLAGS $_CPPINCFLAGS $RCFLAGS /fo$TARGET $SOURCES' - env['BUILDERS']['RES'] = res_builder - env['OBJPREFIX'] = '' - env['OBJSUFFIX'] = '.obj' - env['SHOBJPREFIX'] = '$OBJPREFIX' - env['SHOBJSUFFIX'] = '$OBJSUFFIX' - - # Set-up ms tools paths for default version - merge_default_version(env) - - import mssdk - mssdk.generate(env) - - env['CFILESUFFIX'] = '.c' - env['CXXFILESUFFIX'] = '.cc' - - env['PCHPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Yd") or ""}']) - env['PCHCOM'] = '$CXX /Fo${TARGETS[1]} $CXXFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS $PCHPDBFLAGS' - env['BUILDERS']['PCH'] = pch_builder - - if not env.has_key('ENV'): - env['ENV'] = {} - if not env['ENV'].has_key('SystemRoot'): # required for dlls in the winsxs folders - env['ENV']['SystemRoot'] = SCons.Platform.win32.get_system_root() - -def exists(env): - return detect_msvs() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/msvs.py b/3rdParty/SCons/scons-local/SCons/Tool/msvs.py deleted file mode 100644 index 11e7dce..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/msvs.py +++ /dev/null @@ -1,1433 +0,0 @@ -"""SCons.Tool.msvs - -Tool-specific initialization for Microsoft Visual Studio project files. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/msvs.py 4043 2009/02/23 09:06:45 scons" - -import base64 -import hashlib -import ntpath -import os -import pickle -import re -import string -import sys - -import SCons.Builder -import SCons.Node.FS -import SCons.Platform.win32 -import SCons.Script.SConscript -import SCons.Util -import SCons.Warnings - -from MSCommon import detect_msvs, merge_default_version - -############################################################################## -# Below here are the classes and functions for generation of -# DSP/DSW/SLN/VCPROJ files. -############################################################################## - -def _hexdigest(s): - """Return a string as a string of hex characters. - """ - # NOTE: This routine is a method in the Python 2.0 interface - # of the native md5 module, but we want SCons to operate all - # the way back to at least Python 1.5.2, which doesn't have it. - h = string.hexdigits - r = '' - for c in s: - i = ord(c) - r = r + h[(i >> 4) & 0xF] + h[i & 0xF] - return r - -def xmlify(s): - s = string.replace(s, "&", "&") # do this first - s = string.replace(s, "'", "'") - s = string.replace(s, '"', """) - return s - -external_makefile_guid = '{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}' - -def _generateGUID(slnfile, name): - """This generates a dummy GUID for the sln file to use. It is - based on the MD5 signatures of the sln filename plus the name of - the project. It basically just needs to be unique, and not - change with each invocation.""" - m = hashlib.md5() - # Normalize the slnfile path to a Windows path (\ separators) so - # the generated file has a consistent GUID even if we generate - # it on a non-Windows platform. - m.update(ntpath.normpath(str(slnfile)) + str(name)) - # TODO(1.5) - #solution = m.hexdigest().upper() - solution = string.upper(_hexdigest(m.digest())) - # convert most of the signature to GUID form (discard the rest) - solution = "{" + solution[:8] + "-" + solution[8:12] + "-" + solution[12:16] + "-" + solution[16:20] + "-" + solution[20:32] + "}" - return solution - -version_re = re.compile(r'(\d+\.\d+)(.*)') - -def msvs_parse_version(s): - """ - Split a Visual Studio version, which may in fact be something like - '7.0Exp', into is version number (returned as a float) and trailing - "suite" portion. - """ - num, suite = version_re.match(s).groups() - return float(num), suite - -# This is how we re-invoke SCons from inside MSVS Project files. -# The problem is that we might have been invoked as either scons.bat -# or scons.py. If we were invoked directly as scons.py, then we could -# use sys.argv[0] to find the SCons "executable," but that doesn't work -# if we were invoked as scons.bat, which uses "python -c" to execute -# things and ends up with "-c" as sys.argv[0]. Consequently, we have -# the MSVS Project file invoke SCons the same way that scons.bat does, -# which works regardless of how we were invoked. -def getExecScriptMain(env, xml=None): - scons_home = env.get('SCONS_HOME') - if not scons_home and os.environ.has_key('SCONS_LIB_DIR'): - scons_home = os.environ['SCONS_LIB_DIR'] - if scons_home: - exec_script_main = "from os.path import join; import sys; sys.path = [ r'%s' ] + sys.path; import SCons.Script; SCons.Script.main()" % scons_home - else: - version = SCons.__version__ - exec_script_main = "from os.path import join; import sys; sys.path = [ join(sys.prefix, 'Lib', 'site-packages', 'scons-%(version)s'), join(sys.prefix, 'scons-%(version)s'), join(sys.prefix, 'Lib', 'site-packages', 'scons'), join(sys.prefix, 'scons') ] + sys.path; import SCons.Script; SCons.Script.main()" % locals() - if xml: - exec_script_main = xmlify(exec_script_main) - return exec_script_main - -# The string for the Python executable we tell the Project file to use -# is either sys.executable or, if an external PYTHON_ROOT environment -# variable exists, $(PYTHON)ROOT\\python.exe (generalized a little to -# pluck the actual executable name from sys.executable). -try: - python_root = os.environ['PYTHON_ROOT'] -except KeyError: - python_executable = sys.executable -else: - python_executable = os.path.join('$$(PYTHON_ROOT)', - os.path.split(sys.executable)[1]) - -class Config: - pass - -def splitFully(path): - dir, base = os.path.split(path) - if dir and dir != '' and dir != path: - return splitFully(dir)+[base] - if base == '': - return [] - return [base] - -def makeHierarchy(sources): - '''Break a list of files into a hierarchy; for each value, if it is a string, - then it is a file. If it is a dictionary, it is a folder. The string is - the original path of the file.''' - - hierarchy = {} - for file in sources: - path = splitFully(file) - if len(path): - dict = hierarchy - for part in path[:-1]: - if not dict.has_key(part): - dict[part] = {} - dict = dict[part] - dict[path[-1]] = file - #else: - # print 'Warning: failed to decompose path for '+str(file) - return hierarchy - -class _DSPGenerator: - """ Base class for DSP generators """ - - srcargs = [ - 'srcs', - 'incs', - 'localincs', - 'resources', - 'misc'] - - def __init__(self, dspfile, source, env): - self.dspfile = str(dspfile) - try: - get_abspath = dspfile.get_abspath - except AttributeError: - self.dspabs = os.path.abspath(dspfile) - else: - self.dspabs = get_abspath() - - if not env.has_key('variant'): - raise SCons.Errors.InternalError, \ - "You must specify a 'variant' argument (i.e. 'Debug' or " +\ - "'Release') to create an MSVSProject." - elif SCons.Util.is_String(env['variant']): - variants = [env['variant']] - elif SCons.Util.is_List(env['variant']): - variants = env['variant'] - - if not env.has_key('buildtarget') or env['buildtarget'] == None: - buildtarget = [''] - elif SCons.Util.is_String(env['buildtarget']): - buildtarget = [env['buildtarget']] - elif SCons.Util.is_List(env['buildtarget']): - if len(env['buildtarget']) != len(variants): - raise SCons.Errors.InternalError, \ - "Sizes of 'buildtarget' and 'variant' lists must be the same." - buildtarget = [] - for bt in env['buildtarget']: - if SCons.Util.is_String(bt): - buildtarget.append(bt) - else: - buildtarget.append(bt.get_abspath()) - else: - buildtarget = [env['buildtarget'].get_abspath()] - if len(buildtarget) == 1: - bt = buildtarget[0] - buildtarget = [] - for _ in variants: - buildtarget.append(bt) - - if not env.has_key('outdir') or env['outdir'] == None: - outdir = [''] - elif SCons.Util.is_String(env['outdir']): - outdir = [env['outdir']] - elif SCons.Util.is_List(env['outdir']): - if len(env['outdir']) != len(variants): - raise SCons.Errors.InternalError, \ - "Sizes of 'outdir' and 'variant' lists must be the same." - outdir = [] - for s in env['outdir']: - if SCons.Util.is_String(s): - outdir.append(s) - else: - outdir.append(s.get_abspath()) - else: - outdir = [env['outdir'].get_abspath()] - if len(outdir) == 1: - s = outdir[0] - outdir = [] - for v in variants: - outdir.append(s) - - if not env.has_key('runfile') or env['runfile'] == None: - runfile = buildtarget[-1:] - elif SCons.Util.is_String(env['runfile']): - runfile = [env['runfile']] - elif SCons.Util.is_List(env['runfile']): - if len(env['runfile']) != len(variants): - raise SCons.Errors.InternalError, \ - "Sizes of 'runfile' and 'variant' lists must be the same." - runfile = [] - for s in env['runfile']: - if SCons.Util.is_String(s): - runfile.append(s) - else: - runfile.append(s.get_abspath()) - else: - runfile = [env['runfile'].get_abspath()] - if len(runfile) == 1: - s = runfile[0] - runfile = [] - for v in variants: - runfile.append(s) - - self.sconscript = env['MSVSSCONSCRIPT'] - - cmdargs = env.get('cmdargs', '') - - self.env = env - - if self.env.has_key('name'): - self.name = self.env['name'] - else: - self.name = os.path.basename(SCons.Util.splitext(self.dspfile)[0]) - self.name = self.env.subst(self.name) - - sourcenames = [ - 'Source Files', - 'Header Files', - 'Local Headers', - 'Resource Files', - 'Other Files'] - - self.sources = {} - for n in sourcenames: - self.sources[n] = [] - - self.configs = {} - - self.nokeep = 0 - if env.has_key('nokeep') and env['variant'] != 0: - self.nokeep = 1 - - if self.nokeep == 0 and os.path.exists(self.dspabs): - self.Parse() - - for t in zip(sourcenames,self.srcargs): - if self.env.has_key(t[1]): - if SCons.Util.is_List(self.env[t[1]]): - for i in self.env[t[1]]: - if not i in self.sources[t[0]]: - self.sources[t[0]].append(i) - else: - if not self.env[t[1]] in self.sources[t[0]]: - self.sources[t[0]].append(self.env[t[1]]) - - for n in sourcenames: - # TODO(1.5): - #self.sources[n].sort(lambda a, b: cmp(a.lower(), b.lower())) - self.sources[n].sort(lambda a, b: cmp(string.lower(a), string.lower(b))) - - def AddConfig(self, variant, buildtarget, outdir, runfile, cmdargs, dspfile=dspfile): - config = Config() - config.buildtarget = buildtarget - config.outdir = outdir - config.cmdargs = cmdargs - config.runfile = runfile - - match = re.match('(.*)\|(.*)', variant) - if match: - config.variant = match.group(1) - config.platform = match.group(2) - else: - config.variant = variant - config.platform = 'Win32' - - self.configs[variant] = config - print "Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dspfile) + "'" - - for i in range(len(variants)): - AddConfig(self, variants[i], buildtarget[i], outdir[i], runfile[i], cmdargs) - - self.platforms = [] - for key in self.configs.keys(): - platform = self.configs[key].platform - if not platform in self.platforms: - self.platforms.append(platform) - - def Build(self): - pass - -V6DSPHeader = """\ -# Microsoft Developer Studio Project File - Name="%(name)s" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) External Target" 0x0106 - -CFG=%(name)s - Win32 %(confkey)s -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "%(name)s.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "%(name)s.mak" CFG="%(name)s - Win32 %(confkey)s" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -""" - -class _GenerateV6DSP(_DSPGenerator): - """Generates a Project file for MSVS 6.0""" - - def PrintHeader(self): - # pick a default config - confkeys = self.configs.keys() - confkeys.sort() - - name = self.name - confkey = confkeys[0] - - self.file.write(V6DSPHeader % locals()) - - for kind in confkeys: - self.file.write('!MESSAGE "%s - Win32 %s" (based on "Win32 (x86) External Target")\n' % (name, kind)) - - self.file.write('!MESSAGE \n\n') - - def PrintProject(self): - name = self.name - self.file.write('# Begin Project\n' - '# PROP AllowPerConfigDependencies 0\n' - '# PROP Scc_ProjName ""\n' - '# PROP Scc_LocalPath ""\n\n') - - first = 1 - confkeys = self.configs.keys() - confkeys.sort() - for kind in confkeys: - outdir = self.configs[kind].outdir - buildtarget = self.configs[kind].buildtarget - if first == 1: - self.file.write('!IF "$(CFG)" == "%s - Win32 %s"\n\n' % (name, kind)) - first = 0 - else: - self.file.write('\n!ELSEIF "$(CFG)" == "%s - Win32 %s"\n\n' % (name, kind)) - - env_has_buildtarget = self.env.has_key('MSVSBUILDTARGET') - if not env_has_buildtarget: - self.env['MSVSBUILDTARGET'] = buildtarget - - # have to write this twice, once with the BASE settings, and once without - for base in ("BASE ",""): - self.file.write('# PROP %sUse_MFC 0\n' - '# PROP %sUse_Debug_Libraries ' % (base, base)) - # TODO(1.5): - #if kind.lower().find('debug') < 0: - if string.find(string.lower(kind), 'debug') < 0: - self.file.write('0\n') - else: - self.file.write('1\n') - self.file.write('# PROP %sOutput_Dir "%s"\n' - '# PROP %sIntermediate_Dir "%s"\n' % (base,outdir,base,outdir)) - cmd = 'echo Starting SCons && ' + self.env.subst('$MSVSBUILDCOM', 1) - self.file.write('# PROP %sCmd_Line "%s"\n' - '# PROP %sRebuild_Opt "-c && %s"\n' - '# PROP %sTarget_File "%s"\n' - '# PROP %sBsc_Name ""\n' - '# PROP %sTarget_Dir ""\n'\ - %(base,cmd,base,cmd,base,buildtarget,base,base)) - - if not env_has_buildtarget: - del self.env['MSVSBUILDTARGET'] - - self.file.write('\n!ENDIF\n\n' - '# Begin Target\n\n') - for kind in confkeys: - self.file.write('# Name "%s - Win32 %s"\n' % (name,kind)) - self.file.write('\n') - first = 0 - for kind in confkeys: - if first == 0: - self.file.write('!IF "$(CFG)" == "%s - Win32 %s"\n\n' % (name,kind)) - first = 1 - else: - self.file.write('!ELSEIF "$(CFG)" == "%s - Win32 %s"\n\n' % (name,kind)) - self.file.write('!ENDIF \n\n') - self.PrintSourceFiles() - self.file.write('# End Target\n' - '# End Project\n') - - if self.nokeep == 0: - # now we pickle some data and add it to the file -- MSDEV will ignore it. - pdata = pickle.dumps(self.configs,1) - pdata = base64.encodestring(pdata) - self.file.write(pdata + '\n') - pdata = pickle.dumps(self.sources,1) - pdata = base64.encodestring(pdata) - self.file.write(pdata + '\n') - - def PrintSourceFiles(self): - categories = {'Source Files': 'cpp|c|cxx|l|y|def|odl|idl|hpj|bat', - 'Header Files': 'h|hpp|hxx|hm|inl', - 'Local Headers': 'h|hpp|hxx|hm|inl', - 'Resource Files': 'r|rc|ico|cur|bmp|dlg|rc2|rct|bin|cnt|rtf|gif|jpg|jpeg|jpe', - 'Other Files': ''} - - cats = categories.keys() - # TODO(1.5): - #cats.sort(lambda a, b: cmp(a.lower(), b.lower())) - cats.sort(lambda a, b: cmp(string.lower(a), string.lower(b))) - for kind in cats: - if not self.sources[kind]: - continue # skip empty groups - - self.file.write('# Begin Group "' + kind + '"\n\n') - # TODO(1.5) - #typelist = categories[kind].replace('|', ';') - typelist = string.replace(categories[kind], '|', ';') - self.file.write('# PROP Default_Filter "' + typelist + '"\n') - - for file in self.sources[kind]: - file = os.path.normpath(file) - self.file.write('# Begin Source File\n\n' - 'SOURCE="' + file + '"\n' - '# End Source File\n') - self.file.write('# End Group\n') - - # add the SConscript file outside of the groups - self.file.write('# Begin Source File\n\n' - 'SOURCE="' + str(self.sconscript) + '"\n' - '# End Source File\n') - - def Parse(self): - try: - dspfile = open(self.dspabs,'r') - except IOError: - return # doesn't exist yet, so can't add anything to configs. - - line = dspfile.readline() - while line: - # TODO(1.5): - #if line.find("# End Project") > -1: - if string.find(line, "# End Project") > -1: - break - line = dspfile.readline() - - line = dspfile.readline() - datas = line - while line and line != '\n': - line = dspfile.readline() - datas = datas + line - - # OK, we've found our little pickled cache of data. - try: - datas = base64.decodestring(datas) - data = pickle.loads(datas) - except KeyboardInterrupt: - raise - except: - return # unable to unpickle any data for some reason - - self.configs.update(data) - - data = None - line = dspfile.readline() - datas = line - while line and line != '\n': - line = dspfile.readline() - datas = datas + line - - # OK, we've found our little pickled cache of data. - # it has a "# " in front of it, so we strip that. - try: - datas = base64.decodestring(datas) - data = pickle.loads(datas) - except KeyboardInterrupt: - raise - except: - return # unable to unpickle any data for some reason - - self.sources.update(data) - - def Build(self): - try: - self.file = open(self.dspabs,'w') - except IOError, detail: - raise SCons.Errors.InternalError, 'Unable to open "' + self.dspabs + '" for writing:' + str(detail) - else: - self.PrintHeader() - self.PrintProject() - self.file.close() - -V7DSPHeader = """\ -<?xml version="1.0" encoding = "%(encoding)s"?> -<VisualStudioProject -\tProjectType="Visual C++" -\tVersion="%(versionstr)s" -\tName="%(name)s" -%(scc_attrs)s -\tKeyword="MakeFileProj"> -""" - -V7DSPConfiguration = """\ -\t\t<Configuration -\t\t\tName="%(variant)s|%(platform)s" -\t\t\tOutputDirectory="%(outdir)s" -\t\t\tIntermediateDirectory="%(outdir)s" -\t\t\tConfigurationType="0" -\t\t\tUseOfMFC="0" -\t\t\tATLMinimizesCRunTimeLibraryUsage="FALSE"> -\t\t\t<Tool -\t\t\t\tName="VCNMakeTool" -\t\t\t\tBuildCommandLine="%(buildcmd)s" -\t\t\t\tCleanCommandLine="%(cleancmd)s" -\t\t\t\tRebuildCommandLine="%(rebuildcmd)s" -\t\t\t\tOutput="%(runfile)s"/> -\t\t</Configuration> -""" - -V8DSPHeader = """\ -<?xml version="1.0" encoding="%(encoding)s"?> -<VisualStudioProject -\tProjectType="Visual C++" -\tVersion="%(versionstr)s" -\tName="%(name)s" -%(scc_attrs)s -\tRootNamespace="%(name)s" -\tKeyword="MakeFileProj"> -""" - -V8DSPConfiguration = """\ -\t\t<Configuration -\t\t\tName="%(variant)s|%(platform)s" -\t\t\tConfigurationType="0" -\t\t\tUseOfMFC="0" -\t\t\tATLMinimizesCRunTimeLibraryUsage="false" -\t\t\t> -\t\t\t<Tool -\t\t\t\tName="VCNMakeTool" -\t\t\t\tBuildCommandLine="%(buildcmd)s" -\t\t\t\tReBuildCommandLine="%(rebuildcmd)s" -\t\t\t\tCleanCommandLine="%(cleancmd)s" -\t\t\t\tOutput="%(runfile)s" -\t\t\t\tPreprocessorDefinitions="%(preprocdefs)s" -\t\t\t\tIncludeSearchPath="%(includepath)s" -\t\t\t\tForcedIncludes="" -\t\t\t\tAssemblySearchPath="" -\t\t\t\tForcedUsingAssemblies="" -\t\t\t\tCompileAsManaged="" -\t\t\t/> -\t\t</Configuration> -""" -class _GenerateV7DSP(_DSPGenerator): - """Generates a Project file for MSVS .NET""" - - def __init__(self, dspfile, source, env): - _DSPGenerator.__init__(self, dspfile, source, env) - self.version = env['MSVS_VERSION'] - self.version_num, self.suite = msvs_parse_version(self.version) - if self.version_num >= 8.0: - self.versionstr = '8.00' - self.dspheader = V8DSPHeader - self.dspconfiguration = V8DSPConfiguration - else: - if self.version_num >= 7.1: - self.versionstr = '7.10' - else: - self.versionstr = '7.00' - self.dspheader = V7DSPHeader - self.dspconfiguration = V7DSPConfiguration - self.file = None - - def PrintHeader(self): - env = self.env - versionstr = self.versionstr - name = self.name - encoding = self.env.subst('$MSVSENCODING') - scc_provider = env.get('MSVS_SCC_PROVIDER', '') - scc_project_name = env.get('MSVS_SCC_PROJECT_NAME', '') - scc_aux_path = env.get('MSVS_SCC_AUX_PATH', '') - scc_local_path = env.get('MSVS_SCC_LOCAL_PATH', '') - project_guid = env.get('MSVS_PROJECT_GUID', '') - if self.version_num >= 8.0 and not project_guid: - project_guid = _generateGUID(self.dspfile, '') - if scc_provider != '': - scc_attrs = ('\tProjectGUID="%s"\n' - '\tSccProjectName="%s"\n' - '\tSccAuxPath="%s"\n' - '\tSccLocalPath="%s"\n' - '\tSccProvider="%s"' % (project_guid, scc_project_name, scc_aux_path, scc_local_path, scc_provider)) - else: - scc_attrs = ('\tProjectGUID="%s"\n' - '\tSccProjectName="%s"\n' - '\tSccLocalPath="%s"' % (project_guid, scc_project_name, scc_local_path)) - - self.file.write(self.dspheader % locals()) - - self.file.write('\t<Platforms>\n') - for platform in self.platforms: - self.file.write( - '\t\t<Platform\n' - '\t\t\tName="%s"/>\n' % platform) - self.file.write('\t</Platforms>\n') - - if self.version_num >= 8.0: - self.file.write('\t<ToolFiles>\n' - '\t</ToolFiles>\n') - - def PrintProject(self): - self.file.write('\t<Configurations>\n') - - confkeys = self.configs.keys() - confkeys.sort() - for kind in confkeys: - variant = self.configs[kind].variant - platform = self.configs[kind].platform - outdir = self.configs[kind].outdir - buildtarget = self.configs[kind].buildtarget - runfile = self.configs[kind].runfile - cmdargs = self.configs[kind].cmdargs - - env_has_buildtarget = self.env.has_key('MSVSBUILDTARGET') - if not env_has_buildtarget: - self.env['MSVSBUILDTARGET'] = buildtarget - - starting = 'echo Starting SCons && ' - if cmdargs: - cmdargs = ' ' + cmdargs - else: - cmdargs = '' - buildcmd = xmlify(starting + self.env.subst('$MSVSBUILDCOM', 1) + cmdargs) - rebuildcmd = xmlify(starting + self.env.subst('$MSVSREBUILDCOM', 1) + cmdargs) - cleancmd = xmlify(starting + self.env.subst('$MSVSCLEANCOM', 1) + cmdargs) - - # TODO(1.5) - #preprocdefs = xmlify(';'.join(self.env.get('CPPDEFINES', []))) - #includepath = xmlify(';'.join(self.env.get('CPPPATH', []))) - preprocdefs = xmlify(string.join(self.env.get('CPPDEFINES', []), ';')) - includepath = xmlify(string.join(self.env.get('CPPPATH', []), ';')) - - if not env_has_buildtarget: - del self.env['MSVSBUILDTARGET'] - - self.file.write(self.dspconfiguration % locals()) - - self.file.write('\t</Configurations>\n') - - if self.version_num >= 7.1: - self.file.write('\t<References>\n' - '\t</References>\n') - - self.PrintSourceFiles() - - self.file.write('</VisualStudioProject>\n') - - if self.nokeep == 0: - # now we pickle some data and add it to the file -- MSDEV will ignore it. - pdata = pickle.dumps(self.configs,1) - pdata = base64.encodestring(pdata) - self.file.write('<!-- SCons Data:\n' + pdata + '\n') - pdata = pickle.dumps(self.sources,1) - pdata = base64.encodestring(pdata) - self.file.write(pdata + '-->\n') - - def printSources(self, hierarchy, commonprefix): - sorteditems = hierarchy.items() - # TODO(1.5): - #sorteditems.sort(lambda a, b: cmp(a[0].lower(), b[0].lower())) - sorteditems.sort(lambda a, b: cmp(string.lower(a[0]), string.lower(b[0]))) - - # First folders, then files - for key, value in sorteditems: - if SCons.Util.is_Dict(value): - self.file.write('\t\t\t<Filter\n' - '\t\t\t\tName="%s"\n' - '\t\t\t\tFilter="">\n' % (key)) - self.printSources(value, commonprefix) - self.file.write('\t\t\t</Filter>\n') - - for key, value in sorteditems: - if SCons.Util.is_String(value): - file = value - if commonprefix: - file = os.path.join(commonprefix, value) - file = os.path.normpath(file) - self.file.write('\t\t\t<File\n' - '\t\t\t\tRelativePath="%s">\n' - '\t\t\t</File>\n' % (file)) - - def PrintSourceFiles(self): - categories = {'Source Files': 'cpp;c;cxx;l;y;def;odl;idl;hpj;bat', - 'Header Files': 'h;hpp;hxx;hm;inl', - 'Local Headers': 'h;hpp;hxx;hm;inl', - 'Resource Files': 'r;rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe', - 'Other Files': ''} - - self.file.write('\t<Files>\n') - - cats = categories.keys() - # TODO(1.5) - #cats.sort(lambda a, b: cmp(a.lower(), b.lower())) - cats.sort(lambda a, b: cmp(string.lower(a), string.lower(b))) - cats = filter(lambda k, s=self: s.sources[k], cats) - for kind in cats: - if len(cats) > 1: - self.file.write('\t\t<Filter\n' - '\t\t\tName="%s"\n' - '\t\t\tFilter="%s">\n' % (kind, categories[kind])) - - sources = self.sources[kind] - - # First remove any common prefix - commonprefix = None - if len(sources) > 1: - s = map(os.path.normpath, sources) - # take the dirname because the prefix may include parts - # of the filenames (e.g. if you have 'dir\abcd' and - # 'dir\acde' then the cp will be 'dir\a' ) - cp = os.path.dirname( os.path.commonprefix(s) ) - if cp and s[0][len(cp)] == os.sep: - # +1 because the filename starts after the separator - sources = map(lambda s, l=len(cp)+1: s[l:], sources) - commonprefix = cp - elif len(sources) == 1: - commonprefix = os.path.dirname( sources[0] ) - sources[0] = os.path.basename( sources[0] ) - - hierarchy = makeHierarchy(sources) - self.printSources(hierarchy, commonprefix=commonprefix) - - if len(cats)>1: - self.file.write('\t\t</Filter>\n') - - # add the SConscript file outside of the groups - self.file.write('\t\t<File\n' - '\t\t\tRelativePath="%s">\n' - '\t\t</File>\n' % str(self.sconscript)) - - self.file.write('\t</Files>\n' - '\t<Globals>\n' - '\t</Globals>\n') - - def Parse(self): - try: - dspfile = open(self.dspabs,'r') - except IOError: - return # doesn't exist yet, so can't add anything to configs. - - line = dspfile.readline() - while line: - # TODO(1.5) - #if line.find('<!-- SCons Data:') > -1: - if string.find(line, '<!-- SCons Data:') > -1: - break - line = dspfile.readline() - - line = dspfile.readline() - datas = line - while line and line != '\n': - line = dspfile.readline() - datas = datas + line - - # OK, we've found our little pickled cache of data. - try: - datas = base64.decodestring(datas) - data = pickle.loads(datas) - except KeyboardInterrupt: - raise - except: - return # unable to unpickle any data for some reason - - self.configs.update(data) - - data = None - line = dspfile.readline() - datas = line - while line and line != '\n': - line = dspfile.readline() - datas = datas + line - - # OK, we've found our little pickled cache of data. - try: - datas = base64.decodestring(datas) - data = pickle.loads(datas) - except KeyboardInterrupt: - raise - except: - return # unable to unpickle any data for some reason - - self.sources.update(data) - - def Build(self): - try: - self.file = open(self.dspabs,'w') - except IOError, detail: - raise SCons.Errors.InternalError, 'Unable to open "' + self.dspabs + '" for writing:' + str(detail) - else: - self.PrintHeader() - self.PrintProject() - self.file.close() - -class _DSWGenerator: - """ Base class for DSW generators """ - def __init__(self, dswfile, source, env): - self.dswfile = os.path.normpath(str(dswfile)) - self.env = env - - if not env.has_key('projects'): - raise SCons.Errors.UserError, \ - "You must specify a 'projects' argument to create an MSVSSolution." - projects = env['projects'] - if not SCons.Util.is_List(projects): - raise SCons.Errors.InternalError, \ - "The 'projects' argument must be a list of nodes." - projects = SCons.Util.flatten(projects) - if len(projects) < 1: - raise SCons.Errors.UserError, \ - "You must specify at least one project to create an MSVSSolution." - self.dspfiles = map(str, projects) - - if self.env.has_key('name'): - self.name = self.env['name'] - else: - self.name = os.path.basename(SCons.Util.splitext(self.dswfile)[0]) - self.name = self.env.subst(self.name) - - def Build(self): - pass - -class _GenerateV7DSW(_DSWGenerator): - """Generates a Solution file for MSVS .NET""" - def __init__(self, dswfile, source, env): - _DSWGenerator.__init__(self, dswfile, source, env) - - self.file = None - self.version = self.env['MSVS_VERSION'] - self.version_num, self.suite = msvs_parse_version(self.version) - self.versionstr = '7.00' - if self.version_num >= 8.0: - self.versionstr = '9.00' - elif self.version_num >= 7.1: - self.versionstr = '8.00' - if self.version_num >= 8.0: - self.versionstr = '9.00' - - if env.has_key('slnguid') and env['slnguid']: - self.slnguid = env['slnguid'] - else: - self.slnguid = _generateGUID(dswfile, self.name) - - self.configs = {} - - self.nokeep = 0 - if env.has_key('nokeep') and env['variant'] != 0: - self.nokeep = 1 - - if self.nokeep == 0 and os.path.exists(self.dswfile): - self.Parse() - - def AddConfig(self, variant, dswfile=dswfile): - config = Config() - - match = re.match('(.*)\|(.*)', variant) - if match: - config.variant = match.group(1) - config.platform = match.group(2) - else: - config.variant = variant - config.platform = 'Win32' - - self.configs[variant] = config - print "Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dswfile) + "'" - - if not env.has_key('variant'): - raise SCons.Errors.InternalError, \ - "You must specify a 'variant' argument (i.e. 'Debug' or " +\ - "'Release') to create an MSVS Solution File." - elif SCons.Util.is_String(env['variant']): - AddConfig(self, env['variant']) - elif SCons.Util.is_List(env['variant']): - for variant in env['variant']: - AddConfig(self, variant) - - self.platforms = [] - for key in self.configs.keys(): - platform = self.configs[key].platform - if not platform in self.platforms: - self.platforms.append(platform) - - def Parse(self): - try: - dswfile = open(self.dswfile,'r') - except IOError: - return # doesn't exist yet, so can't add anything to configs. - - line = dswfile.readline() - while line: - if line[:9] == "EndGlobal": - break - line = dswfile.readline() - - line = dswfile.readline() - datas = line - while line: - line = dswfile.readline() - datas = datas + line - - # OK, we've found our little pickled cache of data. - try: - datas = base64.decodestring(datas) - data = pickle.loads(datas) - except KeyboardInterrupt: - raise - except: - return # unable to unpickle any data for some reason - - self.configs.update(data) - - def PrintSolution(self): - """Writes a solution file""" - self.file.write('Microsoft Visual Studio Solution File, Format Version %s\n' % self.versionstr ) - if self.version_num >= 8.0: - self.file.write('# Visual Studio 2005\n') - for p in self.dspfiles: - name = os.path.basename(p) - base, suffix = SCons.Util.splitext(name) - if suffix == '.vcproj': - name = base - guid = _generateGUID(p, '') - self.file.write('Project("%s") = "%s", "%s", "%s"\n' - % ( external_makefile_guid, name, p, guid ) ) - if self.version_num >= 7.1 and self.version_num < 8.0: - self.file.write('\tProjectSection(ProjectDependencies) = postProject\n' - '\tEndProjectSection\n') - self.file.write('EndProject\n') - - self.file.write('Global\n') - - env = self.env - if env.has_key('MSVS_SCC_PROVIDER'): - dspfile_base = os.path.basename(self.dspfile) - slnguid = self.slnguid - scc_provider = env.get('MSVS_SCC_PROVIDER', '') - scc_provider = string.replace(scc_provider, ' ', r'\u0020') - scc_project_name = env.get('MSVS_SCC_PROJECT_NAME', '') - # scc_aux_path = env.get('MSVS_SCC_AUX_PATH', '') - scc_local_path = env.get('MSVS_SCC_LOCAL_PATH', '') - scc_project_base_path = env.get('MSVS_SCC_PROJECT_BASE_PATH', '') - # project_guid = env.get('MSVS_PROJECT_GUID', '') - - self.file.write('\tGlobalSection(SourceCodeControl) = preSolution\n' - '\t\tSccNumberOfProjects = 2\n' - '\t\tSccProjectUniqueName0 = %(dspfile_base)s\n' - '\t\tSccLocalPath0 = %(scc_local_path)s\n' - '\t\tCanCheckoutShared = true\n' - '\t\tSccProjectFilePathRelativizedFromConnection0 = %(scc_project_base_path)s\n' - '\t\tSccProjectName1 = %(scc_project_name)s\n' - '\t\tSccLocalPath1 = %(scc_local_path)s\n' - '\t\tSccProvider1 = %(scc_provider)s\n' - '\t\tCanCheckoutShared = true\n' - '\t\tSccProjectFilePathRelativizedFromConnection1 = %(scc_project_base_path)s\n' - '\t\tSolutionUniqueID = %(slnguid)s\n' - '\tEndGlobalSection\n' % locals()) - - if self.version_num >= 8.0: - self.file.write('\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n') - else: - self.file.write('\tGlobalSection(SolutionConfiguration) = preSolution\n') - - confkeys = self.configs.keys() - confkeys.sort() - cnt = 0 - for name in confkeys: - variant = self.configs[name].variant - platform = self.configs[name].platform - if self.version_num >= 8.0: - self.file.write('\t\t%s|%s = %s|%s\n' % (variant, platform, variant, platform)) - else: - self.file.write('\t\tConfigName.%d = %s\n' % (cnt, variant)) - cnt = cnt + 1 - self.file.write('\tEndGlobalSection\n') - if self.version_num < 7.1: - self.file.write('\tGlobalSection(ProjectDependencies) = postSolution\n' - '\tEndGlobalSection\n') - if self.version_num >= 8.0: - self.file.write('\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n') - else: - self.file.write('\tGlobalSection(ProjectConfiguration) = postSolution\n') - - for name in confkeys: - variant = self.configs[name].variant - platform = self.configs[name].platform - if self.version_num >= 8.0: - for p in self.dspfiles: - guid = _generateGUID(p, '') - self.file.write('\t\t%s.%s|%s.ActiveCfg = %s|%s\n' - '\t\t%s.%s|%s.Build.0 = %s|%s\n' % (guid,variant,platform,variant,platform,guid,variant,platform,variant,platform)) - else: - for p in self.dspfiles: - guid = _generateGUID(p, '') - self.file.write('\t\t%s.%s.ActiveCfg = %s|%s\n' - '\t\t%s.%s.Build.0 = %s|%s\n' %(guid,variant,variant,platform,guid,variant,variant,platform)) - - self.file.write('\tEndGlobalSection\n') - - if self.version_num >= 8.0: - self.file.write('\tGlobalSection(SolutionProperties) = preSolution\n' - '\t\tHideSolutionNode = FALSE\n' - '\tEndGlobalSection\n') - else: - self.file.write('\tGlobalSection(ExtensibilityGlobals) = postSolution\n' - '\tEndGlobalSection\n' - '\tGlobalSection(ExtensibilityAddIns) = postSolution\n' - '\tEndGlobalSection\n') - self.file.write('EndGlobal\n') - if self.nokeep == 0: - pdata = pickle.dumps(self.configs,1) - pdata = base64.encodestring(pdata) - self.file.write(pdata + '\n') - - def Build(self): - try: - self.file = open(self.dswfile,'w') - except IOError, detail: - raise SCons.Errors.InternalError, 'Unable to open "' + self.dswfile + '" for writing:' + str(detail) - else: - self.PrintSolution() - self.file.close() - -V6DSWHeader = """\ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "%(name)s"="%(dspfile)s" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### -""" - -class _GenerateV6DSW(_DSWGenerator): - """Generates a Workspace file for MSVS 6.0""" - - def PrintWorkspace(self): - """ writes a DSW file """ - name = self.name - dspfile = self.dspfiles[0] - self.file.write(V6DSWHeader % locals()) - - def Build(self): - try: - self.file = open(self.dswfile,'w') - except IOError, detail: - raise SCons.Errors.InternalError, 'Unable to open "' + self.dswfile + '" for writing:' + str(detail) - else: - self.PrintWorkspace() - self.file.close() - - -def GenerateDSP(dspfile, source, env): - """Generates a Project file based on the version of MSVS that is being used""" - - version_num = 6.0 - if env.has_key('MSVS_VERSION'): - version_num, suite = msvs_parse_version(env['MSVS_VERSION']) - if version_num >= 7.0: - g = _GenerateV7DSP(dspfile, source, env) - g.Build() - else: - g = _GenerateV6DSP(dspfile, source, env) - g.Build() - -def GenerateDSW(dswfile, source, env): - """Generates a Solution/Workspace file based on the version of MSVS that is being used""" - - version_num = 6.0 - if env.has_key('MSVS_VERSION'): - version_num, suite = msvs_parse_version(env['MSVS_VERSION']) - if version_num >= 7.0: - g = _GenerateV7DSW(dswfile, source, env) - g.Build() - else: - g = _GenerateV6DSW(dswfile, source, env) - g.Build() - - -############################################################################## -# Above here are the classes and functions for generation of -# DSP/DSW/SLN/VCPROJ files. -############################################################################## - -def GetMSVSProjectSuffix(target, source, env, for_signature): - return env['MSVS']['PROJECTSUFFIX'] - -def GetMSVSSolutionSuffix(target, source, env, for_signature): - return env['MSVS']['SOLUTIONSUFFIX'] - -def GenerateProject(target, source, env): - # generate the dsp file, according to the version of MSVS. - builddspfile = target[0] - dspfile = builddspfile.srcnode() - - # this detects whether or not we're using a VariantDir - if not dspfile is builddspfile: - try: - bdsp = open(str(builddspfile), "w+") - except IOError, detail: - print 'Unable to open "' + str(dspfile) + '" for writing:',detail,'\n' - raise - - bdsp.write("This is just a placeholder file.\nThe real project file is here:\n%s\n" % dspfile.get_abspath()) - - GenerateDSP(dspfile, source, env) - - if env.get('auto_build_solution', 1): - builddswfile = target[1] - dswfile = builddswfile.srcnode() - - if not dswfile is builddswfile: - - try: - bdsw = open(str(builddswfile), "w+") - except IOError, detail: - print 'Unable to open "' + str(dspfile) + '" for writing:',detail,'\n' - raise - - bdsw.write("This is just a placeholder file.\nThe real workspace file is here:\n%s\n" % dswfile.get_abspath()) - - GenerateDSW(dswfile, source, env) - -def GenerateSolution(target, source, env): - GenerateDSW(target[0], source, env) - -def projectEmitter(target, source, env): - """Sets up the DSP dependencies.""" - - # todo: Not sure what sets source to what user has passed as target, - # but this is what happens. When that is fixed, we also won't have - # to make the user always append env['MSVSPROJECTSUFFIX'] to target. - if source[0] == target[0]: - source = [] - - # make sure the suffix is correct for the version of MSVS we're running. - (base, suff) = SCons.Util.splitext(str(target[0])) - suff = env.subst('$MSVSPROJECTSUFFIX') - target[0] = base + suff - - if not source: - source = 'prj_inputs:' - source = source + env.subst('$MSVSSCONSCOM', 1) - source = source + env.subst('$MSVSENCODING', 1) - - if env.has_key('buildtarget') and env['buildtarget'] != None: - if SCons.Util.is_String(env['buildtarget']): - source = source + ' "%s"' % env['buildtarget'] - elif SCons.Util.is_List(env['buildtarget']): - for bt in env['buildtarget']: - if SCons.Util.is_String(bt): - source = source + ' "%s"' % bt - else: - try: source = source + ' "%s"' % bt.get_abspath() - except AttributeError: raise SCons.Errors.InternalError, \ - "buildtarget can be a string, a node, a list of strings or nodes, or None" - else: - try: source = source + ' "%s"' % env['buildtarget'].get_abspath() - except AttributeError: raise SCons.Errors.InternalError, \ - "buildtarget can be a string, a node, a list of strings or nodes, or None" - - if env.has_key('outdir') and env['outdir'] != None: - if SCons.Util.is_String(env['outdir']): - source = source + ' "%s"' % env['outdir'] - elif SCons.Util.is_List(env['outdir']): - for s in env['outdir']: - if SCons.Util.is_String(s): - source = source + ' "%s"' % s - else: - try: source = source + ' "%s"' % s.get_abspath() - except AttributeError: raise SCons.Errors.InternalError, \ - "outdir can be a string, a node, a list of strings or nodes, or None" - else: - try: source = source + ' "%s"' % env['outdir'].get_abspath() - except AttributeError: raise SCons.Errors.InternalError, \ - "outdir can be a string, a node, a list of strings or nodes, or None" - - if env.has_key('name'): - if SCons.Util.is_String(env['name']): - source = source + ' "%s"' % env['name'] - else: - raise SCons.Errors.InternalError, "name must be a string" - - if env.has_key('variant'): - if SCons.Util.is_String(env['variant']): - source = source + ' "%s"' % env['variant'] - elif SCons.Util.is_List(env['variant']): - for variant in env['variant']: - if SCons.Util.is_String(variant): - source = source + ' "%s"' % variant - else: - raise SCons.Errors.InternalError, "name must be a string or a list of strings" - else: - raise SCons.Errors.InternalError, "variant must be a string or a list of strings" - else: - raise SCons.Errors.InternalError, "variant must be specified" - - for s in _DSPGenerator.srcargs: - if env.has_key(s): - if SCons.Util.is_String(env[s]): - source = source + ' "%s' % env[s] - elif SCons.Util.is_List(env[s]): - for t in env[s]: - if SCons.Util.is_String(t): - source = source + ' "%s"' % t - else: - raise SCons.Errors.InternalError, s + " must be a string or a list of strings" - else: - raise SCons.Errors.InternalError, s + " must be a string or a list of strings" - - source = source + ' "%s"' % str(target[0]) - source = [SCons.Node.Python.Value(source)] - - targetlist = [target[0]] - sourcelist = source - - if env.get('auto_build_solution', 1): - env['projects'] = targetlist - t, s = solutionEmitter(target, target, env) - targetlist = targetlist + t - - return (targetlist, sourcelist) - -def solutionEmitter(target, source, env): - """Sets up the DSW dependencies.""" - - # todo: Not sure what sets source to what user has passed as target, - # but this is what happens. When that is fixed, we also won't have - # to make the user always append env['MSVSSOLUTIONSUFFIX'] to target. - if source[0] == target[0]: - source = [] - - # make sure the suffix is correct for the version of MSVS we're running. - (base, suff) = SCons.Util.splitext(str(target[0])) - suff = env.subst('$MSVSSOLUTIONSUFFIX') - target[0] = base + suff - - if not source: - source = 'sln_inputs:' - - if env.has_key('name'): - if SCons.Util.is_String(env['name']): - source = source + ' "%s"' % env['name'] - else: - raise SCons.Errors.InternalError, "name must be a string" - - if env.has_key('variant'): - if SCons.Util.is_String(env['variant']): - source = source + ' "%s"' % env['variant'] - elif SCons.Util.is_List(env['variant']): - for variant in env['variant']: - if SCons.Util.is_String(variant): - source = source + ' "%s"' % variant - else: - raise SCons.Errors.InternalError, "name must be a string or a list of strings" - else: - raise SCons.Errors.InternalError, "variant must be a string or a list of strings" - else: - raise SCons.Errors.InternalError, "variant must be specified" - - if env.has_key('slnguid'): - if SCons.Util.is_String(env['slnguid']): - source = source + ' "%s"' % env['slnguid'] - else: - raise SCons.Errors.InternalError, "slnguid must be a string" - - if env.has_key('projects'): - if SCons.Util.is_String(env['projects']): - source = source + ' "%s"' % env['projects'] - elif SCons.Util.is_List(env['projects']): - for t in env['projects']: - if SCons.Util.is_String(t): - source = source + ' "%s"' % t - - source = source + ' "%s"' % str(target[0]) - source = [SCons.Node.Python.Value(source)] - - return ([target[0]], source) - -projectAction = SCons.Action.Action(GenerateProject, None) - -solutionAction = SCons.Action.Action(GenerateSolution, None) - -projectBuilder = SCons.Builder.Builder(action = '$MSVSPROJECTCOM', - suffix = '$MSVSPROJECTSUFFIX', - emitter = projectEmitter) - -solutionBuilder = SCons.Builder.Builder(action = '$MSVSSOLUTIONCOM', - suffix = '$MSVSSOLUTIONSUFFIX', - emitter = solutionEmitter) - -default_MSVS_SConscript = None - -def generate(env): - """Add Builders and construction variables for Microsoft Visual - Studio project files to an Environment.""" - try: - env['BUILDERS']['MSVSProject'] - except KeyError: - env['BUILDERS']['MSVSProject'] = projectBuilder - - try: - env['BUILDERS']['MSVSSolution'] - except KeyError: - env['BUILDERS']['MSVSSolution'] = solutionBuilder - - env['MSVSPROJECTCOM'] = projectAction - env['MSVSSOLUTIONCOM'] = solutionAction - - if SCons.Script.call_stack: - # XXX Need to find a way to abstract this; the build engine - # shouldn't depend on anything in SCons.Script. - env['MSVSSCONSCRIPT'] = SCons.Script.call_stack[0].sconscript - else: - global default_MSVS_SConscript - if default_MSVS_SConscript is None: - default_MSVS_SConscript = env.File('SConstruct') - env['MSVSSCONSCRIPT'] = default_MSVS_SConscript - - env['MSVSSCONS'] = '"%s" -c "%s"' % (python_executable, getExecScriptMain(env)) - env['MSVSSCONSFLAGS'] = '-C "${MSVSSCONSCRIPT.dir.abspath}" -f ${MSVSSCONSCRIPT.name}' - env['MSVSSCONSCOM'] = '$MSVSSCONS $MSVSSCONSFLAGS' - env['MSVSBUILDCOM'] = '$MSVSSCONSCOM "$MSVSBUILDTARGET"' - env['MSVSREBUILDCOM'] = '$MSVSSCONSCOM "$MSVSBUILDTARGET"' - env['MSVSCLEANCOM'] = '$MSVSSCONSCOM -c "$MSVSBUILDTARGET"' - env['MSVSENCODING'] = 'Windows-1252' - - # Set-up ms tools paths for default version - merge_default_version(env) - - version_num, suite = msvs_parse_version(env['MSVS_VERSION']) - if (version_num < 7.0): - env['MSVS']['PROJECTSUFFIX'] = '.dsp' - env['MSVS']['SOLUTIONSUFFIX'] = '.dsw' - else: - env['MSVS']['PROJECTSUFFIX'] = '.vcproj' - env['MSVS']['SOLUTIONSUFFIX'] = '.sln' - - env['GET_MSVSPROJECTSUFFIX'] = GetMSVSProjectSuffix - env['GET_MSVSSOLUTIONSUFFIX'] = GetMSVSSolutionSuffix - env['MSVSPROJECTSUFFIX'] = '${GET_MSVSPROJECTSUFFIX}' - env['MSVSSOLUTIONSUFFIX'] = '${GET_MSVSSOLUTIONSUFFIX}' - env['SCONS_HOME'] = os.environ.get('SCONS_HOME') - -def exists(env): - return detect_msvs() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/mwcc.py b/3rdParty/SCons/scons-local/SCons/Tool/mwcc.py deleted file mode 100644 index f2966d2..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/mwcc.py +++ /dev/null @@ -1,208 +0,0 @@ -"""SCons.Tool.mwcc - -Tool-specific initialization for the Metrowerks CodeWarrior compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/mwcc.py 4043 2009/02/23 09:06:45 scons" - -import os -import os.path -import string - -import SCons.Util - -def set_vars(env): - """Set MWCW_VERSION, MWCW_VERSIONS, and some codewarrior environment vars - - MWCW_VERSIONS is set to a list of objects representing installed versions - - MWCW_VERSION is set to the version object that will be used for building. - MWCW_VERSION can be set to a string during Environment - construction to influence which version is chosen, otherwise - the latest one from MWCW_VERSIONS is used. - - Returns true if at least one version is found, false otherwise - """ - desired = env.get('MWCW_VERSION', '') - - # return right away if the variables are already set - if isinstance(desired, MWVersion): - return 1 - elif desired is None: - return 0 - - versions = find_versions() - version = None - - if desired: - for v in versions: - if str(v) == desired: - version = v - elif versions: - version = versions[-1] - - env['MWCW_VERSIONS'] = versions - env['MWCW_VERSION'] = version - - if version is None: - return 0 - - env.PrependENVPath('PATH', version.clpath) - env.PrependENVPath('PATH', version.dllpath) - ENV = env['ENV'] - ENV['CWFolder'] = version.path - ENV['LM_LICENSE_FILE'] = version.license - plus = lambda x: '+%s' % x - ENV['MWCIncludes'] = string.join(map(plus, version.includes), os.pathsep) - ENV['MWLibraries'] = string.join(map(plus, version.libs), os.pathsep) - return 1 - - -def find_versions(): - """Return a list of MWVersion objects representing installed versions""" - versions = [] - - ### This function finds CodeWarrior by reading from the registry on - ### Windows. Some other method needs to be implemented for other - ### platforms, maybe something that calls env.WhereIs('mwcc') - - if SCons.Util.can_read_reg: - try: - HLM = SCons.Util.HKEY_LOCAL_MACHINE - product = 'SOFTWARE\\Metrowerks\\CodeWarrior\\Product Versions' - product_key = SCons.Util.RegOpenKeyEx(HLM, product) - - i = 0 - while 1: - name = product + '\\' + SCons.Util.RegEnumKey(product_key, i) - name_key = SCons.Util.RegOpenKeyEx(HLM, name) - - try: - version = SCons.Util.RegQueryValueEx(name_key, 'VERSION') - path = SCons.Util.RegQueryValueEx(name_key, 'PATH') - mwv = MWVersion(version[0], path[0], 'Win32-X86') - versions.append(mwv) - except SCons.Util.RegError: - pass - - i = i + 1 - - except SCons.Util.RegError: - pass - - return versions - - -class MWVersion: - def __init__(self, version, path, platform): - self.version = version - self.path = path - self.platform = platform - self.clpath = os.path.join(path, 'Other Metrowerks Tools', - 'Command Line Tools') - self.dllpath = os.path.join(path, 'Bin') - - # The Metrowerks tools don't store any configuration data so they - # are totally dumb when it comes to locating standard headers, - # libraries, and other files, expecting all the information - # to be handed to them in environment variables. The members set - # below control what information scons injects into the environment - - ### The paths below give a normal build environment in CodeWarrior for - ### Windows, other versions of CodeWarrior might need different paths. - - msl = os.path.join(path, 'MSL') - support = os.path.join(path, '%s Support' % platform) - - self.license = os.path.join(path, 'license.dat') - self.includes = [msl, support] - self.libs = [msl, support] - - def __str__(self): - return self.version - - -CSuffixes = ['.c', '.C'] -CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++'] - - -def generate(env): - """Add Builders and construction variables for the mwcc to an Environment.""" - import SCons.Defaults - import SCons.Tool - - set_vars(env) - - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - for suffix in CSuffixes: - static_obj.add_action(suffix, SCons.Defaults.CAction) - shared_obj.add_action(suffix, SCons.Defaults.ShCAction) - - for suffix in CXXSuffixes: - static_obj.add_action(suffix, SCons.Defaults.CXXAction) - shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction) - - env['CCCOMFLAGS'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -nolink -o $TARGET $SOURCES' - - env['CC'] = 'mwcc' - env['CCCOM'] = '$CC $CFLAGS $CCFLAGS $CCCOMFLAGS' - - env['CXX'] = 'mwcc' - env['CXXCOM'] = '$CXX $CXXFLAGS $CCCOMFLAGS' - - env['SHCC'] = '$CC' - env['SHCCFLAGS'] = '$CCFLAGS' - env['SHCFLAGS'] = '$CFLAGS' - env['SHCCCOM'] = '$SHCC $SHCFLAGS $SHCCFLAGS $CCCOMFLAGS' - - env['SHCXX'] = '$CXX' - env['SHCXXFLAGS'] = '$CXXFLAGS' - env['SHCXXCOM'] = '$SHCXX $SHCXXFLAGS $CCCOMFLAGS' - - env['CFILESUFFIX'] = '.c' - env['CXXFILESUFFIX'] = '.cpp' - env['CPPDEFPREFIX'] = '-D' - env['CPPDEFSUFFIX'] = '' - env['INCPREFIX'] = '-I' - env['INCSUFFIX'] = '' - - #env['PCH'] = ? - #env['PCHSTOP'] = ? - - -def exists(env): - return set_vars(env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/mwld.py b/3rdParty/SCons/scons-local/SCons/Tool/mwld.py deleted file mode 100644 index 6d1bde8..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/mwld.py +++ /dev/null @@ -1,107 +0,0 @@ -"""SCons.Tool.mwld - -Tool-specific initialization for the Metrowerks CodeWarrior linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/mwld.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Tool - - -def generate(env): - """Add Builders and construction variables for lib to an Environment.""" - SCons.Tool.createStaticLibBuilder(env) - SCons.Tool.createSharedLibBuilder(env) - SCons.Tool.createProgBuilder(env) - - env['AR'] = 'mwld' - env['ARCOM'] = '$AR $ARFLAGS -library -o $TARGET $SOURCES' - - env['LIBDIRPREFIX'] = '-L' - env['LIBDIRSUFFIX'] = '' - env['LIBLINKPREFIX'] = '-l' - env['LIBLINKSUFFIX'] = '.lib' - - env['LINK'] = 'mwld' - env['LINKCOM'] = '$LINK $LINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' - - env['SHLINK'] = '$LINK' - env['SHLINKFLAGS'] = '$LINKFLAGS' - env['SHLINKCOM'] = shlib_action - env['SHLIBEMITTER']= shlib_emitter - - -def exists(env): - import SCons.Tool.mwcc - return SCons.Tool.mwcc.set_vars(env) - - -def shlib_generator(target, source, env, for_signature): - cmd = ['$SHLINK', '$SHLINKFLAGS', '-shared'] - - no_import_lib = env.get('no_import_lib', 0) - if no_import_lib: cmd.extend('-noimplib') - - dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX') - if dll: cmd.extend(['-o', dll]) - - implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX') - if implib: cmd.extend(['-implib', implib.get_string(for_signature)]) - - cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS']) - - return [cmd] - - -def shlib_emitter(target, source, env): - dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX') - no_import_lib = env.get('no_import_lib', 0) - - if not dll: - raise SCons.Errors.UserError, "A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX") - - if not no_import_lib and \ - not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'): - - # Append an import library to the list of targets. - target.append(env.ReplaceIxes(dll, - 'SHLIBPREFIX', 'SHLIBSUFFIX', - 'LIBPREFIX', 'LIBSUFFIX')) - - return target, source - - -shlib_action = SCons.Action.Action(shlib_generator, generator=1) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/nasm.py b/3rdParty/SCons/scons-local/SCons/Tool/nasm.py deleted file mode 100644 index ee4fd35..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/nasm.py +++ /dev/null @@ -1,72 +0,0 @@ -"""SCons.Tool.nasm - -Tool-specific initialization for nasm, the famous Netwide Assembler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/nasm.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Defaults -import SCons.Tool -import SCons.Util - -ASSuffixes = ['.s', '.asm', '.ASM'] -ASPPSuffixes = ['.spp', '.SPP', '.sx'] -if SCons.Util.case_sensitive_suffixes('.s', '.S'): - ASPPSuffixes.extend(['.S']) -else: - ASSuffixes.extend(['.S']) - -def generate(env): - """Add Builders and construction variables for nasm to an Environment.""" - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - for suffix in ASSuffixes: - static_obj.add_action(suffix, SCons.Defaults.ASAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - - for suffix in ASPPSuffixes: - static_obj.add_action(suffix, SCons.Defaults.ASPPAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - - env['AS'] = 'nasm' - env['ASFLAGS'] = SCons.Util.CLVar('') - env['ASPPFLAGS'] = '$ASFLAGS' - env['ASCOM'] = '$AS $ASFLAGS -o $TARGET $SOURCES' - env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES' - -def exists(env): - return env.Detect('nasm') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/packaging/__init__.py b/3rdParty/SCons/scons-local/SCons/Tool/packaging/__init__.py deleted file mode 100644 index 77a9c7a..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/packaging/__init__.py +++ /dev/null @@ -1,314 +0,0 @@ -"""SCons.Tool.Packaging - -SCons Packaging Tool. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/packaging/__init__.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Environment -from SCons.Variables import * -from SCons.Errors import * -from SCons.Util import is_List, make_path_relative -from SCons.Warnings import warn, Warning - -import os, imp -import SCons.Defaults - -__all__ = [ 'src_targz', 'src_tarbz2', 'src_zip', 'tarbz2', 'targz', 'zip', 'rpm', 'msi', 'ipk' ] - -# -# Utility and Builder function -# -def Tag(env, target, source, *more_tags, **kw_tags): - """ Tag a file with the given arguments, just sets the accordingly named - attribute on the file object. - - TODO: FIXME - """ - if not target: - target=source - first_tag=None - else: - first_tag=source - - if first_tag: - kw_tags[first_tag[0]] = '' - - if len(kw_tags) == 0 and len(more_tags) == 0: - raise UserError, "No tags given." - - # XXX: sanity checks - for x in more_tags: - kw_tags[x] = '' - - if not SCons.Util.is_List(target): - target=[target] - else: - # hmm, sometimes the target list, is a list of a list - # make sure it is flattened prior to processing. - # TODO: perhaps some bug ?!? - target=env.Flatten(target) - - for t in target: - for (k,v) in kw_tags.items(): - # all file tags have to start with PACKAGING_, so we can later - # differentiate between "normal" object attributes and the - # packaging attributes. As the user should not be bothered with - # that, the prefix will be added here if missing. - #if not k.startswith('PACKAGING_'): - if k[:10] != 'PACKAGING_': - k='PACKAGING_'+k - setattr(t, k, v) - -def Package(env, target=None, source=None, **kw): - """ Entry point for the package tool. - """ - # check if we need to find the source files ourself - if not source: - source = env.FindInstalledFiles() - - if len(source)==0: - raise UserError, "No source for Package() given" - - # decide which types of packages shall be built. Can be defined through - # four mechanisms: command line argument, keyword argument, - # environment argument and default selection( zip or tar.gz ) in that - # order. - try: kw['PACKAGETYPE']=env['PACKAGETYPE'] - except KeyError: pass - - if not kw.get('PACKAGETYPE'): - from SCons.Script import GetOption - kw['PACKAGETYPE'] = GetOption('package_type') - - if kw['PACKAGETYPE'] == None: - if env['BUILDERS'].has_key('Tar'): - kw['PACKAGETYPE']='targz' - elif env['BUILDERS'].has_key('Zip'): - kw['PACKAGETYPE']='zip' - else: - raise UserError, "No type for Package() given" - - PACKAGETYPE=kw['PACKAGETYPE'] - if not is_List(PACKAGETYPE): - PACKAGETYPE=string.split(PACKAGETYPE, ',') - - # load the needed packagers. - def load_packager(type): - try: - file,path,desc=imp.find_module(type, __path__) - return imp.load_module(type, file, path, desc) - except ImportError, e: - raise EnvironmentError("packager %s not available: %s"%(type,str(e))) - - packagers=map(load_packager, PACKAGETYPE) - - # set up targets and the PACKAGEROOT - try: - # fill up the target list with a default target name until the PACKAGETYPE - # list is of the same size as the target list. - if not target: target = [] - - size_diff = len(PACKAGETYPE)-len(target) - default_name = "%(NAME)s-%(VERSION)s" - - if size_diff>0: - default_target = default_name%kw - target.extend( [default_target]*size_diff ) - - if not kw.has_key('PACKAGEROOT'): - kw['PACKAGEROOT'] = default_name%kw - - except KeyError, e: - raise SCons.Errors.UserError( "Missing Packagetag '%s'"%e.args[0] ) - - # setup the source files - source=env.arg2nodes(source, env.fs.Entry) - - # call the packager to setup the dependencies. - targets=[] - try: - for packager in packagers: - t=[target.pop(0)] - t=apply(packager.package, [env,t,source], kw) - targets.extend(t) - - assert( len(target) == 0 ) - - except KeyError, e: - raise SCons.Errors.UserError( "Missing Packagetag '%s' for %s packager"\ - % (e.args[0],packager.__name__) ) - except TypeError, e: - # this exception means that a needed argument for the packager is - # missing. As our packagers get their "tags" as named function - # arguments we need to find out which one is missing. - from inspect import getargspec - args,varargs,varkw,defaults=getargspec(packager.package) - if defaults!=None: - args=args[:-len(defaults)] # throw away arguments with default values - args.remove('env') - args.remove('target') - args.remove('source') - # now remove any args for which we have a value in kw. - #args=[x for x in args if not kw.has_key(x)] - args=filter(lambda x, kw=kw: not kw.has_key(x), args) - - if len(args)==0: - raise # must be a different error, so reraise - elif len(args)==1: - raise SCons.Errors.UserError( "Missing Packagetag '%s' for %s packager"\ - % (args[0],packager.__name__) ) - else: - raise SCons.Errors.UserError( "Missing Packagetags '%s' for %s packager"\ - % (", ".join(args),packager.__name__) ) - - target=env.arg2nodes(target, env.fs.Entry) - targets.extend(env.Alias( 'package', targets )) - return targets - -# -# SCons tool initialization functions -# - -added = None - -def generate(env): - from SCons.Script import AddOption - global added - if not added: - added = 1 - AddOption('--package-type', - dest='package_type', - default=None, - type="string", - action="store", - help='The type of package to create.') - - try: - env['BUILDERS']['Package'] - env['BUILDERS']['Tag'] - except KeyError: - env['BUILDERS']['Package'] = Package - env['BUILDERS']['Tag'] = Tag - -def exists(env): - return 1 - -# XXX -def options(opts): - opts.AddVariables( - EnumVariable( 'PACKAGETYPE', - 'the type of package to create.', - None, allowed_values=map( str, __all__ ), - ignorecase=2 - ) - ) - -# -# Internal utility functions -# - -def copy_attr(f1, f2): - """ copies the special packaging file attributes from f1 to f2. - """ - #pattrs = [x for x in dir(f1) if not hasattr(f2, x) and\ - # x.startswith('PACKAGING_')] - copyit = lambda x, f2=f2: not hasattr(f2, x) and x[:10] == 'PACKAGING_' - pattrs = filter(copyit, dir(f1)) - for attr in pattrs: - setattr(f2, attr, getattr(f1, attr)) -def putintopackageroot(target, source, env, pkgroot, honor_install_location=1): - """ Uses the CopyAs builder to copy all source files to the directory given - in pkgroot. - - If honor_install_location is set and the copied source file has an - PACKAGING_INSTALL_LOCATION attribute, the PACKAGING_INSTALL_LOCATION is - used as the new name of the source file under pkgroot. - - The source file will not be copied if it is already under the the pkgroot - directory. - - All attributes of the source file will be copied to the new file. - """ - # make sure the packageroot is a Dir object. - if SCons.Util.is_String(pkgroot): pkgroot=env.Dir(pkgroot) - if not SCons.Util.is_List(source): source=[source] - - new_source = [] - for file in source: - if SCons.Util.is_String(file): file = env.File(file) - - if file.is_under(pkgroot): - new_source.append(file) - else: - if hasattr(file, 'PACKAGING_INSTALL_LOCATION') and\ - honor_install_location: - new_name=make_path_relative(file.PACKAGING_INSTALL_LOCATION) - else: - new_name=make_path_relative(file.get_path()) - - new_file=pkgroot.File(new_name) - new_file=env.CopyAs(new_file, file)[0] - copy_attr(file, new_file) - new_source.append(new_file) - - return (target, new_source) - -def stripinstallbuilder(target, source, env): - """ strips the install builder action from the source list and stores - the final installation location as the "PACKAGING_INSTALL_LOCATION" of - the source of the source file. This effectively removes the final installed - files from the source list while remembering the installation location. - - It also warns about files which have no install builder attached. - """ - def has_no_install_location(file): - return not (file.has_builder() and\ - hasattr(file.builder, 'name') and\ - (file.builder.name=="InstallBuilder" or\ - file.builder.name=="InstallAsBuilder")) - - if len(filter(has_no_install_location, source)): - warn(Warning, "there are files to package which have no\ - InstallBuilder attached, this might lead to irreproducible packages") - - n_source=[] - for s in source: - if has_no_install_location(s): - n_source.append(s) - else: - for ss in s.sources: - n_source.append(ss) - copy_attr(s, ss) - setattr(ss, 'PACKAGING_INSTALL_LOCATION', s.get_path()) - - return (target, n_source) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/packaging/ipk.py b/3rdParty/SCons/scons-local/SCons/Tool/packaging/ipk.py deleted file mode 100644 index cca98c2..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/packaging/ipk.py +++ /dev/null @@ -1,185 +0,0 @@ -"""SCons.Tool.Packaging.ipk -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/packaging/ipk.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Builder -import SCons.Node.FS -import os - -from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot - -def package(env, target, source, PACKAGEROOT, NAME, VERSION, DESCRIPTION, - SUMMARY, X_IPK_PRIORITY, X_IPK_SECTION, SOURCE_URL, - X_IPK_MAINTAINER, X_IPK_DEPENDS, **kw): - """ this function prepares the packageroot directory for packaging with the - ipkg builder. - """ - SCons.Tool.Tool('ipkg').generate(env) - - # setup the Ipkg builder - bld = env['BUILDERS']['Ipkg'] - target, source = stripinstallbuilder(target, source, env) - target, source = putintopackageroot(target, source, env, PACKAGEROOT) - - # This should be overridable from the construction environment, - # which it is by using ARCHITECTURE=. - # Guessing based on what os.uname() returns at least allows it - # to work for both i386 and x86_64 Linux systems. - archmap = { - 'i686' : 'i386', - 'i586' : 'i386', - 'i486' : 'i386', - } - - buildarchitecture = os.uname()[4] - buildarchitecture = archmap.get(buildarchitecture, buildarchitecture) - - if kw.has_key('ARCHITECTURE'): - buildarchitecture = kw['ARCHITECTURE'] - - # setup the kw to contain the mandatory arguments to this fucntion. - # do this before calling any builder or setup function - loc=locals() - del loc['kw'] - kw.update(loc) - del kw['source'], kw['target'], kw['env'] - - # generate the specfile - specfile = gen_ipk_dir(PACKAGEROOT, source, env, kw) - - # override the default target. - if str(target[0])=="%s-%s"%(NAME, VERSION): - target=[ "%s_%s_%s.ipk"%(NAME, VERSION, buildarchitecture) ] - - # now apply the Ipkg builder - return apply(bld, [env, target, specfile], kw) - -def gen_ipk_dir(proot, source, env, kw): - # make sure the packageroot is a Dir object. - if SCons.Util.is_String(proot): proot=env.Dir(proot) - - # create the specfile builder - s_bld=SCons.Builder.Builder( - action = build_specfiles, - ) - - # create the specfile targets - spec_target=[] - control=proot.Dir('CONTROL') - spec_target.append(control.File('control')) - spec_target.append(control.File('conffiles')) - spec_target.append(control.File('postrm')) - spec_target.append(control.File('prerm')) - spec_target.append(control.File('postinst')) - spec_target.append(control.File('preinst')) - - # apply the builder to the specfile targets - apply(s_bld, [env, spec_target, source], kw) - - # the packageroot directory does now contain the specfiles. - return proot - -def build_specfiles(source, target, env): - """ filter the targets for the needed files and use the variables in env - to create the specfile. - """ - # - # At first we care for the CONTROL/control file, which is the main file for ipk. - # - # For this we need to open multiple files in random order, so we store into - # a dict so they can be easily accessed. - # - # - opened_files={} - def open_file(needle, haystack): - try: - return opened_files[needle] - except KeyError: - file=filter(lambda x: x.get_path().rfind(needle)!=-1, haystack)[0] - opened_files[needle]=open(file.abspath, 'w') - return opened_files[needle] - - control_file=open_file('control', target) - - if not env.has_key('X_IPK_DESCRIPTION'): - env['X_IPK_DESCRIPTION']="%s\n %s"%(env['SUMMARY'], - env['DESCRIPTION'].replace('\n', '\n ')) - - - content = """ -Package: $NAME -Version: $VERSION -Priority: $X_IPK_PRIORITY -Section: $X_IPK_SECTION -Source: $SOURCE_URL -Architecture: $ARCHITECTURE -Maintainer: $X_IPK_MAINTAINER -Depends: $X_IPK_DEPENDS -Description: $X_IPK_DESCRIPTION -""" - - control_file.write(env.subst(content)) - - # - # now handle the various other files, which purpose it is to set post-, - # pre-scripts and mark files as config files. - # - # We do so by filtering the source files for files which are marked with - # the "config" tag and afterwards we do the same for x_ipk_postrm, - # x_ipk_prerm, x_ipk_postinst and x_ipk_preinst tags. - # - # The first one will write the name of the file into the file - # CONTROL/configfiles, the latter add the content of the x_ipk_* variable - # into the same named file. - # - for f in [x for x in source if 'PACKAGING_CONFIG' in dir(x)]: - config=open_file('conffiles') - config.write(f.PACKAGING_INSTALL_LOCATION) - config.write('\n') - - for str in 'POSTRM PRERM POSTINST PREINST'.split(): - name="PACKAGING_X_IPK_%s"%str - for f in [x for x in source if name in dir(x)]: - file=open_file(name) - file.write(env[str]) - - # - # close all opened files - for f in opened_files.values(): - f.close() - - # call a user specified function - if env.has_key('CHANGE_SPECFILE'): - content += env['CHANGE_SPECFILE'](target) - - return 0 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/packaging/msi.py b/3rdParty/SCons/scons-local/SCons/Tool/packaging/msi.py deleted file mode 100644 index fd61e0b..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/packaging/msi.py +++ /dev/null @@ -1,526 +0,0 @@ -"""SCons.Tool.packaging.msi - -The msi packager. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/packaging/msi.py 4043 2009/02/23 09:06:45 scons" - -import os -import SCons -from SCons.Action import Action -from SCons.Builder import Builder - -from xml.dom.minidom import * -from xml.sax.saxutils import escape - -from SCons.Tool.packaging import stripinstallbuilder - -# -# Utility functions -# -def convert_to_id(s, id_set): - """ Some parts of .wxs need an Id attribute (for example: The File and - Directory directives. The charset is limited to A-Z, a-z, digits, - underscores, periods. Each Id must begin with a letter or with a - underscore. Google for "CNDL0015" for information about this. - - Requirements: - * the string created must only contain chars from the target charset. - * the string created must have a minimal editing distance from the - original string. - * the string created must be unique for the whole .wxs file. - - Observation: - * There are 62 chars in the charset. - - Idea: - * filter out forbidden characters. Check for a collision with the help - of the id_set. Add the number of the number of the collision at the - end of the created string. Furthermore care for a correct start of - the string. - """ - charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz0123456789_.' - if s[0] in '0123456789.': - s += '_'+s - id = filter( lambda c : c in charset, s ) - - # did we already generate an id for this file? - try: - return id_set[id][s] - except KeyError: - # no we did not so initialize with the id - if not id_set.has_key(id): id_set[id] = { s : id } - # there is a collision, generate an id which is unique by appending - # the collision number - else: id_set[id][s] = id + str(len(id_set[id])) - - return id_set[id][s] - -def is_dos_short_file_name(file): - """ examine if the given file is in the 8.3 form. - """ - fname, ext = os.path.splitext(file) - proper_ext = len(ext) == 0 or (2 <= len(ext) <= 4) # the ext contains the dot - proper_fname = file.isupper() and len(fname) <= 8 - - return proper_ext and proper_fname - -def gen_dos_short_file_name(file, filename_set): - """ see http://support.microsoft.com/default.aspx?scid=kb;en-us;Q142982 - - These are no complete 8.3 dos short names. The ~ char is missing and - replaced with one character from the filename. WiX warns about such - filenames, since a collision might occur. Google for "CNDL1014" for - more information. - """ - # guard this to not confuse the generation - if is_dos_short_file_name(file): - return file - - fname, ext = os.path.splitext(file) # ext contains the dot - - # first try if it suffices to convert to upper - file = file.upper() - if is_dos_short_file_name(file): - return file - - # strip forbidden characters. - forbidden = '."/[]:;=, ' - fname = filter( lambda c : c not in forbidden, fname ) - - # check if we already generated a filename with the same number: - # thisis1.txt, thisis2.txt etc. - duplicate, num = not None, 1 - while duplicate: - shortname = "%s%s" % (fname[:8-len(str(num))].upper(),\ - str(num)) - if len(ext) >= 2: - shortname = "%s%s" % (shortname, ext[:4].upper()) - - duplicate, num = shortname in filename_set, num+1 - - assert( is_dos_short_file_name(shortname) ), 'shortname is %s, longname is %s' % (shortname, file) - filename_set.append(shortname) - return shortname - -def create_feature_dict(files): - """ X_MSI_FEATURE and doc FileTag's can be used to collect files in a - hierarchy. This function collects the files into this hierarchy. - """ - dict = {} - - def add_to_dict( feature, file ): - if not SCons.Util.is_List( feature ): - feature = [ feature ] - - for f in feature: - if not dict.has_key( f ): - dict[ f ] = [ file ] - else: - dict[ f ].append( file ) - - for file in files: - if hasattr( file, 'PACKAGING_X_MSI_FEATURE' ): - add_to_dict(file.PACKAGING_X_MSI_FEATURE, file) - elif hasattr( file, 'PACKAGING_DOC' ): - add_to_dict( 'PACKAGING_DOC', file ) - else: - add_to_dict( 'default', file ) - - return dict - -def generate_guids(root): - """ generates globally unique identifiers for parts of the xml which need - them. - - Component tags have a special requirement. Their UUID is only allowed to - change if the list of their contained resources has changed. This allows - for clean removal and proper updates. - - To handle this requirement, the uuid is generated with an md5 hashing the - whole subtree of a xml node. - """ - from md5 import md5 - - # specify which tags need a guid and in which attribute this should be stored. - needs_id = { 'Product' : 'Id', - 'Package' : 'Id', - 'Component' : 'Guid', - } - - # find all XMl nodes matching the key, retrieve their attribute, hash their - # subtree, convert hash to string and add as a attribute to the xml node. - for (key,value) in needs_id.items(): - node_list = root.getElementsByTagName(key) - attribute = value - for node in node_list: - hash = md5(node.toxml()).hexdigest() - hash_str = '%s-%s-%s-%s-%s' % ( hash[:8], hash[8:12], hash[12:16], hash[16:20], hash[20:] ) - node.attributes[attribute] = hash_str - - - -def string_wxsfile(target, source, env): - return "building WiX file %s"%( target[0].path ) - -def build_wxsfile(target, source, env): - """ compiles a .wxs file from the keywords given in env['msi_spec'] and - by analyzing the tree of source nodes and their tags. - """ - file = open(target[0].abspath, 'w') - - try: - # Create a document with the Wix root tag - doc = Document() - root = doc.createElement( 'Wix' ) - root.attributes['xmlns']='http://schemas.microsoft.com/wix/2003/01/wi' - doc.appendChild( root ) - - filename_set = [] # this is to circumvent duplicates in the shortnames - id_set = {} # this is to circumvent duplicates in the ids - - # Create the content - build_wxsfile_header_section(root, env) - build_wxsfile_file_section(root, source, env['NAME'], env['VERSION'], env['VENDOR'], filename_set, id_set) - generate_guids(root) - build_wxsfile_features_section(root, source, env['NAME'], env['VERSION'], env['SUMMARY'], id_set) - build_wxsfile_default_gui(root) - build_license_file(target[0].get_dir(), env) - - # write the xml to a file - file.write( doc.toprettyxml() ) - - # call a user specified function - if env.has_key('CHANGE_SPECFILE'): - env['CHANGE_SPECFILE'](target, source) - - except KeyError, e: - raise SCons.Errors.UserError( '"%s" package field for MSI is missing.' % e.args[0] ) - -# -# setup function -# -def create_default_directory_layout(root, NAME, VERSION, VENDOR, filename_set): - """ Create the wix default target directory layout and return the innermost - directory. - - We assume that the XML tree delivered in the root argument already contains - the Product tag. - - Everything is put under the PFiles directory property defined by WiX. - After that a directory with the 'VENDOR' tag is placed and then a - directory with the name of the project and its VERSION. This leads to the - following TARGET Directory Layout: - C:\<PFiles>\<Vendor>\<Projectname-Version>\ - Example: C:\Programme\Company\Product-1.2\ - """ - doc = Document() - d1 = doc.createElement( 'Directory' ) - d1.attributes['Id'] = 'TARGETDIR' - d1.attributes['Name'] = 'SourceDir' - - d2 = doc.createElement( 'Directory' ) - d2.attributes['Id'] = 'ProgramFilesFolder' - d2.attributes['Name'] = 'PFiles' - - d3 = doc.createElement( 'Directory' ) - d3.attributes['Id'] = 'VENDOR_folder' - d3.attributes['Name'] = escape( gen_dos_short_file_name( VENDOR, filename_set ) ) - d3.attributes['LongName'] = escape( VENDOR ) - - d4 = doc.createElement( 'Directory' ) - project_folder = "%s-%s" % ( NAME, VERSION ) - d4.attributes['Id'] = 'MY_DEFAULT_FOLDER' - d4.attributes['Name'] = escape( gen_dos_short_file_name( project_folder, filename_set ) ) - d4.attributes['LongName'] = escape( project_folder ) - - d1.childNodes.append( d2 ) - d2.childNodes.append( d3 ) - d3.childNodes.append( d4 ) - - root.getElementsByTagName('Product')[0].childNodes.append( d1 ) - - return d4 - -# -# mandatory and optional file tags -# -def build_wxsfile_file_section(root, files, NAME, VERSION, VENDOR, filename_set, id_set): - """ builds the Component sections of the wxs file with their included files. - - Files need to be specified in 8.3 format and in the long name format, long - filenames will be converted automatically. - - Features are specficied with the 'X_MSI_FEATURE' or 'DOC' FileTag. - """ - root = create_default_directory_layout( root, NAME, VERSION, VENDOR, filename_set ) - components = create_feature_dict( files ) - factory = Document() - - def get_directory( node, dir ): - """ returns the node under the given node representing the directory. - - Returns the component node if dir is None or empty. - """ - if dir == '' or not dir: - return node - - Directory = node - dir_parts = dir.split(os.path.sep) - - # to make sure that our directory ids are unique, the parent folders are - # consecutively added to upper_dir - upper_dir = '' - - # walk down the xml tree finding parts of the directory - dir_parts = filter( lambda d: d != '', dir_parts ) - for d in dir_parts[:]: - already_created = filter( lambda c: c.nodeName == 'Directory' and c.attributes['LongName'].value == escape(d), Directory.childNodes ) - - if already_created != []: - Directory = already_created[0] - dir_parts.remove(d) - upper_dir += d - else: - break - - for d in dir_parts: - nDirectory = factory.createElement( 'Directory' ) - nDirectory.attributes['LongName'] = escape( d ) - nDirectory.attributes['Name'] = escape( gen_dos_short_file_name( d, filename_set ) ) - upper_dir += d - nDirectory.attributes['Id'] = convert_to_id( upper_dir, id_set ) - - Directory.childNodes.append( nDirectory ) - Directory = nDirectory - - return Directory - - for file in files: - drive, path = os.path.splitdrive( file.PACKAGING_INSTALL_LOCATION ) - filename = os.path.basename( path ) - dirname = os.path.dirname( path ) - - h = { - # tagname : default value - 'PACKAGING_X_MSI_VITAL' : 'yes', - 'PACKAGING_X_MSI_FILEID' : convert_to_id(filename, id_set), - 'PACKAGING_X_MSI_LONGNAME' : filename, - 'PACKAGING_X_MSI_SHORTNAME' : gen_dos_short_file_name(filename, filename_set), - 'PACKAGING_X_MSI_SOURCE' : file.get_path(), - } - - # fill in the default tags given above. - for k,v in [ (k, v) for (k,v) in h.items() if not hasattr(file, k) ]: - setattr( file, k, v ) - - File = factory.createElement( 'File' ) - File.attributes['LongName'] = escape( file.PACKAGING_X_MSI_LONGNAME ) - File.attributes['Name'] = escape( file.PACKAGING_X_MSI_SHORTNAME ) - File.attributes['Source'] = escape( file.PACKAGING_X_MSI_SOURCE ) - File.attributes['Id'] = escape( file.PACKAGING_X_MSI_FILEID ) - File.attributes['Vital'] = escape( file.PACKAGING_X_MSI_VITAL ) - - # create the <Component> Tag under which this file should appear - Component = factory.createElement('Component') - Component.attributes['DiskId'] = '1' - Component.attributes['Id'] = convert_to_id( filename, id_set ) - - # hang the component node under the root node and the file node - # under the component node. - Directory = get_directory( root, dirname ) - Directory.childNodes.append( Component ) - Component.childNodes.append( File ) - -# -# additional functions -# -def build_wxsfile_features_section(root, files, NAME, VERSION, SUMMARY, id_set): - """ This function creates the <features> tag based on the supplied xml tree. - - This is achieved by finding all <component>s and adding them to a default target. - - It should be called after the tree has been built completly. We assume - that a MY_DEFAULT_FOLDER Property is defined in the wxs file tree. - - Furthermore a top-level with the name and VERSION of the software will be created. - - An PACKAGING_X_MSI_FEATURE can either be a string, where the feature - DESCRIPTION will be the same as its title or a Tuple, where the first - part will be its title and the second its DESCRIPTION. - """ - factory = Document() - Feature = factory.createElement('Feature') - Feature.attributes['Id'] = 'complete' - Feature.attributes['ConfigurableDirectory'] = 'MY_DEFAULT_FOLDER' - Feature.attributes['Level'] = '1' - Feature.attributes['Title'] = escape( '%s %s' % (NAME, VERSION) ) - Feature.attributes['Description'] = escape( SUMMARY ) - Feature.attributes['Display'] = 'expand' - - for (feature, files) in create_feature_dict(files).items(): - SubFeature = factory.createElement('Feature') - SubFeature.attributes['Level'] = '1' - - if SCons.Util.is_Tuple(feature): - SubFeature.attributes['Id'] = convert_to_id( feature[0], id_set ) - SubFeature.attributes['Title'] = escape(feature[0]) - SubFeature.attributes['Description'] = escape(feature[1]) - else: - SubFeature.attributes['Id'] = convert_to_id( feature, id_set ) - if feature=='default': - SubFeature.attributes['Description'] = 'Main Part' - SubFeature.attributes['Title'] = 'Main Part' - elif feature=='PACKAGING_DOC': - SubFeature.attributes['Description'] = 'Documentation' - SubFeature.attributes['Title'] = 'Documentation' - else: - SubFeature.attributes['Description'] = escape(feature) - SubFeature.attributes['Title'] = escape(feature) - - # build the componentrefs. As one of the design decision is that every - # file is also a component we walk the list of files and create a - # reference. - for f in files: - ComponentRef = factory.createElement('ComponentRef') - ComponentRef.attributes['Id'] = convert_to_id( os.path.basename(f.get_path()), id_set ) - SubFeature.childNodes.append(ComponentRef) - - Feature.childNodes.append(SubFeature) - - root.getElementsByTagName('Product')[0].childNodes.append(Feature) - -def build_wxsfile_default_gui(root): - """ this function adds a default GUI to the wxs file - """ - factory = Document() - Product = root.getElementsByTagName('Product')[0] - - UIRef = factory.createElement('UIRef') - UIRef.attributes['Id'] = 'WixUI_Mondo' - Product.childNodes.append(UIRef) - - UIRef = factory.createElement('UIRef') - UIRef.attributes['Id'] = 'WixUI_ErrorProgressText' - Product.childNodes.append(UIRef) - -def build_license_file(directory, spec): - """ creates a License.rtf file with the content of "X_MSI_LICENSE_TEXT" - in the given directory - """ - name, text = '', '' - - try: - name = spec['LICENSE'] - text = spec['X_MSI_LICENSE_TEXT'] - except KeyError: - pass # ignore this as X_MSI_LICENSE_TEXT is optional - - if name!='' or text!='': - file = open( os.path.join(directory.get_path(), 'License.rtf'), 'w' ) - file.write('{\\rtf') - if text!='': - file.write(text.replace('\n', '\\par ')) - else: - file.write(name+'\\par\\par') - file.write('}') - file.close() - -# -# mandatory and optional package tags -# -def build_wxsfile_header_section(root, spec): - """ Adds the xml file node which define the package meta-data. - """ - # Create the needed DOM nodes and add them at the correct position in the tree. - factory = Document() - Product = factory.createElement( 'Product' ) - Package = factory.createElement( 'Package' ) - - root.childNodes.append( Product ) - Product.childNodes.append( Package ) - - # set "mandatory" default values - if not spec.has_key('X_MSI_LANGUAGE'): - spec['X_MSI_LANGUAGE'] = '1033' # select english - - # mandatory sections, will throw a KeyError if the tag is not available - Product.attributes['Name'] = escape( spec['NAME'] ) - Product.attributes['Version'] = escape( spec['VERSION'] ) - Product.attributes['Manufacturer'] = escape( spec['VENDOR'] ) - Product.attributes['Language'] = escape( spec['X_MSI_LANGUAGE'] ) - Package.attributes['Description'] = escape( spec['SUMMARY'] ) - - # now the optional tags, for which we avoid the KeyErrror exception - if spec.has_key( 'DESCRIPTION' ): - Package.attributes['Comments'] = escape( spec['DESCRIPTION'] ) - - if spec.has_key( 'X_MSI_UPGRADE_CODE' ): - Package.attributes['X_MSI_UPGRADE_CODE'] = escape( spec['X_MSI_UPGRADE_CODE'] ) - - # We hardcode the media tag as our current model cannot handle it. - Media = factory.createElement('Media') - Media.attributes['Id'] = '1' - Media.attributes['Cabinet'] = 'default.cab' - Media.attributes['EmbedCab'] = 'yes' - root.getElementsByTagName('Product')[0].childNodes.append(Media) - -# this builder is the entry-point for .wxs file compiler. -wxs_builder = Builder( - action = Action( build_wxsfile, string_wxsfile ), - ensure_suffix = '.wxs' ) - -def package(env, target, source, PACKAGEROOT, NAME, VERSION, - DESCRIPTION, SUMMARY, VENDOR, X_MSI_LANGUAGE, **kw): - # make sure that the Wix Builder is in the environment - SCons.Tool.Tool('wix').generate(env) - - # get put the keywords for the specfile compiler. These are the arguments - # given to the package function and all optional ones stored in kw, minus - # the the source, target and env one. - loc = locals() - del loc['kw'] - kw.update(loc) - del kw['source'], kw['target'], kw['env'] - - # strip the install builder from the source files - target, source = stripinstallbuilder(target, source, env) - - # put the arguments into the env and call the specfile builder. - env['msi_spec'] = kw - specfile = apply( wxs_builder, [env, target, source], kw ) - - # now call the WiX Tool with the built specfile added as a source. - msifile = env.WiX(target, specfile) - - # return the target and source tuple. - return (msifile, source+[specfile]) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/packaging/rpm.py b/3rdParty/SCons/scons-local/SCons/Tool/packaging/rpm.py deleted file mode 100644 index 0380121..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/packaging/rpm.py +++ /dev/null @@ -1,367 +0,0 @@ -"""SCons.Tool.Packaging.rpm - -The rpm packager. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/packaging/rpm.py 4043 2009/02/23 09:06:45 scons" - -import os -import string - -import SCons.Builder - -from SCons.Environment import OverrideEnvironment -from SCons.Tool.packaging import stripinstallbuilder, src_targz -from SCons.Errors import UserError - -def package(env, target, source, PACKAGEROOT, NAME, VERSION, - PACKAGEVERSION, DESCRIPTION, SUMMARY, X_RPM_GROUP, LICENSE, - **kw): - # initialize the rpm tool - SCons.Tool.Tool('rpm').generate(env) - - bld = env['BUILDERS']['Rpm'] - - # Generate a UserError whenever the target name has been set explicitly, - # since rpm does not allow for controlling it. This is detected by - # checking if the target has been set to the default by the Package() - # Environment function. - if str(target[0])!="%s-%s"%(NAME, VERSION): - raise UserError( "Setting target is not supported for rpm." ) - else: - # This should be overridable from the construction environment, - # which it is by using ARCHITECTURE=. - # Guessing based on what os.uname() returns at least allows it - # to work for both i386 and x86_64 Linux systems. - archmap = { - 'i686' : 'i386', - 'i586' : 'i386', - 'i486' : 'i386', - } - - buildarchitecture = os.uname()[4] - buildarchitecture = archmap.get(buildarchitecture, buildarchitecture) - - if kw.has_key('ARCHITECTURE'): - buildarchitecture = kw['ARCHITECTURE'] - - fmt = '%s-%s-%s.%s.rpm' - srcrpm = fmt % (NAME, VERSION, PACKAGEVERSION, 'src') - binrpm = fmt % (NAME, VERSION, PACKAGEVERSION, buildarchitecture) - - target = [ srcrpm, binrpm ] - - # get the correct arguments into the kw hash - loc=locals() - del loc['kw'] - kw.update(loc) - del kw['source'], kw['target'], kw['env'] - - # if no "SOURCE_URL" tag is given add a default one. - if not kw.has_key('SOURCE_URL'): - #kw['SOURCE_URL']=(str(target[0])+".tar.gz").replace('.rpm', '') - kw['SOURCE_URL']=string.replace(str(target[0])+".tar.gz", '.rpm', '') - - # mangle the source and target list for the rpmbuild - env = OverrideEnvironment(env, kw) - target, source = stripinstallbuilder(target, source, env) - target, source = addspecfile(target, source, env) - target, source = collectintargz(target, source, env) - - # now call the rpm builder to actually build the packet. - return apply(bld, [env, target, source], kw) - -def collectintargz(target, source, env): - """ Puts all source files into a tar.gz file. """ - # the rpm tool depends on a source package, until this is chagned - # this hack needs to be here that tries to pack all sources in. - sources = env.FindSourceFiles() - - # filter out the target we are building the source list for. - #sources = [s for s in sources if not (s in target)] - sources = filter(lambda s, t=target: not (s in t), sources) - - # find the .spec file for rpm and add it since it is not necessarily found - # by the FindSourceFiles function. - #sources.extend( [s for s in source if str(s).rfind('.spec')!=-1] ) - spec_file = lambda s: string.rfind(str(s), '.spec') != -1 - sources.extend( filter(spec_file, source) ) - - # as the source contains the url of the source package this rpm package - # is built from, we extract the target name - #tarball = (str(target[0])+".tar.gz").replace('.rpm', '') - tarball = string.replace(str(target[0])+".tar.gz", '.rpm', '') - try: - #tarball = env['SOURCE_URL'].split('/')[-1] - tarball = string.split(env['SOURCE_URL'], '/')[-1] - except KeyError, e: - raise SCons.Errors.UserError( "Missing PackageTag '%s' for RPM packager" % e.args[0] ) - - tarball = src_targz.package(env, source=sources, target=tarball, - PACKAGEROOT=env['PACKAGEROOT'], ) - - return (target, tarball) - -def addspecfile(target, source, env): - specfile = "%s-%s" % (env['NAME'], env['VERSION']) - - bld = SCons.Builder.Builder(action = build_specfile, - suffix = '.spec', - target_factory = SCons.Node.FS.File) - - source.extend(bld(env, specfile, source)) - - return (target,source) - -def build_specfile(target, source, env): - """ Builds a RPM specfile from a dictionary with string metadata and - by analyzing a tree of nodes. - """ - file = open(target[0].abspath, 'w') - str = "" - - try: - file.write( build_specfile_header(env) ) - file.write( build_specfile_sections(env) ) - file.write( build_specfile_filesection(env, source) ) - file.close() - - # call a user specified function - if env.has_key('CHANGE_SPECFILE'): - env['CHANGE_SPECFILE'](target, source) - - except KeyError, e: - raise SCons.Errors.UserError( '"%s" package field for RPM is missing.' % e.args[0] ) - - -# -# mandatory and optional package tag section -# -def build_specfile_sections(spec): - """ Builds the sections of a rpm specfile. - """ - str = "" - - mandatory_sections = { - 'DESCRIPTION' : '\n%%description\n%s\n\n', } - - str = str + SimpleTagCompiler(mandatory_sections).compile( spec ) - - optional_sections = { - 'DESCRIPTION_' : '%%description -l %s\n%s\n\n', - 'CHANGELOG' : '%%changelog\n%s\n\n', - 'X_RPM_PREINSTALL' : '%%pre\n%s\n\n', - 'X_RPM_POSTINSTALL' : '%%post\n%s\n\n', - 'X_RPM_PREUNINSTALL' : '%%preun\n%s\n\n', - 'X_RPM_POSTUNINSTALL' : '%%postun\n%s\n\n', - 'X_RPM_VERIFY' : '%%verify\n%s\n\n', - - # These are for internal use but could possibly be overriden - 'X_RPM_PREP' : '%%prep\n%s\n\n', - 'X_RPM_BUILD' : '%%build\n%s\n\n', - 'X_RPM_INSTALL' : '%%install\n%s\n\n', - 'X_RPM_CLEAN' : '%%clean\n%s\n\n', - } - - # Default prep, build, install and clean rules - # TODO: optimize those build steps, to not compile the project a second time - if not spec.has_key('X_RPM_PREP'): - spec['X_RPM_PREP'] = '[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"' + '\n%setup -q' - - if not spec.has_key('X_RPM_BUILD'): - spec['X_RPM_BUILD'] = 'mkdir "$RPM_BUILD_ROOT"' - - if not spec.has_key('X_RPM_INSTALL'): - spec['X_RPM_INSTALL'] = 'scons --install-sandbox="$RPM_BUILD_ROOT" "$RPM_BUILD_ROOT"' - - if not spec.has_key('X_RPM_CLEAN'): - spec['X_RPM_CLEAN'] = '[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"' - - str = str + SimpleTagCompiler(optional_sections, mandatory=0).compile( spec ) - - return str - -def build_specfile_header(spec): - """ Builds all section but the %file of a rpm specfile - """ - str = "" - - # first the mandatory sections - mandatory_header_fields = { - 'NAME' : '%%define name %s\nName: %%{name}\n', - 'VERSION' : '%%define version %s\nVersion: %%{version}\n', - 'PACKAGEVERSION' : '%%define release %s\nRelease: %%{release}\n', - 'X_RPM_GROUP' : 'Group: %s\n', - 'SUMMARY' : 'Summary: %s\n', - 'LICENSE' : 'License: %s\n', } - - str = str + SimpleTagCompiler(mandatory_header_fields).compile( spec ) - - # now the optional tags - optional_header_fields = { - 'VENDOR' : 'Vendor: %s\n', - 'X_RPM_URL' : 'Url: %s\n', - 'SOURCE_URL' : 'Source: %s\n', - 'SUMMARY_' : 'Summary(%s): %s\n', - 'X_RPM_DISTRIBUTION' : 'Distribution: %s\n', - 'X_RPM_ICON' : 'Icon: %s\n', - 'X_RPM_PACKAGER' : 'Packager: %s\n', - 'X_RPM_GROUP_' : 'Group(%s): %s\n', - - 'X_RPM_REQUIRES' : 'Requires: %s\n', - 'X_RPM_PROVIDES' : 'Provides: %s\n', - 'X_RPM_CONFLICTS' : 'Conflicts: %s\n', - 'X_RPM_BUILDREQUIRES' : 'BuildRequires: %s\n', - - 'X_RPM_SERIAL' : 'Serial: %s\n', - 'X_RPM_EPOCH' : 'Epoch: %s\n', - 'X_RPM_AUTOREQPROV' : 'AutoReqProv: %s\n', - 'X_RPM_EXCLUDEARCH' : 'ExcludeArch: %s\n', - 'X_RPM_EXCLUSIVEARCH' : 'ExclusiveArch: %s\n', - 'X_RPM_PREFIX' : 'Prefix: %s\n', - 'X_RPM_CONFLICTS' : 'Conflicts: %s\n', - - # internal use - 'X_RPM_BUILDROOT' : 'BuildRoot: %s\n', } - - # fill in default values: - # Adding a BuildRequires renders the .rpm unbuildable under System, which - # are not managed by rpm, since the database to resolve this dependency is - # missing (take Gentoo as an example) -# if not s.has_key('x_rpm_BuildRequires'): -# s['x_rpm_BuildRequires'] = 'scons' - - if not spec.has_key('X_RPM_BUILDROOT'): - spec['X_RPM_BUILDROOT'] = '%{_tmppath}/%{name}-%{version}-%{release}' - - str = str + SimpleTagCompiler(optional_header_fields, mandatory=0).compile( spec ) - return str - -# -# mandatory and optional file tags -# -def build_specfile_filesection(spec, files): - """ builds the %file section of the specfile - """ - str = '%files\n' - - if not spec.has_key('X_RPM_DEFATTR'): - spec['X_RPM_DEFATTR'] = '(-,root,root)' - - str = str + '%%defattr %s\n' % spec['X_RPM_DEFATTR'] - - supported_tags = { - 'PACKAGING_CONFIG' : '%%config %s', - 'PACKAGING_CONFIG_NOREPLACE' : '%%config(noreplace) %s', - 'PACKAGING_DOC' : '%%doc %s', - 'PACKAGING_UNIX_ATTR' : '%%attr %s', - 'PACKAGING_LANG_' : '%%lang(%s) %s', - 'PACKAGING_X_RPM_VERIFY' : '%%verify %s', - 'PACKAGING_X_RPM_DIR' : '%%dir %s', - 'PACKAGING_X_RPM_DOCDIR' : '%%docdir %s', - 'PACKAGING_X_RPM_GHOST' : '%%ghost %s', } - - for file in files: - # build the tagset - tags = {} - for k in supported_tags.keys(): - try: - tags[k]=getattr(file, k) - except AttributeError: - pass - - # compile the tagset - str = str + SimpleTagCompiler(supported_tags, mandatory=0).compile( tags ) - - str = str + ' ' - str = str + file.PACKAGING_INSTALL_LOCATION - str = str + '\n\n' - - return str - -class SimpleTagCompiler: - """ This class is a simple string substition utility: - the replacement specfication is stored in the tagset dictionary, something - like: - { "abc" : "cdef %s ", - "abc_" : "cdef %s %s" } - - the compile function gets a value dictionary, which may look like: - { "abc" : "ghij", - "abc_gh" : "ij" } - - The resulting string will be: - "cdef ghij cdef gh ij" - """ - def __init__(self, tagset, mandatory=1): - self.tagset = tagset - self.mandatory = mandatory - - def compile(self, values): - """ compiles the tagset and returns a str containing the result - """ - def is_international(tag): - #return tag.endswith('_') - return tag[-1:] == '_' - - def get_country_code(tag): - return tag[-2:] - - def strip_country_code(tag): - return tag[:-2] - - replacements = self.tagset.items() - - str = "" - #domestic = [ (k,v) for k,v in replacements if not is_international(k) ] - domestic = filter(lambda t, i=is_international: not i(t[0]), replacements) - for key, replacement in domestic: - try: - str = str + replacement % values[key] - except KeyError, e: - if self.mandatory: - raise e - - #international = [ (k,v) for k,v in replacements if is_international(k) ] - international = filter(lambda t, i=is_international: i(t[0]), replacements) - for key, replacement in international: - try: - #int_values_for_key = [ (get_country_code(k),v) for k,v in values.items() if strip_country_code(k) == key ] - x = filter(lambda t,key=key,s=strip_country_code: s(t[0]) == key, values.items()) - int_values_for_key = map(lambda t,g=get_country_code: (g(t[0]),t[1]), x) - for v in int_values_for_key: - str = str + replacement % v - except KeyError, e: - if self.mandatory: - raise e - - return str - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/packaging/src_tarbz2.py b/3rdParty/SCons/scons-local/SCons/Tool/packaging/src_tarbz2.py deleted file mode 100644 index 54daddd..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/packaging/src_tarbz2.py +++ /dev/null @@ -1,43 +0,0 @@ -"""SCons.Tool.Packaging.tarbz2 - -The tarbz2 SRC packager. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/packaging/src_tarbz2.py 4043 2009/02/23 09:06:45 scons" - -from SCons.Tool.packaging import putintopackageroot - -def package(env, target, source, PACKAGEROOT, **kw): - bld = env['BUILDERS']['Tar'] - bld.set_suffix('.tar.bz2') - target, source = putintopackageroot(target, source, env, PACKAGEROOT, honor_install_location=0) - return bld(env, target, source, TARFLAGS='-jc') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/packaging/src_targz.py b/3rdParty/SCons/scons-local/SCons/Tool/packaging/src_targz.py deleted file mode 100644 index 6ec6336..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/packaging/src_targz.py +++ /dev/null @@ -1,43 +0,0 @@ -"""SCons.Tool.Packaging.targz - -The targz SRC packager. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/packaging/src_targz.py 4043 2009/02/23 09:06:45 scons" - -from SCons.Tool.packaging import putintopackageroot - -def package(env, target, source, PACKAGEROOT, **kw): - bld = env['BUILDERS']['Tar'] - bld.set_suffix('.tar.gz') - target, source = putintopackageroot(target, source, env, PACKAGEROOT, honor_install_location=0) - return bld(env, target, source, TARFLAGS='-zc') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/packaging/src_zip.py b/3rdParty/SCons/scons-local/SCons/Tool/packaging/src_zip.py deleted file mode 100644 index 54a3a12..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/packaging/src_zip.py +++ /dev/null @@ -1,43 +0,0 @@ -"""SCons.Tool.Packaging.zip - -The zip SRC packager. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/packaging/src_zip.py 4043 2009/02/23 09:06:45 scons" - -from SCons.Tool.packaging import putintopackageroot - -def package(env, target, source, PACKAGEROOT, **kw): - bld = env['BUILDERS']['Zip'] - bld.set_suffix('.zip') - target, source = putintopackageroot(target, source, env, PACKAGEROOT, honor_install_location=0) - return bld(env, target, source) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/packaging/tarbz2.py b/3rdParty/SCons/scons-local/SCons/Tool/packaging/tarbz2.py deleted file mode 100644 index 9e3df17..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/packaging/tarbz2.py +++ /dev/null @@ -1,44 +0,0 @@ -"""SCons.Tool.Packaging.tarbz2 - -The tarbz2 SRC packager. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/packaging/tarbz2.py 4043 2009/02/23 09:06:45 scons" - -from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot - -def package(env, target, source, PACKAGEROOT, **kw): - bld = env['BUILDERS']['Tar'] - bld.set_suffix('.tar.gz') - target, source = putintopackageroot(target, source, env, PACKAGEROOT) - target, source = stripinstallbuilder(target, source, env) - return bld(env, target, source, TARFLAGS='-jc') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/packaging/targz.py b/3rdParty/SCons/scons-local/SCons/Tool/packaging/targz.py deleted file mode 100644 index a3714a5..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/packaging/targz.py +++ /dev/null @@ -1,44 +0,0 @@ -"""SCons.Tool.Packaging.targz - -The targz SRC packager. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/packaging/targz.py 4043 2009/02/23 09:06:45 scons" - -from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot - -def package(env, target, source, PACKAGEROOT, **kw): - bld = env['BUILDERS']['Tar'] - bld.set_suffix('.tar.gz') - target, source = stripinstallbuilder(target, source, env) - target, source = putintopackageroot(target, source, env, PACKAGEROOT) - return bld(env, target, source, TARFLAGS='-zc') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/packaging/zip.py b/3rdParty/SCons/scons-local/SCons/Tool/packaging/zip.py deleted file mode 100644 index d955c3d..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/packaging/zip.py +++ /dev/null @@ -1,44 +0,0 @@ -"""SCons.Tool.Packaging.zip - -The zip SRC packager. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/packaging/zip.py 4043 2009/02/23 09:06:45 scons" - -from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot - -def package(env, target, source, PACKAGEROOT, **kw): - bld = env['BUILDERS']['Zip'] - bld.set_suffix('.zip') - target, source = stripinstallbuilder(target, source, env) - target, source = putintopackageroot(target, source, env, PACKAGEROOT) - return bld(env, target, source) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/pdf.py b/3rdParty/SCons/scons-local/SCons/Tool/pdf.py deleted file mode 100644 index 333f84f..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/pdf.py +++ /dev/null @@ -1,78 +0,0 @@ -"""SCons.Tool.pdf - -Common PDF Builder definition for various other Tool modules that use it. -Add an explicit action to run epstopdf to convert .eps files to .pdf - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/pdf.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Builder -import SCons.Tool - -PDFBuilder = None - -EpsPdfAction = SCons.Action.Action('$EPSTOPDFCOM', '$EPSTOPDFCOMSTR') - -def generate(env): - try: - env['BUILDERS']['PDF'] - except KeyError: - global PDFBuilder - if PDFBuilder is None: - PDFBuilder = SCons.Builder.Builder(action = {}, - source_scanner = SCons.Tool.PDFLaTeXScanner, - prefix = '$PDFPREFIX', - suffix = '$PDFSUFFIX', - emitter = {}, - source_ext_match = None, - single_source=True) - env['BUILDERS']['PDF'] = PDFBuilder - - env['PDFPREFIX'] = '' - env['PDFSUFFIX'] = '.pdf' - -# put the epstopdf builder in this routine so we can add it after -# the pdftex builder so that one is the default for no source suffix -def generate2(env): - bld = env['BUILDERS']['PDF'] - #bld.add_action('.ps', EpsPdfAction) # this is covered by direct Ghostcript action in gs.py - bld.add_action('.eps', EpsPdfAction) - - env['EPSTOPDF'] = 'epstopdf' - env['EPSTOPDFFLAGS'] = SCons.Util.CLVar('') - env['EPSTOPDFCOM'] = '$EPSTOPDF $EPSTOPDFFLAGS ${SOURCE} -o ${TARGET}' - -def exists(env): - # This only puts a skeleton Builder in place, so if someone - # references this Tool directly, it's always "available." - return 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/pdflatex.py b/3rdParty/SCons/scons-local/SCons/Tool/pdflatex.py deleted file mode 100644 index d5da5b1..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/pdflatex.py +++ /dev/null @@ -1,81 +0,0 @@ -"""SCons.Tool.pdflatex - -Tool-specific initialization for pdflatex. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/pdflatex.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Action -import SCons.Util -import SCons.Tool.pdf -import SCons.Tool.tex - -PDFLaTeXAction = None - -def PDFLaTeXAuxFunction(target = None, source= None, env=None): - result = SCons.Tool.tex.InternalLaTeXAuxAction( PDFLaTeXAction, target, source, env ) - return result - -PDFLaTeXAuxAction = None - -def generate(env): - """Add Builders and construction variables for pdflatex to an Environment.""" - global PDFLaTeXAction - if PDFLaTeXAction is None: - PDFLaTeXAction = SCons.Action.Action('$PDFLATEXCOM', '$PDFLATEXCOMSTR') - - global PDFLaTeXAuxAction - if PDFLaTeXAuxAction is None: - PDFLaTeXAuxAction = SCons.Action.Action(PDFLaTeXAuxFunction, - strfunction=SCons.Tool.tex.TeXLaTeXStrFunction) - - import pdf - pdf.generate(env) - - bld = env['BUILDERS']['PDF'] - bld.add_action('.ltx', PDFLaTeXAuxAction) - bld.add_action('.latex', PDFLaTeXAuxAction) - bld.add_emitter('.ltx', SCons.Tool.tex.tex_pdf_emitter) - bld.add_emitter('.latex', SCons.Tool.tex.tex_pdf_emitter) - - env['PDFLATEX'] = 'pdflatex' - env['PDFLATEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode') - env['PDFLATEXCOM'] = 'cd ${TARGET.dir} && $PDFLATEX $PDFLATEXFLAGS ${SOURCE.file}' - env['LATEXRETRIES'] = 3 - -def exists(env): - return env.Detect('pdflatex') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/pdftex.py b/3rdParty/SCons/scons-local/SCons/Tool/pdftex.py deleted file mode 100644 index c6e2e30..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/pdftex.py +++ /dev/null @@ -1,105 +0,0 @@ -"""SCons.Tool.pdftex - -Tool-specific initialization for pdftex. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/pdftex.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Action -import SCons.Util -import SCons.Tool.tex - -PDFTeXAction = None - -# This action might be needed more than once if we are dealing with -# labels and bibtex. -PDFLaTeXAction = None - -def PDFLaTeXAuxAction(target = None, source= None, env=None): - result = SCons.Tool.tex.InternalLaTeXAuxAction( PDFLaTeXAction, target, source, env ) - return result - -def PDFTeXLaTeXFunction(target = None, source= None, env=None): - """A builder for TeX and LaTeX that scans the source file to - decide the "flavor" of the source and then executes the appropriate - program.""" - if SCons.Tool.tex.is_LaTeX(source): - result = PDFLaTeXAuxAction(target,source,env) - else: - result = PDFTeXAction(target,source,env) - return result - -PDFTeXLaTeXAction = None - -def generate(env): - """Add Builders and construction variables for pdftex to an Environment.""" - global PDFTeXAction - if PDFTeXAction is None: - PDFTeXAction = SCons.Action.Action('$PDFTEXCOM', '$PDFTEXCOMSTR') - - global PDFLaTeXAction - if PDFLaTeXAction is None: - PDFLaTeXAction = SCons.Action.Action("$PDFLATEXCOM", "$PDFLATEXCOMSTR") - - global PDFTeXLaTeXAction - if PDFTeXLaTeXAction is None: - PDFTeXLaTeXAction = SCons.Action.Action(PDFTeXLaTeXFunction, - strfunction=SCons.Tool.tex.TeXLaTeXStrFunction) - - import pdf - pdf.generate(env) - - bld = env['BUILDERS']['PDF'] - bld.add_action('.tex', PDFTeXLaTeXAction) - bld.add_emitter('.tex', SCons.Tool.tex.tex_pdf_emitter) - - # Add the epstopdf builder after the pdftex builder - # so pdftex is the default for no source suffix - pdf.generate2(env) - - env['PDFTEX'] = 'pdftex' - env['PDFTEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode') - env['PDFTEXCOM'] = 'cd ${TARGET.dir} && $PDFTEX $PDFTEXFLAGS ${SOURCE.file}' - - # Duplicate from latex.py. If latex.py goes away, then this is still OK. - env['PDFLATEX'] = 'pdflatex' - env['PDFLATEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode') - env['PDFLATEXCOM'] = 'cd ${TARGET.dir} && $PDFLATEX $PDFLATEXFLAGS ${SOURCE.file}' - env['LATEXRETRIES'] = 3 - -def exists(env): - return env.Detect('pdftex') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/qt.py b/3rdParty/SCons/scons-local/SCons/Tool/qt.py deleted file mode 100644 index cf99080..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/qt.py +++ /dev/null @@ -1,336 +0,0 @@ - -"""SCons.Tool.qt - -Tool-specific initialization for Qt. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/qt.py 4043 2009/02/23 09:06:45 scons" - -import os.path -import re - -import SCons.Action -import SCons.Builder -import SCons.Defaults -import SCons.Scanner -import SCons.Tool -import SCons.Util - -class ToolQtWarning(SCons.Warnings.Warning): - pass - -class GeneratedMocFileNotIncluded(ToolQtWarning): - pass - -class QtdirNotFound(ToolQtWarning): - pass - -SCons.Warnings.enableWarningClass(ToolQtWarning) - -header_extensions = [".h", ".hxx", ".hpp", ".hh"] -if SCons.Util.case_sensitive_suffixes('.h', '.H'): - header_extensions.append('.H') -cplusplus = __import__('c++', globals(), locals(), []) -cxx_suffixes = cplusplus.CXXSuffixes - -def checkMocIncluded(target, source, env): - moc = target[0] - cpp = source[0] - # looks like cpp.includes is cleared before the build stage :-( - # not really sure about the path transformations (moc.cwd? cpp.cwd?) :-/ - path = SCons.Defaults.CScan.path(env, moc.cwd) - includes = SCons.Defaults.CScan(cpp, env, path) - if not moc in includes: - SCons.Warnings.warn( - GeneratedMocFileNotIncluded, - "Generated moc file '%s' is not included by '%s'" % - (str(moc), str(cpp))) - -def find_file(filename, paths, node_factory): - for dir in paths: - node = node_factory(filename, dir) - if node.rexists(): - return node - return None - -class _Automoc: - """ - Callable class, which works as an emitter for Programs, SharedLibraries and - StaticLibraries. - """ - - def __init__(self, objBuilderName): - self.objBuilderName = objBuilderName - - def __call__(self, target, source, env): - """ - Smart autoscan function. Gets the list of objects for the Program - or Lib. Adds objects and builders for the special qt files. - """ - try: - if int(env.subst('$QT_AUTOSCAN')) == 0: - return target, source - except ValueError: - pass - try: - debug = int(env.subst('$QT_DEBUG')) - except ValueError: - debug = 0 - - # some shortcuts used in the scanner - splitext = SCons.Util.splitext - objBuilder = getattr(env, self.objBuilderName) - - # some regular expressions: - # Q_OBJECT detection - q_object_search = re.compile(r'[^A-Za-z0-9]Q_OBJECT[^A-Za-z0-9]') - # cxx and c comment 'eater' - #comment = re.compile(r'(//.*)|(/\*(([^*])|(\*[^/]))*\*/)') - # CW: something must be wrong with the regexp. See also bug #998222 - # CURRENTLY THERE IS NO TEST CASE FOR THAT - - # The following is kind of hacky to get builders working properly (FIXME) - objBuilderEnv = objBuilder.env - objBuilder.env = env - mocBuilderEnv = env.Moc.env - env.Moc.env = env - - # make a deep copy for the result; MocH objects will be appended - out_sources = source[:] - - for obj in source: - if not obj.has_builder(): - # binary obj file provided - if debug: - print "scons: qt: '%s' seems to be a binary. Discarded." % str(obj) - continue - cpp = obj.sources[0] - if not splitext(str(cpp))[1] in cxx_suffixes: - if debug: - print "scons: qt: '%s' is no cxx file. Discarded." % str(cpp) - # c or fortran source - continue - #cpp_contents = comment.sub('', cpp.get_text_contents()) - cpp_contents = cpp.get_text_contents() - h=None - for h_ext in header_extensions: - # try to find the header file in the corresponding source - # directory - hname = splitext(cpp.name)[0] + h_ext - h = find_file(hname, (cpp.get_dir(),), env.File) - if h: - if debug: - print "scons: qt: Scanning '%s' (header of '%s')" % (str(h), str(cpp)) - #h_contents = comment.sub('', h.get_text_contents()) - h_contents = h.get_text_contents() - break - if not h and debug: - print "scons: qt: no header for '%s'." % (str(cpp)) - if h and q_object_search.search(h_contents): - # h file with the Q_OBJECT macro found -> add moc_cpp - moc_cpp = env.Moc(h) - moc_o = objBuilder(moc_cpp) - out_sources.append(moc_o) - #moc_cpp.target_scanner = SCons.Defaults.CScan - if debug: - print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(h), str(moc_cpp)) - if cpp and q_object_search.search(cpp_contents): - # cpp file with Q_OBJECT macro found -> add moc - # (to be included in cpp) - moc = env.Moc(cpp) - env.Ignore(moc, moc) - if debug: - print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(cpp), str(moc)) - #moc.source_scanner = SCons.Defaults.CScan - # restore the original env attributes (FIXME) - objBuilder.env = objBuilderEnv - env.Moc.env = mocBuilderEnv - - return (target, out_sources) - -AutomocShared = _Automoc('SharedObject') -AutomocStatic = _Automoc('StaticObject') - -def _detect(env): - """Not really safe, but fast method to detect the QT library""" - QTDIR = None - if not QTDIR: - QTDIR = env.get('QTDIR',None) - if not QTDIR: - QTDIR = os.environ.get('QTDIR',None) - if not QTDIR: - moc = env.WhereIs('moc') - if moc: - QTDIR = os.path.dirname(os.path.dirname(moc)) - SCons.Warnings.warn( - QtdirNotFound, - "Could not detect qt, using moc executable as a hint (QTDIR=%s)" % QTDIR) - else: - QTDIR = None - SCons.Warnings.warn( - QtdirNotFound, - "Could not detect qt, using empty QTDIR") - return QTDIR - -def uicEmitter(target, source, env): - adjustixes = SCons.Util.adjustixes - bs = SCons.Util.splitext(str(source[0].name))[0] - bs = os.path.join(str(target[0].get_dir()),bs) - # first target (header) is automatically added by builder - if len(target) < 2: - # second target is implementation - target.append(adjustixes(bs, - env.subst('$QT_UICIMPLPREFIX'), - env.subst('$QT_UICIMPLSUFFIX'))) - if len(target) < 3: - # third target is moc file - target.append(adjustixes(bs, - env.subst('$QT_MOCHPREFIX'), - env.subst('$QT_MOCHSUFFIX'))) - return target, source - -def uicScannerFunc(node, env, path): - lookout = [] - lookout.extend(env['CPPPATH']) - lookout.append(str(node.rfile().dir)) - includes = re.findall("<include.*?>(.*?)</include>", node.get_text_contents()) - result = [] - for incFile in includes: - dep = env.FindFile(incFile,lookout) - if dep: - result.append(dep) - return result - -uicScanner = SCons.Scanner.Base(uicScannerFunc, - name = "UicScanner", - node_class = SCons.Node.FS.File, - node_factory = SCons.Node.FS.File, - recursive = 0) - -def generate(env): - """Add Builders and construction variables for qt to an Environment.""" - CLVar = SCons.Util.CLVar - Action = SCons.Action.Action - Builder = SCons.Builder.Builder - - env.SetDefault(QTDIR = _detect(env), - QT_BINPATH = os.path.join('$QTDIR', 'bin'), - QT_CPPPATH = os.path.join('$QTDIR', 'include'), - QT_LIBPATH = os.path.join('$QTDIR', 'lib'), - QT_MOC = os.path.join('$QT_BINPATH','moc'), - QT_UIC = os.path.join('$QT_BINPATH','uic'), - QT_LIB = 'qt', # may be set to qt-mt - - QT_AUTOSCAN = 1, # scan for moc'able sources - - # Some QT specific flags. I don't expect someone wants to - # manipulate those ... - QT_UICIMPLFLAGS = CLVar(''), - QT_UICDECLFLAGS = CLVar(''), - QT_MOCFROMHFLAGS = CLVar(''), - QT_MOCFROMCXXFLAGS = CLVar('-i'), - - # suffixes/prefixes for the headers / sources to generate - QT_UICDECLPREFIX = '', - QT_UICDECLSUFFIX = '.h', - QT_UICIMPLPREFIX = 'uic_', - QT_UICIMPLSUFFIX = '$CXXFILESUFFIX', - QT_MOCHPREFIX = 'moc_', - QT_MOCHSUFFIX = '$CXXFILESUFFIX', - QT_MOCCXXPREFIX = '', - QT_MOCCXXSUFFIX = '.moc', - QT_UISUFFIX = '.ui', - - # Commands for the qt support ... - # command to generate header, implementation and moc-file - # from a .ui file - QT_UICCOM = [ - CLVar('$QT_UIC $QT_UICDECLFLAGS -o ${TARGETS[0]} $SOURCE'), - CLVar('$QT_UIC $QT_UICIMPLFLAGS -impl ${TARGETS[0].file} ' - '-o ${TARGETS[1]} $SOURCE'), - CLVar('$QT_MOC $QT_MOCFROMHFLAGS -o ${TARGETS[2]} ${TARGETS[0]}')], - # command to generate meta object information for a class - # declarated in a header - QT_MOCFROMHCOM = ( - '$QT_MOC $QT_MOCFROMHFLAGS -o ${TARGETS[0]} $SOURCE'), - # command to generate meta object information for a class - # declarated in a cpp file - QT_MOCFROMCXXCOM = [ - CLVar('$QT_MOC $QT_MOCFROMCXXFLAGS -o ${TARGETS[0]} $SOURCE'), - Action(checkMocIncluded,None)]) - - # ... and the corresponding builders - uicBld = Builder(action=SCons.Action.Action('$QT_UICCOM', '$QT_UICCOMSTR'), - emitter=uicEmitter, - src_suffix='$QT_UISUFFIX', - suffix='$QT_UICDECLSUFFIX', - prefix='$QT_UICDECLPREFIX', - source_scanner=uicScanner) - mocBld = Builder(action={}, prefix={}, suffix={}) - for h in header_extensions: - act = SCons.Action.Action('$QT_MOCFROMHCOM', '$QT_MOCFROMHCOMSTR') - mocBld.add_action(h, act) - mocBld.prefix[h] = '$QT_MOCHPREFIX' - mocBld.suffix[h] = '$QT_MOCHSUFFIX' - for cxx in cxx_suffixes: - act = SCons.Action.Action('$QT_MOCFROMCXXCOM', '$QT_MOCFROMCXXCOMSTR') - mocBld.add_action(cxx, act) - mocBld.prefix[cxx] = '$QT_MOCCXXPREFIX' - mocBld.suffix[cxx] = '$QT_MOCCXXSUFFIX' - - # register the builders - env['BUILDERS']['Uic'] = uicBld - env['BUILDERS']['Moc'] = mocBld - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - static_obj.add_src_builder('Uic') - shared_obj.add_src_builder('Uic') - - # We use the emitters of Program / StaticLibrary / SharedLibrary - # to scan for moc'able files - # We can't refer to the builders directly, we have to fetch them - # as Environment attributes because that sets them up to be called - # correctly later by our emitter. - env.AppendUnique(PROGEMITTER =[AutomocStatic], - SHLIBEMITTER=[AutomocShared], - LIBEMITTER =[AutomocStatic], - # Of course, we need to link against the qt libraries - CPPPATH=["$QT_CPPPATH"], - LIBPATH=["$QT_LIBPATH"], - LIBS=['$QT_LIB']) - -def exists(env): - return _detect(env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/rmic.py b/3rdParty/SCons/scons-local/SCons/Tool/rmic.py deleted file mode 100644 index a743e04..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/rmic.py +++ /dev/null @@ -1,121 +0,0 @@ -"""SCons.Tool.rmic - -Tool-specific initialization for rmic. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/rmic.py 4043 2009/02/23 09:06:45 scons" - -import os.path -import string - -import SCons.Action -import SCons.Builder -import SCons.Node.FS -import SCons.Util - -def emit_rmic_classes(target, source, env): - """Create and return lists of Java RMI stub and skeleton - class files to be created from a set of class files. - """ - class_suffix = env.get('JAVACLASSSUFFIX', '.class') - classdir = env.get('JAVACLASSDIR') - - if not classdir: - try: - s = source[0] - except IndexError: - classdir = '.' - else: - try: - classdir = s.attributes.java_classdir - except AttributeError: - classdir = '.' - classdir = env.Dir(classdir).rdir() - if str(classdir) == '.': - c_ = None - else: - c_ = str(classdir) + os.sep - - slist = [] - for src in source: - try: - classname = src.attributes.java_classname - except AttributeError: - classname = str(src) - if c_ and classname[:len(c_)] == c_: - classname = classname[len(c_):] - if class_suffix and classname[:-len(class_suffix)] == class_suffix: - classname = classname[-len(class_suffix):] - s = src.rfile() - s.attributes.java_classdir = classdir - s.attributes.java_classname = classname - slist.append(s) - - stub_suffixes = ['_Stub'] - if env.get('JAVAVERSION') == '1.4': - stub_suffixes.append('_Skel') - - tlist = [] - for s in source: - for suff in stub_suffixes: - fname = string.replace(s.attributes.java_classname, '.', os.sep) + \ - suff + class_suffix - t = target[0].File(fname) - t.attributes.java_lookupdir = target[0] - tlist.append(t) - - return tlist, source - -RMICAction = SCons.Action.Action('$RMICCOM', '$RMICCOMSTR') - -RMICBuilder = SCons.Builder.Builder(action = RMICAction, - emitter = emit_rmic_classes, - src_suffix = '$JAVACLASSSUFFIX', - target_factory = SCons.Node.FS.Dir, - source_factory = SCons.Node.FS.File) - -def generate(env): - """Add Builders and construction variables for rmic to an Environment.""" - env['BUILDERS']['RMIC'] = RMICBuilder - - env['RMIC'] = 'rmic' - env['RMICFLAGS'] = SCons.Util.CLVar('') - env['RMICCOM'] = '$RMIC $RMICFLAGS -d ${TARGET.attributes.java_lookupdir} -classpath ${SOURCE.attributes.java_classdir} ${SOURCES.attributes.java_classname}' - env['JAVACLASSSUFFIX'] = '.class' - -def exists(env): - return env.Detect('rmic') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/rpcgen.py b/3rdParty/SCons/scons-local/SCons/Tool/rpcgen.py deleted file mode 100644 index 727cdce..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/rpcgen.py +++ /dev/null @@ -1,70 +0,0 @@ -"""SCons.Tool.rpcgen - -Tool-specific initialization for RPCGEN tools. - -Three normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/rpcgen.py 4043 2009/02/23 09:06:45 scons" - -from SCons.Builder import Builder -import SCons.Util - -cmd = "cd ${SOURCE.dir} && $RPCGEN -%s $RPCGENFLAGS %s -o ${TARGET.abspath} ${SOURCE.file}" - -rpcgen_client = cmd % ('l', '$RPCGENCLIENTFLAGS') -rpcgen_header = cmd % ('h', '$RPCGENHEADERFLAGS') -rpcgen_service = cmd % ('m', '$RPCGENSERVICEFLAGS') -rpcgen_xdr = cmd % ('c', '$RPCGENXDRFLAGS') - -def generate(env): - "Add RPCGEN Builders and construction variables for an Environment." - - client = Builder(action=rpcgen_client, suffix='_clnt.c', src_suffix='.x') - header = Builder(action=rpcgen_header, suffix='.h', src_suffix='.x') - service = Builder(action=rpcgen_service, suffix='_svc.c', src_suffix='.x') - xdr = Builder(action=rpcgen_xdr, suffix='_xdr.c', src_suffix='.x') - env.Append(BUILDERS={'RPCGenClient' : client, - 'RPCGenHeader' : header, - 'RPCGenService' : service, - 'RPCGenXDR' : xdr}) - env['RPCGEN'] = 'rpcgen' - env['RPCGENFLAGS'] = SCons.Util.CLVar('') - env['RPCGENCLIENTFLAGS'] = SCons.Util.CLVar('') - env['RPCGENHEADERFLAGS'] = SCons.Util.CLVar('') - env['RPCGENSERVICEFLAGS'] = SCons.Util.CLVar('') - env['RPCGENXDRFLAGS'] = SCons.Util.CLVar('') - -def exists(env): - return env.Detect('rpcgen') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/rpm.py b/3rdParty/SCons/scons-local/SCons/Tool/rpm.py deleted file mode 100644 index d085d99..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/rpm.py +++ /dev/null @@ -1,132 +0,0 @@ -"""SCons.Tool.rpm - -Tool-specific initialization for rpm. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -The rpm tool calls the rpmbuild command. The first and only argument should a -tar.gz consisting of the source file and a specfile. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/rpm.py 4043 2009/02/23 09:06:45 scons" - -import os -import re -import shutil -import subprocess - -import SCons.Builder -import SCons.Node.FS -import SCons.Util -import SCons.Action -import SCons.Defaults - -def get_cmd(source, env): - tar_file_with_included_specfile = source - if SCons.Util.is_List(source): - tar_file_with_included_specfile = source[0] - return "%s %s %s"%(env['RPM'], env['RPMFLAGS'], - tar_file_with_included_specfile.abspath ) - -def build_rpm(target, source, env): - # create a temporary rpm build root. - tmpdir = os.path.join( os.path.dirname( target[0].abspath ), 'rpmtemp' ) - if os.path.exists(tmpdir): - shutil.rmtree(tmpdir) - - # now create the mandatory rpm directory structure. - for d in ['RPMS', 'SRPMS', 'SPECS', 'BUILD']: - os.makedirs( os.path.join( tmpdir, d ) ) - - # set the topdir as an rpmflag. - env.Prepend( RPMFLAGS = '--define \'_topdir %s\'' % tmpdir ) - - # now call rpmbuild to create the rpm package. - handle = subprocess.Popen(get_cmd(source, env), - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - shell=True) - output = handle.stdout.read() - status = handle.wait() - - if status: - raise SCons.Errors.BuildError( node=target[0], - errstr=output, - filename=str(target[0]) ) - else: - # XXX: assume that LC_ALL=c is set while running rpmbuild - output_files = re.compile( 'Wrote: (.*)' ).findall( output ) - - for output, input in zip( output_files, target ): - rpm_output = os.path.basename(output) - expected = os.path.basename(input.get_path()) - - assert expected == rpm_output, "got %s but expected %s" % (rpm_output, expected) - shutil.copy( output, input.abspath ) - - - # cleanup before leaving. - shutil.rmtree(tmpdir) - - return status - -def string_rpm(target, source, env): - try: - return env['RPMCOMSTR'] - except KeyError: - return get_cmd(source, env) - -rpmAction = SCons.Action.Action(build_rpm, string_rpm) - -RpmBuilder = SCons.Builder.Builder(action = SCons.Action.Action('$RPMCOM', '$RPMCOMSTR'), - source_scanner = SCons.Defaults.DirScanner, - suffix = '$RPMSUFFIX') - - - -def generate(env): - """Add Builders and construction variables for rpm to an Environment.""" - try: - bld = env['BUILDERS']['Rpm'] - except KeyError: - bld = RpmBuilder - env['BUILDERS']['Rpm'] = bld - - env.SetDefault(RPM = 'LC_ALL=c rpmbuild') - env.SetDefault(RPMFLAGS = SCons.Util.CLVar('-ta')) - env.SetDefault(RPMCOM = rpmAction) - env.SetDefault(RPMSUFFIX = '.rpm') - -def exists(env): - return env.Detect('rpmbuild') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/sgiar.py b/3rdParty/SCons/scons-local/SCons/Tool/sgiar.py deleted file mode 100644 index 6df401a..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/sgiar.py +++ /dev/null @@ -1,68 +0,0 @@ -"""SCons.Tool.sgiar - -Tool-specific initialization for SGI ar (library archive). If CC -exists, static libraries should be built with it, so the prelinker has -a chance to resolve C++ template instantiations. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/sgiar.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Defaults -import SCons.Tool -import SCons.Util - -def generate(env): - """Add Builders and construction variables for ar to an Environment.""" - SCons.Tool.createStaticLibBuilder(env) - - if env.Detect('CC'): - env['AR'] = 'CC' - env['ARFLAGS'] = SCons.Util.CLVar('-ar') - env['ARCOM'] = '$AR $ARFLAGS -o $TARGET $SOURCES' - else: - env['AR'] = 'ar' - env['ARFLAGS'] = SCons.Util.CLVar('r') - env['ARCOM'] = '$AR $ARFLAGS $TARGET $SOURCES' - - env['SHLINK'] = '$LINK' - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared') - env['SHLINKCOM'] = '$SHLINK $SHLINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' - env['LIBPREFIX'] = 'lib' - env['LIBSUFFIX'] = '.a' - -def exists(env): - return env.Detect('CC') or env.Detect('ar') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/sgic++.py b/3rdParty/SCons/scons-local/SCons/Tool/sgic++.py deleted file mode 100644 index 262ad53..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/sgic++.py +++ /dev/null @@ -1,58 +0,0 @@ -"""SCons.Tool.sgic++ - -Tool-specific initialization for MIPSpro C++ on SGI. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/sgic++.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Util - -cplusplus = __import__('c++', globals(), locals(), []) - -def generate(env): - """Add Builders and construction variables for SGI MIPS C++ to an Environment.""" - - cplusplus.generate(env) - - env['CXX'] = 'CC' - env['CXXFLAGS'] = SCons.Util.CLVar('-LANG:std') - env['SHCXX'] = '$CXX' - env['SHOBJSUFFIX'] = '.o' - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 - -def exists(env): - return env.Detect('CC') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/sgicc.py b/3rdParty/SCons/scons-local/SCons/Tool/sgicc.py deleted file mode 100644 index b8ef3d7..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/sgicc.py +++ /dev/null @@ -1,53 +0,0 @@ -"""SCons.Tool.sgicc - -Tool-specific initialization for MIPSPro cc on SGI. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/sgicc.py 4043 2009/02/23 09:06:45 scons" - -import cc - -def generate(env): - """Add Builders and construction variables for gcc to an Environment.""" - cc.generate(env) - - env['CXX'] = 'CC' - env['SHOBJSUFFIX'] = '.o' - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 - -def exists(env): - return env.Detect('cc') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/sgilink.py b/3rdParty/SCons/scons-local/SCons/Tool/sgilink.py deleted file mode 100644 index a9ac31f..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/sgilink.py +++ /dev/null @@ -1,63 +0,0 @@ -"""SCons.Tool.sgilink - -Tool-specific initialization for the SGI MIPSPro linker on SGI. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/sgilink.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Util - -import link - -linkers = ['CC', 'cc'] - -def generate(env): - """Add Builders and construction variables for MIPSPro to an Environment.""" - link.generate(env) - - env['LINK'] = env.Detect(linkers) or 'cc' - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared') - - # __RPATH is set to $_RPATH in the platform specification if that - # platform supports it. - env.Append(LINKFLAGS=['$__RPATH']) - env['RPATHPREFIX'] = '-rpath ' - env['RPATHSUFFIX'] = '' - env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}' - -def exists(env): - return env.Detect(linkers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/sunar.py b/3rdParty/SCons/scons-local/SCons/Tool/sunar.py deleted file mode 100644 index 5f7288e..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/sunar.py +++ /dev/null @@ -1,67 +0,0 @@ -"""engine.SCons.Tool.sunar - -Tool-specific initialization for Solaris (Forte) ar (library archive). If CC -exists, static libraries should be built with it, so that template -instantians can be resolved. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/sunar.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Defaults -import SCons.Tool -import SCons.Util - -def generate(env): - """Add Builders and construction variables for ar to an Environment.""" - SCons.Tool.createStaticLibBuilder(env) - - if env.Detect('CC'): - env['AR'] = 'CC' - env['ARFLAGS'] = SCons.Util.CLVar('-xar') - env['ARCOM'] = '$AR $ARFLAGS -o $TARGET $SOURCES' - else: - env['AR'] = 'ar' - env['ARFLAGS'] = SCons.Util.CLVar('r') - env['ARCOM'] = '$AR $ARFLAGS $TARGET $SOURCES' - - env['SHLINK'] = '$LINK' - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -G') - env['SHLINKCOM'] = '$SHLINK $SHLINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' - env['LIBPREFIX'] = 'lib' - env['LIBSUFFIX'] = '.a' - -def exists(env): - return env.Detect('CC') or env.Detect('ar') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/sunc++.py b/3rdParty/SCons/scons-local/SCons/Tool/sunc++.py deleted file mode 100644 index c2bcf8e..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/sunc++.py +++ /dev/null @@ -1,106 +0,0 @@ -"""SCons.Tool.sunc++ - -Tool-specific initialization for C++ on SunOS / Solaris. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/sunc++.py 4043 2009/02/23 09:06:45 scons" - -import SCons - -import os.path - -cplusplus = __import__('c++', globals(), locals(), []) - -# use the package installer tool lslpp to figure out where cppc and what -# version of it is installed -def get_cppc(env): - cxx = env.get('CXX', None) - if cxx: - cppcPath = os.path.dirname(cxx) - else: - cppcPath = None - - cppcVersion = None - - pkginfo = env.subst('$PKGINFO') - pkgchk = env.subst('$PKGCHK') - - def look_pkg_db(pkginfo=pkginfo, pkgchk=pkgchk): - version = None - path = None - for package in ['SPROcpl']: - cmd = "%s -l %s 2>/dev/null | grep '^ *VERSION:'" % (pkginfo, package) - line = os.popen(cmd).readline() - if line: - version = line.split()[-1] - cmd = "%s -l %s 2>/dev/null | grep '^Pathname:.*/bin/CC$' | grep -v '/SC[0-9]*\.[0-9]*/'" % (pkgchk, package) - line = os.popen(cmd).readline() - if line: - path = os.path.dirname(line.split()[-1]) - break - - return path, version - - path, version = look_pkg_db() - if path and version: - cppcPath, cppcVersion = path, version - - return (cppcPath, 'CC', 'CC', cppcVersion) - -def generate(env): - """Add Builders and construction variables for SunPRO C++.""" - path, cxx, shcxx, version = get_cppc(env) - if path: - cxx = os.path.join(path, cxx) - shcxx = os.path.join(path, shcxx) - - cplusplus.generate(env) - - env['CXX'] = cxx - env['SHCXX'] = shcxx - env['CXXVERSION'] = version - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS -KPIC') - env['SHOBJPREFIX'] = 'so_' - env['SHOBJSUFFIX'] = '.o' - -def exists(env): - path, cxx, shcxx, version = get_cppc(env) - if path and cxx: - cppc = os.path.join(path, cxx) - if os.path.exists(cppc): - return cppc - return None - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/suncc.py b/3rdParty/SCons/scons-local/SCons/Tool/suncc.py deleted file mode 100644 index 5f171d3..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/suncc.py +++ /dev/null @@ -1,58 +0,0 @@ -"""SCons.Tool.suncc - -Tool-specific initialization for Sun Solaris (Forte) CC and cc. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/suncc.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Util - -import cc - -def generate(env): - """ - Add Builders and construction variables for Forte C and C++ compilers - to an Environment. - """ - cc.generate(env) - - env['CXX'] = 'CC' - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS -KPIC') - env['SHOBJPREFIX'] = 'so_' - env['SHOBJSUFFIX'] = '.o' - -def exists(env): - return env.Detect('CC') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/sunf77.py b/3rdParty/SCons/scons-local/SCons/Tool/sunf77.py deleted file mode 100644 index 95e35bf..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/sunf77.py +++ /dev/null @@ -1,63 +0,0 @@ -"""SCons.Tool.sunf77 - -Tool-specific initialization for sunf77, the Sun Studio F77 compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/sunf77.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Util - -from FortranCommon import add_all_to_env - -compilers = ['sunf77', 'f77'] - -def generate(env): - """Add Builders and construction variables for sunf77 to an Environment.""" - add_all_to_env(env) - - fcomp = env.Detect(compilers) or 'f77' - env['FORTRAN'] = fcomp - env['F77'] = fcomp - - env['SHFORTRAN'] = '$FORTRAN' - env['SHF77'] = '$F77' - - env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -KPIC') - env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS -KPIC') - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/sunf90.py b/3rdParty/SCons/scons-local/SCons/Tool/sunf90.py deleted file mode 100644 index db2bfda..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/sunf90.py +++ /dev/null @@ -1,64 +0,0 @@ -"""SCons.Tool.sunf90 - -Tool-specific initialization for sunf90, the Sun Studio F90 compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/sunf90.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Util - -from FortranCommon import add_all_to_env - -compilers = ['sunf90', 'f90'] - -def generate(env): - """Add Builders and construction variables for sun f90 compiler to an - Environment.""" - add_all_to_env(env) - - fcomp = env.Detect(compilers) or 'f90' - env['FORTRAN'] = fcomp - env['F90'] = fcomp - - env['SHFORTRAN'] = '$FORTRAN' - env['SHF90'] = '$F90' - - env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -KPIC') - env['SHF90FLAGS'] = SCons.Util.CLVar('$F90FLAGS -KPIC') - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/sunf95.py b/3rdParty/SCons/scons-local/SCons/Tool/sunf95.py deleted file mode 100644 index 3a1b326..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/sunf95.py +++ /dev/null @@ -1,64 +0,0 @@ -"""SCons.Tool.sunf95 - -Tool-specific initialization for sunf95, the Sun Studio F95 compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/sunf95.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Util - -from FortranCommon import add_all_to_env - -compilers = ['sunf95', 'f95'] - -def generate(env): - """Add Builders and construction variables for sunf95 to an - Environment.""" - add_all_to_env(env) - - fcomp = env.Detect(compilers) or 'f95' - env['FORTRAN'] = fcomp - env['F95'] = fcomp - - env['SHFORTRAN'] = '$FORTRAN' - env['SHF95'] = '$F95' - - env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -KPIC') - env['SHF95FLAGS'] = SCons.Util.CLVar('$F95FLAGS -KPIC') - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/sunlink.py b/3rdParty/SCons/scons-local/SCons/Tool/sunlink.py deleted file mode 100644 index 3e97aa9..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/sunlink.py +++ /dev/null @@ -1,77 +0,0 @@ -"""SCons.Tool.sunlink - -Tool-specific initialization for the Sun Solaris (Forte) linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/sunlink.py 4043 2009/02/23 09:06:45 scons" - -import os -import os.path - -import SCons.Util - -import link - -ccLinker = None - -# search for the acc compiler and linker front end - -try: - dirs = os.listdir('/opt') -except (IOError, OSError): - # Not being able to read the directory because it doesn't exist - # (IOError) or isn't readable (OSError) is okay. - dirs = [] - -for d in dirs: - linker = '/opt/' + d + '/bin/CC' - if os.path.exists(linker): - ccLinker = linker - break - -def generate(env): - """Add Builders and construction variables for Forte to an Environment.""" - link.generate(env) - - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -G') - - env.Append(LINKFLAGS=['$__RPATH']) - env['RPATHPREFIX'] = '-R' - env['RPATHSUFFIX'] = '' - env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}' - -def exists(env): - return ccLinker - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/swig.py b/3rdParty/SCons/scons-local/SCons/Tool/swig.py deleted file mode 100644 index 947cfde..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/swig.py +++ /dev/null @@ -1,155 +0,0 @@ -"""SCons.Tool.swig - -Tool-specific initialization for swig. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/swig.py 4043 2009/02/23 09:06:45 scons" - -import os.path -import re -import string - -import SCons.Action -import SCons.Defaults -import SCons.Scanner -import SCons.Tool -import SCons.Util - -SwigAction = SCons.Action.Action('$SWIGCOM', '$SWIGCOMSTR') - -def swigSuffixEmitter(env, source): - if '-c++' in SCons.Util.CLVar(env.subst("$SWIGFLAGS", source=source)): - return '$SWIGCXXFILESUFFIX' - else: - return '$SWIGCFILESUFFIX' - -# Match '%module test', as well as '%module(directors="1") test' -# Also allow for test to be quoted (SWIG permits double quotes, but not single) -_reModule = re.compile(r'%module(\s*\(.*\))?\s+("?)(.+)\2') - -def _find_modules(src): - """Find all modules referenced by %module lines in `src`, a SWIG .i file. - Returns a list of all modules, and a flag set if SWIG directors have - been requested (SWIG will generate an additional header file in this - case.)""" - directors = 0 - mnames = [] - matches = _reModule.findall(open(src).read()) - for m in matches: - mnames.append(m[2]) - directors = directors or string.find(m[0], 'directors') >= 0 - return mnames, directors - -def _add_director_header_targets(target, env): - # Directors only work with C++ code, not C - suffix = env.subst(env['SWIGCXXFILESUFFIX']) - # For each file ending in SWIGCXXFILESUFFIX, add a new target director - # header by replacing the ending with SWIGDIRECTORSUFFIX. - for x in target[:]: - n = x.name - d = x.dir - if n[-len(suffix):] == suffix: - target.append(d.File(n[:-len(suffix)] + env['SWIGDIRECTORSUFFIX'])) - -def _swigEmitter(target, source, env): - swigflags = env.subst("$SWIGFLAGS", target=target, source=source) - flags = SCons.Util.CLVar(swigflags) - for src in source: - src = str(src.rfile()) - mnames = None - if "-python" in flags and "-noproxy" not in flags: - if mnames is None: - mnames, directors = _find_modules(src) - if directors: - _add_director_header_targets(target, env) - target.extend(map(lambda m, d=target[0].dir: - d.File(m + ".py"), mnames)) - if "-java" in flags: - if mnames is None: - mnames, directors = _find_modules(src) - if directors: - _add_director_header_targets(target, env) - java_files = map(lambda m: [m + ".java", m + "JNI.java"], mnames) - java_files = SCons.Util.flatten(java_files) - outdir = env.subst('$SWIGOUTDIR', target=target, source=source) - if outdir: - java_files = map(lambda j, o=outdir: os.path.join(o, j), java_files) - java_files = map(env.fs.File, java_files) - for jf in java_files: - t_from_s = lambda t, p, s, x: t.dir - SCons.Util.AddMethod(jf, t_from_s, 'target_from_source') - target.extend(java_files) - return (target, source) - -def generate(env): - """Add Builders and construction variables for swig to an Environment.""" - c_file, cxx_file = SCons.Tool.createCFileBuilders(env) - - c_file.suffix['.i'] = swigSuffixEmitter - cxx_file.suffix['.i'] = swigSuffixEmitter - - c_file.add_action('.i', SwigAction) - c_file.add_emitter('.i', _swigEmitter) - cxx_file.add_action('.i', SwigAction) - cxx_file.add_emitter('.i', _swigEmitter) - - java_file = SCons.Tool.CreateJavaFileBuilder(env) - - java_file.suffix['.i'] = swigSuffixEmitter - - java_file.add_action('.i', SwigAction) - java_file.add_emitter('.i', _swigEmitter) - - env['SWIG'] = 'swig' - env['SWIGFLAGS'] = SCons.Util.CLVar('') - env['SWIGDIRECTORSUFFIX'] = '_wrap.h' - env['SWIGCFILESUFFIX'] = '_wrap$CFILESUFFIX' - env['SWIGCXXFILESUFFIX'] = '_wrap$CXXFILESUFFIX' - env['_SWIGOUTDIR'] = r'${"-outdir \"%s\"" % SWIGOUTDIR}' - env['SWIGPATH'] = [] - env['SWIGINCPREFIX'] = '-I' - env['SWIGINCSUFFIX'] = '' - env['_SWIGINCFLAGS'] = '$( ${_concat(SWIGINCPREFIX, SWIGPATH, SWIGINCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' - env['SWIGCOM'] = '$SWIG -o $TARGET ${_SWIGOUTDIR} ${_SWIGINCFLAGS} $SWIGFLAGS $SOURCES' - - expr = '^[ \t]*%[ \t]*(?:include|import|extern)[ \t]*(<|"?)([^>\s"]+)(?:>|"?)' - scanner = SCons.Scanner.ClassicCPP("SWIGScan", ".i", "SWIGPATH", expr) - - env.Append(SCANNERS = scanner) - -def exists(env): - return env.Detect(['swig']) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/tar.py b/3rdParty/SCons/scons-local/SCons/Tool/tar.py deleted file mode 100644 index b573282..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/tar.py +++ /dev/null @@ -1,73 +0,0 @@ -"""SCons.Tool.tar - -Tool-specific initialization for tar. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/tar.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Action -import SCons.Builder -import SCons.Defaults -import SCons.Node.FS -import SCons.Util - -tars = ['tar', 'gtar'] - -TarAction = SCons.Action.Action('$TARCOM', '$TARCOMSTR') - -TarBuilder = SCons.Builder.Builder(action = TarAction, - source_factory = SCons.Node.FS.Entry, - source_scanner = SCons.Defaults.DirScanner, - suffix = '$TARSUFFIX', - multi = 1) - - -def generate(env): - """Add Builders and construction variables for tar to an Environment.""" - try: - bld = env['BUILDERS']['Tar'] - except KeyError: - bld = TarBuilder - env['BUILDERS']['Tar'] = bld - - env['TAR'] = env.Detect(tars) or 'gtar' - env['TARFLAGS'] = SCons.Util.CLVar('-c') - env['TARCOM'] = '$TAR $TARFLAGS -f $TARGET $SOURCES' - env['TARSUFFIX'] = '.tar' - -def exists(env): - return env.Detect(tars) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/tex.py b/3rdParty/SCons/scons-local/SCons/Tool/tex.py deleted file mode 100644 index cbbee2d..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/tex.py +++ /dev/null @@ -1,646 +0,0 @@ -"""SCons.Tool.tex - -Tool-specific initialization for TeX. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/tex.py 4043 2009/02/23 09:06:45 scons" - -import os.path -import re -import string -import shutil - -import SCons.Action -import SCons.Node -import SCons.Node.FS -import SCons.Util -import SCons.Scanner.LaTeX - -Verbose = False - -must_rerun_latex = True - -# these are files that just need to be checked for changes and then rerun latex -check_suffixes = ['.toc', '.lof', '.lot', '.out', '.nav', '.snm'] - -# these are files that require bibtex or makeindex to be run when they change -all_suffixes = check_suffixes + ['.bbl', '.idx', '.nlo', '.glo'] - -# -# regular expressions used to search for Latex features -# or outputs that require rerunning latex -# -# search for all .aux files opened by latex (recorded in the .log file) -openout_aux_re = re.compile(r"\\openout.*`(.*\.aux)'") - -#printindex_re = re.compile(r"^[^%]*\\printindex", re.MULTILINE) -#printnomenclature_re = re.compile(r"^[^%]*\\printnomenclature", re.MULTILINE) -#printglossary_re = re.compile(r"^[^%]*\\printglossary", re.MULTILINE) - -# search to find rerun warnings -warning_rerun_str = '(^LaTeX Warning:.*Rerun)|(^Package \w+ Warning:.*Rerun)' -warning_rerun_re = re.compile(warning_rerun_str, re.MULTILINE) - -# search to find citation rerun warnings -rerun_citations_str = "^LaTeX Warning:.*\n.*Rerun to get citations correct" -rerun_citations_re = re.compile(rerun_citations_str, re.MULTILINE) - -# search to find undefined references or citations warnings -undefined_references_str = '(^LaTeX Warning:.*undefined references)|(^Package \w+ Warning:.*undefined citations)' -undefined_references_re = re.compile(undefined_references_str, re.MULTILINE) - -# used by the emitter -auxfile_re = re.compile(r".", re.MULTILINE) -tableofcontents_re = re.compile(r"^[^%\n]*\\tableofcontents", re.MULTILINE) -makeindex_re = re.compile(r"^[^%\n]*\\makeindex", re.MULTILINE) -bibliography_re = re.compile(r"^[^%\n]*\\bibliography", re.MULTILINE) -listoffigures_re = re.compile(r"^[^%\n]*\\listoffigures", re.MULTILINE) -listoftables_re = re.compile(r"^[^%\n]*\\listoftables", re.MULTILINE) -hyperref_re = re.compile(r"^[^%\n]*\\usepackage.*\{hyperref\}", re.MULTILINE) -makenomenclature_re = re.compile(r"^[^%\n]*\\makenomenclature", re.MULTILINE) -makeglossary_re = re.compile(r"^[^%\n]*\\makeglossary", re.MULTILINE) -beamer_re = re.compile(r"^[^%\n]*\\documentclass\{beamer\}", re.MULTILINE) - -# search to find all files included by Latex -include_re = re.compile(r'^[^%\n]*\\(?:include|input){([^}]*)}', re.MULTILINE) - -# search to find all graphics files included by Latex -includegraphics_re = re.compile(r'^[^%\n]*\\(?:includegraphics(?:\[[^\]]+\])?){([^}]*)}', re.MULTILINE) - -# search to find all files opened by Latex (recorded in .log file) -openout_re = re.compile(r"\\openout.*`(.*)'") - -# list of graphics file extensions for TeX and LaTeX -TexGraphics = SCons.Scanner.LaTeX.TexGraphics -LatexGraphics = SCons.Scanner.LaTeX.LatexGraphics - -# An Action sufficient to build any generic tex file. -TeXAction = None - -# An action to build a latex file. This action might be needed more -# than once if we are dealing with labels and bibtex. -LaTeXAction = None - -# An action to run BibTeX on a file. -BibTeXAction = None - -# An action to run MakeIndex on a file. -MakeIndexAction = None - -# An action to run MakeIndex (for nomencl) on a file. -MakeNclAction = None - -# An action to run MakeIndex (for glossary) on a file. -MakeGlossaryAction = None - -# Used as a return value of modify_env_var if the variable is not set. -_null = SCons.Scanner.LaTeX._null - -modify_env_var = SCons.Scanner.LaTeX.modify_env_var - -def FindFile(name,suffixes,paths,env,requireExt=False): - if requireExt: - name,ext = SCons.Util.splitext(name) - # if the user gave an extension use it. - if ext: - name = name + ext - if Verbose: - print " searching for '%s' with extensions: " % name,suffixes - - for path in paths: - testName = os.path.join(path,name) - if Verbose: - print " look for '%s'" % testName - if os.path.exists(testName): - if Verbose: - print " found '%s'" % testName - return env.fs.File(testName) - else: - name_ext = SCons.Util.splitext(testName)[1] - if name_ext: - continue - - # if no suffix try adding those passed in - for suffix in suffixes: - testNameExt = testName + suffix - if Verbose: - print " look for '%s'" % testNameExt - - if os.path.exists(testNameExt): - if Verbose: - print " found '%s'" % testNameExt - return env.fs.File(testNameExt) - if Verbose: - print " did not find '%s'" % name - return None - -def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None): - """A builder for LaTeX files that checks the output in the aux file - and decides how many times to use LaTeXAction, and BibTeXAction.""" - - global must_rerun_latex - - # This routine is called with two actions. In this file for DVI builds - # with LaTeXAction and from the pdflatex.py with PDFLaTeXAction - # set this up now for the case where the user requests a different extension - # for the target filename - if (XXXLaTeXAction == LaTeXAction): - callerSuffix = ".dvi" - else: - callerSuffix = env['PDFSUFFIX'] - - basename = SCons.Util.splitext(str(source[0]))[0] - basedir = os.path.split(str(source[0]))[0] - basefile = os.path.split(str(basename))[1] - abspath = os.path.abspath(basedir) - - targetext = os.path.splitext(str(target[0]))[1] - targetdir = os.path.split(str(target[0]))[0] - - saved_env = {} - for var in SCons.Scanner.LaTeX.LaTeX.env_variables: - saved_env[var] = modify_env_var(env, var, abspath) - - # Create base file names with the target directory since the auxiliary files - # will be made there. That's because the *COM variables have the cd - # command in the prolog. We check - # for the existence of files before opening them--even ones like the - # aux file that TeX always creates--to make it possible to write tests - # with stubs that don't necessarily generate all of the same files. - - targetbase = os.path.join(targetdir, basefile) - - # if there is a \makeindex there will be a .idx and thus - # we have to run makeindex at least once to keep the build - # happy even if there is no index. - # Same for glossaries and nomenclature - src_content = source[0].get_text_contents() - run_makeindex = makeindex_re.search(src_content) and not os.path.exists(targetbase + '.idx') - run_nomenclature = makenomenclature_re.search(src_content) and not os.path.exists(targetbase + '.nlo') - run_glossary = makeglossary_re.search(src_content) and not os.path.exists(targetbase + '.glo') - - saved_hashes = {} - suffix_nodes = {} - - for suffix in all_suffixes: - theNode = env.fs.File(targetbase + suffix) - suffix_nodes[suffix] = theNode - saved_hashes[suffix] = theNode.get_csig() - - if Verbose: - print "hashes: ",saved_hashes - - must_rerun_latex = True - - # - # routine to update MD5 hash and compare - # - # TODO(1.5): nested scopes - def check_MD5(filenode, suffix, saved_hashes=saved_hashes, targetbase=targetbase): - global must_rerun_latex - # two calls to clear old csig - filenode.clear_memoized_values() - filenode.ninfo = filenode.new_ninfo() - new_md5 = filenode.get_csig() - - if saved_hashes[suffix] == new_md5: - if Verbose: - print "file %s not changed" % (targetbase+suffix) - return False # unchanged - saved_hashes[suffix] = new_md5 - must_rerun_latex = True - if Verbose: - print "file %s changed, rerunning Latex, new hash = " % (targetbase+suffix), new_md5 - return True # changed - - # generate the file name that latex will generate - resultfilename = targetbase + callerSuffix - - count = 0 - - while (must_rerun_latex and count < int(env.subst('$LATEXRETRIES'))) : - result = XXXLaTeXAction(target, source, env) - if result != 0: - return result - - count = count + 1 - - must_rerun_latex = False - # Decide if various things need to be run, or run again. - - # Read the log file to find all .aux files - logfilename = targetbase + '.log' - logContent = '' - auxfiles = [] - if os.path.exists(logfilename): - logContent = open(logfilename, "rb").read() - auxfiles = openout_aux_re.findall(logContent) - - # Now decide if bibtex will need to be run. - # The information that bibtex reads from the .aux file is - # pass-independent. If we find (below) that the .bbl file is unchanged, - # then the last latex saw a correct bibliography. - # Therefore only do this on the first pass - if count == 1: - for auxfilename in auxfiles: - target_aux = os.path.join(targetdir, auxfilename) - if os.path.exists(target_aux): - content = open(target_aux, "rb").read() - if string.find(content, "bibdata") != -1: - if Verbose: - print "Need to run bibtex" - bibfile = env.fs.File(targetbase) - result = BibTeXAction(bibfile, bibfile, env) - if result != 0: - return result - must_rerun_latex = check_MD5(suffix_nodes['.bbl'],'.bbl') - break - - # Now decide if latex will need to be run again due to index. - if check_MD5(suffix_nodes['.idx'],'.idx') or (count == 1 and run_makeindex): - # We must run makeindex - if Verbose: - print "Need to run makeindex" - idxfile = suffix_nodes['.idx'] - result = MakeIndexAction(idxfile, idxfile, env) - if result != 0: - return result - - # TO-DO: need to add a way for the user to extend this list for whatever - # auxiliary files they create in other (or their own) packages - # Harder is case is where an action needs to be called -- that should be rare (I hope?) - - for index in check_suffixes: - check_MD5(suffix_nodes[index],index) - - # Now decide if latex will need to be run again due to nomenclature. - if check_MD5(suffix_nodes['.nlo'],'.nlo') or (count == 1 and run_nomenclature): - # We must run makeindex - if Verbose: - print "Need to run makeindex for nomenclature" - nclfile = suffix_nodes['.nlo'] - result = MakeNclAction(nclfile, nclfile, env) - if result != 0: - return result - - # Now decide if latex will need to be run again due to glossary. - if check_MD5(suffix_nodes['.glo'],'.glo') or (count == 1 and run_glossary): - # We must run makeindex - if Verbose: - print "Need to run makeindex for glossary" - glofile = suffix_nodes['.glo'] - result = MakeGlossaryAction(glofile, glofile, env) - if result != 0: - return result - - # Now decide if latex needs to be run yet again to resolve warnings. - if warning_rerun_re.search(logContent): - must_rerun_latex = True - if Verbose: - print "rerun Latex due to latex or package rerun warning" - - if rerun_citations_re.search(logContent): - must_rerun_latex = True - if Verbose: - print "rerun Latex due to 'Rerun to get citations correct' warning" - - if undefined_references_re.search(logContent): - must_rerun_latex = True - if Verbose: - print "rerun Latex due to undefined references or citations" - - if (count >= int(env.subst('$LATEXRETRIES')) and must_rerun_latex): - print "reached max number of retries on Latex ,",int(env.subst('$LATEXRETRIES')) -# end of while loop - - # rename Latex's output to what the target name is - if not (str(target[0]) == resultfilename and os.path.exists(resultfilename)): - if os.path.exists(resultfilename): - print "move %s to %s" % (resultfilename, str(target[0]), ) - shutil.move(resultfilename,str(target[0])) - - # Original comment (when TEXPICTS was not restored): - # The TEXPICTS enviroment variable is needed by a dvi -> pdf step - # later on Mac OSX so leave it - # - # It is also used when searching for pictures (implicit dependencies). - # Why not set the variable again in the respective builder instead - # of leaving local modifications in the environment? What if multiple - # latex builds in different directories need different TEXPICTS? - for var in SCons.Scanner.LaTeX.LaTeX.env_variables: - if var == 'TEXPICTS': - continue - if saved_env[var] is _null: - try: - del env['ENV'][var] - except KeyError: - pass # was never set - else: - env['ENV'][var] = saved_env[var] - - return result - -def LaTeXAuxAction(target = None, source= None, env=None): - result = InternalLaTeXAuxAction( LaTeXAction, target, source, env ) - return result - -LaTeX_re = re.compile("\\\\document(style|class)") - -def is_LaTeX(flist): - # Scan a file list to decide if it's TeX- or LaTeX-flavored. - for f in flist: - content = f.get_text_contents() - if LaTeX_re.search(content): - return 1 - return 0 - -def TeXLaTeXFunction(target = None, source= None, env=None): - """A builder for TeX and LaTeX that scans the source file to - decide the "flavor" of the source and then executes the appropriate - program.""" - if is_LaTeX(source): - result = LaTeXAuxAction(target,source,env) - else: - result = TeXAction(target,source,env) - return result - -def TeXLaTeXStrFunction(target = None, source= None, env=None): - """A strfunction for TeX and LaTeX that scans the source file to - decide the "flavor" of the source and then returns the appropriate - command string.""" - if env.GetOption("no_exec"): - if is_LaTeX(source): - result = env.subst('$LATEXCOM',0,target,source)+" ..." - else: - result = env.subst("$TEXCOM",0,target,source)+" ..." - else: - result = '' - return result - -def tex_eps_emitter(target, source, env): - """An emitter for TeX and LaTeX sources when - executing tex or latex. It will accept .ps and .eps - graphics files - """ - (target, source) = tex_emitter_core(target, source, env, TexGraphics) - - return (target, source) - -def tex_pdf_emitter(target, source, env): - """An emitter for TeX and LaTeX sources when - executing pdftex or pdflatex. It will accept graphics - files of types .pdf, .jpg, .png, .gif, and .tif - """ - (target, source) = tex_emitter_core(target, source, env, LatexGraphics) - - return (target, source) - -def ScanFiles(theFile, target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir): - # for theFile (a Node) update any file_tests and search for graphics files - # then find all included files and call ScanFiles for each of them - content = theFile.get_text_contents() - if Verbose: - print " scanning ",str(theFile) - - for i in range(len(file_tests_search)): - if file_tests[i][0] == None: - file_tests[i][0] = file_tests_search[i].search(content) - - # recursively call this on each of the included files - inc_files = [ ] - inc_files.extend( include_re.findall(content) ) - if Verbose: - print "files included by '%s': "%str(theFile),inc_files - # inc_files is list of file names as given. need to find them - # using TEXINPUTS paths. - - for src in inc_files: - srcNode = srcNode = FindFile(src,['.tex','.ltx','.latex'],paths,env,requireExt=False) - if srcNode != None: - file_test = ScanFiles(srcNode, target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir) - if Verbose: - print " done scanning ",str(theFile) - return file_tests - -def tex_emitter_core(target, source, env, graphics_extensions): - """An emitter for TeX and LaTeX sources. - For LaTeX sources we try and find the common created files that - are needed on subsequent runs of latex to finish tables of contents, - bibliographies, indices, lists of figures, and hyperlink references. - """ - targetbase = SCons.Util.splitext(str(target[0]))[0] - basename = SCons.Util.splitext(str(source[0]))[0] - basefile = os.path.split(str(basename))[1] - - basedir = os.path.split(str(source[0]))[0] - targetdir = os.path.split(str(target[0]))[0] - abspath = os.path.abspath(basedir) - target[0].attributes.path = abspath - - # - # file names we will make use of in searching the sources and log file - # - emit_suffixes = ['.aux', '.log', '.ilg', '.blg', '.nls', '.nlg', '.gls', '.glg'] + all_suffixes - auxfilename = targetbase + '.aux' - logfilename = targetbase + '.log' - - env.SideEffect(auxfilename,target[0]) - env.SideEffect(logfilename,target[0]) - env.Clean(target[0],auxfilename) - env.Clean(target[0],logfilename) - - content = source[0].get_text_contents() - - idx_exists = os.path.exists(targetbase + '.idx') - nlo_exists = os.path.exists(targetbase + '.nlo') - glo_exists = os.path.exists(targetbase + '.glo') - - # set up list with the regular expressions - # we use to find features used - file_tests_search = [auxfile_re, - makeindex_re, - bibliography_re, - tableofcontents_re, - listoffigures_re, - listoftables_re, - hyperref_re, - makenomenclature_re, - makeglossary_re, - beamer_re ] - # set up list with the file suffixes that need emitting - # when a feature is found - file_tests_suff = [['.aux'], - ['.idx', '.ind', '.ilg'], - ['.bbl', '.blg'], - ['.toc'], - ['.lof'], - ['.lot'], - ['.out'], - ['.nlo', '.nls', '.nlg'], - ['.glo', '.gls', '.glg'], - ['.nav', '.snm', '.out', '.toc'] ] - # build the list of lists - file_tests = [] - for i in range(len(file_tests_search)): - file_tests.append( [None, file_tests_suff[i]] ) - - # TO-DO: need to add a way for the user to extend this list for whatever - # auxiliary files they create in other (or their own) packages - - # get path list from both env['TEXINPUTS'] and env['ENV']['TEXINPUTS'] - savedpath = modify_env_var(env, 'TEXINPUTS', abspath) - paths = env['ENV']['TEXINPUTS'] - if SCons.Util.is_List(paths): - pass - else: - # Split at os.pathsep to convert into absolute path - # TODO(1.5) - #paths = paths.split(os.pathsep) - paths = string.split(paths, os.pathsep) - - # now that we have the path list restore the env - if savedpath is _null: - try: - del env['ENV']['TEXINPUTS'] - except KeyError: - pass # was never set - else: - env['ENV']['TEXINPUTS'] = savedpath - if Verbose: - print "search path ",paths - - file_tests = ScanFiles(source[0], target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir) - - for (theSearch,suffix_list) in file_tests: - if theSearch: - for suffix in suffix_list: - env.SideEffect(targetbase + suffix,target[0]) - env.Clean(target[0],targetbase + suffix) - - # read log file to get all other files that latex creates and will read on the next pass - if os.path.exists(logfilename): - content = open(logfilename, "rb").read() - out_files = openout_re.findall(content) - env.SideEffect(out_files,target[0]) - env.Clean(target[0],out_files) - - return (target, source) - - -TeXLaTeXAction = None - -def generate(env): - """Add Builders and construction variables for TeX to an Environment.""" - - # A generic tex file Action, sufficient for all tex files. - global TeXAction - if TeXAction is None: - TeXAction = SCons.Action.Action("$TEXCOM", "$TEXCOMSTR") - - # An Action to build a latex file. This might be needed more - # than once if we are dealing with labels and bibtex. - global LaTeXAction - if LaTeXAction is None: - LaTeXAction = SCons.Action.Action("$LATEXCOM", "$LATEXCOMSTR") - - # Define an action to run BibTeX on a file. - global BibTeXAction - if BibTeXAction is None: - BibTeXAction = SCons.Action.Action("$BIBTEXCOM", "$BIBTEXCOMSTR") - - # Define an action to run MakeIndex on a file. - global MakeIndexAction - if MakeIndexAction is None: - MakeIndexAction = SCons.Action.Action("$MAKEINDEXCOM", "$MAKEINDEXCOMSTR") - - # Define an action to run MakeIndex on a file for nomenclatures. - global MakeNclAction - if MakeNclAction is None: - MakeNclAction = SCons.Action.Action("$MAKENCLCOM", "$MAKENCLCOMSTR") - - # Define an action to run MakeIndex on a file for glossaries. - global MakeGlossaryAction - if MakeGlossaryAction is None: - MakeGlossaryAction = SCons.Action.Action("$MAKEGLOSSARYCOM", "$MAKEGLOSSARYCOMSTR") - - global TeXLaTeXAction - if TeXLaTeXAction is None: - TeXLaTeXAction = SCons.Action.Action(TeXLaTeXFunction, - strfunction=TeXLaTeXStrFunction) - - import dvi - dvi.generate(env) - - bld = env['BUILDERS']['DVI'] - bld.add_action('.tex', TeXLaTeXAction) - bld.add_emitter('.tex', tex_eps_emitter) - - env['TEX'] = 'tex' - env['TEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode') - env['TEXCOM'] = 'cd ${TARGET.dir} && $TEX $TEXFLAGS ${SOURCE.file}' - - # Duplicate from latex.py. If latex.py goes away, then this is still OK. - env['LATEX'] = 'latex' - env['LATEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode') - env['LATEXCOM'] = 'cd ${TARGET.dir} && $LATEX $LATEXFLAGS ${SOURCE.file}' - env['LATEXRETRIES'] = 3 - - env['BIBTEX'] = 'bibtex' - env['BIBTEXFLAGS'] = SCons.Util.CLVar('') - env['BIBTEXCOM'] = 'cd ${TARGET.dir} && $BIBTEX $BIBTEXFLAGS ${SOURCE.filebase}' - - env['MAKEINDEX'] = 'makeindex' - env['MAKEINDEXFLAGS'] = SCons.Util.CLVar('') - env['MAKEINDEXCOM'] = 'cd ${TARGET.dir} && $MAKEINDEX $MAKEINDEXFLAGS ${SOURCE.file}' - - env['MAKEGLOSSARY'] = 'makeindex' - env['MAKEGLOSSARYSTYLE'] = '${SOURCE.filebase}.ist' - env['MAKEGLOSSARYFLAGS'] = SCons.Util.CLVar('-s ${MAKEGLOSSARYSTYLE} -t ${SOURCE.filebase}.glg') - env['MAKEGLOSSARYCOM'] = 'cd ${TARGET.dir} && $MAKEGLOSSARY ${SOURCE.filebase}.glo $MAKEGLOSSARYFLAGS -o ${SOURCE.filebase}.gls' - - env['MAKENCL'] = 'makeindex' - env['MAKENCLSTYLE'] = '$nomencl.ist' - env['MAKENCLFLAGS'] = '-s ${MAKENCLSTYLE} -t ${SOURCE.filebase}.nlg' - env['MAKENCLCOM'] = 'cd ${TARGET.dir} && $MAKENCL ${SOURCE.filebase}.nlo $MAKENCLFLAGS -o ${SOURCE.filebase}.nls' - - # Duplicate from pdflatex.py. If latex.py goes away, then this is still OK. - env['PDFLATEX'] = 'pdflatex' - env['PDFLATEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode') - env['PDFLATEXCOM'] = 'cd ${TARGET.dir} && $PDFLATEX $PDFLATEXFLAGS ${SOURCE.file}' - -def exists(env): - return env.Detect('tex') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/tlib.py b/3rdParty/SCons/scons-local/SCons/Tool/tlib.py deleted file mode 100644 index 3fccc7a..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/tlib.py +++ /dev/null @@ -1,53 +0,0 @@ -"""SCons.Tool.tlib - -XXX - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/tlib.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Tool -import SCons.Tool.bcc32 -import SCons.Util - -def generate(env): - SCons.Tool.bcc32.findIt('tlib', env) - """Add Builders and construction variables for ar to an Environment.""" - SCons.Tool.createStaticLibBuilder(env) - env['AR'] = 'tlib' - env['ARFLAGS'] = SCons.Util.CLVar('') - env['ARCOM'] = '$AR $TARGET $ARFLAGS /a $SOURCES' - env['LIBPREFIX'] = '' - env['LIBSUFFIX'] = '.lib' - -def exists(env): - return SCons.Tool.bcc32.findIt('tlib', env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/wix.py b/3rdParty/SCons/scons-local/SCons/Tool/wix.py deleted file mode 100644 index 7fbb38b..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/wix.py +++ /dev/null @@ -1,100 +0,0 @@ -"""SCons.Tool.wix - -Tool-specific initialization for wix, the Windows Installer XML Tool. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/wix.py 4043 2009/02/23 09:06:45 scons" - -import SCons.Builder -import SCons.Action -import os -import string - -def generate(env): - """Add Builders and construction variables for WiX to an Environment.""" - if not exists(env): - return - - env['WIXCANDLEFLAGS'] = ['-nologo'] - env['WIXCANDLEINCLUDE'] = [] - env['WIXCANDLECOM'] = '$WIXCANDLE $WIXCANDLEFLAGS -I $WIXCANDLEINCLUDE -o ${TARGET} ${SOURCE}' - - env['WIXLIGHTFLAGS'].append( '-nologo' ) - env['WIXLIGHTCOM'] = "$WIXLIGHT $WIXLIGHTFLAGS -out ${TARGET} ${SOURCES}" - - object_builder = SCons.Builder.Builder( - action = '$WIXCANDLECOM', - suffix = '.wxiobj', - src_suffix = '.wxs') - - linker_builder = SCons.Builder.Builder( - action = '$WIXLIGHTCOM', - src_suffix = '.wxiobj', - src_builder = object_builder) - - env['BUILDERS']['WiX'] = linker_builder - -def exists(env): - env['WIXCANDLE'] = 'candle.exe' - env['WIXLIGHT'] = 'light.exe' - - # try to find the candle.exe and light.exe tools and - # add the install directory to light libpath. - #for path in os.environ['PATH'].split(os.pathsep): - for path in string.split(os.environ['PATH'], os.pathsep): - if not path: - continue - - # workaround for some weird python win32 bug. - if path[0] == '"' and path[-1:]=='"': - path = path[1:-1] - - # normalize the path - path = os.path.normpath(path) - - # search for the tools in the PATH environment variable - try: - if env['WIXCANDLE'] in os.listdir(path) and\ - env['WIXLIGHT'] in os.listdir(path): - env.PrependENVPath('PATH', path) - env['WIXLIGHTFLAGS'] = [ os.path.join( path, 'wixui.wixlib' ), - '-loc', - os.path.join( path, 'WixUI_en-us.wxl' ) ] - return 1 - except OSError: - pass # ignore this, could be a stale PATH entry. - - return None - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/yacc.py b/3rdParty/SCons/scons-local/SCons/Tool/yacc.py deleted file mode 100644 index a80ec1e..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/yacc.py +++ /dev/null @@ -1,131 +0,0 @@ -"""SCons.Tool.yacc - -Tool-specific initialization for yacc. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/yacc.py 4043 2009/02/23 09:06:45 scons" - -import os.path -import string - -import SCons.Defaults -import SCons.Tool -import SCons.Util - -YaccAction = SCons.Action.Action("$YACCCOM", "$YACCCOMSTR") - -def _yaccEmitter(target, source, env, ysuf, hsuf): - yaccflags = env.subst("$YACCFLAGS", target=target, source=source) - flags = SCons.Util.CLVar(yaccflags) - targetBase, targetExt = os.path.splitext(SCons.Util.to_String(target[0])) - - if '.ym' in ysuf: # If using Objective-C - target = [targetBase + ".m"] # the extension is ".m". - - - # If -d is specified on the command line, yacc will emit a .h - # or .hpp file with the same name as the .c or .cpp output file. - if '-d' in flags: - target.append(targetBase + env.subst(hsuf, target=target, source=source)) - - # If -g is specified on the command line, yacc will emit a .vcg - # file with the same base name as the .y, .yacc, .ym or .yy file. - if "-g" in flags: - base, ext = os.path.splitext(SCons.Util.to_String(source[0])) - target.append(base + env.subst("$YACCVCGFILESUFFIX")) - - # With --defines and --graph, the name of the file is totally defined - # in the options. - fileGenOptions = ["--defines=", "--graph="] - for option in flags: - for fileGenOption in fileGenOptions: - l = len(fileGenOption) - if option[:l] == fileGenOption: - # A file generating option is present, so add the file - # name to the list of targets. - fileName = string.strip(option[l:]) - target.append(fileName) - - return (target, source) - -def yEmitter(target, source, env): - return _yaccEmitter(target, source, env, ['.y', '.yacc'], '$YACCHFILESUFFIX') - -def ymEmitter(target, source, env): - return _yaccEmitter(target, source, env, ['.ym'], '$YACCHFILESUFFIX') - -def yyEmitter(target, source, env): - return _yaccEmitter(target, source, env, ['.yy'], '$YACCHXXFILESUFFIX') - -def generate(env): - """Add Builders and construction variables for yacc to an Environment.""" - c_file, cxx_file = SCons.Tool.createCFileBuilders(env) - - # C - c_file.add_action('.y', YaccAction) - c_file.add_emitter('.y', yEmitter) - - c_file.add_action('.yacc', YaccAction) - c_file.add_emitter('.yacc', yEmitter) - - # Objective-C - c_file.add_action('.ym', YaccAction) - c_file.add_emitter('.ym', ymEmitter) - - # C++ - cxx_file.add_action('.yy', YaccAction) - cxx_file.add_emitter('.yy', yyEmitter) - - env['YACC'] = env.Detect('bison') or 'yacc' - env['YACCFLAGS'] = SCons.Util.CLVar('') - env['YACCCOM'] = '$YACC $YACCFLAGS -o $TARGET $SOURCES' - env['YACCHFILESUFFIX'] = '.h' - - # Apparently, OS X now creates file.hpp like everybody else - # I have no idea when it changed; it was fixed in 10.4 - #if env['PLATFORM'] == 'darwin': - # # Bison on Mac OS X just appends ".h" to the generated target .cc - # # or .cpp file name. Hooray for delayed expansion of variables. - # env['YACCHXXFILESUFFIX'] = '${TARGET.suffix}.h' - #else: - # env['YACCHXXFILESUFFIX'] = '.hpp' - env['YACCHXXFILESUFFIX'] = '.hpp' - - env['YACCVCGFILESUFFIX'] = '.vcg' - -def exists(env): - return env.Detect(['bison', 'yacc']) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Tool/zip.py b/3rdParty/SCons/scons-local/SCons/Tool/zip.py deleted file mode 100644 index f41bc85..0000000 --- a/3rdParty/SCons/scons-local/SCons/Tool/zip.py +++ /dev/null @@ -1,100 +0,0 @@ -"""SCons.Tool.zip - -Tool-specific initialization for zip. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Tool/zip.py 4043 2009/02/23 09:06:45 scons" - -import os.path - -import SCons.Builder -import SCons.Defaults -import SCons.Node.FS -import SCons.Util - -try: - import zipfile - internal_zip = 1 -except ImportError: - internal_zip = 0 - -if internal_zip: - zipcompression = zipfile.ZIP_DEFLATED - def zip(target, source, env): - def visit(arg, dirname, names): - for name in names: - path = os.path.join(dirname, name) - if os.path.isfile(path): - arg.write(path) - compression = env.get('ZIPCOMPRESSION', 0) - zf = zipfile.ZipFile(str(target[0]), 'w', compression) - for s in source: - if s.isdir(): - os.path.walk(str(s), visit, zf) - else: - zf.write(str(s)) - zf.close() -else: - zipcompression = 0 - zip = "$ZIP $ZIPFLAGS ${TARGET.abspath} $SOURCES" - - -zipAction = SCons.Action.Action(zip, varlist=['ZIPCOMPRESSION']) - -ZipBuilder = SCons.Builder.Builder(action = SCons.Action.Action('$ZIPCOM', '$ZIPCOMSTR'), - source_factory = SCons.Node.FS.Entry, - source_scanner = SCons.Defaults.DirScanner, - suffix = '$ZIPSUFFIX', - multi = 1) - - -def generate(env): - """Add Builders and construction variables for zip to an Environment.""" - try: - bld = env['BUILDERS']['Zip'] - except KeyError: - bld = ZipBuilder - env['BUILDERS']['Zip'] = bld - - env['ZIP'] = 'zip' - env['ZIPFLAGS'] = SCons.Util.CLVar('') - env['ZIPCOM'] = zipAction - env['ZIPCOMPRESSION'] = zipcompression - env['ZIPSUFFIX'] = '.zip' - -def exists(env): - return internal_zip or env.Detect('zip') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Util.py b/3rdParty/SCons/scons-local/SCons/Util.py deleted file mode 100644 index e7d841f..0000000 --- a/3rdParty/SCons/scons-local/SCons/Util.py +++ /dev/null @@ -1,1621 +0,0 @@ -"""SCons.Util - -Various utility functions go here. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Util.py 4043 2009/02/23 09:06:45 scons" - -import copy -import os -import os.path -import re -import string -import sys -import types - -from UserDict import UserDict -from UserList import UserList -from UserString import UserString - -# Don't "from types import ..." these because we need to get at the -# types module later to look for UnicodeType. -DictType = types.DictType -InstanceType = types.InstanceType -ListType = types.ListType -StringType = types.StringType -TupleType = types.TupleType - -def dictify(keys, values, result={}): - for k, v in zip(keys, values): - result[k] = v - return result - -_altsep = os.altsep -if _altsep is None and sys.platform == 'win32': - # My ActivePython 2.0.1 doesn't set os.altsep! What gives? - _altsep = '/' -if _altsep: - def rightmost_separator(path, sep, _altsep=_altsep): - rfind = string.rfind - return max(rfind(path, sep), rfind(path, _altsep)) -else: - rightmost_separator = string.rfind - -# First two from the Python Cookbook, just for completeness. -# (Yeah, yeah, YAGNI...) -def containsAny(str, set): - """Check whether sequence str contains ANY of the items in set.""" - for c in set: - if c in str: return 1 - return 0 - -def containsAll(str, set): - """Check whether sequence str contains ALL of the items in set.""" - for c in set: - if c not in str: return 0 - return 1 - -def containsOnly(str, set): - """Check whether sequence str contains ONLY items in set.""" - for c in str: - if c not in set: return 0 - return 1 - -def splitext(path): - "Same as os.path.splitext() but faster." - sep = rightmost_separator(path, os.sep) - dot = string.rfind(path, '.') - # An ext is only real if it has at least one non-digit char - if dot > sep and not containsOnly(path[dot:], "0123456789."): - return path[:dot],path[dot:] - else: - return path,"" - -def updrive(path): - """ - Make the drive letter (if any) upper case. - This is useful because Windows is inconsitent on the case - of the drive letter, which can cause inconsistencies when - calculating command signatures. - """ - drive, rest = os.path.splitdrive(path) - if drive: - path = string.upper(drive) + rest - return path - -class NodeList(UserList): - """This class is almost exactly like a regular list of Nodes - (actually it can hold any object), with one important difference. - If you try to get an attribute from this list, it will return that - attribute from every item in the list. For example: - - >>> someList = NodeList([ ' foo ', ' bar ' ]) - >>> someList.strip() - [ 'foo', 'bar' ] - """ - def __nonzero__(self): - return len(self.data) != 0 - - def __str__(self): - return string.join(map(str, self.data)) - - def __iter__(self): - return iter(self.data) - - def __call__(self, *args, **kwargs): - result = map(lambda x, args=args, kwargs=kwargs: apply(x, - args, - kwargs), - self.data) - return self.__class__(result) - - def __getattr__(self, name): - result = map(lambda x, n=name: getattr(x, n), self.data) - return self.__class__(result) - - -_get_env_var = re.compile(r'^\$([_a-zA-Z]\w*|{[_a-zA-Z]\w*})$') - -def get_environment_var(varstr): - """Given a string, first determine if it looks like a reference - to a single environment variable, like "$FOO" or "${FOO}". - If so, return that variable with no decorations ("FOO"). - If not, return None.""" - mo=_get_env_var.match(to_String(varstr)) - if mo: - var = mo.group(1) - if var[0] == '{': - return var[1:-1] - else: - return var - else: - return None - -class DisplayEngine: - def __init__(self): - self.__call__ = self.print_it - - def print_it(self, text, append_newline=1): - if append_newline: text = text + '\n' - try: - sys.stdout.write(text) - except IOError: - # Stdout might be connected to a pipe that has been closed - # by now. The most likely reason for the pipe being closed - # is that the user has press ctrl-c. It this is the case, - # then SCons is currently shutdown. We therefore ignore - # IOError's here so that SCons can continue and shutdown - # properly so that the .sconsign is correctly written - # before SCons exits. - pass - - def dont_print(self, text, append_newline=1): - pass - - def set_mode(self, mode): - if mode: - self.__call__ = self.print_it - else: - self.__call__ = self.dont_print - -def render_tree(root, child_func, prune=0, margin=[0], visited={}): - """ - Render a tree of nodes into an ASCII tree view. - root - the root node of the tree - child_func - the function called to get the children of a node - prune - don't visit the same node twice - margin - the format of the left margin to use for children of root. - 1 results in a pipe, and 0 results in no pipe. - visited - a dictionary of visited nodes in the current branch if not prune, - or in the whole tree if prune. - """ - - rname = str(root) - - children = child_func(root) - retval = "" - for pipe in margin[:-1]: - if pipe: - retval = retval + "| " - else: - retval = retval + " " - - if visited.has_key(rname): - return retval + "+-[" + rname + "]\n" - - retval = retval + "+-" + rname + "\n" - if not prune: - visited = copy.copy(visited) - visited[rname] = 1 - - for i in range(len(children)): - margin.append(i<len(children)-1) - retval = retval + render_tree(children[i], child_func, prune, margin, visited -) - margin.pop() - - return retval - -IDX = lambda N: N and 1 or 0 - -def print_tree(root, child_func, prune=0, showtags=0, margin=[0], visited={}): - """ - Print a tree of nodes. This is like render_tree, except it prints - lines directly instead of creating a string representation in memory, - so that huge trees can be printed. - - root - the root node of the tree - child_func - the function called to get the children of a node - prune - don't visit the same node twice - showtags - print status information to the left of each node line - margin - the format of the left margin to use for children of root. - 1 results in a pipe, and 0 results in no pipe. - visited - a dictionary of visited nodes in the current branch if not prune, - or in the whole tree if prune. - """ - - rname = str(root) - - if showtags: - - if showtags == 2: - print ' E = exists' - print ' R = exists in repository only' - print ' b = implicit builder' - print ' B = explicit builder' - print ' S = side effect' - print ' P = precious' - print ' A = always build' - print ' C = current' - print ' N = no clean' - print ' H = no cache' - print '' - - tags = ['['] - tags.append(' E'[IDX(root.exists())]) - tags.append(' R'[IDX(root.rexists() and not root.exists())]) - tags.append(' BbB'[[0,1][IDX(root.has_explicit_builder())] + - [0,2][IDX(root.has_builder())]]) - tags.append(' S'[IDX(root.side_effect)]) - tags.append(' P'[IDX(root.precious)]) - tags.append(' A'[IDX(root.always_build)]) - tags.append(' C'[IDX(root.is_up_to_date())]) - tags.append(' N'[IDX(root.noclean)]) - tags.append(' H'[IDX(root.nocache)]) - tags.append(']') - - else: - tags = [] - - def MMM(m): - return [" ","| "][m] - margins = map(MMM, margin[:-1]) - - children = child_func(root) - - if prune and visited.has_key(rname) and children: - print string.join(tags + margins + ['+-[', rname, ']'], '') - return - - print string.join(tags + margins + ['+-', rname], '') - - visited[rname] = 1 - - if children: - margin.append(1) - idx = IDX(showtags) - for C in children[:-1]: - print_tree(C, child_func, prune, idx, margin, visited) - margin[-1] = 0 - print_tree(children[-1], child_func, prune, idx, margin, visited) - margin.pop() - - - -# Functions for deciding if things are like various types, mainly to -# handle UserDict, UserList and UserString like their underlying types. -# -# Yes, all of this manual testing breaks polymorphism, and the real -# Pythonic way to do all of this would be to just try it and handle the -# exception, but handling the exception when it's not the right type is -# often too slow. - -try: - class mystr(str): - pass -except TypeError: - # An older Python version without new-style classes. - # - # The actual implementations here have been selected after timings - # coded up in in bench/is_types.py (from the SCons source tree, - # see the scons-src distribution), mostly against Python 1.5.2. - # Key results from those timings: - # - # -- Storing the type of the object in a variable (t = type(obj)) - # slows down the case where it's a native type and the first - # comparison will match, but nicely speeds up the case where - # it's a different native type. Since that's going to be - # common, it's a good tradeoff. - # - # -- The data show that calling isinstance() on an object that's - # a native type (dict, list or string) is expensive enough - # that checking up front for whether the object is of type - # InstanceType is a pretty big win, even though it does slow - # down the case where it really *is* an object instance a - # little bit. - def is_Dict(obj): - t = type(obj) - return t is DictType or \ - (t is InstanceType and isinstance(obj, UserDict)) - - def is_List(obj): - t = type(obj) - return t is ListType \ - or (t is InstanceType and isinstance(obj, UserList)) - - def is_Sequence(obj): - t = type(obj) - return t is ListType \ - or t is TupleType \ - or (t is InstanceType and isinstance(obj, UserList)) - - def is_Tuple(obj): - t = type(obj) - return t is TupleType - - if hasattr(types, 'UnicodeType'): - def is_String(obj): - t = type(obj) - return t is StringType \ - or t is UnicodeType \ - or (t is InstanceType and isinstance(obj, UserString)) - else: - def is_String(obj): - t = type(obj) - return t is StringType \ - or (t is InstanceType and isinstance(obj, UserString)) - - def is_Scalar(obj): - return is_String(obj) or not is_Sequence(obj) - - def flatten(obj, result=None): - """Flatten a sequence to a non-nested list. - - Flatten() converts either a single scalar or a nested sequence - to a non-nested list. Note that flatten() considers strings - to be scalars instead of sequences like Python would. - """ - if is_Scalar(obj): - return [obj] - if result is None: - result = [] - for item in obj: - if is_Scalar(item): - result.append(item) - else: - flatten_sequence(item, result) - return result - - def flatten_sequence(sequence, result=None): - """Flatten a sequence to a non-nested list. - - Same as flatten(), but it does not handle the single scalar - case. This is slightly more efficient when one knows that - the sequence to flatten can not be a scalar. - """ - if result is None: - result = [] - for item in sequence: - if is_Scalar(item): - result.append(item) - else: - flatten_sequence(item, result) - return result - - # - # Generic convert-to-string functions that abstract away whether or - # not the Python we're executing has Unicode support. The wrapper - # to_String_for_signature() will use a for_signature() method if the - # specified object has one. - # - if hasattr(types, 'UnicodeType'): - UnicodeType = types.UnicodeType - def to_String(s): - if isinstance(s, UserString): - t = type(s.data) - else: - t = type(s) - if t is UnicodeType: - return unicode(s) - else: - return str(s) - else: - to_String = str - - def to_String_for_signature(obj): - try: - f = obj.for_signature - except AttributeError: - return to_String_for_subst(obj) - else: - return f() - - def to_String_for_subst(s): - if is_Sequence( s ): - return string.join( map(to_String_for_subst, s) ) - - return to_String( s ) - -else: - # A modern Python version with new-style classes, so we can just use - # isinstance(). - # - # We are using the following trick to speed-up these - # functions. Default arguments are used to take a snapshot of the - # the global functions and constants used by these functions. This - # transforms accesses to global variable into local variables - # accesses (i.e. LOAD_FAST instead of LOAD_GLOBAL). - - DictTypes = (dict, UserDict) - ListTypes = (list, UserList) - SequenceTypes = (list, tuple, UserList) - - # Empirically, Python versions with new-style classes all have - # unicode. - # - # Note that profiling data shows a speed-up when comparing - # explicitely with str and unicode instead of simply comparing - # with basestring. (at least on Python 2.5.1) - StringTypes = (str, unicode, UserString) - - # Empirically, it is faster to check explicitely for str and - # unicode than for basestring. - BaseStringTypes = (str, unicode) - - def is_Dict(obj, isinstance=isinstance, DictTypes=DictTypes): - return isinstance(obj, DictTypes) - - def is_List(obj, isinstance=isinstance, ListTypes=ListTypes): - return isinstance(obj, ListTypes) - - def is_Sequence(obj, isinstance=isinstance, SequenceTypes=SequenceTypes): - return isinstance(obj, SequenceTypes) - - def is_Tuple(obj, isinstance=isinstance, tuple=tuple): - return isinstance(obj, tuple) - - def is_String(obj, isinstance=isinstance, StringTypes=StringTypes): - return isinstance(obj, StringTypes) - - def is_Scalar(obj, isinstance=isinstance, StringTypes=StringTypes, SequenceTypes=SequenceTypes): - # Profiling shows that there is an impressive speed-up of 2x - # when explicitely checking for strings instead of just not - # sequence when the argument (i.e. obj) is already a string. - # But, if obj is a not string than it is twice as fast to - # check only for 'not sequence'. The following code therefore - # assumes that the obj argument is a string must of the time. - return isinstance(obj, StringTypes) or not isinstance(obj, SequenceTypes) - - def do_flatten(sequence, result, isinstance=isinstance, - StringTypes=StringTypes, SequenceTypes=SequenceTypes): - for item in sequence: - if isinstance(item, StringTypes) or not isinstance(item, SequenceTypes): - result.append(item) - else: - do_flatten(item, result) - - def flatten(obj, isinstance=isinstance, StringTypes=StringTypes, - SequenceTypes=SequenceTypes, do_flatten=do_flatten): - """Flatten a sequence to a non-nested list. - - Flatten() converts either a single scalar or a nested sequence - to a non-nested list. Note that flatten() considers strings - to be scalars instead of sequences like Python would. - """ - if isinstance(obj, StringTypes) or not isinstance(obj, SequenceTypes): - return [obj] - result = [] - for item in obj: - if isinstance(item, StringTypes) or not isinstance(item, SequenceTypes): - result.append(item) - else: - do_flatten(item, result) - return result - - def flatten_sequence(sequence, isinstance=isinstance, StringTypes=StringTypes, - SequenceTypes=SequenceTypes, do_flatten=do_flatten): - """Flatten a sequence to a non-nested list. - - Same as flatten(), but it does not handle the single scalar - case. This is slightly more efficient when one knows that - the sequence to flatten can not be a scalar. - """ - result = [] - for item in sequence: - if isinstance(item, StringTypes) or not isinstance(item, SequenceTypes): - result.append(item) - else: - do_flatten(item, result) - return result - - - # - # Generic convert-to-string functions that abstract away whether or - # not the Python we're executing has Unicode support. The wrapper - # to_String_for_signature() will use a for_signature() method if the - # specified object has one. - # - def to_String(s, - isinstance=isinstance, str=str, - UserString=UserString, BaseStringTypes=BaseStringTypes): - if isinstance(s,BaseStringTypes): - # Early out when already a string! - return s - elif isinstance(s, UserString): - # s.data can only be either a unicode or a regular - # string. Please see the UserString initializer. - return s.data - else: - return str(s) - - def to_String_for_subst(s, - isinstance=isinstance, join=string.join, str=str, to_String=to_String, - BaseStringTypes=BaseStringTypes, SequenceTypes=SequenceTypes, - UserString=UserString): - - # Note that the test cases are sorted by order of probability. - if isinstance(s, BaseStringTypes): - return s - elif isinstance(s, SequenceTypes): - l = [] - for e in s: - l.append(to_String_for_subst(e)) - return join( s ) - elif isinstance(s, UserString): - # s.data can only be either a unicode or a regular - # string. Please see the UserString initializer. - return s.data - else: - return str(s) - - def to_String_for_signature(obj, to_String_for_subst=to_String_for_subst, - AttributeError=AttributeError): - try: - f = obj.for_signature - except AttributeError: - return to_String_for_subst(obj) - else: - return f() - - - -# The SCons "semi-deep" copy. -# -# This makes separate copies of lists (including UserList objects) -# dictionaries (including UserDict objects) and tuples, but just copies -# references to anything else it finds. -# -# A special case is any object that has a __semi_deepcopy__() method, -# which we invoke to create the copy, which is used by the BuilderDict -# class because of its extra initialization argument. -# -# The dispatch table approach used here is a direct rip-off from the -# normal Python copy module. - -_semi_deepcopy_dispatch = d = {} - -def _semi_deepcopy_dict(x): - copy = {} - for key, val in x.items(): - # The regular Python copy.deepcopy() also deepcopies the key, - # as follows: - # - # copy[semi_deepcopy(key)] = semi_deepcopy(val) - # - # Doesn't seem like we need to, but we'll comment it just in case. - copy[key] = semi_deepcopy(val) - return copy -d[types.DictionaryType] = _semi_deepcopy_dict - -def _semi_deepcopy_list(x): - return map(semi_deepcopy, x) -d[types.ListType] = _semi_deepcopy_list - -def _semi_deepcopy_tuple(x): - return tuple(map(semi_deepcopy, x)) -d[types.TupleType] = _semi_deepcopy_tuple - -def _semi_deepcopy_inst(x): - if hasattr(x, '__semi_deepcopy__'): - return x.__semi_deepcopy__() - elif isinstance(x, UserDict): - return x.__class__(_semi_deepcopy_dict(x)) - elif isinstance(x, UserList): - return x.__class__(_semi_deepcopy_list(x)) - else: - return x -d[types.InstanceType] = _semi_deepcopy_inst - -def semi_deepcopy(x): - copier = _semi_deepcopy_dispatch.get(type(x)) - if copier: - return copier(x) - else: - return x - - - -class Proxy: - """A simple generic Proxy class, forwarding all calls to - subject. So, for the benefit of the python newbie, what does - this really mean? Well, it means that you can take an object, let's - call it 'objA', and wrap it in this Proxy class, with a statement - like this - - proxyObj = Proxy(objA), - - Then, if in the future, you do something like this - - x = proxyObj.var1, - - since Proxy does not have a 'var1' attribute (but presumably objA does), - the request actually is equivalent to saying - - x = objA.var1 - - Inherit from this class to create a Proxy.""" - - def __init__(self, subject): - """Wrap an object as a Proxy object""" - self.__subject = subject - - def __getattr__(self, name): - """Retrieve an attribute from the wrapped object. If the named - attribute doesn't exist, AttributeError is raised""" - return getattr(self.__subject, name) - - def get(self): - """Retrieve the entire wrapped object""" - return self.__subject - - def __cmp__(self, other): - if issubclass(other.__class__, self.__subject.__class__): - return cmp(self.__subject, other) - return cmp(self.__dict__, other.__dict__) - -# attempt to load the windows registry module: -can_read_reg = 0 -try: - import _winreg - - can_read_reg = 1 - hkey_mod = _winreg - - RegOpenKeyEx = _winreg.OpenKeyEx - RegEnumKey = _winreg.EnumKey - RegEnumValue = _winreg.EnumValue - RegQueryValueEx = _winreg.QueryValueEx - RegError = _winreg.error - -except ImportError: - try: - import win32api - import win32con - can_read_reg = 1 - hkey_mod = win32con - - RegOpenKeyEx = win32api.RegOpenKeyEx - RegEnumKey = win32api.RegEnumKey - RegEnumValue = win32api.RegEnumValue - RegQueryValueEx = win32api.RegQueryValueEx - RegError = win32api.error - - except ImportError: - class _NoError(Exception): - pass - RegError = _NoError - -if can_read_reg: - HKEY_CLASSES_ROOT = hkey_mod.HKEY_CLASSES_ROOT - HKEY_LOCAL_MACHINE = hkey_mod.HKEY_LOCAL_MACHINE - HKEY_CURRENT_USER = hkey_mod.HKEY_CURRENT_USER - HKEY_USERS = hkey_mod.HKEY_USERS - - def RegGetValue(root, key): - """This utility function returns a value in the registry - without having to open the key first. Only available on - Windows platforms with a version of Python that can read the - registry. Returns the same thing as - SCons.Util.RegQueryValueEx, except you just specify the entire - path to the value, and don't have to bother opening the key - first. So: - - Instead of: - k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, - r'SOFTWARE\Microsoft\Windows\CurrentVersion') - out = SCons.Util.RegQueryValueEx(k, - 'ProgramFilesDir') - - You can write: - out = SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, - r'SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir') - """ - # I would use os.path.split here, but it's not a filesystem - # path... - p = key.rfind('\\') + 1 - keyp = key[:p-1] # -1 to omit trailing slash - val = key[p:] - k = RegOpenKeyEx(root, keyp) - return RegQueryValueEx(k,val) -else: - try: - e = WindowsError - except NameError: - # Make sure we have a definition of WindowsError so we can - # run platform-independent tests of Windows functionality on - # platforms other than Windows. (WindowsError is, in fact, an - # OSError subclass on Windows.) - class WindowsError(OSError): - pass - import __builtin__ - __builtin__.WindowsError = WindowsError - else: - del e - - HKEY_CLASSES_ROOT = None - HKEY_LOCAL_MACHINE = None - HKEY_CURRENT_USER = None - HKEY_USERS = None - - def RegGetValue(root, key): - raise WindowsError - -if sys.platform == 'win32': - - def WhereIs(file, path=None, pathext=None, reject=[]): - if path is None: - try: - path = os.environ['PATH'] - except KeyError: - return None - if is_String(path): - path = string.split(path, os.pathsep) - if pathext is None: - try: - pathext = os.environ['PATHEXT'] - except KeyError: - pathext = '.COM;.EXE;.BAT;.CMD' - if is_String(pathext): - pathext = string.split(pathext, os.pathsep) - for ext in pathext: - if string.lower(ext) == string.lower(file[-len(ext):]): - pathext = [''] - break - if not is_List(reject) and not is_Tuple(reject): - reject = [reject] - for dir in path: - f = os.path.join(dir, file) - for ext in pathext: - fext = f + ext - if os.path.isfile(fext): - try: - reject.index(fext) - except ValueError: - return os.path.normpath(fext) - continue - return None - -elif os.name == 'os2': - - def WhereIs(file, path=None, pathext=None, reject=[]): - if path is None: - try: - path = os.environ['PATH'] - except KeyError: - return None - if is_String(path): - path = string.split(path, os.pathsep) - if pathext is None: - pathext = ['.exe', '.cmd'] - for ext in pathext: - if string.lower(ext) == string.lower(file[-len(ext):]): - pathext = [''] - break - if not is_List(reject) and not is_Tuple(reject): - reject = [reject] - for dir in path: - f = os.path.join(dir, file) - for ext in pathext: - fext = f + ext - if os.path.isfile(fext): - try: - reject.index(fext) - except ValueError: - return os.path.normpath(fext) - continue - return None - -else: - - def WhereIs(file, path=None, pathext=None, reject=[]): - import stat - if path is None: - try: - path = os.environ['PATH'] - except KeyError: - return None - if is_String(path): - path = string.split(path, os.pathsep) - if not is_List(reject) and not is_Tuple(reject): - reject = [reject] - for d in path: - f = os.path.join(d, file) - if os.path.isfile(f): - try: - st = os.stat(f) - except OSError: - # os.stat() raises OSError, not IOError if the file - # doesn't exist, so in this case we let IOError get - # raised so as to not mask possibly serious disk or - # network issues. - continue - if stat.S_IMODE(st[stat.ST_MODE]) & 0111: - try: - reject.index(f) - except ValueError: - return os.path.normpath(f) - continue - return None - -def PrependPath(oldpath, newpath, sep = os.pathsep, - delete_existing=1, canonicalize=None): - """This prepends newpath elements to the given oldpath. Will only - add any particular path once (leaving the first one it encounters - and ignoring the rest, to preserve path order), and will - os.path.normpath and os.path.normcase all paths to help assure - this. This can also handle the case where the given old path - variable is a list instead of a string, in which case a list will - be returned instead of a string. - - Example: - Old Path: "/foo/bar:/foo" - New Path: "/biz/boom:/foo" - Result: "/biz/boom:/foo:/foo/bar" - - If delete_existing is 0, then adding a path that exists will - not move it to the beginning; it will stay where it is in the - list. - - If canonicalize is not None, it is applied to each element of - newpath before use. - """ - - orig = oldpath - is_list = 1 - paths = orig - if not is_List(orig) and not is_Tuple(orig): - paths = string.split(paths, sep) - is_list = 0 - - if is_String(newpath): - newpaths = string.split(newpath, sep) - elif not is_List(newpath) and not is_Tuple(newpath): - newpaths = [ newpath ] # might be a Dir - else: - newpaths = newpath - - if canonicalize: - newpaths=map(canonicalize, newpaths) - - if not delete_existing: - # First uniquify the old paths, making sure to - # preserve the first instance (in Unix/Linux, - # the first one wins), and remembering them in normpaths. - # Then insert the new paths at the head of the list - # if they're not already in the normpaths list. - result = [] - normpaths = [] - for path in paths: - if not path: - continue - normpath = os.path.normpath(os.path.normcase(path)) - if normpath not in normpaths: - result.append(path) - normpaths.append(normpath) - newpaths.reverse() # since we're inserting at the head - for path in newpaths: - if not path: - continue - normpath = os.path.normpath(os.path.normcase(path)) - if normpath not in normpaths: - result.insert(0, path) - normpaths.append(normpath) - paths = result - - else: - newpaths = newpaths + paths # prepend new paths - - normpaths = [] - paths = [] - # now we add them only if they are unique - for path in newpaths: - normpath = os.path.normpath(os.path.normcase(path)) - if path and not normpath in normpaths: - paths.append(path) - normpaths.append(normpath) - - if is_list: - return paths - else: - return string.join(paths, sep) - -def AppendPath(oldpath, newpath, sep = os.pathsep, - delete_existing=1, canonicalize=None): - """This appends new path elements to the given old path. Will - only add any particular path once (leaving the last one it - encounters and ignoring the rest, to preserve path order), and - will os.path.normpath and os.path.normcase all paths to help - assure this. This can also handle the case where the given old - path variable is a list instead of a string, in which case a list - will be returned instead of a string. - - Example: - Old Path: "/foo/bar:/foo" - New Path: "/biz/boom:/foo" - Result: "/foo/bar:/biz/boom:/foo" - - If delete_existing is 0, then adding a path that exists - will not move it to the end; it will stay where it is in the list. - - If canonicalize is not None, it is applied to each element of - newpath before use. - """ - - orig = oldpath - is_list = 1 - paths = orig - if not is_List(orig) and not is_Tuple(orig): - paths = string.split(paths, sep) - is_list = 0 - - if is_String(newpath): - newpaths = string.split(newpath, sep) - elif not is_List(newpath) and not is_Tuple(newpath): - newpaths = [ newpath ] # might be a Dir - else: - newpaths = newpath - - if canonicalize: - newpaths=map(canonicalize, newpaths) - - if not delete_existing: - # add old paths to result, then - # add new paths if not already present - # (I thought about using a dict for normpaths for speed, - # but it's not clear hashing the strings would be faster - # than linear searching these typically short lists.) - result = [] - normpaths = [] - for path in paths: - if not path: - continue - result.append(path) - normpaths.append(os.path.normpath(os.path.normcase(path))) - for path in newpaths: - if not path: - continue - normpath = os.path.normpath(os.path.normcase(path)) - if normpath not in normpaths: - result.append(path) - normpaths.append(normpath) - paths = result - else: - # start w/ new paths, add old ones if not present, - # then reverse. - newpaths = paths + newpaths # append new paths - newpaths.reverse() - - normpaths = [] - paths = [] - # now we add them only if they are unique - for path in newpaths: - normpath = os.path.normpath(os.path.normcase(path)) - if path and not normpath in normpaths: - paths.append(path) - normpaths.append(normpath) - paths.reverse() - - if is_list: - return paths - else: - return string.join(paths, sep) - -if sys.platform == 'cygwin': - def get_native_path(path): - """Transforms an absolute path into a native path for the system. In - Cygwin, this converts from a Cygwin path to a Windows one.""" - return string.replace(os.popen('cygpath -w ' + path).read(), '\n', '') -else: - def get_native_path(path): - """Transforms an absolute path into a native path for the system. - Non-Cygwin version, just leave the path alone.""" - return path - -display = DisplayEngine() - -def Split(arg): - if is_List(arg) or is_Tuple(arg): - return arg - elif is_String(arg): - return string.split(arg) - else: - return [arg] - -class CLVar(UserList): - """A class for command-line construction variables. - - This is a list that uses Split() to split an initial string along - white-space arguments, and similarly to split any strings that get - added. This allows us to Do the Right Thing with Append() and - Prepend() (as well as straight Python foo = env['VAR'] + 'arg1 - arg2') regardless of whether a user adds a list or a string to a - command-line construction variable. - """ - def __init__(self, seq = []): - UserList.__init__(self, Split(seq)) - def __add__(self, other): - return UserList.__add__(self, CLVar(other)) - def __radd__(self, other): - return UserList.__radd__(self, CLVar(other)) - def __coerce__(self, other): - return (self, CLVar(other)) - def __str__(self): - return string.join(self.data) - -# A dictionary that preserves the order in which items are added. -# Submitted by David Benjamin to ActiveState's Python Cookbook web site: -# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747 -# Including fixes/enhancements from the follow-on discussions. -class OrderedDict(UserDict): - def __init__(self, dict = None): - self._keys = [] - UserDict.__init__(self, dict) - - def __delitem__(self, key): - UserDict.__delitem__(self, key) - self._keys.remove(key) - - def __setitem__(self, key, item): - UserDict.__setitem__(self, key, item) - if key not in self._keys: self._keys.append(key) - - def clear(self): - UserDict.clear(self) - self._keys = [] - - def copy(self): - dict = OrderedDict() - dict.update(self) - return dict - - def items(self): - return zip(self._keys, self.values()) - - def keys(self): - return self._keys[:] - - def popitem(self): - try: - key = self._keys[-1] - except IndexError: - raise KeyError('dictionary is empty') - - val = self[key] - del self[key] - - return (key, val) - - def setdefault(self, key, failobj = None): - UserDict.setdefault(self, key, failobj) - if key not in self._keys: self._keys.append(key) - - def update(self, dict): - for (key, val) in dict.items(): - self.__setitem__(key, val) - - def values(self): - return map(self.get, self._keys) - -class Selector(OrderedDict): - """A callable ordered dictionary that maps file suffixes to - dictionary values. We preserve the order in which items are added - so that get_suffix() calls always return the first suffix added.""" - def __call__(self, env, source, ext=None): - if ext is None: - try: - ext = source[0].suffix - except IndexError: - ext = "" - try: - return self[ext] - except KeyError: - # Try to perform Environment substitution on the keys of - # the dictionary before giving up. - s_dict = {} - for (k,v) in self.items(): - if not k is None: - s_k = env.subst(k) - if s_dict.has_key(s_k): - # We only raise an error when variables point - # to the same suffix. If one suffix is literal - # and a variable suffix contains this literal, - # the literal wins and we don't raise an error. - raise KeyError, (s_dict[s_k][0], k, s_k) - s_dict[s_k] = (k,v) - try: - return s_dict[ext][1] - except KeyError: - try: - return self[None] - except KeyError: - return None - - -if sys.platform == 'cygwin': - # On Cygwin, os.path.normcase() lies, so just report back the - # fact that the underlying Windows OS is case-insensitive. - def case_sensitive_suffixes(s1, s2): - return 0 -else: - def case_sensitive_suffixes(s1, s2): - return (os.path.normcase(s1) != os.path.normcase(s2)) - -def adjustixes(fname, pre, suf, ensure_suffix=False): - if pre: - path, fn = os.path.split(os.path.normpath(fname)) - if fn[:len(pre)] != pre: - fname = os.path.join(path, pre + fn) - # Only append a suffix if the suffix we're going to add isn't already - # there, and if either we've been asked to ensure the specific suffix - # is present or there's no suffix on it at all. - if suf and fname[-len(suf):] != suf and \ - (ensure_suffix or not splitext(fname)[1]): - fname = fname + suf - return fname - - - -# From Tim Peters, -# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52560 -# ASPN: Python Cookbook: Remove duplicates from a sequence -# (Also in the printed Python Cookbook.) - -def unique(s): - """Return a list of the elements in s, but without duplicates. - - For example, unique([1,2,3,1,2,3]) is some permutation of [1,2,3], - unique("abcabc") some permutation of ["a", "b", "c"], and - unique(([1, 2], [2, 3], [1, 2])) some permutation of - [[2, 3], [1, 2]]. - - For best speed, all sequence elements should be hashable. Then - unique() will usually work in linear time. - - If not possible, the sequence elements should enjoy a total - ordering, and if list(s).sort() doesn't raise TypeError it's - assumed that they do enjoy a total ordering. Then unique() will - usually work in O(N*log2(N)) time. - - If that's not possible either, the sequence elements must support - equality-testing. Then unique() will usually work in quadratic - time. - """ - - n = len(s) - if n == 0: - return [] - - # Try using a dict first, as that's the fastest and will usually - # work. If it doesn't work, it will usually fail quickly, so it - # usually doesn't cost much to *try* it. It requires that all the - # sequence elements be hashable, and support equality comparison. - u = {} - try: - for x in s: - u[x] = 1 - except TypeError: - pass # move on to the next method - else: - return u.keys() - del u - - # We can't hash all the elements. Second fastest is to sort, - # which brings the equal elements together; then duplicates are - # easy to weed out in a single pass. - # NOTE: Python's list.sort() was designed to be efficient in the - # presence of many duplicate elements. This isn't true of all - # sort functions in all languages or libraries, so this approach - # is more effective in Python than it may be elsewhere. - try: - t = list(s) - t.sort() - except TypeError: - pass # move on to the next method - else: - assert n > 0 - last = t[0] - lasti = i = 1 - while i < n: - if t[i] != last: - t[lasti] = last = t[i] - lasti = lasti + 1 - i = i + 1 - return t[:lasti] - del t - - # Brute force is all that's left. - u = [] - for x in s: - if x not in u: - u.append(x) - return u - - - -# From Alex Martelli, -# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52560 -# ASPN: Python Cookbook: Remove duplicates from a sequence -# First comment, dated 2001/10/13. -# (Also in the printed Python Cookbook.) - -def uniquer(seq, idfun=None): - if idfun is None: - def idfun(x): return x - seen = {} - result = [] - for item in seq: - marker = idfun(item) - # in old Python versions: - # if seen.has_key(marker) - # but in new ones: - if marker in seen: continue - seen[marker] = 1 - result.append(item) - return result - -# A more efficient implementation of Alex's uniquer(), this avoids the -# idfun() argument and function-call overhead by assuming that all -# items in the sequence are hashable. - -def uniquer_hashables(seq): - seen = {} - result = [] - for item in seq: - #if not item in seen: - if not seen.has_key(item): - seen[item] = 1 - result.append(item) - return result - - - -# Much of the logic here was originally based on recipe 4.9 from the -# Python CookBook, but we had to dumb it way down for Python 1.5.2. -class LogicalLines: - - def __init__(self, fileobj): - self.fileobj = fileobj - - def readline(self): - result = [] - while 1: - line = self.fileobj.readline() - if not line: - break - if line[-2:] == '\\\n': - result.append(line[:-2]) - else: - result.append(line) - break - return string.join(result, '') - - def readlines(self): - result = [] - while 1: - line = self.readline() - if not line: - break - result.append(line) - return result - - - -class UniqueList(UserList): - def __init__(self, seq = []): - UserList.__init__(self, seq) - self.unique = True - def __make_unique(self): - if not self.unique: - self.data = uniquer_hashables(self.data) - self.unique = True - def __lt__(self, other): - self.__make_unique() - return UserList.__lt__(self, other) - def __le__(self, other): - self.__make_unique() - return UserList.__le__(self, other) - def __eq__(self, other): - self.__make_unique() - return UserList.__eq__(self, other) - def __ne__(self, other): - self.__make_unique() - return UserList.__ne__(self, other) - def __gt__(self, other): - self.__make_unique() - return UserList.__gt__(self, other) - def __ge__(self, other): - self.__make_unique() - return UserList.__ge__(self, other) - def __cmp__(self, other): - self.__make_unique() - return UserList.__cmp__(self, other) - def __len__(self): - self.__make_unique() - return UserList.__len__(self) - def __getitem__(self, i): - self.__make_unique() - return UserList.__getitem__(self, i) - def __setitem__(self, i, item): - UserList.__setitem__(self, i, item) - self.unique = False - def __getslice__(self, i, j): - self.__make_unique() - return UserList.__getslice__(self, i, j) - def __setslice__(self, i, j, other): - UserList.__setslice__(self, i, j, other) - self.unique = False - def __add__(self, other): - result = UserList.__add__(self, other) - result.unique = False - return result - def __radd__(self, other): - result = UserList.__radd__(self, other) - result.unique = False - return result - def __iadd__(self, other): - result = UserList.__iadd__(self, other) - result.unique = False - return result - def __mul__(self, other): - result = UserList.__mul__(self, other) - result.unique = False - return result - def __rmul__(self, other): - result = UserList.__rmul__(self, other) - result.unique = False - return result - def __imul__(self, other): - result = UserList.__imul__(self, other) - result.unique = False - return result - def append(self, item): - UserList.append(self, item) - self.unique = False - def insert(self, i): - UserList.insert(self, i) - self.unique = False - def count(self, item): - self.__make_unique() - return UserList.count(self, item) - def index(self, item): - self.__make_unique() - return UserList.index(self, item) - def reverse(self): - self.__make_unique() - UserList.reverse(self) - def sort(self, *args, **kwds): - self.__make_unique() - #return UserList.sort(self, *args, **kwds) - return apply(UserList.sort, (self,)+args, kwds) - def extend(self, other): - UserList.extend(self, other) - self.unique = False - - - -class Unbuffered: - """ - A proxy class that wraps a file object, flushing after every write, - and delegating everything else to the wrapped object. - """ - def __init__(self, file): - self.file = file - def write(self, arg): - try: - self.file.write(arg) - self.file.flush() - except IOError: - # Stdout might be connected to a pipe that has been closed - # by now. The most likely reason for the pipe being closed - # is that the user has press ctrl-c. It this is the case, - # then SCons is currently shutdown. We therefore ignore - # IOError's here so that SCons can continue and shutdown - # properly so that the .sconsign is correctly written - # before SCons exits. - pass - def __getattr__(self, attr): - return getattr(self.file, attr) - -def make_path_relative(path): - """ makes an absolute path name to a relative pathname. - """ - if os.path.isabs(path): - drive_s,path = os.path.splitdrive(path) - - import re - if not drive_s: - path=re.compile("/*(.*)").findall(path)[0] - else: - path=path[1:] - - assert( not os.path.isabs( path ) ), path - return path - - - -# The original idea for AddMethod() and RenameFunction() come from the -# following post to the ActiveState Python Cookbook: -# -# ASPN: Python Cookbook : Install bound methods in an instance -# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/223613 -# -# That code was a little fragile, though, so the following changes -# have been wrung on it: -# -# * Switched the installmethod() "object" and "function" arguments, -# so the order reflects that the left-hand side is the thing being -# "assigned to" and the right-hand side is the value being assigned. -# -# * Changed explicit type-checking to the "try: klass = object.__class__" -# block in installmethod() below so that it still works with the -# old-style classes that SCons uses. -# -# * Replaced the by-hand creation of methods and functions with use of -# the "new" module, as alluded to in Alex Martelli's response to the -# following Cookbook post: -# -# ASPN: Python Cookbook : Dynamically added methods to a class -# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/81732 - -def AddMethod(object, function, name = None): - """ - Adds either a bound method to an instance or an unbound method to - a class. If name is ommited the name of the specified function - is used by default. - Example: - a = A() - def f(self, x, y): - self.z = x + y - AddMethod(f, A, "add") - a.add(2, 4) - print a.z - AddMethod(lambda self, i: self.l[i], a, "listIndex") - print a.listIndex(5) - """ - import new - - if name is None: - name = function.func_name - else: - function = RenameFunction(function, name) - - try: - klass = object.__class__ - except AttributeError: - # "object" is really a class, so it gets an unbound method. - object.__dict__[name] = new.instancemethod(function, None, object) - else: - # "object" is really an instance, so it gets a bound method. - object.__dict__[name] = new.instancemethod(function, object, klass) - -def RenameFunction(function, name): - """ - Returns a function identical to the specified function, but with - the specified name. - """ - import new - - # Compatibility for Python 1.5 and 2.1. Can be removed in favor of - # passing function.func_defaults directly to new.function() once - # we base on Python 2.2 or later. - func_defaults = function.func_defaults - if func_defaults is None: - func_defaults = () - - return new.function(function.func_code, - function.func_globals, - name, - func_defaults) - - -md5 = False -def MD5signature(s): - return str(s) - -def MD5filesignature(fname, chunksize=65536): - f = open(fname, "rb") - result = f.read() - f.close() - return result - -try: - import hashlib -except ImportError: - pass -else: - if hasattr(hashlib, 'md5'): - md5 = True - def MD5signature(s): - m = hashlib.md5() - m.update(str(s)) - return m.hexdigest() - - def MD5filesignature(fname, chunksize=65536): - m = hashlib.md5() - f = open(fname, "rb") - while 1: - blck = f.read(chunksize) - if not blck: - break - m.update(str(blck)) - f.close() - return m.hexdigest() - -def MD5collect(signatures): - """ - Collects a list of signatures into an aggregate signature. - - signatures - a list of signatures - returns - the aggregate signature - """ - if len(signatures) == 1: - return signatures[0] - else: - return MD5signature(string.join(signatures, ', ')) - - - -# From Dinu C. Gherman, -# Python Cookbook, second edition, recipe 6.17, p. 277. -# Also: -# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/68205 -# ASPN: Python Cookbook: Null Object Design Pattern - -# TODO(1.5): -#class Null(object): -class Null: - """ Null objects always and reliably "do nothing." """ - def __new__(cls, *args, **kwargs): - if not '_inst' in vars(cls): - #cls._inst = type.__new__(cls, *args, **kwargs) - cls._inst = apply(type.__new__, (cls,) + args, kwargs) - return cls._inst - def __init__(self, *args, **kwargs): - pass - def __call__(self, *args, **kwargs): - return self - def __repr__(self): - return "Null(0x%08X)" % id(self) - def __nonzero__(self): - return False - def __getattr__(self, name): - return self - def __setattr__(self, name, value): - return self - def __delattr__(self, name): - return self - -class NullSeq(Null): - def __len__(self): - return 0 - def __iter__(self): - return iter(()) - def __getitem__(self, i): - return self - def __delitem__(self, i): - return self - def __setitem__(self, i, v): - return self - - -del __revision__ - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Variables/BoolVariable.py b/3rdParty/SCons/scons-local/SCons/Variables/BoolVariable.py deleted file mode 100644 index 4cf20d8..0000000 --- a/3rdParty/SCons/scons-local/SCons/Variables/BoolVariable.py +++ /dev/null @@ -1,91 +0,0 @@ -"""engine.SCons.Variables.BoolVariable - -This file defines the option type for SCons implementing true/false values. - -Usage example: - - opts = Variables() - opts.Add(BoolVariable('embedded', 'build for an embedded system', 0)) - ... - if env['embedded'] == 1: - ... -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Variables/BoolVariable.py 4043 2009/02/23 09:06:45 scons" - -__all__ = ['BoolVariable',] - -import string - -import SCons.Errors - -__true_strings = ('y', 'yes', 'true', 't', '1', 'on' , 'all' ) -__false_strings = ('n', 'no', 'false', 'f', '0', 'off', 'none') - - -def _text2bool(val): - """ - Converts strings to True/False depending on the 'truth' expressed by - the string. If the string can't be converted, the original value - will be returned. - - See '__true_strings' and '__false_strings' for values considered - 'true' or 'false respectivly. - - This is usable as 'converter' for SCons' Variables. - """ - lval = string.lower(val) - if lval in __true_strings: return True - if lval in __false_strings: return False - raise ValueError("Invalid value for boolean option: %s" % val) - - -def _validator(key, val, env): - """ - Validates the given value to be either '0' or '1'. - - This is usable as 'validator' for SCons' Variables. - """ - if not env[key] in (True, False): - raise SCons.Errors.UserError( - 'Invalid value for boolean option %s: %s' % (key, env[key])) - - -def BoolVariable(key, help, default): - """ - The input parameters describe a boolen option, thus they are - returned with the correct converter and validator appended. The - 'help' text will by appended by '(yes|no) to show the valid - valued. The result is usable for input to opts.Add(). - """ - return (key, '%s (yes|no)' % help, default, - _validator, _text2bool) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Variables/EnumVariable.py b/3rdParty/SCons/scons-local/SCons/Variables/EnumVariable.py deleted file mode 100644 index bd72d05..0000000 --- a/3rdParty/SCons/scons-local/SCons/Variables/EnumVariable.py +++ /dev/null @@ -1,107 +0,0 @@ -"""engine.SCons.Variables.EnumVariable - -This file defines the option type for SCons allowing only specified -input-values. - -Usage example: - - opts = Variables() - opts.Add(EnumVariable('debug', 'debug output and symbols', 'no', - allowed_values=('yes', 'no', 'full'), - map={}, ignorecase=2)) - ... - if env['debug'] == 'full': - ... -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Variables/EnumVariable.py 4043 2009/02/23 09:06:45 scons" - -__all__ = ['EnumVariable',] - -import string - -import SCons.Errors - -def _validator(key, val, env, vals): - if not val in vals: - raise SCons.Errors.UserError( - 'Invalid value for option %s: %s' % (key, val)) - - -def EnumVariable(key, help, default, allowed_values, map={}, ignorecase=0): - """ - The input parameters describe a option with only certain values - allowed. They are returned with an appropriate converter and - validator appended. The result is usable for input to - Variables.Add(). - - 'key' and 'default' are the values to be passed on to Variables.Add(). - - 'help' will be appended by the allowed values automatically - - 'allowed_values' is a list of strings, which are allowed as values - for this option. - - The 'map'-dictionary may be used for converting the input value - into canonical values (eg. for aliases). - - 'ignorecase' defines the behaviour of the validator: - - If ignorecase == 0, the validator/converter are case-sensitive. - If ignorecase == 1, the validator/converter are case-insensitive. - If ignorecase == 2, the validator/converter is case-insensitive and - the converted value will always be lower-case. - - The 'validator' tests whether the value is in the list of allowed - values. The 'converter' converts input values according to the - given 'map'-dictionary (unmapped input values are returned - unchanged). - """ - help = '%s (%s)' % (help, string.join(allowed_values, '|')) - # define validator - if ignorecase >= 1: - validator = lambda key, val, env, vals=allowed_values: \ - _validator(key, string.lower(val), env, vals) - else: - validator = lambda key, val, env, vals=allowed_values: \ - _validator(key, val, env, vals) - # define converter - if ignorecase == 2: - converter = lambda val, map=map: \ - string.lower(map.get(string.lower(val), val)) - elif ignorecase == 1: - converter = lambda val, map=map: \ - map.get(string.lower(val), val) - else: - converter = lambda val, map=map: \ - map.get(val, val) - return (key, help, default, validator, converter) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Variables/ListVariable.py b/3rdParty/SCons/scons-local/SCons/Variables/ListVariable.py deleted file mode 100644 index 1051c51..0000000 --- a/3rdParty/SCons/scons-local/SCons/Variables/ListVariable.py +++ /dev/null @@ -1,139 +0,0 @@ -"""engine.SCons.Variables.ListVariable - -This file defines the option type for SCons implementing 'lists'. - -A 'list' option may either be 'all', 'none' or a list of names -separated by comma. After the option has been processed, the option -value holds either the named list elements, all list elemens or no -list elements at all. - -Usage example: - - list_of_libs = Split('x11 gl qt ical') - - opts = Variables() - opts.Add(ListVariable('shared', - 'libraries to build as shared libraries', - 'all', - elems = list_of_libs)) - ... - for lib in list_of_libs: - if lib in env['shared']: - env.SharedObject(...) - else: - env.Object(...) -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Variables/ListVariable.py 4043 2009/02/23 09:06:45 scons" - -# Know Bug: This should behave like a Set-Type, but does not really, -# since elements can occur twice. - -__all__ = ['ListVariable',] - -import string -import UserList - -import SCons.Util - - -class _ListVariable(UserList.UserList): - def __init__(self, initlist=[], allowedElems=[]): - UserList.UserList.__init__(self, filter(None, initlist)) - self.allowedElems = allowedElems[:] - self.allowedElems.sort() - - def __cmp__(self, other): - raise NotImplementedError - def __eq__(self, other): - raise NotImplementedError - def __ge__(self, other): - raise NotImplementedError - def __gt__(self, other): - raise NotImplementedError - def __le__(self, other): - raise NotImplementedError - def __lt__(self, other): - raise NotImplementedError - def __str__(self): - if len(self) == 0: - return 'none' - self.data.sort() - if self.data == self.allowedElems: - return 'all' - else: - return string.join(self, ',') - def prepare_to_store(self): - return self.__str__() - -def _converter(val, allowedElems, mapdict): - """ - """ - if val == 'none': - val = [] - elif val == 'all': - val = allowedElems - else: - val = filter(None, string.split(val, ',')) - val = map(lambda v, m=mapdict: m.get(v, v), val) - notAllowed = filter(lambda v, aE=allowedElems: not v in aE, val) - if notAllowed: - raise ValueError("Invalid value(s) for option: %s" % - string.join(notAllowed, ',')) - return _ListVariable(val, allowedElems) - - -## def _validator(key, val, env): -## """ -## """ -## # todo: write validater for pgk list -## return 1 - - -def ListVariable(key, help, default, names, map={}): - """ - The input parameters describe a 'package list' option, thus they - are returned with the correct converter and validater appended. The - result is usable for input to opts.Add() . - - A 'package list' option may either be 'all', 'none' or a list of - package names (separated by space). - """ - names_str = 'allowed names: %s' % string.join(names, ' ') - if SCons.Util.is_List(default): - default = string.join(default, ',') - help = string.join( - (help, '(all|none|comma-separated list of names)', names_str), - '\n ') - return (key, help, default, - None, #_validator, - lambda val, elems=names, m=map: _converter(val, elems, m)) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Variables/PackageVariable.py b/3rdParty/SCons/scons-local/SCons/Variables/PackageVariable.py deleted file mode 100644 index 66cea0d..0000000 --- a/3rdParty/SCons/scons-local/SCons/Variables/PackageVariable.py +++ /dev/null @@ -1,109 +0,0 @@ -"""engine.SCons.Variables.PackageVariable - -This file defines the option type for SCons implementing 'package -activation'. - -To be used whenever a 'package' may be enabled/disabled and the -package path may be specified. - -Usage example: - - Examples: - x11=no (disables X11 support) - x11=yes (will search for the package installation dir) - x11=/usr/local/X11 (will check this path for existance) - - To replace autoconf's --with-xxx=yyy - - opts = Variables() - opts.Add(PackageVariable('x11', - 'use X11 installed here (yes = search some places', - 'yes')) - ... - if env['x11'] == True: - dir = ... search X11 in some standard places ... - env['x11'] = dir - if env['x11']: - ... build with x11 ... -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Variables/PackageVariable.py 4043 2009/02/23 09:06:45 scons" - -__all__ = ['PackageVariable',] - -import string - -import SCons.Errors - -__enable_strings = ('1', 'yes', 'true', 'on', 'enable', 'search') -__disable_strings = ('0', 'no', 'false', 'off', 'disable') - -def _converter(val): - """ - """ - lval = string.lower(val) - if lval in __enable_strings: return True - if lval in __disable_strings: return False - #raise ValueError("Invalid value for boolean option: %s" % val) - return val - - -def _validator(key, val, env, searchfunc): - # NB: searchfunc is currenty undocumented and unsupported - """ - """ - # todo: write validator, check for path - import os - if env[key] is True: - if searchfunc: - env[key] = searchfunc(key, val) - elif env[key] and not os.path.exists(val): - raise SCons.Errors.UserError( - 'Path does not exist for option %s: %s' % (key, val)) - - -def PackageVariable(key, help, default, searchfunc=None): - # NB: searchfunc is currenty undocumented and unsupported - """ - The input parameters describe a 'package list' option, thus they - are returned with the correct converter and validator appended. The - result is usable for input to opts.Add() . - - A 'package list' option may either be 'all', 'none' or a list of - package names (seperated by space). - """ - help = string.join( - (help, '( yes | no | /path/to/%s )' % key), - '\n ') - return (key, help, default, - lambda k, v, e, f=searchfunc: _validator(k,v,e,f), - _converter) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Variables/PathVariable.py b/3rdParty/SCons/scons-local/SCons/Variables/PathVariable.py deleted file mode 100644 index 6a44ef6..0000000 --- a/3rdParty/SCons/scons-local/SCons/Variables/PathVariable.py +++ /dev/null @@ -1,147 +0,0 @@ -"""SCons.Variables.PathVariable - -This file defines an option type for SCons implementing path settings. - -To be used whenever a a user-specified path override should be allowed. - -Arguments to PathVariable are: - option-name = name of this option on the command line (e.g. "prefix") - option-help = help string for option - option-dflt = default value for this option - validator = [optional] validator for option value. Predefined - validators are: - - PathAccept -- accepts any path setting; no validation - PathIsDir -- path must be an existing directory - PathIsDirCreate -- path must be a dir; will create - PathIsFile -- path must be a file - PathExists -- path must exist (any type) [default] - - The validator is a function that is called and which - should return True or False to indicate if the path - is valid. The arguments to the validator function - are: (key, val, env). The key is the name of the - option, the val is the path specified for the option, - and the env is the env to which the Otions have been - added. - -Usage example: - - Examples: - prefix=/usr/local - - opts = Variables() - - opts = Variables() - opts.Add(PathVariable('qtdir', - 'where the root of Qt is installed', - qtdir, PathIsDir)) - opts.Add(PathVariable('qt_includes', - 'where the Qt includes are installed', - '$qtdir/includes', PathIsDirCreate)) - opts.Add(PathVariable('qt_libraries', - 'where the Qt library is installed', - '$qtdir/lib')) - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Variables/PathVariable.py 4043 2009/02/23 09:06:45 scons" - -__all__ = ['PathVariable',] - -import os -import os.path - -import SCons.Errors - -class _PathVariableClass: - - def PathAccept(self, key, val, env): - """Accepts any path, no checking done.""" - pass - - def PathIsDir(self, key, val, env): - """Validator to check if Path is a directory.""" - if not os.path.isdir(val): - if os.path.isfile(val): - m = 'Directory path for option %s is a file: %s' - else: - m = 'Directory path for option %s does not exist: %s' - raise SCons.Errors.UserError(m % (key, val)) - - def PathIsDirCreate(self, key, val, env): - """Validator to check if Path is a directory, - creating it if it does not exist.""" - if os.path.isfile(val): - m = 'Path for option %s is a file, not a directory: %s' - raise SCons.Errors.UserError(m % (key, val)) - if not os.path.isdir(val): - os.makedirs(val) - - def PathIsFile(self, key, val, env): - """validator to check if Path is a file""" - if not os.path.isfile(val): - if os.path.isdir(val): - m = 'File path for option %s is a directory: %s' - else: - m = 'File path for option %s does not exist: %s' - raise SCons.Errors.UserError(m % (key, val)) - - def PathExists(self, key, val, env): - """validator to check if Path exists""" - if not os.path.exists(val): - m = 'Path for option %s does not exist: %s' - raise SCons.Errors.UserError(m % (key, val)) - - def __call__(self, key, help, default, validator=None): - # NB: searchfunc is currenty undocumented and unsupported - """ - The input parameters describe a 'path list' option, thus they - are returned with the correct converter and validator appended. The - result is usable for input to opts.Add() . - - The 'default' option specifies the default path to use if the - user does not specify an override with this option. - - validator is a validator, see this file for examples - """ - if validator is None: - validator = self.PathExists - - if SCons.Util.is_List(key) or SCons.Util.is_Tuple(key): - return (key, '%s ( /path/to/%s )' % (help, key[0]), default, - validator, None) - else: - return (key, '%s ( /path/to/%s )' % (help, key), default, - validator, None) - -PathVariable = _PathVariableClass() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Variables/__init__.py b/3rdParty/SCons/scons-local/SCons/Variables/__init__.py deleted file mode 100644 index 89ba227..0000000 --- a/3rdParty/SCons/scons-local/SCons/Variables/__init__.py +++ /dev/null @@ -1,309 +0,0 @@ -"""engine.SCons.Variables - -This file defines the Variables class that is used to add user-friendly -customizable variables to an SCons build. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/Variables/__init__.py 4043 2009/02/23 09:06:45 scons" - -import os.path -import string -import sys - -import SCons.Environment -import SCons.Errors -import SCons.Util -import SCons.Warnings - -from BoolVariable import BoolVariable # okay -from EnumVariable import EnumVariable # okay -from ListVariable import ListVariable # naja -from PackageVariable import PackageVariable # naja -from PathVariable import PathVariable # okay - - -class Variables: - instance=None - - """ - Holds all the options, updates the environment with the variables, - and renders the help text. - """ - def __init__(self, files=[], args={}, is_global=1): - """ - files - [optional] List of option configuration files to load - (backward compatibility) If a single string is passed it is - automatically placed in a file list - """ - self.options = [] - self.args = args - if not SCons.Util.is_List(files): - if files: - files = [ files ] - else: - files = [] - self.files = files - self.unknown = {} - - # create the singleton instance - if is_global: - self=Variables.instance - - if not Variables.instance: - Variables.instance=self - - def _do_add(self, key, help="", default=None, validator=None, converter=None): - class Variable: - pass - - option = Variable() - - # if we get a list or a tuple, we take the first element as the - # option key and store the remaining in aliases. - if SCons.Util.is_List(key) or SCons.Util.is_Tuple(key): - option.key = key[0] - option.aliases = key[1:] - else: - option.key = key - option.aliases = [ key ] - option.help = help - option.default = default - option.validator = validator - option.converter = converter - - self.options.append(option) - - def keys(self): - """ - Returns the keywords for the options - """ - return map(lambda o: o.key, self.options) - - def Add(self, key, help="", default=None, validator=None, converter=None, **kw): - """ - Add an option. - - key - the name of the variable, or a list or tuple of arguments - help - optional help text for the options - default - optional default value - validator - optional function that is called to validate the option's value - Called with (key, value, environment) - converter - optional function that is called to convert the option's value before - putting it in the environment. - """ - - if SCons.Util.is_List(key) or type(key) == type(()): - apply(self._do_add, key) - return - - if not SCons.Util.is_String(key) or \ - not SCons.Environment.is_valid_construction_var(key): - raise SCons.Errors.UserError, "Illegal Variables.Add() key `%s'" % str(key) - - self._do_add(key, help, default, validator, converter) - - def AddVariables(self, *optlist): - """ - Add a list of options. - - Each list element is a tuple/list of arguments to be passed on - to the underlying method for adding options. - - Example: - opt.AddVariables( - ('debug', '', 0), - ('CC', 'The C compiler'), - ('VALIDATE', 'An option for testing validation', 'notset', - validator, None), - ) - """ - for o in optlist: - apply(self._do_add, o) - - - def Update(self, env, args=None): - """ - Update an environment with the option variables. - - env - the environment to update. - """ - - values = {} - - # first set the defaults: - for option in self.options: - if not option.default is None: - values[option.key] = option.default - - # next set the value specified in the options file - for filename in self.files: - if os.path.exists(filename): - dir = os.path.split(os.path.abspath(filename))[0] - if dir: - sys.path.insert(0, dir) - try: - values['__name__'] = filename - execfile(filename, {}, values) - finally: - if dir: - del sys.path[0] - del values['__name__'] - - # set the values specified on the command line - if args is None: - args = self.args - - for arg, value in args.items(): - added = False - for option in self.options: - if arg in option.aliases + [ option.key ]: - values[option.key] = value - added = True - if not added: - self.unknown[arg] = value - - # put the variables in the environment: - # (don't copy over variables that are not declared as options) - for option in self.options: - try: - env[option.key] = values[option.key] - except KeyError: - pass - - # Call the convert functions: - for option in self.options: - if option.converter and values.has_key(option.key): - value = env.subst('${%s}'%option.key) - try: - try: - env[option.key] = option.converter(value) - except TypeError: - env[option.key] = option.converter(value, env) - except ValueError, x: - raise SCons.Errors.UserError, 'Error converting option: %s\n%s'%(option.key, x) - - - # Finally validate the values: - for option in self.options: - if option.validator and values.has_key(option.key): - option.validator(option.key, env.subst('${%s}'%option.key), env) - - def UnknownVariables(self): - """ - Returns any options in the specified arguments lists that - were not known, declared options in this object. - """ - return self.unknown - - def Save(self, filename, env): - """ - Saves all the options in the given file. This file can - then be used to load the options next run. This can be used - to create an option cache file. - - filename - Name of the file to save into - env - the environment get the option values from - """ - - # Create the file and write out the header - try: - fh = open(filename, 'w') - - try: - # Make an assignment in the file for each option - # within the environment that was assigned a value - # other than the default. - for option in self.options: - try: - value = env[option.key] - try: - prepare = value.prepare_to_store - except AttributeError: - try: - eval(repr(value)) - except KeyboardInterrupt: - raise - except: - # Convert stuff that has a repr() that - # cannot be evaluated into a string - value = SCons.Util.to_String(value) - else: - value = prepare() - - defaultVal = env.subst(SCons.Util.to_String(option.default)) - if option.converter: - defaultVal = option.converter(defaultVal) - - if str(env.subst('${%s}' % option.key)) != str(defaultVal): - fh.write('%s = %s\n' % (option.key, repr(value))) - except KeyError: - pass - finally: - fh.close() - - except IOError, x: - raise SCons.Errors.UserError, 'Error writing options to file: %s\n%s' % (filename, x) - - def GenerateHelpText(self, env, sort=None): - """ - Generate the help text for the options. - - env - an environment that is used to get the current values - of the options. - """ - - if sort: - options = self.options[:] - options.sort(lambda x,y,func=sort: func(x.key,y.key)) - else: - options = self.options - - def format(opt, self=self, env=env): - if env.has_key(opt.key): - actual = env.subst('${%s}' % opt.key) - else: - actual = None - return self.FormatVariableHelpText(env, opt.key, opt.help, opt.default, actual, opt.aliases) - lines = filter(None, map(format, options)) - - return string.join(lines, '') - - format = '\n%s: %s\n default: %s\n actual: %s\n' - format_ = '\n%s: %s\n default: %s\n actual: %s\n aliases: %s\n' - - def FormatVariableHelpText(self, env, key, help, default, actual, aliases=[]): - # Don't display the key name itself as an alias. - aliases = filter(lambda a, k=key: a != k, aliases) - if len(aliases)==0: - return self.format % (key, help, default, actual) - else: - return self.format_ % (key, help, default, actual, aliases) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/Warnings.py b/3rdParty/SCons/scons-local/SCons/Warnings.py deleted file mode 100644 index ada4304..0000000 --- a/3rdParty/SCons/scons-local/SCons/Warnings.py +++ /dev/null @@ -1,217 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -"""SCons.Warnings - -This file implements the warnings framework for SCons. - -""" - -__revision__ = "src/engine/SCons/Warnings.py 4043 2009/02/23 09:06:45 scons" - -import string -import sys - -import SCons.Errors - -class Warning(SCons.Errors.UserError): - pass - -class MandatoryWarning(Warning): - pass - - - -class FutureDeprecatedWarning(Warning): - pass - -class DeprecatedWarning(Warning): - pass - -class MandatoryDeprecatedWarning(MandatoryWarning): - pass - - - -# NOTE: If you add a new warning class, add it to the man page, too! - -class CacheWriteErrorWarning(Warning): - pass - -class CorruptSConsignWarning(Warning): - pass - -class DependencyWarning(Warning): - pass - -class DeprecatedCopyWarning(DeprecatedWarning): - pass - -class DeprecatedOptionsWarning(DeprecatedWarning): - pass - -class DeprecatedSourceSignaturesWarning(DeprecatedWarning): - pass - -class DeprecatedTargetSignaturesWarning(DeprecatedWarning): - pass - -class DuplicateEnvironmentWarning(Warning): - pass - -class FutureReservedVariableWarning(Warning): - pass - -class LinkWarning(Warning): - pass - -class MisleadingKeywordsWarning(Warning): - pass - -class MissingSConscriptWarning(Warning): - pass - -class NoMD5ModuleWarning(Warning): - pass - -class NoMetaclassSupportWarning(Warning): - pass - -class NoObjectCountWarning(Warning): - pass - -class NoParallelSupportWarning(Warning): - pass - -class PythonVersionWarning(DeprecatedWarning): - pass - -class ReservedVariableWarning(Warning): - pass - -class StackSizeWarning(Warning): - pass - -class TaskmasterNeedsExecuteWarning(FutureDeprecatedWarning): - pass - -class FortranCxxMixWarning(LinkWarning): - pass - -_warningAsException = 0 - -# The below is a list of 2-tuples. The first element is a class object. -# The second element is true if that class is enabled, false if it is disabled. -_enabled = [] - -_warningOut = None - -def suppressWarningClass(clazz): - """Suppresses all warnings that are of type clazz or - derived from clazz.""" - _enabled.insert(0, (clazz, 0)) - -def enableWarningClass(clazz): - """Suppresses all warnings that are of type clazz or - derived from clazz.""" - _enabled.insert(0, (clazz, 1)) - -def warningAsException(flag=1): - """Turn warnings into exceptions. Returns the old value of the flag.""" - global _warningAsException - old = _warningAsException - _warningAsException = flag - return old - -def warn(clazz, *args): - global _enabled, _warningAsException, _warningOut - - warning = clazz(args) - for clazz, flag in _enabled: - if isinstance(warning, clazz): - if flag: - if _warningAsException: - raise warning - - if _warningOut: - _warningOut(warning) - break - -def process_warn_strings(arguments): - """Process string specifications of enabling/disabling warnings, - as passed to the --warn option or the SetOption('warn') function. - - - An argument to this option should be of the form <warning-class> - or no-<warning-class>. The warning class is munged in order - to get an actual class name from the classes above, which we - need to pass to the {enable,disable}WarningClass() functions. - The supplied <warning-class> is split on hyphens, each element - is capitalized, then smushed back together. Then the string - "Warning" is appended to get the class name. - - For example, 'deprecated' will enable the DeprecatedWarning - class. 'no-dependency' will disable the .DependencyWarning - class. - - As a special case, --warn=all and --warn=no-all will enable or - disable (respectively) the base Warning class of all warnings. - - """ - - def _capitalize(s): - if s[:5] == "scons": - return "SCons" + s[5:] - else: - return string.capitalize(s) - - for arg in arguments: - - elems = string.split(string.lower(arg), '-') - enable = 1 - if elems[0] == 'no': - enable = 0 - del elems[0] - - if len(elems) == 1 and elems[0] == 'all': - class_name = "Warning" - else: - class_name = string.join(map(_capitalize, elems), '') + "Warning" - try: - clazz = globals()[class_name] - except KeyError: - sys.stderr.write("No warning type: '%s'\n" % arg) - else: - if enable: - enableWarningClass(clazz) - elif issubclass(clazz, MandatoryDeprecatedWarning): - fmt = "Can not disable mandataory warning: '%s'\n" - sys.stderr.write(fmt % arg) - else: - suppressWarningClass(clazz) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/__init__.py b/3rdParty/SCons/scons-local/SCons/__init__.py deleted file mode 100644 index 0893900..0000000 --- a/3rdParty/SCons/scons-local/SCons/__init__.py +++ /dev/null @@ -1,49 +0,0 @@ -"""SCons - -The main package for the SCons software construction utility. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/__init__.py 4043 2009/02/23 09:06:45 scons" - -__version__ = "1.2.0.d20090223" - -__build__ = "r4043" - -__buildsys__ = "scons-dev" - -__date__ = "2009/02/23 09:06:45" - -__developer__ = "scons" - -# make sure compatibility is always in place -import SCons.compat - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/compat/__init__.py b/3rdParty/SCons/scons-local/SCons/compat/__init__.py deleted file mode 100644 index f48ae4a..0000000 --- a/3rdParty/SCons/scons-local/SCons/compat/__init__.py +++ /dev/null @@ -1,257 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__doc__ = """ -SCons compatibility package for old Python versions - -This subpackage holds modules that provide backwards-compatible -implementations of various things that we'd like to use in SCons but which -only show up in later versions of Python than the early, old version(s) -we still support. - -Other code will not generally reference things in this package through -the SCons.compat namespace. The modules included here add things to -the __builtin__ namespace or the global module list so that the rest -of our code can use the objects and names imported here regardless of -Python version. - -Simply enough, things that go in the __builtin__ name space come from -our builtins module. - -The rest of the things here will be in individual compatibility modules -that are either: 1) suitably modified copies of the future modules that -we want to use; or 2) backwards compatible re-implementations of the -specific portions of a future module's API that we want to use. - -GENERAL WARNINGS: Implementations of functions in the SCons.compat -modules are *NOT* guaranteed to be fully compliant with these functions in -later versions of Python. We are only concerned with adding functionality -that we actually use in SCons, so be wary if you lift this code for -other uses. (That said, making these more nearly the same as later, -official versions is still a desirable goal, we just don't need to be -obsessive about it.) - -We name the compatibility modules with an initial '_scons_' (for example, -_scons_subprocess.py is our compatibility module for subprocess) so -that we can still try to import the real module name and fall back to -our compatibility module if we get an ImportError. The import_as() -function defined below loads the module as the "real" name (without the -'_scons'), after which all of the "import {module}" statements in the -rest of our code will find our pre-loaded compatibility module. -""" - -__revision__ = "src/engine/SCons/compat/__init__.py 4043 2009/02/23 09:06:45 scons" - -def import_as(module, name): - """ - Imports the specified module (from our local directory) as the - specified name. - """ - import imp - import os.path - dir = os.path.split(__file__)[0] - file, filename, suffix_mode_type = imp.find_module(module, [dir]) - imp.load_module(name, file, filename, suffix_mode_type) - -import builtins - -try: - import hashlib -except ImportError: - # Pre-2.5 Python has no hashlib module. - try: - import_as('_scons_hashlib', 'hashlib') - except ImportError: - # If we failed importing our compatibility module, it probably - # means this version of Python has no md5 module. Don't do - # anything and let the higher layer discover this fact, so it - # can fall back to using timestamp. - pass - -try: - set -except NameError: - # Pre-2.4 Python has no native set type - try: - # Python 2.2 and 2.3 can use the copy of the 2.[45] sets module - # that we grabbed. - import_as('_scons_sets', 'sets') - except (ImportError, SyntaxError): - # Python 1.5 (ImportError, no __future_ module) and 2.1 - # (SyntaxError, no generators in __future__) will blow up - # trying to import the 2.[45] sets module, so back off to a - # custom sets module that can be discarded easily when we - # stop supporting those versions. - import_as('_scons_sets15', 'sets') - import __builtin__ - import sets - __builtin__.set = sets.Set - -import fnmatch -try: - fnmatch.filter -except AttributeError: - # Pre-2.2 Python has no fnmatch.filter() function. - def filter(names, pat): - """Return the subset of the list NAMES that match PAT""" - import os,posixpath - result=[] - pat = os.path.normcase(pat) - if not fnmatch._cache.has_key(pat): - import re - res = fnmatch.translate(pat) - fnmatch._cache[pat] = re.compile(res) - match = fnmatch._cache[pat].match - if os.path is posixpath: - # normcase on posix is NOP. Optimize it away from the loop. - for name in names: - if match(name): - result.append(name) - else: - for name in names: - if match(os.path.normcase(name)): - result.append(name) - return result - fnmatch.filter = filter - del filter - -try: - import itertools -except ImportError: - # Pre-2.3 Python has no itertools module. - import_as('_scons_itertools', 'itertools') - -# If we need the compatibility version of textwrap, it must be imported -# before optparse, which uses it. -try: - import textwrap -except ImportError: - # Pre-2.3 Python has no textwrap module. - import_as('_scons_textwrap', 'textwrap') - -try: - import optparse -except ImportError: - # Pre-2.3 Python has no optparse module. - import_as('_scons_optparse', 'optparse') - -import os -try: - os.devnull -except AttributeError: - # Pre-2.4 Python has no os.devnull attribute - import sys - _names = sys.builtin_module_names - if 'posix' in _names: - os.devnull = '/dev/null' - elif 'nt' in _names: - os.devnull = 'nul' - os.path.devnull = os.devnull -try: - os.path.lexists -except AttributeError: - # Pre-2.4 Python has no os.path.lexists function - def lexists(path): - return os.path.exists(path) or os.path.islink(path) - os.path.lexists = lexists - -import shlex -try: - shlex.split -except AttributeError: - # Pre-2.3 Python has no shlex.split() function. - # - # The full white-space splitting semantics of shlex.split() are - # complicated to reproduce by hand, so just use a compatibility - # version of the shlex module cribbed from Python 2.5 with some - # minor modifications for older Python versions. - del shlex - import_as('_scons_shlex', 'shlex') - - -import shutil -try: - shutil.move -except AttributeError: - # Pre-2.3 Python has no shutil.move() function. - # - # Cribbed from Python 2.5. - import os - - def move(src, dst): - """Recursively move a file or directory to another location. - - If the destination is on our current filesystem, then simply use - rename. Otherwise, copy src to the dst and then remove src. - A lot more could be done here... A look at a mv.c shows a lot of - the issues this implementation glosses over. - - """ - try: - os.rename(src, dst) - except OSError: - if os.path.isdir(src): - if shutil.destinsrc(src, dst): - raise Error, "Cannot move a directory '%s' into itself '%s'." % (src, dst) - shutil.copytree(src, dst, symlinks=True) - shutil.rmtree(src) - else: - shutil.copy2(src,dst) - os.unlink(src) - shutil.move = move - del move - - def destinsrc(src, dst): - src = os.path.abspath(src) - return os.path.abspath(dst)[:len(src)] == src - shutil.destinsrc = destinsrc - del destinsrc - - -try: - import subprocess -except ImportError: - # Pre-2.4 Python has no subprocess module. - import_as('_scons_subprocess', 'subprocess') - -import sys -try: - sys.version_info -except AttributeError: - # Pre-1.6 Python has no sys.version_info - import string - version_string = string.split(sys.version)[0] - version_ints = map(int, string.split(version_string, '.')) - sys.version_info = tuple(version_ints + ['final', 0]) - -try: - import UserString -except ImportError: - # Pre-1.6 Python has no UserString module. - import_as('_scons_UserString', 'UserString') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/compat/_scons_UserString.py b/3rdParty/SCons/scons-local/SCons/compat/_scons_UserString.py deleted file mode 100644 index 4b736fd..0000000 --- a/3rdParty/SCons/scons-local/SCons/compat/_scons_UserString.py +++ /dev/null @@ -1,98 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/compat/_scons_UserString.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """ -A user-defined wrapper around string objects - -This class is "borrowed" from the Python 2.2 UserString and modified -slightly for use with SCons. It is *NOT* guaranteed to be fully compliant -with the standard UserString class from all later versions of Python. -In particular, it does not necessarily contain all of the methods found -in later versions. -""" - -import types - -StringType = types.StringType - -if hasattr(types, 'UnicodeType'): - UnicodeType = types.UnicodeType - def is_String(obj): - return type(obj) in (StringType, UnicodeType) -else: - def is_String(obj): - return type(obj) is StringType - -class UserString: - def __init__(self, seq): - if is_String(seq): - self.data = seq - elif isinstance(seq, UserString): - self.data = seq.data[:] - else: - self.data = str(seq) - def __str__(self): return str(self.data) - def __repr__(self): return repr(self.data) - def __int__(self): return int(self.data) - def __long__(self): return long(self.data) - def __float__(self): return float(self.data) - def __complex__(self): return complex(self.data) - def __hash__(self): return hash(self.data) - - def __cmp__(self, string): - if isinstance(string, UserString): - return cmp(self.data, string.data) - else: - return cmp(self.data, string) - def __contains__(self, char): - return char in self.data - - def __len__(self): return len(self.data) - def __getitem__(self, index): return self.__class__(self.data[index]) - def __getslice__(self, start, end): - start = max(start, 0); end = max(end, 0) - return self.__class__(self.data[start:end]) - - def __add__(self, other): - if isinstance(other, UserString): - return self.__class__(self.data + other.data) - elif is_String(other): - return self.__class__(self.data + other) - else: - return self.__class__(self.data + str(other)) - def __radd__(self, other): - if is_String(other): - return self.__class__(other + self.data) - else: - return self.__class__(str(other) + self.data) - def __mul__(self, n): - return self.__class__(self.data*n) - __rmul__ = __mul__ - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/compat/_scons_hashlib.py b/3rdParty/SCons/scons-local/SCons/compat/_scons_hashlib.py deleted file mode 100644 index 2fc1ce6..0000000 --- a/3rdParty/SCons/scons-local/SCons/compat/_scons_hashlib.py +++ /dev/null @@ -1,91 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__doc__ = """ -hashlib backwards-compatibility module for older (pre-2.5) Python versions - -This does not not NOT (repeat, *NOT*) provide complete hashlib -functionality. It only wraps the portions of MD5 functionality used -by SCons, in an interface that looks like hashlib (or enough for our -purposes, anyway). In fact, this module will raise an ImportError if -the underlying md5 module isn't available. -""" - -__revision__ = "src/engine/SCons/compat/_scons_hashlib.py 4043 2009/02/23 09:06:45 scons" - -import md5 -import string - -class md5obj: - - md5_module = md5 - - def __init__(self, name, string=''): - if not name in ('MD5', 'md5'): - raise ValueError, "unsupported hash type" - self.name = 'md5' - self.m = self.md5_module.md5() - - def __repr__(self): - return '<%s HASH object @ %#x>' % (self.name, id(self)) - - def copy(self): - import copy - result = copy.copy(self) - result.m = self.m.copy() - return result - - def digest(self): - return self.m.digest() - - def update(self, arg): - return self.m.update(arg) - - if hasattr(md5.md5(), 'hexdigest'): - - def hexdigest(self): - return self.m.hexdigest() - - else: - - # Objects created by the underlying md5 module have no native - # hexdigest() method (*cough* 1.5.2 *cough*), so provide an - # equivalent lifted from elsewhere. - def hexdigest(self): - h = string.hexdigits - r = '' - for c in self.digest(): - i = ord(c) - r = r + h[(i >> 4) & 0xF] + h[i & 0xF] - return r - -new = md5obj - -def md5(string=''): - return md5obj('md5', string) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/compat/_scons_itertools.py b/3rdParty/SCons/scons-local/SCons/compat/_scons_itertools.py deleted file mode 100644 index d2289d3..0000000 --- a/3rdParty/SCons/scons-local/SCons/compat/_scons_itertools.py +++ /dev/null @@ -1,124 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/compat/_scons_itertools.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """ -Implementations of itertools functions for Python versions that don't -have iterators. - -These implement the functions by creating the entire list, not returning -it element-by-element as the real itertools functions do. This means -that early Python versions won't get the performance benefit of using -the itertools, but we can still use them so the later Python versions -do get the advantages of using iterators. - -Because we return the entire list, we intentionally do not implement the -itertools functions that "return" infinitely-long lists: the count(), -cycle() and repeat() functions. Other functions below have remained -unimplemented simply because they aren't being used (yet) and it wasn't -obvious how to do it. Or, conversely, we only implemented those functions -that *were* easy to implement (mostly because the Python documentation -contained examples of equivalent code). - -Note that these do not have independent unit tests, so it's possible -that there are bugs. -""" - -def chain(*iterables): - result = [] - for x in iterables: - result.extend(list(x)) - return result - -def count(n=0): - # returns infinite length, should not be supported - raise NotImplementedError - -def cycle(iterable): - # returns infinite length, should not be supported - raise NotImplementedError - -def dropwhile(predicate, iterable): - result = [] - for x in iterable: - if not predicate(x): - result.append(x) - break - result.extend(iterable) - return result - -def groupby(iterable, *args): - raise NotImplementedError - -def ifilter(predicate, iterable): - result = [] - if predicate is None: - predicate = bool - for x in iterable: - if predicate(x): - result.append(x) - return result - -def ifilterfalse(predicate, iterable): - result = [] - if predicate is None: - predicate = bool - for x in iterable: - if not predicate(x): - result.append(x) - return result - -def imap(function, *iterables): - return apply(map, (function,) + tuple(iterables)) - -def islice(*args, **kw): - raise NotImplementedError - -def izip(*iterables): - return apply(zip, iterables) - -def repeat(*args, **kw): - # returns infinite length, should not be supported - raise NotImplementedError - -def starmap(*args, **kw): - raise NotImplementedError - -def takewhile(predicate, iterable): - result = [] - for x in iterable: - if predicate(x): - result.append(x) - else: - break - return result - -def tee(*args, **kw): - raise NotImplementedError - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/compat/_scons_optparse.py b/3rdParty/SCons/scons-local/SCons/compat/_scons_optparse.py deleted file mode 100644 index 386dfea..0000000 --- a/3rdParty/SCons/scons-local/SCons/compat/_scons_optparse.py +++ /dev/null @@ -1,1725 +0,0 @@ -"""optparse - a powerful, extensible, and easy-to-use option parser. - -By Greg Ward <gward@python.net> - -Originally distributed as Optik; see http://optik.sourceforge.net/ . - -If you have problems with this module, please do not file bugs, -patches, or feature requests with Python; instead, use Optik's -SourceForge project page: - http://sourceforge.net/projects/optik - -For support, use the optik-users@lists.sourceforge.net mailing list -(http://lists.sourceforge.net/lists/listinfo/optik-users). -""" - -# Python developers: please do not make changes to this file, since -# it is automatically generated from the Optik source code. - -__version__ = "1.5.3" - -__all__ = ['Option', - 'SUPPRESS_HELP', - 'SUPPRESS_USAGE', - 'Values', - 'OptionContainer', - 'OptionGroup', - 'OptionParser', - 'HelpFormatter', - 'IndentedHelpFormatter', - 'TitledHelpFormatter', - 'OptParseError', - 'OptionError', - 'OptionConflictError', - 'OptionValueError', - 'BadOptionError'] - -__copyright__ = """ -Copyright (c) 2001-2006 Gregory P. Ward. All rights reserved. -Copyright (c) 2002-2006 Python Software Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -""" - -import string -import sys, os -import types -import textwrap - -def _repr(self): - return "<%s at 0x%x: %s>" % (self.__class__.__name__, id(self), self) - - -try: - sys.getdefaultencoding -except AttributeError: - def fake_getdefaultencoding(): - return None - sys.getdefaultencoding = fake_getdefaultencoding - -try: - ''.encode -except AttributeError: - def encode_wrapper(s, encoding, replacement): - return s -else: - def encode_wrapper(s, encoding, replacement): - return s.encode(encoding, replacement) - - -# This file was generated from: -# Id: option_parser.py 527 2006-07-23 15:21:30Z greg -# Id: option.py 522 2006-06-11 16:22:03Z gward -# Id: help.py 527 2006-07-23 15:21:30Z greg -# Id: errors.py 509 2006-04-20 00:58:24Z gward - -try: - from gettext import gettext -except ImportError: - def gettext(message): - return message -_ = gettext - - -class OptParseError (Exception): - def __init__(self, msg): - self.msg = msg - - def __str__(self): - return self.msg - - -class OptionError (OptParseError): - """ - Raised if an Option instance is created with invalid or - inconsistent arguments. - """ - - def __init__(self, msg, option): - self.msg = msg - self.option_id = str(option) - - def __str__(self): - if self.option_id: - return "option %s: %s" % (self.option_id, self.msg) - else: - return self.msg - -class OptionConflictError (OptionError): - """ - Raised if conflicting options are added to an OptionParser. - """ - -class OptionValueError (OptParseError): - """ - Raised if an invalid option value is encountered on the command - line. - """ - -class BadOptionError (OptParseError): - """ - Raised if an invalid option is seen on the command line. - """ - def __init__(self, opt_str): - self.opt_str = opt_str - - def __str__(self): - return _("no such option: %s") % self.opt_str - -class AmbiguousOptionError (BadOptionError): - """ - Raised if an ambiguous option is seen on the command line. - """ - def __init__(self, opt_str, possibilities): - BadOptionError.__init__(self, opt_str) - self.possibilities = possibilities - - def __str__(self): - return (_("ambiguous option: %s (%s?)") - % (self.opt_str, string.join(self.possibilities, ", "))) - - -class HelpFormatter: - - """ - Abstract base class for formatting option help. OptionParser - instances should use one of the HelpFormatter subclasses for - formatting help; by default IndentedHelpFormatter is used. - - Instance attributes: - parser : OptionParser - the controlling OptionParser instance - indent_increment : int - the number of columns to indent per nesting level - max_help_position : int - the maximum starting column for option help text - help_position : int - the calculated starting column for option help text; - initially the same as the maximum - width : int - total number of columns for output (pass None to constructor for - this value to be taken from the $COLUMNS environment variable) - level : int - current indentation level - current_indent : int - current indentation level (in columns) - help_width : int - number of columns available for option help text (calculated) - default_tag : str - text to replace with each option's default value, "%default" - by default. Set to false value to disable default value expansion. - option_strings : { Option : str } - maps Option instances to the snippet of help text explaining - the syntax of that option, e.g. "-h, --help" or - "-fFILE, --file=FILE" - _short_opt_fmt : str - format string controlling how short options with values are - printed in help text. Must be either "%s%s" ("-fFILE") or - "%s %s" ("-f FILE"), because those are the two syntaxes that - Optik supports. - _long_opt_fmt : str - similar but for long options; must be either "%s %s" ("--file FILE") - or "%s=%s" ("--file=FILE"). - """ - - NO_DEFAULT_VALUE = "none" - - def __init__(self, - indent_increment, - max_help_position, - width, - short_first): - self.parser = None - self.indent_increment = indent_increment - self.help_position = self.max_help_position = max_help_position - if width is None: - try: - width = int(os.environ['COLUMNS']) - except (KeyError, ValueError): - width = 80 - width = width - 2 - self.width = width - self.current_indent = 0 - self.level = 0 - self.help_width = None # computed later - self.short_first = short_first - self.default_tag = "%default" - self.option_strings = {} - self._short_opt_fmt = "%s %s" - self._long_opt_fmt = "%s=%s" - - def set_parser(self, parser): - self.parser = parser - - def set_short_opt_delimiter(self, delim): - if delim not in ("", " "): - raise ValueError( - "invalid metavar delimiter for short options: %r" % delim) - self._short_opt_fmt = "%s" + delim + "%s" - - def set_long_opt_delimiter(self, delim): - if delim not in ("=", " "): - raise ValueError( - "invalid metavar delimiter for long options: %r" % delim) - self._long_opt_fmt = "%s" + delim + "%s" - - def indent(self): - self.current_indent = self.current_indent + self.indent_increment - self.level = self.level + 1 - - def dedent(self): - self.current_indent = self.current_indent - self.indent_increment - assert self.current_indent >= 0, "Indent decreased below 0." - self.level = self.level - 1 - - def format_usage(self, usage): - raise NotImplementedError, "subclasses must implement" - - def format_heading(self, heading): - raise NotImplementedError, "subclasses must implement" - - def _format_text(self, text): - """ - Format a paragraph of free-form text for inclusion in the - help output at the current indentation level. - """ - text_width = self.width - self.current_indent - indent = " "*self.current_indent - return textwrap.fill(text, - text_width, - initial_indent=indent, - subsequent_indent=indent) - - def format_description(self, description): - if description: - return self._format_text(description) + "\n" - else: - return "" - - def format_epilog(self, epilog): - if epilog: - return "\n" + self._format_text(epilog) + "\n" - else: - return "" - - - def expand_default(self, option): - if self.parser is None or not self.default_tag: - return option.help - - default_value = self.parser.defaults.get(option.dest) - if default_value is NO_DEFAULT or default_value is None: - default_value = self.NO_DEFAULT_VALUE - - return string.replace(option.help, self.default_tag, str(default_value)) - - def format_option(self, option): - # The help for each option consists of two parts: - # * the opt strings and metavars - # eg. ("-x", or "-fFILENAME, --file=FILENAME") - # * the user-supplied help string - # eg. ("turn on expert mode", "read data from FILENAME") - # - # If possible, we write both of these on the same line: - # -x turn on expert mode - # - # But if the opt string list is too long, we put the help - # string on a second line, indented to the same column it would - # start in if it fit on the first line. - # -fFILENAME, --file=FILENAME - # read data from FILENAME - result = [] - opts = self.option_strings[option] - opt_width = self.help_position - self.current_indent - 2 - if len(opts) > opt_width: - opts = "%*s%s\n" % (self.current_indent, "", opts) - indent_first = self.help_position - else: # start help on same line as opts - opts = "%*s%-*s " % (self.current_indent, "", opt_width, opts) - indent_first = 0 - result.append(opts) - if option.help: - help_text = self.expand_default(option) - help_lines = textwrap.wrap(help_text, self.help_width) - result.append("%*s%s\n" % (indent_first, "", help_lines[0])) - for line in help_lines[1:]: - result.append("%*s%s\n" % (self.help_position, "", line)) - elif opts[-1] != "\n": - result.append("\n") - return string.join(result, "") - - def store_option_strings(self, parser): - self.indent() - max_len = 0 - for opt in parser.option_list: - strings = self.format_option_strings(opt) - self.option_strings[opt] = strings - max_len = max(max_len, len(strings) + self.current_indent) - self.indent() - for group in parser.option_groups: - for opt in group.option_list: - strings = self.format_option_strings(opt) - self.option_strings[opt] = strings - max_len = max(max_len, len(strings) + self.current_indent) - self.dedent() - self.dedent() - self.help_position = min(max_len + 2, self.max_help_position) - self.help_width = self.width - self.help_position - - def format_option_strings(self, option): - """Return a comma-separated list of option strings & metavariables.""" - if option.takes_value(): - metavar = option.metavar or string.upper(option.dest) - short_opts = [] - for sopt in option._short_opts: - short_opts.append(self._short_opt_fmt % (sopt, metavar)) - long_opts = [] - for lopt in option._long_opts: - long_opts.append(self._long_opt_fmt % (lopt, metavar)) - else: - short_opts = option._short_opts - long_opts = option._long_opts - - if self.short_first: - opts = short_opts + long_opts - else: - opts = long_opts + short_opts - - return string.join(opts, ", ") - -class IndentedHelpFormatter (HelpFormatter): - """Format help with indented section bodies. - """ - - def __init__(self, - indent_increment=2, - max_help_position=24, - width=None, - short_first=1): - HelpFormatter.__init__( - self, indent_increment, max_help_position, width, short_first) - - def format_usage(self, usage): - return _("Usage: %s\n") % usage - - def format_heading(self, heading): - return "%*s%s:\n" % (self.current_indent, "", heading) - - -class TitledHelpFormatter (HelpFormatter): - """Format help with underlined section headers. - """ - - def __init__(self, - indent_increment=0, - max_help_position=24, - width=None, - short_first=0): - HelpFormatter.__init__ ( - self, indent_increment, max_help_position, width, short_first) - - def format_usage(self, usage): - return "%s %s\n" % (self.format_heading(_("Usage")), usage) - - def format_heading(self, heading): - return "%s\n%s\n" % (heading, "=-"[self.level] * len(heading)) - - -def _parse_num(val, type): - if string.lower(val[:2]) == "0x": # hexadecimal - radix = 16 - elif string.lower(val[:2]) == "0b": # binary - radix = 2 - val = val[2:] or "0" # have to remove "0b" prefix - elif val[:1] == "0": # octal - radix = 8 - else: # decimal - radix = 10 - - return type(val, radix) - -def _parse_int(val): - return _parse_num(val, int) - -def _parse_long(val): - return _parse_num(val, long) - -try: - int('0', 10) -except TypeError: - # Python 1.5.2 doesn't allow a radix value to be passed to int(). - _parse_int = int - -try: - long('0', 10) -except TypeError: - # Python 1.5.2 doesn't allow a radix value to be passed to long(). - _parse_long = long - -_builtin_cvt = { "int" : (_parse_int, _("integer")), - "long" : (_parse_long, _("long integer")), - "float" : (float, _("floating-point")), - "complex" : (complex, _("complex")) } - -def check_builtin(option, opt, value): - (cvt, what) = _builtin_cvt[option.type] - try: - return cvt(value) - except ValueError: - raise OptionValueError( - _("option %s: invalid %s value: %r") % (opt, what, value)) - -def check_choice(option, opt, value): - if value in option.choices: - return value - else: - choices = string.join(map(repr, option.choices), ", ") - raise OptionValueError( - _("option %s: invalid choice: %r (choose from %s)") - % (opt, value, choices)) - -# Not supplying a default is different from a default of None, -# so we need an explicit "not supplied" value. -NO_DEFAULT = ("NO", "DEFAULT") - - -class Option: - """ - Instance attributes: - _short_opts : [string] - _long_opts : [string] - - action : string - type : string - dest : string - default : any - nargs : int - const : any - choices : [string] - callback : function - callback_args : (any*) - callback_kwargs : { string : any } - help : string - metavar : string - """ - - # The list of instance attributes that may be set through - # keyword args to the constructor. - ATTRS = ['action', - 'type', - 'dest', - 'default', - 'nargs', - 'const', - 'choices', - 'callback', - 'callback_args', - 'callback_kwargs', - 'help', - 'metavar'] - - # The set of actions allowed by option parsers. Explicitly listed - # here so the constructor can validate its arguments. - ACTIONS = ("store", - "store_const", - "store_true", - "store_false", - "append", - "append_const", - "count", - "callback", - "help", - "version") - - # The set of actions that involve storing a value somewhere; - # also listed just for constructor argument validation. (If - # the action is one of these, there must be a destination.) - STORE_ACTIONS = ("store", - "store_const", - "store_true", - "store_false", - "append", - "append_const", - "count") - - # The set of actions for which it makes sense to supply a value - # type, ie. which may consume an argument from the command line. - TYPED_ACTIONS = ("store", - "append", - "callback") - - # The set of actions which *require* a value type, ie. that - # always consume an argument from the command line. - ALWAYS_TYPED_ACTIONS = ("store", - "append") - - # The set of actions which take a 'const' attribute. - CONST_ACTIONS = ("store_const", - "append_const") - - # The set of known types for option parsers. Again, listed here for - # constructor argument validation. - TYPES = ("string", "int", "long", "float", "complex", "choice") - - # Dictionary of argument checking functions, which convert and - # validate option arguments according to the option type. - # - # Signature of checking functions is: - # check(option : Option, opt : string, value : string) -> any - # where - # option is the Option instance calling the checker - # opt is the actual option seen on the command-line - # (eg. "-a", "--file") - # value is the option argument seen on the command-line - # - # The return value should be in the appropriate Python type - # for option.type -- eg. an integer if option.type == "int". - # - # If no checker is defined for a type, arguments will be - # unchecked and remain strings. - TYPE_CHECKER = { "int" : check_builtin, - "long" : check_builtin, - "float" : check_builtin, - "complex": check_builtin, - "choice" : check_choice, - } - - - # CHECK_METHODS is a list of unbound method objects; they are called - # by the constructor, in order, after all attributes are - # initialized. The list is created and filled in later, after all - # the methods are actually defined. (I just put it here because I - # like to define and document all class attributes in the same - # place.) Subclasses that add another _check_*() method should - # define their own CHECK_METHODS list that adds their check method - # to those from this class. - CHECK_METHODS = None - - - # -- Constructor/initialization methods ---------------------------- - - def __init__(self, *opts, **attrs): - # Set _short_opts, _long_opts attrs from 'opts' tuple. - # Have to be set now, in case no option strings are supplied. - self._short_opts = [] - self._long_opts = [] - opts = self._check_opt_strings(opts) - self._set_opt_strings(opts) - - # Set all other attrs (action, type, etc.) from 'attrs' dict - self._set_attrs(attrs) - - # Check all the attributes we just set. There are lots of - # complicated interdependencies, but luckily they can be farmed - # out to the _check_*() methods listed in CHECK_METHODS -- which - # could be handy for subclasses! The one thing these all share - # is that they raise OptionError if they discover a problem. - for checker in self.CHECK_METHODS: - checker(self) - - def _check_opt_strings(self, opts): - # Filter out None because early versions of Optik had exactly - # one short option and one long option, either of which - # could be None. - opts = filter(None, opts) - if not opts: - raise TypeError("at least one option string must be supplied") - return opts - - def _set_opt_strings(self, opts): - for opt in opts: - if len(opt) < 2: - raise OptionError( - "invalid option string %r: " - "must be at least two characters long" % opt, self) - elif len(opt) == 2: - if not (opt[0] == "-" and opt[1] != "-"): - raise OptionError( - "invalid short option string %r: " - "must be of the form -x, (x any non-dash char)" % opt, - self) - self._short_opts.append(opt) - else: - if not (opt[0:2] == "--" and opt[2] != "-"): - raise OptionError( - "invalid long option string %r: " - "must start with --, followed by non-dash" % opt, - self) - self._long_opts.append(opt) - - def _set_attrs(self, attrs): - for attr in self.ATTRS: - if attrs.has_key(attr): - setattr(self, attr, attrs[attr]) - del attrs[attr] - else: - if attr == 'default': - setattr(self, attr, NO_DEFAULT) - else: - setattr(self, attr, None) - if attrs: - attrs = attrs.keys() - attrs.sort() - raise OptionError( - "invalid keyword arguments: %s" % string.join(attrs, ", "), - self) - - - # -- Constructor validation methods -------------------------------- - - def _check_action(self): - if self.action is None: - self.action = "store" - elif self.action not in self.ACTIONS: - raise OptionError("invalid action: %r" % self.action, self) - - def _check_type(self): - if self.type is None: - if self.action in self.ALWAYS_TYPED_ACTIONS: - if self.choices is not None: - # The "choices" attribute implies "choice" type. - self.type = "choice" - else: - # No type given? "string" is the most sensible default. - self.type = "string" - else: - # Allow type objects or builtin type conversion functions - # (int, str, etc.) as an alternative to their names. (The - # complicated check of __builtin__ is only necessary for - # Python 2.1 and earlier, and is short-circuited by the - # first check on modern Pythons.) - import __builtin__ - if ( type(self.type) is types.TypeType or - (hasattr(self.type, "__name__") and - getattr(__builtin__, self.type.__name__, None) is self.type) ): - self.type = self.type.__name__ - - if self.type == "str": - self.type = "string" - - if self.type not in self.TYPES: - raise OptionError("invalid option type: %r" % self.type, self) - if self.action not in self.TYPED_ACTIONS: - raise OptionError( - "must not supply a type for action %r" % self.action, self) - - def _check_choice(self): - if self.type == "choice": - if self.choices is None: - raise OptionError( - "must supply a list of choices for type 'choice'", self) - elif type(self.choices) not in (types.TupleType, types.ListType): - raise OptionError( - "choices must be a list of strings ('%s' supplied)" - % string.split(str(type(self.choices)), "'")[1], self) - elif self.choices is not None: - raise OptionError( - "must not supply choices for type %r" % self.type, self) - - def _check_dest(self): - # No destination given, and we need one for this action. The - # self.type check is for callbacks that take a value. - takes_value = (self.action in self.STORE_ACTIONS or - self.type is not None) - if self.dest is None and takes_value: - - # Glean a destination from the first long option string, - # or from the first short option string if no long options. - if self._long_opts: - # eg. "--foo-bar" -> "foo_bar" - self.dest = string.replace(self._long_opts[0][2:], '-', '_') - else: - self.dest = self._short_opts[0][1] - - def _check_const(self): - if self.action not in self.CONST_ACTIONS and self.const is not None: - raise OptionError( - "'const' must not be supplied for action %r" % self.action, - self) - - def _check_nargs(self): - if self.action in self.TYPED_ACTIONS: - if self.nargs is None: - self.nargs = 1 - elif self.nargs is not None: - raise OptionError( - "'nargs' must not be supplied for action %r" % self.action, - self) - - def _check_callback(self): - if self.action == "callback": - if not callable(self.callback): - raise OptionError( - "callback not callable: %r" % self.callback, self) - if (self.callback_args is not None and - type(self.callback_args) is not types.TupleType): - raise OptionError( - "callback_args, if supplied, must be a tuple: not %r" - % self.callback_args, self) - if (self.callback_kwargs is not None and - type(self.callback_kwargs) is not types.DictType): - raise OptionError( - "callback_kwargs, if supplied, must be a dict: not %r" - % self.callback_kwargs, self) - else: - if self.callback is not None: - raise OptionError( - "callback supplied (%r) for non-callback option" - % self.callback, self) - if self.callback_args is not None: - raise OptionError( - "callback_args supplied for non-callback option", self) - if self.callback_kwargs is not None: - raise OptionError( - "callback_kwargs supplied for non-callback option", self) - - - CHECK_METHODS = [_check_action, - _check_type, - _check_choice, - _check_dest, - _check_const, - _check_nargs, - _check_callback] - - - # -- Miscellaneous methods ----------------------------------------- - - def __str__(self): - return string.join(self._short_opts + self._long_opts, "/") - - __repr__ = _repr - - def takes_value(self): - return self.type is not None - - def get_opt_string(self): - if self._long_opts: - return self._long_opts[0] - else: - return self._short_opts[0] - - - # -- Processing methods -------------------------------------------- - - def check_value(self, opt, value): - checker = self.TYPE_CHECKER.get(self.type) - if checker is None: - return value - else: - return checker(self, opt, value) - - def convert_value(self, opt, value): - if value is not None: - if self.nargs == 1: - return self.check_value(opt, value) - else: - return tuple(map(lambda v, o=opt, s=self: s.check_value(o, v), value)) - - def process(self, opt, value, values, parser): - - # First, convert the value(s) to the right type. Howl if any - # value(s) are bogus. - value = self.convert_value(opt, value) - - # And then take whatever action is expected of us. - # This is a separate method to make life easier for - # subclasses to add new actions. - return self.take_action( - self.action, self.dest, opt, value, values, parser) - - def take_action(self, action, dest, opt, value, values, parser): - if action == "store": - setattr(values, dest, value) - elif action == "store_const": - setattr(values, dest, self.const) - elif action == "store_true": - setattr(values, dest, True) - elif action == "store_false": - setattr(values, dest, False) - elif action == "append": - values.ensure_value(dest, []).append(value) - elif action == "append_const": - values.ensure_value(dest, []).append(self.const) - elif action == "count": - setattr(values, dest, values.ensure_value(dest, 0) + 1) - elif action == "callback": - args = self.callback_args or () - kwargs = self.callback_kwargs or {} - apply(self.callback, (self, opt, value, parser,) + args, kwargs) - elif action == "help": - parser.print_help() - parser.exit() - elif action == "version": - parser.print_version() - parser.exit() - else: - raise RuntimeError, "unknown action %r" % self.action - - return 1 - -# class Option - - -SUPPRESS_HELP = "SUPPRESS"+"HELP" -SUPPRESS_USAGE = "SUPPRESS"+"USAGE" - -# For compatibility with Python 2.2 -try: - True, False -except NameError: - (True, False) = (1, 0) - -try: - types.UnicodeType -except AttributeError: - def isbasestring(x): - return isinstance(x, types.StringType) -else: - def isbasestring(x): - return isinstance(x, types.StringType) or isinstance(x, types.UnicodeType) - -class Values: - - def __init__(self, defaults=None): - if defaults: - for (attr, val) in defaults.items(): - setattr(self, attr, val) - - def __str__(self): - return str(self.__dict__) - - __repr__ = _repr - - def __cmp__(self, other): - if isinstance(other, Values): - return cmp(self.__dict__, other.__dict__) - elif isinstance(other, types.DictType): - return cmp(self.__dict__, other) - else: - return -1 - - def _update_careful(self, dict): - """ - Update the option values from an arbitrary dictionary, but only - use keys from dict that already have a corresponding attribute - in self. Any keys in dict without a corresponding attribute - are silently ignored. - """ - for attr in dir(self): - if dict.has_key(attr): - dval = dict[attr] - if dval is not None: - setattr(self, attr, dval) - - def _update_loose(self, dict): - """ - Update the option values from an arbitrary dictionary, - using all keys from the dictionary regardless of whether - they have a corresponding attribute in self or not. - """ - self.__dict__.update(dict) - - def _update(self, dict, mode): - if mode == "careful": - self._update_careful(dict) - elif mode == "loose": - self._update_loose(dict) - else: - raise ValueError, "invalid update mode: %r" % mode - - def read_module(self, modname, mode="careful"): - __import__(modname) - mod = sys.modules[modname] - self._update(vars(mod), mode) - - def read_file(self, filename, mode="careful"): - vars = {} - execfile(filename, vars) - self._update(vars, mode) - - def ensure_value(self, attr, value): - if not hasattr(self, attr) or getattr(self, attr) is None: - setattr(self, attr, value) - return getattr(self, attr) - - -class OptionContainer: - - """ - Abstract base class. - - Class attributes: - standard_option_list : [Option] - list of standard options that will be accepted by all instances - of this parser class (intended to be overridden by subclasses). - - Instance attributes: - option_list : [Option] - the list of Option objects contained by this OptionContainer - _short_opt : { string : Option } - dictionary mapping short option strings, eg. "-f" or "-X", - to the Option instances that implement them. If an Option - has multiple short option strings, it will appears in this - dictionary multiple times. [1] - _long_opt : { string : Option } - dictionary mapping long option strings, eg. "--file" or - "--exclude", to the Option instances that implement them. - Again, a given Option can occur multiple times in this - dictionary. [1] - defaults : { string : any } - dictionary mapping option destination names to default - values for each destination [1] - - [1] These mappings are common to (shared by) all components of the - controlling OptionParser, where they are initially created. - - """ - - def __init__(self, option_class, conflict_handler, description): - # Initialize the option list and related data structures. - # This method must be provided by subclasses, and it must - # initialize at least the following instance attributes: - # option_list, _short_opt, _long_opt, defaults. - self._create_option_list() - - self.option_class = option_class - self.set_conflict_handler(conflict_handler) - self.set_description(description) - - def _create_option_mappings(self): - # For use by OptionParser constructor -- create the master - # option mappings used by this OptionParser and all - # OptionGroups that it owns. - self._short_opt = {} # single letter -> Option instance - self._long_opt = {} # long option -> Option instance - self.defaults = {} # maps option dest -> default value - - - def _share_option_mappings(self, parser): - # For use by OptionGroup constructor -- use shared option - # mappings from the OptionParser that owns this OptionGroup. - self._short_opt = parser._short_opt - self._long_opt = parser._long_opt - self.defaults = parser.defaults - - def set_conflict_handler(self, handler): - if handler not in ("error", "resolve"): - raise ValueError, "invalid conflict_resolution value %r" % handler - self.conflict_handler = handler - - def set_description(self, description): - self.description = description - - def get_description(self): - return self.description - - - def destroy(self): - """see OptionParser.destroy().""" - del self._short_opt - del self._long_opt - del self.defaults - - - # -- Option-adding methods ----------------------------------------- - - def _check_conflict(self, option): - conflict_opts = [] - for opt in option._short_opts: - if self._short_opt.has_key(opt): - conflict_opts.append((opt, self._short_opt[opt])) - for opt in option._long_opts: - if self._long_opt.has_key(opt): - conflict_opts.append((opt, self._long_opt[opt])) - - if conflict_opts: - handler = self.conflict_handler - if handler == "error": - raise OptionConflictError( - "conflicting option string(s): %s" - % string.join(map(lambda co: co[0], conflict_opts), ", "), - option) - elif handler == "resolve": - for (opt, c_option) in conflict_opts: - if opt[:2] == "--": - c_option._long_opts.remove(opt) - del self._long_opt[opt] - else: - c_option._short_opts.remove(opt) - del self._short_opt[opt] - if not (c_option._short_opts or c_option._long_opts): - c_option.container.option_list.remove(c_option) - - def add_option(self, *args, **kwargs): - """add_option(Option) - add_option(opt_str, ..., kwarg=val, ...) - """ - if type(args[0]) is types.StringType: - option = apply(self.option_class, args, kwargs) - elif len(args) == 1 and not kwargs: - option = args[0] - if not isinstance(option, Option): - raise TypeError, "not an Option instance: %r" % option - else: - raise TypeError, "invalid arguments" - - self._check_conflict(option) - - self.option_list.append(option) - option.container = self - for opt in option._short_opts: - self._short_opt[opt] = option - for opt in option._long_opts: - self._long_opt[opt] = option - - if option.dest is not None: # option has a dest, we need a default - if option.default is not NO_DEFAULT: - self.defaults[option.dest] = option.default - elif not self.defaults.has_key(option.dest): - self.defaults[option.dest] = None - - return option - - def add_options(self, option_list): - for option in option_list: - self.add_option(option) - - # -- Option query/removal methods ---------------------------------- - - def get_option(self, opt_str): - return (self._short_opt.get(opt_str) or - self._long_opt.get(opt_str)) - - def has_option(self, opt_str): - return (self._short_opt.has_key(opt_str) or - self._long_opt.has_key(opt_str)) - - def remove_option(self, opt_str): - option = self._short_opt.get(opt_str) - if option is None: - option = self._long_opt.get(opt_str) - if option is None: - raise ValueError("no such option %r" % opt_str) - - for opt in option._short_opts: - del self._short_opt[opt] - for opt in option._long_opts: - del self._long_opt[opt] - option.container.option_list.remove(option) - - - # -- Help-formatting methods --------------------------------------- - - def format_option_help(self, formatter): - if not self.option_list: - return "" - result = [] - for option in self.option_list: - if not option.help is SUPPRESS_HELP: - result.append(formatter.format_option(option)) - return string.join(result, "") - - def format_description(self, formatter): - return formatter.format_description(self.get_description()) - - def format_help(self, formatter): - result = [] - if self.description: - result.append(self.format_description(formatter)) - if self.option_list: - result.append(self.format_option_help(formatter)) - return string.join(result, "\n") - - -class OptionGroup (OptionContainer): - - def __init__(self, parser, title, description=None): - self.parser = parser - OptionContainer.__init__( - self, parser.option_class, parser.conflict_handler, description) - self.title = title - - def _create_option_list(self): - self.option_list = [] - self._share_option_mappings(self.parser) - - def set_title(self, title): - self.title = title - - def destroy(self): - """see OptionParser.destroy().""" - OptionContainer.destroy(self) - del self.option_list - - # -- Help-formatting methods --------------------------------------- - - def format_help(self, formatter): - result = formatter.format_heading(self.title) - formatter.indent() - result = result + OptionContainer.format_help(self, formatter) - formatter.dedent() - return result - - -class OptionParser (OptionContainer): - - """ - Class attributes: - standard_option_list : [Option] - list of standard options that will be accepted by all instances - of this parser class (intended to be overridden by subclasses). - - Instance attributes: - usage : string - a usage string for your program. Before it is displayed - to the user, "%prog" will be expanded to the name of - your program (self.prog or os.path.basename(sys.argv[0])). - prog : string - the name of the current program (to override - os.path.basename(sys.argv[0])). - epilog : string - paragraph of help text to print after option help - - option_groups : [OptionGroup] - list of option groups in this parser (option groups are - irrelevant for parsing the command-line, but very useful - for generating help) - - allow_interspersed_args : bool = true - if true, positional arguments may be interspersed with options. - Assuming -a and -b each take a single argument, the command-line - -ablah foo bar -bboo baz - will be interpreted the same as - -ablah -bboo -- foo bar baz - If this flag were false, that command line would be interpreted as - -ablah -- foo bar -bboo baz - -- ie. we stop processing options as soon as we see the first - non-option argument. (This is the tradition followed by - Python's getopt module, Perl's Getopt::Std, and other argument- - parsing libraries, but it is generally annoying to users.) - - process_default_values : bool = true - if true, option default values are processed similarly to option - values from the command line: that is, they are passed to the - type-checking function for the option's type (as long as the - default value is a string). (This really only matters if you - have defined custom types; see SF bug #955889.) Set it to false - to restore the behaviour of Optik 1.4.1 and earlier. - - rargs : [string] - the argument list currently being parsed. Only set when - parse_args() is active, and continually trimmed down as - we consume arguments. Mainly there for the benefit of - callback options. - largs : [string] - the list of leftover arguments that we have skipped while - parsing options. If allow_interspersed_args is false, this - list is always empty. - values : Values - the set of option values currently being accumulated. Only - set when parse_args() is active. Also mainly for callbacks. - - Because of the 'rargs', 'largs', and 'values' attributes, - OptionParser is not thread-safe. If, for some perverse reason, you - need to parse command-line arguments simultaneously in different - threads, use different OptionParser instances. - - """ - - standard_option_list = [] - - def __init__(self, - usage=None, - option_list=None, - option_class=Option, - version=None, - conflict_handler="error", - description=None, - formatter=None, - add_help_option=True, - prog=None, - epilog=None): - OptionContainer.__init__( - self, option_class, conflict_handler, description) - self.set_usage(usage) - self.prog = prog - self.version = version - self.allow_interspersed_args = True - self.process_default_values = True - if formatter is None: - formatter = IndentedHelpFormatter() - self.formatter = formatter - self.formatter.set_parser(self) - self.epilog = epilog - - # Populate the option list; initial sources are the - # standard_option_list class attribute, the 'option_list' - # argument, and (if applicable) the _add_version_option() and - # _add_help_option() methods. - self._populate_option_list(option_list, - add_help=add_help_option) - - self._init_parsing_state() - - - def destroy(self): - """ - Declare that you are done with this OptionParser. This cleans up - reference cycles so the OptionParser (and all objects referenced by - it) can be garbage-collected promptly. After calling destroy(), the - OptionParser is unusable. - """ - OptionContainer.destroy(self) - for group in self.option_groups: - group.destroy() - del self.option_list - del self.option_groups - del self.formatter - - - # -- Private methods ----------------------------------------------- - # (used by our or OptionContainer's constructor) - - def _create_option_list(self): - self.option_list = [] - self.option_groups = [] - self._create_option_mappings() - - def _add_help_option(self): - self.add_option("-h", "--help", - action="help", - help=_("show this help message and exit")) - - def _add_version_option(self): - self.add_option("--version", - action="version", - help=_("show program's version number and exit")) - - def _populate_option_list(self, option_list, add_help=True): - if self.standard_option_list: - self.add_options(self.standard_option_list) - if option_list: - self.add_options(option_list) - if self.version: - self._add_version_option() - if add_help: - self._add_help_option() - - def _init_parsing_state(self): - # These are set in parse_args() for the convenience of callbacks. - self.rargs = None - self.largs = None - self.values = None - - - # -- Simple modifier methods --------------------------------------- - - def set_usage(self, usage): - if usage is None: - self.usage = _("%prog [options]") - elif usage is SUPPRESS_USAGE: - self.usage = None - # For backwards compatibility with Optik 1.3 and earlier. - elif string.lower(usage)[:7] == "usage: ": - self.usage = usage[7:] - else: - self.usage = usage - - def enable_interspersed_args(self): - self.allow_interspersed_args = True - - def disable_interspersed_args(self): - self.allow_interspersed_args = False - - def set_process_default_values(self, process): - self.process_default_values = process - - def set_default(self, dest, value): - self.defaults[dest] = value - - def set_defaults(self, **kwargs): - self.defaults.update(kwargs) - - def _get_all_options(self): - options = self.option_list[:] - for group in self.option_groups: - options.extend(group.option_list) - return options - - def get_default_values(self): - if not self.process_default_values: - # Old, pre-Optik 1.5 behaviour. - return Values(self.defaults) - - defaults = self.defaults.copy() - for option in self._get_all_options(): - default = defaults.get(option.dest) - if isbasestring(default): - opt_str = option.get_opt_string() - defaults[option.dest] = option.check_value(opt_str, default) - - return Values(defaults) - - - # -- OptionGroup methods ------------------------------------------- - - def add_option_group(self, *args, **kwargs): - # XXX lots of overlap with OptionContainer.add_option() - if type(args[0]) is types.StringType: - group = apply(OptionGroup, (self,) + args, kwargs) - elif len(args) == 1 and not kwargs: - group = args[0] - if not isinstance(group, OptionGroup): - raise TypeError, "not an OptionGroup instance: %r" % group - if group.parser is not self: - raise ValueError, "invalid OptionGroup (wrong parser)" - else: - raise TypeError, "invalid arguments" - - self.option_groups.append(group) - return group - - def get_option_group(self, opt_str): - option = (self._short_opt.get(opt_str) or - self._long_opt.get(opt_str)) - if option and option.container is not self: - return option.container - return None - - - # -- Option-parsing methods ---------------------------------------- - - def _get_args(self, args): - if args is None: - return sys.argv[1:] - else: - return args[:] # don't modify caller's list - - def parse_args(self, args=None, values=None): - """ - parse_args(args : [string] = sys.argv[1:], - values : Values = None) - -> (values : Values, args : [string]) - - Parse the command-line options found in 'args' (default: - sys.argv[1:]). Any errors result in a call to 'error()', which - by default prints the usage message to stderr and calls - sys.exit() with an error message. On success returns a pair - (values, args) where 'values' is an Values instance (with all - your option values) and 'args' is the list of arguments left - over after parsing options. - """ - rargs = self._get_args(args) - if values is None: - values = self.get_default_values() - - # Store the halves of the argument list as attributes for the - # convenience of callbacks: - # rargs - # the rest of the command-line (the "r" stands for - # "remaining" or "right-hand") - # largs - # the leftover arguments -- ie. what's left after removing - # options and their arguments (the "l" stands for "leftover" - # or "left-hand") - self.rargs = rargs - self.largs = largs = [] - self.values = values - - try: - stop = self._process_args(largs, rargs, values) - except (BadOptionError, OptionValueError), err: - self.error(str(err)) - - args = largs + rargs - return self.check_values(values, args) - - def check_values(self, values, args): - """ - check_values(values : Values, args : [string]) - -> (values : Values, args : [string]) - - Check that the supplied option values and leftover arguments are - valid. Returns the option values and leftover arguments - (possibly adjusted, possibly completely new -- whatever you - like). Default implementation just returns the passed-in - values; subclasses may override as desired. - """ - return (values, args) - - def _process_args(self, largs, rargs, values): - """_process_args(largs : [string], - rargs : [string], - values : Values) - - Process command-line arguments and populate 'values', consuming - options and arguments from 'rargs'. If 'allow_interspersed_args' is - false, stop at the first non-option argument. If true, accumulate any - interspersed non-option arguments in 'largs'. - """ - while rargs: - arg = rargs[0] - # We handle bare "--" explicitly, and bare "-" is handled by the - # standard arg handler since the short arg case ensures that the - # len of the opt string is greater than 1. - if arg == "--": - del rargs[0] - return - elif arg[0:2] == "--": - # process a single long option (possibly with value(s)) - self._process_long_opt(rargs, values) - elif arg[:1] == "-" and len(arg) > 1: - # process a cluster of short options (possibly with - # value(s) for the last one only) - self._process_short_opts(rargs, values) - elif self.allow_interspersed_args: - largs.append(arg) - del rargs[0] - else: - return # stop now, leave this arg in rargs - - # Say this is the original argument list: - # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] - # ^ - # (we are about to process arg(i)). - # - # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of - # [arg0, ..., arg(i-1)] (any options and their arguments will have - # been removed from largs). - # - # The while loop will usually consume 1 or more arguments per pass. - # If it consumes 1 (eg. arg is an option that takes no arguments), - # then after _process_arg() is done the situation is: - # - # largs = subset of [arg0, ..., arg(i)] - # rargs = [arg(i+1), ..., arg(N-1)] - # - # If allow_interspersed_args is false, largs will always be - # *empty* -- still a subset of [arg0, ..., arg(i-1)], but - # not a very interesting subset! - - def _match_long_opt(self, opt): - """_match_long_opt(opt : string) -> string - - Determine which long option string 'opt' matches, ie. which one - it is an unambiguous abbrevation for. Raises BadOptionError if - 'opt' doesn't unambiguously match any long option string. - """ - return _match_abbrev(opt, self._long_opt) - - def _process_long_opt(self, rargs, values): - arg = rargs.pop(0) - - # Value explicitly attached to arg? Pretend it's the next - # argument. - if "=" in arg: - (opt, next_arg) = string.split(arg, "=", 1) - rargs.insert(0, next_arg) - had_explicit_value = True - else: - opt = arg - had_explicit_value = False - - opt = self._match_long_opt(opt) - option = self._long_opt[opt] - if option.takes_value(): - nargs = option.nargs - if len(rargs) < nargs: - if nargs == 1: - self.error(_("%s option requires an argument") % opt) - else: - self.error(_("%s option requires %d arguments") - % (opt, nargs)) - elif nargs == 1: - value = rargs.pop(0) - else: - value = tuple(rargs[0:nargs]) - del rargs[0:nargs] - - elif had_explicit_value: - self.error(_("%s option does not take a value") % opt) - - else: - value = None - - option.process(opt, value, values, self) - - def _process_short_opts(self, rargs, values): - arg = rargs.pop(0) - stop = False - i = 1 - for ch in arg[1:]: - opt = "-" + ch - option = self._short_opt.get(opt) - i = i + 1 # we have consumed a character - - if not option: - raise BadOptionError(opt) - if option.takes_value(): - # Any characters left in arg? Pretend they're the - # next arg, and stop consuming characters of arg. - if i < len(arg): - rargs.insert(0, arg[i:]) - stop = True - - nargs = option.nargs - if len(rargs) < nargs: - if nargs == 1: - self.error(_("%s option requires an argument") % opt) - else: - self.error(_("%s option requires %d arguments") - % (opt, nargs)) - elif nargs == 1: - value = rargs.pop(0) - else: - value = tuple(rargs[0:nargs]) - del rargs[0:nargs] - - else: # option doesn't take a value - value = None - - option.process(opt, value, values, self) - - if stop: - break - - - # -- Feedback methods ---------------------------------------------- - - def get_prog_name(self): - if self.prog is None: - return os.path.basename(sys.argv[0]) - else: - return self.prog - - def expand_prog_name(self, s): - return string.replace(s, "%prog", self.get_prog_name()) - - def get_description(self): - return self.expand_prog_name(self.description) - - def exit(self, status=0, msg=None): - if msg: - sys.stderr.write(msg) - sys.exit(status) - - def error(self, msg): - """error(msg : string) - - Print a usage message incorporating 'msg' to stderr and exit. - If you override this in a subclass, it should not return -- it - should either exit or raise an exception. - """ - self.print_usage(sys.stderr) - self.exit(2, "%s: error: %s\n" % (self.get_prog_name(), msg)) - - def get_usage(self): - if self.usage: - return self.formatter.format_usage( - self.expand_prog_name(self.usage)) - else: - return "" - - def print_usage(self, file=None): - """print_usage(file : file = stdout) - - Print the usage message for the current program (self.usage) to - 'file' (default stdout). Any occurence of the string "%prog" in - self.usage is replaced with the name of the current program - (basename of sys.argv[0]). Does nothing if self.usage is empty - or not defined. - """ - if self.usage: - file.write(self.get_usage() + '\n') - - def get_version(self): - if self.version: - return self.expand_prog_name(self.version) - else: - return "" - - def print_version(self, file=None): - """print_version(file : file = stdout) - - Print the version message for this program (self.version) to - 'file' (default stdout). As with print_usage(), any occurence - of "%prog" in self.version is replaced by the current program's - name. Does nothing if self.version is empty or undefined. - """ - if self.version: - file.write(self.get_version() + '\n') - - def format_option_help(self, formatter=None): - if formatter is None: - formatter = self.formatter - formatter.store_option_strings(self) - result = [] - result.append(formatter.format_heading(_("Options"))) - formatter.indent() - if self.option_list: - result.append(OptionContainer.format_option_help(self, formatter)) - result.append("\n") - for group in self.option_groups: - result.append(group.format_help(formatter)) - result.append("\n") - formatter.dedent() - # Drop the last "\n", or the header if no options or option groups: - return string.join(result[:-1], "") - - def format_epilog(self, formatter): - return formatter.format_epilog(self.epilog) - - def format_help(self, formatter=None): - if formatter is None: - formatter = self.formatter - result = [] - if self.usage: - result.append(self.get_usage() + "\n") - if self.description: - result.append(self.format_description(formatter) + "\n") - result.append(self.format_option_help(formatter)) - result.append(self.format_epilog(formatter)) - return string.join(result, "") - - # used by test suite - def _get_encoding(self, file): - encoding = getattr(file, "encoding", None) - if not encoding: - encoding = sys.getdefaultencoding() - return encoding - - def print_help(self, file=None): - """print_help(file : file = stdout) - - Print an extended help message, listing all options and any - help text provided with them, to 'file' (default stdout). - """ - if file is None: - file = sys.stdout - encoding = self._get_encoding(file) - file.write(encode_wrapper(self.format_help(), encoding, "replace")) - -# class OptionParser - - -def _match_abbrev(s, wordmap): - """_match_abbrev(s : string, wordmap : {string : Option}) -> string - - Return the string key in 'wordmap' for which 's' is an unambiguous - abbreviation. If 's' is found to be ambiguous or doesn't match any of - 'words', raise BadOptionError. - """ - # Is there an exact match? - if wordmap.has_key(s): - return s - else: - # Isolate all words with s as a prefix. - possibilities = filter(lambda w, s=s: w[:len(s)] == s, wordmap.keys()) - # No exact match, so there had better be just one possibility. - if len(possibilities) == 1: - return possibilities[0] - elif not possibilities: - raise BadOptionError(s) - else: - # More than one possible completion: ambiguous prefix. - possibilities.sort() - raise AmbiguousOptionError(s, possibilities) - - -# Some day, there might be many Option classes. As of Optik 1.3, the -# preferred way to instantiate Options is indirectly, via make_option(), -# which will become a factory function when there are many Option -# classes. -make_option = Option - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/compat/_scons_sets.py b/3rdParty/SCons/scons-local/SCons/compat/_scons_sets.py deleted file mode 100644 index 12dbead..0000000 --- a/3rdParty/SCons/scons-local/SCons/compat/_scons_sets.py +++ /dev/null @@ -1,583 +0,0 @@ -"""Classes to represent arbitrary sets (including sets of sets). - -This module implements sets using dictionaries whose values are -ignored. The usual operations (union, intersection, deletion, etc.) -are provided as both methods and operators. - -Important: sets are not sequences! While they support 'x in s', -'len(s)', and 'for x in s', none of those operations are unique for -sequences; for example, mappings support all three as well. The -characteristic operation for sequences is subscripting with small -integers: s[i], for i in range(len(s)). Sets don't support -subscripting at all. Also, sequences allow multiple occurrences and -their elements have a definite order; sets on the other hand don't -record multiple occurrences and don't remember the order of element -insertion (which is why they don't support s[i]). - -The following classes are provided: - -BaseSet -- All the operations common to both mutable and immutable - sets. This is an abstract class, not meant to be directly - instantiated. - -Set -- Mutable sets, subclass of BaseSet; not hashable. - -ImmutableSet -- Immutable sets, subclass of BaseSet; hashable. - An iterable argument is mandatory to create an ImmutableSet. - -_TemporarilyImmutableSet -- A wrapper around a Set, hashable, - giving the same hash value as the immutable set equivalent - would have. Do not use this class directly. - -Only hashable objects can be added to a Set. In particular, you cannot -really add a Set as an element to another Set; if you try, what is -actually added is an ImmutableSet built from it (it compares equal to -the one you tried adding). - -When you ask if `x in y' where x is a Set and y is a Set or -ImmutableSet, x is wrapped into a _TemporarilyImmutableSet z, and -what's tested is actually `z in y'. - -""" - -# Code history: -# -# - Greg V. Wilson wrote the first version, using a different approach -# to the mutable/immutable problem, and inheriting from dict. -# -# - Alex Martelli modified Greg's version to implement the current -# Set/ImmutableSet approach, and make the data an attribute. -# -# - Guido van Rossum rewrote much of the code, made some API changes, -# and cleaned up the docstrings. -# -# - Raymond Hettinger added a number of speedups and other -# improvements. - -from __future__ import generators -try: - from itertools import ifilter, ifilterfalse -except ImportError: - # Code to make the module run under Py2.2 - def ifilter(predicate, iterable): - if predicate is None: - def predicate(x): - return x - for x in iterable: - if predicate(x): - yield x - def ifilterfalse(predicate, iterable): - if predicate is None: - def predicate(x): - return x - for x in iterable: - if not predicate(x): - yield x - try: - True, False - except NameError: - True, False = (0==0, 0!=0) - -__all__ = ['BaseSet', 'Set', 'ImmutableSet'] - -class BaseSet(object): - """Common base class for mutable and immutable sets.""" - - __slots__ = ['_data'] - - # Constructor - - def __init__(self): - """This is an abstract class.""" - # Don't call this from a concrete subclass! - if self.__class__ is BaseSet: - raise TypeError, ("BaseSet is an abstract class. " - "Use Set or ImmutableSet.") - - # Standard protocols: __len__, __repr__, __str__, __iter__ - - def __len__(self): - """Return the number of elements of a set.""" - return len(self._data) - - def __repr__(self): - """Return string representation of a set. - - This looks like 'Set([<list of elements>])'. - """ - return self._repr() - - # __str__ is the same as __repr__ - __str__ = __repr__ - - def _repr(self, sorted=False): - elements = self._data.keys() - if sorted: - elements.sort() - return '%s(%r)' % (self.__class__.__name__, elements) - - def __iter__(self): - """Return an iterator over the elements or a set. - - This is the keys iterator for the underlying dict. - """ - return self._data.iterkeys() - - # Three-way comparison is not supported. However, because __eq__ is - # tried before __cmp__, if Set x == Set y, x.__eq__(y) returns True and - # then cmp(x, y) returns 0 (Python doesn't actually call __cmp__ in this - # case). - - def __cmp__(self, other): - raise TypeError, "can't compare sets using cmp()" - - # Equality comparisons using the underlying dicts. Mixed-type comparisons - # are allowed here, where Set == z for non-Set z always returns False, - # and Set != z always True. This allows expressions like "x in y" to - # give the expected result when y is a sequence of mixed types, not - # raising a pointless TypeError just because y contains a Set, or x is - # a Set and y contain's a non-set ("in" invokes only __eq__). - # Subtle: it would be nicer if __eq__ and __ne__ could return - # NotImplemented instead of True or False. Then the other comparand - # would get a chance to determine the result, and if the other comparand - # also returned NotImplemented then it would fall back to object address - # comparison (which would always return False for __eq__ and always - # True for __ne__). However, that doesn't work, because this type - # *also* implements __cmp__: if, e.g., __eq__ returns NotImplemented, - # Python tries __cmp__ next, and the __cmp__ here then raises TypeError. - - def __eq__(self, other): - if isinstance(other, BaseSet): - return self._data == other._data - else: - return False - - def __ne__(self, other): - if isinstance(other, BaseSet): - return self._data != other._data - else: - return True - - # Copying operations - - def copy(self): - """Return a shallow copy of a set.""" - result = self.__class__() - result._data.update(self._data) - return result - - __copy__ = copy # For the copy module - - def __deepcopy__(self, memo): - """Return a deep copy of a set; used by copy module.""" - # This pre-creates the result and inserts it in the memo - # early, in case the deep copy recurses into another reference - # to this same set. A set can't be an element of itself, but - # it can certainly contain an object that has a reference to - # itself. - from copy import deepcopy - result = self.__class__() - memo[id(self)] = result - data = result._data - value = True - for elt in self: - data[deepcopy(elt, memo)] = value - return result - - # Standard set operations: union, intersection, both differences. - # Each has an operator version (e.g. __or__, invoked with |) and a - # method version (e.g. union). - # Subtle: Each pair requires distinct code so that the outcome is - # correct when the type of other isn't suitable. For example, if - # we did "union = __or__" instead, then Set().union(3) would return - # NotImplemented instead of raising TypeError (albeit that *why* it - # raises TypeError as-is is also a bit subtle). - - def __or__(self, other): - """Return the union of two sets as a new set. - - (I.e. all elements that are in either set.) - """ - if not isinstance(other, BaseSet): - return NotImplemented - return self.union(other) - - def union(self, other): - """Return the union of two sets as a new set. - - (I.e. all elements that are in either set.) - """ - result = self.__class__(self) - result._update(other) - return result - - def __and__(self, other): - """Return the intersection of two sets as a new set. - - (I.e. all elements that are in both sets.) - """ - if not isinstance(other, BaseSet): - return NotImplemented - return self.intersection(other) - - def intersection(self, other): - """Return the intersection of two sets as a new set. - - (I.e. all elements that are in both sets.) - """ - if not isinstance(other, BaseSet): - other = Set(other) - if len(self) <= len(other): - little, big = self, other - else: - little, big = other, self - common = ifilter(big._data.has_key, little) - return self.__class__(common) - - def __xor__(self, other): - """Return the symmetric difference of two sets as a new set. - - (I.e. all elements that are in exactly one of the sets.) - """ - if not isinstance(other, BaseSet): - return NotImplemented - return self.symmetric_difference(other) - - def symmetric_difference(self, other): - """Return the symmetric difference of two sets as a new set. - - (I.e. all elements that are in exactly one of the sets.) - """ - result = self.__class__() - data = result._data - value = True - selfdata = self._data - try: - otherdata = other._data - except AttributeError: - otherdata = Set(other)._data - for elt in ifilterfalse(otherdata.has_key, selfdata): - data[elt] = value - for elt in ifilterfalse(selfdata.has_key, otherdata): - data[elt] = value - return result - - def __sub__(self, other): - """Return the difference of two sets as a new Set. - - (I.e. all elements that are in this set and not in the other.) - """ - if not isinstance(other, BaseSet): - return NotImplemented - return self.difference(other) - - def difference(self, other): - """Return the difference of two sets as a new Set. - - (I.e. all elements that are in this set and not in the other.) - """ - result = self.__class__() - data = result._data - try: - otherdata = other._data - except AttributeError: - otherdata = Set(other)._data - value = True - for elt in ifilterfalse(otherdata.has_key, self): - data[elt] = value - return result - - # Membership test - - def __contains__(self, element): - """Report whether an element is a member of a set. - - (Called in response to the expression `element in self'.) - """ - try: - return element in self._data - except TypeError: - transform = getattr(element, "__as_temporarily_immutable__", None) - if transform is None: - raise # re-raise the TypeError exception we caught - return transform() in self._data - - # Subset and superset test - - def issubset(self, other): - """Report whether another set contains this set.""" - self._binary_sanity_check(other) - if len(self) > len(other): # Fast check for obvious cases - return False - for elt in ifilterfalse(other._data.has_key, self): - return False - return True - - def issuperset(self, other): - """Report whether this set contains another set.""" - self._binary_sanity_check(other) - if len(self) < len(other): # Fast check for obvious cases - return False - for elt in ifilterfalse(self._data.has_key, other): - return False - return True - - # Inequality comparisons using the is-subset relation. - __le__ = issubset - __ge__ = issuperset - - def __lt__(self, other): - self._binary_sanity_check(other) - return len(self) < len(other) and self.issubset(other) - - def __gt__(self, other): - self._binary_sanity_check(other) - return len(self) > len(other) and self.issuperset(other) - - # Assorted helpers - - def _binary_sanity_check(self, other): - # Check that the other argument to a binary operation is also - # a set, raising a TypeError otherwise. - if not isinstance(other, BaseSet): - raise TypeError, "Binary operation only permitted between sets" - - def _compute_hash(self): - # Calculate hash code for a set by xor'ing the hash codes of - # the elements. This ensures that the hash code does not depend - # on the order in which elements are added to the set. This is - # not called __hash__ because a BaseSet should not be hashable; - # only an ImmutableSet is hashable. - result = 0 - for elt in self: - result ^= hash(elt) - return result - - def _update(self, iterable): - # The main loop for update() and the subclass __init__() methods. - data = self._data - - # Use the fast update() method when a dictionary is available. - if isinstance(iterable, BaseSet): - data.update(iterable._data) - return - - value = True - - if type(iterable) in (list, tuple, xrange): - # Optimized: we know that __iter__() and next() can't - # raise TypeError, so we can move 'try:' out of the loop. - it = iter(iterable) - while True: - try: - for element in it: - data[element] = value - return - except TypeError: - transform = getattr(element, "__as_immutable__", None) - if transform is None: - raise # re-raise the TypeError exception we caught - data[transform()] = value - else: - # Safe: only catch TypeError where intended - for element in iterable: - try: - data[element] = value - except TypeError: - transform = getattr(element, "__as_immutable__", None) - if transform is None: - raise # re-raise the TypeError exception we caught - data[transform()] = value - - -class ImmutableSet(BaseSet): - """Immutable set class.""" - - __slots__ = ['_hashcode'] - - # BaseSet + hashing - - def __init__(self, iterable=None): - """Construct an immutable set from an optional iterable.""" - self._hashcode = None - self._data = {} - if iterable is not None: - self._update(iterable) - - def __hash__(self): - if self._hashcode is None: - self._hashcode = self._compute_hash() - return self._hashcode - - def __getstate__(self): - return self._data, self._hashcode - - def __setstate__(self, state): - self._data, self._hashcode = state - -class Set(BaseSet): - """ Mutable set class.""" - - __slots__ = [] - - # BaseSet + operations requiring mutability; no hashing - - def __init__(self, iterable=None): - """Construct a set from an optional iterable.""" - self._data = {} - if iterable is not None: - self._update(iterable) - - def __getstate__(self): - # getstate's results are ignored if it is not - return self._data, - - def __setstate__(self, data): - self._data, = data - - def __hash__(self): - """A Set cannot be hashed.""" - # We inherit object.__hash__, so we must deny this explicitly - raise TypeError, "Can't hash a Set, only an ImmutableSet." - - # In-place union, intersection, differences. - # Subtle: The xyz_update() functions deliberately return None, - # as do all mutating operations on built-in container types. - # The __xyz__ spellings have to return self, though. - - def __ior__(self, other): - """Update a set with the union of itself and another.""" - self._binary_sanity_check(other) - self._data.update(other._data) - return self - - def union_update(self, other): - """Update a set with the union of itself and another.""" - self._update(other) - - def __iand__(self, other): - """Update a set with the intersection of itself and another.""" - self._binary_sanity_check(other) - self._data = (self & other)._data - return self - - def intersection_update(self, other): - """Update a set with the intersection of itself and another.""" - if isinstance(other, BaseSet): - self &= other - else: - self._data = (self.intersection(other))._data - - def __ixor__(self, other): - """Update a set with the symmetric difference of itself and another.""" - self._binary_sanity_check(other) - self.symmetric_difference_update(other) - return self - - def symmetric_difference_update(self, other): - """Update a set with the symmetric difference of itself and another.""" - data = self._data - value = True - if not isinstance(other, BaseSet): - other = Set(other) - if self is other: - self.clear() - for elt in other: - if elt in data: - del data[elt] - else: - data[elt] = value - - def __isub__(self, other): - """Remove all elements of another set from this set.""" - self._binary_sanity_check(other) - self.difference_update(other) - return self - - def difference_update(self, other): - """Remove all elements of another set from this set.""" - data = self._data - if not isinstance(other, BaseSet): - other = Set(other) - if self is other: - self.clear() - for elt in ifilter(data.has_key, other): - del data[elt] - - # Python dict-like mass mutations: update, clear - - def update(self, iterable): - """Add all values from an iterable (such as a list or file).""" - self._update(iterable) - - def clear(self): - """Remove all elements from this set.""" - self._data.clear() - - # Single-element mutations: add, remove, discard - - def add(self, element): - """Add an element to a set. - - This has no effect if the element is already present. - """ - try: - self._data[element] = True - except TypeError: - transform = getattr(element, "__as_immutable__", None) - if transform is None: - raise # re-raise the TypeError exception we caught - self._data[transform()] = True - - def remove(self, element): - """Remove an element from a set; it must be a member. - - If the element is not a member, raise a KeyError. - """ - try: - del self._data[element] - except TypeError: - transform = getattr(element, "__as_temporarily_immutable__", None) - if transform is None: - raise # re-raise the TypeError exception we caught - del self._data[transform()] - - def discard(self, element): - """Remove an element from a set if it is a member. - - If the element is not a member, do nothing. - """ - try: - self.remove(element) - except KeyError: - pass - - def pop(self): - """Remove and return an arbitrary set element.""" - return self._data.popitem()[0] - - def __as_immutable__(self): - # Return a copy of self as an immutable set - return ImmutableSet(self) - - def __as_temporarily_immutable__(self): - # Return self wrapped in a temporarily immutable set - return _TemporarilyImmutableSet(self) - - -class _TemporarilyImmutableSet(BaseSet): - # Wrap a mutable set as if it was temporarily immutable. - # This only supplies hashing and equality comparisons. - - def __init__(self, set): - self._set = set - self._data = set._data # Needed by ImmutableSet.__eq__() - - def __hash__(self): - return self._set._compute_hash() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/compat/_scons_sets15.py b/3rdParty/SCons/scons-local/SCons/compat/_scons_sets15.py deleted file mode 100644 index bafa009..0000000 --- a/3rdParty/SCons/scons-local/SCons/compat/_scons_sets15.py +++ /dev/null @@ -1,176 +0,0 @@ -# -# A Set class that works all the way back to Python 1.5. From: -# -# Python Cookbook: Yet another Set class for Python -# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/106469 -# Goncalo Rodriques -# -# This is a pure Pythonic implementation of a set class. The syntax -# and methods implemented are, for the most part, borrowed from -# PEP 218 by Greg Wilson. -# -# Note that this class violates the formal definition of a set() by adding -# a __getitem__() method so we can iterate over a set's elements under -# Python 1.5 and 2.1, which don't support __iter__() and iterator types. -# - -import string - -class Set: - """The set class. It can contain mutable objects.""" - - def __init__(self, seq = None): - """The constructor. It can take any object giving an iterator as an optional - argument to populate the new set.""" - self.elems = [] - if seq: - for elem in seq: - if elem not in self.elems: - hash(elem) - self.elems.append(elem) - - def __str__(self): - return "set([%s])" % string.join(map(str, self.elems), ", ") - - - def copy(self): - """Shallow copy of a set object.""" - return Set(self.elems) - - def __contains__(self, elem): - return elem in self.elems - - def __len__(self): - return len(self.elems) - - def __getitem__(self, index): - # Added so that Python 1.5 can iterate over the elements. - # The cookbook recipe's author didn't like this because there - # really isn't any order in a set object, but this is necessary - # to make the class work well enough for our purposes. - return self.elems[index] - - def items(self): - """Returns a list of the elements in the set.""" - return self.elems - - def add(self, elem): - """Add one element to the set.""" - if elem not in self.elems: - hash(elem) - self.elems.append(elem) - - def remove(self, elem): - """Remove an element from the set. Return an error if elem is not in the set.""" - try: - self.elems.remove(elem) - except ValueError: - raise LookupError, "Object %s is not a member of the set." % str(elem) - - def discard(self, elem): - """Remove an element from the set. Do nothing if elem is not in the set.""" - try: - self.elems.remove(elem) - except ValueError: - pass - - def sort(self, func=cmp): - self.elems.sort(func) - - #Define an iterator for a set. - def __iter__(self): - return iter(self.elems) - - #The basic binary operations with sets. - def __or__(self, other): - """Union of two sets.""" - ret = self.copy() - for elem in other.elems: - if elem not in ret: - ret.elems.append(elem) - return ret - - def __sub__(self, other): - """Difference of two sets.""" - ret = self.copy() - for elem in other.elems: - ret.discard(elem) - return ret - - def __and__(self, other): - """Intersection of two sets.""" - ret = Set() - for elem in self.elems: - if elem in other.elems: - ret.elems.append(elem) - return ret - - def __add__(self, other): - """Symmetric difference of two sets.""" - ret = Set() - temp = other.copy() - for elem in self.elems: - if elem in temp.elems: - temp.elems.remove(elem) - else: - ret.elems.append(elem) - #Add remaining elements. - for elem in temp.elems: - ret.elems.append(elem) - return ret - - def __mul__(self, other): - """Cartesian product of two sets.""" - ret = Set() - for elemself in self.elems: - x = map(lambda other, s=elemself: (s, other), other.elems) - ret.elems.extend(x) - return ret - - #Some of the binary comparisons. - def __lt__(self, other): - """Returns 1 if the lhs set is contained but not equal to the rhs set.""" - if len(self.elems) < len(other.elems): - temp = other.copy() - for elem in self.elems: - if elem in temp.elems: - temp.remove(elem) - else: - return 0 - return len(temp.elems) == 0 - else: - return 0 - - def __le__(self, other): - """Returns 1 if the lhs set is contained in the rhs set.""" - if len(self.elems) <= len(other.elems): - ret = 1 - for elem in self.elems: - if elem not in other.elems: - ret = 0 - break - return ret - else: - return 0 - - def __eq__(self, other): - """Returns 1 if the sets are equal.""" - if len(self.elems) != len(other.elems): - return 0 - else: - return len(self - other) == 0 - - def __cmp__(self, other): - """Returns 1 if the sets are equal.""" - if self.__lt__(other): - return -1 - elif other.__lt__(self): - return 1 - else: - return 0 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/compat/_scons_shlex.py b/3rdParty/SCons/scons-local/SCons/compat/_scons_shlex.py deleted file mode 100644 index 9e30a01..0000000 --- a/3rdParty/SCons/scons-local/SCons/compat/_scons_shlex.py +++ /dev/null @@ -1,325 +0,0 @@ -# -*- coding: iso-8859-1 -*- -"""A lexical analyzer class for simple shell-like syntaxes.""" - -# Module and documentation by Eric S. Raymond, 21 Dec 1998 -# Input stacking and error message cleanup added by ESR, March 2000 -# push_source() and pop_source() made explicit by ESR, January 2001. -# Posix compliance, split(), string arguments, and -# iterator interface by Gustavo Niemeyer, April 2003. - -import os.path -import sys -#from collections import deque - -class deque: - def __init__(self): - self.data = [] - def __len__(self): - return len(self.data) - def appendleft(self, item): - self.data.insert(0, item) - def popleft(self): - return self.data.pop(0) - -try: - basestring -except NameError: - import types - def is_basestring(s): - return type(s) is types.StringType -else: - def is_basestring(s): - return isinstance(s, basestring) - -try: - from cStringIO import StringIO -except ImportError: - from StringIO import StringIO - -__all__ = ["shlex", "split"] - -class shlex: - "A lexical analyzer class for simple shell-like syntaxes." - def __init__(self, instream=None, infile=None, posix=False): - if is_basestring(instream): - instream = StringIO(instream) - if instream is not None: - self.instream = instream - self.infile = infile - else: - self.instream = sys.stdin - self.infile = None - self.posix = posix - if posix: - self.eof = None - else: - self.eof = '' - self.commenters = '#' - self.wordchars = ('abcdfeghijklmnopqrstuvwxyz' - 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_') - if self.posix: - self.wordchars = self.wordchars + ('ßàáâăäåæçèéêë́íîïđṇ̃óôơöøùúûüư₫ÿ' - 'ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖØÙÚÛÜỮ') - self.whitespace = ' \t\r\n' - self.whitespace_split = False - self.quotes = '\'"' - self.escape = '\\' - self.escapedquotes = '"' - self.state = ' ' - self.pushback = deque() - self.lineno = 1 - self.debug = 0 - self.token = '' - self.filestack = deque() - self.source = None - if self.debug: - print 'shlex: reading from %s, line %d' \ - % (self.instream, self.lineno) - - def push_token(self, tok): - "Push a token onto the stack popped by the get_token method" - if self.debug >= 1: - print "shlex: pushing token " + repr(tok) - self.pushback.appendleft(tok) - - def push_source(self, newstream, newfile=None): - "Push an input source onto the lexer's input source stack." - if is_basestring(newstream): - newstream = StringIO(newstream) - self.filestack.appendleft((self.infile, self.instream, self.lineno)) - self.infile = newfile - self.instream = newstream - self.lineno = 1 - if self.debug: - if newfile is not None: - print 'shlex: pushing to file %s' % (self.infile,) - else: - print 'shlex: pushing to stream %s' % (self.instream,) - - def pop_source(self): - "Pop the input source stack." - self.instream.close() - (self.infile, self.instream, self.lineno) = self.filestack.popleft() - if self.debug: - print 'shlex: popping to %s, line %d' \ - % (self.instream, self.lineno) - self.state = ' ' - - def get_token(self): - "Get a token from the input stream (or from stack if it's nonempty)" - if self.pushback: - tok = self.pushback.popleft() - if self.debug >= 1: - print "shlex: popping token " + repr(tok) - return tok - # No pushback. Get a token. - raw = self.read_token() - # Handle inclusions - if self.source is not None: - while raw == self.source: - spec = self.sourcehook(self.read_token()) - if spec: - (newfile, newstream) = spec - self.push_source(newstream, newfile) - raw = self.get_token() - # Maybe we got EOF instead? - while raw == self.eof: - if not self.filestack: - return self.eof - else: - self.pop_source() - raw = self.get_token() - # Neither inclusion nor EOF - if self.debug >= 1: - if raw != self.eof: - print "shlex: token=" + repr(raw) - else: - print "shlex: token=EOF" - return raw - - def read_token(self): - quoted = False - escapedstate = ' ' - while True: - nextchar = self.instream.read(1) - if nextchar == '\n': - self.lineno = self.lineno + 1 - if self.debug >= 3: - print "shlex: in state", repr(self.state), \ - "I see character:", repr(nextchar) - if self.state is None: - self.token = '' # past end of file - break - elif self.state == ' ': - if not nextchar: - self.state = None # end of file - break - elif nextchar in self.whitespace: - if self.debug >= 2: - print "shlex: I see whitespace in whitespace state" - if self.token or (self.posix and quoted): - break # emit current token - else: - continue - elif nextchar in self.commenters: - self.instream.readline() - self.lineno = self.lineno + 1 - elif self.posix and nextchar in self.escape: - escapedstate = 'a' - self.state = nextchar - elif nextchar in self.wordchars: - self.token = nextchar - self.state = 'a' - elif nextchar in self.quotes: - if not self.posix: - self.token = nextchar - self.state = nextchar - elif self.whitespace_split: - self.token = nextchar - self.state = 'a' - else: - self.token = nextchar - if self.token or (self.posix and quoted): - break # emit current token - else: - continue - elif self.state in self.quotes: - quoted = True - if not nextchar: # end of file - if self.debug >= 2: - print "shlex: I see EOF in quotes state" - # XXX what error should be raised here? - raise ValueError, "No closing quotation" - if nextchar == self.state: - if not self.posix: - self.token = self.token + nextchar - self.state = ' ' - break - else: - self.state = 'a' - elif self.posix and nextchar in self.escape and \ - self.state in self.escapedquotes: - escapedstate = self.state - self.state = nextchar - else: - self.token = self.token + nextchar - elif self.state in self.escape: - if not nextchar: # end of file - if self.debug >= 2: - print "shlex: I see EOF in escape state" - # XXX what error should be raised here? - raise ValueError, "No escaped character" - # In posix shells, only the quote itself or the escape - # character may be escaped within quotes. - if escapedstate in self.quotes and \ - nextchar != self.state and nextchar != escapedstate: - self.token = self.token + self.state - self.token = self.token + nextchar - self.state = escapedstate - elif self.state == 'a': - if not nextchar: - self.state = None # end of file - break - elif nextchar in self.whitespace: - if self.debug >= 2: - print "shlex: I see whitespace in word state" - self.state = ' ' - if self.token or (self.posix and quoted): - break # emit current token - else: - continue - elif nextchar in self.commenters: - self.instream.readline() - self.lineno = self.lineno + 1 - if self.posix: - self.state = ' ' - if self.token or (self.posix and quoted): - break # emit current token - else: - continue - elif self.posix and nextchar in self.quotes: - self.state = nextchar - elif self.posix and nextchar in self.escape: - escapedstate = 'a' - self.state = nextchar - elif nextchar in self.wordchars or nextchar in self.quotes \ - or self.whitespace_split: - self.token = self.token + nextchar - else: - self.pushback.appendleft(nextchar) - if self.debug >= 2: - print "shlex: I see punctuation in word state" - self.state = ' ' - if self.token: - break # emit current token - else: - continue - result = self.token - self.token = '' - if self.posix and not quoted and result == '': - result = None - if self.debug > 1: - if result: - print "shlex: raw token=" + repr(result) - else: - print "shlex: raw token=EOF" - return result - - def sourcehook(self, newfile): - "Hook called on a filename to be sourced." - if newfile[0] == '"': - newfile = newfile[1:-1] - # This implements cpp-like semantics for relative-path inclusion. - if is_basestring(self.infile) and not os.path.isabs(newfile): - newfile = os.path.join(os.path.dirname(self.infile), newfile) - return (newfile, open(newfile, "r")) - - def error_leader(self, infile=None, lineno=None): - "Emit a C-compiler-like, Emacs-friendly error-message leader." - if infile is None: - infile = self.infile - if lineno is None: - lineno = self.lineno - return "\"%s\", line %d: " % (infile, lineno) - - def __iter__(self): - return self - - def next(self): - token = self.get_token() - if token == self.eof: - raise StopIteration - return token - -def split(s, comments=False): - lex = shlex(s, posix=True) - lex.whitespace_split = True - if not comments: - lex.commenters = '' - #return list(lex) - result = [] - while True: - token = lex.get_token() - if token == lex.eof: - break - result.append(token) - return result - -if __name__ == '__main__': - if len(sys.argv) == 1: - lexer = shlex() - else: - file = sys.argv[1] - lexer = shlex(open(file), file) - while 1: - tt = lexer.get_token() - if tt: - print "Token: " + repr(tt) - else: - break - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/compat/_scons_subprocess.py b/3rdParty/SCons/scons-local/SCons/compat/_scons_subprocess.py deleted file mode 100644 index 4968825..0000000 --- a/3rdParty/SCons/scons-local/SCons/compat/_scons_subprocess.py +++ /dev/null @@ -1,1296 +0,0 @@ -# subprocess - Subprocesses with accessible I/O streams -# -# For more information about this module, see PEP 324. -# -# This module should remain compatible with Python 2.2, see PEP 291. -# -# Copyright (c) 2003-2005 by Peter Astrand <astrand@lysator.liu.se> -# -# Licensed to PSF under a Contributor Agreement. -# See http://www.python.org/2.4/license for licensing details. - -r"""subprocess - Subprocesses with accessible I/O streams - -This module allows you to spawn processes, connect to their -input/output/error pipes, and obtain their return codes. This module -intends to replace several other, older modules and functions, like: - -os.system -os.spawn* -os.popen* -popen2.* -commands.* - -Information about how the subprocess module can be used to replace these -modules and functions can be found below. - - - -Using the subprocess module -=========================== -This module defines one class called Popen: - -class Popen(args, bufsize=0, executable=None, - stdin=None, stdout=None, stderr=None, - preexec_fn=None, close_fds=False, shell=False, - cwd=None, env=None, universal_newlines=False, - startupinfo=None, creationflags=0): - - -Arguments are: - -args should be a string, or a sequence of program arguments. The -program to execute is normally the first item in the args sequence or -string, but can be explicitly set by using the executable argument. - -On UNIX, with shell=False (default): In this case, the Popen class -uses os.execvp() to execute the child program. args should normally -be a sequence. A string will be treated as a sequence with the string -as the only item (the program to execute). - -On UNIX, with shell=True: If args is a string, it specifies the -command string to execute through the shell. If args is a sequence, -the first item specifies the command string, and any additional items -will be treated as additional shell arguments. - -On Windows: the Popen class uses CreateProcess() to execute the child -program, which operates on strings. If args is a sequence, it will be -converted to a string using the list2cmdline method. Please note that -not all MS Windows applications interpret the command line the same -way: The list2cmdline is designed for applications using the same -rules as the MS C runtime. - -bufsize, if given, has the same meaning as the corresponding argument -to the built-in open() function: 0 means unbuffered, 1 means line -buffered, any other positive value means use a buffer of -(approximately) that size. A negative bufsize means to use the system -default, which usually means fully buffered. The default value for -bufsize is 0 (unbuffered). - -stdin, stdout and stderr specify the executed programs' standard -input, standard output and standard error file handles, respectively. -Valid values are PIPE, an existing file descriptor (a positive -integer), an existing file object, and None. PIPE indicates that a -new pipe to the child should be created. With None, no redirection -will occur; the child's file handles will be inherited from the -parent. Additionally, stderr can be STDOUT, which indicates that the -stderr data from the applications should be captured into the same -file handle as for stdout. - -If preexec_fn is set to a callable object, this object will be called -in the child process just before the child is executed. - -If close_fds is true, all file descriptors except 0, 1 and 2 will be -closed before the child process is executed. - -if shell is true, the specified command will be executed through the -shell. - -If cwd is not None, the current directory will be changed to cwd -before the child is executed. - -If env is not None, it defines the environment variables for the new -process. - -If universal_newlines is true, the file objects stdout and stderr are -opened as a text files, but lines may be terminated by any of '\n', -the Unix end-of-line convention, '\r', the Macintosh convention or -'\r\n', the Windows convention. All of these external representations -are seen as '\n' by the Python program. Note: This feature is only -available if Python is built with universal newline support (the -default). Also, the newlines attribute of the file objects stdout, -stdin and stderr are not updated by the communicate() method. - -The startupinfo and creationflags, if given, will be passed to the -underlying CreateProcess() function. They can specify things such as -appearance of the main window and priority for the new process. -(Windows only) - - -This module also defines two shortcut functions: - -call(*popenargs, **kwargs): - Run command with arguments. Wait for command to complete, then - return the returncode attribute. - - The arguments are the same as for the Popen constructor. Example: - - retcode = call(["ls", "-l"]) - -check_call(*popenargs, **kwargs): - Run command with arguments. Wait for command to complete. If the - exit code was zero then return, otherwise raise - CalledProcessError. The CalledProcessError object will have the - return code in the returncode attribute. - - The arguments are the same as for the Popen constructor. Example: - - check_call(["ls", "-l"]) - -Exceptions ----------- -Exceptions raised in the child process, before the new program has -started to execute, will be re-raised in the parent. Additionally, -the exception object will have one extra attribute called -'child_traceback', which is a string containing traceback information -from the childs point of view. - -The most common exception raised is OSError. This occurs, for -example, when trying to execute a non-existent file. Applications -should prepare for OSErrors. - -A ValueError will be raised if Popen is called with invalid arguments. - -check_call() will raise CalledProcessError, if the called process -returns a non-zero return code. - - -Security --------- -Unlike some other popen functions, this implementation will never call -/bin/sh implicitly. This means that all characters, including shell -metacharacters, can safely be passed to child processes. - - -Popen objects -============= -Instances of the Popen class have the following methods: - -poll() - Check if child process has terminated. Returns returncode - attribute. - -wait() - Wait for child process to terminate. Returns returncode attribute. - -communicate(input=None) - Interact with process: Send data to stdin. Read data from stdout - and stderr, until end-of-file is reached. Wait for process to - terminate. The optional stdin argument should be a string to be - sent to the child process, or None, if no data should be sent to - the child. - - communicate() returns a tuple (stdout, stderr). - - Note: The data read is buffered in memory, so do not use this - method if the data size is large or unlimited. - -The following attributes are also available: - -stdin - If the stdin argument is PIPE, this attribute is a file object - that provides input to the child process. Otherwise, it is None. - -stdout - If the stdout argument is PIPE, this attribute is a file object - that provides output from the child process. Otherwise, it is - None. - -stderr - If the stderr argument is PIPE, this attribute is file object that - provides error output from the child process. Otherwise, it is - None. - -pid - The process ID of the child process. - -returncode - The child return code. A None value indicates that the process - hasn't terminated yet. A negative value -N indicates that the - child was terminated by signal N (UNIX only). - - -Replacing older functions with the subprocess module -==================================================== -In this section, "a ==> b" means that b can be used as a replacement -for a. - -Note: All functions in this section fail (more or less) silently if -the executed program cannot be found; this module raises an OSError -exception. - -In the following examples, we assume that the subprocess module is -imported with "from subprocess import *". - - -Replacing /bin/sh shell backquote ---------------------------------- -output=`mycmd myarg` -==> -output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0] - - -Replacing shell pipe line -------------------------- -output=`dmesg | grep hda` -==> -p1 = Popen(["dmesg"], stdout=PIPE) -p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) -output = p2.communicate()[0] - - -Replacing os.system() ---------------------- -sts = os.system("mycmd" + " myarg") -==> -p = Popen("mycmd" + " myarg", shell=True) -pid, sts = os.waitpid(p.pid, 0) - -Note: - -* Calling the program through the shell is usually not required. - -* It's easier to look at the returncode attribute than the - exitstatus. - -A more real-world example would look like this: - -try: - retcode = call("mycmd" + " myarg", shell=True) - if retcode < 0: - print >>sys.stderr, "Child was terminated by signal", -retcode - else: - print >>sys.stderr, "Child returned", retcode -except OSError, e: - print >>sys.stderr, "Execution failed:", e - - -Replacing os.spawn* -------------------- -P_NOWAIT example: - -pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg") -==> -pid = Popen(["/bin/mycmd", "myarg"]).pid - - -P_WAIT example: - -retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg") -==> -retcode = call(["/bin/mycmd", "myarg"]) - - -Vector example: - -os.spawnvp(os.P_NOWAIT, path, args) -==> -Popen([path] + args[1:]) - - -Environment example: - -os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env) -==> -Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"}) - - -Replacing os.popen* -------------------- -pipe = os.popen(cmd, mode='r', bufsize) -==> -pipe = Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout - -pipe = os.popen(cmd, mode='w', bufsize) -==> -pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin - - -(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize) -==> -p = Popen(cmd, shell=True, bufsize=bufsize, - stdin=PIPE, stdout=PIPE, close_fds=True) -(child_stdin, child_stdout) = (p.stdin, p.stdout) - - -(child_stdin, - child_stdout, - child_stderr) = os.popen3(cmd, mode, bufsize) -==> -p = Popen(cmd, shell=True, bufsize=bufsize, - stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) -(child_stdin, - child_stdout, - child_stderr) = (p.stdin, p.stdout, p.stderr) - - -(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize) -==> -p = Popen(cmd, shell=True, bufsize=bufsize, - stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True) -(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout) - - -Replacing popen2.* ------------------- -Note: If the cmd argument to popen2 functions is a string, the command -is executed through /bin/sh. If it is a list, the command is directly -executed. - -(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode) -==> -p = Popen(["somestring"], shell=True, bufsize=bufsize - stdin=PIPE, stdout=PIPE, close_fds=True) -(child_stdout, child_stdin) = (p.stdout, p.stdin) - - -(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode) -==> -p = Popen(["mycmd", "myarg"], bufsize=bufsize, - stdin=PIPE, stdout=PIPE, close_fds=True) -(child_stdout, child_stdin) = (p.stdout, p.stdin) - -The popen2.Popen3 and popen3.Popen4 basically works as subprocess.Popen, -except that: - -* subprocess.Popen raises an exception if the execution fails -* the capturestderr argument is replaced with the stderr argument. -* stdin=PIPE and stdout=PIPE must be specified. -* popen2 closes all filedescriptors by default, but you have to specify - close_fds=True with subprocess.Popen. - - -""" - -import sys -mswindows = (sys.platform == "win32") - -import os -import string -import types -import traceback - -# Exception classes used by this module. -class CalledProcessError(Exception): - """This exception is raised when a process run by check_call() returns - a non-zero exit status. The exit status will be stored in the - returncode attribute.""" - def __init__(self, returncode, cmd): - self.returncode = returncode - self.cmd = cmd - def __str__(self): - return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode) - - -if mswindows: - try: - import threading - except ImportError: - # SCons: the threading module is only used by the communicate() - # method, which we don't actually use, so don't worry if we - # can't import it. - pass - import msvcrt - if 0: # <-- change this to use pywin32 instead of the _subprocess driver - import pywintypes - from win32api import GetStdHandle, STD_INPUT_HANDLE, \ - STD_OUTPUT_HANDLE, STD_ERROR_HANDLE - from win32api import GetCurrentProcess, DuplicateHandle, \ - GetModuleFileName, GetVersion - from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE - from win32pipe import CreatePipe - from win32process import CreateProcess, STARTUPINFO, \ - GetExitCodeProcess, STARTF_USESTDHANDLES, \ - STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE - from win32event import WaitForSingleObject, INFINITE, WAIT_OBJECT_0 - else: - # SCons: don't die on Python versions that don't have _subprocess. - try: - from _subprocess import * - except ImportError: - pass - class STARTUPINFO: - dwFlags = 0 - hStdInput = None - hStdOutput = None - hStdError = None - wShowWindow = 0 - class pywintypes: - error = IOError -else: - import select - import errno - import fcntl - import pickle - - try: - fcntl.F_GETFD - except AttributeError: - fcntl.F_GETFD = 1 - - try: - fcntl.F_SETFD - except AttributeError: - fcntl.F_SETFD = 2 - -__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "CalledProcessError"] - -try: - MAXFD = os.sysconf("SC_OPEN_MAX") -except KeyboardInterrupt: - raise # SCons: don't swallow keyboard interrupts -except: - MAXFD = 256 - -# True/False does not exist on 2.2.0 -try: - False -except NameError: - False = 0 - True = 1 - -try: - isinstance(1, int) -except TypeError: - def is_int(obj): - return type(obj) == type(1) - def is_int_or_long(obj): - return type(obj) in (type(1), type(1L)) -else: - def is_int(obj): - return isinstance(obj, int) - def is_int_or_long(obj): - return isinstance(obj, (int, long)) - -try: - types.StringTypes -except AttributeError: - try: - types.StringTypes = (types.StringType, types.UnicodeType) - except AttributeError: - types.StringTypes = (types.StringType,) - def is_string(obj): - return type(obj) in types.StringTypes -else: - def is_string(obj): - return isinstance(obj, types.StringTypes) - -_active = [] - -def _cleanup(): - for inst in _active[:]: - if inst.poll(_deadstate=sys.maxint) >= 0: - try: - _active.remove(inst) - except ValueError: - # This can happen if two threads create a new Popen instance. - # It's harmless that it was already removed, so ignore. - pass - -PIPE = -1 -STDOUT = -2 - - -def call(*popenargs, **kwargs): - """Run command with arguments. Wait for command to complete, then - return the returncode attribute. - - The arguments are the same as for the Popen constructor. Example: - - retcode = call(["ls", "-l"]) - """ - return apply(Popen, popenargs, kwargs).wait() - - -def check_call(*popenargs, **kwargs): - """Run command with arguments. Wait for command to complete. If - the exit code was zero then return, otherwise raise - CalledProcessError. The CalledProcessError object will have the - return code in the returncode attribute. - - The arguments are the same as for the Popen constructor. Example: - - check_call(["ls", "-l"]) - """ - retcode = apply(call, popenargs, kwargs) - cmd = kwargs.get("args") - if cmd is None: - cmd = popenargs[0] - if retcode: - raise CalledProcessError(retcode, cmd) - return retcode - - -def list2cmdline(seq): - """ - Translate a sequence of arguments into a command line - string, using the same rules as the MS C runtime: - - 1) Arguments are delimited by white space, which is either a - space or a tab. - - 2) A string surrounded by double quotation marks is - interpreted as a single argument, regardless of white space - contained within. A quoted string can be embedded in an - argument. - - 3) A double quotation mark preceded by a backslash is - interpreted as a literal double quotation mark. - - 4) Backslashes are interpreted literally, unless they - immediately precede a double quotation mark. - - 5) If backslashes immediately precede a double quotation mark, - every pair of backslashes is interpreted as a literal - backslash. If the number of backslashes is odd, the last - backslash escapes the next double quotation mark as - described in rule 3. - """ - - # See - # http://msdn.microsoft.com/library/en-us/vccelng/htm/progs_12.asp - result = [] - needquote = False - for arg in seq: - bs_buf = [] - - # Add a space to separate this argument from the others - if result: - result.append(' ') - - needquote = (" " in arg) or ("\t" in arg) - if needquote: - result.append('"') - - for c in arg: - if c == '\\': - # Don't know if we need to double yet. - bs_buf.append(c) - elif c == '"': - # Double backspaces. - result.append('\\' * len(bs_buf)*2) - bs_buf = [] - result.append('\\"') - else: - # Normal char - if bs_buf: - result.extend(bs_buf) - bs_buf = [] - result.append(c) - - # Add remaining backspaces, if any. - if bs_buf: - result.extend(bs_buf) - - if needquote: - result.extend(bs_buf) - result.append('"') - - return string.join(result, '') - - -try: - object -except NameError: - class object: - pass - -class Popen(object): - def __init__(self, args, bufsize=0, executable=None, - stdin=None, stdout=None, stderr=None, - preexec_fn=None, close_fds=False, shell=False, - cwd=None, env=None, universal_newlines=False, - startupinfo=None, creationflags=0): - """Create new Popen instance.""" - _cleanup() - - self._child_created = False - if not is_int_or_long(bufsize): - raise TypeError("bufsize must be an integer") - - if mswindows: - if preexec_fn is not None: - raise ValueError("preexec_fn is not supported on Windows " - "platforms") - if close_fds: - raise ValueError("close_fds is not supported on Windows " - "platforms") - else: - # POSIX - if startupinfo is not None: - raise ValueError("startupinfo is only supported on Windows " - "platforms") - if creationflags != 0: - raise ValueError("creationflags is only supported on Windows " - "platforms") - - self.stdin = None - self.stdout = None - self.stderr = None - self.pid = None - self.returncode = None - self.universal_newlines = universal_newlines - - # Input and output objects. The general principle is like - # this: - # - # Parent Child - # ------ ----- - # p2cwrite ---stdin---> p2cread - # c2pread <--stdout--- c2pwrite - # errread <--stderr--- errwrite - # - # On POSIX, the child objects are file descriptors. On - # Windows, these are Windows file handles. The parent objects - # are file descriptors on both platforms. The parent objects - # are None when not using PIPEs. The child objects are None - # when not redirecting. - - (p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite) = self._get_handles(stdin, stdout, stderr) - - self._execute_child(args, executable, preexec_fn, close_fds, - cwd, env, universal_newlines, - startupinfo, creationflags, shell, - p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite) - - if p2cwrite: - self.stdin = os.fdopen(p2cwrite, 'wb', bufsize) - if c2pread: - if universal_newlines: - self.stdout = os.fdopen(c2pread, 'rU', bufsize) - else: - self.stdout = os.fdopen(c2pread, 'rb', bufsize) - if errread: - if universal_newlines: - self.stderr = os.fdopen(errread, 'rU', bufsize) - else: - self.stderr = os.fdopen(errread, 'rb', bufsize) - - - def _translate_newlines(self, data): - data = data.replace("\r\n", "\n") - data = data.replace("\r", "\n") - return data - - - def __del__(self): - if not self._child_created: - # We didn't get to successfully create a child process. - return - # In case the child hasn't been waited on, check if it's done. - self.poll(_deadstate=sys.maxint) - if self.returncode is None and _active is not None: - # Child is still running, keep us alive until we can wait on it. - _active.append(self) - - - def communicate(self, input=None): - """Interact with process: Send data to stdin. Read data from - stdout and stderr, until end-of-file is reached. Wait for - process to terminate. The optional input argument should be a - string to be sent to the child process, or None, if no data - should be sent to the child. - - communicate() returns a tuple (stdout, stderr).""" - - # Optimization: If we are only using one pipe, or no pipe at - # all, using select() or threads is unnecessary. - if [self.stdin, self.stdout, self.stderr].count(None) >= 2: - stdout = None - stderr = None - if self.stdin: - if input: - self.stdin.write(input) - self.stdin.close() - elif self.stdout: - stdout = self.stdout.read() - elif self.stderr: - stderr = self.stderr.read() - self.wait() - return (stdout, stderr) - - return self._communicate(input) - - - if mswindows: - # - # Windows methods - # - def _get_handles(self, stdin, stdout, stderr): - """Construct and return tupel with IO objects: - p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite - """ - if stdin is None and stdout is None and stderr is None: - return (None, None, None, None, None, None) - - p2cread, p2cwrite = None, None - c2pread, c2pwrite = None, None - errread, errwrite = None, None - - if stdin is None: - p2cread = GetStdHandle(STD_INPUT_HANDLE) - elif stdin == PIPE: - p2cread, p2cwrite = CreatePipe(None, 0) - # Detach and turn into fd - p2cwrite = p2cwrite.Detach() - p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0) - elif is_int(stdin): - p2cread = msvcrt.get_osfhandle(stdin) - else: - # Assuming file-like object - p2cread = msvcrt.get_osfhandle(stdin.fileno()) - p2cread = self._make_inheritable(p2cread) - - if stdout is None: - c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE) - elif stdout == PIPE: - c2pread, c2pwrite = CreatePipe(None, 0) - # Detach and turn into fd - c2pread = c2pread.Detach() - c2pread = msvcrt.open_osfhandle(c2pread, 0) - elif is_int(stdout): - c2pwrite = msvcrt.get_osfhandle(stdout) - else: - # Assuming file-like object - c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) - c2pwrite = self._make_inheritable(c2pwrite) - - if stderr is None: - errwrite = GetStdHandle(STD_ERROR_HANDLE) - elif stderr == PIPE: - errread, errwrite = CreatePipe(None, 0) - # Detach and turn into fd - errread = errread.Detach() - errread = msvcrt.open_osfhandle(errread, 0) - elif stderr == STDOUT: - errwrite = c2pwrite - elif is_int(stderr): - errwrite = msvcrt.get_osfhandle(stderr) - else: - # Assuming file-like object - errwrite = msvcrt.get_osfhandle(stderr.fileno()) - errwrite = self._make_inheritable(errwrite) - - return (p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite) - - - def _make_inheritable(self, handle): - """Return a duplicate of handle, which is inheritable""" - return DuplicateHandle(GetCurrentProcess(), handle, - GetCurrentProcess(), 0, 1, - DUPLICATE_SAME_ACCESS) - - - def _find_w9xpopen(self): - """Find and return absolut path to w9xpopen.exe""" - w9xpopen = os.path.join(os.path.dirname(GetModuleFileName(0)), - "w9xpopen.exe") - if not os.path.exists(w9xpopen): - # Eeek - file-not-found - possibly an embedding - # situation - see if we can locate it in sys.exec_prefix - w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix), - "w9xpopen.exe") - if not os.path.exists(w9xpopen): - raise RuntimeError("Cannot locate w9xpopen.exe, which is " - "needed for Popen to work with your " - "shell or platform.") - return w9xpopen - - - def _execute_child(self, args, executable, preexec_fn, close_fds, - cwd, env, universal_newlines, - startupinfo, creationflags, shell, - p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite): - """Execute program (MS Windows version)""" - - if not isinstance(args, types.StringTypes): - args = list2cmdline(args) - - # Process startup details - if startupinfo is None: - startupinfo = STARTUPINFO() - if None not in (p2cread, c2pwrite, errwrite): - startupinfo.dwFlags = startupinfo.dwFlags | STARTF_USESTDHANDLES - startupinfo.hStdInput = p2cread - startupinfo.hStdOutput = c2pwrite - startupinfo.hStdError = errwrite - - if shell: - startupinfo.dwFlags = startupinfo.dwFlags | STARTF_USESHOWWINDOW - startupinfo.wShowWindow = SW_HIDE - comspec = os.environ.get("COMSPEC", "cmd.exe") - args = comspec + " /c " + args - if (GetVersion() >= 0x80000000L or - os.path.basename(comspec).lower() == "command.com"): - # Win9x, or using command.com on NT. We need to - # use the w9xpopen intermediate program. For more - # information, see KB Q150956 - # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp) - w9xpopen = self._find_w9xpopen() - args = '"%s" %s' % (w9xpopen, args) - # Not passing CREATE_NEW_CONSOLE has been known to - # cause random failures on win9x. Specifically a - # dialog: "Your program accessed mem currently in - # use at xxx" and a hopeful warning about the - # stability of your system. Cost is Ctrl+C wont - # kill children. - creationflags = creationflags | CREATE_NEW_CONSOLE - - # Start the process - try: - hp, ht, pid, tid = CreateProcess(executable, args, - # no special security - None, None, - # must inherit handles to pass std - # handles - 1, - creationflags, - env, - cwd, - startupinfo) - except pywintypes.error, e: - # Translate pywintypes.error to WindowsError, which is - # a subclass of OSError. FIXME: We should really - # translate errno using _sys_errlist (or simliar), but - # how can this be done from Python? - raise apply(WindowsError, e.args) - - # Retain the process handle, but close the thread handle - self._child_created = True - self._handle = hp - self.pid = pid - ht.Close() - - # Child is launched. Close the parent's copy of those pipe - # handles that only the child should have open. You need - # to make sure that no handles to the write end of the - # output pipe are maintained in this process or else the - # pipe will not close when the child process exits and the - # ReadFile will hang. - if p2cread is not None: - p2cread.Close() - if c2pwrite is not None: - c2pwrite.Close() - if errwrite is not None: - errwrite.Close() - - - def poll(self, _deadstate=None): - """Check if child process has terminated. Returns returncode - attribute.""" - if self.returncode is None: - if WaitForSingleObject(self._handle, 0) == WAIT_OBJECT_0: - self.returncode = GetExitCodeProcess(self._handle) - return self.returncode - - - def wait(self): - """Wait for child process to terminate. Returns returncode - attribute.""" - if self.returncode is None: - obj = WaitForSingleObject(self._handle, INFINITE) - self.returncode = GetExitCodeProcess(self._handle) - return self.returncode - - - def _readerthread(self, fh, buffer): - buffer.append(fh.read()) - - - def _communicate(self, input): - stdout = None # Return - stderr = None # Return - - if self.stdout: - stdout = [] - stdout_thread = threading.Thread(target=self._readerthread, - args=(self.stdout, stdout)) - stdout_thread.setDaemon(True) - stdout_thread.start() - if self.stderr: - stderr = [] - stderr_thread = threading.Thread(target=self._readerthread, - args=(self.stderr, stderr)) - stderr_thread.setDaemon(True) - stderr_thread.start() - - if self.stdin: - if input is not None: - self.stdin.write(input) - self.stdin.close() - - if self.stdout: - stdout_thread.join() - if self.stderr: - stderr_thread.join() - - # All data exchanged. Translate lists into strings. - if stdout is not None: - stdout = stdout[0] - if stderr is not None: - stderr = stderr[0] - - # Translate newlines, if requested. We cannot let the file - # object do the translation: It is based on stdio, which is - # impossible to combine with select (unless forcing no - # buffering). - if self.universal_newlines and hasattr(file, 'newlines'): - if stdout: - stdout = self._translate_newlines(stdout) - if stderr: - stderr = self._translate_newlines(stderr) - - self.wait() - return (stdout, stderr) - - else: - # - # POSIX methods - # - def _get_handles(self, stdin, stdout, stderr): - """Construct and return tupel with IO objects: - p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite - """ - p2cread, p2cwrite = None, None - c2pread, c2pwrite = None, None - errread, errwrite = None, None - - if stdin is None: - pass - elif stdin == PIPE: - p2cread, p2cwrite = os.pipe() - elif is_int(stdin): - p2cread = stdin - else: - # Assuming file-like object - p2cread = stdin.fileno() - - if stdout is None: - pass - elif stdout == PIPE: - c2pread, c2pwrite = os.pipe() - elif is_int(stdout): - c2pwrite = stdout - else: - # Assuming file-like object - c2pwrite = stdout.fileno() - - if stderr is None: - pass - elif stderr == PIPE: - errread, errwrite = os.pipe() - elif stderr == STDOUT: - errwrite = c2pwrite - elif is_int(stderr): - errwrite = stderr - else: - # Assuming file-like object - errwrite = stderr.fileno() - - return (p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite) - - - def _set_cloexec_flag(self, fd): - try: - cloexec_flag = fcntl.FD_CLOEXEC - except AttributeError: - cloexec_flag = 1 - - old = fcntl.fcntl(fd, fcntl.F_GETFD) - fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag) - - - def _close_fds(self, but): - for i in xrange(3, MAXFD): - if i == but: - continue - try: - os.close(i) - except KeyboardInterrupt: - raise # SCons: don't swallow keyboard interrupts - except: - pass - - - def _execute_child(self, args, executable, preexec_fn, close_fds, - cwd, env, universal_newlines, - startupinfo, creationflags, shell, - p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite): - """Execute program (POSIX version)""" - - if is_string(args): - args = [args] - - if shell: - args = ["/bin/sh", "-c"] + args - - if executable is None: - executable = args[0] - - # For transferring possible exec failure from child to parent - # The first char specifies the exception type: 0 means - # OSError, 1 means some other error. - errpipe_read, errpipe_write = os.pipe() - self._set_cloexec_flag(errpipe_write) - - self.pid = os.fork() - self._child_created = True - if self.pid == 0: - # Child - try: - # Close parent's pipe ends - if p2cwrite: - os.close(p2cwrite) - if c2pread: - os.close(c2pread) - if errread: - os.close(errread) - os.close(errpipe_read) - - # Dup fds for child - if p2cread: - os.dup2(p2cread, 0) - if c2pwrite: - os.dup2(c2pwrite, 1) - if errwrite: - os.dup2(errwrite, 2) - - # Close pipe fds. Make sure we don't close the same - # fd more than once, or standard fds. - try: - set - except NameError: - # Fall-back for earlier Python versions, so epydoc - # can use this module directly to execute things. - if p2cread: - os.close(p2cread) - if c2pwrite and c2pwrite not in (p2cread,): - os.close(c2pwrite) - if errwrite and errwrite not in (p2cread, c2pwrite): - os.close(errwrite) - else: - for fd in set((p2cread, c2pwrite, errwrite))-set((0,1,2)): - if fd: os.close(fd) - - # Close all other fds, if asked for - if close_fds: - self._close_fds(but=errpipe_write) - - if cwd is not None: - os.chdir(cwd) - - if preexec_fn: - apply(preexec_fn) - - if env is None: - os.execvp(executable, args) - else: - os.execvpe(executable, args, env) - - except KeyboardInterrupt: - raise # SCons: don't swallow keyboard interrupts - - except: - exc_type, exc_value, tb = sys.exc_info() - # Save the traceback and attach it to the exception object - exc_lines = traceback.format_exception(exc_type, - exc_value, - tb) - exc_value.child_traceback = string.join(exc_lines, '') - os.write(errpipe_write, pickle.dumps(exc_value)) - - # This exitcode won't be reported to applications, so it - # really doesn't matter what we return. - os._exit(255) - - # Parent - os.close(errpipe_write) - if p2cread and p2cwrite: - os.close(p2cread) - if c2pwrite and c2pread: - os.close(c2pwrite) - if errwrite and errread: - os.close(errwrite) - - # Wait for exec to fail or succeed; possibly raising exception - data = os.read(errpipe_read, 1048576) # Exceptions limited to 1 MB - os.close(errpipe_read) - if data != "": - os.waitpid(self.pid, 0) - child_exception = pickle.loads(data) - raise child_exception - - - def _handle_exitstatus(self, sts): - if os.WIFSIGNALED(sts): - self.returncode = -os.WTERMSIG(sts) - elif os.WIFEXITED(sts): - self.returncode = os.WEXITSTATUS(sts) - else: - # Should never happen - raise RuntimeError("Unknown child exit status!") - - - def poll(self, _deadstate=None): - """Check if child process has terminated. Returns returncode - attribute.""" - if self.returncode is None: - try: - pid, sts = os.waitpid(self.pid, os.WNOHANG) - if pid == self.pid: - self._handle_exitstatus(sts) - except os.error: - if _deadstate is not None: - self.returncode = _deadstate - return self.returncode - - - def wait(self): - """Wait for child process to terminate. Returns returncode - attribute.""" - if self.returncode is None: - pid, sts = os.waitpid(self.pid, 0) - self._handle_exitstatus(sts) - return self.returncode - - - def _communicate(self, input): - read_set = [] - write_set = [] - stdout = None # Return - stderr = None # Return - - if self.stdin: - # Flush stdio buffer. This might block, if the user has - # been writing to .stdin in an uncontrolled fashion. - self.stdin.flush() - if input: - write_set.append(self.stdin) - else: - self.stdin.close() - if self.stdout: - read_set.append(self.stdout) - stdout = [] - if self.stderr: - read_set.append(self.stderr) - stderr = [] - - input_offset = 0 - while read_set or write_set: - rlist, wlist, xlist = select.select(read_set, write_set, []) - - if self.stdin in wlist: - # When select has indicated that the file is writable, - # we can write up to PIPE_BUF bytes without risk - # blocking. POSIX defines PIPE_BUF >= 512 - bytes_written = os.write(self.stdin.fileno(), buffer(input, input_offset, 512)) - input_offset = input_offset + bytes_written - if input_offset >= len(input): - self.stdin.close() - write_set.remove(self.stdin) - - if self.stdout in rlist: - data = os.read(self.stdout.fileno(), 1024) - if data == "": - self.stdout.close() - read_set.remove(self.stdout) - stdout.append(data) - - if self.stderr in rlist: - data = os.read(self.stderr.fileno(), 1024) - if data == "": - self.stderr.close() - read_set.remove(self.stderr) - stderr.append(data) - - # All data exchanged. Translate lists into strings. - if stdout is not None: - stdout = string.join(stdout, '') - if stderr is not None: - stderr = string.join(stderr, '') - - # Translate newlines, if requested. We cannot let the file - # object do the translation: It is based on stdio, which is - # impossible to combine with select (unless forcing no - # buffering). - if self.universal_newlines and hasattr(file, 'newlines'): - if stdout: - stdout = self._translate_newlines(stdout) - if stderr: - stderr = self._translate_newlines(stderr) - - self.wait() - return (stdout, stderr) - - -def _demo_posix(): - # - # Example 1: Simple redirection: Get process list - # - plist = Popen(["ps"], stdout=PIPE).communicate()[0] - print "Process list:" - print plist - - # - # Example 2: Change uid before executing child - # - if os.getuid() == 0: - p = Popen(["id"], preexec_fn=lambda: os.setuid(100)) - p.wait() - - # - # Example 3: Connecting several subprocesses - # - print "Looking for 'hda'..." - p1 = Popen(["dmesg"], stdout=PIPE) - p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) - print repr(p2.communicate()[0]) - - # - # Example 4: Catch execution error - # - print - print "Trying a weird file..." - try: - print Popen(["/this/path/does/not/exist"]).communicate() - except OSError, e: - if e.errno == errno.ENOENT: - print "The file didn't exist. I thought so..." - print "Child traceback:" - print e.child_traceback - else: - print "Error", e.errno - else: - sys.stderr.write( "Gosh. No error.\n" ) - - -def _demo_windows(): - # - # Example 1: Connecting several subprocesses - # - print "Looking for 'PROMPT' in set output..." - p1 = Popen("set", stdout=PIPE, shell=True) - p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE) - print repr(p2.communicate()[0]) - - # - # Example 2: Simple execution of program - # - print "Executing calc..." - p = Popen("calc") - p.wait() - - -if __name__ == "__main__": - if mswindows: - _demo_windows() - else: - _demo_posix() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/compat/_scons_textwrap.py b/3rdParty/SCons/scons-local/SCons/compat/_scons_textwrap.py deleted file mode 100644 index 81781af..0000000 --- a/3rdParty/SCons/scons-local/SCons/compat/_scons_textwrap.py +++ /dev/null @@ -1,382 +0,0 @@ -"""Text wrapping and filling. -""" - -# Copyright (C) 1999-2001 Gregory P. Ward. -# Copyright (C) 2002, 2003 Python Software Foundation. -# Written by Greg Ward <gward@python.net> - -__revision__ = "$Id: textwrap.py,v 1.32.8.2 2004/05/13 01:48:15 gward Exp $" - -import string, re - -try: - unicode -except NameError: - class unicode: - pass - -# Do the right thing with boolean values for all known Python versions -# (so this module can be copied to projects that don't depend on Python -# 2.3, e.g. Optik and Docutils). -try: - True, False -except NameError: - (True, False) = (1, 0) - -__all__ = ['TextWrapper', 'wrap', 'fill'] - -# Hardcode the recognized whitespace characters to the US-ASCII -# whitespace characters. The main reason for doing this is that in -# ISO-8859-1, 0xa0 is non-breaking whitespace, so in certain locales -# that character winds up in string.whitespace. Respecting -# string.whitespace in those cases would 1) make textwrap treat 0xa0 the -# same as any other whitespace char, which is clearly wrong (it's a -# *non-breaking* space), 2) possibly cause problems with Unicode, -# since 0xa0 is not in range(128). -_whitespace = '\t\n\x0b\x0c\r ' - -class TextWrapper: - """ - Object for wrapping/filling text. The public interface consists of - the wrap() and fill() methods; the other methods are just there for - subclasses to override in order to tweak the default behaviour. - If you want to completely replace the main wrapping algorithm, - you'll probably have to override _wrap_chunks(). - - Several instance attributes control various aspects of wrapping: - width (default: 70) - the maximum width of wrapped lines (unless break_long_words - is false) - initial_indent (default: "") - string that will be prepended to the first line of wrapped - output. Counts towards the line's width. - subsequent_indent (default: "") - string that will be prepended to all lines save the first - of wrapped output; also counts towards each line's width. - expand_tabs (default: true) - Expand tabs in input text to spaces before further processing. - Each tab will become 1 .. 8 spaces, depending on its position in - its line. If false, each tab is treated as a single character. - replace_whitespace (default: true) - Replace all whitespace characters in the input text by spaces - after tab expansion. Note that if expand_tabs is false and - replace_whitespace is true, every tab will be converted to a - single space! - fix_sentence_endings (default: false) - Ensure that sentence-ending punctuation is always followed - by two spaces. Off by default because the algorithm is - (unavoidably) imperfect. - break_long_words (default: true) - Break words longer than 'width'. If false, those words will not - be broken, and some lines might be longer than 'width'. - """ - - whitespace_trans = string.maketrans(_whitespace, ' ' * len(_whitespace)) - - unicode_whitespace_trans = {} - try: - uspace = eval("ord(u' ')") - except SyntaxError: - # Python1.5 doesn't understand u'' syntax, in which case we - # won't actually use the unicode translation below, so it - # doesn't matter what value we put in the table. - uspace = ord(' ') - for x in map(ord, _whitespace): - unicode_whitespace_trans[x] = uspace - - # This funky little regex is just the trick for splitting - # text up into word-wrappable chunks. E.g. - # "Hello there -- you goof-ball, use the -b option!" - # splits into - # Hello/ /there/ /--/ /you/ /goof-/ball,/ /use/ /the/ /-b/ /option! - # (after stripping out empty strings). - try: - wordsep_re = re.compile(r'(\s+|' # any whitespace - r'[^\s\w]*\w{2,}-(?=\w{2,})|' # hyphenated words - r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))') # em-dash - except re.error: - # Pre-2.0 Python versions don't have the (?<= negative look-behind - # assertion. It mostly doesn't matter for the simple input - # SCons is going to give it, so just leave it out. - wordsep_re = re.compile(r'(\s+|' # any whitespace - r'-*\w{2,}-(?=\w{2,}))') # hyphenated words - - # XXX will there be a locale-or-charset-aware version of - # string.lowercase in 2.3? - sentence_end_re = re.compile(r'[%s]' # lowercase letter - r'[\.\!\?]' # sentence-ending punct. - r'[\"\']?' # optional end-of-quote - % string.lowercase) - - - def __init__(self, - width=70, - initial_indent="", - subsequent_indent="", - expand_tabs=True, - replace_whitespace=True, - fix_sentence_endings=False, - break_long_words=True): - self.width = width - self.initial_indent = initial_indent - self.subsequent_indent = subsequent_indent - self.expand_tabs = expand_tabs - self.replace_whitespace = replace_whitespace - self.fix_sentence_endings = fix_sentence_endings - self.break_long_words = break_long_words - - - # -- Private methods ----------------------------------------------- - # (possibly useful for subclasses to override) - - def _munge_whitespace(self, text): - """_munge_whitespace(text : string) -> string - - Munge whitespace in text: expand tabs and convert all other - whitespace characters to spaces. Eg. " foo\tbar\n\nbaz" - becomes " foo bar baz". - """ - if self.expand_tabs: - text = string.expandtabs(text) - if self.replace_whitespace: - if type(text) == type(''): - text = string.translate(text, self.whitespace_trans) - elif isinstance(text, unicode): - text = string.translate(text, self.unicode_whitespace_trans) - return text - - - def _split(self, text): - """_split(text : string) -> [string] - - Split the text to wrap into indivisible chunks. Chunks are - not quite the same as words; see wrap_chunks() for full - details. As an example, the text - Look, goof-ball -- use the -b option! - breaks into the following chunks: - 'Look,', ' ', 'goof-', 'ball', ' ', '--', ' ', - 'use', ' ', 'the', ' ', '-b', ' ', 'option!' - """ - chunks = self.wordsep_re.split(text) - chunks = filter(None, chunks) - return chunks - - def _fix_sentence_endings(self, chunks): - """_fix_sentence_endings(chunks : [string]) - - Correct for sentence endings buried in 'chunks'. Eg. when the - original text contains "... foo.\nBar ...", munge_whitespace() - and split() will convert that to [..., "foo.", " ", "Bar", ...] - which has one too few spaces; this method simply changes the one - space to two. - """ - i = 0 - pat = self.sentence_end_re - while i < len(chunks)-1: - if chunks[i+1] == " " and pat.search(chunks[i]): - chunks[i+1] = " " - i = i + 2 - else: - i = i + 1 - - def _handle_long_word(self, chunks, cur_line, cur_len, width): - """_handle_long_word(chunks : [string], - cur_line : [string], - cur_len : int, width : int) - - Handle a chunk of text (most likely a word, not whitespace) that - is too long to fit in any line. - """ - space_left = max(width - cur_len, 1) - - # If we're allowed to break long words, then do so: put as much - # of the next chunk onto the current line as will fit. - if self.break_long_words: - cur_line.append(chunks[0][0:space_left]) - chunks[0] = chunks[0][space_left:] - - # Otherwise, we have to preserve the long word intact. Only add - # it to the current line if there's nothing already there -- - # that minimizes how much we violate the width constraint. - elif not cur_line: - cur_line.append(chunks.pop(0)) - - # If we're not allowed to break long words, and there's already - # text on the current line, do nothing. Next time through the - # main loop of _wrap_chunks(), we'll wind up here again, but - # cur_len will be zero, so the next line will be entirely - # devoted to the long word that we can't handle right now. - - def _wrap_chunks(self, chunks): - """_wrap_chunks(chunks : [string]) -> [string] - - Wrap a sequence of text chunks and return a list of lines of - length 'self.width' or less. (If 'break_long_words' is false, - some lines may be longer than this.) Chunks correspond roughly - to words and the whitespace between them: each chunk is - indivisible (modulo 'break_long_words'), but a line break can - come between any two chunks. Chunks should not have internal - whitespace; ie. a chunk is either all whitespace or a "word". - Whitespace chunks will be removed from the beginning and end of - lines, but apart from that whitespace is preserved. - """ - lines = [] - if self.width <= 0: - raise ValueError("invalid width %r (must be > 0)" % self.width) - - while chunks: - - # Start the list of chunks that will make up the current line. - # cur_len is just the length of all the chunks in cur_line. - cur_line = [] - cur_len = 0 - - # Figure out which static string will prefix this line. - if lines: - indent = self.subsequent_indent - else: - indent = self.initial_indent - - # Maximum width for this line. - width = self.width - len(indent) - - # First chunk on line is whitespace -- drop it, unless this - # is the very beginning of the text (ie. no lines started yet). - if string.strip(chunks[0]) == '' and lines: - del chunks[0] - - while chunks: - l = len(chunks[0]) - - # Can at least squeeze this chunk onto the current line. - if cur_len + l <= width: - cur_line.append(chunks.pop(0)) - cur_len = cur_len + l - - # Nope, this line is full. - else: - break - - # The current line is full, and the next chunk is too big to - # fit on *any* line (not just this one). - if chunks and len(chunks[0]) > width: - self._handle_long_word(chunks, cur_line, cur_len, width) - - # If the last chunk on this line is all whitespace, drop it. - if cur_line and string.strip(cur_line[-1]) == '': - del cur_line[-1] - - # Convert current line back to a string and store it in list - # of all lines (return value). - if cur_line: - lines.append(indent + string.join(cur_line, '')) - - return lines - - - # -- Public interface ---------------------------------------------- - - def wrap(self, text): - """wrap(text : string) -> [string] - - Reformat the single paragraph in 'text' so it fits in lines of - no more than 'self.width' columns, and return a list of wrapped - lines. Tabs in 'text' are expanded with string.expandtabs(), - and all other whitespace characters (including newline) are - converted to space. - """ - text = self._munge_whitespace(text) - indent = self.initial_indent - chunks = self._split(text) - if self.fix_sentence_endings: - self._fix_sentence_endings(chunks) - return self._wrap_chunks(chunks) - - def fill(self, text): - """fill(text : string) -> string - - Reformat the single paragraph in 'text' to fit in lines of no - more than 'self.width' columns, and return a new string - containing the entire wrapped paragraph. - """ - return string.join(self.wrap(text), "\n") - - -# -- Convenience interface --------------------------------------------- - -def wrap(text, width=70, **kwargs): - """Wrap a single paragraph of text, returning a list of wrapped lines. - - Reformat the single paragraph in 'text' so it fits in lines of no - more than 'width' columns, and return a list of wrapped lines. By - default, tabs in 'text' are expanded with string.expandtabs(), and - all other whitespace characters (including newline) are converted to - space. See TextWrapper class for available keyword args to customize - wrapping behaviour. - """ - kw = kwargs.copy() - kw['width'] = width - w = apply(TextWrapper, (), kw) - return w.wrap(text) - -def fill(text, width=70, **kwargs): - """Fill a single paragraph of text, returning a new string. - - Reformat the single paragraph in 'text' to fit in lines of no more - than 'width' columns, and return a new string containing the entire - wrapped paragraph. As with wrap(), tabs are expanded and other - whitespace characters converted to space. See TextWrapper class for - available keyword args to customize wrapping behaviour. - """ - kw = kwargs.copy() - kw['width'] = width - w = apply(TextWrapper, (), kw) - return w.fill(text) - - -# -- Loosely related functionality ------------------------------------- - -def dedent(text): - """dedent(text : string) -> string - - Remove any whitespace than can be uniformly removed from the left - of every line in `text`. - - This can be used e.g. to make triple-quoted strings line up with - the left edge of screen/whatever, while still presenting it in the - source code in indented form. - - For example: - - def test(): - # end first line with \ to avoid the empty line! - s = '''\ - hello - world - ''' - print repr(s) # prints ' hello\n world\n ' - print repr(dedent(s)) # prints 'hello\n world\n' - """ - lines = text.expandtabs().split('\n') - margin = None - for line in lines: - content = line.lstrip() - if not content: - continue - indent = len(line) - len(content) - if margin is None: - margin = indent - else: - margin = min(margin, indent) - - if margin is not None and margin > 0: - for i in range(len(lines)): - lines[i] = lines[i][margin:] - - return string.join(lines, '\n') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/compat/builtins.py b/3rdParty/SCons/scons-local/SCons/compat/builtins.py deleted file mode 100644 index f7267ca..0000000 --- a/3rdParty/SCons/scons-local/SCons/compat/builtins.py +++ /dev/null @@ -1,187 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -# Portions of the following are derived from the compat.py file in -# Twisted, under the following copyright: -# -# Copyright (c) 2001-2004 Twisted Matrix Laboratories - -__doc__ = """ -Compatibility idioms for __builtin__ names - -This module adds names to the __builtin__ module for things that we want -to use in SCons but which don't show up until later Python versions than -the earliest ones we support. - -This module checks for the following __builtin__ names: - - all() - any() - bool() - dict() - True - False - zip() - -Implementations of functions are *NOT* guaranteed to be fully compliant -with these functions in later versions of Python. We are only concerned -with adding functionality that we actually use in SCons, so be wary -if you lift this code for other uses. (That said, making these more -nearly the same as later, official versions is still a desirable goal, -we just don't need to be obsessive about it.) - -If you're looking at this with pydoc and various names don't show up in -the FUNCTIONS or DATA output, that means those names are already built in -to this version of Python and we don't need to add them from this module. -""" - -__revision__ = "src/engine/SCons/compat/builtins.py 4043 2009/02/23 09:06:45 scons" - -import __builtin__ - -try: - all -except NameError: - # Pre-2.5 Python has no all() function. - def all(iterable): - """ - Returns True if all elements of the iterable are true. - """ - for element in iterable: - if not element: - return False - return True - __builtin__.all = all - all = all - -try: - any -except NameError: - # Pre-2.5 Python has no any() function. - def any(iterable): - """ - Returns True if any element of the iterable is true. - """ - for element in iterable: - if element: - return True - return False - __builtin__.any = any - any = any - -try: - bool -except NameError: - # Pre-2.2 Python has no bool() function. - def bool(value): - """Demote a value to 0 or 1, depending on its truth value. - - This is not to be confused with types.BooleanType, which is - way too hard to duplicate in early Python versions to be - worth the trouble. - """ - return not not value - __builtin__.bool = bool - bool = bool - -try: - dict -except NameError: - # Pre-2.2 Python has no dict() keyword. - def dict(seq=[], **kwargs): - """ - New dictionary initialization. - """ - d = {} - for k, v in seq: - d[k] = v - d.update(kwargs) - return d - __builtin__.dict = dict - -try: - False -except NameError: - # Pre-2.2 Python has no False keyword. - __builtin__.False = not 1 - # Assign to False in this module namespace so it shows up in pydoc output. - False = False - -try: - True -except NameError: - # Pre-2.2 Python has no True keyword. - __builtin__.True = not 0 - # Assign to True in this module namespace so it shows up in pydoc output. - True = True - -try: - file -except NameError: - # Pre-2.2 Python has no file() function. - __builtin__.file = open - -# -try: - zip -except NameError: - # Pre-2.2 Python has no zip() function. - def zip(*lists): - """ - Emulates the behavior we need from the built-in zip() function - added in Python 2.2. - - Returns a list of tuples, where each tuple contains the i-th - element rom each of the argument sequences. The returned - list is truncated in length to the length of the shortest - argument sequence. - """ - result = [] - for i in xrange(min(map(len, lists))): - result.append(tuple(map(lambda l, i=i: l[i], lists))) - return result - __builtin__.zip = zip - - - -#if sys.version_info[:3] in ((2, 2, 0), (2, 2, 1)): -# def lstrip(s, c=string.whitespace): -# while s and s[0] in c: -# s = s[1:] -# return s -# def rstrip(s, c=string.whitespace): -# while s and s[-1] in c: -# s = s[:-1] -# return s -# def strip(s, c=string.whitespace, l=lstrip, r=rstrip): -# return l(r(s, c), c) -# -# object.__setattr__(str, 'lstrip', lstrip) -# object.__setattr__(str, 'rstrip', rstrip) -# object.__setattr__(str, 'strip', strip) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/cpp.py b/3rdParty/SCons/scons-local/SCons/cpp.py deleted file mode 100644 index 006a9b4..0000000 --- a/3rdParty/SCons/scons-local/SCons/cpp.py +++ /dev/null @@ -1,598 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/cpp.py 4043 2009/02/23 09:06:45 scons" - -__doc__ = """ -SCons C Pre-Processor module -""" - -# TODO(1.5): remove this import -# This module doesn't use anything from SCons by name, but we import SCons -# here to pull in zip() from the SCons.compat layer for early Pythons. -import SCons - -import os -import re -import string - -# -# First "subsystem" of regular expressions that we set up: -# -# Stuff to turn the C preprocessor directives in a file's contents into -# a list of tuples that we can process easily. -# - -# A table of regular expressions that fetch the arguments from the rest of -# a C preprocessor line. Different directives have different arguments -# that we want to fetch, using the regular expressions to which the lists -# of preprocessor directives map. -cpp_lines_dict = { - # Fetch the rest of a #if/#elif/#ifdef/#ifndef as one argument, - # separated from the keyword by white space. - ('if', 'elif', 'ifdef', 'ifndef',) - : '\s+(.+)', - - # Fetch the rest of a #import/#include/#include_next line as one - # argument, with white space optional. - ('import', 'include', 'include_next',) - : '\s*(.+)', - - # We don't care what comes after a #else or #endif line. - ('else', 'endif',) : '', - - # Fetch three arguments from a #define line: - # 1) The #defined keyword. - # 2) The optional parentheses and arguments (if it's a function-like - # macro, '' if it's not). - # 3) The expansion value. - ('define',) : '\s+([_A-Za-z][_A-Za-z0-9_]+)(\([^)]*\))?\s*(.*)', - - # Fetch the #undefed keyword from a #undef line. - ('undef',) : '\s+([_A-Za-z][A-Za-z0-9_]+)', -} - -# Create a table that maps each individual C preprocessor directive to -# the corresponding compiled regular expression that fetches the arguments -# we care about. -Table = {} -for op_list, expr in cpp_lines_dict.items(): - e = re.compile(expr) - for op in op_list: - Table[op] = e -del e -del op -del op_list - -# Create a list of the expressions we'll use to match all of the -# preprocessor directives. These are the same as the directives -# themselves *except* that we must use a negative lookahead assertion -# when matching "if" so it doesn't match the "if" in "ifdef." -override = { - 'if' : 'if(?!def)', -} -l = map(lambda x, o=override: o.get(x, x), Table.keys()) - - -# Turn the list of expressions into one big honkin' regular expression -# that will match all the preprocessor lines at once. This will return -# a list of tuples, one for each preprocessor line. The preprocessor -# directive will be the first element in each tuple, and the rest of -# the line will be the second element. -e = '^\s*#\s*(' + string.join(l, '|') + ')(.*)$' - -# And last but not least, compile the expression. -CPP_Expression = re.compile(e, re.M) - - - - -# -# Second "subsystem" of regular expressions that we set up: -# -# Stuff to translate a C preprocessor expression (as found on a #if or -# #elif line) into an equivalent Python expression that we can eval(). -# - -# A dictionary that maps the C representation of Boolean operators -# to their Python equivalents. -CPP_to_Python_Ops_Dict = { - '!' : ' not ', - '!=' : ' != ', - '&&' : ' and ', - '||' : ' or ', - '?' : ' and ', - ':' : ' or ', - '\r' : '', -} - -CPP_to_Python_Ops_Sub = lambda m, d=CPP_to_Python_Ops_Dict: d[m.group(0)] - -# We have to sort the keys by length so that longer expressions -# come *before* shorter expressions--in particular, "!=" must -# come before "!" in the alternation. Without this, the Python -# re module, as late as version 2.2.2, empirically matches the -# "!" in "!=" first, instead of finding the longest match. -# What's up with that? -l = CPP_to_Python_Ops_Dict.keys() -l.sort(lambda a, b: cmp(len(b), len(a))) - -# Turn the list of keys into one regular expression that will allow us -# to substitute all of the operators at once. -expr = string.join(map(re.escape, l), '|') - -# ...and compile the expression. -CPP_to_Python_Ops_Expression = re.compile(expr) - -# A separate list of expressions to be evaluated and substituted -# sequentially, not all at once. -CPP_to_Python_Eval_List = [ - ['defined\s+(\w+)', '__dict__.has_key("\\1")'], - ['defined\s*\((\w+)\)', '__dict__.has_key("\\1")'], - ['/\*.*\*/', ''], - ['/\*.*', ''], - ['//.*', ''], - ['(0x[0-9A-Fa-f]*)[UL]+', '\\1L'], -] - -# Replace the string representations of the regular expressions in the -# list with compiled versions. -for l in CPP_to_Python_Eval_List: - l[0] = re.compile(l[0]) - -# Wrap up all of the above into a handy function. -def CPP_to_Python(s): - """ - Converts a C pre-processor expression into an equivalent - Python expression that can be evaluated. - """ - s = CPP_to_Python_Ops_Expression.sub(CPP_to_Python_Ops_Sub, s) - for expr, repl in CPP_to_Python_Eval_List: - s = expr.sub(repl, s) - return s - - - -del expr -del l -del override - - - -class FunctionEvaluator: - """ - Handles delayed evaluation of a #define function call. - """ - def __init__(self, name, args, expansion): - """ - Squirrels away the arguments and expansion value of a #define - macro function for later evaluation when we must actually expand - a value that uses it. - """ - self.name = name - self.args = function_arg_separator.split(args) - try: - expansion = string.split(expansion, '##') - except (AttributeError, TypeError): - # Python 1.5 throws TypeError if "expansion" isn't a string, - # later versions throw AttributeError. - pass - self.expansion = expansion - def __call__(self, *values): - """ - Evaluates the expansion of a #define macro function called - with the specified values. - """ - if len(self.args) != len(values): - raise ValueError, "Incorrect number of arguments to `%s'" % self.name - # Create a dictionary that maps the macro arguments to the - # corresponding values in this "call." We'll use this when we - # eval() the expansion so that arguments will get expanded to - # the right values. - locals = {} - for k, v in zip(self.args, values): - locals[k] = v - - parts = [] - for s in self.expansion: - if not s in self.args: - s = repr(s) - parts.append(s) - statement = string.join(parts, ' + ') - - return eval(statement, globals(), locals) - - - -# Find line continuations. -line_continuations = re.compile('\\\\\r?\n') - -# Search for a "function call" macro on an expansion. Returns the -# two-tuple of the "function" name itself, and a string containing the -# arguments within the call parentheses. -function_name = re.compile('(\S+)\(([^)]*)\)') - -# Split a string containing comma-separated function call arguments into -# the separate arguments. -function_arg_separator = re.compile(',\s*') - - - -class PreProcessor: - """ - The main workhorse class for handling C pre-processing. - """ - def __init__(self, current=os.curdir, cpppath=(), dict={}, all=0): - global Table - - cpppath = tuple(cpppath) - - self.searchpath = { - '"' : (current,) + cpppath, - '<' : cpppath + (current,), - } - - # Initialize our C preprocessor namespace for tracking the - # values of #defined keywords. We use this namespace to look - # for keywords on #ifdef/#ifndef lines, and to eval() the - # expressions on #if/#elif lines (after massaging them from C to - # Python). - self.cpp_namespace = dict.copy() - self.cpp_namespace['__dict__'] = self.cpp_namespace - - if all: - self.do_include = self.all_include - - # For efficiency, a dispatch table maps each C preprocessor - # directive (#if, #define, etc.) to the method that should be - # called when we see it. We accomodate state changes (#if, - # #ifdef, #ifndef) by pushing the current dispatch table on a - # stack and changing what method gets called for each relevant - # directive we might see next at this level (#else, #elif). - # #endif will simply pop the stack. - d = { - 'scons_current_file' : self.scons_current_file - } - for op in Table.keys(): - d[op] = getattr(self, 'do_' + op) - self.default_table = d - - # Controlling methods. - - def tupleize(self, contents): - """ - Turns the contents of a file into a list of easily-processed - tuples describing the CPP lines in the file. - - The first element of each tuple is the line's preprocessor - directive (#if, #include, #define, etc., minus the initial '#'). - The remaining elements are specific to the type of directive, as - pulled apart by the regular expression. - """ - global CPP_Expression, Table - contents = line_continuations.sub('', contents) - cpp_tuples = CPP_Expression.findall(contents) - return map(lambda m, t=Table: - (m[0],) + t[m[0]].match(m[1]).groups(), - cpp_tuples) - - def __call__(self, file): - """ - Pre-processes a file. - - This is the main public entry point. - """ - self.current_file = file - return self.process_contents(self.read_file(file), file) - - def process_contents(self, contents, fname=None): - """ - Pre-processes a file contents. - - This is the main internal entry point. - """ - self.stack = [] - self.dispatch_table = self.default_table.copy() - self.current_file = fname - self.tuples = self.tupleize(contents) - - self.initialize_result(fname) - while self.tuples: - t = self.tuples.pop(0) - # Uncomment to see the list of tuples being processed (e.g., - # to validate the CPP lines are being translated correctly). - #print t - self.dispatch_table[t[0]](t) - return self.finalize_result(fname) - - # Dispatch table stack manipulation methods. - - def save(self): - """ - Pushes the current dispatch table on the stack and re-initializes - the current dispatch table to the default. - """ - self.stack.append(self.dispatch_table) - self.dispatch_table = self.default_table.copy() - - def restore(self): - """ - Pops the previous dispatch table off the stack and makes it the - current one. - """ - try: self.dispatch_table = self.stack.pop() - except IndexError: pass - - # Utility methods. - - def do_nothing(self, t): - """ - Null method for when we explicitly want the action for a - specific preprocessor directive to do nothing. - """ - pass - - def scons_current_file(self, t): - self.current_file = t[1] - - def eval_expression(self, t): - """ - Evaluates a C preprocessor expression. - - This is done by converting it to a Python equivalent and - eval()ing it in the C preprocessor namespace we use to - track #define values. - """ - t = CPP_to_Python(string.join(t[1:])) - try: return eval(t, self.cpp_namespace) - except (NameError, TypeError): return 0 - - def initialize_result(self, fname): - self.result = [fname] - - def finalize_result(self, fname): - return self.result[1:] - - def find_include_file(self, t): - """ - Finds the #include file for a given preprocessor tuple. - """ - fname = t[2] - for d in self.searchpath[t[1]]: - if d == os.curdir: - f = fname - else: - f = os.path.join(d, fname) - if os.path.isfile(f): - return f - return None - - def read_file(self, file): - return open(file).read() - - # Start and stop processing include lines. - - def start_handling_includes(self, t=None): - """ - Causes the PreProcessor object to start processing #import, - #include and #include_next lines. - - This method will be called when a #if, #ifdef, #ifndef or #elif - evaluates True, or when we reach the #else in a #if, #ifdef, - #ifndef or #elif block where a condition already evaluated - False. - - """ - d = self.dispatch_table - d['import'] = self.do_import - d['include'] = self.do_include - d['include_next'] = self.do_include - - def stop_handling_includes(self, t=None): - """ - Causes the PreProcessor object to stop processing #import, - #include and #include_next lines. - - This method will be called when a #if, #ifdef, #ifndef or #elif - evaluates False, or when we reach the #else in a #if, #ifdef, - #ifndef or #elif block where a condition already evaluated True. - """ - d = self.dispatch_table - d['import'] = self.do_nothing - d['include'] = self.do_nothing - d['include_next'] = self.do_nothing - - # Default methods for handling all of the preprocessor directives. - # (Note that what actually gets called for a given directive at any - # point in time is really controlled by the dispatch_table.) - - def _do_if_else_condition(self, condition): - """ - Common logic for evaluating the conditions on #if, #ifdef and - #ifndef lines. - """ - self.save() - d = self.dispatch_table - if condition: - self.start_handling_includes() - d['elif'] = self.stop_handling_includes - d['else'] = self.stop_handling_includes - else: - self.stop_handling_includes() - d['elif'] = self.do_elif - d['else'] = self.start_handling_includes - - def do_ifdef(self, t): - """ - Default handling of a #ifdef line. - """ - self._do_if_else_condition(self.cpp_namespace.has_key(t[1])) - - def do_ifndef(self, t): - """ - Default handling of a #ifndef line. - """ - self._do_if_else_condition(not self.cpp_namespace.has_key(t[1])) - - def do_if(self, t): - """ - Default handling of a #if line. - """ - self._do_if_else_condition(self.eval_expression(t)) - - def do_elif(self, t): - """ - Default handling of a #elif line. - """ - d = self.dispatch_table - if self.eval_expression(t): - self.start_handling_includes() - d['elif'] = self.stop_handling_includes - d['else'] = self.stop_handling_includes - - def do_else(self, t): - """ - Default handling of a #else line. - """ - pass - - def do_endif(self, t): - """ - Default handling of a #endif line. - """ - self.restore() - - def do_define(self, t): - """ - Default handling of a #define line. - """ - _, name, args, expansion = t - try: - expansion = int(expansion) - except (TypeError, ValueError): - pass - if args: - evaluator = FunctionEvaluator(name, args[1:-1], expansion) - self.cpp_namespace[name] = evaluator - else: - self.cpp_namespace[name] = expansion - - def do_undef(self, t): - """ - Default handling of a #undef line. - """ - try: del self.cpp_namespace[t[1]] - except KeyError: pass - - def do_import(self, t): - """ - Default handling of a #import line. - """ - # XXX finish this -- maybe borrow/share logic from do_include()...? - pass - - def do_include(self, t): - """ - Default handling of a #include line. - """ - t = self.resolve_include(t) - include_file = self.find_include_file(t) - if include_file: - #print "include_file =", include_file - self.result.append(include_file) - contents = self.read_file(include_file) - new_tuples = [('scons_current_file', include_file)] + \ - self.tupleize(contents) + \ - [('scons_current_file', self.current_file)] - self.tuples[:] = new_tuples + self.tuples - - # Date: Tue, 22 Nov 2005 20:26:09 -0500 - # From: Stefan Seefeld <seefeld@sympatico.ca> - # - # By the way, #include_next is not the same as #include. The difference - # being that #include_next starts its search in the path following the - # path that let to the including file. In other words, if your system - # include paths are ['/foo', '/bar'], and you are looking at a header - # '/foo/baz.h', it might issue an '#include_next <baz.h>' which would - # correctly resolve to '/bar/baz.h' (if that exists), but *not* see - # '/foo/baz.h' again. See http://www.delorie.com/gnu/docs/gcc/cpp_11.html - # for more reasoning. - # - # I have no idea in what context 'import' might be used. - - # XXX is #include_next really the same as #include ? - do_include_next = do_include - - # Utility methods for handling resolution of include files. - - def resolve_include(self, t): - """Resolve a tuple-ized #include line. - - This handles recursive expansion of values without "" or <> - surrounding the name until an initial " or < is found, to handle - #include FILE - where FILE is a #define somewhere else. - """ - s = t[1] - while not s[0] in '<"': - #print "s =", s - try: - s = self.cpp_namespace[s] - except KeyError: - m = function_name.search(s) - s = self.cpp_namespace[m.group(1)] - if callable(s): - args = function_arg_separator.split(m.group(2)) - s = apply(s, args) - if not s: - return None - return (t[0], s[0], s[1:-1]) - - def all_include(self, t): - """ - """ - self.result.append(self.resolve_include(t)) - -class DumbPreProcessor(PreProcessor): - """A preprocessor that ignores all #if/#elif/#else/#endif directives - and just reports back *all* of the #include files (like the classic - SCons scanner did). - - This is functionally equivalent to using a regular expression to - find all of the #include lines, only slower. It exists mainly as - an example of how the main PreProcessor class can be sub-classed - to tailor its behavior. - """ - def __init__(self, *args, **kw): - apply(PreProcessor.__init__, (self,)+args, kw) - d = self.default_table - for func in ['if', 'elif', 'else', 'endif', 'ifdef', 'ifndef']: - d[func] = d[func] = self.do_nothing - -del __revision__ - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/dblite.py b/3rdParty/SCons/scons-local/SCons/dblite.py deleted file mode 100644 index 6d4cfd5..0000000 --- a/3rdParty/SCons/scons-local/SCons/dblite.py +++ /dev/null @@ -1,225 +0,0 @@ -# dblite.py module contributed by Ralf W. Grosse-Kunstleve. -# Extended for Unicode by Steven Knight. - -import cPickle -import time -import shutil -import os -import types -import __builtin__ - -keep_all_files = 00000 -ignore_corrupt_dbfiles = 0 - -def corruption_warning(filename): - print "Warning: Discarding corrupt database:", filename - -if hasattr(types, 'UnicodeType'): - def is_string(s): - t = type(s) - return t is types.StringType or t is types.UnicodeType -else: - def is_string(s): - return type(s) is types.StringType - -try: - unicode('a') -except NameError: - def unicode(s): return s - -dblite_suffix = '.dblite' -tmp_suffix = '.tmp' - -class dblite: - - # Squirrel away references to the functions in various modules - # that we'll use when our __del__() method calls our sync() method - # during shutdown. We might get destroyed when Python is in the midst - # of tearing down the different modules we import in an essentially - # arbitrary order, and some of the various modules's global attributes - # may already be wiped out from under us. - # - # See the discussion at: - # http://mail.python.org/pipermail/python-bugs-list/2003-March/016877.html - - _open = __builtin__.open - _cPickle_dump = cPickle.dump - _os_chmod = os.chmod - _os_rename = os.rename - _os_unlink = os.unlink - _shutil_copyfile = shutil.copyfile - _time_time = time.time - - def __init__(self, file_base_name, flag, mode): - assert flag in (None, "r", "w", "c", "n") - if (flag is None): flag = "r" - base, ext = os.path.splitext(file_base_name) - if ext == dblite_suffix: - # There's already a suffix on the file name, don't add one. - self._file_name = file_base_name - self._tmp_name = base + tmp_suffix - else: - self._file_name = file_base_name + dblite_suffix - self._tmp_name = file_base_name + tmp_suffix - self._flag = flag - self._mode = mode - self._dict = {} - self._needs_sync = 00000 - if (self._flag == "n"): - self._open(self._file_name, "wb", self._mode) - else: - try: - f = self._open(self._file_name, "rb") - except IOError, e: - if (self._flag != "c"): - raise e - self._open(self._file_name, "wb", self._mode) - else: - p = f.read() - if (len(p) > 0): - try: - self._dict = cPickle.loads(p) - except (cPickle.UnpicklingError, EOFError): - if (ignore_corrupt_dbfiles == 0): raise - if (ignore_corrupt_dbfiles == 1): - corruption_warning(self._file_name) - - def __del__(self): - if (self._needs_sync): - self.sync() - - def sync(self): - self._check_writable() - f = self._open(self._tmp_name, "wb", self._mode) - self._cPickle_dump(self._dict, f, 1) - f.close() - # Windows doesn't allow renaming if the file exists, so unlink - # it first, chmod'ing it to make sure we can do so. On UNIX, we - # may not be able to chmod the file if it's owned by someone else - # (e.g. from a previous run as root). We should still be able to - # unlink() the file if the directory's writable, though, so ignore - # any OSError exception thrown by the chmod() call. - try: self._os_chmod(self._file_name, 0777) - except OSError: pass - self._os_unlink(self._file_name) - self._os_rename(self._tmp_name, self._file_name) - self._needs_sync = 00000 - if (keep_all_files): - self._shutil_copyfile( - self._file_name, - self._file_name + "_" + str(int(self._time_time()))) - - def _check_writable(self): - if (self._flag == "r"): - raise IOError("Read-only database: %s" % self._file_name) - - def __getitem__(self, key): - return self._dict[key] - - def __setitem__(self, key, value): - self._check_writable() - if (not is_string(key)): - raise TypeError, "key `%s' must be a string but is %s" % (key, type(key)) - if (not is_string(value)): - raise TypeError, "value `%s' must be a string but is %s" % (value, type(value)) - self._dict[key] = value - self._needs_sync = 0001 - - def keys(self): - return self._dict.keys() - - def has_key(self, key): - return key in self._dict - - def __contains__(self, key): - return key in self._dict - - def iterkeys(self): - return self._dict.iterkeys() - - __iter__ = iterkeys - - def __len__(self): - return len(self._dict) - -def open(file, flag=None, mode=0666): - return dblite(file, flag, mode) - -def _exercise(): - db = open("tmp", "n") - assert len(db) == 0 - db["foo"] = "bar" - assert db["foo"] == "bar" - db[unicode("ufoo")] = unicode("ubar") - assert db[unicode("ufoo")] == unicode("ubar") - db.sync() - db = open("tmp", "c") - assert len(db) == 2, len(db) - assert db["foo"] == "bar" - db["bar"] = "foo" - assert db["bar"] == "foo" - db[unicode("ubar")] = unicode("ufoo") - assert db[unicode("ubar")] == unicode("ufoo") - db.sync() - db = open("tmp", "r") - assert len(db) == 4, len(db) - assert db["foo"] == "bar" - assert db["bar"] == "foo" - assert db[unicode("ufoo")] == unicode("ubar") - assert db[unicode("ubar")] == unicode("ufoo") - try: - db.sync() - except IOError, e: - assert str(e) == "Read-only database: tmp.dblite" - else: - raise RuntimeError, "IOError expected." - db = open("tmp", "w") - assert len(db) == 4 - db["ping"] = "pong" - db.sync() - try: - db[(1,2)] = "tuple" - except TypeError, e: - assert str(e) == "key `(1, 2)' must be a string but is <type 'tuple'>", str(e) - else: - raise RuntimeError, "TypeError exception expected" - try: - db["list"] = [1,2] - except TypeError, e: - assert str(e) == "value `[1, 2]' must be a string but is <type 'list'>", str(e) - else: - raise RuntimeError, "TypeError exception expected" - db = open("tmp", "r") - assert len(db) == 5 - db = open("tmp", "n") - assert len(db) == 0 - _open("tmp.dblite", "w") - db = open("tmp", "r") - _open("tmp.dblite", "w").write("x") - try: - db = open("tmp", "r") - except cPickle.UnpicklingError: - pass - else: - raise RuntimeError, "cPickle exception expected." - global ignore_corrupt_dbfiles - ignore_corrupt_dbfiles = 2 - db = open("tmp", "r") - assert len(db) == 0 - os.unlink("tmp.dblite") - try: - db = open("tmp", "w") - except IOError, e: - assert str(e) == "[Errno 2] No such file or directory: 'tmp.dblite'", str(e) - else: - raise RuntimeError, "IOError expected." - print "OK" - -if (__name__ == "__main__"): - _exercise() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-local/SCons/exitfuncs.py b/3rdParty/SCons/scons-local/SCons/exitfuncs.py deleted file mode 100644 index ef244b5..0000000 --- a/3rdParty/SCons/scons-local/SCons/exitfuncs.py +++ /dev/null @@ -1,77 +0,0 @@ -"""SCons.exitfuncs - -Register functions which are executed when SCons exits for any reason. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/engine/SCons/exitfuncs.py 4043 2009/02/23 09:06:45 scons" - - - -_exithandlers = [] -def _run_exitfuncs(): - """run any registered exit functions - - _exithandlers is traversed in reverse order so functions are executed - last in, first out. - """ - - while _exithandlers: - func, targs, kargs = _exithandlers.pop() - apply(func, targs, kargs) - -def register(func, *targs, **kargs): - """register a function to be executed upon normal program termination - - func - function to be called at exit - targs - optional arguments to pass to func - kargs - optional keyword arguments to pass to func - """ - _exithandlers.append((func, targs, kargs)) - -import sys - -try: - x = sys.exitfunc - - # if x isn't our own exit func executive, assume it's another - # registered exit function - append it to our list... - if x != _run_exitfuncs: - register(x) - -except AttributeError: - pass - -# make our exit function get run by python when it exits: -sys.exitfunc = _run_exitfuncs - -del sys - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons-time.py b/3rdParty/SCons/scons-time.py deleted file mode 100755 index cbe8c42..0000000 --- a/3rdParty/SCons/scons-time.py +++ /dev/null @@ -1,1519 +0,0 @@ -#!/usr/bin/env python -# -# scons-time - run SCons timings and collect statistics -# -# A script for running a configuration through SCons with a standard -# set of invocations to collect timing and memory statistics and to -# capture the results in a consistent set of output files for display -# and analysis. -# - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -from __future__ import nested_scopes - -__revision__ = "src/script/scons-time.py 4043 2009/02/23 09:06:45 scons" - -import getopt -import glob -import os -import os.path -import re -import shutil -import string -import sys -import tempfile -import time - -try: - False -except NameError: - # Pre-2.2 Python has no False keyword. - import __builtin__ - __builtin__.False = not 1 - -try: - True -except NameError: - # Pre-2.2 Python has no True keyword. - import __builtin__ - __builtin__.True = not 0 - -def make_temp_file(**kw): - try: - result = tempfile.mktemp(**kw) - try: - result = os.path.realpath(result) - except AttributeError: - # Python 2.1 has no os.path.realpath() method. - pass - except TypeError: - try: - save_template = tempfile.template - prefix = kw['prefix'] - del kw['prefix'] - tempfile.template = prefix - result = tempfile.mktemp(**kw) - finally: - tempfile.template = save_template - return result - -class Plotter: - def increment_size(self, largest): - """ - Return the size of each horizontal increment line for a specified - maximum value. This returns a value that will provide somewhere - between 5 and 9 horizontal lines on the graph, on some set of - boundaries that are multiples of 10/100/1000/etc. - """ - i = largest / 5 - if not i: - return largest - multiplier = 1 - while i >= 10: - i = i / 10 - multiplier = multiplier * 10 - return i * multiplier - - def max_graph_value(self, largest): - # Round up to next integer. - largest = int(largest) + 1 - increment = self.increment_size(largest) - return ((largest + increment - 1) / increment) * increment - -class Line: - def __init__(self, points, type, title, label, comment, fmt="%s %s"): - self.points = points - self.type = type - self.title = title - self.label = label - self.comment = comment - self.fmt = fmt - - def print_label(self, inx, x, y): - if self.label: - print 'set label %s "%s" at %s,%s right' % (inx, self.label, x, y) - - def plot_string(self): - if self.title: - title_string = 'title "%s"' % self.title - else: - title_string = 'notitle' - return "'-' %s with lines lt %s" % (title_string, self.type) - - def print_points(self, fmt=None): - if fmt is None: - fmt = self.fmt - if self.comment: - print '# %s' % self.comment - for x, y in self.points: - # If y is None, it usually represents some kind of break - # in the line's index number. We might want to represent - # this some way rather than just drawing the line straight - # between the two points on either side. - if not y is None: - print fmt % (x, y) - print 'e' - - def get_x_values(self): - return [ p[0] for p in self.points ] - - def get_y_values(self): - return [ p[1] for p in self.points ] - -class Gnuplotter(Plotter): - - def __init__(self, title, key_location): - self.lines = [] - self.title = title - self.key_location = key_location - - def line(self, points, type, title=None, label=None, comment=None, fmt='%s %s'): - if points: - line = Line(points, type, title, label, comment, fmt) - self.lines.append(line) - - def plot_string(self, line): - return line.plot_string() - - def vertical_bar(self, x, type, label, comment): - if self.get_min_x() <= x and x <= self.get_max_x(): - points = [(x, 0), (x, self.max_graph_value(self.get_max_y()))] - self.line(points, type, label, comment) - - def get_all_x_values(self): - result = [] - for line in self.lines: - result.extend(line.get_x_values()) - return filter(lambda r: not r is None, result) - - def get_all_y_values(self): - result = [] - for line in self.lines: - result.extend(line.get_y_values()) - return filter(lambda r: not r is None, result) - - def get_min_x(self): - try: - return self.min_x - except AttributeError: - try: - self.min_x = min(self.get_all_x_values()) - except ValueError: - self.min_x = 0 - return self.min_x - - def get_max_x(self): - try: - return self.max_x - except AttributeError: - try: - self.max_x = max(self.get_all_x_values()) - except ValueError: - self.max_x = 0 - return self.max_x - - def get_min_y(self): - try: - return self.min_y - except AttributeError: - try: - self.min_y = min(self.get_all_y_values()) - except ValueError: - self.min_y = 0 - return self.min_y - - def get_max_y(self): - try: - return self.max_y - except AttributeError: - try: - self.max_y = max(self.get_all_y_values()) - except ValueError: - self.max_y = 0 - return self.max_y - - def draw(self): - - if not self.lines: - return - - if self.title: - print 'set title "%s"' % self.title - print 'set key %s' % self.key_location - - min_y = self.get_min_y() - max_y = self.max_graph_value(self.get_max_y()) - range = max_y - min_y - incr = range / 10.0 - start = min_y + (max_y / 2.0) + (2.0 * incr) - position = [ start - (i * incr) for i in xrange(5) ] - - inx = 1 - for line in self.lines: - line.print_label(inx, line.points[0][0]-1, - position[(inx-1) % len(position)]) - inx += 1 - - plot_strings = [ self.plot_string(l) for l in self.lines ] - print 'plot ' + ', \\\n '.join(plot_strings) - - for line in self.lines: - line.print_points() - - - -def untar(fname): - import tarfile - tar = tarfile.open(name=fname, mode='r') - for tarinfo in tar: - tar.extract(tarinfo) - tar.close() - -def unzip(fname): - import zipfile - zf = zipfile.ZipFile(fname, 'r') - for name in zf.namelist(): - dir = os.path.dirname(name) - try: - os.makedirs(dir) - except: - pass - open(name, 'w').write(zf.read(name)) - -def read_tree(dir): - def read_files(arg, dirname, fnames): - for fn in fnames: - fn = os.path.join(dirname, fn) - if os.path.isfile(fn): - open(fn, 'rb').read() - os.path.walk('.', read_files, None) - -def redirect_to_file(command, log): - return '%s > %s 2>&1' % (command, log) - -def tee_to_file(command, log): - return '%s 2>&1 | tee %s' % (command, log) - - - -class SConsTimer: - """ - Usage: scons-time SUBCOMMAND [ARGUMENTS] - Type "scons-time help SUBCOMMAND" for help on a specific subcommand. - - Available subcommands: - func Extract test-run data for a function - help Provides help - mem Extract --debug=memory data from test runs - obj Extract --debug=count data from test runs - time Extract --debug=time data from test runs - run Runs a test configuration - """ - - name = 'scons-time' - name_spaces = ' '*len(name) - - def makedict(**kw): - return kw - - default_settings = makedict( - aegis = 'aegis', - aegis_project = None, - chdir = None, - config_file = None, - initial_commands = [], - key_location = 'bottom left', - orig_cwd = os.getcwd(), - outdir = None, - prefix = '', - python = '"%s"' % sys.executable, - redirect = redirect_to_file, - scons = None, - scons_flags = '--debug=count --debug=memory --debug=time --debug=memoizer', - scons_lib_dir = None, - scons_wrapper = None, - startup_targets = '--help', - subdir = None, - subversion_url = None, - svn = 'svn', - svn_co_flag = '-q', - tar = 'tar', - targets = '', - targets0 = None, - targets1 = None, - targets2 = None, - title = None, - unzip = 'unzip', - verbose = False, - vertical_bars = [], - - unpack_map = { - '.tar.gz' : (untar, '%(tar)s xzf %%s'), - '.tgz' : (untar, '%(tar)s xzf %%s'), - '.tar' : (untar, '%(tar)s xf %%s'), - '.zip' : (unzip, '%(unzip)s %%s'), - }, - ) - - run_titles = [ - 'Startup', - 'Full build', - 'Up-to-date build', - ] - - run_commands = [ - '%(python)s %(scons_wrapper)s %(scons_flags)s --profile=%(prof0)s %(targets0)s', - '%(python)s %(scons_wrapper)s %(scons_flags)s --profile=%(prof1)s %(targets1)s', - '%(python)s %(scons_wrapper)s %(scons_flags)s --profile=%(prof2)s %(targets2)s', - ] - - stages = [ - 'pre-read', - 'post-read', - 'pre-build', - 'post-build', - ] - - stage_strings = { - 'pre-read' : 'Memory before reading SConscript files:', - 'post-read' : 'Memory after reading SConscript files:', - 'pre-build' : 'Memory before building targets:', - 'post-build' : 'Memory after building targets:', - } - - memory_string_all = 'Memory ' - - default_stage = stages[-1] - - time_strings = { - 'total' : 'Total build time', - 'SConscripts' : 'Total SConscript file execution time', - 'SCons' : 'Total SCons execution time', - 'commands' : 'Total command execution time', - } - - time_string_all = 'Total .* time' - - # - - def __init__(self): - self.__dict__.update(self.default_settings) - - # Functions for displaying and executing commands. - - def subst(self, x, dictionary): - try: - return x % dictionary - except TypeError: - # x isn't a string (it's probably a Python function), - # so just return it. - return x - - def subst_variables(self, command, dictionary): - """ - Substitutes (via the format operator) the values in the specified - dictionary into the specified command. - - The command can be an (action, string) tuple. In all cases, we - perform substitution on strings and don't worry if something isn't - a string. (It's probably a Python function to be executed.) - """ - try: - command + '' - except TypeError: - action = command[0] - string = command[1] - args = command[2:] - else: - action = command - string = action - args = (()) - action = self.subst(action, dictionary) - string = self.subst(string, dictionary) - return (action, string, args) - - def _do_not_display(self, msg, *args): - pass - - def display(self, msg, *args): - """ - Displays the specified message. - - Each message is prepended with a standard prefix of our name - plus the time. - """ - if callable(msg): - msg = msg(*args) - else: - msg = msg % args - if msg is None: - return - fmt = '%s[%s]: %s\n' - sys.stdout.write(fmt % (self.name, time.strftime('%H:%M:%S'), msg)) - - def _do_not_execute(self, action, *args): - pass - - def execute(self, action, *args): - """ - Executes the specified action. - - The action is called if it's a callable Python function, and - otherwise passed to os.system(). - """ - if callable(action): - action(*args) - else: - os.system(action % args) - - def run_command_list(self, commands, dict): - """ - Executes a list of commands, substituting values from the - specified dictionary. - """ - commands = [ self.subst_variables(c, dict) for c in commands ] - for action, string, args in commands: - self.display(string, *args) - sys.stdout.flush() - status = self.execute(action, *args) - if status: - sys.exit(status) - - def log_display(self, command, log): - command = self.subst(command, self.__dict__) - if log: - command = self.redirect(command, log) - return command - - def log_execute(self, command, log): - command = self.subst(command, self.__dict__) - output = os.popen(command).read() - if self.verbose: - sys.stdout.write(output) - open(log, 'wb').write(output) - - # - - def archive_splitext(self, path): - """ - Splits an archive name into a filename base and extension. - - This is like os.path.splitext() (which it calls) except that it - also looks for '.tar.gz' and treats it as an atomic extensions. - """ - if path.endswith('.tar.gz'): - return path[:-7], path[-7:] - else: - return os.path.splitext(path) - - def args_to_files(self, args, tail=None): - """ - Takes a list of arguments, expands any glob patterns, and - returns the last "tail" files from the list. - """ - files = [] - for a in args: - g = glob.glob(a) - g.sort() - files.extend(g) - - if tail: - files = files[-tail:] - - return files - - def ascii_table(self, files, columns, - line_function, file_function=lambda x: x, - *args, **kw): - - header_fmt = ' '.join(['%12s'] * len(columns)) - line_fmt = header_fmt + ' %s' - - print header_fmt % columns - - for file in files: - t = line_function(file, *args, **kw) - if t is None: - t = [] - diff = len(columns) - len(t) - if diff > 0: - t += [''] * diff - t.append(file_function(file)) - print line_fmt % tuple(t) - - def collect_results(self, files, function, *args, **kw): - results = {} - - for file in files: - base = os.path.splitext(file)[0] - run, index = string.split(base, '-')[-2:] - - run = int(run) - index = int(index) - - value = function(file, *args, **kw) - - try: - r = results[index] - except KeyError: - r = [] - results[index] = r - r.append((run, value)) - - return results - - def doc_to_help(self, obj): - """ - Translates an object's __doc__ string into help text. - - This strips a consistent number of spaces from each line in the - help text, essentially "outdenting" the text to the left-most - column. - """ - doc = obj.__doc__ - if doc is None: - return '' - return self.outdent(doc) - - def find_next_run_number(self, dir, prefix): - """ - Returns the next run number in a directory for the specified prefix. - - Examines the contents the specified directory for files with the - specified prefix, extracts the run numbers from each file name, - and returns the next run number after the largest it finds. - """ - x = re.compile(re.escape(prefix) + '-([0-9]+).*') - matches = map(lambda e, x=x: x.match(e), os.listdir(dir)) - matches = filter(None, matches) - if not matches: - return 0 - run_numbers = map(lambda m: int(m.group(1)), matches) - return int(max(run_numbers)) + 1 - - def gnuplot_results(self, results, fmt='%s %.3f'): - """ - Prints out a set of results in Gnuplot format. - """ - gp = Gnuplotter(self.title, self.key_location) - - indices = results.keys() - indices.sort() - - for i in indices: - try: - t = self.run_titles[i] - except IndexError: - t = '??? %s ???' % i - results[i].sort() - gp.line(results[i], i+1, t, None, t, fmt=fmt) - - for bar_tuple in self.vertical_bars: - try: - x, type, label, comment = bar_tuple - except ValueError: - x, type, label = bar_tuple - comment = label - gp.vertical_bar(x, type, label, comment) - - gp.draw() - - def logfile_name(self, invocation): - """ - Returns the absolute path of a log file for the specificed - invocation number. - """ - name = self.prefix_run + '-%d.log' % invocation - return os.path.join(self.outdir, name) - - def outdent(self, s): - """ - Strip as many spaces from each line as are found at the beginning - of the first line in the list. - """ - lines = s.split('\n') - if lines[0] == '': - lines = lines[1:] - spaces = re.match(' *', lines[0]).group(0) - def strip_initial_spaces(l, s=spaces): - if l.startswith(spaces): - l = l[len(spaces):] - return l - return '\n'.join([ strip_initial_spaces(l) for l in lines ]) + '\n' - - def profile_name(self, invocation): - """ - Returns the absolute path of a profile file for the specified - invocation number. - """ - name = self.prefix_run + '-%d.prof' % invocation - return os.path.join(self.outdir, name) - - def set_env(self, key, value): - os.environ[key] = value - - # - - def get_debug_times(self, file, time_string=None): - """ - Fetch times from the --debug=time strings in the specified file. - """ - if time_string is None: - search_string = self.time_string_all - else: - search_string = time_string - contents = open(file).read() - if not contents: - sys.stderr.write('file %s has no contents!\n' % repr(file)) - return None - result = re.findall(r'%s: ([\d\.]*)' % search_string, contents)[-4:] - result = [ float(r) for r in result ] - if not time_string is None: - try: - result = result[0] - except IndexError: - sys.stderr.write('file %s has no results!\n' % repr(file)) - return None - return result - - def get_function_profile(self, file, function): - """ - Returns the file, line number, function name, and cumulative time. - """ - try: - import pstats - except ImportError, e: - sys.stderr.write('%s: func: %s\n' % (self.name, e)) - sys.stderr.write('%s This version of Python is missing the profiler.\n' % self.name_spaces) - sys.stderr.write('%s Cannot use the "func" subcommand.\n' % self.name_spaces) - sys.exit(1) - statistics = pstats.Stats(file).stats - matches = [ e for e in statistics.items() if e[0][2] == function ] - r = matches[0] - return r[0][0], r[0][1], r[0][2], r[1][3] - - def get_function_time(self, file, function): - """ - Returns just the cumulative time for the specified function. - """ - return self.get_function_profile(file, function)[3] - - def get_memory(self, file, memory_string=None): - """ - Returns a list of integers of the amount of memory used. The - default behavior is to return all the stages. - """ - if memory_string is None: - search_string = self.memory_string_all - else: - search_string = memory_string - lines = open(file).readlines() - lines = [ l for l in lines if l.startswith(search_string) ][-4:] - result = [ int(l.split()[-1]) for l in lines[-4:] ] - if len(result) == 1: - result = result[0] - return result - - def get_object_counts(self, file, object_name, index=None): - """ - Returns the counts of the specified object_name. - """ - object_string = ' ' + object_name + '\n' - lines = open(file).readlines() - line = [ l for l in lines if l.endswith(object_string) ][0] - result = [ int(field) for field in line.split()[:4] ] - if not index is None: - result = result[index] - return result - - # - - command_alias = {} - - def execute_subcommand(self, argv): - """ - Executes the do_*() function for the specified subcommand (argv[0]). - """ - if not argv: - return - cmdName = self.command_alias.get(argv[0], argv[0]) - try: - func = getattr(self, 'do_' + cmdName) - except AttributeError: - return self.default(argv) - try: - return func(argv) - except TypeError, e: - sys.stderr.write("%s %s: %s\n" % (self.name, cmdName, e)) - import traceback - traceback.print_exc(file=sys.stderr) - sys.stderr.write("Try '%s help %s'\n" % (self.name, cmdName)) - - def default(self, argv): - """ - The default behavior for an unknown subcommand. Prints an - error message and exits. - """ - sys.stderr.write('%s: Unknown subcommand "%s".\n' % (self.name, argv[0])) - sys.stderr.write('Type "%s help" for usage.\n' % self.name) - sys.exit(1) - - # - - def do_help(self, argv): - """ - """ - if argv[1:]: - for arg in argv[1:]: - try: - func = getattr(self, 'do_' + arg) - except AttributeError: - sys.stderr.write('%s: No help for "%s"\n' % (self.name, arg)) - else: - try: - help = getattr(self, 'help_' + arg) - except AttributeError: - sys.stdout.write(self.doc_to_help(func)) - sys.stdout.flush() - else: - help() - else: - doc = self.doc_to_help(self.__class__) - if doc: - sys.stdout.write(doc) - sys.stdout.flush() - return None - - # - - def help_func(self): - help = """\ - Usage: scons-time func [OPTIONS] FILE [...] - - -C DIR, --chdir=DIR Change to DIR before looking for files - -f FILE, --file=FILE Read configuration from specified FILE - --fmt=FORMAT, --format=FORMAT Print data in specified FORMAT - --func=NAME, --function=NAME Report time for function NAME - -h, --help Print this help and exit - -p STRING, --prefix=STRING Use STRING as log file/profile prefix - -t NUMBER, --tail=NUMBER Only report the last NUMBER files - --title=TITLE Specify the output plot TITLE - """ - sys.stdout.write(self.outdent(help)) - sys.stdout.flush() - - def do_func(self, argv): - """ - """ - format = 'ascii' - function_name = '_main' - tail = None - - short_opts = '?C:f:hp:t:' - - long_opts = [ - 'chdir=', - 'file=', - 'fmt=', - 'format=', - 'func=', - 'function=', - 'help', - 'prefix=', - 'tail=', - 'title=', - ] - - opts, args = getopt.getopt(argv[1:], short_opts, long_opts) - - for o, a in opts: - if o in ('-C', '--chdir'): - self.chdir = a - elif o in ('-f', '--file'): - self.config_file = a - elif o in ('--fmt', '--format'): - format = a - elif o in ('--func', '--function'): - function_name = a - elif o in ('-?', '-h', '--help'): - self.do_help(['help', 'func']) - sys.exit(0) - elif o in ('--max',): - max_time = int(a) - elif o in ('-p', '--prefix'): - self.prefix = a - elif o in ('-t', '--tail'): - tail = int(a) - elif o in ('--title',): - self.title = a - - if self.config_file: - execfile(self.config_file, self.__dict__) - - if self.chdir: - os.chdir(self.chdir) - - if not args: - - pattern = '%s*.prof' % self.prefix - args = self.args_to_files([pattern], tail) - - if not args: - if self.chdir: - directory = self.chdir - else: - directory = os.getcwd() - - sys.stderr.write('%s: func: No arguments specified.\n' % self.name) - sys.stderr.write('%s No %s*.prof files found in "%s".\n' % (self.name_spaces, self.prefix, directory)) - sys.stderr.write('%s Type "%s help func" for help.\n' % (self.name_spaces, self.name)) - sys.exit(1) - - else: - - args = self.args_to_files(args, tail) - - cwd_ = os.getcwd() + os.sep - - if format == 'ascii': - - def print_function_timing(file, func): - try: - f, line, func, time = self.get_function_profile(file, func) - except ValueError, e: - sys.stderr.write("%s: func: %s: %s\n" % (self.name, file, e)) - else: - if f.startswith(cwd_): - f = f[len(cwd_):] - print "%.3f %s:%d(%s)" % (time, f, line, func) - - for file in args: - print_function_timing(file, function_name) - - elif format == 'gnuplot': - - results = self.collect_results(args, self.get_function_time, - function_name) - - self.gnuplot_results(results) - - else: - - sys.stderr.write('%s: func: Unknown format "%s".\n' % (self.name, format)) - sys.exit(1) - - # - - def help_mem(self): - help = """\ - Usage: scons-time mem [OPTIONS] FILE [...] - - -C DIR, --chdir=DIR Change to DIR before looking for files - -f FILE, --file=FILE Read configuration from specified FILE - --fmt=FORMAT, --format=FORMAT Print data in specified FORMAT - -h, --help Print this help and exit - -p STRING, --prefix=STRING Use STRING as log file/profile prefix - --stage=STAGE Plot memory at the specified stage: - pre-read, post-read, pre-build, - post-build (default: post-build) - -t NUMBER, --tail=NUMBER Only report the last NUMBER files - --title=TITLE Specify the output plot TITLE - """ - sys.stdout.write(self.outdent(help)) - sys.stdout.flush() - - def do_mem(self, argv): - - format = 'ascii' - logfile_path = lambda x: x - stage = self.default_stage - tail = None - - short_opts = '?C:f:hp:t:' - - long_opts = [ - 'chdir=', - 'file=', - 'fmt=', - 'format=', - 'help', - 'prefix=', - 'stage=', - 'tail=', - 'title=', - ] - - opts, args = getopt.getopt(argv[1:], short_opts, long_opts) - - for o, a in opts: - if o in ('-C', '--chdir'): - self.chdir = a - elif o in ('-f', '--file'): - self.config_file = a - elif o in ('--fmt', '--format'): - format = a - elif o in ('-?', '-h', '--help'): - self.do_help(['help', 'mem']) - sys.exit(0) - elif o in ('-p', '--prefix'): - self.prefix = a - elif o in ('--stage',): - if not a in self.stages: - sys.stderr.write('%s: mem: Unrecognized stage "%s".\n' % (self.name, a)) - sys.exit(1) - stage = a - elif o in ('-t', '--tail'): - tail = int(a) - elif o in ('--title',): - self.title = a - - if self.config_file: - execfile(self.config_file, self.__dict__) - - if self.chdir: - os.chdir(self.chdir) - logfile_path = lambda x, c=self.chdir: os.path.join(c, x) - - if not args: - - pattern = '%s*.log' % self.prefix - args = self.args_to_files([pattern], tail) - - if not args: - if self.chdir: - directory = self.chdir - else: - directory = os.getcwd() - - sys.stderr.write('%s: mem: No arguments specified.\n' % self.name) - sys.stderr.write('%s No %s*.log files found in "%s".\n' % (self.name_spaces, self.prefix, directory)) - sys.stderr.write('%s Type "%s help mem" for help.\n' % (self.name_spaces, self.name)) - sys.exit(1) - - else: - - args = self.args_to_files(args, tail) - - cwd_ = os.getcwd() + os.sep - - if format == 'ascii': - - self.ascii_table(args, tuple(self.stages), self.get_memory, logfile_path) - - elif format == 'gnuplot': - - results = self.collect_results(args, self.get_memory, - self.stage_strings[stage]) - - self.gnuplot_results(results) - - else: - - sys.stderr.write('%s: mem: Unknown format "%s".\n' % (self.name, format)) - sys.exit(1) - - return 0 - - # - - def help_obj(self): - help = """\ - Usage: scons-time obj [OPTIONS] OBJECT FILE [...] - - -C DIR, --chdir=DIR Change to DIR before looking for files - -f FILE, --file=FILE Read configuration from specified FILE - --fmt=FORMAT, --format=FORMAT Print data in specified FORMAT - -h, --help Print this help and exit - -p STRING, --prefix=STRING Use STRING as log file/profile prefix - --stage=STAGE Plot memory at the specified stage: - pre-read, post-read, pre-build, - post-build (default: post-build) - -t NUMBER, --tail=NUMBER Only report the last NUMBER files - --title=TITLE Specify the output plot TITLE - """ - sys.stdout.write(self.outdent(help)) - sys.stdout.flush() - - def do_obj(self, argv): - - format = 'ascii' - logfile_path = lambda x: x - stage = self.default_stage - tail = None - - short_opts = '?C:f:hp:t:' - - long_opts = [ - 'chdir=', - 'file=', - 'fmt=', - 'format=', - 'help', - 'prefix=', - 'stage=', - 'tail=', - 'title=', - ] - - opts, args = getopt.getopt(argv[1:], short_opts, long_opts) - - for o, a in opts: - if o in ('-C', '--chdir'): - self.chdir = a - elif o in ('-f', '--file'): - self.config_file = a - elif o in ('--fmt', '--format'): - format = a - elif o in ('-?', '-h', '--help'): - self.do_help(['help', 'obj']) - sys.exit(0) - elif o in ('-p', '--prefix'): - self.prefix = a - elif o in ('--stage',): - if not a in self.stages: - sys.stderr.write('%s: obj: Unrecognized stage "%s".\n' % (self.name, a)) - sys.stderr.write('%s Type "%s help obj" for help.\n' % (self.name_spaces, self.name)) - sys.exit(1) - stage = a - elif o in ('-t', '--tail'): - tail = int(a) - elif o in ('--title',): - self.title = a - - if not args: - sys.stderr.write('%s: obj: Must specify an object name.\n' % self.name) - sys.stderr.write('%s Type "%s help obj" for help.\n' % (self.name_spaces, self.name)) - sys.exit(1) - - object_name = args.pop(0) - - if self.config_file: - execfile(self.config_file, self.__dict__) - - if self.chdir: - os.chdir(self.chdir) - logfile_path = lambda x, c=self.chdir: os.path.join(c, x) - - if not args: - - pattern = '%s*.log' % self.prefix - args = self.args_to_files([pattern], tail) - - if not args: - if self.chdir: - directory = self.chdir - else: - directory = os.getcwd() - - sys.stderr.write('%s: obj: No arguments specified.\n' % self.name) - sys.stderr.write('%s No %s*.log files found in "%s".\n' % (self.name_spaces, self.prefix, directory)) - sys.stderr.write('%s Type "%s help obj" for help.\n' % (self.name_spaces, self.name)) - sys.exit(1) - - else: - - args = self.args_to_files(args, tail) - - cwd_ = os.getcwd() + os.sep - - if format == 'ascii': - - self.ascii_table(args, tuple(self.stages), self.get_object_counts, logfile_path, object_name) - - elif format == 'gnuplot': - - stage_index = 0 - for s in self.stages: - if stage == s: - break - stage_index = stage_index + 1 - - results = self.collect_results(args, self.get_object_counts, - object_name, stage_index) - - self.gnuplot_results(results) - - else: - - sys.stderr.write('%s: obj: Unknown format "%s".\n' % (self.name, format)) - sys.exit(1) - - return 0 - - # - - def help_run(self): - help = """\ - Usage: scons-time run [OPTIONS] [FILE ...] - - --aegis=PROJECT Use SCons from the Aegis PROJECT - --chdir=DIR Name of unpacked directory for chdir - -f FILE, --file=FILE Read configuration from specified FILE - -h, --help Print this help and exit - -n, --no-exec No execute, just print command lines - --number=NUMBER Put output in files for run NUMBER - --outdir=OUTDIR Put output files in OUTDIR - -p STRING, --prefix=STRING Use STRING as log file/profile prefix - --python=PYTHON Time using the specified PYTHON - -q, --quiet Don't print command lines - --scons=SCONS Time using the specified SCONS - --svn=URL, --subversion=URL Use SCons from Subversion URL - -v, --verbose Display output of commands - """ - sys.stdout.write(self.outdent(help)) - sys.stdout.flush() - - def do_run(self, argv): - """ - """ - run_number_list = [None] - - short_opts = '?f:hnp:qs:v' - - long_opts = [ - 'aegis=', - 'file=', - 'help', - 'no-exec', - 'number=', - 'outdir=', - 'prefix=', - 'python=', - 'quiet', - 'scons=', - 'svn=', - 'subdir=', - 'subversion=', - 'verbose', - ] - - opts, args = getopt.getopt(argv[1:], short_opts, long_opts) - - for o, a in opts: - if o in ('--aegis',): - self.aegis_project = a - elif o in ('-f', '--file'): - self.config_file = a - elif o in ('-?', '-h', '--help'): - self.do_help(['help', 'run']) - sys.exit(0) - elif o in ('-n', '--no-exec'): - self.execute = self._do_not_execute - elif o in ('--number',): - run_number_list = self.split_run_numbers(a) - elif o in ('--outdir',): - self.outdir = a - elif o in ('-p', '--prefix'): - self.prefix = a - elif o in ('--python',): - self.python = a - elif o in ('-q', '--quiet'): - self.display = self._do_not_display - elif o in ('-s', '--subdir'): - self.subdir = a - elif o in ('--scons',): - self.scons = a - elif o in ('--svn', '--subversion'): - self.subversion_url = a - elif o in ('-v', '--verbose'): - self.redirect = tee_to_file - self.verbose = True - self.svn_co_flag = '' - - if not args and not self.config_file: - sys.stderr.write('%s: run: No arguments or -f config file specified.\n' % self.name) - sys.stderr.write('%s Type "%s help run" for help.\n' % (self.name_spaces, self.name)) - sys.exit(1) - - if self.config_file: - execfile(self.config_file, self.__dict__) - - if args: - self.archive_list = args - - archive_file_name = os.path.split(self.archive_list[0])[1] - - if not self.subdir: - self.subdir = self.archive_splitext(archive_file_name)[0] - - if not self.prefix: - self.prefix = self.archive_splitext(archive_file_name)[0] - - prepare = None - if self.subversion_url: - prepare = self.prep_subversion_run - elif self.aegis_project: - prepare = self.prep_aegis_run - - for run_number in run_number_list: - self.individual_run(run_number, self.archive_list, prepare) - - def split_run_numbers(self, s): - result = [] - for n in s.split(','): - try: - x, y = n.split('-') - except ValueError: - result.append(int(n)) - else: - result.extend(range(int(x), int(y)+1)) - return result - - def scons_path(self, dir): - return os.path.join(dir, 'src', 'script', 'scons.py') - - def scons_lib_dir_path(self, dir): - return os.path.join(dir, 'src', 'engine') - - def prep_aegis_run(self, commands, removals): - self.aegis_tmpdir = make_temp_file(prefix = self.name + '-aegis-') - removals.append((shutil.rmtree, 'rm -rf %%s', self.aegis_tmpdir)) - - self.aegis_parent_project = os.path.splitext(self.aegis_project)[0] - self.scons = self.scons_path(self.aegis_tmpdir) - self.scons_lib_dir = self.scons_lib_dir_path(self.aegis_tmpdir) - - commands.extend([ - 'mkdir %(aegis_tmpdir)s', - (lambda: os.chdir(self.aegis_tmpdir), 'cd %(aegis_tmpdir)s'), - '%(aegis)s -cp -ind -p %(aegis_parent_project)s .', - '%(aegis)s -cp -ind -p %(aegis_project)s -delta %(run_number)s .', - ]) - - def prep_subversion_run(self, commands, removals): - self.svn_tmpdir = make_temp_file(prefix = self.name + '-svn-') - removals.append((shutil.rmtree, 'rm -rf %%s', self.svn_tmpdir)) - - self.scons = self.scons_path(self.svn_tmpdir) - self.scons_lib_dir = self.scons_lib_dir_path(self.svn_tmpdir) - - commands.extend([ - 'mkdir %(svn_tmpdir)s', - '%(svn)s co %(svn_co_flag)s -r %(run_number)s %(subversion_url)s %(svn_tmpdir)s', - ]) - - def individual_run(self, run_number, archive_list, prepare=None): - """ - Performs an individual run of the default SCons invocations. - """ - - commands = [] - removals = [] - - if prepare: - prepare(commands, removals) - - save_scons = self.scons - save_scons_wrapper = self.scons_wrapper - save_scons_lib_dir = self.scons_lib_dir - - if self.outdir is None: - self.outdir = self.orig_cwd - elif not os.path.isabs(self.outdir): - self.outdir = os.path.join(self.orig_cwd, self.outdir) - - if self.scons is None: - self.scons = self.scons_path(self.orig_cwd) - - if self.scons_lib_dir is None: - self.scons_lib_dir = self.scons_lib_dir_path(self.orig_cwd) - - if self.scons_wrapper is None: - self.scons_wrapper = self.scons - - if not run_number: - run_number = self.find_next_run_number(self.outdir, self.prefix) - - self.run_number = str(run_number) - - self.prefix_run = self.prefix + '-%03d' % run_number - - if self.targets0 is None: - self.targets0 = self.startup_targets - if self.targets1 is None: - self.targets1 = self.targets - if self.targets2 is None: - self.targets2 = self.targets - - self.tmpdir = make_temp_file(prefix = self.name + '-') - - commands.extend([ - 'mkdir %(tmpdir)s', - - (os.chdir, 'cd %%s', self.tmpdir), - ]) - - for archive in archive_list: - if not os.path.isabs(archive): - archive = os.path.join(self.orig_cwd, archive) - if os.path.isdir(archive): - dest = os.path.split(archive)[1] - commands.append((shutil.copytree, 'cp -r %%s %%s', archive, dest)) - else: - suffix = self.archive_splitext(archive)[1] - unpack_command = self.unpack_map.get(suffix) - if not unpack_command: - dest = os.path.split(archive)[1] - commands.append((shutil.copyfile, 'cp %%s %%s', archive, dest)) - else: - commands.append(unpack_command + (archive,)) - - commands.extend([ - (os.chdir, 'cd %%s', self.subdir), - ]) - - commands.extend(self.initial_commands) - - commands.extend([ - (lambda: read_tree('.'), - 'find * -type f | xargs cat > /dev/null'), - - (self.set_env, 'export %%s=%%s', - 'SCONS_LIB_DIR', self.scons_lib_dir), - - '%(python)s %(scons_wrapper)s --version', - ]) - - index = 0 - for run_command in self.run_commands: - setattr(self, 'prof%d' % index, self.profile_name(index)) - c = ( - self.log_execute, - self.log_display, - run_command, - self.logfile_name(index), - ) - commands.append(c) - index = index + 1 - - commands.extend([ - (os.chdir, 'cd %%s', self.orig_cwd), - ]) - - if not os.environ.get('PRESERVE'): - commands.extend(removals) - - commands.append((shutil.rmtree, 'rm -rf %%s', self.tmpdir)) - - self.run_command_list(commands, self.__dict__) - - self.scons = save_scons - self.scons_lib_dir = save_scons_lib_dir - self.scons_wrapper = save_scons_wrapper - - # - - def help_time(self): - help = """\ - Usage: scons-time time [OPTIONS] FILE [...] - - -C DIR, --chdir=DIR Change to DIR before looking for files - -f FILE, --file=FILE Read configuration from specified FILE - --fmt=FORMAT, --format=FORMAT Print data in specified FORMAT - -h, --help Print this help and exit - -p STRING, --prefix=STRING Use STRING as log file/profile prefix - -t NUMBER, --tail=NUMBER Only report the last NUMBER files - --which=TIMER Plot timings for TIMER: total, - SConscripts, SCons, commands. - """ - sys.stdout.write(self.outdent(help)) - sys.stdout.flush() - - def do_time(self, argv): - - format = 'ascii' - logfile_path = lambda x: x - tail = None - which = 'total' - - short_opts = '?C:f:hp:t:' - - long_opts = [ - 'chdir=', - 'file=', - 'fmt=', - 'format=', - 'help', - 'prefix=', - 'tail=', - 'title=', - 'which=', - ] - - opts, args = getopt.getopt(argv[1:], short_opts, long_opts) - - for o, a in opts: - if o in ('-C', '--chdir'): - self.chdir = a - elif o in ('-f', '--file'): - self.config_file = a - elif o in ('--fmt', '--format'): - format = a - elif o in ('-?', '-h', '--help'): - self.do_help(['help', 'time']) - sys.exit(0) - elif o in ('-p', '--prefix'): - self.prefix = a - elif o in ('-t', '--tail'): - tail = int(a) - elif o in ('--title',): - self.title = a - elif o in ('--which',): - if not a in self.time_strings.keys(): - sys.stderr.write('%s: time: Unrecognized timer "%s".\n' % (self.name, a)) - sys.stderr.write('%s Type "%s help time" for help.\n' % (self.name_spaces, self.name)) - sys.exit(1) - which = a - - if self.config_file: - execfile(self.config_file, self.__dict__) - - if self.chdir: - os.chdir(self.chdir) - logfile_path = lambda x, c=self.chdir: os.path.join(c, x) - - if not args: - - pattern = '%s*.log' % self.prefix - args = self.args_to_files([pattern], tail) - - if not args: - if self.chdir: - directory = self.chdir - else: - directory = os.getcwd() - - sys.stderr.write('%s: time: No arguments specified.\n' % self.name) - sys.stderr.write('%s No %s*.log files found in "%s".\n' % (self.name_spaces, self.prefix, directory)) - sys.stderr.write('%s Type "%s help time" for help.\n' % (self.name_spaces, self.name)) - sys.exit(1) - - else: - - args = self.args_to_files(args, tail) - - cwd_ = os.getcwd() + os.sep - - if format == 'ascii': - - columns = ("Total", "SConscripts", "SCons", "commands") - self.ascii_table(args, columns, self.get_debug_times, logfile_path) - - elif format == 'gnuplot': - - results = self.collect_results(args, self.get_debug_times, - self.time_strings[which]) - - self.gnuplot_results(results, fmt='%s %.6f') - - else: - - sys.stderr.write('%s: time: Unknown format "%s".\n' % (self.name, format)) - sys.exit(1) - -if __name__ == '__main__': - opts, args = getopt.getopt(sys.argv[1:], 'h?V', ['help', 'version']) - - ST = SConsTimer() - - for o, a in opts: - if o in ('-?', '-h', '--help'): - ST.do_help(['help']) - sys.exit(0) - elif o in ('-V', '--version'): - sys.stdout.write('scons-time version\n') - sys.exit(0) - - if not args: - sys.stderr.write('Type "%s help" for usage.\n' % ST.name) - sys.exit(1) - - ST.execute_subcommand(args) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/scons.py b/3rdParty/SCons/scons.py deleted file mode 100755 index 73aa0b5..0000000 --- a/3rdParty/SCons/scons.py +++ /dev/null @@ -1,171 +0,0 @@ -#! /usr/bin/env python -# -# SCons - a Software Constructor -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/script/scons.py 4043 2009/02/23 09:06:45 scons" - -__version__ = "1.2.0.d20090223" - -__build__ = "r4043" - -__buildsys__ = "scons-dev" - -__date__ = "2009/02/23 09:06:45" - -__developer__ = "scons" - -import os -import os.path -import sys - -############################################################################## -# BEGIN STANDARD SCons SCRIPT HEADER -# -# This is the cut-and-paste logic so that a self-contained script can -# interoperate correctly with different SCons versions and installation -# locations for the engine. If you modify anything in this section, you -# should also change other scripts that use this same header. -############################################################################## - -# Strip the script directory from sys.path() so on case-insensitive -# (WIN32) systems Python doesn't think that the "scons" script is the -# "SCons" package. Replace it with our own library directories -# (version-specific first, in case they installed by hand there, -# followed by generic) so we pick up the right version of the build -# engine modules if they're in either directory. - -script_dir = sys.path[0] - -if script_dir in sys.path: - sys.path.remove(script_dir) - -libs = [] - -if os.environ.has_key("SCONS_LIB_DIR"): - libs.append(os.environ["SCONS_LIB_DIR"]) - -local_version = 'scons-local-' + __version__ -local = 'scons-local' -if script_dir: - local_version = os.path.join(script_dir, local_version) - local = os.path.join(script_dir, local) -libs.append(os.path.abspath(local_version)) -libs.append(os.path.abspath(local)) - -scons_version = 'scons-%s' % __version__ - -prefs = [] - -if sys.platform == 'win32': - # sys.prefix is (likely) C:\Python*; - # check only C:\Python*. - prefs.append(sys.prefix) - prefs.append(os.path.join(sys.prefix, 'Lib', 'site-packages')) -else: - # On other (POSIX) platforms, things are more complicated due to - # the variety of path names and library locations. Try to be smart - # about it. - if script_dir == 'bin': - # script_dir is `pwd`/bin; - # check `pwd`/lib/scons*. - prefs.append(os.getcwd()) - else: - if script_dir == '.' or script_dir == '': - script_dir = os.getcwd() - head, tail = os.path.split(script_dir) - if tail == "bin": - # script_dir is /foo/bin; - # check /foo/lib/scons*. - prefs.append(head) - - head, tail = os.path.split(sys.prefix) - if tail == "usr": - # sys.prefix is /foo/usr; - # check /foo/usr/lib/scons* first, - # then /foo/usr/local/lib/scons*. - prefs.append(sys.prefix) - prefs.append(os.path.join(sys.prefix, "local")) - elif tail == "local": - h, t = os.path.split(head) - if t == "usr": - # sys.prefix is /foo/usr/local; - # check /foo/usr/local/lib/scons* first, - # then /foo/usr/lib/scons*. - prefs.append(sys.prefix) - prefs.append(head) - else: - # sys.prefix is /foo/local; - # check only /foo/local/lib/scons*. - prefs.append(sys.prefix) - else: - # sys.prefix is /foo (ends in neither /usr or /local); - # check only /foo/lib/scons*. - prefs.append(sys.prefix) - - temp = map(lambda x: os.path.join(x, 'lib'), prefs) - temp.extend(map(lambda x: os.path.join(x, - 'lib', - 'python' + sys.version[:3], - 'site-packages'), - prefs)) - prefs = temp - - # Add the parent directory of the current python's library to the - # preferences. On SuSE-91/AMD64, for example, this is /usr/lib64, - # not /usr/lib. - try: - libpath = os.__file__ - except AttributeError: - pass - else: - # Split /usr/libfoo/python*/os.py to /usr/libfoo/python*. - libpath, tail = os.path.split(libpath) - # Split /usr/libfoo/python* to /usr/libfoo - libpath, tail = os.path.split(libpath) - # Check /usr/libfoo/scons*. - prefs.append(libpath) - -# Look first for 'scons-__version__' in all of our preference libs, -# then for 'scons'. -libs.extend(map(lambda x: os.path.join(x, scons_version), prefs)) -libs.extend(map(lambda x: os.path.join(x, 'scons'), prefs)) - -sys.path = libs + sys.path - -############################################################################## -# END STANDARD SCons SCRIPT HEADER -############################################################################## - -if __name__ == "__main__": - import SCons.Script - # this does all the work, and calls sys.exit - # with the proper exit status when done. - SCons.Script.main() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/3rdParty/SCons/sconsign.py b/3rdParty/SCons/sconsign.py deleted file mode 100755 index 9a97b75..0000000 --- a/3rdParty/SCons/sconsign.py +++ /dev/null @@ -1,508 +0,0 @@ -#! /usr/bin/env python -# -# SCons - a Software Constructor -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation -# -# 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. -# - -__revision__ = "src/script/sconsign.py 4043 2009/02/23 09:06:45 scons" - -__version__ = "1.2.0.d20090223" - -__build__ = "r4043" - -__buildsys__ = "scons-dev" - -__date__ = "2009/02/23 09:06:45" - -__developer__ = "scons" - -import os -import os.path -import sys -import time - -############################################################################## -# BEGIN STANDARD SCons SCRIPT HEADER -# -# This is the cut-and-paste logic so that a self-contained script can -# interoperate correctly with different SCons versions and installation -# locations for the engine. If you modify anything in this section, you -# should also change other scripts that use this same header. -############################################################################## - -# Strip the script directory from sys.path() so on case-insensitive -# (WIN32) systems Python doesn't think that the "scons" script is the -# "SCons" package. Replace it with our own library directories -# (version-specific first, in case they installed by hand there, -# followed by generic) so we pick up the right version of the build -# engine modules if they're in either directory. - -script_dir = sys.path[0] - -if script_dir in sys.path: - sys.path.remove(script_dir) - -libs = [] - -if os.environ.has_key("SCONS_LIB_DIR"): - libs.append(os.environ["SCONS_LIB_DIR"]) - -local_version = 'scons-local-' + __version__ -local = 'scons-local' -if script_dir: - local_version = os.path.join(script_dir, local_version) - local = os.path.join(script_dir, local) -libs.append(os.path.abspath(local_version)) -libs.append(os.path.abspath(local)) - -scons_version = 'scons-%s' % __version__ - -prefs = [] - -if sys.platform == 'win32': - # sys.prefix is (likely) C:\Python*; - # check only C:\Python*. - prefs.append(sys.prefix) - prefs.append(os.path.join(sys.prefix, 'Lib', 'site-packages')) -else: - # On other (POSIX) platforms, things are more complicated due to - # the variety of path names and library locations. Try to be smart - # about it. - if script_dir == 'bin': - # script_dir is `pwd`/bin; - # check `pwd`/lib/scons*. - prefs.append(os.getcwd()) - else: - if script_dir == '.' or script_dir == '': - script_dir = os.getcwd() - head, tail = os.path.split(script_dir) - if tail == "bin": - # script_dir is /foo/bin; - # check /foo/lib/scons*. - prefs.append(head) - - head, tail = os.path.split(sys.prefix) - if tail == "usr": - # sys.prefix is /foo/usr; - # check /foo/usr/lib/scons* first, - # then /foo/usr/local/lib/scons*. - prefs.append(sys.prefix) - prefs.append(os.path.join(sys.prefix, "local")) - elif tail == "local": - h, t = os.path.split(head) - if t == "usr": - # sys.prefix is /foo/usr/local; - # check /foo/usr/local/lib/scons* first, - # then /foo/usr/lib/scons*. - prefs.append(sys.prefix) - prefs.append(head) - else: - # sys.prefix is /foo/local; - # check only /foo/local/lib/scons*. - prefs.append(sys.prefix) - else: - # sys.prefix is /foo (ends in neither /usr or /local); - # check only /foo/lib/scons*. - prefs.append(sys.prefix) - - temp = map(lambda x: os.path.join(x, 'lib'), prefs) - temp.extend(map(lambda x: os.path.join(x, - 'lib', - 'python' + sys.version[:3], - 'site-packages'), - prefs)) - prefs = temp - - # Add the parent directory of the current python's library to the - # preferences. On SuSE-91/AMD64, for example, this is /usr/lib64, - # not /usr/lib. - try: - libpath = os.__file__ - except AttributeError: - pass - else: - # Split /usr/libfoo/python*/os.py to /usr/libfoo/python*. - libpath, tail = os.path.split(libpath) - # Split /usr/libfoo/python* to /usr/libfoo - libpath, tail = os.path.split(libpath) - # Check /usr/libfoo/scons*. - prefs.append(libpath) - -# Look first for 'scons-__version__' in all of our preference libs, -# then for 'scons'. -libs.extend(map(lambda x: os.path.join(x, scons_version), prefs)) -libs.extend(map(lambda x: os.path.join(x, 'scons'), prefs)) - -sys.path = libs + sys.path - -############################################################################## -# END STANDARD SCons SCRIPT HEADER -############################################################################## - -import cPickle -import imp -import string -import whichdb - -import SCons.SConsign - -def my_whichdb(filename): - if filename[-7:] == ".dblite": - return "SCons.dblite" - try: - f = open(filename + ".dblite", "rb") - f.close() - return "SCons.dblite" - except IOError: - pass - return _orig_whichdb(filename) - -_orig_whichdb = whichdb.whichdb -whichdb.whichdb = my_whichdb - -def my_import(mname): - if '.' in mname: - i = string.rfind(mname, '.') - parent = my_import(mname[:i]) - fp, pathname, description = imp.find_module(mname[i+1:], - parent.__path__) - else: - fp, pathname, description = imp.find_module(mname) - return imp.load_module(mname, fp, pathname, description) - -class Flagger: - default_value = 1 - def __setitem__(self, item, value): - self.__dict__[item] = value - self.default_value = 0 - def __getitem__(self, item): - return self.__dict__.get(item, self.default_value) - -Do_Call = None -Print_Directories = [] -Print_Entries = [] -Print_Flags = Flagger() -Verbose = 0 -Readable = 0 - -def default_mapper(entry, name): - try: - val = eval("entry."+name) - except: - val = None - return str(val) - -def map_action(entry, name): - try: - bact = entry.bact - bactsig = entry.bactsig - except AttributeError: - return None - return '%s [%s]' % (bactsig, bact) - -def map_timestamp(entry, name): - try: - timestamp = entry.timestamp - except AttributeError: - timestamp = None - if Readable and timestamp: - return "'" + time.ctime(timestamp) + "'" - else: - return str(timestamp) - -def map_bkids(entry, name): - try: - bkids = entry.bsources + entry.bdepends + entry.bimplicit - bkidsigs = entry.bsourcesigs + entry.bdependsigs + entry.bimplicitsigs - except AttributeError: - return None - result = [] - for i in xrange(len(bkids)): - result.append(nodeinfo_string(bkids[i], bkidsigs[i], " ")) - if result == []: - return None - return string.join(result, "\n ") - -map_field = { - 'action' : map_action, - 'timestamp' : map_timestamp, - 'bkids' : map_bkids, -} - -map_name = { - 'implicit' : 'bkids', -} - -def field(name, entry, verbose=Verbose): - if not Print_Flags[name]: - return None - fieldname = map_name.get(name, name) - mapper = map_field.get(fieldname, default_mapper) - val = mapper(entry, name) - if verbose: - val = name + ": " + val - return val - -def nodeinfo_raw(name, ninfo, prefix=""): - # This just formats the dictionary, which we would normally use str() - # to do, except that we want the keys sorted for deterministic output. - d = ninfo.__dict__ - try: - keys = ninfo.field_list + ['_version_id'] - except AttributeError: - keys = d.keys() - keys.sort() - l = [] - for k in keys: - l.append('%s: %s' % (repr(k), repr(d.get(k)))) - if '\n' in name: - name = repr(name) - return name + ': {' + string.join(l, ', ') + '}' - -def nodeinfo_cooked(name, ninfo, prefix=""): - try: - field_list = ninfo.field_list - except AttributeError: - field_list = [] - f = lambda x, ni=ninfo, v=Verbose: field(x, ni, v) - if '\n' in name: - name = repr(name) - outlist = [name+':'] + filter(None, map(f, field_list)) - if Verbose: - sep = '\n ' + prefix - else: - sep = ' ' - return string.join(outlist, sep) - -nodeinfo_string = nodeinfo_cooked - -def printfield(name, entry, prefix=""): - outlist = field("implicit", entry, 0) - if outlist: - if Verbose: - print " implicit:" - print " " + outlist - outact = field("action", entry, 0) - if outact: - if Verbose: - print " action: " + outact - else: - print " " + outact - -def printentries(entries, location): - if Print_Entries: - for name in Print_Entries: - try: - entry = entries[name] - except KeyError: - sys.stderr.write("sconsign: no entry `%s' in `%s'\n" % (name, location)) - else: - try: - ninfo = entry.ninfo - except AttributeError: - print name + ":" - else: - print nodeinfo_string(name, entry.ninfo) - printfield(name, entry.binfo) - else: - names = entries.keys() - names.sort() - for name in names: - entry = entries[name] - try: - ninfo = entry.ninfo - except AttributeError: - print name + ":" - else: - print nodeinfo_string(name, entry.ninfo) - printfield(name, entry.binfo) - -class Do_SConsignDB: - def __init__(self, dbm_name, dbm): - self.dbm_name = dbm_name - self.dbm = dbm - - def __call__(self, fname): - # The *dbm modules stick their own file suffixes on the names - # that are passed in. This is causes us to jump through some - # hoops here to be able to allow the user - try: - # Try opening the specified file name. Example: - # SPECIFIED OPENED BY self.dbm.open() - # --------- ------------------------- - # .sconsign => .sconsign.dblite - # .sconsign.dblite => .sconsign.dblite.dblite - db = self.dbm.open(fname, "r") - except (IOError, OSError), e: - print_e = e - try: - # That didn't work, so try opening the base name, - # so that if the actually passed in 'sconsign.dblite' - # (for example), the dbm module will put the suffix back - # on for us and open it anyway. - db = self.dbm.open(os.path.splitext(fname)[0], "r") - except (IOError, OSError): - # That didn't work either. See if the file name - # they specified just exists (independent of the dbm - # suffix-mangling). - try: - open(fname, "r") - except (IOError, OSError), e: - # Nope, that file doesn't even exist, so report that - # fact back. - print_e = e - sys.stderr.write("sconsign: %s\n" % (print_e)) - return - except KeyboardInterrupt: - raise - except cPickle.UnpicklingError: - sys.stderr.write("sconsign: ignoring invalid `%s' file `%s'\n" % (self.dbm_name, fname)) - return - except Exception, e: - sys.stderr.write("sconsign: ignoring invalid `%s' file `%s': %s\n" % (self.dbm_name, fname, e)) - return - - if Print_Directories: - for dir in Print_Directories: - try: - val = db[dir] - except KeyError: - sys.stderr.write("sconsign: no dir `%s' in `%s'\n" % (dir, args[0])) - else: - self.printentries(dir, val) - else: - keys = db.keys() - keys.sort() - for dir in keys: - self.printentries(dir, db[dir]) - - def printentries(self, dir, val): - print '=== ' + dir + ':' - printentries(cPickle.loads(val), dir) - -def Do_SConsignDir(name): - try: - fp = open(name, 'rb') - except (IOError, OSError), e: - sys.stderr.write("sconsign: %s\n" % (e)) - return - try: - sconsign = SCons.SConsign.Dir(fp) - except KeyboardInterrupt: - raise - except cPickle.UnpicklingError: - sys.stderr.write("sconsign: ignoring invalid .sconsign file `%s'\n" % (name)) - return - except Exception, e: - sys.stderr.write("sconsign: ignoring invalid .sconsign file `%s': %s\n" % (name, e)) - return - printentries(sconsign.entries, args[0]) - -############################################################################## - -import getopt - -helpstr = """\ -Usage: sconsign [OPTIONS] FILE [...] -Options: - -a, --act, --action Print build action information. - -c, --csig Print content signature information. - -d DIR, --dir=DIR Print only info about DIR. - -e ENTRY, --entry=ENTRY Print only info about ENTRY. - -f FORMAT, --format=FORMAT FILE is in the specified FORMAT. - -h, --help Print this message and exit. - -i, --implicit Print implicit dependency information. - -r, --readable Print timestamps in human-readable form. - --raw Print raw Python object representations. - -s, --size Print file sizes. - -t, --timestamp Print timestamp information. - -v, --verbose Verbose, describe each field. -""" - -opts, args = getopt.getopt(sys.argv[1:], "acd:e:f:hirstv", - ['act', 'action', - 'csig', 'dir=', 'entry=', - 'format=', 'help', 'implicit', - 'raw', 'readable', - 'size', 'timestamp', 'verbose']) - - -for o, a in opts: - if o in ('-a', '--act', '--action'): - Print_Flags['action'] = 1 - elif o in ('-c', '--csig'): - Print_Flags['csig'] = 1 - elif o in ('-d', '--dir'): - Print_Directories.append(a) - elif o in ('-e', '--entry'): - Print_Entries.append(a) - elif o in ('-f', '--format'): - Module_Map = {'dblite' : 'SCons.dblite', - 'sconsign' : None} - dbm_name = Module_Map.get(a, a) - if dbm_name: - try: - dbm = my_import(dbm_name) - except: - sys.stderr.write("sconsign: illegal file format `%s'\n" % a) - print helpstr - sys.exit(2) - Do_Call = Do_SConsignDB(a, dbm) - else: - Do_Call = Do_SConsignDir - elif o in ('-h', '--help'): - print helpstr - sys.exit(0) - elif o in ('-i', '--implicit'): - Print_Flags['implicit'] = 1 - elif o in ('--raw',): - nodeinfo_string = nodeinfo_raw - elif o in ('-r', '--readable'): - Readable = 1 - elif o in ('-s', '--size'): - Print_Flags['size'] = 1 - elif o in ('-t', '--timestamp'): - Print_Flags['timestamp'] = 1 - elif o in ('-v', '--verbose'): - Verbose = 1 - -if Do_Call: - for a in args: - Do_Call(a) -else: - for a in args: - dbm_name = whichdb.whichdb(a) - if dbm_name: - Map_Module = {'SCons.dblite' : 'dblite'} - dbm = my_import(dbm_name) - Do_SConsignDB(Map_Module.get(dbm_name, dbm_name), dbm)(a) - else: - Do_SConsignDir(a) - -sys.exit(0) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: |