On 1/31/22 2:46 PM, Will Senn wrote:
All,
I have been doing some language exploration in v7/4.3bsd and
came across Software Tools (not the pascal version). It's
written using ratfor, which I had seen in the v7 UPM. I fired up
v7 and tried my hand at the first example:
I thought I'd close the loop on the language side of this thread.
I am happy to report that ratfor (and fortran) is alive and well.
It works on my mac! The Software Tools book is awesome, if
challenging. The first chapter is particularly challenging as it
takes a bit to figure out where the authors are coming from and
what they include, exclude, and highlight... and why. The key to
understanding the book, as a modern reader, is to understand that
the authors assume their readers are fortran (or PL/I)
programmers. Because of this, they don't explain anything that
would be obvious to said programmers (read, write, LUNs, Hollerith
cards, format, etc). In addition, they will push down details of
implementation until they practically disappear (think
singularity... annoyingly consistent in this regard). When they
say something like "EOF is a symbolic constant... We won't tell
you what its value is, since the particular value doesn't matter",
they really mean it. Unfortunately, in order to actually implement
stuff, you gotta know what every symbolic constant and macro
replacement is :).
For example, even in the tiny copy program example, from the
introductory chapter, once you include the primitive getc and putc
subroutines, there are 7 symbolic constants: MAXLINE, MAXCARD,
NEWLINE, STDIN, STDOUT, EOF, SPACE and character, which is really
an integer and gets replaced with integer by some mythical
preprocessor (chapter 8). Anyhow, in the modern world, MAXLINE and
MAXCARD don't really have meaning, but they can magically be
treated as lines of a file, the rest do have meaning, but they
don't evaluate to the same things in Fortran-land as in
modern-land. STDIN is 5 and STDOUT is 6 (card reader and punch
LUNs, again some magic that lets them be treated as terminal input
and output), EOF is -1, SPACE is 32, NEWLINE is 10. Anyhow, long
story just a bit shorter, replace those constants, swap character
for integer, and combine getc, putc, and copy and yahoo, a working
copy program that works in v7, 4.xBSD, and Mac OS X Mojave (and
BSD, etc), without any further modifications... at all.
Included for the curioius (copynew.r):
# on v7
# $ ratfor -C copynew.r > copynew.f
# $ f77 -o copynew copynew.f
# on mac
# $ ratfor77 -C
copynew.r > copynew.f
# $ gfortran -o copynew copynew.f
# $ ./copynew
# This is a test.
# This is a test.
# CTRL-d
# $
# getc (simple version) - get characters from standard input
integer function getc(c)
integer buf(81), c
integer i, lastc
data lastc /81/,buf(81) /10/
lastc = lastc + 1
if(lastc > 81) {
read(5, 100, end=10) (buf(i), i = 1, 80)
100 format(80 a 1)
lastc = 1
}
c = buf(lastc)
getc = c
return
10 c = -1
getc = -1
return
end
# putc (simple version) - put characters on the standard output
subroutine putc(c)
integer buf(80), c
integer i, lastc
data lastc /0/
if (lastc > 80 | c == 10) {
for (i = lastc + 1; i <= 80; i = i + 1)
buf(i) = 32
write(6, 100) (buf(i), i = 1, 80)
100 format(80 a 1)
lastc = 0
}
if (c != 10) {
lastc = lastc + 1
buf(lastc) = c
}
return
end
# copy - copy input characters to output
integer getc
integer c
while(getc(c) != -1)
call putc(c)
stop
end
Of course, it's criminal to have all those hardcoded magic numbers,
wouldn't it be swell if there were some sort of macro facility?...
oh, wait, that's what Chapter 8's all about... I can't wait.
Will