Browse Source

* fixed ansistring append helpers so they preserve the terminating #0
* optimized SetLength() so that it uses reallocmem in case the refcount
of the target string is 1

Jonas Maebe 23 years ago
parent
commit
275f02d058
1 changed files with 24 additions and 6 deletions
  1. 24 6
      rtl/inc/astrings.inc

+ 24 - 6
rtl/inc/astrings.inc

@@ -413,18 +413,29 @@ Procedure fpc_AnsiStr_SetLength (Var S : AnsiString; l : Longint);[Public,Alias
 }
 Var
   Temp : Pointer;
-  movelen: longint;
+  movelen, NewLen: longint;
 begin
-   if (l>0) then
+  if (l>0) then
     begin
       if Pointer(S)=nil then
        begin
          { Need a complete new string...}
          Pointer(s):=NewAnsiString(l);
        end
+      else if (PAnsiRec(Pointer(S)-FirstOff)^.Ref = 1) then
+        begin
+          if (PAnsiRec(Pointer(S)-FirstOff)^.Maxlen < L) then
+            begin
+              Dec(Pointer(S),FirstOff);
+              NewLen := (L+AnsiRecLen+15) and not(15) - AnsiRecLen;
+              reallocmem(pointer(S),AnsiRecLen+NewLen);
+              PAnsiRec(S)^.MaxLen := NewLen;
+              Inc(Pointer(S),FirstOff);
+            end;
+          PAnsiRec(Pointer(S)-FirstOff)^.Len := L;
+          PByte(Pointer(S)+L)^:=0;
+        end
       else
-       If (PAnsiRec(Pointer(S)-FirstOff)^.Maxlen < L) or
-          (PAnsiRec(Pointer(S)-FirstOff)^.Ref <> 1) then
         begin
           { Reallocation is needed... }
           Temp:=Pointer(NewAnsiString(L));
@@ -527,6 +538,7 @@ Procedure fpc_ansistr_append_char(Var S : AnsiString;c : char); [Public,Alias :
 begin
    SetLength(S,length(S)+1);
    S[length(S)]:=c;
+   PByte(Pointer(S)+length(S))^:=0; { Terminating Zero }
 end;
 
 Procedure fpc_ansistr_append_shortstring(Var S : AnsiString;Str : ShortString); [Public,Alias : 'FPC_ANSISTR_APPEND_SHORTSTRING']; {$ifdef hascompilerproc} compilerproc; {$endif}
@@ -536,6 +548,7 @@ begin
    ofs:=Length(S);
    SetLength(S,ofs+length(Str));
    move(Str[1],S[ofs+1],length(Str));
+   PByte(Pointer(S)+length(S))^:=0; { Terminating Zero }
 end;
 
 Procedure fpc_ansistr_append_ansistring(Var S : AnsiString;Str : AnsiString); [Public,Alias : 'FPC_ANSISTR_APPEND_ANSISTRING']; {$ifdef hascompilerproc} compilerproc; {$endif}
@@ -546,7 +559,7 @@ begin
      begin
         ofs:=Length(S);
         SetLength(S,ofs+length(Str));
-        move(Str[1],S[ofs+1],length(Str));
+        move(Str[1],S[ofs+1],length(Str)+1);
      end;
 end;
 
@@ -822,7 +835,12 @@ end;
 
 {
   $Log$
-  Revision 1.31  2002-10-19 17:06:50  michael
+  Revision 1.32  2002-10-20 12:59:21  jonas
+    * fixed ansistring append helpers so they preserve the terminating #0
+    * optimized SetLength() so that it uses reallocmem in case the refcount
+      of the target string is 1
+
+  Revision 1.31  2002/10/19 17:06:50  michael
   + Added check for nil buffer to setstring
 
   Revision 1.30  2002/10/17 12:43:00  florian