Questing on String_(re)

Sat, 25 Oct 1997 13:06:57 +0200 (MEST)


Hello, Thomas;
hello, everybody!

According to Thomas Tan:
>
> How does writeln(astring) work,

I am not sure whether I understand your question ...

To use `writeln', just do

    writeln ( MyIntegerValue : 6, MyRealValue : 10 : 4, MyStringValue : 7 );

to get

    42    3.1415  Hallo!

or

    writeln ( 'Answer = ', MyIntegerValue );

to get

    Answer = 42

If you want to know how `writeln' works internally, please look at the
GPC source, file `rts.c', and in the subdirectory `rts' at the files
`rts-write.c' and `rts-wrtinc.c'.  If you have more questions about that,
please post them on this list.

> is the string null terminating?

No, but GPC has an additional string type `CString' (or `PChar' for BP
compatibility) which *is* null-terminated.  If you have, for example,
a null-terminated string you want to pass to an external function that
wants to have such a string as a parameter (this holds for many external
functions written in C), you can use `CString' as follows:


    Program Environment;

    (*$X+*)  (* Enable "extended syntax" if you want to use `CString' *)

    Function SetEnv ( Name, Value: CString; overwrite: Integer ): Integer; C;
    Function GetEnv ( Name: CString ): CString; C;

    Var
      S: CString;

    begin
      SetEnv ( 'TEST_ENV', 'OK', 1 );
      S:= GetEnv ( 'TEST_ENV' );
      writeln ( S );
    end.


> If so, what is the character of null?

Not too surprisingly, it is `chr ( 0 )' or `#0'.  :-)  For `CString'.
GPC's native `String' is *not* null-terminated.

And to answer your implicit question about GPC string internals:
GPC's native `String' is a special case of a "schema type".  It looks
like a record internally:

    Type
      String ( n: Integer ) = record
        Capacity, length: Integer;             (* 8 bytes *)
        data: packed array [ 1..n ] of Char;   (* n bytes *)
      end (* String *);

(* Remark:  The above is a perfectly valid type declaration in GNU Pascal
or any other compiler that supports Extended Pascal's schema types.  It is,
however, not identically the same as GPC's `String' since the built-in
string functions only work on the built-in string type, but it has the same
structure in memory. *)

When you declare a string variable with "Var Foo: String ( 42 )" (* Now you
see where the round parentheses come from. ;*), the "record field" `Capacity'
gets the value 42 assigned, while `length' and `data' remain undefined until
you assign a value to the string.  You can access a string's capacity with
`Foo.capacity' just like a record field.

For dynamical allocation of strings, you can define "Type StringPtr = ^String"
*without* a specified capacity and then give it when `New'ing the variable.


    Program Test;

    Type
      StringPtr = ^String;

    Var
      Foo: StringPtr;

    begin
      New ( Foo, 1042 );  (* allocate a String of maximum length 1042 *)
      Foo^:= 'Hello, world!';
      writeln ( Foo^.Capacity );  (* yields "1024" *)
      writeln ( Foo^ );  (* yields "Hello, world!" *)
      Dispose ( Foo );
    end.


In addition to these features of Extended Pascal, GPC supports the following
extensions:


    Type
      StringPtr = ^String;

    Var
      Foo: StringPtr;

    Foo:= @'Hello, world!';  (* let `Foo' point to a string constant *)

    Foo:= New ( StringPtr, 42 );  (* let `New' act as a function *)


If you want to contribute to the GNU Pascal project, feel free to improve
the existing documentation by adding the things I wrote above (and more;-).
If you do so, please do not forget to post to this list what you are doing
so you can coordinate with others who are currently working on the same
field.

Hope this helps,

    Peter

 Dipl.-Phys. Peter Gerwinski, Essen, Germany, free physicist and programmer
peter.gerwinski@uni-essen.de - http://home.pages.de/~peter.gerwinski/ [971005]
 maintainer GNU Pascal [971001] - http://home.pages.de/~gnu-pascal/ [971005]


Peter Gerwinski (peter@agnes.dida.physik.uni-essen.de)

HTML conversion by Lluís de Yzaguirre i Maura
Institut de Lingüística Aplicada - Universitat "Pompeu Fabra"
e-mail: de_yza@upf.es