Trailing-Edge
-
PDP-10 Archives
-
decuslib20-01
-
decus/20-0003/paslnx.pas
There is 1 other file named paslnx.pas in the archive. Click here to see a list.
{$m-,d-,c-}
program pasprm;
{ this is a replacement for pasprm in paslnk.mac, for use when you do
not want to interface to the EXEC. It calls a COMND jsys scanner}
include 'pascmd.pas','string.pas';
const
noswitch=0;
zero=1;
stack=2;
objectlist=3;
nomain=4;
nodebug=5;
nocheck=6;
nobinary=7;
list=8;
heap=9;
debug=10;
cref=11;
version=12;
compile=13;
load=14;
noload=15;
arithcheck=16;
noarithcheck=17;
type retblk=record
relnam:alfa;
stkval:integer;
heaval:integer;
verval:integer;
rpgsw:Boolean;
crsw:Boolean;
dsw:Boolean;
csw:Boolean;
msw:Boolean;
tsw:Boolean;
lsw:Boolean;
zsw:Boolean;
asw:Boolean
end;
retptr = ^ retblk;
var
aswseen,noexec,nolink,force,nobin,dolist,ccl:Boolean;
i,ptr,key:integer;
switchtable:table;
swdone,dodeb:Boolean; {on to load with pasddt}
buf:packed array[1:100]of char;
r:retptr;
idate,odate:array[1:1]of integer;
xwd:packed record case Boolean of
true:(full:integer);
false:(lh:0..777777B;rh:0..777777B)
end;
initprocedure;
begin
dodeb := false;
end;
procedure quit; extern;
procedure pascmp; extern;
procedure runlink; extern;
procedure calllink;
var jobno:array[1:1]of integer;
tempname:packed array[1:12] of char;
i,j:integer;
begin
if nolink
then quit;
jsys(507B{getji},2;-1,-1:jobno,0);
tempname := '000LNK.TMP;T';
i := jobno[1];
for j := 3 downto 1 do
begin
tempname[j] := chr((i mod 10) + 60B);
i := i div 10;
end;
rewrite(output,tempname);
if dodeb
then writeln('SYS:PASDDT');
writeln(buf:findnull(buf)-1);
if noexec
then writeln('/G')
else writeln('/G/E');
close(output);
runlink
end;
function getoct:integer;
var x:packed record case Boolean of
true:(word:integer);
false:(junk:0..777777B;page:0..777B;addr:0..777B)
end;
begin
x.word := cmnum8;
with x do
begin
if (junk <> 0) or (page = 0)
then begin
writeln(tty);
writeln(tty,'? Must be between 1000 and 777777');
cmagain
end;
if addr = 0
then page := page-1;
addr := 777B;
getoct := word;
end;
end;
function pasprm(var infile,outfile,relfile:text):retptr;
begin
newz(r);
with r^ do
begin
dsw := true;
csw := true;
msw := true;
tsw := true;
end;
nobin := false;
dolist := false;
force := false;
noexec := false;
nolink := false;
aswseen := false;
{Switchtable is table of compiler switches}
switchtable := tbmak(17);
tbadd(switchtable,zero,'ZERO',0);
tbadd(switchtable,version,'VERSION:',0);
tbadd(switchtable,stack,'STACK:',0);
tbadd(switchtable,objectlist,'OBJECTLIST',0);
tbadd(switchtable,nomain,'NOMAIN',0);
tbadd(switchtable,noload,'NOLOAD',0);
tbadd(switchtable,nodebug,'NODEBUG',0);
tbadd(switchtable,nocheck,'NOCHECK',0);
tbadd(switchtable,nobinary,'NOBINARY',0);
tbadd(switchtable,noarithcheck,'NOARITHCHECK',0);
tbadd(switchtable,load,'LOAD',0);
tbadd(switchtable,list,'LIST',0);
tbadd(switchtable,heap,'HEAP:',0);
tbadd(switchtable,debug,'DEBUG',0);
tbadd(switchtable,cref,'CREF',0);
tbadd(switchtable,compile,'COMPILE',0);
tbadd(switchtable,arithcheck,'ARITHCHECK',0);
cminir('PASCAL>');
ccl := cmmode = rescan;
r^.rpgsw := ccl;
gjgen(100000000000B); {an input file}
gjext('PAS');
cmfil(infile); {This is the main part of the command}
swdone := false;
loop
cmmult; {multiple mode}
cmcfm; {CRLF}
i := cmswi(switchtable); {or switch - i is dummy return}
i := cmdo; {now actually do it}
exit if i = 1 {done if CRLF}
with r^ do
case cmint of
zero: zsw := true;
-version: verval := cmnum8;
-stack: stkval := getoct;
objectlist: lsw := true;
nomain: msw := false;
nodebug: dsw := false;
arithcheck: begin asw := true; aswseen := true end;
noarithcheck: begin asw := false; aswseen := true end;
nocheck: csw := false;
nobinary: nobin := true;
list: dolist := true;
-heap: heaval := getoct;
debug: dodeb := true;
cref: crsw := true;
compile: force := true;
load: noexec := true;
noload: nolink := true;
noswitch: swdone := true;
end;
end;
{The default for /ARITH is the setting of /CHECK}
if not aswseen
then r^.asw := r^.csw;
{And make the rel file be the input name.REL. also copy name
as output module name.}
putstr(' ',10,buf,1);
jsys(30B{jfns};-1:buf,infile,001000B:0);
if buf[1] = chr(0)
then begin
putstr('MAIN',4,buf,1);
buf[5] := chr(0);
end;
with r^ do
begin
ptr := findnull(buf);
buf[ptr] := ' ';
putstr(buf,10,relnam,1);
end;
if ptr > 7
then ptr := 7;
putstr('.REL',4,buf,ptr);
buf[ptr+4] := chr(0);
{Here we see if a compilation is really needed, by checking creation dates}
if ccl then begin
jsys(20B{gtjfn},2,i;100001B:0,-1:buf;relfile);
if i = 2
then begin
jsys(63B{gtfdb};infile,1:5,idate);
jsys(63B{gtfdb};relfile,1:5,odate);
if (odate[1] > idate[1]) and not force
then begin {not needed - call link now}
jsys(23B{rljfn},2;0:infile);
jsys(30B{jfns};-1:buf,0:relfile,201100B:1);
jsys(23B{rljfn},2;0:relfile);
calllink;
end
end;
jsys(23B{rljfn},2;0:relfile);
end;
if nobin
then jsys(20B{gtjfn},2;400011B:0,-1:'NUL:';relfile)
else jsys(20B{gtjfn},2;400001B:0,-1:buf;relfile);
if dolist or r^.crsw or r^.lsw
then begin
if r^.crsw
then putstr('CRF',3,buf,ptr+1)
else putstr('LST',3,buf,ptr+1);
jsys(20B{gtjfn},2;400001B:0,-1:buf;outfile);
end
else jsys(20B{gtjfn},2;400011B:0,-1:'NUL:';outfile);
pasprm := r
end;
procedure pasxit(var infile,outfile,relfile:text);
begin
close(infile);
if ccl
then jsys(30B{jfns};-1:buf,0:relfile,201100B:1);
close(outfile);
close(relfile);
if ccl
then calllink
else pascmp
end
.