hedgewars/uPhysFSLayer.pas
changeset 10009 88929358d2e1
parent 9996 d93fb04619ee
child 10015 4feced261c68
--- a/hedgewars/uPhysFSLayer.pas	Fri Jan 17 18:17:47 2014 +0100
+++ b/hedgewars/uPhysFSLayer.pas	Sat Jan 18 00:10:33 2014 +0400
@@ -25,7 +25,7 @@
 function pfsClose(f: PFSFile): boolean;
 
 procedure pfsReadLn(f: PFSFile; var s: shortstring);
-procedure pfsReadLnA(f: PFSFile; var s: ansistring);
+procedure pfsReadLnA(f: PFSFile; var s: PChar);
 function pfsBlockRead(f: PFSFile; buf: pointer; size: Int64): Int64;
 function pfsEOF(f: PFSFile): boolean;
 
@@ -97,26 +97,34 @@
         end
 end;
 
-procedure pfsReadLnA(f: PFSFile; var s: ansistring);
-var c: char;
-    b: shortstring;
+procedure pfsReadLnA(f: PFSFile; var s: PChar);
+var l, bufsize: Longword;
+    r: Int64;
+    b: PChar;
 begin
-s:= '';
-b[0]:= #0;
+bufsize:= 256;
+s:= StrAlloc(bufsize);
+l:= 0;
 
-while (PHYSFS_readBytes(f, @c, 1) = 1) and (c <> #10) do
-    if (c <> #13) then
+repeat
+    r:= PHYSFS_readBytes(f, @s[l], 1);
+
+    if (r = 1) and (s[l] <> #13) then
         begin
-        inc(b[0]);
-        b[byte(b[0])]:= c;
-        if b[0] = #255 then
+        inc(l);
+        if l = bufsize then
             begin
-            s:= s + b;
-            b[0]:= #0
+            b:= s;
+            inc(bufsize, 256);
+            s:= StrAlloc(bufsize);
+            StrCopy(s, b);
+            StrDispose(b)
             end
         end;
-        
-s:= s + b
+
+until (r = 0) or (s[l - 1] = #10);
+
+if (r = 0) then s[l]:= #0 else s[l - 1]:= #0
 end;
 
 function pfsBlockRead(f: PFSFile; buf: pointer; size: Int64): Int64;