Re: [fpc-pascal] Question: range checking for string indexing

2008-10-30 Thread Tom Verhoeff
On Wed, Oct 29, 2008 at 09:58:10PM +0100, Vinzent Höfler wrote:
 Tom Verhoeff wrote:

 I am surprised that for ShortString, the range is not
 also 1 = i = Length(s).

 IIRC Turbo Pascal only allowed you to access s[0] when range checking
 was off, and similarly for s[i] with i  Length(s).

 No. See transcript:

That looks rather convincing.

 Borland Pascal  Version 7.0  Copyright (c) 1983,92 Borland International

However, IIRC there were some differences between Borland Pascal
and Turbo Pascal (as it was named before they marketed it as
Borland Pascal).

But my memory may be confusing this with UCSD Pascal (Oh, those days :-).

If find it more important that the rules are clear, than that a specific
behavior is provided.

Nevertheless, this means that AnsiStrings and ShortStrings are slightly
more different than suggested in the documentation.  AnsiString provide
more protection with range checking (also implying that a program that
works will with range checking and ShortStrings, might fail when
using AnsiStrings, even though those are more flexible).

In what way can this information be incorporated into the documentation?
Where should it go?  Can I generate a patch for that?

Thanks,

Tom
-- 
E-MAIL: T.Verhoeff @ TUE.NL | Dept. of Math.  Comp. Science
PHONE:  +31 40 247 41 25| Technische Universiteit Eindhoven
FAX:+31 40 247 54 04| PO Box 513, NL-5600 MB Eindhoven
http://www.win.tue.nl/~wstomv/  | The Netherlands
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Question: range checking for string indexing

2008-10-30 Thread Frank Peelo

Tom Verhoeff wrote:

On Wed, Oct 29, 2008 at 09:58:10PM +0100, Vinzent Höfler wrote:


Tom Verhoeff wrote:



I am surprised that for ShortString, the range is not
also 1 = i = Length(s).

IIRC Turbo Pascal only allowed you to access s[0] when range checking
was off, and similarly for s[i] with i  Length(s).


No. See transcript:



That looks rather convincing.



Borland Pascal  Version 7.0  Copyright (c) 1983,92 Borland International



However, IIRC there were some differences between Borland Pascal
and Turbo Pascal (as it was named before they marketed it as
Borland Pascal).


IIRC the differences were in how big a program you could write. 
Accessing the length byte in a string did not change.


[digs out an old copy of Turbo.com -- TurboPascal version 3. Amazingly, 
it will run under WinXP.]


var
  x : String[50];
  i : Integer;

Begin
  x := 'Hello, World';
  for i := 0 to length(x) do
write(ord(x[i]),' ');
  writeln;
  x[0] := #5;
  writeln(x);
end.

Outputs this:
12 72 101 108 108 111 44 32 87 111 114 108 100
Hello

so read and write access to element 0

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Question: range checking for string indexing

2008-10-30 Thread Vinzent Höfler

Tom Verhoeff wrote:


On Wed, Oct 29, 2008 at 09:58:10PM +0100, Vinzent Höfler wrote:

Tom Verhoeff wrote:


I am surprised that for ShortString, the range is not
also 1 = i = Length(s).

IIRC Turbo Pascal only allowed you to access s[0] when range checking
was off, and similarly for s[i] with i  Length(s).

No. See transcript:


That looks rather convincing.


Borland Pascal  Version 7.0  Copyright (c) 1983,92 Borland International


However, IIRC there were some differences between Borland Pascal
and Turbo Pascal (as it was named before they marketed it as
Borland Pascal).


Yes, there were. But regarding string handling, nothing changed, at 
least not between TP5.5 and BP7. And I know for sure that accessing 
element 0 was always allowed, because it could be taken as shortcut for 
reading or even changing the length.



Nevertheless, this means that AnsiStrings and ShortStrings are slightly
more different than suggested in the documentation.


Well, if you put it this way, yes. With ShortStrings you rather get a 
maximum size (where indexing is allowed regardless of the actual length, 
although the behaviour could be considered more or less undefined - just 
like accessing uninitialized memory), whilst AnsiString's behaviour 
doesn't distinguish between length and (maximum) size.



Vinzent.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] Question: range checking for string indexing

2008-10-29 Thread Vinzent Höfler

Tom Verhoeff wrote:


I am surprised that for ShortString, the range is not
also 1 = i = Length(s).

IIRC Turbo Pascal only allowed you to access s[0] when range checking
was off, and similarly for s[i] with i  Length(s).


No. See transcript:

-- 8 -- the program --
{$R+}

var
   s1 : String;
   s2 : String[40];

begin
  s1 := '';
  s2 := '';

  WriteLn (Length (s1));
  WriteLn (Length (s2));

  WriteLn (Ord (s1[0]));
  WriteLn (Ord (s2[0]));

  WriteLn (Ord (s1[255]));
  WriteLn (Ord (s2[255]));
end.
-- 8 --

results in:

-- 8 --
Borland Pascal  Version 7.0  Copyright (c) 1983,92 Borland International
TEST.PAS(18): Error 76: Constant out of range.
  WriteLn (Ord (s2[255]));
  ^
-- 8 --

Commenting out the offending last line of code:

-- 8 --
Borland Pascal  Version 7.0  Copyright (c) 1983,92 Borland International
TEST.PAS(19)
19 lines, 2432 bytes code, 968 bytes data.
-- 8 --

Running the program:

-- 8 --
.\TEST.EXE
0
0
0
0
0
-- 8 --

No errors, although the index exceeds the actual length of the string.


Vinzent.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal