Deutsch   English   Français   Italiano  
<vl9bjp$eq3$1@reader2.panix.com>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!weretis.net!feeder9.news.weretis.net!panix!.POSTED.spitfire.i.gajendra.net!not-for-mail
From: cross@spitfire.i.gajendra.net (Dan Cross)
Newsgroups: comp.os.vms
Subject: Re: VMS Pascal article
Date: Fri, 3 Jan 2025 18:51:37 -0000 (UTC)
Organization: PANIX Public Access Internet and UNIX, NYC
Message-ID: <vl9bjp$eq3$1@reader2.panix.com>
References: <vl3pi8$2r2sr$1@dont-email.me> <67781447$0$711$14726298@news.sunsite.dk> <vl99jl$rf6$1@reader2.panix.com> <vl9aln$o72$1@dont-email.me>
Injection-Date: Fri, 3 Jan 2025 18:51:37 -0000 (UTC)
Injection-Info: reader2.panix.com; posting-host="spitfire.i.gajendra.net:166.84.136.80";
	logging-data="15171"; mail-complaints-to="abuse@panix.com"
X-Newsreader: trn 4.0-test77 (Sep 1, 2010)
Originator: cross@spitfire.i.gajendra.net (Dan Cross)
Bytes: 4431
Lines: 113

In article <vl9aln$o72$1@dont-email.me>, Arne Vajhøj  <arne@vajhoej.dk> wrote:
>On 1/3/2025 1:17 PM, Dan Cross wrote:
>> In article <67781447$0$711$14726298@news.sunsite.dk>,
>> Arne Vajhøj  <arne@vajhoej.dk> wrote:
>>> On 1/3/2025 10:11 AM, Dan Cross wrote:
>>>> `readln` and `fgets` are not similar in that `readln` strips the
>>>> line ending sequence, and `fgets` does not.
>>>
>>> Close enough for the purpose of this article.
>> 
>> Perhaps.  I may be worth an asterisk, as often C programmers
>> will want to write:
>> 
>>      while ((s = fgets(s, len, fp)) != NULL) {
>>          char *nl = strchr(s, '\n');
>>          if (nl != NULL)
>>              *nl = '\0';
>>      }
>> 
>> Which is a bit more cumbersome than the Pascal equivalent.  When
>> carriage returns get mixed in, it gets even nastier, so much so
>> that one may just write a helper function to deal with it.
>
>I think you are right. I have added a note.
>
>>>> `f = fopen,fnm "r");` is an obvious typo.
>>>> `while not eof(f)) do` is an obvious typo.
>>>
>>> Fixed.
>> 
>> Fixed, but the comparison to C is slightly wrong:
>> 
>> `while not(eof(f)) do` is not exactly the same as
>> `while(!feof(f))`.  In particular, while in VSI Pascal `EOF(f)`
>> will be true on the first iteration of the loop if `f` is empty,
>> the same is not true for `feof` from stdio: in order for `feof`
>> to be true, stdio must observe the end-of-file condition of `f`
>> via some input operation.  This leads to awkward code sequences
>> like this:
>> 
>>      ch = fgetc(fp);
>>      while (!feof(fp)) {
>>          /*
>>           * Do something with `ch`
>>           * ...
>>           */
>>          ch = fgetc(fp);
>>      }
>
>C feof is a crap function.
>
>I think I will drop feof completely and add fgetc
>not returning EOF. I already have fgets not returning NULL.
>
>>>> The structure you present at the end as "equivalent" of a
>>>> varying character array is not correct.  `integer16` is a signed
>>>> type, with a maximum value of 32,767.  The length field for a
>>>> `varying [n] of char` is an integer subrange type with word
>>>> representation.  That is, `length` is unsigned 0..max, where max
>>>> is <= 65,535.
>>>
>>> Ooops.
>>>
>>> You are right.
>>>
>>> I was sure that the limit was 32K but it is 64K.
>>>
>>> Fixed.
>>>
>>> And also fixed in the description of VARYING further up.
>> 
>> You should seriously mention the STRING type, though.
>
>I think VARYING OF CHAR is what is used most in VMS Pascal.

Weird; I can't imagine why.  Regardless, it may be worthwhile to
at least mention it, since you state explicitly that there are
three types for representing textual, string-like data, but
VSI's documentation makes it clear that there are actually four.

>> Also, it's a bit of a bummer that you didn't mention nested
>> functions/procedures, which are among the cooler aspects of the
>> language:
>> 
>> $ type foo.pas
>> (* foo *)
>> program foo(output);
>> procedure hello;
>>      procedure world(var who: String);
>>          function punct: char;
>>          begin
>>              punct := '!'
>>          end;
>>      begin
>>          who := 'World' + punct
>>      end;
>> var
>>      who: String (10);
>> begin
>>      world(who);
>>      writeln('Hello, ', who)
>> end;
>> begin
>>      hello
>> end.
>
>There is already an example. fac is inside testfac.
>
>I will add a note about it.

Ah, I see it now; the lack of indentation makes it hard to spot.

	- Dan C.