diff -r 3827fd64bb58 -r 19e7838bedad hedgewars/uScript.pas --- a/hedgewars/uScript.pas Tue Sep 12 08:35:13 2017 -0400 +++ b/hedgewars/uScript.pas Tue Sep 12 16:14:40 2017 -0400 @@ -2996,6 +2996,9 @@ const BUFSIZE = 1024; var inComment: boolean; +var inQuote: boolean; +var braceCount: LongWord; +var wordCount: LongWord; var lastChar: char; // ⭒⭐⭒✨⭐⭒✨⭐☆✨⭐✨✧✨☆✨✧✨☆⭒✨☆⭐⭒☆✧✨⭒✨⭐✧⭒☆⭒✧☆✨✧⭐☆✨☆✧⭒✨✧⭒☆⭐☆✧ function ScriptReader(L: Plua_State; f: PFSFile; sz: Psize_t) : PChar; Cdecl; @@ -3019,6 +3022,42 @@ end; ScriptReader:= mybuf end; +function ScriptLocaleReader(L: Plua_State; f: PFSFile; sz: Psize_t) : PChar; Cdecl; +var mybuf: PChar; + i: LongInt; +begin + mybuf := physfsReader(L, f, sz); + if (mybuf <> nil) and (sz^ > 0) then + begin + for i:= 0 to sz^-1 do + begin + if not inComment and (mybuf[i] = '"') and (lastChar <> '\') then + inQuote := not inQuote; + if (lastChar = '-') and (mybuf[i] = '-') then + inComment := true; + // gonna add any non-magic whitespace and skip - just to make comment avoidance easier + if not inComment and not inQuote and + ((mybuf[i] = '(') or + (mybuf[i] = ')') or + (mybuf[i] = '+') or + (mybuf[i] = '#') or + (braceCount > 2) or + (wordCount > 6)) then + CheckSum := $deadbeef; + if not inComment and not inQuote and ((mybuf[i] = '{') or (mybuf[i] = '}')) then + inc(braceCount); + if not inComment and not inQuote and + (((byte(mybuf[i]) > $40) and (byte(mybuf[i]) < $5B)) or + ((byte(mybuf[i]) > $60) and (byte(mybuf[i]) < $6B)) or + ((byte(mybuf[i]) >= $30) and (byte(mybuf[i]) < $40))) then + inc(wordCount); + lastChar := mybuf[i]; + if (byte(mybuf[i]) = $0D) or (byte(mybuf[i]) = $0A) then + inComment := false + end; + end; + ScriptLocaleReader:= mybuf +end; // ⭒⭐⭒✨⭐⭒✨⭐☆✨⭐✨✧✨☆✨✧✨☆⭒✨☆⭐⭒☆✧✨⭒✨⭐✧⭒☆⭒✧☆✨✧⭐☆✨☆✧⭒✨✧⭒☆⭐☆✧ procedure ScriptLoad(name : shortstring); @@ -3028,7 +3067,10 @@ buf : array[0..Pred(BUFSIZE)] of byte; begin inComment:= false; +inQuote:= false; lastChar:= 'X'; +braceCount:= 0; +wordCount:= 0; s:= cPathz[ptData] + name; if not pfsExists(s) then begin @@ -3043,7 +3085,9 @@ hedgewarsMountPackage(Str2PChar(copy(s, 1, length(s)-4)+'.hwp')); physfsReaderSetBuffer(@buf); -ret:= lua_load(luaState, @ScriptReader, f, Str2PChar(s)); +if Pos('Data/Locale',s) <> 0 then + ret:= lua_load(luaState, @ScriptLocaleReader, f, Str2PChar(s)) +else ret:= lua_load(luaState, @ScriptReader, f, Str2PChar(s)); pfsClose(f); if ret <> 0 then