Browse Source

+ AnsiString changes

michael 27 years ago
parent
commit
4783316085
2 changed files with 76 additions and 69 deletions
  1. 63 59
      rtl/inc/astrings.pp
  2. 13 10
      rtl/inc/systemh.inc

+ 63 - 59
rtl/inc/astrings.pp

@@ -35,19 +35,19 @@
 
 
 }
 }
 
 
-Type shortstring=string;
+// Type shortstring=string;
 
 
-Function  NewAnsiString (Len : Longint) : AnsiString; forward;
-Procedure DisposeAnsiString (Var P : Pointer); forward;
+Function  NewAnsiString (Len : Longint) : Pointer; forward;
+Procedure DisposeAnsiString (Var S : Pointer); forward;
 Procedure Decr_Ansi_Ref (Var S : Pointer); forward;
 Procedure Decr_Ansi_Ref (Var S : Pointer); forward;
 Procedure Incr_Ansi_Ref (Var S : Pointer); forward;
 Procedure Incr_Ansi_Ref (Var S : Pointer); forward;
 Procedure AssignAnsiString (Var S1 : Pointer; S2 : Pointer); forward;
 Procedure AssignAnsiString (Var S1 : Pointer; S2 : Pointer); forward;
-Procedure Ansi_String_Concat (Var S1 : AnsiString; Var S2 : AnsiString); forward;
+Procedure Ansi_String_Concat (Var S1 : Pointer; Var S2 : Pointer); forward;
 Procedure Ansi_ShortString_Concat (Var S1: AnsiString; Var S2 : ShortString); forward;
 Procedure Ansi_ShortString_Concat (Var S1: AnsiString; Var S2 : ShortString); forward;
 Procedure Ansi_To_ShortString (Var S1 : ShortString; S2 : Pointer; maxlen : longint); forward;
 Procedure Ansi_To_ShortString (Var S1 : ShortString; S2 : Pointer; maxlen : longint); forward;
-Procedure Short_To_AnsiString (Var S1 : AnsiString; Const S2 : ShortString); forward;
-Function  AnsiCompare (Var S1,S2 : AnsiString): Longint; forward;
-Function  AnsiCompare (var S1 : AnsiString; Var S2 : ShortString): Longint; forward;
+Procedure Short_To_AnsiString (Var S1 : Pointer; Const S2 : ShortString); forward;
+Function  AnsiCompare (Var S1,S2 : Pointer): Longint; forward;
+Function  AnsiCompare (var S1 : Pointer; Var S2 : ShortString): Longint; forward;
 Procedure SetCharAtIndex (Var S : AnsiString; Index : Longint; C : CHar); forward;
 Procedure SetCharAtIndex (Var S : AnsiString; Index : Longint; C : CHar); forward;
 
 
 {$PACKRECORDS 1}
 {$PACKRECORDS 1}
@@ -114,7 +114,7 @@ begin
 end;
 end;
 
 
 
 
-Procedure Decr_Ansi_Ref (Var P : Pointer);
+Procedure Decr_Ansi_Ref (Var S : Pointer);
   [Public,Alias : 'FPC_DECR_ANSI_REF'];
   [Public,Alias : 'FPC_DECR_ANSI_REF'];
 {
 {
  Decreases the ReferenceCount of a non constant ansistring;
  Decreases the ReferenceCount of a non constant ansistring;
@@ -152,8 +152,7 @@ Begin
   Inc(PAnsiRec(S-FirstOff)^.Ref);
   Inc(PAnsiRec(S-FirstOff)^.Ref);
 end;
 end;
 
 
-Procedure UniqueAnsiString (Var S : AnsiString);
-  [Public,Alias : 'FPC_UNIQUE_ANSISTRING'];
+Procedure UniqueAnsiString (Var S : AnsiString); [Public,Alias : 'FPC_UNIQUE_ANSISTRING'];
 {
 {
   Make sure reference count of S is 1,
   Make sure reference count of S is 1,
   using copy-on-write semantics.
   using copy-on-write semantics.
@@ -162,15 +161,15 @@ Procedure UniqueAnsiString (Var S : AnsiString);
 Var SNew : Pointer;
 Var SNew : Pointer;
 
 
 begin
 begin
-  If S=Nil
+  If Pointer(S)=Nil
     then exit;
     then exit;
-  if PAnsiRec(S-Firstoff)^.Ref>1 then
+  if PAnsiRec(Pointer(S)-Firstoff)^.Ref>1 then
     begin
     begin
-       SNew:=Pointer(NewAnsiString (PAnsiRec(S-FirstOff)^.len));
-       Move (Pointer(S)^,SNew^,PAnsiRec(S-FirstOff)^.len+1);
-    PAnsiRec(SNew-8)^.len:=PAnsiRec(S-FirstOff)^.len;
-    Decr_Ansi_Ref (S);  { Thread safe }
-    S:=SNew;
+    SNew:=NewAnsiString (PAnsiRec(Pointer(S)-FirstOff)^.len);
+    Move (Pointer(S)^,SNew^,PAnsiRec(Pointer(S)-FirstOff)^.len+1);
+    PAnsiRec(SNew-8)^.len:=PAnsiRec(Pointer(S)-FirstOff)^.len;
+    Decr_Ansi_Ref (Pointer(S));  { Thread safe }
+    Pointer(S):=SNew;
     end;
     end;
 end;
 end;
 
 
@@ -205,7 +204,7 @@ begin
   S1:=Temp;
   S1:=Temp;
 end;
 end;
 
 
-Procedure Ansi_String_Concat (Var S1 : AnsiString; Var S2 : AnsiString);
+Procedure Ansi_String_Concat (Var S1 : Pointer; Var S2 : Pointer);
 {
 {
   Concatenates 2 AnsiStrings : S1+S2.
   Concatenates 2 AnsiStrings : S1+S2.
   Result Goes to S1;
   Result Goes to S1;
@@ -213,13 +212,13 @@ Procedure Ansi_String_Concat (Var S1 : AnsiString; Var S2 : AnsiString);
 Var Size,Location : Longint;
 Var Size,Location : Longint;
 
 
 begin
 begin
-  if Pointer(S2)=Nil then exit;
-  if (Pointer(S1)=Nil) then
+  if S2=Nil then exit;
+  if (S1=Nil) then
      AssignAnsiString(S1,S2)
      AssignAnsiString(S1,S2)
   else
   else
     begin
     begin
     Size:=PAnsiRec(Pointer(S2)-FirstOff)^.Len;
     Size:=PAnsiRec(Pointer(S2)-FirstOff)^.Len;
-    Location:=Length(S1);
+    Location:=Length(AnsiString(S1));
     { Setlength takes case of uniqueness
     { Setlength takes case of uniqueness
       and allocated memory. We need to use length,
       and allocated memory. We need to use length,
       to take into account possibility of S1=Nil }
       to take into account possibility of S1=Nil }
@@ -275,7 +274,7 @@ Var Size : Longint;
 
 
 begin
 begin
   Size:=Byte(S2[0]);
   Size:=Byte(S2[0]);
-  Setlength (S1,Size);
+  Setlength (AnsiString(S1),Size);
   Move (S2[1],Pointer(S1)^,Size);
   Move (S2[1],Pointer(S1)^,Size);
   { Terminating Zero }
   { Terminating Zero }
   PByte(Pointer(S1)+Size)^:=0;
   PByte(Pointer(S1)+Size)^:=0;
@@ -286,10 +285,10 @@ Procedure PChar2Ansi(var a : ansistring;p : pchar);[Public,Alias : 'FPC_PCHAR_TO
 
 
   begin
   begin
      //!!!!!!!!! needs to be fixed (FK)
      //!!!!!!!!! needs to be fixed (FK)
-     if p^=#0
-       a:=nil
+     if p[0]=#0 Then
+       Pointer(a):=nil
      else
      else
-       a:=p;
+       Pointer(a):=p;
   end;
   end;
 
 
 { the compiler generates inline code for that
 { the compiler generates inline code for that
@@ -307,15 +306,16 @@ end;
 }
 }
 
 
 { stupid solution, could be done with public,name in later versions }
 { stupid solution, could be done with public,name in later versions }
+{$ASMMODE DIRECT}
 procedure dummy;assembler;
 procedure dummy;assembler;
-
   asm
   asm
      .globl FPC_EMPTYCHAR
      .globl FPC_EMPTYCHAR
      FPC_EMPTYCHAR:
      FPC_EMPTYCHAR:
      .byte 0
      .byte 0
   end;
   end;
+{$ASMMODE ATT}
 
 
-Function AnsiCompare (Var S1,S2 : AnsiString): Longint;
+Function AnsiCompare (Var S1,S2 : Pointer): Longint;
 {
 {
   Compares 2 AnsiStrings;
   Compares 2 AnsiStrings;
   The result is
   The result is
@@ -328,20 +328,20 @@ Var i,MaxI,Temp : Longint;
 begin
 begin
  Temp:=0;
  Temp:=0;
  i:=0;
  i:=0;
- MaxI:=Length(S1);
- if MaxI>Length(S2) then MaxI:=Length(S2);
+ MaxI:=Length(AnsiString(S1));
+ if MaxI>Length(AnsiString(S2)) then MaxI:=Length(AnsiString(S2));
  While (i<MaxI) and (Temp=0) do
  While (i<MaxI) and (Temp=0) do
    begin
    begin
-   Temp:= PByte(Pointer(S1)+I)^ - PByte(Pointer(S2)+i)^;
+   Temp:= PByte(S1+I)^ - PByte(S2+i)^;
    inc(i);
    inc(i);
    end;
    end;
- if temp=0 then temp:=Length(S1)-Length(S2);
+ if temp=0 then temp:=Length(AnsiString(S1))-Length(AnsiString(S2));
  AnsiCompare:=Temp;
  AnsiCompare:=Temp;
 end;
 end;
 
 
 
 
 
 
-Function AnsiCompare (Var S1 : AnsiString; Var S2 : ShortString): Longint;
+Function AnsiCompare (Var S1 : Pointer; Var S2 : ShortString): Longint;
 {
 {
   Compares a AnsiString with a ShortString;
   Compares a AnsiString with a ShortString;
   The result is
   The result is
@@ -354,18 +354,18 @@ Var i,MaxI,Temp : Longint;
 begin
 begin
  Temp:=0;
  Temp:=0;
  i:=0;
  i:=0;
- MaxI:=Length(S1);
+ MaxI:=Length(AnsiString(S1));
  if MaxI>byte(S2[0]) then MaxI:=Byte(S2[0]);
  if MaxI>byte(S2[0]) then MaxI:=Byte(S2[0]);
  While (i<MaxI) and (Temp=0) do
  While (i<MaxI) and (Temp=0) do
    begin
    begin
-   Temp:= PByte(Pointer(S1)+I)^ - Byte(S2[i+1]);
+   Temp:= PByte(S1+I)^ - Byte(S2[i+1]);
    inc(i);
    inc(i);
    end;
    end;
  AnsiCompare:=Temp;
  AnsiCompare:=Temp;
 end;
 end;
 
 
 
 
-{ not used
+{ Not used, can be removed. }
 Procedure SetCharAtIndex (Var S : AnsiString; Index : Longint; C : CHar);
 Procedure SetCharAtIndex (Var S : AnsiString; Index : Longint; C : CHar);
 
 
 begin
 begin
@@ -375,7 +375,6 @@ begin
     Pbyte(Pointer(S)+index-1)^:=Byte(C);
     Pbyte(Pointer(S)+index-1)^:=Byte(C);
     end;
     end;
 end;
 end;
-}
 
 
 { ---------------------------------------------------------------------
 { ---------------------------------------------------------------------
    Public functions, In interface.
    Public functions, In interface.
@@ -420,7 +419,7 @@ begin
       Temp:=Pointer(NewAnsiString(L));
       Temp:=Pointer(NewAnsiString(L));
       if Length(S)>0 then
       if Length(S)>0 then
         Move (Pointer(S)^,Temp^,Length(S)+1);
         Move (Pointer(S)^,Temp^,Length(S)+1);
-      Decr_Ansi_ref (S);
+      Decr_Ansi_ref (Pointer(S));
       Pointer(S):=Temp;
       Pointer(S):=Temp;
       end;
       end;
     PAnsiRec(Pointer(S)-FirstOff)^.Len:=l
     PAnsiRec(Pointer(S)-FirstOff)^.Len:=l
@@ -428,8 +427,8 @@ begin
   else
   else
     { Length=0 }
     { Length=0 }
     begin
     begin
-    Decr_Ansi_Ref (S);
-    S:=Nil;
+    Decr_Ansi_Ref (Pointer(S));
+    Pointer(S):=Nil;
     end;
     end;
 end;
 end;
 
 
@@ -462,7 +461,7 @@ Function Pos (Const Substr : AnsiString; Const Source : AnsiString) : Longint;
 
 
 var i,j : longint;
 var i,j : longint;
     e : boolean;
     e : boolean;
-    s : Pointer;
+    s,se : Pointer;
 
 
 begin
 begin
  i := 0;
  i := 0;
@@ -473,12 +472,13 @@ begin
    begin
    begin
    inc (i);
    inc (i);
    S:=Pointer(copy(Source,i,length(Substr)));
    S:=Pointer(copy(Source,i,length(Substr)));
-   if AnsiCompare(substr,AnsiString(s))=0 then
+   Se:=pointer(substr);
+    if AnsiCompare(se,S)=0 then
      begin
      begin
      j := i;
      j := i;
      e := false;
      e := false;
      end;
      end;
-   DisposeAnsiString(AnsiString(S));
+   DisposeAnsiString(S);
    end;
    end;
  pos := j;
  pos := j;
 end;
 end;
@@ -490,7 +490,7 @@ Procedure Val (Const S : AnsiString; var R : real; Var Code : Integer);
 Var SS : String;
 Var SS : String;
 
 
 begin
 begin
- Ansi_To_ShortString (SS,S,255);
+ Ansi_To_ShortString (SS,Pointer(S),255);
  Val(SS,R,Code);
  Val(SS,R,Code);
 end;
 end;
 
 
@@ -512,7 +512,7 @@ Procedure Val (Const S : AnsiString; var E : Extended; Code : Integer);
 Var SS : ShortString;
 Var SS : ShortString;
 
 
 begin
 begin
- Ansi_To_ShortString (SS,S,255);
+ Ansi_To_ShortString (SS,Pointer(S),255);
  Val(SS,E,Code);
  Val(SS,E,Code);
 end;
 end;
 
 
@@ -523,7 +523,7 @@ Procedure Val (Const S : AnsiString; var C : Cardinal; Code : Integer);
 Var SS : ShortString;
 Var SS : ShortString;
 
 
 begin
 begin
- Ansi_To_ShortString (SS,S,255);
+ Ansi_To_ShortString (SS,Pointer(S),255);
  Val(SS,C,Code);
  Val(SS,C,Code);
 end;
 end;
 
 
@@ -534,7 +534,7 @@ Procedure Val (Const S : AnsiString; var L : Longint; Var Code : Integer);
 Var SS : ShortString;
 Var SS : ShortString;
 
 
 begin
 begin
- Ansi_To_ShortString (SS,S,255);
+ Ansi_To_ShortString (SS,Pointer(S),255);
  Val(SS,L,Code);
  Val(SS,L,Code);
 end;
 end;
 
 
@@ -545,7 +545,7 @@ Procedure Val (Const S : AnsiString; var W : Word; Var Code : Integer);
 Var SS : ShortString;
 Var SS : ShortString;
 
 
 begin
 begin
- Ansi_To_ShortString (SS,S,255);
+ Ansi_To_ShortString (SS,Pointer(S),255);
  Val(SS,W,Code);
  Val(SS,W,Code);
 end;
 end;
 
 
@@ -556,7 +556,7 @@ Procedure Val (Const S : AnsiString; var I : Integer; Var Code : Integer);
 Var SS : ShortString;
 Var SS : ShortString;
 
 
 begin
 begin
- Ansi_To_ShortString (SS,S,255);
+ Ansi_To_ShortString (SS,Pointer(S),255);
  Val(SS,I,Code);
  Val(SS,I,Code);
 end;
 end;
 
 
@@ -567,7 +567,7 @@ Procedure Val (Const S : AnsiString; var B : Byte; Var Code : Integer);
 Var SS : ShortString;
 Var SS : ShortString;
 
 
 begin
 begin
- Ansi_To_ShortString (SS,S,255);
+ Ansi_To_ShortString (SS,Pointer(S),255);
  Val(SS,B,Code);
  Val(SS,B,Code);
 end;
 end;
 
 
@@ -578,7 +578,7 @@ Procedure Val (Const S : AnsiString; var SI : ShortInt; Var Code : Integer);
 Var SS : ShortString;
 Var SS : ShortString;
 
 
 begin
 begin
- Ansi_To_ShortString (SS,S,255);
+ Ansi_To_ShortString (SS,Pointer(S),255);
  Val(SS,SI,Code);
  Val(SS,SI,Code);
 end;
 end;
 
 
@@ -589,7 +589,7 @@ Var SS : ShortString;
 
 
 begin
 begin
  {int_Str_Real (R,Len,fr,SS);}
  {int_Str_Real (R,Len,fr,SS);}
- Short_To_AnsiString (S,SS);
+ Short_To_AnsiString (Pointer(S),SS);
 end;
 end;
 
 
 
 
@@ -686,8 +686,8 @@ end;
 
 
 Procedure Insert (Const Source : AnsiString; Var S : AnsiString; Index : Longint);
 Procedure Insert (Const Source : AnsiString; Var S : AnsiString; Index : Longint);
 
 
-var s3,s4 : Pointer;
-
+var s3,s4,s5 : Pointer;
+    
 begin
 begin
   If Length(Source)=0 then exit;
   If Length(Source)=0 then exit;
   if index <= 0 then index := 1;
   if index <= 0 then index := 1;
@@ -696,18 +696,22 @@ begin
     index := Length(S)+1;
     index := Length(S)+1;
   SetLength(s,index - 1);
   SetLength(s,index - 1);
   s4 := Pointer ( NewAnsiString(PansiRec(Pointer(Source)-Firstoff)^.len) );
   s4 := Pointer ( NewAnsiString(PansiRec(Pointer(Source)-Firstoff)^.len) );
-  Ansi_String_Concat(AnsiString(s4),Source);
+  S5:=Pointer(Source);
+  Ansi_String_Concat(s4,s5);
   if S4<>Nil then
   if S4<>Nil then
-  Ansi_String_Concat(AnsiString(S4),AnsiString(s3));
-  Ansi_String_Concat(S,AnsiString(S4));
-  Decr_ansi_ref (AnsiString(S3));
-  Decr_ansi_ref (AnsiString(S4));
+    Ansi_String_Concat(S4,s3);
+  Ansi_String_Concat(Pointer(S),S4);
+  Decr_ansi_ref (S3);
+  Decr_ansi_ref (S4);
 end;
 end;
 
 
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.17  1998-09-27 22:44:50  florian
+  Revision 1.18  1998-09-28 14:02:34  michael
+  + AnsiString changes
+
+  Revision 1.17  1998/09/27 22:44:50  florian
     * small fixes
     * small fixes
     * made UniqueAnsistring public
     * made UniqueAnsistring public
     * ...
     * ...

+ 13 - 10
rtl/inc/systemh.inc

@@ -65,7 +65,7 @@ Type
 { some type aliases }
 { some type aliases }
   dword       = cardinal;
   dword       = cardinal;
   longword    = cardinal;
   longword    = cardinal;
-  ShortString = String;
+  ShortString = String[255];
 
 
 { Zero - terminated strings }
 { Zero - terminated strings }
   PChar       = ^Char;
   PChar       = ^Char;
@@ -254,18 +254,18 @@ Function  Length (Const S : AnsiString) : Longint;
 Function  Copy (Const S : AnsiString; Index,Size : Longint) : AnsiString;
 Function  Copy (Const S : AnsiString; Index,Size : Longint) : AnsiString;
 Function  Pos (Const Substr : AnsiString; Const Source : AnsiString) : Longint;
 Function  Pos (Const Substr : AnsiString; Const Source : AnsiString) : Longint;
 Procedure Insert (Const Source : AnsiString; Var S : AnsiString; Index : Longint);
 Procedure Insert (Const Source : AnsiString; Var S : AnsiString; Index : Longint);
-Procedure Delete (Const S : AnsiString; Index,Size: Longint);
+Procedure Delete (Var S : AnsiString; Index,Size: Longint);
 Procedure Val (Const S : AnsiString; var R : real; Var Code : Integer);
 Procedure Val (Const S : AnsiString; var R : real; Var Code : Integer);
 {
 {
 Procedure Val (Const S : AnsiString; var D : Double; Var Code : Integer);
 Procedure Val (Const S : AnsiString; var D : Double; Var Code : Integer);
 }
 }
-Procedure Val (Var S : AnsiString; var E : Extended; Code : Integer);
-Procedure Val (Var S : AnsiString; var C : Cardinal; Code : Integer);
-Procedure Val (Var S : AnsiString; var L : Longint; Var Code : Integer);
-Procedure Val (Var S : AnsiString; var W : Word; Var Code : Integer);
-Procedure Val (Var S : AnsiString; var I : Integer; Var Code : Integer);
-Procedure Val (Var S : AnsiString; var B : Byte; Var Code : Integer);
-Procedure Val (Var S : AnsiString; var SI : ShortInt; Var  Code : Integer);
+Procedure Val (Const S : AnsiString; var E : Extended; Code : Integer);
+Procedure Val (Const S : AnsiString; var C : Cardinal; Code : Integer);
+Procedure Val (Const S : AnsiString; var L : Longint; Var Code : Integer);
+Procedure Val (Const S : AnsiString; var W : Word; Var Code : Integer);
+Procedure Val (Const S : AnsiString; var I : Integer; Var Code : Integer);
+Procedure Val (Const S : AnsiString; var B : Byte; Var Code : Integer);
+Procedure Val (Const S : AnsiString; var SI : ShortInt; Var  Code : Integer);
 {
 {
 Procedure Str (Const R : Real;Len, fr : longint; Var S : AnsiString);
 Procedure Str (Const R : Real;Len, fr : longint; Var S : AnsiString);
 Procedure Str (Const D : Double;Len,fr : longint; Var S : AnsiString);
 Procedure Str (Const D : Double;Len,fr : longint; Var S : AnsiString);
@@ -388,7 +388,10 @@ Procedure halt;
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.32  1998-09-22 15:30:55  peter
+  Revision 1.33  1998-09-28 14:02:33  michael
+  + AnsiString changes
+
+  Revision 1.32  1998/09/22 15:30:55  peter
     * shortstring=string type added
     * shortstring=string type added
 
 
   Revision 1.31  1998/09/20 17:49:09  florian
   Revision 1.31  1998/09/20 17:49:09  florian