teacl/src/clpars.tes

809 lines
27 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

!CLPARS.TEC V2.3 14-May-2004 Tom Almy, Pete Siemsen, and Mark Henderson!
!+***************************************************************************
This macro is the imbedded command-line parsing macro for TECOC. It
was created by extracting the imbedded command-line parsing macro from the
TECO-11 executable file and then modifying it.
This macro is compiled into TECO-C. This is the human-readable
source code. To compress it (remove comments, extra whitespace, etc.)
into an unreadable version in file CLPARS.TEC, do the following command
with a working TECO:
mung squ clpars.tec=clpars.tes/d:n/l:y/b:y/t:n/c:+/w:n/a:y/e:n
Then run genclp to convert CLPARS.TEC into CLPARS.H, a C include file.
Notes:
1. On entry, Q1 contains a value
2. Bits in Q-register 1 have the following meanings:
1 /VTEDIT
2 /INSPECT
4 /NOMEMORY
8 /FIND
16 /SEEALL
32 /HOLD
64 /NOPAGE
128 /SCROLL
256 /NOCREATE
512 /NORENAME
1024 unused
2048 input file is open
4096 /NOINI
8192 force setting of filespec memory
16384 input filename is in edit buffer
32768 ???
3. Q-register 2 holds numeric argument of /SCROLL:n switch
4. Q-register Y holds the command-line option character, which
is a slash on most systems, and a dash under Unix.
5. Q-register .T holds a macro which is needed only when the :EGMEM
command isn't supported. It generates (in q-register F) the
name of a file that holds filename memory.
6. Q-register F holds the name of the file used to save file names.
7. Q-register 4 holds the line number to go to.
****************************************************************************!
!+ save the q-registers that we'll be changing !
[F0,0XF
[90,0X9
[00,0X0
[20,0X2
10U0[0 !+ radix 10 !
U0[00 !+ case independent searching !
EDU0[0ED&4ED !+ turn on automatic memory expansion !
EUU0[0-1EU !+ no case flagging on typeout !
ESU0[00ES !+ no typeout after searches !
ETU0[032768#32#8#1,0ET !+ ^C trap, read nowait and noecho, image typeout !
Q1U0 !+ Q0 = Q1 !
0U1[1
0,0X1
0U4
(-1EJ-25600)*(-1EJ-25858)"E !+ if Unix or Linux !
^^-UY !+ Unix command lines delimit options with '-' !
|
^^/UY !+ VMS command lines delimit options with '/' !
'
!+***************************************************************************
Put a subroutine into Q-register .T which, when called, fills Q-register
F with a filename to be used to store filespec memory. This subroutine
will only be needed if the :EGMEM isn't supported.
****************************************************************************!
@^U.T/
:QF"E !+ if we haven't already set q-register F !
.U.1 !+ remember where we are in edit buffer !
Iteco !+ start building "tecoxxxx.tmp" !
0EJ\ !+ insert process id into edit buffer !
.-Q1U.L !+ length of "tecoxxxx" part of filename !
Q.L-8"G !+ if it's longer than 8 characters !
Q.1+4J !+ go to front of the digits !
Q.L-8D !+ prune most significant digits from front !
4C !+ and move to the end again !
'
I.tmp !+ finish it off !
!+ RSTS/E and RT-11 aren't supported by TECO-C
-1EJ-4"E ~* if RSTS/E ~
I<60>-MODE:#3000
|
-1EJ-7"N ~* if not RT-11 ~
I;1--CR
'
'
!
Q.1,.XFQ.1,.D !+ save it in q-register F and clean up !
'/
27:^U.T
!+***************************************************************************
If we're on RSTS/E, do something special
****************************************************************************!
!+-1EJ-4"E:QZ#Z"E-1G_J::FSdcl tecoTECO"UHK':S ^[J0''!
Q0+1"E !+ if Q1 was equal to -1 on entry !
32768U0 !+ Q0 = 32768 !
'
32768"E !+ if we're on a 16-bit machine (?) !
:EITECO"S !+ try to execute macro in file TECO !
]1
Q0#32768U1
[1
J
ODONE
'
'
!+***************************************************************************
Get the command line string from q-register Z into the edit buffer
****************************************************************************!
Z"EGZ0,0XZ' !+ get command line string from Z and clear Z !
J
::S^ES"S^SD' !+ remove leading whitespace !
::STECO32"S-2D' !+ change TECO32 to TECO, if needed !
ZJ-:S^ES"S.-Z"EFR'' !+ remove trailing whitespace !
Z"EODONE' !+ if there's no command line, don't initialize !
Q0&32767U1
0,0X1
0,0X9
!+***************************************************************************
If there's a -NOINI switch, (-NOINI if under Unix) delete it, compact
any trailing whitespace, and set the 4096 bit of q-register 1.
****************************************************************************!
J:S^ES^EUYNOI"SONOINI'
J:S^EUYNOI"FONONOINI'
!NOINI!
^SD::SN"S-D::SI"S-D''
::S^ES"S^SD0A"AI ''
Q1#4096U1
!NONOINI!
!+***************************************************************************
Execute the initialization file.
****************************************************************************!
Q1&4096"E !+ if there's no NOINI switch !
HX0HK !+ save the command line in Q0 !
EPEA !+ switch to secondary I-O streams !
EF
!+ Get the INI macro into the edit buffer !
:EGINI"S !+ get the INI file specification !
G*
J0A-36"ED !+ if the first character is a dollar-sign !
HX1
HK
:ER^EQ1"S !+ open the file for reading !
YHX1HKECG1 !+ and put it's contents into the edit buffer !
|
%Can't find initialization file ":G1"1310
'
'
0,0X1
| !+ else (no defined INI filename) !
0,0X1
(-1EJ-5)*(-1EJ-1024)"E !+ if VAX/VMS !
EN[]*.*:EN"S !+ get current dir spec into Q1 !
G*JS[R0KFS.]JS]0,.X1HK
'
'
:ER^EQ1TECO.INI"S !+ if TECO.INI exists in current directory !
YHX9HKECG90,0X9 !+ get it's contents into the edit buffer !
'
'
EREW !+ switch back to primary streams !
Z"N !+ if there's an INI macro to execute !
ZJ
.U0
G1
I=
G0
Q0J
ZX9
ZK
]1
]0Q0ET
]0Q0ES
]0Q0EU
]0Q0ED
]0Q0
]0Q0
]2
HX0
HK
G9
J
S=
0,.-1X9
0,.K
M0+0U9 !+ execute INI macro, save result in Q9 !
0,0X0
[2
0,0X2
10U0[0 !+ radix 10 !
U0[00 !+ case independent searching !
EDU0[0ED&4ED !+ turn on no-memory-expansion bit !
EUU0[0-1EU !+ no case flagging on typeout !
ESU0[00ES !+ no typeout after searches !
ETU0[032768#32#8#1,0ET !+ image mode, ^T noecho and nowait, ^C trap !
[1
G9
X1
K
0,0X9
Q9U1
J::S^ES"S^SD' !+ delete leading whitespace !
ZJ-:S^ES"S.-Z"EFR'' !+ delete trailing whitespace !
Z"E
OSCOPES
'
|
G0
'
'
!+***************************************************************************
If there's a -NOMEMORY switch (-NOMEMORY under Unix), delete it, compact
any trailing whitespace, and set the 4 bit of q-register 1.
****************************************************************************!
J:S^ES^EUYNOM"SONOMEMORY'
J:S^EUYNOM"FONONOMEMORY'
!NOMEMORY!
^SD::SE"S-D::SM"S-D::SO"S-D::SR"S-D::SY"S-D'''''
::S^ES"S^SD0A"AI ''
Q1#4U1
!NONOMEMORY!
!+***************************************************************************
If there's a /NOCREATE switch, (-NOCREATE under Unix), delete it, compact
any trailing whitespace, and set the 256 bit of q-register 1.
****************************************************************************!
J:S^ES^EUYNOC"SONOCREATE'
J:S^EUYNOC"FONONOCREATE'
!NOCREATE!
^SD::SR"S-D::SE"S-D::SA"S-D::ST"S-D::SE"S-D'''''
::S^ES"S^SD0A"AI ''
Q1#256U1
!NONOCREATE!
!+***************************************************************************
If there's a /NOPAGE switch, (-NOPAGE under Unix), delete it, compact
any trailing whitespace, and set the 64 bit of q-register 1.
****************************************************************************!
J:S^ES^EUYNOP"SONOPAGE'
J:S^EUYNOP"FONONOPAGE'
!NOPAGE!
^SD::SA"S-D::SG"S-D::SE"S-D'''
::S^ES"S^SD0A"AI ''
Q1#64U1
!NONOPAGE!
!+***************************************************************************
If there's a /NORENAME switch, (-NORENAME under Unix), delete it, compact
any trailing whitespace, and set the 512 bit of q-register 1.
****************************************************************************!
J:S^ES^EUYNOR"SONORENAME'
J:S^EUYNOR"FONONORENAME'
!NORENAME!
^SD::SA"S-D::SG"S-D::SE"S-D'''
::S^ES"S^SD0A"AI ''
Q1#512U1
!NONORENAME!
!+***************************************************************************
If we're not under RSTS/E, and the command is "TECO @file", then change
it to "MUNG file".
****************************************************************************!
!+ -1EJ-4"N! !+ if not RSTS/E !
J::STE"S<0A"AC|1;'>::S^ES@"S0KIMUNG ''
!+ '!
!+***************************************************************************
If it's a MUNG command, find the file specification, delete it from
the edit buffer, and do an EI on the file.
****************************************************************************!
J::SMU"S-2D !+ if it's a MUNG command !
<0A"AD|1;'> !+ delete alphabetics following MU !
::S^ES"S^SD' !+ delete trailing whitespace !
(-1EJ-5)*(-1EJ-1024)"E !+ if VAX/VMS !
J::S""S-D !+ and it starts with double quote !
::S^ES"S^SD' !+ remove whitespace following the " !
'
'
!+ The MUNG file specification might be followed by data to be put into
the edit buffer. The file specification and the data are separated by
a comma, a slash, or whitespace. Set Q0 to point to the end of the
file specification, regardless of how its terminated.!
ZU0 !+ put edit buffer length in Q0 !
(-1EJ-25600)*(-1EJ-25858)"E !+ if Unix or Linux !
J:S-"SR.-Q0"L.U0'' !+ if - precedes Q0, change Q0 !
|
J:S/"SR.-Q0"L.U0'' !+ if / precedes Q0, change Q0 !
'
J:S^ES"S.-Q0"L.U0'' !+ if whitespace precedes Q0, change Q0 !
J<S,; !+ if a comma precedes Q0, change Q0 !
.U1
Q1-1J-:S["S:S]"S.-Q1"GF<'''
Q1-1J-:S<"S:S>"S.-Q1"GF<'''
Q1-1J-:S("S:S)"S.-Q1"GF<'''
Q1-1J.-1-Q0"LD.U0'
0;
>
Q0J<-.;-1A-32"N-1A-9"N0;''-D> !+ delete whitespace preceding Q0 !
!+ copy the file specification into q-register .0. If there's no file
specification, complain and die. !
0,.X.0
:Q.0"E?How can I MUNG nothing?1310'
!+ delete the file specification and trailing whitespace (if any) from the
edit buffer, execute the MUNG file and we're done. !
::S^ES^[ !+ locate end of whitespace, if any !
0,.K !+ delete spec + trailing whitespace !
0U0 !+ don't leave trash in Q0 !
EI^EQ.0 !+ execute the MUNG file !
JODONE !+ and we're done !
'
!+***************************************************************************
If there's a /VTEDIT (-VTEDIT under Unix), switch...
****************************************************************************!
J:S^ES^EUYVT"SOVTEDIT'
J:S^EUYVT"FONOVTEDIT'
!VTEDIT!
The VTEDIT command line option is not supported by TECOC1310

!+
::SE"S^SD::SD"S^SD::SI"S^SD::ST"S^SD''''
::S:H"S-2D::SO"S-D::SL"S-D::SD"S-D'''Q1#32U1'
::S:S"S-2D::SE"S-D::SE"S-D::SA"S-D::SL"S-D::SL"S-D'''''Q1#16U1'
::S:H"S-2D::SO"S-D::SL"S-D::SD"S-D'''Q1#32U1'
::S^ES"S^SD0A"AI ''
Q1#1U1
!
!NOVTEDIT!
!+***************************************************************************
If we're running Unix, check for a +nnn option. If there is one, set
the 128 bit of the EZ flag (to read in the whole file, regardless of form
feeds) and put the number in Q-register 4.
****************************************************************************!
!+ -1EJ-25600"E if Unix !
J:S^ES+"S
^SD\U40,128EZ^sd::ss"S^sD0A"AI ''
'
!+ ' !
!+Set EZ flag if nopage!
Q1&64"N0,128ez'
!+***************************************************************************
If there's a /SCROLL switch (-SCROLL under Unix), delete it, get the
numeric argument (or default to 0) into q-register 2.
If :SEEALL follows -SCROLL, then set bit 16 of q-register 1.
Delete any trailing whitespace and set bit 128 of q-register 1.
****************************************************************************!
J:S^ES^EUYSC"SOSCROLL'
J:S^EUYSC"FONOSCROLL'
!SCROLL!
^SD::SR"S-D::SO"S-D::SL"S-D::SL"S-D''''
::S:^ED"SR-D\U2FR|0U2' !+ get numeric arg into Q2!
::S:S"S-2D::SE"S-D::SE"S-D::SA"S-D::SL"S-D::SL"S-D'''''
Q1#16U1
'
::S^ES"S^SD0A"AI '' !+ delete trailing whitespace!
Q1#128U1
!NOSCROLL!
!+***************************************************************************
If it's a TECO command...
****************************************************************************!
J::STE"S-2D !+ if it's a TE command !
<0A"AD|1;'> !+ delete alphabetics following TE !
::S^ES"S^SD' !+ delete trailing whitespace !
!+***************************************************************************
If there's a /INSPECT switch, (-INSPECT if under Unix) delete it, compact
any trailing whitespace, and set the 2 bit of q-register 1.
****************************************************************************!
J:S^ES^EUYIN"SOINSPECT'
J:S^EUYIN"FONOINSPECT'
!INSPECT!
^SD::SS"S-D::SP"S-D::SE"S-D::SC"S-D::ST"S-D'''''
::S^ES"S^SD0A"AI ''
Q1#2U1
!NOINSPECT!
!+***************************************************************************
If there's a /FIND switch, (-FIND if under Unix) delete it, compact
any trailing whitespace, and set the 8 bit of q-register 1.
****************************************************************************!
J:S^ES^EUYFI"SOFIND'
J:S^EUYFI"FONOFIND'
!FIND!
The /FIND command line option is not supported by TECOC1310

!+
^SD::SN"S-D::SD"S-D''
::S^ES"S^SD0A"AI ''
Q1#8U1
!
!NOFIND!
!+ If there's more to the command, then delete preceding whitespace and
if the remainder of the command line contains a quoted string, do a ZJ. !
J
<
.-Z;
0A-9"EDF<'
0A-32"EDF<'
C
-1A-""E:S""S
(-1EJ-25857)*(-1EJ-25858)"E !+ If OS/2 or Linux then delete quotes !
0J2<@FS/"//>ZJ'|
ZJ'' !+ if no second quote, go to end !
>
!+ Get the remembered file specification into the edit buffer. !
Q1&4#Z"E !+ if there's no file name and no -NOMEMORY !
:EGMEM"S !+ if :EGMEM is supported !
G*J !+ get it into the edit buffer !
::S$"S^SD !+ if leading dollar sign, delete and... !
|OGOTIT' !+ otherwise got it and get outa here !
| !+ else :EGMEM isn't supported !
M.T !+ generate file name in F !
GF !+ and get it !
'
HX0HK !+ save filename in Q0 and clear buffer !
EPEA !+ select secondary I-O streams !
EF !+ close current output file !
:ER^EQ0"S !+ open file (name is in Q0) !
Y
L
."N-1A-10"E-D'' !+ remove trailing lf, if any !
."N-1A-13"E-D'' !+ remove trailing cr, if any !
ZK
HX0HK
EC !+ copy input to output and close streams !
G0
'
EREW !+ select primary I-O streams !
0,0X0
!GOTIT!
!+ If there's a file specification, then delete preceding whitespace and
if the remainder of the filespec contains a quoted string, do a ZJ. !
!+ However there shouldn't be any whitespace -- don't do this step
because it messes up names with embedded spaces
J
<
.-Z;
0A-9"EDF<'
0A-32"EDF<'
C
-1A-""E:S""UZJ''
>
! ZJ !+ but move to end just in case !
Z"N
Q1#32768#16384U1
'
' !+ endif (no filename and no -NOMEMORY) !
Q1&16384"N !+ if input filename in edit buffer !
Q1&2"E !+ if not -INSPECT !
Edi
|
Inspec
'
ting file "HT"1310
'
Z"E !+ if there's no file name !
Q1&2"EOSCOPES' !+ if not -INSPECT, goto SCOPES !
?How can I inspect nothing?1310

'
Q1&2"E !+ if not -INSPECT !
J:S="S !+ if it's ofile=ifile !
0,.-1X00,.K !+ save ofile name in Q0 !
ZU0 !+ save length of ifile name in Q0 !
HX2HK !+ save ifile name in Q2 !
:Q2"N !+ if there's an ifile name !
:ER^EQ2"U !+ try to open the ifile !
G2HX0HKONOTFND !+ and goto NOTFND if it fails !
'
'
:Q0"N !+ if there's an ofile name !
EW^EQ0 !+ open the ofile !
'
Q0"N !+ if the ifile name length not = 0 !
Q1#2048U1 !+ remember: input file is open !
'
OREMEM
'
'
HX0HK
Q1&2"E !+ if not -INSPECT !
:EB^EQ0"S !+ open it for reading-writing !
Q1#2048U1 !+ remember: input file is open !
OREMEM
'
:ERQ0"S !+ TAA Added -- try to open for read !
Q1#2048U1
%Can't write to file -- opening for input only1310
OREMEM
'
Q1&256"N !+ EB failed, so if -NOCREATE !
Q1&32768"E
ONOTFND
'
'
%Can't find file ":G0"1310
Q1&32768"E
%Creating new file1310
OCREATE
|
%Ignoring TECO's memory1310
Q1#8192U1
0,0X0
OREMEM
'
'
:ER^EQ0"S !+ it's -INSPECT, open input file !
Q1#2048U1 !+ remember: input file is open !
OSCOPES
'
!NOTFND!
?Can't find file ":G0"?1310

'
!+***************************************************************************
If it's a MAKE command...
****************************************************************************!
J::SMA"S-2D
<0A"AD|1;'> !+ delete letters following MA !
::S^ES"S^SD' !+ delete trailing whitespace !
J
<
.-Z;
0A-9"EDF<'
0A-32"EDF<'
C
-1A-""E:S""S
(-1EJ-25857)*(-1EJ-25858)"E !+ If OS/2 or Linux then delete quotes !
0J2<@FS/"//>ZJ'|
ZJ'' !+ if no second quote, go to end !
>
Z"E?How can I MAKE nothing?1310'
Z-4"EJ::SLOVE"SNot war?1310''
HX0HK !+ save the filespec in Q0 for REMEM !
!CREATE!
EW^EQ0 !+ Open file for writing !
OREMEM !+ and go remember !
'
%Unrecognized command "HTHK"1310
OSCOPES
!+***************************************************************************
Remember the filename in filespec memory. The filespec is in Q0.
****************************************************************************!
!REMEM!
Q1&8192"E !+ if 8192 bit is off in Q1 !
Q1&(32768#4)"NOSCOPES' !+ if ??? or -NOMEMORY, goto SCOPES !
:Q0"EOSCOPES' !+ if Q0 is empty, goto SCOPES !
'
!+ The file specification is now in Q0. If :EGMEM is unsupported, a file
is used to implement filespec memory.
!
:EGMEM"S !+ if :EGMEM is supported !
ZJG*C !+ append remembered spec to buffer !
::S$"U !+ no leading $ !
ZK:EGMEM ^EQ0 !+ set remembered filespec to Q0 !
OSCOPES !+ Goto SCOPES !
|
-1D !+ delete dollar !
ZXFZK !+ Save in q reg F !
'
|
M.T !+ Generate file name !
'
EA !+ switch to secondary output stream !
:EW^EQF"S !+ open the file !
G0 HPW HK EF !+ and write the filespec into it !
'
EW !+ switch to primary output stream !
!+***************************************************************************
****************************************************************************!
!SCOPES!
!+ -VTEDIT is not supported
Q1&1"N ~* if /VTEDIT ~
ET&512"E
%Your terminal is not an interactive scope1310
Q1#1-1U1
|
0,3:W ~* clear SEEALL mode ~
Q1&16"N-1,3:W' ~* if /SEEALL, set SEEALL mode ~
0,5:W ~* clear hold mode ~
Q1&32"N/1,5:W' ~* if /HOLD, set hold mode ~
'
'
Q1&1"E
OYANK
'
~* load the VTEDIT macro file name into q-register 9 ~
:EGVTE"S ~* if :EGVTE is supported ~
1G*X9K
|
:@9%DIT%
:Q1"E
(-1EJ-5)*(-1EJ-1024)"E
EN[]*.*:EN"S
ZJ
.U0
G*
Q0J
S[ R
Q0,.K
FS.] Q0J
S] Q0,.X1
Q0,ZK
'
'
'
'
:Q9"N ~* if Q9 isn't empty ~
:EI^EQ1^EQ9"S
Q1#2048-2048U1
OYANK
'
'
~****************************************************************************
Get the library directory specification into q-register 1.
If there's no defined library directory, define the default one.
****************************************************************************~
:EGLIB"S ~* if there's a defined lib dir ~
G*X1K ~* use it ~
| ~* else ~
-1EJ-0"E @1%LB:[1,2]% | ~* if RSX-11D: LB:[1,2] else~
-1EJ-1"E @1%LB:[1,2]% | ~* if RSX-11M: LB:[1,2] else~
-1EJ-2"E @1%LB:[1,2]% | ~* if RSX-11S: LB:[1,2] else~
-1EJ-3"E @1%LB:[1,2]% | ~* if IAS: LB:[1,2] else~
(-1EJ-5)*(-1EJ-1024)"E ~* if VAX/VMS ~
@1%SYS$LIBRARY:% | ~* SYS$LIBRARY: else~
-1EJ-6"E @1%LB:[1,2]% | ~* if RSX-11S: LB:[1,2] else~
-1EJ-7"E @1%SY:% | ~* if RT-11: SY: else~
@1%% ~* default: nothing ~
'''''''
'
:Q1"N ~* if there's a library directory ~
:EI^EQ1VTEDIT"S ~* execute the macro in there ~
Q1#2048-2048U1
OYANK
'
'
%The :G9 macro is not available1310
!
!+**************************************************************************!
!YANK!
Q1&2048"N !+ if input file is open !
Y !+ read in the first page !
'
J
!+
Q1&8"N ~* if /FIND ~
Finding position marker...1310
EW G*
X0
K
-1
:Q0"N
:N~~/\~~
"S^SD'
U0
|
:_~~/\~~
"S^SD'
U0
'
0
Q0"U
?Position marker not found?1310

'
'
!
!+***************************************************************************
On entry, Q2 contains the numeric argument given in the -SCROLL:n
switch, or 0 if no -SCROLL switch was specified.
****************************************************************************!
Q1&128"N !+ if -SCROLL !
ET&512"E
%Your terminal is not an interactive scope1310
|
Q2"E
2:W-4U2
'
0,3:W Q1&16"N !+ if -SEEALL !
1,3:W '
0,5:W Q1&32"N !+ if -HOLD!
1,5:W '
Q2,7:W-Q2"N
%Your terminal doesn't support scrolling1310
'
'
'
!+***************************************************************************
****************************************************************************!
!DONE!
q4-1"G !+ if q4 greater than 1 !
q4-1:s^J"U0J' !+ search for q4th line feed !
'
q1&64"N !+ NOPAGE switch? !
0,128EZ
'
q1&512"N !+ NORENAME switch? !
0,2EZ
'
]1
]0Q0ET
]0Q0ES
]0Q0EU
]0Q0ED
]0Q0
]0Q0
]2
]0
]9
]F
0U.10U.L0U40UY0,0X.T !+ reset q registers !