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: References: <67781447$0$711$14726298@news.sunsite.dk> 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 , Arne Vajhøj wrote: >On 1/3/2025 1:17 PM, Dan Cross wrote: >> In article <67781447$0$711$14726298@news.sunsite.dk>, >> Arne Vajhøj 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.