Re: [fpc-pascal] Pchar from constant string

2023-06-30 Thread Tomas Hajny via fpc-pascal

On 2023-06-30 11:11, Michael Van Canneyt via fpc-pascal wrote:

On Fri, 30 Jun 2023, Hairy Pixels via fpc-pascal wrote:




On Jun 30, 2023, at 9:03 AM, Hairy Pixels  
wrote:


That's why that worked. Hmm with short strings the null terminator 
could be truncated when copying right? Something to look out for.


this is what I meant about truncation. S is no longer null terminated 
and now the pchar will fail when passed to C libraries right?


var
 s: String;
 p: Pchar;
begin
s := 'hello';
p := @s;


S will still be null-terminated for ansistrings and shortstrings.

change to

  s:=s+s;
  p:=@s[1]; // and not @s
  writeln(p[Length(s)+1]=#0);

and it will print TRUE.


However, there are operations valid for Pascal shortstrings which would 
break this - as an example, older Pascal code used to change the S[0] 
(i.e. the length byte) for a shortstring which wouldn't ensure that #0 
follows such a moved end of the Pascal shortstring.


Moreover, note that #0 is a valid character in Pascal strings, i.e. in 
general it is _not_ guaranteed that the trailing #0 after the end of the 
string is the first one encountered when passing the string to a C code. 
Obviously, you can ensure this in your own code, but it's important to 
stress that neither the compiler nor the FPC RTL check or enforce full 
equivalence of Pascal strings and C null-terminated strings.


Tomas
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Pchar from constant string

2023-06-30 Thread Michael Van Canneyt via fpc-pascal




On Fri, 30 Jun 2023, Michael Van Canneyt via fpc-pascal wrote:




On Fri, 30 Jun 2023, Hairy Pixels via fpc-pascal wrote:





On Jun 30, 2023, at 9:03 AM, Hairy Pixels  wrote:

That's why that worked. Hmm with short strings the null terminator could 
be truncated when copying right? Something to look out for.


this is what I meant about truncation. S is no longer null terminated and 
now the pchar will fail when passed to C libraries right?


var
 s: String;
 p: Pchar;
begin
s := 'hello';
p := @s;


S will still be null-terminated for ansistrings and shortstrings.

change to

 s:=s+s;
 p:=@s[1]; // and not @s
 writeln(p[Length(s)+1]=#0);


this should have been p[Length(s)] obviously.

Michael.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Pchar from constant string

2023-06-30 Thread Michael Van Canneyt via fpc-pascal




On Fri, 30 Jun 2023, Hairy Pixels via fpc-pascal wrote:





On Jun 30, 2023, at 9:03 AM, Hairy Pixels  wrote:

That's why that worked. Hmm with short strings the null terminator could be 
truncated when copying right? Something to look out for.


this is what I meant about truncation. S is no longer null terminated and now 
the pchar will fail when passed to C libraries right?

var
 s: String;
 p: Pchar;
begin
s := 'hello';
p := @s;


S will still be null-terminated for ansistrings and shortstrings.

change to

  s:=s+s;
  p:=@s[1]; // and not @s
  writeln(p[Length(s)+1]=#0);

and it will print TRUE.

Michael.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Pchar from constant string

2023-06-30 Thread Hairy Pixels via fpc-pascal



> On Jun 30, 2023, at 9:03 AM, Hairy Pixels  wrote:
> 
> That's why that worked. Hmm with short strings the null terminator could be 
> truncated when copying right? Something to look out for.

this is what I meant about truncation. S is no longer null terminated and now 
the pchar will fail when passed to C libraries right? 

var
  s: String;
  p: Pchar;
begin
s := 'hello';
p := @s;

Regards,
Ryan Joseph

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Pchar from constant string

2023-06-29 Thread Hairy Pixels via fpc-pascal



> On Jun 29, 2023, at 9:31 PM, Michael Van Canneyt via fpc-pascal 
>  wrote:
> 
> Yes, it is:
> 
> ---
> _$PROGRAM$_Ld1:
> # [4] p := '123';
>.ascii  "123\000"
> .Le11:
> ---
> 
> Just as it is for a shortstring and ansistring:
> ---
> # [6] s:='456';
>.ascii  "\003456\000"
> .Le12:
>.size   _$PROGRAM$_Ld2, .Le12 - _$PROGRAM$_Ld2

That's why that worked. Hmm with short strings the null terminator could be 
truncated when copying right? Something to look out for.

Regards,
Ryan Joseph

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Pchar from constant string

2023-06-29 Thread Tomas Hajny via fpc-pascal

On 2023-06-29 16:22, Mattias Gaertner via fpc-pascal wrote:

On Thu, 29 Jun 2023 21:18:44 +0700
Hairy Pixels via fpc-pascal  wrote:


What is really happening in this snippet? I think it must be
implicitly taking the address of the constant string but is it also
adding the null terminator automatically? The string prints with
writeln so it must be null terminated right?

var
  p: Pchar;
begin
  p := '123';
  writeln(p);


AFAIK the trailing #0 is already stored in the binary.


Indeed - all constant strings are already terminated with #0. Note that 
this is not guaranteed for all string variables per se.


Tomas
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Pchar from constant string

2023-06-29 Thread Michael Van Canneyt via fpc-pascal




On Thu, 29 Jun 2023, Mattias Gaertner via fpc-pascal wrote:


On Thu, 29 Jun 2023 21:18:44 +0700
Hairy Pixels via fpc-pascal  wrote:


What is really happening in this snippet? I think it must be
implicitly taking the address of the constant string but is it also
adding the null terminator automatically? The string prints with
writeln so it must be null terminated right?

var
  p: Pchar;
begin
  p := '123';
  writeln(p);


AFAIK the trailing #0 is already stored in the binary.


Yes, it is:

---
_$PROGRAM$_Ld1:
# [4] p := '123';
.ascii  "123\000"
.Le11:
---

Just as it is for a shortstring and ansistring:
---
# [6] s:='456';
.ascii  "\003456\000"
.Le12:
.size   _$PROGRAM$_Ld2, .Le12 - _$PROGRAM$_Ld2
---

Michael.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Pchar from constant string

2023-06-29 Thread Mattias Gaertner via fpc-pascal
On Thu, 29 Jun 2023 21:18:44 +0700
Hairy Pixels via fpc-pascal  wrote:

> What is really happening in this snippet? I think it must be
> implicitly taking the address of the constant string but is it also
> adding the null terminator automatically? The string prints with
> writeln so it must be null terminated right?
> 
> var
>   p: Pchar;
> begin
>   p := '123';
>   writeln(p);

AFAIK the trailing #0 is already stored in the binary.

Mattias
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal