Browse Source

Fix handling of single utf characters specified through '\u0000'

mingodad 4 years ago
parent
commit
b34e9469fa
2 changed files with 16 additions and 5 deletions
  1. 7 5
      SquiLu/squirrel/sqlexer.cpp
  2. 9 0
      SquiLu/tests/squilu-test.nut

+ 7 - 5
SquiLu/squirrel/sqlexer.cpp

@@ -572,7 +572,7 @@ SQInteger scisodigit(SQInteger c) { return c >= _SC('0') && c <= _SC('7'); }
 SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
 SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
 {
 {
 	INIT_TEMP_STRING();
 	INIT_TEMP_STRING();
-	SQInteger start_equals = 0;
+	SQInteger start_equals = 0, utf_len = 0; SQUnsignedInteger utf_value = 0;
 	SQChar cpp_delimin[32], cdelim1, cdelim2, saved_ndelim = ndelim;
 	SQChar cpp_delimin[32], cdelim1, cdelim2, saved_ndelim = ndelim;
 	if(ndelim == _SC('{')){
 	if(ndelim == _SC('{')){
 	    cdelim1 = _SC('{');
 	    cdelim1 = _SC('{');
@@ -669,12 +669,14 @@ try_again:
                         SQChar *stemp;
                         SQChar *stemp;
 #ifdef SQUNICODE
 #ifdef SQUNICODE
 #if WCHAR_SIZE == 2
 #if WCHAR_SIZE == 2
-                        AddUTF16(scstrtoul(temp, &stemp, 16));
+                        utf_value = scstrtoul(temp, &stemp, 16);
+                        utf_len += AddUTF16(utf_value);
 #else
 #else
                         ADD_CHAR((SQChar)scstrtoul(temp, &stemp, 16));
                         ADD_CHAR((SQChar)scstrtoul(temp, &stemp, 16));
 #endif
 #endif
 #else
 #else
-                        AddUTF8(scstrtoul(temp, &stemp, 16));
+                        utf_value = scstrtoul(temp, &stemp, 16);
+                        utf_len += AddUTF8(utf_value);
 #endif
 #endif
 					}
 					}
 				    break;
 				    break;
@@ -792,8 +794,8 @@ try_again:
 	SQInteger len = data->longstr.size()-1;
 	SQInteger len = data->longstr.size()-1;
 	if(ndelim == _SC('\'') && !_want_stringSingleAndDoubleQuotes) {
 	if(ndelim == _SC('\'') && !_want_stringSingleAndDoubleQuotes) {
 		if(len == 0) return Error(_SC("empty constant"));
 		if(len == 0) return Error(_SC("empty constant"));
-		if(len > 1) return Error(_SC("constant too long"));
-		data->nvalue = data->longstr[0];
+		if(len > 1 && len != utf_len) Error(_SC("constant too long"));
+		data->nvalue = utf_len ? utf_value : data->longstr[0];
 		data->isCharacter = SQTrue;
 		data->isCharacter = SQTrue;
 		return TK_INTEGER;
 		return TK_INTEGER;
 	}
 	}

+ 9 - 0
SquiLu/tests/squilu-test.nut

@@ -1289,6 +1289,15 @@ bar]==] == "foo\nbar");
 	//C/C++ wchar
 	//C/C++ wchar
 	sqt.ok(L"fake wchar" == "fake wchar");
 	sqt.ok(L"fake wchar" == "fake wchar");
 	sqt.ok(L'\n' == '\n');
 	sqt.ok(L'\n' == '\n');
+
+	//utf8
+	sqt.ok("aàeèiìoòuù".isvalidutf8());
+	sqt.ok("aàeèiìoòuù".utf8Len() == 10);
+	sqt.ok("aàeèiìoòuù".len() == 15);
+	sqt.ok('\u0031' == 49);
+	sqt.ok('\u0531' == 1329);
+
+
 });
 });
 
 
 sqt.run("number", function(){
 sqt.run("number", function(){