diff --git a/src/3rdparty/squirrel/include/squirrel.h b/src/3rdparty/squirrel/include/squirrel.h index 3be4253048..1fe023dfff 100644 --- a/src/3rdparty/squirrel/include/squirrel.h +++ b/src/3rdparty/squirrel/include/squirrel.h @@ -183,7 +183,7 @@ typedef char SQChar; #define scstrdup strdup #define scstrrchr strrchr #define scstrcat strcat -#define MAX_CHAR 0xFF +#define MAX_CHAR 0xFFFF #endif #define SQUIRREL_VERSION _SC("Squirrel 2.2.5 stable - With custom OpenTTD modifications") diff --git a/src/3rdparty/squirrel/squirrel/sqlexer.h b/src/3rdparty/squirrel/squirrel/sqlexer.h index 4b5ac203c0..1d81ab3c8b 100644 --- a/src/3rdparty/squirrel/squirrel/sqlexer.h +++ b/src/3rdparty/squirrel/squirrel/sqlexer.h @@ -2,11 +2,7 @@ #ifndef _SQLEXER_H_ #define _SQLEXER_H_ -#ifdef SQUNICODE -typedef SQChar LexChar; -#else -typedef unsigned char LexChar; -#endif +typedef unsigned short LexChar; struct SQLexer { diff --git a/src/script/squirrel.cpp b/src/script/squirrel.cpp index da5ed47c21..1f4ce7ae97 100644 --- a/src/script/squirrel.cpp +++ b/src/script/squirrel.cpp @@ -413,14 +413,14 @@ static SQInteger _io_file_lexfeed_UTF8(SQUserPointer file) return c; } -static SQInteger _io_file_lexfeed_UCS2_LE(SQUserPointer file) +static SQInteger _io_file_lexfeed_UCS2_no_swap(SQUserPointer file) { wchar_t c; if (((SQFile *)file)->Read(&c, sizeof(c), 1) > 0) return (SQChar)c; return 0; } -static SQInteger _io_file_lexfeed_UCS2_BE(SQUserPointer file) +static SQInteger _io_file_lexfeed_UCS2_swap(SQUserPointer file) { unsigned short c; if (((SQFile *)file)->Read(&c, sizeof(c), 1) > 0) { @@ -472,9 +472,15 @@ SQRESULT Squirrel::LoadFile(HSQUIRRELVM vm, const char *filename, SQBool printer FioFCloseFile(file); return sq_throwerror(vm, _SC("Couldn't read bytecode")); } - case 0xFFFE: func = _io_file_lexfeed_UCS2_BE; break; // UTF-16 little endian - case 0xFEFF: func = _io_file_lexfeed_UCS2_LE; break; // UTF-16 big endian + case 0xFFFE: + /* Either this file is encoded as big-endian and we're on a little-endian + * machine, or this file is encoded as little-endian and we're on a big-endian + * machine. Either way, swap the bytes of every word we read. */ + func = _io_file_lexfeed_UCS2_swap; + break; + case 0xFEFF: func = _io_file_lexfeed_UCS2_no_swap; break; case 0xBBEF: // UTF-8 + case 0xEFBB: // UTF-8 on big-endian machine if (fread(&uc, 1, sizeof(uc), file) == 0) { FioFCloseFile(file); return sq_throwerror(vm, _SC("I/O error"));