mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2024-11-08 00:37:15 +01:00
Fixed the INI compilation on Linux by reverting to the original library.
Fixed an infinite loop in the parsing of command specification strings. Added the option to retrieve common configs with a fall back value if they don't exist. Few other minor changes.
This commit is contained in:
parent
20ae383c42
commit
f27a195b6f
@ -379,6 +379,7 @@
|
|||||||
<Add directory="../include" />
|
<Add directory="../include" />
|
||||||
<Add directory="../config/common" />
|
<Add directory="../config/common" />
|
||||||
</Compiler>
|
</Compiler>
|
||||||
|
<Unit filename="../external/Common/ConvertUTF.cpp" />
|
||||||
<Unit filename="../modules/ini/Common.cpp" />
|
<Unit filename="../modules/ini/Common.cpp" />
|
||||||
<Unit filename="../modules/ini/Common.hpp" />
|
<Unit filename="../modules/ini/Common.hpp" />
|
||||||
<Unit filename="../modules/ini/Document.cpp" />
|
<Unit filename="../modules/ini/Document.cpp" />
|
||||||
|
548
external/Common/ConvertUTF.cpp
vendored
Normal file
548
external/Common/ConvertUTF.cpp
vendored
Normal file
@ -0,0 +1,548 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2001-2004 Unicode, Inc.
|
||||||
|
*
|
||||||
|
* Disclaimer
|
||||||
|
*
|
||||||
|
* This source code is provided as is by Unicode, Inc. No claims are
|
||||||
|
* made as to fitness for any particular purpose. No warranties of any
|
||||||
|
* kind are expressed or implied. The recipient agrees to determine
|
||||||
|
* applicability of information provided. If this file has been
|
||||||
|
* purchased on magnetic or optical media from Unicode, Inc., the
|
||||||
|
* sole remedy for any claim will be exchange of defective media
|
||||||
|
* within 90 days of receipt.
|
||||||
|
*
|
||||||
|
* Limitations on Rights to Redistribute This Code
|
||||||
|
*
|
||||||
|
* Unicode, Inc. hereby grants the right to freely use the information
|
||||||
|
* supplied in this file in the creation of products supporting the
|
||||||
|
* Unicode Standard, and to make copies of this file in any form
|
||||||
|
* for internal or external distribution as long as this notice
|
||||||
|
* remains attached.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------
|
||||||
|
|
||||||
|
Conversions between UTF32, UTF-16, and UTF-8. Source code file.
|
||||||
|
Author: Mark E. Davis, 1994.
|
||||||
|
Rev History: Rick McGowan, fixes & updates May 2001.
|
||||||
|
Sept 2001: fixed const & error conditions per
|
||||||
|
mods suggested by S. Parent & A. Lillich.
|
||||||
|
June 2002: Tim Dodd added detection and handling of incomplete
|
||||||
|
source sequences, enhanced error detection, added casts
|
||||||
|
to eliminate compiler warnings.
|
||||||
|
July 2003: slight mods to back out aggressive FFFE detection.
|
||||||
|
Jan 2004: updated switches in from-UTF8 conversions.
|
||||||
|
Oct 2004: updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions.
|
||||||
|
|
||||||
|
See the header file "ConvertUTF.h" for complete documentation.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
|
||||||
|
#include "ConvertUTF.h"
|
||||||
|
#ifdef CVTUTF_DEBUG
|
||||||
|
#include <stdio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This is for C++ and does no harm in C */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const int halfShift = 10; /* used for shifting by 10 bits */
|
||||||
|
|
||||||
|
static const UTF32 halfBase = 0x0010000UL;
|
||||||
|
static const UTF32 halfMask = 0x3FFUL;
|
||||||
|
|
||||||
|
#define UNI_SUR_HIGH_START (UTF32)0xD800
|
||||||
|
#define UNI_SUR_HIGH_END (UTF32)0xDBFF
|
||||||
|
#define UNI_SUR_LOW_START (UTF32)0xDC00
|
||||||
|
#define UNI_SUR_LOW_END (UTF32)0xDFFF
|
||||||
|
#define false 0
|
||||||
|
#define true 1
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ConversionResult ConvertUTF32toUTF16 (
|
||||||
|
const UTF32** sourceStart, const UTF32* sourceEnd,
|
||||||
|
UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) {
|
||||||
|
ConversionResult result = conversionOK;
|
||||||
|
const UTF32* source = *sourceStart;
|
||||||
|
UTF16* target = *targetStart;
|
||||||
|
while (source < sourceEnd) {
|
||||||
|
UTF32 ch;
|
||||||
|
if (target >= targetEnd) {
|
||||||
|
result = targetExhausted; break;
|
||||||
|
}
|
||||||
|
ch = *source++;
|
||||||
|
if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */
|
||||||
|
/* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */
|
||||||
|
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
|
||||||
|
if (flags == strictConversion) {
|
||||||
|
--source; /* return to the illegal value itself */
|
||||||
|
result = sourceIllegal;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
*target++ = UNI_REPLACEMENT_CHAR;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
*target++ = (UTF16)ch; /* normal case */
|
||||||
|
}
|
||||||
|
} else if (ch > UNI_MAX_LEGAL_UTF32) {
|
||||||
|
if (flags == strictConversion) {
|
||||||
|
result = sourceIllegal;
|
||||||
|
} else {
|
||||||
|
*target++ = UNI_REPLACEMENT_CHAR;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* target is a character in range 0xFFFF - 0x10FFFF. */
|
||||||
|
if (target + 1 >= targetEnd) {
|
||||||
|
--source; /* Back up source pointer! */
|
||||||
|
result = targetExhausted; break;
|
||||||
|
}
|
||||||
|
ch -= halfBase;
|
||||||
|
*target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);
|
||||||
|
*target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*sourceStart = source;
|
||||||
|
*targetStart = target;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ConversionResult ConvertUTF16toUTF32 (
|
||||||
|
const UTF16** sourceStart, const UTF16* sourceEnd,
|
||||||
|
UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) {
|
||||||
|
ConversionResult result = conversionOK;
|
||||||
|
const UTF16* source = *sourceStart;
|
||||||
|
UTF32* target = *targetStart;
|
||||||
|
UTF32 ch, ch2;
|
||||||
|
while (source < sourceEnd) {
|
||||||
|
const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */
|
||||||
|
ch = *source++;
|
||||||
|
/* If we have a surrogate pair, convert to UTF32 first. */
|
||||||
|
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {
|
||||||
|
/* If the 16 bits following the high surrogate are in the source buffer... */
|
||||||
|
if (source < sourceEnd) {
|
||||||
|
ch2 = *source;
|
||||||
|
/* If it's a low surrogate, convert to UTF32. */
|
||||||
|
if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {
|
||||||
|
ch = ((ch - UNI_SUR_HIGH_START) << halfShift)
|
||||||
|
+ (ch2 - UNI_SUR_LOW_START) + halfBase;
|
||||||
|
++source;
|
||||||
|
} else if (flags == strictConversion) { /* it's an unpaired high surrogate */
|
||||||
|
--source; /* return to the illegal value itself */
|
||||||
|
result = sourceIllegal;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else { /* We don't have the 16 bits following the high surrogate. */
|
||||||
|
--source; /* return to the high surrogate */
|
||||||
|
result = sourceExhausted;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (flags == strictConversion) {
|
||||||
|
/* UTF-16 surrogate values are illegal in UTF-32 */
|
||||||
|
if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {
|
||||||
|
--source; /* return to the illegal value itself */
|
||||||
|
result = sourceIllegal;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (target >= targetEnd) {
|
||||||
|
source = oldSource; /* Back up source pointer! */
|
||||||
|
result = targetExhausted; break;
|
||||||
|
}
|
||||||
|
*target++ = ch;
|
||||||
|
}
|
||||||
|
*sourceStart = source;
|
||||||
|
*targetStart = target;
|
||||||
|
#ifdef CVTUTF_DEBUG
|
||||||
|
if (result == sourceIllegal) {
|
||||||
|
fprintf(stderr, "ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\n", ch, ch2);
|
||||||
|
fflush(stderr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Index into the table below with the first byte of a UTF-8 sequence to
|
||||||
|
* get the number of trailing bytes that are supposed to follow it.
|
||||||
|
* Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is
|
||||||
|
* left as-is for anyone who may want to do such conversion, which was
|
||||||
|
* allowed in earlier algorithms.
|
||||||
|
*/
|
||||||
|
static const char trailingBytesForUTF8[256] = {
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||||
|
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, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Magic values subtracted from a buffer value during UTF8 conversion.
|
||||||
|
* This table contains as many values as there might be trailing bytes
|
||||||
|
* in a UTF-8 sequence.
|
||||||
|
*/
|
||||||
|
static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL,
|
||||||
|
0x03C82080UL, 0xFA082080UL, 0x82082080UL };
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Once the bits are split out into bytes of UTF-8, this is a mask OR-ed
|
||||||
|
* into the first byte, depending on how many bytes follow. There are
|
||||||
|
* as many entries in this table as there are UTF-8 sequence types.
|
||||||
|
* (I.e., one byte sequence, two byte... etc.). Remember that sequencs
|
||||||
|
* for *legal* UTF-8 will be 4 or fewer bytes total.
|
||||||
|
*/
|
||||||
|
static const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* The interface converts a whole buffer to avoid function-call overhead.
|
||||||
|
* Constants have been gathered. Loops & conditionals have been removed as
|
||||||
|
* much as possible for efficiency, in favor of drop-through switches.
|
||||||
|
* (See "Note A" at the bottom of the file for equivalent code.)
|
||||||
|
* If your compiler supports it, the "isLegalUTF8" call can be turned
|
||||||
|
* into an inline function.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ConversionResult ConvertUTF16toUTF8 (
|
||||||
|
const UTF16** sourceStart, const UTF16* sourceEnd,
|
||||||
|
UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) {
|
||||||
|
ConversionResult result = conversionOK;
|
||||||
|
const UTF16* source = *sourceStart;
|
||||||
|
UTF8* target = *targetStart;
|
||||||
|
while (source < sourceEnd) {
|
||||||
|
UTF32 ch;
|
||||||
|
unsigned short bytesToWrite = 0;
|
||||||
|
const UTF32 byteMask = 0xBF;
|
||||||
|
const UTF32 byteMark = 0x80;
|
||||||
|
const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */
|
||||||
|
ch = *source++;
|
||||||
|
/* If we have a surrogate pair, convert to UTF32 first. */
|
||||||
|
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {
|
||||||
|
/* If the 16 bits following the high surrogate are in the source buffer... */
|
||||||
|
if (source < sourceEnd) {
|
||||||
|
UTF32 ch2 = *source;
|
||||||
|
/* If it's a low surrogate, convert to UTF32. */
|
||||||
|
if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {
|
||||||
|
ch = ((ch - UNI_SUR_HIGH_START) << halfShift)
|
||||||
|
+ (ch2 - UNI_SUR_LOW_START) + halfBase;
|
||||||
|
++source;
|
||||||
|
} else if (flags == strictConversion) { /* it's an unpaired high surrogate */
|
||||||
|
--source; /* return to the illegal value itself */
|
||||||
|
result = sourceIllegal;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else { /* We don't have the 16 bits following the high surrogate. */
|
||||||
|
--source; /* return to the high surrogate */
|
||||||
|
result = sourceExhausted;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (flags == strictConversion) {
|
||||||
|
/* UTF-16 surrogate values are illegal in UTF-32 */
|
||||||
|
if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {
|
||||||
|
--source; /* return to the illegal value itself */
|
||||||
|
result = sourceIllegal;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Figure out how many bytes the result will require */
|
||||||
|
if (ch < (UTF32)0x80) { bytesToWrite = 1;
|
||||||
|
} else if (ch < (UTF32)0x800) { bytesToWrite = 2;
|
||||||
|
} else if (ch < (UTF32)0x10000) { bytesToWrite = 3;
|
||||||
|
} else if (ch < (UTF32)0x110000) { bytesToWrite = 4;
|
||||||
|
} else { bytesToWrite = 3;
|
||||||
|
ch = UNI_REPLACEMENT_CHAR;
|
||||||
|
}
|
||||||
|
|
||||||
|
target += bytesToWrite;
|
||||||
|
if (target > targetEnd) {
|
||||||
|
source = oldSource; /* Back up source pointer! */
|
||||||
|
target -= bytesToWrite; result = targetExhausted; break;
|
||||||
|
}
|
||||||
|
switch (bytesToWrite) { /* note: everything falls through. */
|
||||||
|
case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
||||||
|
case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
||||||
|
case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
||||||
|
case 1: *--target = (UTF8)(ch | firstByteMark[bytesToWrite]);
|
||||||
|
}
|
||||||
|
target += bytesToWrite;
|
||||||
|
}
|
||||||
|
*sourceStart = source;
|
||||||
|
*targetStart = target;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Utility routine to tell whether a sequence of bytes is legal UTF-8.
|
||||||
|
* This must be called with the length pre-determined by the first byte.
|
||||||
|
* If not calling this from ConvertUTF8to*, then the length can be set by:
|
||||||
|
* length = trailingBytesForUTF8[*source]+1;
|
||||||
|
* and the sequence is illegal right away if there aren't that many bytes
|
||||||
|
* available.
|
||||||
|
* If presented with a length > 4, this returns false. The Unicode
|
||||||
|
* definition of UTF-8 goes up to 4-byte sequences.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static Boolean isLegalUTF8(const UTF8 *source, int length) {
|
||||||
|
UTF8 a;
|
||||||
|
const UTF8 *srcptr = source+length;
|
||||||
|
switch (length) {
|
||||||
|
default: return false;
|
||||||
|
/* Everything else falls through when "true"... */
|
||||||
|
case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;
|
||||||
|
case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;
|
||||||
|
case 2: if ((a = (*--srcptr)) > 0xBF) return false;
|
||||||
|
|
||||||
|
switch (*source) {
|
||||||
|
/* no fall-through in this inner switch */
|
||||||
|
case 0xE0: if (a < 0xA0) return false; break;
|
||||||
|
case 0xED: if (a > 0x9F) return false; break;
|
||||||
|
case 0xF0: if (a < 0x90) return false; break;
|
||||||
|
case 0xF4: if (a > 0x8F) return false; break;
|
||||||
|
default: if (a < 0x80) return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 1: if (*source >= 0x80 && *source < 0xC2) return false;
|
||||||
|
}
|
||||||
|
if (*source > 0xF4) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Exported function to return whether a UTF-8 sequence is legal or not.
|
||||||
|
* This is not used here; it's just exported.
|
||||||
|
*/
|
||||||
|
Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) {
|
||||||
|
int length = trailingBytesForUTF8[*source]+1;
|
||||||
|
if (source+length > sourceEnd) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return isLegalUTF8(source, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ConversionResult ConvertUTF8toUTF16 (
|
||||||
|
const UTF8** sourceStart, const UTF8* sourceEnd,
|
||||||
|
UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) {
|
||||||
|
ConversionResult result = conversionOK;
|
||||||
|
const UTF8* source = *sourceStart;
|
||||||
|
UTF16* target = *targetStart;
|
||||||
|
while (source < sourceEnd) {
|
||||||
|
UTF32 ch = 0;
|
||||||
|
unsigned short extraBytesToRead = trailingBytesForUTF8[*source];
|
||||||
|
if (source + extraBytesToRead >= sourceEnd) {
|
||||||
|
result = sourceExhausted; break;
|
||||||
|
}
|
||||||
|
/* Do this check whether lenient or strict */
|
||||||
|
if (! isLegalUTF8(source, extraBytesToRead+1)) {
|
||||||
|
result = sourceIllegal;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* The cases all fall through. See "Note A" below.
|
||||||
|
*/
|
||||||
|
switch (extraBytesToRead) {
|
||||||
|
case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */
|
||||||
|
case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */
|
||||||
|
case 3: ch += *source++; ch <<= 6;
|
||||||
|
case 2: ch += *source++; ch <<= 6;
|
||||||
|
case 1: ch += *source++; ch <<= 6;
|
||||||
|
case 0: ch += *source++;
|
||||||
|
}
|
||||||
|
ch -= offsetsFromUTF8[extraBytesToRead];
|
||||||
|
|
||||||
|
if (target >= targetEnd) {
|
||||||
|
source -= (extraBytesToRead+1); /* Back up source pointer! */
|
||||||
|
result = targetExhausted; break;
|
||||||
|
}
|
||||||
|
if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */
|
||||||
|
/* UTF-16 surrogate values are illegal in UTF-32 */
|
||||||
|
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
|
||||||
|
if (flags == strictConversion) {
|
||||||
|
source -= (extraBytesToRead+1); /* return to the illegal value itself */
|
||||||
|
result = sourceIllegal;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
*target++ = UNI_REPLACEMENT_CHAR;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
*target++ = (UTF16)ch; /* normal case */
|
||||||
|
}
|
||||||
|
} else if (ch > UNI_MAX_UTF16) {
|
||||||
|
if (flags == strictConversion) {
|
||||||
|
result = sourceIllegal;
|
||||||
|
source -= (extraBytesToRead+1); /* return to the start */
|
||||||
|
break; /* Bail out; shouldn't continue */
|
||||||
|
} else {
|
||||||
|
*target++ = UNI_REPLACEMENT_CHAR;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* target is a character in range 0xFFFF - 0x10FFFF. */
|
||||||
|
if (target + 1 >= targetEnd) {
|
||||||
|
source -= (extraBytesToRead+1); /* Back up source pointer! */
|
||||||
|
result = targetExhausted; break;
|
||||||
|
}
|
||||||
|
ch -= halfBase;
|
||||||
|
*target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);
|
||||||
|
*target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*sourceStart = source;
|
||||||
|
*targetStart = target;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ConversionResult ConvertUTF32toUTF8 (
|
||||||
|
const UTF32** sourceStart, const UTF32* sourceEnd,
|
||||||
|
UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) {
|
||||||
|
ConversionResult result = conversionOK;
|
||||||
|
const UTF32* source = *sourceStart;
|
||||||
|
UTF8* target = *targetStart;
|
||||||
|
while (source < sourceEnd) {
|
||||||
|
UTF32 ch;
|
||||||
|
unsigned short bytesToWrite = 0;
|
||||||
|
const UTF32 byteMask = 0xBF;
|
||||||
|
const UTF32 byteMark = 0x80;
|
||||||
|
ch = *source++;
|
||||||
|
if (flags == strictConversion ) {
|
||||||
|
/* UTF-16 surrogate values are illegal in UTF-32 */
|
||||||
|
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
|
||||||
|
--source; /* return to the illegal value itself */
|
||||||
|
result = sourceIllegal;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Figure out how many bytes the result will require. Turn any
|
||||||
|
* illegally large UTF32 things (> Plane 17) into replacement chars.
|
||||||
|
*/
|
||||||
|
if (ch < (UTF32)0x80) { bytesToWrite = 1;
|
||||||
|
} else if (ch < (UTF32)0x800) { bytesToWrite = 2;
|
||||||
|
} else if (ch < (UTF32)0x10000) { bytesToWrite = 3;
|
||||||
|
} else if (ch <= UNI_MAX_LEGAL_UTF32) { bytesToWrite = 4;
|
||||||
|
} else { bytesToWrite = 3;
|
||||||
|
ch = UNI_REPLACEMENT_CHAR;
|
||||||
|
result = sourceIllegal;
|
||||||
|
}
|
||||||
|
|
||||||
|
target += bytesToWrite;
|
||||||
|
if (target > targetEnd) {
|
||||||
|
--source; /* Back up source pointer! */
|
||||||
|
target -= bytesToWrite; result = targetExhausted; break;
|
||||||
|
}
|
||||||
|
switch (bytesToWrite) { /* note: everything falls through. */
|
||||||
|
case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
||||||
|
case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
||||||
|
case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;
|
||||||
|
case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]);
|
||||||
|
}
|
||||||
|
target += bytesToWrite;
|
||||||
|
}
|
||||||
|
*sourceStart = source;
|
||||||
|
*targetStart = target;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
ConversionResult ConvertUTF8toUTF32 (
|
||||||
|
const UTF8** sourceStart, const UTF8* sourceEnd,
|
||||||
|
UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) {
|
||||||
|
ConversionResult result = conversionOK;
|
||||||
|
const UTF8* source = *sourceStart;
|
||||||
|
UTF32* target = *targetStart;
|
||||||
|
while (source < sourceEnd) {
|
||||||
|
UTF32 ch = 0;
|
||||||
|
unsigned short extraBytesToRead = trailingBytesForUTF8[*source];
|
||||||
|
if (source + extraBytesToRead >= sourceEnd) {
|
||||||
|
result = sourceExhausted; break;
|
||||||
|
}
|
||||||
|
/* Do this check whether lenient or strict */
|
||||||
|
if (! isLegalUTF8(source, extraBytesToRead+1)) {
|
||||||
|
result = sourceIllegal;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* The cases all fall through. See "Note A" below.
|
||||||
|
*/
|
||||||
|
switch (extraBytesToRead) {
|
||||||
|
case 5: ch += *source++; ch <<= 6;
|
||||||
|
case 4: ch += *source++; ch <<= 6;
|
||||||
|
case 3: ch += *source++; ch <<= 6;
|
||||||
|
case 2: ch += *source++; ch <<= 6;
|
||||||
|
case 1: ch += *source++; ch <<= 6;
|
||||||
|
case 0: ch += *source++;
|
||||||
|
}
|
||||||
|
ch -= offsetsFromUTF8[extraBytesToRead];
|
||||||
|
|
||||||
|
if (target >= targetEnd) {
|
||||||
|
source -= (extraBytesToRead+1); /* Back up the source pointer! */
|
||||||
|
result = targetExhausted; break;
|
||||||
|
}
|
||||||
|
if (ch <= UNI_MAX_LEGAL_UTF32) {
|
||||||
|
/*
|
||||||
|
* UTF-16 surrogate values are illegal in UTF-32, and anything
|
||||||
|
* over Plane 17 (> 0x10FFFF) is illegal.
|
||||||
|
*/
|
||||||
|
if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
|
||||||
|
if (flags == strictConversion) {
|
||||||
|
source -= (extraBytesToRead+1); /* return to the illegal value itself */
|
||||||
|
result = sourceIllegal;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
*target++ = UNI_REPLACEMENT_CHAR;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
*target++ = ch;
|
||||||
|
}
|
||||||
|
} else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */
|
||||||
|
result = sourceIllegal;
|
||||||
|
*target++ = UNI_REPLACEMENT_CHAR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*sourceStart = source;
|
||||||
|
*targetStart = target;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------
|
||||||
|
|
||||||
|
Note A.
|
||||||
|
The fall-through switches in UTF-8 reading code save a
|
||||||
|
temp variable, some decrements & conditionals. The switches
|
||||||
|
are equivalent to the following loop:
|
||||||
|
{
|
||||||
|
int tmpBytesToRead = extraBytesToRead+1;
|
||||||
|
do {
|
||||||
|
ch += *source++;
|
||||||
|
--tmpBytesToRead;
|
||||||
|
if (tmpBytesToRead) ch <<= 6;
|
||||||
|
} while (tmpBytesToRead > 0);
|
||||||
|
}
|
||||||
|
In UTF-8 writing code, the switches on "bytesToWrite" are
|
||||||
|
similarly unrolled loops.
|
||||||
|
|
||||||
|
--------------------------------------------------------------------- */
|
149
include/ConvertUTF.h
Normal file
149
include/ConvertUTF.h
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2001-2004 Unicode, Inc.
|
||||||
|
*
|
||||||
|
* Disclaimer
|
||||||
|
*
|
||||||
|
* This source code is provided as is by Unicode, Inc. No claims are
|
||||||
|
* made as to fitness for any particular purpose. No warranties of any
|
||||||
|
* kind are expressed or implied. The recipient agrees to determine
|
||||||
|
* applicability of information provided. If this file has been
|
||||||
|
* purchased on magnetic or optical media from Unicode, Inc., the
|
||||||
|
* sole remedy for any claim will be exchange of defective media
|
||||||
|
* within 90 days of receipt.
|
||||||
|
*
|
||||||
|
* Limitations on Rights to Redistribute This Code
|
||||||
|
*
|
||||||
|
* Unicode, Inc. hereby grants the right to freely use the information
|
||||||
|
* supplied in this file in the creation of products supporting the
|
||||||
|
* Unicode Standard, and to make copies of this file in any form
|
||||||
|
* for internal or external distribution as long as this notice
|
||||||
|
* remains attached.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------
|
||||||
|
|
||||||
|
Conversions between UTF32, UTF-16, and UTF-8. Header file.
|
||||||
|
|
||||||
|
Several funtions are included here, forming a complete set of
|
||||||
|
conversions between the three formats. UTF-7 is not included
|
||||||
|
here, but is handled in a separate source file.
|
||||||
|
|
||||||
|
Each of these routines takes pointers to input buffers and output
|
||||||
|
buffers. The input buffers are const.
|
||||||
|
|
||||||
|
Each routine converts the text between *sourceStart and sourceEnd,
|
||||||
|
putting the result into the buffer between *targetStart and
|
||||||
|
targetEnd. Note: the end pointers are *after* the last item: e.g.
|
||||||
|
*(sourceEnd - 1) is the last item.
|
||||||
|
|
||||||
|
The return result indicates whether the conversion was successful,
|
||||||
|
and if not, whether the problem was in the source or target buffers.
|
||||||
|
(Only the first encountered problem is indicated.)
|
||||||
|
|
||||||
|
After the conversion, *sourceStart and *targetStart are both
|
||||||
|
updated to point to the end of last text successfully converted in
|
||||||
|
the respective buffers.
|
||||||
|
|
||||||
|
Input parameters:
|
||||||
|
sourceStart - pointer to a pointer to the source buffer.
|
||||||
|
The contents of this are modified on return so that
|
||||||
|
it points at the next thing to be converted.
|
||||||
|
targetStart - similarly, pointer to pointer to the target buffer.
|
||||||
|
sourceEnd, targetEnd - respectively pointers to the ends of the
|
||||||
|
two buffers, for overflow checking only.
|
||||||
|
|
||||||
|
These conversion functions take a ConversionFlags argument. When this
|
||||||
|
flag is set to strict, both irregular sequences and isolated surrogates
|
||||||
|
will cause an error. When the flag is set to lenient, both irregular
|
||||||
|
sequences and isolated surrogates are converted.
|
||||||
|
|
||||||
|
Whether the flag is strict or lenient, all illegal sequences will cause
|
||||||
|
an error return. This includes sequences such as: <F4 90 80 80>, <C0 80>,
|
||||||
|
or <A0> in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code
|
||||||
|
must check for illegal sequences.
|
||||||
|
|
||||||
|
When the flag is set to lenient, characters over 0x10FFFF are converted
|
||||||
|
to the replacement character; otherwise (when the flag is set to strict)
|
||||||
|
they constitute an error.
|
||||||
|
|
||||||
|
Output parameters:
|
||||||
|
The value "sourceIllegal" is returned from some routines if the input
|
||||||
|
sequence is malformed. When "sourceIllegal" is returned, the source
|
||||||
|
value will point to the illegal value that caused the problem. E.g.,
|
||||||
|
in UTF-8 when a sequence is malformed, it points to the start of the
|
||||||
|
malformed sequence.
|
||||||
|
|
||||||
|
Author: Mark E. Davis, 1994.
|
||||||
|
Rev History: Rick McGowan, fixes & updates May 2001.
|
||||||
|
Fixes & updates, Sept 2001.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------
|
||||||
|
The following 4 definitions are compiler-specific.
|
||||||
|
The C standard does not guarantee that wchar_t has at least
|
||||||
|
16 bits, so wchar_t is no less portable than unsigned short!
|
||||||
|
All should be unsigned values to avoid sign extension during
|
||||||
|
bit mask & shift operations.
|
||||||
|
------------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
typedef unsigned int UTF32; /* at least 32 bits */
|
||||||
|
typedef unsigned short UTF16; /* at least 16 bits */
|
||||||
|
typedef unsigned char UTF8; /* typically 8 bits */
|
||||||
|
typedef unsigned char Boolean; /* 0 or 1 */
|
||||||
|
|
||||||
|
/* Some fundamental constants */
|
||||||
|
#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD
|
||||||
|
#define UNI_MAX_BMP (UTF32)0x0000FFFF
|
||||||
|
#define UNI_MAX_UTF16 (UTF32)0x0010FFFF
|
||||||
|
#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF
|
||||||
|
#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
conversionOK, /* conversion successful */
|
||||||
|
sourceExhausted, /* partial character in source, but hit end */
|
||||||
|
targetExhausted, /* insuff. room in target for conversion */
|
||||||
|
sourceIllegal /* source sequence is illegal/malformed */
|
||||||
|
} ConversionResult;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
strictConversion = 0,
|
||||||
|
lenientConversion
|
||||||
|
} ConversionFlags;
|
||||||
|
|
||||||
|
/* This is for C++ and does no harm in C */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ConversionResult ConvertUTF8toUTF16 (
|
||||||
|
const UTF8** sourceStart, const UTF8* sourceEnd,
|
||||||
|
UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags);
|
||||||
|
|
||||||
|
ConversionResult ConvertUTF16toUTF8 (
|
||||||
|
const UTF16** sourceStart, const UTF16* sourceEnd,
|
||||||
|
UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);
|
||||||
|
|
||||||
|
ConversionResult ConvertUTF8toUTF32 (
|
||||||
|
const UTF8** sourceStart, const UTF8* sourceEnd,
|
||||||
|
UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags);
|
||||||
|
|
||||||
|
ConversionResult ConvertUTF32toUTF8 (
|
||||||
|
const UTF32** sourceStart, const UTF32* sourceEnd,
|
||||||
|
UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);
|
||||||
|
|
||||||
|
ConversionResult ConvertUTF16toUTF32 (
|
||||||
|
const UTF16** sourceStart, const UTF16* sourceEnd,
|
||||||
|
UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags);
|
||||||
|
|
||||||
|
ConversionResult ConvertUTF32toUTF16 (
|
||||||
|
const UTF32** sourceStart, const UTF32* sourceEnd,
|
||||||
|
UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags);
|
||||||
|
|
||||||
|
Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------- */
|
@ -50,15 +50,21 @@
|
|||||||
-# Define the appropriate symbol for the converter you wish to use and
|
-# Define the appropriate symbol for the converter you wish to use and
|
||||||
include the SimpleIni.h header file. If no specific converter is defined
|
include the SimpleIni.h header file. If no specific converter is defined
|
||||||
then the default converter is used. The default conversion mode uses
|
then the default converter is used. The default conversion mode uses
|
||||||
SI_CONVERT_WIN32 on Windows and SI_CONVERT_ICU on all other
|
SI_CONVERT_WIN32 on Windows and SI_CONVERT_GENERIC on all other
|
||||||
|
platforms. If you are using ICU then SI_CONVERT_ICU is supported on all
|
||||||
platforms.
|
platforms.
|
||||||
-# Declare an instance the appropriate class. Note that the following
|
-# Declare an instance the appropriate class. Note that the following
|
||||||
definitions are just shortcuts for commonly used types. Other types
|
definitions are just shortcuts for commonly used types. Other types
|
||||||
(PRUnichar, unsigned short, unsigned char) are also possible.
|
(PRUnichar, unsigned short, unsigned char) are also possible.
|
||||||
<table>
|
<table>
|
||||||
<tr><th>Interface <th>Case-sensitive <th>Load UTF-8 <th>Load MBCS <th>Typedef
|
<tr><th>Interface <th>Case-sensitive <th>Load UTF-8 <th>Load MBCS <th>Typedef
|
||||||
|
<tr><th>SI_CONVERT_GENERIC
|
||||||
|
<tr><td>char <td>No <td>Yes <td>Yes #1 <td>CSimpleIniA
|
||||||
|
<tr><td>char <td>Yes <td>Yes <td>Yes <td>CSimpleIniCaseA
|
||||||
|
<tr><td>wchar_t <td>No <td>Yes <td>Yes <td>CSimpleIniW
|
||||||
|
<tr><td>wchar_t <td>Yes <td>Yes <td>Yes <td>CSimpleIniCaseW
|
||||||
<tr><th>SI_CONVERT_WIN32
|
<tr><th>SI_CONVERT_WIN32
|
||||||
<tr><td>char <td>No <td>No #1 <td>Yes <td>CSimpleIniA
|
<tr><td>char <td>No <td>No #2 <td>Yes <td>CSimpleIniA
|
||||||
<tr><td>char <td>Yes <td>Yes <td>Yes <td>CSimpleIniCaseA
|
<tr><td>char <td>Yes <td>Yes <td>Yes <td>CSimpleIniCaseA
|
||||||
<tr><td>wchar_t <td>No <td>Yes <td>Yes <td>CSimpleIniW
|
<tr><td>wchar_t <td>No <td>Yes <td>Yes <td>CSimpleIniW
|
||||||
<tr><td>wchar_t <td>Yes <td>Yes <td>Yes <td>CSimpleIniCaseW
|
<tr><td>wchar_t <td>Yes <td>Yes <td>Yes <td>CSimpleIniCaseW
|
||||||
@ -68,7 +74,8 @@
|
|||||||
<tr><td>UChar <td>No <td>Yes <td>Yes <td>CSimpleIniW
|
<tr><td>UChar <td>No <td>Yes <td>Yes <td>CSimpleIniW
|
||||||
<tr><td>UChar <td>Yes <td>Yes <td>Yes <td>CSimpleIniCaseW
|
<tr><td>UChar <td>Yes <td>Yes <td>Yes <td>CSimpleIniCaseW
|
||||||
</table>
|
</table>
|
||||||
#1 Only affects Windows. On Windows this uses MBCS functions and
|
#1 On Windows you are better to use CSimpleIniA with SI_CONVERT_WIN32.<br>
|
||||||
|
#2 Only affects Windows. On Windows this uses MBCS functions and
|
||||||
so may fold case incorrectly leading to uncertain results.
|
so may fold case incorrectly leading to uncertain results.
|
||||||
-# Call LoadData() or LoadFile() to load and parse the INI configuration file
|
-# Call LoadData() or LoadFile() to load and parse the INI configuration file
|
||||||
-# Access and modify the data of the file using the following functions
|
-# Access and modify the data of the file using the following functions
|
||||||
@ -142,11 +149,12 @@
|
|||||||
@section notes NOTES
|
@section notes NOTES
|
||||||
|
|
||||||
- To load UTF-8 data on Windows 95, you need to use Microsoft Layer for
|
- To load UTF-8 data on Windows 95, you need to use Microsoft Layer for
|
||||||
Unicode, or SI_CONVERT_ICU.
|
Unicode, or SI_CONVERT_GENERIC, or SI_CONVERT_ICU.
|
||||||
|
- When using SI_CONVERT_GENERIC, ConvertUTF.c must be compiled and linked.
|
||||||
- When using SI_CONVERT_ICU, ICU header files must be on the include
|
- When using SI_CONVERT_ICU, ICU header files must be on the include
|
||||||
path and icuuc.lib must be linked in.
|
path and icuuc.lib must be linked in.
|
||||||
- To load a UTF-8 file on Windows AND expose it with SI_CHAR == char,
|
- To load a UTF-8 file on Windows AND expose it with SI_CHAR == char,
|
||||||
you should use SI_CONVERT_ICU.
|
you should use SI_CONVERT_GENERIC.
|
||||||
- The collation (sorting) order used for sections and keys returned from
|
- The collation (sorting) order used for sections and keys returned from
|
||||||
iterators is NOT DEFINED. If collation order of the text is important
|
iterators is NOT DEFINED. If collation order of the text is important
|
||||||
then it should be done yourself by either supplying a replacement
|
then it should be done yourself by either supplying a replacement
|
||||||
@ -156,7 +164,7 @@
|
|||||||
- Not thread-safe so manage your own locking
|
- Not thread-safe so manage your own locking
|
||||||
|
|
||||||
@section contrib CONTRIBUTIONS
|
@section contrib CONTRIBUTIONS
|
||||||
|
|
||||||
- 2010/05/03: Tobias Gehrig: added GetDoubleValue()
|
- 2010/05/03: Tobias Gehrig: added GetDoubleValue()
|
||||||
|
|
||||||
@section licence MIT LICENCE
|
@section licence MIT LICENCE
|
||||||
@ -313,6 +321,12 @@ public:
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER <= 1200
|
||||||
|
/** STL of VC6 doesn't allow me to specify my own comparator for list::sort() */
|
||||||
|
bool operator<(const Entry & rhs) const { return LoadOrder()(*this, rhs); }
|
||||||
|
bool operator>(const Entry & rhs) const { return LoadOrder()(rhs, *this); }
|
||||||
|
#endif
|
||||||
|
|
||||||
/** Strict less ordering by name of key only */
|
/** Strict less ordering by name of key only */
|
||||||
struct KeyOrder : std::binary_function<Entry, Entry, bool> {
|
struct KeyOrder : std::binary_function<Entry, Entry, bool> {
|
||||||
bool operator()(const Entry & lhs, const Entry & rhs) const {
|
bool operator()(const Entry & lhs, const Entry & rhs) const {
|
||||||
@ -330,16 +344,6 @@ public:
|
|||||||
return KeyOrder()(lhs.pItem, rhs.pItem);
|
return KeyOrder()(lhs.pItem, rhs.pItem);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Like LoadOrder, but empty name always goes first */
|
|
||||||
struct LoadOrderEmptyFirst : std::binary_function<Entry, Entry, bool> {
|
|
||||||
bool operator()(const Entry & lhs, const Entry & rhs) const {
|
|
||||||
if (*lhs.pItem == 0 || *rhs.pItem == 0) {
|
|
||||||
return *lhs.pItem < *rhs.pItem;
|
|
||||||
}
|
|
||||||
return LoadOrder()(lhs, rhs);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/** map keys to values */
|
/** map keys to values */
|
||||||
@ -526,7 +530,7 @@ public:
|
|||||||
bool IsMultiLine() const { return m_bAllowMultiLine; }
|
bool IsMultiLine() const { return m_bAllowMultiLine; }
|
||||||
|
|
||||||
/** Should spaces be added around the equals sign when writing key/value
|
/** Should spaces be added around the equals sign when writing key/value
|
||||||
pairs out. When true, the result will be "key = value". When false,
|
pairs out. When true, the result will be "key = value". When false,
|
||||||
the result will be "key=value". This value may be changed at any time.
|
the result will be "key=value". This value may be changed at any time.
|
||||||
|
|
||||||
\param a_bSpaces Add spaces around the equals sign?
|
\param a_bSpaces Add spaces around the equals sign?
|
||||||
@ -537,7 +541,7 @@ public:
|
|||||||
|
|
||||||
/** Query the status of spaces output */
|
/** Query the status of spaces output */
|
||||||
bool UsingSpaces() const { return m_bSpaces; }
|
bool UsingSpaces() const { return m_bSpaces; }
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/** @}
|
/** @}
|
||||||
@{ @name Loading INI Data */
|
@{ @name Loading INI Data */
|
||||||
@ -767,8 +771,8 @@ public:
|
|||||||
) const;
|
) const;
|
||||||
|
|
||||||
/** Retrieve all unique key names in a section. The sort order of the
|
/** Retrieve all unique key names in a section. The sort order of the
|
||||||
returned strings is NOT DEFINED. You can sort the names into the load
|
returned strings is NOT DEFINED. You can sort the names into the load
|
||||||
order if desired. Search this file for ".sort" for an example. Only
|
order if desired. Search this file for ".sort" for an example. Only
|
||||||
unique key names are returned.
|
unique key names are returned.
|
||||||
|
|
||||||
NOTE! This structure contains only pointers to strings. The actual
|
NOTE! This structure contains only pointers to strings. The actual
|
||||||
@ -789,8 +793,8 @@ public:
|
|||||||
) const;
|
) const;
|
||||||
|
|
||||||
/** Retrieve all values for a specific key. This method can be used when
|
/** Retrieve all values for a specific key. This method can be used when
|
||||||
multiple keys are both enabled and disabled. Note that the sort order
|
multiple keys are both enabled and disabled. Note that the sort order
|
||||||
of the returned strings is NOT DEFINED. You can sort the names into
|
of the returned strings is NOT DEFINED. You can sort the names into
|
||||||
the load order if desired. Search this file for ".sort" for an example.
|
the load order if desired. Search this file for ".sort" for an example.
|
||||||
|
|
||||||
NOTE! The returned values are pointers to string data stored in memory
|
NOTE! The returned values are pointers to string data stored in memory
|
||||||
@ -911,7 +915,7 @@ public:
|
|||||||
|
|
||||||
Strings starting with "t", "y", "on" or "1" are returned as logically true.
|
Strings starting with "t", "y", "on" or "1" are returned as logically true.
|
||||||
Strings starting with "f", "n", "of" or "0" are returned as logically false.
|
Strings starting with "f", "n", "of" or "0" are returned as logically false.
|
||||||
For all other values the default is returned. Character comparisons are
|
For all other values the default is returned. Character comparisons are
|
||||||
case-insensitive.
|
case-insensitive.
|
||||||
|
|
||||||
@param a_pSection Section to search
|
@param a_pSection Section to search
|
||||||
@ -950,9 +954,9 @@ public:
|
|||||||
character starting every line).
|
character starting every line).
|
||||||
@param a_bForceReplace Should all existing values in a multi-key INI
|
@param a_bForceReplace Should all existing values in a multi-key INI
|
||||||
file be replaced with this entry. This option has
|
file be replaced with this entry. This option has
|
||||||
no effect if not using multi-key files. The
|
no effect if not using multi-key files. The
|
||||||
difference between Delete/SetValue and SetValue
|
difference between Delete/SetValue and SetValue
|
||||||
with a_bForceReplace = true, is that the load
|
with a_bForceReplace = true, is that the load
|
||||||
order and comment will be preserved this way.
|
order and comment will be preserved this way.
|
||||||
|
|
||||||
@return SI_Error See error definitions
|
@return SI_Error See error definitions
|
||||||
@ -974,19 +978,19 @@ public:
|
|||||||
when multiple keys are enabled.
|
when multiple keys are enabled.
|
||||||
|
|
||||||
@param a_pSection Section to add or update
|
@param a_pSection Section to add or update
|
||||||
@param a_pKey Key to add or update.
|
@param a_pKey Key to add or update.
|
||||||
@param a_nValue Value to set.
|
@param a_nValue Value to set.
|
||||||
@param a_pComment Comment to be associated with the key. See the
|
@param a_pComment Comment to be associated with the key. See the
|
||||||
notes on SetValue() for comments.
|
notes on SetValue() for comments.
|
||||||
@param a_bUseHex By default the value will be written to the file
|
@param a_bUseHex By default the value will be written to the file
|
||||||
in decimal format. Set this to true to write it
|
in decimal format. Set this to true to write it
|
||||||
as hexadecimal.
|
as hexadecimal.
|
||||||
@param a_bForceReplace Should all existing values in a multi-key INI
|
@param a_bForceReplace Should all existing values in a multi-key INI
|
||||||
file be replaced with this entry. This option has
|
file be replaced with this entry. This option has
|
||||||
no effect if not using multi-key files. The
|
no effect if not using multi-key files. The
|
||||||
difference between Delete/SetLongValue and
|
difference between Delete/SetLongValue and
|
||||||
SetLongValue with a_bForceReplace = true, is that
|
SetLongValue with a_bForceReplace = true, is that
|
||||||
the load order and comment will be preserved this
|
the load order and comment will be preserved this
|
||||||
way.
|
way.
|
||||||
|
|
||||||
@return SI_Error See error definitions
|
@return SI_Error See error definitions
|
||||||
@ -1006,16 +1010,16 @@ public:
|
|||||||
when multiple keys are enabled.
|
when multiple keys are enabled.
|
||||||
|
|
||||||
@param a_pSection Section to add or update
|
@param a_pSection Section to add or update
|
||||||
@param a_pKey Key to add or update.
|
@param a_pKey Key to add or update.
|
||||||
@param a_nValue Value to set.
|
@param a_nValue Value to set.
|
||||||
@param a_pComment Comment to be associated with the key. See the
|
@param a_pComment Comment to be associated with the key. See the
|
||||||
notes on SetValue() for comments.
|
notes on SetValue() for comments.
|
||||||
@param a_bForceReplace Should all existing values in a multi-key INI
|
@param a_bForceReplace Should all existing values in a multi-key INI
|
||||||
file be replaced with this entry. This option has
|
file be replaced with this entry. This option has
|
||||||
no effect if not using multi-key files. The
|
no effect if not using multi-key files. The
|
||||||
difference between Delete/SetDoubleValue and
|
difference between Delete/SetDoubleValue and
|
||||||
SetDoubleValue with a_bForceReplace = true, is that
|
SetDoubleValue with a_bForceReplace = true, is that
|
||||||
the load order and comment will be preserved this
|
the load order and comment will be preserved this
|
||||||
way.
|
way.
|
||||||
|
|
||||||
@return SI_Error See error definitions
|
@return SI_Error See error definitions
|
||||||
@ -1034,16 +1038,16 @@ public:
|
|||||||
when multiple keys are enabled.
|
when multiple keys are enabled.
|
||||||
|
|
||||||
@param a_pSection Section to add or update
|
@param a_pSection Section to add or update
|
||||||
@param a_pKey Key to add or update.
|
@param a_pKey Key to add or update.
|
||||||
@param a_bValue Value to set.
|
@param a_bValue Value to set.
|
||||||
@param a_pComment Comment to be associated with the key. See the
|
@param a_pComment Comment to be associated with the key. See the
|
||||||
notes on SetValue() for comments.
|
notes on SetValue() for comments.
|
||||||
@param a_bForceReplace Should all existing values in a multi-key INI
|
@param a_bForceReplace Should all existing values in a multi-key INI
|
||||||
file be replaced with this entry. This option has
|
file be replaced with this entry. This option has
|
||||||
no effect if not using multi-key files. The
|
no effect if not using multi-key files. The
|
||||||
difference between Delete/SetBoolValue and
|
difference between Delete/SetBoolValue and
|
||||||
SetBoolValue with a_bForceReplace = true, is that
|
SetBoolValue with a_bForceReplace = true, is that
|
||||||
the load order and comment will be preserved this
|
the load order and comment will be preserved this
|
||||||
way.
|
way.
|
||||||
|
|
||||||
@return SI_Error See error definitions
|
@return SI_Error See error definitions
|
||||||
@ -1164,9 +1168,9 @@ private:
|
|||||||
comment character starting every line).
|
comment character starting every line).
|
||||||
@param a_bForceReplace Should all existing values in a multi-key INI
|
@param a_bForceReplace Should all existing values in a multi-key INI
|
||||||
file be replaced with this entry. This option has
|
file be replaced with this entry. This option has
|
||||||
no effect if not using multi-key files. The
|
no effect if not using multi-key files. The
|
||||||
difference between Delete/AddEntry and AddEntry
|
difference between Delete/AddEntry and AddEntry
|
||||||
with a_bForceReplace = true, is that the load
|
with a_bForceReplace = true, is that the load
|
||||||
order and comment will be preserved this way.
|
order and comment will be preserved this way.
|
||||||
@param a_bCopyStrings Should copies of the strings be made or not.
|
@param a_bCopyStrings Should copies of the strings be made or not.
|
||||||
If false then the pointers will be used as is.
|
If false then the pointers will be used as is.
|
||||||
@ -1261,7 +1265,7 @@ private:
|
|||||||
|
|
||||||
/** Should spaces be written out surrounding the equals sign? */
|
/** Should spaces be written out surrounding the equals sign? */
|
||||||
bool m_bSpaces;
|
bool m_bSpaces;
|
||||||
|
|
||||||
/** Next order value, used to ensure sections and keys are output in the
|
/** Next order value, used to ensure sections and keys are output in the
|
||||||
same order that they are loaded/added.
|
same order that they are loaded/added.
|
||||||
*/
|
*/
|
||||||
@ -1381,14 +1385,14 @@ CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::LoadFile(
|
|||||||
if (lSize == 0) {
|
if (lSize == 0) {
|
||||||
return SI_OK;
|
return SI_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// allocate and ensure NULL terminated
|
// allocate and ensure NULL terminated
|
||||||
char * pData = new char[lSize+1];
|
char * pData = new(std::nothrow) char[lSize+1];
|
||||||
if (!pData) {
|
if (!pData) {
|
||||||
return SI_NOMEM;
|
return SI_NOMEM;
|
||||||
}
|
}
|
||||||
pData[lSize] = 0;
|
pData[lSize] = 0;
|
||||||
|
|
||||||
// load data into buffer
|
// load data into buffer
|
||||||
fseek(a_fpFile, 0, SEEK_SET);
|
fseek(a_fpFile, 0, SEEK_SET);
|
||||||
size_t uRead = fread(pData, sizeof(char), lSize, a_fpFile);
|
size_t uRead = fread(pData, sizeof(char), lSize, a_fpFile);
|
||||||
@ -1432,7 +1436,7 @@ CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::LoadData(
|
|||||||
|
|
||||||
// allocate memory for the data, ensure that there is a NULL
|
// allocate memory for the data, ensure that there is a NULL
|
||||||
// terminator wherever the converted data ends
|
// terminator wherever the converted data ends
|
||||||
SI_CHAR * pData = new SI_CHAR[uLen+1];
|
SI_CHAR * pData = new(std::nothrow) SI_CHAR[uLen+1];
|
||||||
if (!pData) {
|
if (!pData) {
|
||||||
return SI_NOMEM;
|
return SI_NOMEM;
|
||||||
}
|
}
|
||||||
@ -1857,7 +1861,7 @@ CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::CopyString(
|
|||||||
for ( ; a_pString[uLen]; ++uLen) /*loop*/ ;
|
for ( ; a_pString[uLen]; ++uLen) /*loop*/ ;
|
||||||
}
|
}
|
||||||
++uLen; // NULL character
|
++uLen; // NULL character
|
||||||
SI_CHAR * pCopy = new SI_CHAR[uLen];
|
SI_CHAR * pCopy = new(std::nothrow) SI_CHAR[uLen];
|
||||||
if (!pCopy) {
|
if (!pCopy) {
|
||||||
return SI_NOMEM;
|
return SI_NOMEM;
|
||||||
}
|
}
|
||||||
@ -2041,15 +2045,15 @@ CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::GetLongValue(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// any invalid strings will return the default value
|
// any invalid strings will return the default value
|
||||||
if (*pszSuffix) {
|
if (*pszSuffix) {
|
||||||
return a_nDefault;
|
return a_nDefault;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nValue;
|
return nValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>
|
template<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>
|
||||||
SI_Error
|
SI_Error
|
||||||
CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::SetLongValue(
|
CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::SetLongValue(
|
||||||
const SI_CHAR * a_pSection,
|
const SI_CHAR * a_pSection,
|
||||||
const SI_CHAR * a_pKey,
|
const SI_CHAR * a_pKey,
|
||||||
@ -2073,7 +2077,7 @@ CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::SetLongValue(
|
|||||||
// convert to output text
|
// convert to output text
|
||||||
SI_CHAR szOutput[64];
|
SI_CHAR szOutput[64];
|
||||||
SI_CONVERTER c(m_bStoreIsUtf8);
|
SI_CONVERTER c(m_bStoreIsUtf8);
|
||||||
c.ConvertFromStore(szInput, strlen(szInput) + 1,
|
c.ConvertFromStore(szInput, strlen(szInput) + 1,
|
||||||
szOutput, sizeof(szOutput) / sizeof(SI_CHAR));
|
szOutput, sizeof(szOutput) / sizeof(SI_CHAR));
|
||||||
|
|
||||||
// actually add it
|
// actually add it
|
||||||
@ -2104,15 +2108,15 @@ CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::GetDoubleValue(
|
|||||||
double nValue = strtod(szValue, &pszSuffix);
|
double nValue = strtod(szValue, &pszSuffix);
|
||||||
|
|
||||||
// any invalid strings will return the default value
|
// any invalid strings will return the default value
|
||||||
if (!pszSuffix || *pszSuffix) {
|
if (!pszSuffix || *pszSuffix) {
|
||||||
return a_nDefault;
|
return a_nDefault;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nValue;
|
return nValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>
|
template<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>
|
||||||
SI_Error
|
SI_Error
|
||||||
CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::SetDoubleValue(
|
CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::SetDoubleValue(
|
||||||
const SI_CHAR * a_pSection,
|
const SI_CHAR * a_pSection,
|
||||||
const SI_CHAR * a_pKey,
|
const SI_CHAR * a_pKey,
|
||||||
@ -2135,7 +2139,7 @@ CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::SetDoubleValue(
|
|||||||
// convert to output text
|
// convert to output text
|
||||||
SI_CHAR szOutput[64];
|
SI_CHAR szOutput[64];
|
||||||
SI_CONVERTER c(m_bStoreIsUtf8);
|
SI_CONVERTER c(m_bStoreIsUtf8);
|
||||||
c.ConvertFromStore(szInput, strlen(szInput) + 1,
|
c.ConvertFromStore(szInput, strlen(szInput) + 1,
|
||||||
szOutput, sizeof(szOutput) / sizeof(SI_CHAR));
|
szOutput, sizeof(szOutput) / sizeof(SI_CHAR));
|
||||||
|
|
||||||
// actually add it
|
// actually add it
|
||||||
@ -2178,7 +2182,7 @@ CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::GetBoolValue(
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>
|
template<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>
|
||||||
SI_Error
|
SI_Error
|
||||||
CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::SetBoolValue(
|
CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::SetBoolValue(
|
||||||
const SI_CHAR * a_pSection,
|
const SI_CHAR * a_pSection,
|
||||||
const SI_CHAR * a_pKey,
|
const SI_CHAR * a_pKey,
|
||||||
@ -2196,13 +2200,13 @@ CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::SetBoolValue(
|
|||||||
// convert to output text
|
// convert to output text
|
||||||
SI_CHAR szOutput[64];
|
SI_CHAR szOutput[64];
|
||||||
SI_CONVERTER c(m_bStoreIsUtf8);
|
SI_CONVERTER c(m_bStoreIsUtf8);
|
||||||
c.ConvertFromStore(pszInput, strlen(pszInput) + 1,
|
c.ConvertFromStore(pszInput, strlen(pszInput) + 1,
|
||||||
szOutput, sizeof(szOutput) / sizeof(SI_CHAR));
|
szOutput, sizeof(szOutput) / sizeof(SI_CHAR));
|
||||||
|
|
||||||
// actually add it
|
// actually add it
|
||||||
return AddEntry(a_pSection, a_pKey, szOutput, a_pComment, a_bForceReplace, true);
|
return AddEntry(a_pSection, a_pKey, szOutput, a_pComment, a_bForceReplace, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>
|
template<class SI_CHAR, class SI_STRLESS, class SI_CONVERTER>
|
||||||
bool
|
bool
|
||||||
CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::GetAllValues(
|
CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::GetAllValues(
|
||||||
@ -2403,13 +2407,15 @@ CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::Save(
|
|||||||
a_oOutput.Write(SI_UTF8_SIGNATURE);
|
a_oOutput.Write(SI_UTF8_SIGNATURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// get all of the sections sorted in load order with root section first
|
// get all of the sections sorted in load order
|
||||||
TNamesDepend oSections;
|
TNamesDepend oSections;
|
||||||
GetAllSections(oSections);
|
GetAllSections(oSections);
|
||||||
#if defined(__BORLANDC__)
|
#if defined(_MSC_VER) && _MSC_VER <= 1200
|
||||||
oSections.sort(Entry::LoadOrderEmptyFirst());
|
oSections.sort();
|
||||||
|
#elif defined(__BORLANDC__)
|
||||||
|
oSections.sort(Entry::LoadOrder());
|
||||||
#else
|
#else
|
||||||
oSections.sort(typename Entry::LoadOrderEmptyFirst());
|
oSections.sort(typename Entry::LoadOrder());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// write the file comment if we have one
|
// write the file comment if we have one
|
||||||
@ -2456,7 +2462,9 @@ CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::Save(
|
|||||||
// get all of the keys sorted in load order
|
// get all of the keys sorted in load order
|
||||||
TNamesDepend oKeys;
|
TNamesDepend oKeys;
|
||||||
GetAllKeys(iSection->pItem, oKeys);
|
GetAllKeys(iSection->pItem, oKeys);
|
||||||
#if defined(__BORLANDC__)
|
#if defined(_MSC_VER) && _MSC_VER <= 1200
|
||||||
|
oKeys.sort();
|
||||||
|
#elif defined(__BORLANDC__)
|
||||||
oKeys.sort(Entry::LoadOrder());
|
oKeys.sort(Entry::LoadOrder());
|
||||||
#else
|
#else
|
||||||
oKeys.sort(typename Entry::LoadOrder());
|
oKeys.sort(typename Entry::LoadOrder());
|
||||||
@ -2654,15 +2662,17 @@ CSimpleIniTempl<SI_CHAR,SI_STRLESS,SI_CONVERTER>::DeleteString(
|
|||||||
// SimpleIni.h, set the converter that you wish you use by defining one of the
|
// SimpleIni.h, set the converter that you wish you use by defining one of the
|
||||||
// following symbols.
|
// following symbols.
|
||||||
//
|
//
|
||||||
|
// SI_CONVERT_GENERIC Use the Unicode reference conversion library in
|
||||||
|
// the accompanying files ConvertUTF.h/c
|
||||||
// SI_CONVERT_ICU Use the IBM ICU conversion library. Requires
|
// SI_CONVERT_ICU Use the IBM ICU conversion library. Requires
|
||||||
// ICU headers on include path and icuuc.lib
|
// ICU headers on include path and icuuc.lib
|
||||||
// SI_CONVERT_WIN32 Use the Win32 API functions for conversion.
|
// SI_CONVERT_WIN32 Use the Win32 API functions for conversion.
|
||||||
|
|
||||||
#if !defined(SI_CONVERT_WIN32) && !defined(SI_CONVERT_ICU)
|
#if !defined(SI_CONVERT_GENERIC) && !defined(SI_CONVERT_WIN32) && !defined(SI_CONVERT_ICU)
|
||||||
# ifdef _WIN32
|
# ifdef _WIN32
|
||||||
# define SI_CONVERT_WIN32
|
# define SI_CONVERT_WIN32
|
||||||
# else
|
# else
|
||||||
# define SI_CONVERT_ICU
|
# define SI_CONVERT_GENERIC
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -2825,6 +2835,214 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// SI_CONVERT_GENERIC
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
#ifdef SI_CONVERT_GENERIC
|
||||||
|
|
||||||
|
#define SI_Case SI_GenericCase
|
||||||
|
#define SI_NoCase SI_GenericNoCase
|
||||||
|
|
||||||
|
#include <wchar.h>
|
||||||
|
#include "ConvertUTF.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts UTF-8 to a wchar_t (or equivalent) using the Unicode reference
|
||||||
|
* library functions. This can be used on all platforms.
|
||||||
|
*/
|
||||||
|
template<class SI_CHAR>
|
||||||
|
class SI_ConvertW {
|
||||||
|
bool m_bStoreIsUtf8;
|
||||||
|
protected:
|
||||||
|
SI_ConvertW() { }
|
||||||
|
public:
|
||||||
|
SI_ConvertW(bool a_bStoreIsUtf8) : m_bStoreIsUtf8(a_bStoreIsUtf8) { }
|
||||||
|
|
||||||
|
/* copy and assignment */
|
||||||
|
SI_ConvertW(const SI_ConvertW & rhs) { operator=(rhs); }
|
||||||
|
SI_ConvertW & operator=(const SI_ConvertW & rhs) {
|
||||||
|
m_bStoreIsUtf8 = rhs.m_bStoreIsUtf8;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Calculate the number of SI_CHAR required for converting the input
|
||||||
|
* from the storage format. The storage format is always UTF-8 or MBCS.
|
||||||
|
*
|
||||||
|
* @param a_pInputData Data in storage format to be converted to SI_CHAR.
|
||||||
|
* @param a_uInputDataLen Length of storage format data in bytes. This
|
||||||
|
* must be the actual length of the data, including
|
||||||
|
* NULL byte if NULL terminated string is required.
|
||||||
|
* @return Number of SI_CHAR required by the string when
|
||||||
|
* converted. If there are embedded NULL bytes in the
|
||||||
|
* input data, only the string up and not including
|
||||||
|
* the NULL byte will be converted.
|
||||||
|
* @return -1 cast to size_t on a conversion error.
|
||||||
|
*/
|
||||||
|
size_t SizeFromStore(
|
||||||
|
const char * a_pInputData,
|
||||||
|
size_t a_uInputDataLen)
|
||||||
|
{
|
||||||
|
SI_ASSERT(a_uInputDataLen != (size_t) -1);
|
||||||
|
|
||||||
|
if (m_bStoreIsUtf8) {
|
||||||
|
// worst case scenario for UTF-8 to wchar_t is 1 char -> 1 wchar_t
|
||||||
|
// so we just return the same number of characters required as for
|
||||||
|
// the source text.
|
||||||
|
return a_uInputDataLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(SI_NO_MBSTOWCS_NULL) || (!defined(_MSC_VER) && !defined(_linux))
|
||||||
|
// fall back processing for platforms that don't support a NULL dest to mbstowcs
|
||||||
|
// worst case scenario is 1:1, this will be a sufficient buffer size
|
||||||
|
(void)a_pInputData;
|
||||||
|
return a_uInputDataLen;
|
||||||
|
#else
|
||||||
|
// get the actual required buffer size
|
||||||
|
return mbstowcs(NULL, a_pInputData, a_uInputDataLen);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Convert the input string from the storage format to SI_CHAR.
|
||||||
|
* The storage format is always UTF-8 or MBCS.
|
||||||
|
*
|
||||||
|
* @param a_pInputData Data in storage format to be converted to SI_CHAR.
|
||||||
|
* @param a_uInputDataLen Length of storage format data in bytes. This
|
||||||
|
* must be the actual length of the data, including
|
||||||
|
* NULL byte if NULL terminated string is required.
|
||||||
|
* @param a_pOutputData Pointer to the output buffer to received the
|
||||||
|
* converted data.
|
||||||
|
* @param a_uOutputDataSize Size of the output buffer in SI_CHAR.
|
||||||
|
* @return true if all of the input data was successfully
|
||||||
|
* converted.
|
||||||
|
*/
|
||||||
|
bool ConvertFromStore(
|
||||||
|
const char * a_pInputData,
|
||||||
|
size_t a_uInputDataLen,
|
||||||
|
SI_CHAR * a_pOutputData,
|
||||||
|
size_t a_uOutputDataSize)
|
||||||
|
{
|
||||||
|
if (m_bStoreIsUtf8) {
|
||||||
|
// This uses the Unicode reference implementation to do the
|
||||||
|
// conversion from UTF-8 to wchar_t. The required files are
|
||||||
|
// ConvertUTF.h and ConvertUTF.c which should be included in
|
||||||
|
// the distribution but are publically available from unicode.org
|
||||||
|
// at http://www.unicode.org/Public/PROGRAMS/CVTUTF/
|
||||||
|
ConversionResult retval;
|
||||||
|
const UTF8 * pUtf8 = (const UTF8 *) a_pInputData;
|
||||||
|
if (sizeof(wchar_t) == sizeof(UTF32)) {
|
||||||
|
UTF32 * pUtf32 = (UTF32 *) a_pOutputData;
|
||||||
|
retval = ConvertUTF8toUTF32(
|
||||||
|
&pUtf8, pUtf8 + a_uInputDataLen,
|
||||||
|
&pUtf32, pUtf32 + a_uOutputDataSize,
|
||||||
|
lenientConversion);
|
||||||
|
}
|
||||||
|
else if (sizeof(wchar_t) == sizeof(UTF16)) {
|
||||||
|
UTF16 * pUtf16 = (UTF16 *) a_pOutputData;
|
||||||
|
retval = ConvertUTF8toUTF16(
|
||||||
|
&pUtf8, pUtf8 + a_uInputDataLen,
|
||||||
|
&pUtf16, pUtf16 + a_uOutputDataSize,
|
||||||
|
lenientConversion);
|
||||||
|
}
|
||||||
|
return retval == conversionOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert to wchar_t
|
||||||
|
size_t retval = mbstowcs(a_pOutputData,
|
||||||
|
a_pInputData, a_uOutputDataSize);
|
||||||
|
return retval != (size_t)(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Calculate the number of char required by the storage format of this
|
||||||
|
* data. The storage format is always UTF-8 or MBCS.
|
||||||
|
*
|
||||||
|
* @param a_pInputData NULL terminated string to calculate the number of
|
||||||
|
* bytes required to be converted to storage format.
|
||||||
|
* @return Number of bytes required by the string when
|
||||||
|
* converted to storage format. This size always
|
||||||
|
* includes space for the terminating NULL character.
|
||||||
|
* @return -1 cast to size_t on a conversion error.
|
||||||
|
*/
|
||||||
|
size_t SizeToStore(
|
||||||
|
const SI_CHAR * a_pInputData)
|
||||||
|
{
|
||||||
|
if (m_bStoreIsUtf8) {
|
||||||
|
// worst case scenario for wchar_t to UTF-8 is 1 wchar_t -> 6 char
|
||||||
|
size_t uLen = 0;
|
||||||
|
while (a_pInputData[uLen]) {
|
||||||
|
++uLen;
|
||||||
|
}
|
||||||
|
return (6 * uLen) + 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
size_t uLen = wcstombs(NULL, a_pInputData, 0);
|
||||||
|
if (uLen == (size_t)(-1)) {
|
||||||
|
return uLen;
|
||||||
|
}
|
||||||
|
return uLen + 1; // include NULL terminator
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Convert the input string to the storage format of this data.
|
||||||
|
* The storage format is always UTF-8 or MBCS.
|
||||||
|
*
|
||||||
|
* @param a_pInputData NULL terminated source string to convert. All of
|
||||||
|
* the data will be converted including the
|
||||||
|
* terminating NULL character.
|
||||||
|
* @param a_pOutputData Pointer to the buffer to receive the converted
|
||||||
|
* string.
|
||||||
|
* @param a_uOutputDataSize Size of the output buffer in char.
|
||||||
|
* @return true if all of the input data, including the
|
||||||
|
* terminating NULL character was successfully
|
||||||
|
* converted.
|
||||||
|
*/
|
||||||
|
bool ConvertToStore(
|
||||||
|
const SI_CHAR * a_pInputData,
|
||||||
|
char * a_pOutputData,
|
||||||
|
size_t a_uOutputDataSize
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (m_bStoreIsUtf8) {
|
||||||
|
// calc input string length (SI_CHAR type and size independent)
|
||||||
|
size_t uInputLen = 0;
|
||||||
|
while (a_pInputData[uInputLen]) {
|
||||||
|
++uInputLen;
|
||||||
|
}
|
||||||
|
++uInputLen; // include the NULL char
|
||||||
|
|
||||||
|
// This uses the Unicode reference implementation to do the
|
||||||
|
// conversion from wchar_t to UTF-8. The required files are
|
||||||
|
// ConvertUTF.h and ConvertUTF.c which should be included in
|
||||||
|
// the distribution but are publically available from unicode.org
|
||||||
|
// at http://www.unicode.org/Public/PROGRAMS/CVTUTF/
|
||||||
|
ConversionResult retval;
|
||||||
|
UTF8 * pUtf8 = (UTF8 *) a_pOutputData;
|
||||||
|
if (sizeof(wchar_t) == sizeof(UTF32)) {
|
||||||
|
const UTF32 * pUtf32 = (const UTF32 *) a_pInputData;
|
||||||
|
retval = ConvertUTF32toUTF8(
|
||||||
|
&pUtf32, pUtf32 + uInputLen,
|
||||||
|
&pUtf8, pUtf8 + a_uOutputDataSize,
|
||||||
|
lenientConversion);
|
||||||
|
}
|
||||||
|
else if (sizeof(wchar_t) == sizeof(UTF16)) {
|
||||||
|
const UTF16 * pUtf16 = (const UTF16 *) a_pInputData;
|
||||||
|
retval = ConvertUTF16toUTF8(
|
||||||
|
&pUtf16, pUtf16 + uInputLen,
|
||||||
|
&pUtf8, pUtf8 + a_uOutputDataSize,
|
||||||
|
lenientConversion);
|
||||||
|
}
|
||||||
|
return retval == conversionOK;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
size_t retval = wcstombs(a_pOutputData,
|
||||||
|
a_pInputData, a_uOutputDataSize);
|
||||||
|
return retval != (size_t) -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SI_CONVERT_GENERIC
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// SI_CONVERT_ICU
|
// SI_CONVERT_ICU
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
@ -3027,13 +3245,7 @@ public:
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef NOMINMAX
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#else
|
|
||||||
#define NOMINMAX
|
|
||||||
#include <windows.h>
|
|
||||||
#undef NOMINMAX
|
|
||||||
#endif
|
|
||||||
#ifdef SI_NO_MBCS
|
#ifdef SI_NO_MBCS
|
||||||
# define SI_NoCase SI_GenericNoCase
|
# define SI_NoCase SI_GenericNoCase
|
||||||
#else // !SI_NO_MBCS
|
#else // !SI_NO_MBCS
|
||||||
|
@ -187,15 +187,6 @@ public:
|
|||||||
m_List.sort(DocumentRef::Type::Entry::LoadOrder());
|
m_List.sort(DocumentRef::Type::Entry::LoadOrder());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------
|
|
||||||
* Sort the entries by their load order but empty name always goes first.
|
|
||||||
*/
|
|
||||||
void SortByLoadOrderEmptyFirst()
|
|
||||||
{
|
|
||||||
if (!m_List.empty())
|
|
||||||
m_List.sort(DocumentRef::Type::Entry::LoadOrderEmptyFirst());
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------------------------
|
||||||
* Retrieve the string value of the current element item.
|
* Retrieve the string value of the current element item.
|
||||||
*/
|
*/
|
||||||
@ -214,4 +205,4 @@ public:
|
|||||||
|
|
||||||
} // Namespace:: SqMod
|
} // Namespace:: SqMod
|
||||||
|
|
||||||
#endif // _SQINI_ENTRIES_HPP_
|
#endif // _SQINI_ENTRIES_HPP_
|
||||||
|
@ -210,7 +210,6 @@ void RegisterAPI(HSQUIRRELVM vm)
|
|||||||
.Func(_SC("Sort"), &Entries::Sort)
|
.Func(_SC("Sort"), &Entries::Sort)
|
||||||
.Func(_SC("SortByKeyOrder"), &Entries::SortByKeyOrder)
|
.Func(_SC("SortByKeyOrder"), &Entries::SortByKeyOrder)
|
||||||
.Func(_SC("SortByLoadOrder"), &Entries::SortByLoadOrder)
|
.Func(_SC("SortByLoadOrder"), &Entries::SortByLoadOrder)
|
||||||
.Func(_SC("SortByLoadOrderEmptyFirst"), &Entries::SortByLoadOrderEmptyFirst)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
inins.Bind(_SC("Document"), Class< Document, NoCopy< Document > >(vm, _SC("SqIniDocument"))
|
inins.Bind(_SC("Document"), Class< Document, NoCopy< Document > >(vm, _SC("SqIniDocument"))
|
||||||
|
@ -1136,8 +1136,10 @@ void CmdListener::ProcSpec(CSStr str)
|
|||||||
// Reset current argument specifiers
|
// Reset current argument specifiers
|
||||||
memset(m_ArgSpec, CMDARG_ANY, sizeof(m_ArgSpec));
|
memset(m_ArgSpec, CMDARG_ANY, sizeof(m_ArgSpec));
|
||||||
// Make sure we have anything to parse
|
// Make sure we have anything to parse
|
||||||
if (!str || *str == 0)
|
if (!str || *str == '\0')
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
// Currently processed argument
|
// Currently processed argument
|
||||||
Uint32 idx = 0;
|
Uint32 idx = 0;
|
||||||
// Try to apply the specified type specifiers
|
// Try to apply the specified type specifiers
|
||||||
@ -1150,7 +1152,9 @@ void CmdListener::ProcSpec(CSStr str)
|
|||||||
if (*str == '|')
|
if (*str == '|')
|
||||||
{
|
{
|
||||||
if (idx >= SQMOD_MAX_CMD_ARGS)
|
if (idx >= SQMOD_MAX_CMD_ARGS)
|
||||||
|
{
|
||||||
SqThrowF("Extraneous type specifiers: %d >= %d", idx, SQMOD_MAX_CMD_ARGS);
|
SqThrowF("Extraneous type specifiers: %d >= %d", idx, SQMOD_MAX_CMD_ARGS);
|
||||||
|
}
|
||||||
// Move to the next character
|
// Move to the next character
|
||||||
++str;
|
++str;
|
||||||
// Advance to the next argument
|
// Advance to the next argument
|
||||||
@ -1160,9 +1164,12 @@ void CmdListener::ProcSpec(CSStr str)
|
|||||||
else if (*str != ',')
|
else if (*str != ',')
|
||||||
{
|
{
|
||||||
// Ignore non-alphabetic characters
|
// Ignore non-alphabetic characters
|
||||||
while (*str != 0 && !isalpha(*str)) ++str;
|
while (*str != 0 && !isalpha(*str))
|
||||||
|
{
|
||||||
|
++str;
|
||||||
|
}
|
||||||
// Apply the type specifier
|
// Apply the type specifier
|
||||||
switch(*str)
|
switch(*str++)
|
||||||
{
|
{
|
||||||
// Did we reached the end of the string?
|
// Did we reached the end of the string?
|
||||||
case '\0':
|
case '\0':
|
||||||
@ -1178,7 +1185,9 @@ void CmdListener::ProcSpec(CSStr str)
|
|||||||
m_ArgSpec[idx] |= CMDARG_INTEGER;
|
m_ArgSpec[idx] |= CMDARG_INTEGER;
|
||||||
// Disable greedy argument flag if set
|
// Disable greedy argument flag if set
|
||||||
if (m_ArgSpec[idx] & CMDARG_GREEDY)
|
if (m_ArgSpec[idx] & CMDARG_GREEDY)
|
||||||
|
{
|
||||||
m_ArgSpec[idx] ^= CMDARG_GREEDY;
|
m_ArgSpec[idx] ^= CMDARG_GREEDY;
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
// Is this a float type
|
// Is this a float type
|
||||||
case 'f':
|
case 'f':
|
||||||
@ -1186,7 +1195,9 @@ void CmdListener::ProcSpec(CSStr str)
|
|||||||
m_ArgSpec[idx] |= CMDARG_FLOAT;
|
m_ArgSpec[idx] |= CMDARG_FLOAT;
|
||||||
// Disable greedy argument flag if set
|
// Disable greedy argument flag if set
|
||||||
if (m_ArgSpec[idx] & CMDARG_GREEDY)
|
if (m_ArgSpec[idx] & CMDARG_GREEDY)
|
||||||
|
{
|
||||||
m_ArgSpec[idx] ^= CMDARG_GREEDY;
|
m_ArgSpec[idx] ^= CMDARG_GREEDY;
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
// Is this a boolean type
|
// Is this a boolean type
|
||||||
case 'b':
|
case 'b':
|
||||||
@ -1194,7 +1205,9 @@ void CmdListener::ProcSpec(CSStr str)
|
|||||||
m_ArgSpec[idx] |= CMDARG_BOOLEAN;
|
m_ArgSpec[idx] |= CMDARG_BOOLEAN;
|
||||||
// Disable greedy argument flag if set
|
// Disable greedy argument flag if set
|
||||||
if (m_ArgSpec[idx] & CMDARG_GREEDY)
|
if (m_ArgSpec[idx] & CMDARG_GREEDY)
|
||||||
|
{
|
||||||
m_ArgSpec[idx] ^= CMDARG_GREEDY;
|
m_ArgSpec[idx] ^= CMDARG_GREEDY;
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
// Is this a string type
|
// Is this a string type
|
||||||
case 's':
|
case 's':
|
||||||
@ -1202,7 +1215,9 @@ void CmdListener::ProcSpec(CSStr str)
|
|||||||
m_ArgSpec[idx] |= CMDARG_STRING;
|
m_ArgSpec[idx] |= CMDARG_STRING;
|
||||||
// Disable greedy argument flag if set
|
// Disable greedy argument flag if set
|
||||||
if (m_ArgSpec[idx] & CMDARG_GREEDY)
|
if (m_ArgSpec[idx] & CMDARG_GREEDY)
|
||||||
|
{
|
||||||
m_ArgSpec[idx] ^= CMDARG_GREEDY;
|
m_ArgSpec[idx] ^= CMDARG_GREEDY;
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
// Is this a lowercase string?
|
// Is this a lowercase string?
|
||||||
case 'l':
|
case 'l':
|
||||||
@ -1211,7 +1226,9 @@ void CmdListener::ProcSpec(CSStr str)
|
|||||||
m_ArgSpec[idx] |= CMDARG_LOWER;
|
m_ArgSpec[idx] |= CMDARG_LOWER;
|
||||||
// Disable greedy argument flag if set
|
// Disable greedy argument flag if set
|
||||||
if (m_ArgSpec[idx] & CMDARG_GREEDY)
|
if (m_ArgSpec[idx] & CMDARG_GREEDY)
|
||||||
|
{
|
||||||
m_ArgSpec[idx] ^= CMDARG_GREEDY;
|
m_ArgSpec[idx] ^= CMDARG_GREEDY;
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
// Is this a uppercase string?
|
// Is this a uppercase string?
|
||||||
case 'u':
|
case 'u':
|
||||||
@ -1220,7 +1237,9 @@ void CmdListener::ProcSpec(CSStr str)
|
|||||||
m_ArgSpec[idx] |= CMDARG_UPPER;
|
m_ArgSpec[idx] |= CMDARG_UPPER;
|
||||||
// Disable greedy argument flag if set
|
// Disable greedy argument flag if set
|
||||||
if (m_ArgSpec[idx] & CMDARG_GREEDY)
|
if (m_ArgSpec[idx] & CMDARG_GREEDY)
|
||||||
|
{
|
||||||
m_ArgSpec[idx] ^= CMDARG_GREEDY;
|
m_ArgSpec[idx] ^= CMDARG_GREEDY;
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
// Unknown type!
|
// Unknown type!
|
||||||
default: SqThrowF("Unknown type specifier (%c) at argument: %u", *str, idx);
|
default: SqThrowF("Unknown type specifier (%c) at argument: %u", *str, idx);
|
||||||
@ -1351,8 +1370,10 @@ void Register_Command(HSQUIRRELVM vm)
|
|||||||
|
|
||||||
cmdns.Func(_SC("GetOnError"), &Cmd_GetOnError);
|
cmdns.Func(_SC("GetOnError"), &Cmd_GetOnError);
|
||||||
cmdns.Func(_SC("SetOnError"), &Cmd_SetOnError);
|
cmdns.Func(_SC("SetOnError"), &Cmd_SetOnError);
|
||||||
|
cmdns.Func(_SC("BindError"), &Cmd_SetOnError);
|
||||||
cmdns.Func(_SC("GetOnAuth"), &Cmd_GetOnAuth);
|
cmdns.Func(_SC("GetOnAuth"), &Cmd_GetOnAuth);
|
||||||
cmdns.Func(_SC("SetOnAuth"), &Cmd_SetOnAuth);
|
cmdns.Func(_SC("SetOnAuth"), &Cmd_SetOnAuth);
|
||||||
|
cmdns.Func(_SC("BindAuth"), &Cmd_SetOnAuth);
|
||||||
cmdns.Func(_SC("GetInvoker"), &Cmd_GetInvoker);
|
cmdns.Func(_SC("GetInvoker"), &Cmd_GetInvoker);
|
||||||
cmdns.Func(_SC("GetInvokerID"), &Cmd_GetInvokerID);
|
cmdns.Func(_SC("GetInvokerID"), &Cmd_GetInvokerID);
|
||||||
cmdns.Func(_SC("GetName"), &Cmd_GetCommand);
|
cmdns.Func(_SC("GetName"), &Cmd_GetCommand);
|
||||||
|
@ -345,13 +345,21 @@ void Core::Terminate()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
CSStr Core::GetOption(const String & name) const
|
CSStr Core::GetOption(CSStr name) const
|
||||||
{
|
{
|
||||||
Options::const_iterator elem = m_Options.find(name);
|
Options::const_iterator elem = m_Options.find(name);
|
||||||
return (elem == m_Options.end()) ? g_EmptyStr : elem->second.c_str();
|
return (elem == m_Options.end()) ? _SC("") : elem->second.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Core::SetOption(const String & name, const String & value)
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
CSStr Core::GetOption(CSStr name, CSStr value) const
|
||||||
|
{
|
||||||
|
Options::const_iterator elem = m_Options.find(name);
|
||||||
|
return (elem == m_Options.end()) ? value : elem->second.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
void Core::SetOption(CSStr name, CSStr value)
|
||||||
{
|
{
|
||||||
m_Options[name] = value;
|
m_Options[name] = value;
|
||||||
}
|
}
|
||||||
|
@ -498,8 +498,9 @@ public:
|
|||||||
/* --------------------------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------------------------
|
||||||
* Option mutators.
|
* Option mutators.
|
||||||
*/
|
*/
|
||||||
CSStr GetOption(const String & name) const;
|
CSStr GetOption(CSStr name) const;
|
||||||
void SetOption(const String & name, const String & value);
|
CSStr GetOption(CSStr name, CSStr value) const;
|
||||||
|
void SetOption(CSStr name, CSStr value);
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------------------------
|
||||||
* Retrieve the virtual machine.
|
* Retrieve the virtual machine.
|
||||||
|
@ -50,17 +50,19 @@ static void SetState(Int32 value) { return _Core->SetState(value); }
|
|||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
static CSStr GetOption(CSStr name) { return _Core->GetOption(name); }
|
static CSStr GetOption(CSStr name) { return _Core->GetOption(name); }
|
||||||
|
static CSStr GetOptionOr(CSStr name, CSStr value) { return _Core->GetOption(name, value); }
|
||||||
static void SetOption(CSStr name, CSStr value) { return _Core->SetOption(name, value); }
|
static void SetOption(CSStr name, CSStr value) { return _Core->SetOption(name, value); }
|
||||||
|
|
||||||
// ================================================================================================
|
// ================================================================================================
|
||||||
void Register_Core(HSQUIRRELVM vm)
|
void Register_Core(HSQUIRRELVM vm)
|
||||||
{
|
{
|
||||||
RootTable(vm)
|
RootTable(vm)
|
||||||
.Bind(_SC("Core"), Table(vm)
|
.Bind(_SC("SqCore"), Table(vm)
|
||||||
.Func(_SC("Bind"), &BindEvent)
|
.Func(_SC("Bind"), &BindEvent)
|
||||||
.Func(_SC("GetState"), &GetState)
|
.Func(_SC("GetState"), &GetState)
|
||||||
.Func(_SC("SetState"), &SetState)
|
.Func(_SC("SetState"), &SetState)
|
||||||
.Func(_SC("GetOption"), &GetOption)
|
.Func(_SC("GetOption"), &GetOption)
|
||||||
|
.Func(_SC("GetOptionOr"), &GetOptionOr)
|
||||||
.Func(_SC("SetOption"), &SetOption)
|
.Func(_SC("SetOption"), &SetOption)
|
||||||
.Func(_SC("GetBlip"), &GetBlip)
|
.Func(_SC("GetBlip"), &GetBlip)
|
||||||
.Func(_SC("GetCheckpoint"), &GetCheckpoint)
|
.Func(_SC("GetCheckpoint"), &GetCheckpoint)
|
||||||
|
Loading…
Reference in New Issue
Block a user