Re: [fpc-pascal] Pchar from constant string
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
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
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
> 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
> 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
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
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
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