Revert 88929358d2e1 in favor of ansistrings implementation in pas2c
authorunc0rr
Fri, 07 Feb 2014 23:57:32 +0400
changeset 10122 cefede760264
parent 10121 8b65699beb56
child 10123 64e72781d344
Revert 88929358d2e1 in favor of ansistrings implementation in pas2c
hedgewars/hwengine.pas
hedgewars/uLocale.pas
hedgewars/uPhysFSLayer.pas
hedgewars/uScript.pas
hedgewars/uStore.pas
hedgewars/uVariables.pas
hedgewars/uWorld.pas
--- a/hedgewars/hwengine.pas	Fri Feb 07 22:42:57 2014 +0400
+++ b/hedgewars/hwengine.pas	Fri Feb 07 23:57:32 2014 +0400
@@ -458,7 +458,6 @@
 
     if complete then
     begin
-        uLocale.initModule;
         uPhysFSLayer.initModule;
         uTextures.initModule;
 {$IFDEF ANDROID}GLUnit.initModule;{$ENDIF}
@@ -515,7 +514,6 @@
 {$IFDEF ANDROID}GLUnit.freeModule;{$ENDIF}
         uTextures.freeModule;
         uPhysFSLayer.freeModule;
-        uLocale.freeModule;
         end;
 
     uIO.freeModule;
--- a/hedgewars/uLocale.pas	Fri Feb 07 22:42:57 2014 +0400
+++ b/hedgewars/uLocale.pas	Fri Feb 07 23:57:32 2014 +0400
@@ -26,24 +26,21 @@
 
 procedure LoadLocale(FileName: shortstring);
 function  Format(fmt: shortstring; var arg: shortstring): shortstring;
-function  FormatA(fmt: PChar; arg: ansistring): ansistring;
-function  GetEventString(e: TEventId): PChar;
-procedure initModule;
-procedure freeModule;
+function  FormatA(fmt: ansistring; var arg: ansistring): ansistring;
+function  GetEventString(e: TEventId): ansistring;
 
 {$IFDEF HWLIBRARY}
 procedure LoadLocaleWrapper(str: pchar); cdecl; export;
 {$ENDIF}
 
 implementation
-uses uRandom, uVariables, uDebug, uPhysFSLayer, sysutils, uUtils;
+uses uRandom, uUtils, uVariables, uDebug, uPhysFSLayer;
 
-var trevt: array[TEventId] of array [0..Pred(MAX_EVENT_STRINGS)] of PChar;
+var trevt: array[TEventId] of array [0..Pred(MAX_EVENT_STRINGS)] of ansistring;
     trevt_n: array[TEventId] of integer;
 
 procedure LoadLocale(FileName: shortstring);
-var s: PChar = nil;
-    sc: PChar;
+var s: ansistring = '';
     f: pfsFile;
     a, b, c: LongInt;
     first: array[TEventId] of boolean;
@@ -60,48 +57,47 @@
     while not pfsEof(f) do
         begin
         pfsReadLnA(f, s);
-        if (StrLength(s) > 0) and (s[0] >= '0') and (s[0] <= '9') then
-            begin
-            TryDo(StrLength(s) > 6, 'Load locale: empty string', true);
-            val(s[0]+s[1], a, c);
-            TryDo(c = 0, 'Load locale: numbers should be two-digit: ' + s, true);
-            TryDo(s[2] = ':', 'Load locale: ":" expected', true);
-            val(s[3]+s[4], b, c);
-            TryDo(c = 0, 'Load locale: numbers should be two-digit' + s, true);
-            TryDo(s[5] = '=', 'Load locale: "=" expected', true);
-            sc:= StrAlloc(StrLength(s) - 5);
-            StrCopy(sc, @s[6]);
-            case a of
-                0: if (b >=0) and (b <= ord(High(TAmmoStrId))) then
-                    trammo[TAmmoStrId(b)]:= sc;
-                1: if (b >=0) and (b <= ord(High(TMsgStrId))) then
-                    trmsg[TMsgStrId(b)]:= sc;
-                2: if (b >=0) and (b <= ord(High(TEventId))) then
+        if Length(s) = 0 then
+            continue;
+        if (s[1] < '0') or (s[1] > '9') then
+            continue;
+        TryDo(Length(s) > 6, 'Load locale: empty string', true);
+        val(s[1]+s[2], a, c);
+        TryDo(c = 0, 'Load locale: numbers should be two-digit: ' + s, true);
+        TryDo(s[3] = ':', 'Load locale: ":" expected', true);
+        val(s[4]+s[5], b, c);
+        TryDo(c = 0, 'Load locale: numbers should be two-digit' + s, true);
+        TryDo(s[6] = '=', 'Load locale: "=" expected', true);
+        Delete(s, 1, 6);
+        case a of
+            0: if (b >=0) and (b <= ord(High(TAmmoStrId))) then
+                trammo[TAmmoStrId(b)]:= s;
+            1: if (b >=0) and (b <= ord(High(TMsgStrId))) then
+                trmsg[TMsgStrId(b)]:= s;
+            2: if (b >=0) and (b <= ord(High(TEventId))) then
+                begin
+                TryDo(trevt_n[TEventId(b)] < MAX_EVENT_STRINGS, 'Too many event strings in ' + IntToStr(a) + ':' + IntToStr(b), false);
+                if first[TEventId(b)] then
                     begin
-                    TryDo(trevt_n[TEventId(b)] < MAX_EVENT_STRINGS, 'Too many event strings in ' + IntToStr(a) + ':' + IntToStr(b), false);
-                    if first[TEventId(b)] then
-                        begin
-                        trevt_n[TEventId(b)]:= 0;
-                        first[TEventId(b)]:= false;
-                        end;
-                    trevt[TEventId(b)][trevt_n[TEventId(b)]]:= sc;
-                    inc(trevt_n[TEventId(b)]);
+                    trevt_n[TEventId(b)]:= 0;
+                    first[TEventId(b)]:= false;
                     end;
-                3: if (b >=0) and (b <= ord(High(TAmmoStrId))) then
-                    trammoc[TAmmoStrId(b)]:= sc;
-                4: if (b >=0) and (b <= ord(High(TAmmoStrId))) then
-                    trammod[TAmmoStrId(b)]:= sc;
-                5: if (b >=0) and (b <= ord(High(TGoalStrId))) then
-                    trgoal[TGoalStrId(b)]:= sc;
-            end;
-            end;
-        StrDispose(s);
-        end;
+                trevt[TEventId(b)][trevt_n[TEventId(b)]]:= s;
+                inc(trevt_n[TEventId(b)]);
+                end;
+            3: if (b >=0) and (b <= ord(High(TAmmoStrId))) then
+                trammoc[TAmmoStrId(b)]:= s;
+            4: if (b >=0) and (b <= ord(High(TAmmoStrId))) then
+                trammod[TAmmoStrId(b)]:= s;
+            5: if (b >=0) and (b <= ord(High(TGoalStrId))) then
+                trgoal[TGoalStrId(b)]:= s;
+           end;
+       end;
    pfsClose(f);
    end;
 end;
 
-function GetEventString(e: TEventId): PChar;
+function GetEventString(e: TEventId): ansistring;
 begin
     if trevt_n[e] = 0 then // no messages for this event type?
         GetEventString:= '*missing translation*'
@@ -119,17 +115,14 @@
     Format:= copy(fmt, 1, i - 1) + arg + Format(copy(fmt, i + 2, Length(fmt) - i - 1), arg)
 end;
 
-function FormatA(fmt: PChar; arg: ansistring): ansistring;
+function FormatA(fmt: ansistring; var arg: ansistring): ansistring;
 var i: LongInt;
-    s: ansistring;
 begin
-s:= fmt;
-
-i:= Pos('%1', s);
+i:= Pos('%1', fmt);
 if i = 0 then
-    FormatA:= s
+    FormatA:= fmt
 else
-    FormatA:= copy(s, 1, i - 1) + arg + FormatA(PChar(copy(s, i + 2, Length(s) - i - 1)), arg)
+    FormatA:= copy(fmt, 1, i - 1) + arg + FormatA(copy(fmt, i + 2, Length(fmt) - i - 1), arg)
 end;
 
 {$IFDEF HWLIBRARY}
@@ -139,22 +132,4 @@
 end;
 {$ENDIF}
 
-procedure initModule;
-var e: TEventId;
-    i: LongInt;
-begin
-    for e:= Low(TEventId) to High(TEventId) do
-        for i:= 0 to Pred(MAX_EVENT_STRINGS) do
-            trevt[e][i]:= nil;
-end;
-
-procedure freeModule;
-var e: TEventId;
-    i: LongInt;
-begin
-    for e:= Low(TEventId) to High(TEventId) do
-        for i:= 0 to Pred(trevt_n[e]) do
-            StrDispose(trevt[e][i]);
-end;
-
 end.
--- a/hedgewars/uPhysFSLayer.pas	Fri Feb 07 22:42:57 2014 +0400
+++ b/hedgewars/uPhysFSLayer.pas	Fri Feb 07 23:57:32 2014 +0400
@@ -23,7 +23,7 @@
 function pfsClose(f: PFSFile): boolean;
 
 procedure pfsReadLn(f: PFSFile; var s: shortstring);
-procedure pfsReadLnA(f: PFSFile; var s: PChar);
+procedure pfsReadLnA(f: PFSFile; var s: ansistring);
 function pfsBlockRead(f: PFSFile; buf: pointer; size: Int64): Int64;
 function pfsEOF(f: PFSFile): boolean;
 
@@ -99,34 +99,26 @@
         end
 end;
 
-procedure pfsReadLnA(f: PFSFile; var s: PChar);
-var l, bufsize: Longword;
-    r: Int64;
-    b: PChar;
+procedure pfsReadLnA(f: PFSFile; var s: ansistring);
+var c: char;
+    b: shortstring;
 begin
-bufsize:= 256;
-s:= StrAlloc(bufsize);
-l:= 0;
+s:= '';
+b[0]:= #0;
 
-repeat
-    r:= PHYSFS_readBytes(f, @s[l], 1);
-
-    if (r = 1) and (s[l] <> #13) then
+while (PHYSFS_readBytes(f, @c, 1) = 1) and (c <> #10) do
+    if (c <> #13) then
         begin
-        inc(l);
-        if l = bufsize then
+        inc(b[0]);
+        b[byte(b[0])]:= c;
+        if b[0] = #255 then
             begin
-            b:= s;
-            inc(bufsize, 256);
-            s:= StrAlloc(bufsize);
-            StrCopy(s, b);
-            StrDispose(b)
+            s:= s + b;
+            b[0]:= #0
             end
         end;
-
-until (r = 0) or (s[l - 1] = #10);
-
-if (r = 0) then s[l]:= #0 else s[l - 1]:= #0
+        
+s:= s + b
 end;
 
 function pfsBlockRead(f: PFSFile; buf: pointer; size: Int64): Int64;
--- a/hedgewars/uScript.pas	Fri Feb 07 22:42:57 2014 +0400
+++ b/hedgewars/uScript.pas	Fri Feb 07 23:57:32 2014 +0400
@@ -228,7 +228,7 @@
 begin
     if lua_gettop(L) = 5 then
         begin
-        ShowMission(lua_tolstring(L, 1, nil), lua_tolstring(L, 2, nil), lua_tolstring(L, 3, nil), lua_tointeger(L, 4), lua_tointeger(L, 5));
+        ShowMission(lua_tostring(L, 1), lua_tostring(L, 2), lua_tostring(L, 3), lua_tointeger(L, 4), lua_tointeger(L, 5));
         end
     else
         LuaParameterCountError('ShowMission', 'caption, subcaption, text, icon, time', lua_gettop(L));
@@ -308,10 +308,10 @@
 function lc_addcaption(L : Plua_State) : LongInt; Cdecl;
 begin
     if lua_gettop(L) = 1 then
-        AddCaption(lua_tolstring(L, 1, nil), cWhiteColor, capgrpMessage)
+        AddCaption(lua_tostring(L, 1), cWhiteColor, capgrpMessage)
     else if lua_gettop(L) = 3 then
         begin
-        AddCaption(lua_tolstring(L, 1, nil), lua_tointeger(L, 2) shr 8, TCapGroup(lua_tointeger(L, 3)));
+        AddCaption(lua_tostring(L, 1), lua_tointeger(L, 2) shr 8, TCapGroup(lua_tointeger(L, 3)));
         end
     else
         LuaParameterCountError('AddCaption', 'text[, color, captiongroup]', lua_gettop(L));
--- a/hedgewars/uStore.pas	Fri Feb 07 22:42:57 2014 +0400
+++ b/hedgewars/uStore.pas	Fri Feb 07 23:57:32 2014 +0400
@@ -44,7 +44,7 @@
 procedure LoadHedgehogHat(var HH: THedgehog; newHat: shortstring);
 procedure SetupOpenGL;
 procedure SetScale(f: GLfloat);
-function  RenderHelpWindow(caption, subcaption, description, extra: PChar; extracolor: LongInt; iconsurf: PSDL_Surface; iconrect: PSDL_Rect): PTexture;
+function  RenderHelpWindow(caption, subcaption, description, extra: ansistring; extracolor: LongInt; iconsurf: PSDL_Surface; iconrect: PSDL_Rect): PTexture;
 procedure RenderWeaponTooltip(atype: TAmmoType);
 procedure ShowWeaponTooltip(x, y: LongInt);
 procedure FreeWeaponTooltip;
@@ -1229,7 +1229,7 @@
     Step:= 0
 end;
 
-function RenderHelpWindow(caption, subcaption, description, extra: PChar; extracolor: LongInt; iconsurf: PSDL_Surface; iconrect: PSDL_Rect): PTexture;
+function RenderHelpWindow(caption, subcaption, description, extra: ansistring; extracolor: LongInt; iconsurf: PSDL_Surface; iconrect: PSDL_Rect): PTexture;
 var tmpsurf: PSDL_SURFACE;
     w, h, i, j: LongInt;
     font: THWFont;
@@ -1258,13 +1258,13 @@
 // TODO: Recheck height/position calculation
 
 // get caption's dimensions
-TTF_SizeUTF8(Fontz[font].Handle, caption, @i, @j);
+TTF_SizeUTF8(Fontz[font].Handle, PChar(caption), @i, @j);
 // width adds 36 px (image + space)
 w:= i + 36 + wa;
 h:= j + ha;
 
 // get sub caption's dimensions
-TTF_SizeUTF8(Fontz[font].Handle, subcaption, @i, @j);
+TTF_SizeUTF8(Fontz[font].Handle, PChar(subcaption), @i, @j);
 // width adds 36 px (image + space)
 if w < (i + 36 + wa) then
     w:= i + 36 + wa;
@@ -1288,7 +1288,7 @@
 if extra <> '' then
     begin
     // get extra label's dimensions
-    TTF_SizeUTF8(Fontz[font].Handle, extra, @i, @j);
+    TTF_SizeUTF8(Fontz[font].Handle, PChar(extra), @i, @j);
     if w < (i + wa) then
         w:= i + wa;
     inc(h, j + ha);
@@ -1309,9 +1309,9 @@
 DrawRoundRect(@r, cWhiteColor, cNearBlackColor, tmpsurf, true);
 
 // render caption
-r:= WriteInRect(tmpsurf, 36 + cFontBorder + 2, ha, $ffffffff, font, caption);
+r:= WriteInRect(tmpsurf, 36 + cFontBorder + 2, ha, $ffffffff, font, PChar(caption));
 // render sub caption
-r:= WriteInRect(tmpsurf, 36 + cFontBorder + 2, r.y + r.h, $ffc7c7c7, font, subcaption);
+r:= WriteInRect(tmpsurf, 36 + cFontBorder + 2, r.y + r.h, $ffc7c7c7, font, PChar(subcaption));
 
 // render all description lines
 tmpdesc:= description;
@@ -1333,7 +1333,7 @@
     end;
 
 if extra <> '' then
-    r:= WriteInRect(tmpsurf, cFontBorder + 2, r.y + r.h, extracolor, font, extra);
+    r:= WriteInRect(tmpsurf, cFontBorder + 2, r.y + r.h, extracolor, font, PChar(extra));
 
 r.x:= cFontBorder + 6;
 r.y:= cFontBorder + 4;
@@ -1349,7 +1349,7 @@
 procedure RenderWeaponTooltip(atype: TAmmoType);
 var r: TSDL_Rect;
     i: LongInt;
-    extra: PChar;
+    extra: ansistring;
     extracolor: LongInt;
 begin
 // don't do anything if the window shouldn't be shown
--- a/hedgewars/uVariables.pas	Fri Feb 07 22:42:57 2014 +0400
+++ b/hedgewars/uVariables.pas	Fri Feb 07 23:57:32 2014 +0400
@@ -2385,11 +2385,11 @@
     aTexCoord: GLint;
     aColor: GLint;
 
-var trammo:  array[TAmmoStrId] of PChar;   // name of the weapon
-    trammoc: array[TAmmoStrId] of PChar;   // caption of the weapon
-    trammod: array[TAmmoStrId] of PChar;   // description of the weapon
-    trmsg:   array[TMsgStrId]  of PChar;   // message of the event
-    trgoal:  array[TGoalStrId] of PChar;   // message of the goal
+var trammo:  array[TAmmoStrId] of ansistring;   // name of the weapon
+    trammoc: array[TAmmoStrId] of ansistring;   // caption of the weapon
+    trammod: array[TAmmoStrId] of ansistring;   // description of the weapon
+    trmsg:   array[TMsgStrId]  of ansistring;   // message of the event
+    trgoal:  array[TGoalStrId] of ansistring;   // message of the goal
     cTestLua : Boolean;
 
 procedure preInitModule;
@@ -2397,7 +2397,7 @@
 procedure freeModule;
 
 implementation
-uses strutils, sysutils;
+uses strutils;
 
 procedure preInitModule;
 begin
@@ -2442,21 +2442,7 @@
 end;
 
 procedure initModule;
-var asid: TAmmoStrId;
-    msid: TMsgStrId;
-    gsid: TGoalStrId;
 begin
-    for asid:= Low(TAmmoStrId) to High(TAmmoStrId) do
-        begin
-        trammo[asid]:= nil;
-        trammoc[asid]:= nil;
-        trammod[asid]:= nil;
-        end;
-    for msid:= Low(TMsgStrId) to High(TMsgStrId) do
-        trmsg[msid]:= nil;
-    for gsid:= Low(TGoalStrId) to High(TGoalStrId) do
-        trgoal[gsid]:= nil;
-
 // TODO: fixme
 {$IFDEF PAS2C}
     cLocale:= 'en';
@@ -2644,20 +2630,7 @@
 end;
 
 procedure freeModule;
-var asid: TAmmoStrId;
-    msid: TMsgStrId;
-    gsid: TGoalStrId;
 begin
-    for asid:= Low(TAmmoStrId) to High(TAmmoStrId) do
-        begin
-        if trammo[asid] <> nil then StrDispose(trammo[asid]);
-        if trammoc[asid] <> nil then StrDispose(trammoc[asid]);
-        if trammod[asid] <> nil then StrDispose(trammod[asid]);
-        end;
-    for msid:= Low(TMsgStrId) to High(TMsgStrId) do
-        if trmsg[msid] <> nil then StrDispose(trmsg[msid]);
-    for gsid:= Low(TGoalStrId) to High(TGoalStrId) do
-        if trgoal[gsid] <> nil then StrDispose(trgoal[gsid]);
 end;
 
 end.
--- a/hedgewars/uWorld.pas	Fri Feb 07 22:42:57 2014 +0400
+++ b/hedgewars/uWorld.pas	Fri Feb 07 23:57:32 2014 +0400
@@ -31,7 +31,7 @@
 
 procedure DrawWorld(Lag: LongInt);
 procedure DrawWorldStereo(Lag: LongInt; RM: TRenderMode);
-procedure ShowMission(caption, subcaption, mtext: PChar; icon, time : LongInt);
+procedure ShowMission(caption, subcaption, text: ansistring; icon, time : LongInt);
 procedure HideMission;
 procedure ShakeCamera(amount: LongInt);
 procedure InitCameraBorders;
@@ -220,7 +220,7 @@
 
 // if the string has been set, show it for (default timeframe) seconds
 if length(g) > 0 then
-    ShowMission(trgoal[gidCaption], trgoal[gidSubCaption], PChar(g), 1, 0);
+    ShowMission(trgoal[gidCaption], trgoal[gidSubCaption], g, 1, 0);
 
 cWaveWidth:= SpritesData[sprWater].Width;
 //cWaveHeight:= SpritesData[sprWater].Height;
@@ -1968,7 +1968,7 @@
     WorldDx:= 1024;
 end;
 
-procedure ShowMission(caption, subcaption, mtext: PChar; icon, time : LongInt);
+procedure ShowMission(caption, subcaption, text: ansistring; icon, time : LongInt);
 var r: TSDL_Rect;
 begin
 r.w:= 32;
@@ -1983,13 +1983,13 @@
     begin
     r.x:= 0;
     r.y:= icon * 32;
-    missionTex:= RenderHelpWindow(caption, subcaption, mtext, '', 0, MissionIcons, @r)
+    missionTex:= RenderHelpWindow(caption, subcaption, text, '', 0, MissionIcons, @r)
     end
 else
     begin
     r.x:= ((-icon - 1) shr 4) * 32;
     r.y:= ((-icon - 1) mod 16) * 32;
-    missionTex:= RenderHelpWindow(caption, subcaption, mtext, '', 0, SpritesData[sprAMAmmos].Surface, @r)
+    missionTex:= RenderHelpWindow(caption, subcaption, text, '', 0, SpritesData[sprAMAmmos].Surface, @r)
     end;
 end;