commit
0e17d45276
|
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
*.o
|
||||||
|
*.obj
|
||||||
|
*~
|
||||||
|
*.bak
|
||||||
|
*.exe
|
||||||
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
tecoc
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
tecoc teco/inspect %$
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
tecoc teco/inspect %$
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
tecoc mung %$
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
tecoc mung %$
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
tecoc teco %$
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
tecoc teco %$
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
alias teco tecoc teco/norename
|
||||||
|
alias inspect tecoc/inspect
|
||||||
|
alias mung tecoc mung
|
||||||
|
alias tmake tecoc make
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
tecoc make %$
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
tecoc make %$
|
||||||
|
|
@ -0,0 +1,469 @@
|
||||||
|
AAREADME.TXT
|
||||||
|
|
||||||
|
This directory contains TECO-C, a version of TECO written in C.
|
||||||
|
It was written in C so the author could move comfortably from VAX/VMS
|
||||||
|
to various other machines, including MicroVaxes, which couldn't execute
|
||||||
|
TECO-11 prior to VMS 5.0 because they don't support PDP-11 compatibility
|
||||||
|
mode. TECO32, distributed with v5.0, solved this problem.
|
||||||
|
|
||||||
|
TECO-C is meant to be a complete implementation of TECO as defined
|
||||||
|
by the Standard TECO User's Guide, which is in file TECO.DOC. There is no
|
||||||
|
manual for TECO-C itself, but the Standard TECO manual was the specification
|
||||||
|
for TECO-C, so it serves as an excellent manual. TECO-C departs from the
|
||||||
|
Standard manual in only a few places (like no video mode), listed in file
|
||||||
|
PROBLEMS.TXT. There is quick-and-dirty "wall chart" of all TECO commands
|
||||||
|
in file WCHART.TXT.
|
||||||
|
|
||||||
|
This version of TECO-C runs under VMX/VMS, MS-DOS, AmigaDOS and Unix
|
||||||
|
(SunOS, Ultrix and System V on a Data General Aviion). If you find bugs or
|
||||||
|
have any comments about TECO-C, please contact
|
||||||
|
|
||||||
|
Pete Siemsen Pete Siemsen
|
||||||
|
645 Ohio Avenue #302 University of Southern California
|
||||||
|
Long Beach, Ca. 90814 1020 West Jefferson Blvd.
|
||||||
|
Los Angeles, CA 90089-0251
|
||||||
|
|
||||||
|
(213) 433-3059 (home) (213) 740-7391 (work)
|
||||||
|
|
||||||
|
Internet: siemsen@usc.edu
|
||||||
|
|
||||||
|
The following sections describe how to use or build TECO-C for
|
||||||
|
different environments. The command line syntax is the same as the syntax
|
||||||
|
for TECO-11 command lines.
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
U N D E R V A X / V M S
|
||||||
|
|
||||||
|
TECO-C was mostly developed under VAX/VMS. It compiles and links
|
||||||
|
using VAX C 3.1 under VMS version 5.3.
|
||||||
|
|
||||||
|
To set up: inspect and modify ZVLOGIN.COM and then add it to your
|
||||||
|
LOGIN.COM
|
||||||
|
|
||||||
|
To compile: inspect/edit ZVBLD.COM, then SUBMIT it
|
||||||
|
|
||||||
|
To link: use the "LT" command (defined in ZVLOGIN.COM)
|
||||||
|
|
||||||
|
To run: inspect/edit the symbol definitions in ZVLOGIN.COM
|
||||||
|
Note: TECO-C uses the same command line syntax as TECO32
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
U N D E R M S - D O S
|
||||||
|
|
||||||
|
TECO-C compiles/links under Turbo C v2.00 under MS-DOS 4.01 and
|
||||||
|
Concurrent DOS 386 v3.0.
|
||||||
|
|
||||||
|
To build: run MAKE on MAKEFILE.TC. to build TECO from scratch say:
|
||||||
|
"make -fmakefile.tc -DALL". see MAKEFILE.TC for other make
|
||||||
|
-D options. also see MAKETECO.BAT.
|
||||||
|
|
||||||
|
To run: use TECO.BAT to edit a file or MUNG.BAT to run a macro,
|
||||||
|
for example: TECO filename.
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
U N D E R U N I X
|
||||||
|
|
||||||
|
To compile and link: use the make utility on "makefile.sun" (for SunOS) or
|
||||||
|
"makefile.ulx" (for Ultrix) or "makefile.dg" (for System V Unix
|
||||||
|
on a Data General Aviion).
|
||||||
|
|
||||||
|
To run: define aliases and environment variables in your .cshrc file.
|
||||||
|
Here's an example, assuming my initialization file is named
|
||||||
|
.tecorc and it's in my home directory, and my macros are in a
|
||||||
|
directory named tecoc under my main directory. You'll have to
|
||||||
|
change the directory names, of course.
|
||||||
|
|
||||||
|
setenv TEC_INIT \$/home/sol/siemsen/.tecorc
|
||||||
|
setenv TEC_LIBRARY /home/sol/siemsen/tecoc/
|
||||||
|
alias te '/home/sol/siemsen/tecoc/tecoc teco -nocreate'
|
||||||
|
alias mung '/home/sol/siemsen/tecoc/tecoc mung'
|
||||||
|
alias tma '/home/sol/siemsen/tecoc/tecoc make'
|
||||||
|
|
||||||
|
After doing this, "te" runs tecoc.
|
||||||
|
|
||||||
|
|
||||||
|
Unix Command line
|
||||||
|
---- ------- ----
|
||||||
|
|
||||||
|
To make Unix users more comfortable, TECO-C uses Unix-like options syntax
|
||||||
|
instead of the familiar "/" style used under VAX/VMS. The options can be
|
||||||
|
abbreviated. They are (optional characters in square brackets):
|
||||||
|
|
||||||
|
-in[spect]
|
||||||
|
-noc[reate]
|
||||||
|
-noi[ni]
|
||||||
|
-nom[emory]
|
||||||
|
-sc[roll]
|
||||||
|
-scroll:nnn:SEEALL
|
||||||
|
do nnn,7:W and 1,3:W
|
||||||
|
|
||||||
|
|
||||||
|
-nop[age]
|
||||||
|
Don't separate input into pages. Instead, treat form feeds as
|
||||||
|
normal characters.
|
||||||
|
+nnn
|
||||||
|
where nnn is any number of digits. Go to line number nnn and set
|
||||||
|
nopage. Note this uses the UNIX end of line convention for use with
|
||||||
|
cc output &c. The non-unix line termination will still be used for
|
||||||
|
nL and other intrinsic TECO commands, this just controls the
|
||||||
|
starting line AT INVOCATION.
|
||||||
|
|
||||||
|
|
||||||
|
EZ Mode Control Flag
|
||||||
|
-- ---- ------- ----
|
||||||
|
|
||||||
|
To add functionality, TECO-C is sensitive to bits in an extra mode control
|
||||||
|
flag in addition to the standard ones. Bits in the EZ mode control flag are
|
||||||
|
used in different ways by different operating systems. Under Unix, bits in
|
||||||
|
the flag have the following meanings:
|
||||||
|
|
||||||
|
1 Mark Henderson, who did much of the Unix port, likes the way
|
||||||
|
VAX/VMS keeps versions of files. VMS appends a semicolon followed
|
||||||
|
by a version number to files, and has the PURGE command to clean
|
||||||
|
out old versions of files. If this bit is off, TECO-C will handle
|
||||||
|
file version numbers, appending the appropriate version number to
|
||||||
|
file names. Mark supplied a "purge" program (distributed with TECO-C)
|
||||||
|
for users of this feature. Setting this flag turns off the feature,
|
||||||
|
to make TECO-C function as expected by the average Unix user. This
|
||||||
|
flag is set by default.
|
||||||
|
|
||||||
|
8 I don't know what this flag does. It only makes sense when TECO-C
|
||||||
|
is compiled with CURSES support.
|
||||||
|
|
||||||
|
16 If set, when it's time to beep, use an audio beep, and if it fails,
|
||||||
|
then try a video flash. If clear, try a video flash, and if it
|
||||||
|
fails, use an audio beep. This bit works only if TECO-C was compiled
|
||||||
|
with CURSES support. This bit is off by default.
|
||||||
|
|
||||||
|
32 If set, and split screen scrolling mode is on (see the 7:W command),
|
||||||
|
TECO-C puts a line between the upper and lower scrolling regions.
|
||||||
|
If off, don't display a line. This bit works only if TECO-C was
|
||||||
|
compiled with CURSES support. This bit is off by default.
|
||||||
|
|
||||||
|
128 If set, don't stop on form feeds when reading. If clear, a form
|
||||||
|
fed in the input stream stops the read (the standard TECO style).
|
||||||
|
This bit is off by default.
|
||||||
|
|
||||||
|
256 If set, use Unix-style newline terminators. This means when files
|
||||||
|
are read in, carriage-returns are not added to the end of lines,
|
||||||
|
and when the user types the RETURN key, only a newline is entered
|
||||||
|
into the command line (usually a carriage-return/line-feed pair is
|
||||||
|
entered). Old macros (and old TECO users) may get confused if this
|
||||||
|
bit is set, but it's required if CURSES support is compiled into
|
||||||
|
TECO-C.
|
||||||
|
|
||||||
|
2048 If set, use a bottom-tee symbol instead of a diamond to indicate
|
||||||
|
the end-of-buffer. This bit works only if TECO-C was compiled with
|
||||||
|
CURSES support. This bit is off by default.
|
||||||
|
|
||||||
|
8192 If set, don't show CR in SCROLL mode (like standard TECO). If clear,
|
||||||
|
show CR (a graphics character indicating a carriage return) when in
|
||||||
|
SCROLL mode. This bit works only if TECO-C was compiled with CURSES
|
||||||
|
support. This bit is on by default.
|
||||||
|
|
||||||
|
|
||||||
|
Filename Memory
|
||||||
|
-------- ------
|
||||||
|
|
||||||
|
TECO tries to remember the last file edited by TECO, so that after you've
|
||||||
|
edited a file once, you can re-edit without having to type the file name
|
||||||
|
on the command line. TECO-C implements this under Unix by writing and reading
|
||||||
|
files named /tmp/tecoxxx.tmp, where "xxx" is the process id of the parent
|
||||||
|
process.
|
||||||
|
|
||||||
|
|
||||||
|
NOTE: There is another TECO in C, written by Matt Fichtenbaum, which
|
||||||
|
runs under Unix. It is part of the DECUS TECO Collection. Contact Pete
|
||||||
|
Siemsen at the above address for a copy.
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
U N D E R A M I G A D O S
|
||||||
|
|
||||||
|
To compile and link: see makefile.ami, (note: it needs tecoc.lnk)
|
||||||
|
|
||||||
|
Comments from the author of the Amiga code:
|
||||||
|
|
||||||
|
I've completed my TECOC port to the Amiga. It has been tested on an
|
||||||
|
Amiga 1000 under AmigaDOS 1.3.2. My system configuration is:
|
||||||
|
|
||||||
|
68000 microprocessor
|
||||||
|
2.5 megs memory
|
||||||
|
80 meg hard drive
|
||||||
|
Old Amiga chip set
|
||||||
|
SAS Institute C for the Amiga version 5.10
|
||||||
|
|
||||||
|
TECO-C runs in the CLI window it was started from, and it should run
|
||||||
|
over a terminal hooked to an Amiga serial port as well.
|
||||||
|
|
||||||
|
Adding 'W' command stuff would probably best be done by one of the
|
||||||
|
termcap ports to the Amiga, however, TECO would have to handle
|
||||||
|
SIGWINCH-like events, unless it is modified to open it's own window of
|
||||||
|
a particular size without a resizing gadget. It wouldn't be to hard to
|
||||||
|
write a terminal driver for Amiga windows using hard-coded escape
|
||||||
|
sequences either, but then that would lose over a serial port.
|
||||||
|
|
||||||
|
EzFlag
|
||||||
|
------
|
||||||
|
|
||||||
|
The EZ flag is system-dependent. Under AmigaDOS, bits in the flag have the
|
||||||
|
following meanings:
|
||||||
|
|
||||||
|
128 If set, don't stop on form feeds when reading. If clear, a form
|
||||||
|
fed in the input stream stops the read (the standard TECO style).
|
||||||
|
This bit os off by default.
|
||||||
|
|
||||||
|
256 If set, use Unix-style newline terminators. This means when files
|
||||||
|
are read in, carriage-returns are not added to the end of lines,
|
||||||
|
and when the user types the RETURN key, only a newline is entered
|
||||||
|
into the command line (usually a carriage-return/line-feed pair is
|
||||||
|
entered). Old macros (and old TECO users) may get confused if this
|
||||||
|
bit is set, but it's required if CURSES support is compiled into
|
||||||
|
TECO-C.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
F I L E S
|
||||||
|
|
||||||
|
|
||||||
|
aareadme.txt this readme file
|
||||||
|
baksrc.c backwards search
|
||||||
|
bldstr.c build a string with string build constructs
|
||||||
|
change.tec change macro squished
|
||||||
|
change.tes change macro source. this macro allows you to
|
||||||
|
replace one string with another in a group of
|
||||||
|
files using match constructs.
|
||||||
|
changes.txt contains teco-c release notes starting from
|
||||||
|
version 1.00 (TVERSION = 100)
|
||||||
|
chmacs.h ctype.h for teco-c
|
||||||
|
clenup.c clean up before exiting teco-c
|
||||||
|
clpars.h command line parsing macro, created by genclp.c
|
||||||
|
clpars.tec command line parsing macro squished
|
||||||
|
clpars.tes command line parsing macro source
|
||||||
|
cmatch.c match character with match construct
|
||||||
|
date.tec date macro squished
|
||||||
|
date.tes date macro source. this macro displays the
|
||||||
|
date and time.
|
||||||
|
dchars.h define identifiers for control characters
|
||||||
|
deferr.h define identifiers for error messages
|
||||||
|
defext.h EXTERN decarations for global variables
|
||||||
|
detab.tec de-tabify macro squished
|
||||||
|
detab.tes de-tabify macro source. this macro converts
|
||||||
|
tabs to spaces
|
||||||
|
dir.tec "display directory" macro, in squished form
|
||||||
|
dir.tes "display directory" macro source. This macro simply
|
||||||
|
displays the directory. a wildcarded filename
|
||||||
|
in the edit buffer can control what is displayed.
|
||||||
|
docjr.c code common to ExeC, ExeJ, and ExeR
|
||||||
|
doeves.c work code for EV and ES
|
||||||
|
doflag.c changes a mode control flag (ED,EH,ES,ET,EU,EV,^X)
|
||||||
|
dscren.h terminal types for 0:W command
|
||||||
|
echoit.c display character in its printable form
|
||||||
|
err.c display teco-c's error messages
|
||||||
|
exea.c execute A
|
||||||
|
exeats.c execute at-sign @
|
||||||
|
exeb.c execute B
|
||||||
|
exebar.c execute |
|
||||||
|
exebsl.c execute backslash \
|
||||||
|
exec.c execute C
|
||||||
|
execcc.c execute control-caret ^^
|
||||||
|
execln.c execute colon modifiers : and ::
|
||||||
|
execom.c execute comma ,
|
||||||
|
execrt.c execute caret ^
|
||||||
|
execst.c execute a TECO command string
|
||||||
|
execta.c execute ^A
|
||||||
|
exectc.c execute ^C
|
||||||
|
exectd.c execute ^D
|
||||||
|
execte.c execute ^E
|
||||||
|
execti.c execute ^I
|
||||||
|
exectl.c execute ^L
|
||||||
|
exectn.c execute ^N
|
||||||
|
execto.c execute ^O
|
||||||
|
exectp.c execute ^P
|
||||||
|
exectq.c execute ^Q
|
||||||
|
exectr.c execute ^R
|
||||||
|
exects.c execute ^S
|
||||||
|
exectt.c execute ^T
|
||||||
|
exectu.c execute ^U
|
||||||
|
exectv.c execute ^V
|
||||||
|
exectw.c execute ^W
|
||||||
|
exectx.c execute ^X
|
||||||
|
execty.c execute ^Y
|
||||||
|
exectz.c execute ^Z
|
||||||
|
exed.c execute D
|
||||||
|
exedgt.c execute digit (0-9)
|
||||||
|
exedot.c execute dot .
|
||||||
|
exedqu.c execute double quote "
|
||||||
|
exee.c execute E
|
||||||
|
exeequ.c execute equals =, ==, and ===
|
||||||
|
exeesc.c execute escape
|
||||||
|
exeexc.c execute exclamation point !
|
||||||
|
exeey.c execute EY
|
||||||
|
exef.c execute F
|
||||||
|
exefb.c execute FB
|
||||||
|
exeg.c execute G
|
||||||
|
exegtr.c execute greater than sign >
|
||||||
|
exeh.c execute H
|
||||||
|
exei.c execute I
|
||||||
|
exeill.c "execute" illegal command
|
||||||
|
exej.c execute J
|
||||||
|
exek.c execute K
|
||||||
|
exel.c execute L
|
||||||
|
exelbr.c execute left-bracket [
|
||||||
|
exelst.c execute less than sign <
|
||||||
|
exem.c execute M
|
||||||
|
exen.c execute N
|
||||||
|
exenul.c execute null ^@
|
||||||
|
exenyi.c "execute" not-yet-implemented command
|
||||||
|
exeo.c execute O
|
||||||
|
exeopr.c execute operator (+,-,(,#,/,&,^_,*)
|
||||||
|
exep.c execute P (see singlp.c)
|
||||||
|
exeprc.c execute percent sign %
|
||||||
|
exepw.c execute PW
|
||||||
|
exeq.c execute Q
|
||||||
|
exeqes.c execute question mark ?
|
||||||
|
exer.c execute R
|
||||||
|
exerbr.c execute right bracket ]
|
||||||
|
exertp.c execute right paren )
|
||||||
|
exes.c execute S
|
||||||
|
exescl.c execute semicolon ;
|
||||||
|
exet.c execute T
|
||||||
|
exeu.c execute U
|
||||||
|
exeund.c execute underscore _
|
||||||
|
exeusc.c execute unit separator character ^_
|
||||||
|
exev.c execute V
|
||||||
|
exew.c execute W
|
||||||
|
exex.c execute X
|
||||||
|
exey.c execute Y
|
||||||
|
exez.c execute Z
|
||||||
|
findes.c find end of string
|
||||||
|
findqr.c find q-register name
|
||||||
|
flowec.c flow to end of conditional
|
||||||
|
flowee.c flow to else part of conditional
|
||||||
|
flowel.c flow to end of loop
|
||||||
|
fmtmac.tec PDP-11 .MAC formatter squished
|
||||||
|
fmtmac.tes PDP-11 .MAC formatter source. this macro does
|
||||||
|
case formatting for PDP-11 macro (.MAC) source files
|
||||||
|
format.tec FORTRAN formatter squished
|
||||||
|
format.tes FORTRAN formatter source. formats the first part of
|
||||||
|
a FORTRAN source line.
|
||||||
|
genclp.c generates the command line parsing macro in clpars.h
|
||||||
|
getara.c get area in edit buffer an "m,n" argument defines
|
||||||
|
getnma.c get numeric argument off expression stack
|
||||||
|
inccbp.c increments command buffer pointer
|
||||||
|
init.c teco-c initializatin routines
|
||||||
|
insstr.c insert string into edit buffer
|
||||||
|
isradx.c is digit within current radix?
|
||||||
|
ln2chr.c convert line-number to character-number (^Q)
|
||||||
|
lowcase.tec convert edit buffer to lowercase macro, see upcase.tec
|
||||||
|
makdbf.c make digit buffer, binary to ascii in current radix
|
||||||
|
makefile.ami AmigaDOS make file
|
||||||
|
makefile.cct CodeCenter under SunOS
|
||||||
|
makefile.dg System V Unix make file (works on Data General Aviion)
|
||||||
|
makefile.sun SunOS make file
|
||||||
|
makefile.tc Turbo C make file (MS-DOS)
|
||||||
|
makefile.ulx Ultrix make file
|
||||||
|
maketeco.bat MS-DOS batch file to make teco. this is probably how
|
||||||
|
the temdos.exe executable file was made.
|
||||||
|
makprnt.tec make printable macro squished
|
||||||
|
makprnt.tes make printable macro squished. this macro makes a
|
||||||
|
string with embedded control characters printable
|
||||||
|
makrom.c make room in Q-register for new text
|
||||||
|
mung.bat MS-DOS batch to execute a teco macro from command line
|
||||||
|
pg.mem a programmer's guide. it may be useful to anyone
|
||||||
|
fixing bugs, adding features, or porting teco-c to
|
||||||
|
a new environment.
|
||||||
|
pkzip.rsp a PKZIP response file used to build TECOC.ZIP archive
|
||||||
|
popmac.c pop macro environment off macro stack
|
||||||
|
problems.txt contains notes about bugs and ideas
|
||||||
|
pshmac.c push current macro environment on macro stack
|
||||||
|
pushex.c push expression onto stack, try to reduce it
|
||||||
|
rdline.c read a line
|
||||||
|
rdpage.c read a page
|
||||||
|
readcs.c read command string
|
||||||
|
replac.c code for search and replace commands
|
||||||
|
search.c code for most of the search comamnds
|
||||||
|
search.tec search macro squished
|
||||||
|
search.tes search macro source. this macro finds a string in
|
||||||
|
a group of files using teco match constructs
|
||||||
|
singlp.c does a single P command
|
||||||
|
skpcmd.c skip over current command in command bufer
|
||||||
|
squ.bat MS-DOS batch file to run squ.tec w/standard options
|
||||||
|
squ.tec squish macro squished
|
||||||
|
squ.tes squish macro source. this macro takes a teco macro
|
||||||
|
source file and makes it as small and as fast (and
|
||||||
|
as unreadable) as possible
|
||||||
|
srclop.c search loop, handles loop arguments for search
|
||||||
|
sserch.c do a simple search
|
||||||
|
sub.tec ?
|
||||||
|
tabort.c terminate teco-c
|
||||||
|
tctlib.rsp a Turbo C TLIB response file used by makefile.tc
|
||||||
|
teco.bat MS-DOS batch file to run teco-c
|
||||||
|
teco.doc Standard TECO documentation from DECUS
|
||||||
|
teco.tes teco initialization file
|
||||||
|
tecoc.c the main source module, contains all the definitions
|
||||||
|
of system-independent global variables, as well as
|
||||||
|
comments explaining what they are.
|
||||||
|
tecoc.exe the teco-c executable for VMS
|
||||||
|
tecoc.h defines structures, general identifiers, and
|
||||||
|
the in-line debugging scheme.
|
||||||
|
tecoc.lnk link file needed under AmigaDOS (see makefile.ami)
|
||||||
|
tecoin.tes teco initialization file
|
||||||
|
temsdos.exe the teco-c executable for MS-DOS
|
||||||
|
tst.bat MS-DOS batch file to run the test macros
|
||||||
|
tst.com VMS command procedure to run the test macros
|
||||||
|
tstbsl.tec --
|
||||||
|
tstcss.tec |
|
||||||
|
tstequ.tec | these macros contain code which tests some
|
||||||
|
tsto.tec | aspects of teco-c
|
||||||
|
tstpw.tec |
|
||||||
|
tstqr.tec |
|
||||||
|
tstsrc.tec --
|
||||||
|
typbuf.c types a buffer on the screen, converting unprintable
|
||||||
|
characters to printable as nescessary.
|
||||||
|
type.tec type a file macro squished
|
||||||
|
type.tes type a file macro source. this macro apparently
|
||||||
|
types a file on the console with all kinds of
|
||||||
|
wonderful options.
|
||||||
|
typest.c types the erroneous command string for errors
|
||||||
|
uminus.c unary minus (converts -C to -1C)
|
||||||
|
unsqu.tec unsquish macro squished
|
||||||
|
unsqu.tes unsquish macro source. this macro does some simple
|
||||||
|
formatting of a squished teco macro to make it more
|
||||||
|
readable (like indenting)
|
||||||
|
upcase.tec convert edit buffer to uppercase macro, see lowcase.tec
|
||||||
|
vrbmsg.h verbose forms of teco error messages
|
||||||
|
vtedit.tec vtedit macro squished
|
||||||
|
vtedit.tes vtedit macro source. humongous screen editor macro.
|
||||||
|
note: this macro does NOT run under teco-c.
|
||||||
|
wchart.txt contains a wall chart of TECO commands
|
||||||
|
wrpage.c write a page
|
||||||
|
zamiga.c AmigaDOS system dependent code.
|
||||||
|
zfirst.c dummy module used if CHECKSUM_CODE is TRUE in zport.h
|
||||||
|
zfrsrc.c do a forward search using VAX SCANC instruction
|
||||||
|
zmsdos.c MS-DOS system dependant code
|
||||||
|
zport.h portability header file.
|
||||||
|
zunix.c SunOS (Unix) system dependant code
|
||||||
|
zunkn.c UNKNOWN system dependant code (function stubs)
|
||||||
|
zvms.c VAX/VMS system dependant code
|
||||||
|
|
||||||
|
|
||||||
|
The W command does not work, but the EXEW.C file contains code
|
||||||
|
to tell you what the command would have done if it had been executed. I used
|
||||||
|
this to play with executing VTEDIT.TEC under TECOC in order to find bugs.
|
||||||
|
|
||||||
|
I maintain the DECUS TECO Collection, a bunch of stuff relating to
|
||||||
|
TECO. It includes sources for DEC's TECO-11 v39, three TECOs written in C,
|
||||||
|
including ones for VAX/VMS, MS-DOS, SunOS (Unix) and Ultrix, the current
|
||||||
|
Standard TECO manual, two EMACs-like macro packages and LOTS of macros.
|
||||||
|
|
||||||
|
I you have something that you feel should be included in this
|
||||||
|
collection, or if you would like to improve the software, please contact
|
||||||
|
me at the above address.
|
||||||
|
|
||||||
|
|
||||||
|
Pete Siemsen
|
||||||
|
|
@ -0,0 +1,118 @@
|
||||||
|
FINDQR.C:
|
||||||
|
|
||||||
|
Cast is needed to get it to compile under Borland C.
|
||||||
|
|
||||||
|
CLPARS.TES:
|
||||||
|
|
||||||
|
If no EGMEM or if EGMEM and filename starts with a $, then CLPARS
|
||||||
|
gets totally hosed. Major hacking was needed to fix.
|
||||||
|
|
||||||
|
ZMSDOS.C, EXEE.C TECOC.H:
|
||||||
|
|
||||||
|
Backup file is created for EW and other occasions. It should only be
|
||||||
|
created with the EB command (or TECOC TECO on the command line).
|
||||||
|
|
||||||
|
Added BOOLEAN Backup argument to ZMSDOS:ZOpOut. Only make backup if
|
||||||
|
Backup==TRUE. Argument is passed through in EXEE:OpnOut. In
|
||||||
|
EXEE:ExeEB, value passed is TRUE. In EXEE:ExeEW and EXEE:ExeEPr the
|
||||||
|
value passed is False. When file is closed in ZMSDOS:ZOClos then if
|
||||||
|
no backup was wanted we won't create one.
|
||||||
|
|
||||||
|
EXEM.C:
|
||||||
|
|
||||||
|
Colon modified macros pass the colon into the internal command. This
|
||||||
|
prevented the tstqr.tec test file from working.
|
||||||
|
|
||||||
|
The fix is to clear the colon flag if it is set within ExeM().
|
||||||
|
|
||||||
|
EXEM.C:
|
||||||
|
|
||||||
|
Execution of local macros caused new set of local q registers to be
|
||||||
|
generated.
|
||||||
|
|
||||||
|
The fix is to not generate new macro set if macro is local.
|
||||||
|
|
||||||
|
SRCLOP.C:
|
||||||
|
|
||||||
|
n,mFB command did not work unless at gap. Fixed.
|
||||||
|
|
||||||
|
SEARCH.C:
|
||||||
|
|
||||||
|
ES now ignored if in macro or loop
|
||||||
|
|
||||||
|
WCHART.TXT:
|
||||||
|
|
||||||
|
Changed FB and FC as "implemented" Also G* and G_ as implemented.
|
||||||
|
|
||||||
|
ZMSDOS.C: CLPARS.TES:
|
||||||
|
|
||||||
|
Added test for ED_FF flag (in EZ??) to ignore form feeds. Then change
|
||||||
|
clpars.tes so /NOPAGE will set it *before* yanking.
|
||||||
|
|
||||||
|
ZMSDOS.C TECOC.H EXEE.C:
|
||||||
|
|
||||||
|
ZDoCmd used the file name buffer for the command, while ExeEG keeps the
|
||||||
|
command in a local buffer. This prevents EG from working in any version!
|
||||||
|
|
||||||
|
I added arguments to ZDoCmd to pass the command string.
|
||||||
|
|
||||||
|
ZMSDOS.C
|
||||||
|
|
||||||
|
The TEC$LIBRARY environment variable was not being examined for the EI
|
||||||
|
command, unlike at least the UNIX version. This basically made TEC$LIBARY
|
||||||
|
worthless since its only other use was during initializaton for video
|
||||||
|
support, which doesn't exist in MSDOS. So I fixed it.
|
||||||
|
|
||||||
|
|
||||||
|
ZMSDOS.C
|
||||||
|
|
||||||
|
Tecoc has the ugly habit of allowing you to edit a readonly file,
|
||||||
|
only to die on you when you finish. It's easy enough to check that
|
||||||
|
the output file is writable first. The problem is in ZOpOut().
|
||||||
|
|
||||||
|
Because MSDOS TECOC creates the temp file in the current directory,
|
||||||
|
any attempt to EW or EB a file in another drive will cause failure
|
||||||
|
when the rename is attempted. In these cases the file must be copied.
|
||||||
|
ZOClos() is the culprit.
|
||||||
|
|
||||||
|
I added a "fastcopy" function, much like what was done in zunix.c,
|
||||||
|
but quite a bit simpler. The OS/2 version will need this since OS/2
|
||||||
|
prefers copying over renaming to preserve file extended attributes
|
||||||
|
and PM references. The handling in the OS/2 code is slightly
|
||||||
|
different in that the only file that ever gets deleted is the
|
||||||
|
temporary file. When this code is included in the MSDOS version, it
|
||||||
|
takes too much space for compact model, so I don't update the time stamp
|
||||||
|
(that allows it to squeek by).
|
||||||
|
|
||||||
|
Along the same lines, Tecoc will create a backup file in the wrong
|
||||||
|
directory if the file name has an explicit path and has a "." in one
|
||||||
|
of the directory names. ZOClos() is the culprit, again.
|
||||||
|
|
||||||
|
I added the "% Superseding existing file" warning message. Why wasn't
|
||||||
|
it there??
|
||||||
|
|
||||||
|
CLPARS.TES
|
||||||
|
|
||||||
|
After the attempt to do an EB fails, clpars assumed the failure was
|
||||||
|
caused by the input file not being found. Added new code to attempt
|
||||||
|
to open the file via ER - if that succeeds, prints message that file
|
||||||
|
is being opened read-only.
|
||||||
|
|
||||||
|
Added handling for a /NORENAME switch, needed by OS/2. I also added
|
||||||
|
code to remove quotes in a quoted file name string if OS/2. Reason:
|
||||||
|
file names can have embedded spaces, yet quotes are not allowed.
|
||||||
|
|
||||||
|
I couldn't see any reason to strip spaces from the filename saved
|
||||||
|
in "memory" since the name had already been processed. This was causing
|
||||||
|
a problem with the OS/2 version since I stripped the quotes.
|
||||||
|
|
||||||
|
I removed the restriction of the +nnn commandline argument so it
|
||||||
|
would work with MS/DOS and OS/2. Why limit it to UNIX?
|
||||||
|
|
||||||
|
Clpars leaves the macro .T around after completion (remember -- it's
|
||||||
|
not called as a macro if USE_ANSI_CLPARS, which makes it a top level
|
||||||
|
local macro), and also leaves non-zero values in qy, q8, q.l, q4, and
|
||||||
|
possibly q.1. Fixed. However I don't understand the reasoning for
|
||||||
|
*saving* q registers during execution of clpars since there is
|
||||||
|
nothing in them at the start of the macro execution.
|
||||||
|
|
||||||
|
|
@ -0,0 +1,856 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
TECO-C
|
||||||
|
|
||||||
|
Programmer's Guide
|
||||||
|
(last updated February 18, 1991 to reflect TECO-C version 140)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1 INTRODUCTION
|
||||||
|
|
||||||
|
These notes apply to TECOC version 135, which runs under VAX/VMS,
|
||||||
|
MS-DOS, and Unix (SunOS, which is BSD). See file AAREADME.TXT for the
|
||||||
|
specifics of operating system and compilers which have been used.
|
||||||
|
|
||||||
|
TECO-C is meant to be a complete implementation of TECO as defined by
|
||||||
|
the Standard TECO User's Guide and Language Reference Manual, (in file
|
||||||
|
TECO.DOC). It was written so that the author could move to many machines
|
||||||
|
without knowing many editors.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2 COMPILING AND LINKING
|
||||||
|
|
||||||
|
Conditional compilation directives are used to build TECO-C correctly
|
||||||
|
for different environments. Identifiers automatically defined by
|
||||||
|
the different compilers are used. Some identifiers defined in file ZPORT.H
|
||||||
|
control whether video support or extra debugging code is included. See
|
||||||
|
"VIDEO" and "DEBUGGING". Files are provided which "build" TECO-C in various
|
||||||
|
environments. See file AAREADME.TXT for details.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
3 RUNNING TECO-C
|
||||||
|
|
||||||
|
When you run TECO, the command line used to invoke TECO is parsed for
|
||||||
|
an input/output file name and several optional switches. TECO-11 parses the
|
||||||
|
command line using a TECO macro imbedded in the program. TECO-C does the
|
||||||
|
same thing. Actually, the imbedded macro used to parse the command line
|
||||||
|
was stolen from TECO-11. I commented it and then modified it to repair
|
||||||
|
minor inconsistencies. Use of TECO-11's macro makes TECO-C invocation
|
||||||
|
identical to TECO-11's, even responding to "make love" with "Not war?".
|
||||||
|
|
||||||
|
The macro is in file CLPARS.TES. The compressed version (no comments
|
||||||
|
or whitespace) is in file CLPARS.TEC. The GENCLP program converts
|
||||||
|
CLPARS.TEC into CLPARS.H, an include file suitable for compiling into
|
||||||
|
TECO-C.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
4 CODE CONVENTIONS
|
||||||
|
|
||||||
|
The code is not modular. Communication between almost all functions
|
||||||
|
is through global variables, not argument lists. There is a reason: the
|
||||||
|
nature of the basic parsing algorithm is to use the characters in the
|
||||||
|
command string as indices into a table of functions. This makes for very
|
||||||
|
fast command parsing, but it means that all the functions have to modify
|
||||||
|
|
||||||
|
Page 2
|
||||||
|
|
||||||
|
|
||||||
|
global values, because no arguments are passed in. In other words, there
|
||||||
|
were going to be 130 or so un-modular functions anyway, so I gave up on
|
||||||
|
modularity. This explanation does not explain some of the complications in
|
||||||
|
the search code, like the global variable SrcTyp. Oh, well.
|
||||||
|
|
||||||
|
Here's a brief list of some of the conventions followed by the code:
|
||||||
|
|
||||||
|
1. TECO-C is portable, so some convention was needed to separate
|
||||||
|
portable code from system-dependent code. There is one file
|
||||||
|
containing the system-dependent code for each platform TECO-C
|
||||||
|
supports. These files have names that start with a "Z": ZVMS.C,
|
||||||
|
ZMSDOS.C and ZUNIX.C.
|
||||||
|
|
||||||
|
All the system-dependent functions in those files start with a
|
||||||
|
"Z". For example, the function that allocates memory is called
|
||||||
|
ZAlloc. A VMS version of ZAlloc can be found in ZVMS.C, and an
|
||||||
|
MS-DOS version can be found in ZMSDOS.C.
|
||||||
|
|
||||||
|
An extra file called ZUNKN.C exists to help efforts to port TECO-C
|
||||||
|
to a new environment. This file contains stubs for all the
|
||||||
|
system-dependent functions.
|
||||||
|
|
||||||
|
2. All system-independent global variables are declared
|
||||||
|
alphabetically in file TECOC.C. They are defined in DEFEXT.H,
|
||||||
|
which is included by all modules.
|
||||||
|
|
||||||
|
3. File TECOC.H contains the "global" definitions, including those
|
||||||
|
for most structures.
|
||||||
|
|
||||||
|
4. Variables and functions are defined using the portability
|
||||||
|
identifiers defined in the ZPORT.H file. Functions which do not
|
||||||
|
return a value are defined as VOID. TECO-C should compile and
|
||||||
|
link on different machines by changing only the environment
|
||||||
|
definitions in the ZPORT.H file.
|
||||||
|
|
||||||
|
5. At one time, every function was in a file with the same name
|
||||||
|
as the function. This made it easy to find the code for a
|
||||||
|
function. The problem was that some groups of functions use data
|
||||||
|
not needed by the other functions. This was especially true of
|
||||||
|
the system-dependent functions. Also, some functions were called
|
||||||
|
only by one other function, so it made sense for them to be in the
|
||||||
|
same module as the caller and be made "static". So now, most
|
||||||
|
functions are in a file named the same as the function, with the
|
||||||
|
following exceptions:
|
||||||
|
|
||||||
|
1. All the "Z" functions are in are in the "Z" file for the given
|
||||||
|
system.
|
||||||
|
|
||||||
|
2. The conditionally-compiled functions (ZCpyBl in ZINIT.C, the
|
||||||
|
"Dbg" functions at the bottom of TECOC.C, the "v" functions in
|
||||||
|
EXEW.C) aren't in their own files. If they were, then the
|
||||||
|
command procedures/makefiles that compile the files would need
|
||||||
|
to contain logic to conditionally compile the files.
|
||||||
|
|
||||||
|
Page 3
|
||||||
|
|
||||||
|
|
||||||
|
3. The functions for the "E" and "F" commands are in EXEE.C and
|
||||||
|
EXEF.C, respectively. So if you want to find function ExeEX,
|
||||||
|
don't look for a file named EXEEX.C.
|
||||||
|
|
||||||
|
|
||||||
|
6. Symbols are 6 characters long or less. The way I remember it,
|
||||||
|
this was caused by the first system I wrote TECOC for: CP/M-68k,
|
||||||
|
which had a limit of 8 characters for file names. The last two
|
||||||
|
characters had to be ".C", so 6 characters were left for the file
|
||||||
|
name. Since the file name was the same as the function it
|
||||||
|
contained, functions were limited to 6 characters in length. When
|
||||||
|
I saw how nicely the function declarations looked (they fit in one
|
||||||
|
tab slot), I used 6 characters for other symbols too.
|
||||||
|
|
||||||
|
I've since been told that CP/M-68k has 8-character file names
|
||||||
|
followed by 3-character file types, so CP/M-68k can't be blamed.
|
||||||
|
So shoot me.
|
||||||
|
|
||||||
|
This standard has prevented problems from occurring with compilers
|
||||||
|
that don't support very many characters of uniqueness.
|
||||||
|
|
||||||
|
In order to make up for the resultant cryptic names, upper and
|
||||||
|
lower case are mixed. An uppercase letter indicates a new word.
|
||||||
|
For example, "EBfEnd" stands for "Edit Buffer End". If you need
|
||||||
|
to know what a variable name means, look at the definition of the
|
||||||
|
variable in DEFEXT.H. The expanded version of the abbreviated
|
||||||
|
name appears in the comment on the same line as the variable
|
||||||
|
definition. A detailed description can be found with the
|
||||||
|
declaration of the variable in TECOC.C.
|
||||||
|
|
||||||
|
The limit of 6 letters in variable names is relaxed in
|
||||||
|
system-dependent code.
|
||||||
|
|
||||||
|
7. Variable and function names follow patterns where possible. For
|
||||||
|
instance, "EBfBeg" and "EBfEnd" are the beginning and end of the
|
||||||
|
edit buffer. If you see a variable named "BBfBeg", you can assume
|
||||||
|
that it is the beginning of some other buffer, and that a "BBfEnd"
|
||||||
|
exists which is the end of that buffer.
|
||||||
|
|
||||||
|
8. Character strings are usually represented in C by a pointer to a
|
||||||
|
sequences of bytes terminated with a null character. I didn't do
|
||||||
|
that in TECO-C because I thought it was too inefficient. To get
|
||||||
|
the length of a string, you have to count characters. Most
|
||||||
|
strings in TECO-C are therefore represented by two pointers, on to
|
||||||
|
the first character and one to the character following the last
|
||||||
|
character. With this representation, it's easy to add characters
|
||||||
|
to a string and trivial to get the length.
|
||||||
|
|
||||||
|
9. Each file has a consistent format, which is:
|
||||||
|
|
||||||
|
1. a comment describing the function
|
||||||
|
2. include directives
|
||||||
|
3. the function declaration
|
||||||
|
|
||||||
|
Page 4
|
||||||
|
|
||||||
|
|
||||||
|
4. local variable definitions, in alphabetical order
|
||||||
|
5. code
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
5 TOP LEVEL EXECUTION AND COMMAND PARSING
|
||||||
|
|
||||||
|
The top level code for TECO-C is contained in file TECOC.C. It is
|
||||||
|
very simple: after initializing, a loop is entered which reads a command
|
||||||
|
string from the user, executes it, and loops back to read another command
|
||||||
|
string. If the user executes a command which causes TECO-C to exit, the
|
||||||
|
program is exited directly via a call to the TAbort function. TECO-C never
|
||||||
|
exits by "falling out the bottom" of the main function.
|
||||||
|
|
||||||
|
After a command string is read, the ExeCSt function is called to
|
||||||
|
execute the command string. ExeCSt contains the top-level parsing code.
|
||||||
|
The parse is trivial: each command character is used as an index into a
|
||||||
|
table of functions. The table contains one entry for each of the 128
|
||||||
|
possible characters. Each function is responsible for "consuming" its
|
||||||
|
command so that when it returns, the command string pointer points to the
|
||||||
|
next command.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
5.1 Error Handling
|
||||||
|
|
||||||
|
When an error is detected, an error message is displayed at the point
|
||||||
|
that the error is detected, and the function in which the error was
|
||||||
|
detected returns a FAILURE status to its caller. Almost always, the caller
|
||||||
|
returns a FAILURE status to it's caller, which returns a FAILURE status to
|
||||||
|
it's caller, etc. When a FAILURE status is returned to the main command
|
||||||
|
string parser, parsing of the command string stops and the user is prompted
|
||||||
|
for a new command string.
|
||||||
|
|
||||||
|
This style tends to cause all function calls to follow the same form,
|
||||||
|
which is
|
||||||
|
|
||||||
|
if (function() == FAILURE)
|
||||||
|
return(FAILURE);
|
||||||
|
|
||||||
|
Things get more complicated in the system-dependent code (in the files
|
||||||
|
with names that start with a "Z"). I extended TECO's error reporting
|
||||||
|
slightly to allow the user to see the operating system's reason for an
|
||||||
|
error, as this is often useful. For example, under VAX/VMS there are many
|
||||||
|
reasons why an attempt to create an output file might fail. They include:
|
||||||
|
errors in file name syntax, destination directory non-existence, file
|
||||||
|
protection violations or disk quota violation. In order to supply enough
|
||||||
|
information to the user, TECO-C outputs multiple-line error messages when a
|
||||||
|
system error occurs.
|
||||||
|
|
||||||
|
Multiple-line error messages contain one line that describes the
|
||||||
|
operating system's perception of the error and one line that describe's
|
||||||
|
TECO's perception of the error. For instance, if a user of VAX/VMS does a
|
||||||
|
"EW[abc]test.txt$$" command when the directory [abc] does not exist, the
|
||||||
|
|
||||||
|
Page 5
|
||||||
|
|
||||||
|
|
||||||
|
error message generated by TECO-C is:
|
||||||
|
|
||||||
|
?SYS %RMS-F-DNF, directory not found
|
||||||
|
?UFO unable to open file "[abc]test.txt" for output
|
||||||
|
|
||||||
|
System errors are therefore reported in a system-dependent fashion,
|
||||||
|
using whatever messages the operating system can supply. Under VAX/VMS,
|
||||||
|
the system service $GETMSG provides human-readable messages that TECO-C can
|
||||||
|
use in the "SYS" part of the error message. Under UNIX, syserrlist[error]
|
||||||
|
is a pointer to these messages.
|
||||||
|
|
||||||
|
There is another way in which error reporting in the system-dependent
|
||||||
|
code is tricky. Under VAX/VMS, some system calls may return a code that is
|
||||||
|
"successful" but contains extra information. For instance, when a user has
|
||||||
|
set his directories so that only a limited number of versions of a file can
|
||||||
|
exist, RMS will automatically purge the oldest version of the file when the
|
||||||
|
user creates a file. This only happens if the newly created file would
|
||||||
|
cause too many versions of the file to exist. When this happens, the VMS
|
||||||
|
service returns a FILEPURGED status, which is successful. TECO-C informs
|
||||||
|
the user about these things by displaying the message in brackets.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
5.2 Command Modifiers (CmdMod)
|
||||||
|
|
||||||
|
Command parsing is complicated by command modifiers and numeric
|
||||||
|
arguments, which may precede some commands. These are implemented in a way
|
||||||
|
that maintains the basic "jump table" idea. For instance, when an at-sign
|
||||||
|
(@) modifier is encountered in a command string, the at-sign command
|
||||||
|
function (ExeAtS) is called. The only thing ExeAtS does is set a flag
|
||||||
|
indicating that an at-sign has been encountered. Commands which are
|
||||||
|
affected by an at-sign modifier check this flag and behave accordingly.
|
||||||
|
|
||||||
|
The flags which indicate command modifiers are contained in global
|
||||||
|
variable CmdMod. A bit in CmdMod is reserved for each command modifier.
|
||||||
|
The modifiers are "@", ":" and "::". Of course, once the flag has been
|
||||||
|
set, it must be cleared. With this parsing algorithm, the only way to do
|
||||||
|
that is to make every command function explicitly reset CmdMod before a
|
||||||
|
successful return. This is not too bad: clearing all the flags in CmdMod
|
||||||
|
is done with one statement: "CmdMod = '\0';".
|
||||||
|
|
||||||
|
For numeric arguments to commands, an expression stack is used (see
|
||||||
|
Stacks). The EstTop variable is the pointer to the top of the expression
|
||||||
|
stack. Commands which handle numeric arguments check EStTop to see if the
|
||||||
|
expression stack contains a value.
|
||||||
|
|
||||||
|
A special case of numeric arguments is "m,n". The "m" part is
|
||||||
|
encountered and causes the value to be pushed onto the expression stack.
|
||||||
|
The comma causes the ExeCom function to move the value into a special
|
||||||
|
"m-argument" global variable (MArgmt), clear the expression stack and set
|
||||||
|
another flag in CmdMod indicating that the "m" part of an "m,n" pair is
|
||||||
|
defined. Then the "n" is encountered and pushed onto the stack. Commands
|
||||||
|
which can take "m,n" pairs check the flag in CmdMod.
|
||||||
|
|
||||||
|
Page 6
|
||||||
|
|
||||||
|
|
||||||
|
To summarize, CmdMod and EStTop are variables which describe the
|
||||||
|
context of a command. Each command function tests these variables to see
|
||||||
|
if it was preceded by modifiers or numbers. For this to work, it is
|
||||||
|
important that the expression stack and the flags in CmdMod are cleared at
|
||||||
|
the right times. It is the responsibility of each command function to
|
||||||
|
leave CmdMod and EStTop with the proper values before successfully
|
||||||
|
returning. The rules are:
|
||||||
|
|
||||||
|
1. If the command function is returning FAILURE, don't worry about
|
||||||
|
clearing CmdMod or EStTop. They will be cleared before the next
|
||||||
|
command string is executed.
|
||||||
|
|
||||||
|
2. If the command function leaves a value on the expression stack, do
|
||||||
|
not clear EStTop before returning SUCCESS. If the command calls
|
||||||
|
GetNmA, do not clear EStTop, as GetNmA does it for you.
|
||||||
|
Otherwise, clear EStTop before returning SUCCESS.
|
||||||
|
|
||||||
|
3. Clear CmdMod unless the command function sets flags or needs to
|
||||||
|
leave them alone. ExeDgt, for example, handles digit strings and
|
||||||
|
doesn't clear CmdMod because the MARGIS bit may be set.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
6 SEARCHING
|
||||||
|
|
||||||
|
The search algorithm in TECO-C is complex. The war between the desire
|
||||||
|
for a fast search and the need to handle all the features of TECO'ssearch
|
||||||
|
commands has produced code which can be a real pain to follow. This
|
||||||
|
section attempts to explain how things got the way they are. The code is
|
||||||
|
explained in a bottom-up fashion, to follow the way it evolved in the
|
||||||
|
author's twisted mind.
|
||||||
|
|
||||||
|
The basic search idea is to scan a contiguous edit buffer for a search
|
||||||
|
string. The steps are:
|
||||||
|
|
||||||
|
1. Search the edit buffer for the first character in the search
|
||||||
|
string. If you reach the end of the edit buffer without matching,
|
||||||
|
the search fails.
|
||||||
|
|
||||||
|
2. When the first character of the search string matches a character
|
||||||
|
in the edit buffer, try to match successive characters in the
|
||||||
|
search string with the characters which follow the found character
|
||||||
|
in the edit buffer. If they all match, the search succeeds. If
|
||||||
|
one doesn't, go back to step 1.
|
||||||
|
|
||||||
|
|
||||||
|
This is basically what TECO-C does. The features of TECO's search
|
||||||
|
commands has buried these steps deep within some confusing code.
|
||||||
|
|
||||||
|
The first complication is introduced by pattern matching characters.
|
||||||
|
TECO has 17 "match constructs", whiceh are indicated in the search string
|
||||||
|
by the special characters ^X, ^S, ^N and ^Ex where "x" can be several other
|
||||||
|
characters. For instance, a ^X in the search string means that any
|
||||||
|
character is to be accepted as a match in place of the ^X. Characters
|
||||||
|
|
||||||
|
Page 7
|
||||||
|
|
||||||
|
|
||||||
|
other than the match constructs represent themselves. An example: the
|
||||||
|
search string "a^Xb" contains 3 match constructs: a, ^X and b.
|
||||||
|
|
||||||
|
TECO also supports forward or backward searching. When searching
|
||||||
|
backwards, only the search for the first match construct in the search
|
||||||
|
string is done in a backwards direction. When the character is found, the
|
||||||
|
characters following it are compared in a forward direction to the edit
|
||||||
|
buffer characters. This means that once the first match construct has been
|
||||||
|
found, a single piece of code can be used to compare successive characters
|
||||||
|
in the search string with successive characters in the edit buffer,
|
||||||
|
regardless of whether the search is forwards or backwards.
|
||||||
|
|
||||||
|
Adding these new features, the new description of searching is:
|
||||||
|
|
||||||
|
1. Search the edit buffer forwards or backwards for a character which
|
||||||
|
matches the first match construct in the search string. If you
|
||||||
|
reach the end of the edit buffer without matching, the search
|
||||||
|
fails.
|
||||||
|
|
||||||
|
2. When the first match construct of the search string matches a
|
||||||
|
character in the edit buffer, try to match successive match
|
||||||
|
constructs in the search string with the characters which follow
|
||||||
|
the found character in the edit buffer. If they all match, the
|
||||||
|
search succeeds. If one doesn't, go back to step 1.
|
||||||
|
|
||||||
|
|
||||||
|
To begin a description of which routines implement the above steps,
|
||||||
|
and in order to have a reference for later discussion, the following
|
||||||
|
hierarchy chart of "who calls who" is presented.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Page 8
|
||||||
|
|
||||||
|
|
||||||
|
ExeEUn ExeFB ExeFC ExeFD ExeFK ExeFN ExeFS ExeFUn ExeN ExeS ExeUnd
|
||||||
|
| | | | | | | | | | |
|
||||||
|
| | | | | | | | | | |
|
||||||
|
------------------------------------------------------------
|
||||||
|
|
|
||||||
|
V
|
||||||
|
Search
|
||||||
|
|
|
||||||
|
V
|
||||||
|
SrcLop
|
||||||
|
|
|
||||||
|
V
|
||||||
|
SSerch
|
||||||
|
| | |
|
||||||
|
+------+ | +------+
|
||||||
|
+---+ | | | +---+
|
||||||
|
| V V | V V |
|
||||||
|
| ZFrSrc | BakSrc |
|
||||||
|
| | | | | | |
|
||||||
|
+---+ | | | +---+
|
||||||
|
+------+ | +------+
|
||||||
|
V V V
|
||||||
|
CMatch <--+
|
||||||
|
| |
|
||||||
|
+--------+
|
||||||
|
|
||||||
|
|
||||||
|
At the top are the functions that implement search commands (E_, FB,
|
||||||
|
FC, FD, FK, FN, FS, F_, N, S and _). All of these functions call the main
|
||||||
|
search function: Search.
|
||||||
|
|
||||||
|
At the lower level are the functions which implement steps 1 and 2
|
||||||
|
described above. ZFrSrc searches forwards in the edit buffer for
|
||||||
|
characters which match the first character in the search string. BakSrc
|
||||||
|
does the same thing, but searches backwards. SSerch calls one of these two
|
||||||
|
functions and then executes a loop which calls CMatch to compare successive
|
||||||
|
match constructs in the search string to characters following the found
|
||||||
|
character in the edit buffer. The reason that ZFrSrc, BakSrc and CMatch
|
||||||
|
call themselves is to handle some of the more esoteric match constructs.
|
||||||
|
|
||||||
|
Case dependence in TECO is controlled by the search mode flag (see the
|
||||||
|
^X command). The variable SMFlag holds the value of the search mode flag,
|
||||||
|
and is used by ZFrSrc, BakSrc and CMatch.
|
||||||
|
|
||||||
|
One final point to help confuse things: ZFrSrc is system-dependent.
|
||||||
|
It contains a VAX/VMS-specific version which uses the LIB$SCANC run-time
|
||||||
|
library routine to access the SCANC instruction. The SCANC instruction
|
||||||
|
looks like it was designed to handle TECO's match constructs. I couldn't
|
||||||
|
resist using it, but it was a mistake, as it needlessly complicates an
|
||||||
|
already messy algorithm. I have decided to remove the VMS-specific code
|
||||||
|
some time in the future.
|
||||||
|
|
||||||
|
Further complications of the search algorithm arise because of the
|
||||||
|
following capabilities of TECO searches:
|
||||||
|
|
||||||
|
Page 9
|
||||||
|
|
||||||
|
|
||||||
|
1. If there is no text argument, use the previous search argument.
|
||||||
|
|
||||||
|
2. If colon modified, return success/failure and no error message
|
||||||
|
|
||||||
|
3. If the search fails and we're in a loop and a semicolon follows
|
||||||
|
the search command, exit the loop without displaying an error
|
||||||
|
message.
|
||||||
|
|
||||||
|
4. Handle optional repeat counts
|
||||||
|
|
||||||
|
5. If the ES flag is non-zero, verify the search based on the value
|
||||||
|
of the flag.
|
||||||
|
|
||||||
|
6. If bit 64 of the ED flag is set, move dot by one on multiple
|
||||||
|
searches.
|
||||||
|
|
||||||
|
7. If bit 16 of the ED flag is set, don't move after a failing
|
||||||
|
search.
|
||||||
|
|
||||||
|
8. Be fast.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
7 MEMORY MANAGEMENT
|
||||||
|
|
||||||
|
7.1 The Edit Buffer And Input Buffer
|
||||||
|
|
||||||
|
TECO-C is based on TECO-11, but it uses a different form of edit
|
||||||
|
buffer memory management. Here's why.
|
||||||
|
|
||||||
|
The edit buffer in TECO-11 is implemented as a continuous block of
|
||||||
|
memory. This allows rapid movement through the edit buffer (by just
|
||||||
|
maintaining a pointer to the current spot) and makes searches very
|
||||||
|
straightforward. Insertion and deletion of text is expensive, because each
|
||||||
|
insertion or deletion requires moving the text following the spot where the
|
||||||
|
insertion or deletion occurs in order to maintain a continuous block of
|
||||||
|
memory. This gets to be a real pain when a video editing capability is
|
||||||
|
added to TECO, because in video mode text is added/deleted one character at
|
||||||
|
a time very rapidly.
|
||||||
|
|
||||||
|
TECO-C uses a edit buffer gap scheme. The edit buffer occupies a
|
||||||
|
continuous piece of memory, but there is a gap at the "current spot" in the
|
||||||
|
edit buffer. When the user moves around the edit buffer, the gap is moved
|
||||||
|
by shuffling text from one side of the gap to the other. This means that
|
||||||
|
moving around the text buffer is slower than for TECO-11's scheme, but text
|
||||||
|
insertion and deletion is very fast. Searches are still fast because most
|
||||||
|
searches start at the current spot and go forwards or backwards, so a
|
||||||
|
continuous piece of memory is searched. In the future, when some kind of
|
||||||
|
video mode is added, insertion and deletion one-character-at-a-time will be
|
||||||
|
fast using the gap scheme.
|
||||||
|
|
||||||
|
The variables that maintain pointers to the edit buffer and the gap
|
||||||
|
within the buffer can be confusing, so here's some examples. Suppose that
|
||||||
|
10000 bytes are allocated for the edit buffer when TECO-C is initialized.
|
||||||
|
|
||||||
|
Page 10
|
||||||
|
|
||||||
|
|
||||||
|
Suppose the allocated memory starts at address 3000.
|
||||||
|
|
||||||
|
Empty edit buffer (the gap spans the whole edit buffer):
|
||||||
|
|
||||||
|
EBfBeg = 3000 (edit buffer beginning)
|
||||||
|
GapBeg = 3000 (gap beginning)
|
||||||
|
GapEnd = 13000 (gap end)
|
||||||
|
EBfEnd = 13000 (edit buffer end)
|
||||||
|
|
||||||
|
Buffer contains "test", character pointer is before the first 't':
|
||||||
|
|
||||||
|
EBfBeg = 3000 (edit buffer beginning)
|
||||||
|
GapBeg = 3000 (gap beginning)
|
||||||
|
GapEnd = 12996 (gap end)
|
||||||
|
12997 't'
|
||||||
|
12998 'e'
|
||||||
|
12999 's'
|
||||||
|
EBfEnd = 13000 't' (edit buffer end)
|
||||||
|
|
||||||
|
|
||||||
|
Buffer contains "test", character pointer is after the last 't':
|
||||||
|
|
||||||
|
EBfBeg = 3000 't' (edit buffer beginning)
|
||||||
|
3001 'e'
|
||||||
|
3002 's'
|
||||||
|
3003 't'
|
||||||
|
GapBeg = 3004 (gap beginning)
|
||||||
|
GapEnd = 13000 (gap end)
|
||||||
|
EBfEnd = 13000 (edit buffer end)
|
||||||
|
|
||||||
|
|
||||||
|
Buffer contains "test", character pointer is after the 'e':
|
||||||
|
|
||||||
|
EBfBeg = 3000 't' (edit buffer beginning)
|
||||||
|
3001 'e'
|
||||||
|
GapBeg = 3002 (gap beginning)
|
||||||
|
GapEnd = 12998 (gap end)
|
||||||
|
12999 's'
|
||||||
|
EBfEnd = 13000 't' (edit buffer end)
|
||||||
|
|
||||||
|
When an insertion command is executed, the text is inserted starting
|
||||||
|
at GapBeg. When a deletion command is executed, GapEnd is incremented for
|
||||||
|
a forward delete or GapBeg is decremented for a backwards delete. When the
|
||||||
|
character pointer is moved forwards, the gap is moved forwards by copying
|
||||||
|
text from the end of the gap to the beginning. When the character pointer
|
||||||
|
is moved backwards, the gap is moved backwards by copying text from the the
|
||||||
|
area just before the gap to the area at the end of the gap.
|
||||||
|
|
||||||
|
There are a few messy cases, such as when a bounded search is executed
|
||||||
|
and the bounded text area includes the edit buffer gap. In this case, the
|
||||||
|
gap is temporarily moved so that the search can proceed over a continuous
|
||||||
|
memory area.
|
||||||
|
|
||||||
|
Page 11
|
||||||
|
|
||||||
|
|
||||||
|
In order to confuse things a little, TECO-C has one addition to the
|
||||||
|
basic edit buffer gap management. Following the end of the edit buffer
|
||||||
|
(EBfEnd) is the current input stream buffer. Since file input commands
|
||||||
|
always cause text to be appended to the end of the edit buffer, this is
|
||||||
|
natural. Thus, no input buffer is needed: text is input directly into the
|
||||||
|
edit buffer. This makes the code a little confusing, but it avoids the
|
||||||
|
problem of having an input buffer. When you have an input buffer, you have
|
||||||
|
to deal with the question of how large the buffer should be and what to do
|
||||||
|
with it when it's too small. this scheme is fast and and saves some
|
||||||
|
memory. (see File Input)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
7.2 Q-registers
|
||||||
|
|
||||||
|
Q-registers have two parts: a numeric part and a text part. Each
|
||||||
|
q-register is represented by a structure containing three fields: one to
|
||||||
|
hold the numeric part and two to point to the beginning and end of the
|
||||||
|
memory holding the text part. If the text part of the q-register is empty,
|
||||||
|
then the pointer to the beginning of the text is NULL.
|
||||||
|
|
||||||
|
There are 36 global q-registers, one for each letter of the alphabet
|
||||||
|
and 1 for each digit from 0 to 9. These q-registers are accessible from
|
||||||
|
any macro level. There are 36 local q-registers for each macro level. The
|
||||||
|
names for local q-registers are preceded by a period. Thus the command
|
||||||
|
"1xa" inserts a line into global q-register "a", while the command "1x.a"
|
||||||
|
inserts a line into local q-register ".a". Storage for the data structure
|
||||||
|
defining local q-registers is not allocated until a local q-register is
|
||||||
|
first used. This saves space and time, because local q-registers are
|
||||||
|
rarely used, and doing things this way avoids allocating and freeing memory
|
||||||
|
every time a macro is executed.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
8 STACKS
|
||||||
|
|
||||||
|
8.1 Expression Stack
|
||||||
|
|
||||||
|
An expression stack is used to parse TECO's expressions. Consider the
|
||||||
|
command string QA+50=$$. When the command string is executed, the value of
|
||||||
|
QA is pushed on the expression stack, then the operator "+" is pushed on
|
||||||
|
the expression stack, and then the value "50" is pushed on the expression
|
||||||
|
stack. Whenever a full expression that can be reduced is on the expression
|
||||||
|
stack, it is reduced. For the above example, the stack is reduced when the
|
||||||
|
value "50" is pushed.
|
||||||
|
|
||||||
|
The expression stack is implemented in the following variables:
|
||||||
|
|
||||||
|
EStack the stack itself, containing saved operators and operands
|
||||||
|
EStTop index of the top element in EStack
|
||||||
|
EStBot index of the current "bottom" of the stack in EStack
|
||||||
|
|
||||||
|
The "bottom" of the expression stack can change because an expression
|
||||||
|
can include a macro invocation. For example, the command QA+M3=$$ causes
|
||||||
|
the value of "QA" to be pushed on the expression stack, then the "+" is
|
||||||
|
|
||||||
|
Page 12
|
||||||
|
|
||||||
|
|
||||||
|
pushed, and then the macro contained in q-register 3 is executed. The
|
||||||
|
macro in q-register 3 returns a value to be used in the expression. When
|
||||||
|
the macro is entered, a new expression stack "bottom" is established. This
|
||||||
|
allows the macro to have a "local" expression stack bottom while
|
||||||
|
maintaining the stack outside the macro.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
8.2 Loop Stack
|
||||||
|
|
||||||
|
The loop stack contains the loop count and the address of the first
|
||||||
|
command in the loop. For example, in the command 5<FSMP$mt$>$$, the loop
|
||||||
|
stack contains the loop count (5) and the address of the first command in
|
||||||
|
the loop (F). Whenever the end-of-loop character (>) is encountered, the
|
||||||
|
loop count is decremented. If the loop count is still greater than zero
|
||||||
|
after it has been decremented, then the command string pointer is reset to
|
||||||
|
point to the first character in the loop (F).
|
||||||
|
|
||||||
|
The loop stack is implemented in the following variables:
|
||||||
|
|
||||||
|
LStack the stack itself, containing saved counts and addresses
|
||||||
|
LStTop index of the top element in LStack
|
||||||
|
LStBot index of the current "bottom" of the stack in LStack
|
||||||
|
|
||||||
|
The loop stack needs a "floating" bottom for the same reason that the
|
||||||
|
expression stack needs one: macros. Consider the command string
|
||||||
|
4<Smp$M7$>$$. When the "<" in is encountered, the loop count (4) and the
|
||||||
|
address of the first character in the loop (S) are placed on the loop
|
||||||
|
stack. Command execution continues, and the "M7" command is encountered.
|
||||||
|
Suppose that q-register 7 contains the erroneous command string 10>DL>$$.
|
||||||
|
When the ">" command is encountered in the macro, TECO expects the loop
|
||||||
|
stack to contain a loop count and an address for the first character in the
|
||||||
|
loop. In this example, there is no matching "<" command in the macro which
|
||||||
|
would have set up the loop stack. It would be very bad if TECO were to
|
||||||
|
think that the loop count was 4 and the first command in the loop was "S".
|
||||||
|
In this situation, what TECO should do is generate the error message "BNI >
|
||||||
|
not in iteration". In order to implement this, the variable LStBot is
|
||||||
|
adjusted each time a macro is entered or exited. LStBot represents the
|
||||||
|
bottom of the loop stack for the current macro level.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
8.3 Macro Stack
|
||||||
|
|
||||||
|
The macro stack is used to preserve context each time a macro is
|
||||||
|
entered. All important values are pushed onto the stack before a macro is
|
||||||
|
entered and popped off the stack when the macro is exited. The macro stack
|
||||||
|
is also used by the EI command, which means it's used when executing
|
||||||
|
initialization files and mung files.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
9 HELP
|
||||||
|
|
||||||
|
This section discusses on-line HELP, which is available only under
|
||||||
|
|
||||||
|
Page 13
|
||||||
|
|
||||||
|
|
||||||
|
VAX/VMS.
|
||||||
|
|
||||||
|
The HELP command is not documented in the TECO manual distributed by
|
||||||
|
DEC., even though it is supported in TECO-11 and TECO-32. To get help,
|
||||||
|
simply type "HELP" followed by a carriage return. HELP is the only TECO
|
||||||
|
command that is not terminated by double escapes.
|
||||||
|
|
||||||
|
Help in TECOC is different than help in TECO-11. In TECO-C,
|
||||||
|
interactive help mode is entered, so that a user can browse through a help
|
||||||
|
tree, as he can from DCL. In TECO-C, access is provided to only two
|
||||||
|
libraries: the library specific to TECO-C (pointed to by logical name
|
||||||
|
TEC$INIT) and the system help library. To get help on TECO-C, just say
|
||||||
|
"HELP", with or without arguments. To get help from the system library,
|
||||||
|
say "HELP/S". I find this easier to use than TECO-11's syntax.
|
||||||
|
|
||||||
|
The help library for TECO-C is contained in file TECOC.HLB, which is
|
||||||
|
generated from TECOC.HLP, which is generated from TECOC.RNH. See file
|
||||||
|
TECOC.RNH for a description of how to do it. This help library is far
|
||||||
|
broader than the library for TECO-11, but much of it has yet to be filled
|
||||||
|
in.
|
||||||
|
|
||||||
|
The help library is also the repository for verbose error messages,
|
||||||
|
which are displayed when the help flag (EH) is set to 3. For systems other
|
||||||
|
than VMS, the ZHelp function displays verbose text contained in static
|
||||||
|
memory (see file ZHELP.C).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
10 FILE INPUT
|
||||||
|
|
||||||
|
TECO has an elegant design that allows high speed input. There are no
|
||||||
|
linked list data structures to keep track of, and most file input goes
|
||||||
|
directly to the end of the edit buffer.
|
||||||
|
|
||||||
|
TECO-C takes advantage of this by reading normal file input directly
|
||||||
|
to the end of the edit buffer. After each input call, nothing needs to be
|
||||||
|
moved; the pointer to the end of the edit buffer is simply adjusted to
|
||||||
|
point to the end of the new record. The pointer to the end of the edit
|
||||||
|
buffer (EBfEnd) serves two purposes: it points to the end of the edit
|
||||||
|
buffer and to the beginning of the input buffer.
|
||||||
|
|
||||||
|
A side effect of this scheme is the sharing of memory between the edit
|
||||||
|
buffer and the input buffer. When the edit buffer is empty, it can be made
|
||||||
|
smaller by shrinking the edit buffer gap in order to make the input buffer
|
||||||
|
larger. Obviously, if the edit buffer needs to be expanded, the input
|
||||||
|
buffer can suffer before more memory is actually requested from the
|
||||||
|
operating system. This is easily achieved by moving the pointer to the
|
||||||
|
"end-of-the-edit-buffer"/ "beginning-of-the-input-buffer".
|
||||||
|
|
||||||
|
This scheme works, but provides no support for the other forms of file
|
||||||
|
input. The EP and ER$ commands provide a complete secondary input stream
|
||||||
|
which can be open at the same time as the primary stream (two input files
|
||||||
|
at once). The EI command reads and executes files containing TECO
|
||||||
|
commands, and is used to execute the initialization file, if one exists.
|
||||||
|
The EQq command, if implemented, reads the entire contents of a file
|
||||||
|
|
||||||
|
Page 14
|
||||||
|
|
||||||
|
|
||||||
|
directly into a Q-register.
|
||||||
|
|
||||||
|
A second problem arises: on each of the open files, the quantum unit
|
||||||
|
of input is not standard. For A, Y and P commands, a form feed or
|
||||||
|
end-of-file "terminate" the read. For n:A commands, form feed, end-of-line
|
||||||
|
or end-of-file "terminate" each read. For EI commands, two escapes or
|
||||||
|
end-of-file "terminate" the read. The input code must "save" the portion
|
||||||
|
of an input record following a special character and yield the saved text
|
||||||
|
when the next command for the file is executed.
|
||||||
|
|
||||||
|
The scheme used in TECO-C is to read text from the current input
|
||||||
|
stream directly to the end of the edit buffer. When the input stream is
|
||||||
|
switched via a EP or ER$ command, the obvious switching of file descriptors
|
||||||
|
happens, and any text that's "leftover" from the last read is explicitly
|
||||||
|
saved elsewhere. Note that this happens VERY rarely, so a malloc/free is
|
||||||
|
acceptable.
|
||||||
|
|
||||||
|
For EI and EQq commands, the input memory following the edit buffer is
|
||||||
|
used as a temporary input buffer. After the file is read, the text is
|
||||||
|
copied to a Q-register in the case of EQq and to a separate buffer in the
|
||||||
|
case of EI.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
11 VIDEO
|
||||||
|
|
||||||
|
As of 18-Feb-1991, TECO-C supports video only under Unix. The code
|
||||||
|
was written by Mark Henderson, using the CURSES package. See file
|
||||||
|
VIDEO.TXT for a discussion of how it works.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
12 PORTABILITY
|
||||||
|
|
||||||
|
TECO-C was written with portability in mind. The first development
|
||||||
|
machine was "minimal": a SAGE IV (68000) running CP/M-68k. In that
|
||||||
|
environment, there was no "make" utility.
|
||||||
|
|
||||||
|
Initially, the system-independent code (files that don't start with a
|
||||||
|
"Z") had absolutely no calls to standard C runtime functions. This was
|
||||||
|
because I had several problems with the "standard" functions not being
|
||||||
|
"standard" on different machines. With the onset of ANSI C I've grown less
|
||||||
|
timid, but the main code still references almost no standard functions.
|
||||||
|
This is less of a limitation than you might think: TECO-C doesn't use
|
||||||
|
null-terminated strings. It also doesn't use unions, floating point or bit
|
||||||
|
fields.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
13 PORTING TO A NEW ENVIRONMENT
|
||||||
|
|
||||||
|
|
||||||
|
1. Move the source code to the target machine.
|
||||||
|
|
||||||
|
Page 15
|
||||||
|
|
||||||
|
|
||||||
|
2. Inspect file ZPORT.H. You need to select the compiler you want
|
||||||
|
the code compiled for. For instance, if you are porting to a Unix
|
||||||
|
system, then fix ZPORT.H so that the unix identifier is defined
|
||||||
|
(it is usually defined by default by the compiler). If your
|
||||||
|
compiler is nothing like anything supported by ZPORT.H, then set
|
||||||
|
the UNKNOWN identifier.
|
||||||
|
|
||||||
|
3. Compile and link. See file AAREADME.TXT for descriptions of how
|
||||||
|
TECO-C is built in supported environments, and steal like mad.
|
||||||
|
The problem here is that you need a "Z" file for your environment,
|
||||||
|
containing all the "Z" functions needed by TECO-C. The easiest
|
||||||
|
thing to do is copy ZUNKN.C to your own "Z" file and link against
|
||||||
|
that. For instance, if I ever port TECO-C to a Macintosh, I'll
|
||||||
|
copy ZUNKN.C to ZMAC.C.
|
||||||
|
|
||||||
|
4. Fix things so the compile/link is successful. If you have
|
||||||
|
compiled with UNKNOWN set, you should get an executable file that
|
||||||
|
displays a message and dies when the first system-dependent
|
||||||
|
function is called. The strategy is to fix that function (often
|
||||||
|
by stealing from the code for other operating systems), relink and
|
||||||
|
deal with the next message until you have something that works.
|
||||||
|
Functions should be implemented in roughly the following order:
|
||||||
|
ZInit, ZTrmnl, ZExit, ZDspCh, ZAlloc, ZRaloc, ZFree, ZChin. This
|
||||||
|
will give you a TECO with everything but file I/O. You can run
|
||||||
|
it, add text to the edit buffer, delete text, search, use
|
||||||
|
expressions and the = sign command (a calculator). Then do file
|
||||||
|
input: ZOpInp, ZRdLin, ZIClos. Then do file output: ZOpout,
|
||||||
|
ZWrBfr, ZOClos, ZOClDe. Use the test macros (*tst*.tec) to test
|
||||||
|
how everything works (see Testing).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
14 TESTING
|
||||||
|
|
||||||
|
Testing of TECO-C is performed by executing macros. The macros are
|
||||||
|
contained in files named TSTxxx.TEC, where XXX is some kind of indication
|
||||||
|
as to what is tested. For instance, TSTQR.TEC tests q-registers. The test
|
||||||
|
macros do not test all the functions provided by TECO. They were
|
||||||
|
originally used to verify that TECO-C performs exactly the same as TECO-11
|
||||||
|
under the VMS operating system. When I needed to test a chunk of code, I
|
||||||
|
sometimes did it the right way and wrote a macro.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
15 DEBUGGING
|
||||||
|
|
||||||
|
A debugging system (very ugly, very useful) is imbedded within the
|
||||||
|
code. It is conditionally complied into the code by turning on or off an
|
||||||
|
identifier (DEBUGGING) defined in the TECOC.H file. When debugging code is
|
||||||
|
compiled in, you can access it using the ^P command, which is not used by
|
||||||
|
regular TECO. The ^P command with no argument will display help about how
|
||||||
|
to use ^P.
|
||||||
|
|
||||||
|
Page 16
|
||||||
|
|
||||||
|
|
||||||
|
If you are working under VMS, it sometimes helps to compare the
|
||||||
|
execution of TECO-C with TECO-11. Put a test command string into a file.
|
||||||
|
Use DEFINE/USER_MODE to redirect the output of TECO-C to a file and execute
|
||||||
|
the macro with TECO-C. Then do the same thing with TECO-11. Use the
|
||||||
|
DIFFERENCES command to compare the two output files. They should be 100
|
||||||
|
percent identical.
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
TECO-C (version number 146)
|
||||||
|
Copyright 1983, 1990 by Pete Siemsen. This software is provided to
|
||||||
|
you free of charge for your own use. Use it as you see fit; if it doesn't
|
||||||
|
work, I disclaim all responsibility. You may re-distribute this software
|
||||||
|
UNCHANGED only if you include this copy-right notice. Alternatively, if
|
||||||
|
you change this software, you may re-distribute the result only if you
|
||||||
|
include BOTH this copyright notice, AND an additional notice identifying
|
||||||
|
you and indicating that you have changed the software.
|
||||||
|
This program is still under development. See file PROBLEMS.TXT for
|
||||||
|
notes I've written to myself about things to do to the program. If you
|
||||||
|
modify this code to enhance it or fix a bug, please communicate the changes
|
||||||
|
to me. My address is
|
||||||
|
Pete Siemsen
|
||||||
|
645 Ohio Avenue #302
|
||||||
|
Long Beach, Ca. 90814
|
||||||
|
(213) 433-3059 (home)
|
||||||
|
(213) 740-7391 (work)
|
||||||
|
Internet: siemsen@usc.edu
|
||||||
|
[NOTE -- This is old information. Better to contact me, Tom Almy, below.]
|
||||||
|
*******************************************************
|
||||||
|
This archive contains TECO-C modified and compiled for DOS, Win32,
|
||||||
|
OS/2, and Linux (on Intel 32bit architecture). The modifications have been made by:
|
||||||
|
Tom Almy
|
||||||
|
tomalmy@aracnet.com
|
||||||
|
who is a "old time" TECO user. Not only did I port TECO-C but I also
|
||||||
|
corrected some bugs. For OS/2 modified the file backup algorithm to do
|
||||||
|
copying rather than renaming as an option. This makes it Workplace
|
||||||
|
Shell friendly. The Win32, Linux and OS/2 versions allow long file names.
|
||||||
|
Included files in this archive:
|
||||||
|
doc:
|
||||||
|
readme.1st This file
|
||||||
|
readme.txt Operating and install instructions for Linux users
|
||||||
|
wchart.txt List of all the implemented commands.
|
||||||
|
teco.doc The official teco reference. TECOC IS CLOSE TO TECO-11 IN FUNCTIONALITY
|
||||||
|
bin:
|
||||||
|
tecoc Executable
|
||||||
|
Make link to tecoc
|
||||||
|
mung link to tecoc
|
||||||
|
teco link to tecoc
|
||||||
|
Inspect link to tecoc
|
||||||
|
lib:
|
||||||
|
*.tes *.tec TECO macros
|
||||||
|
src:
|
||||||
|
Full source files for Linux version
|
||||||
|
|
@ -0,0 +1,171 @@
|
||||||
|
Running TECOC on OS X
|
||||||
|
|
||||||
|
Tecoc takes a first argument of mung, teco, or make to control its
|
||||||
|
operating mode. In this Linux version, the name of the executable is
|
||||||
|
tested to provide this first argument. Typically soft links are used
|
||||||
|
to the tecoc executable, however aliases could be used instead. The
|
||||||
|
mapping is:
|
||||||
|
|
||||||
|
Make is tecoc make (note uppercase first letter)
|
||||||
|
teco is tecoc teco
|
||||||
|
mung is tecoc mung
|
||||||
|
inspect is tecoc teco -inspect
|
||||||
|
|
||||||
|
The provided TAR file has these four soft links defined. Extract the
|
||||||
|
TAR file into a directory in your execution path
|
||||||
|
after making sure none of the command names already exist for other
|
||||||
|
applications. Necessary environment variables and files are described below.
|
||||||
|
|
||||||
|
Several option switches are allowed on the TECO command line:
|
||||||
|
|
||||||
|
-in[spect] -- Read file only, don't create an output file.
|
||||||
|
-noc[reate] -- If file doesn't exist, don't create it.
|
||||||
|
-noi[ni] -- Don't execute INI file. (valid for MAKE or MUNG as well)
|
||||||
|
-nom[emory] -- don't save filename as "last edited file" (valid for
|
||||||
|
MAKE also)
|
||||||
|
-nop[age] -- Formfeeds don't stop file reads (valid for MAKE also)
|
||||||
|
+nnn -- sets NOPAGE and positions dot to line nnn.
|
||||||
|
|
||||||
|
The part of the switch name in the square brackets is optional. For
|
||||||
|
instance "-in" is the same as "-inspect".
|
||||||
|
|
||||||
|
MAKE filespec
|
||||||
|
|
||||||
|
starts tecoc to create file filespec. Does equivalent of EWfilespec$$
|
||||||
|
|
||||||
|
TECO filespec
|
||||||
|
|
||||||
|
starts tecoc to edit file filespec. Does equivalent of
|
||||||
|
EBfilespec$Y$
|
||||||
|
|
||||||
|
TECO filespec2=filespec1
|
||||||
|
|
||||||
|
starts tecoc to edit filespec1, writing to filespec2. Does
|
||||||
|
equivalent of ERfilespec1$EWfilespec2$Y$$
|
||||||
|
|
||||||
|
TECO
|
||||||
|
|
||||||
|
starts tecoc to edit last edited file. Filename is saved in file
|
||||||
|
named teco*.tmp in the current directory, unless overriden
|
||||||
|
(described below).
|
||||||
|
|
||||||
|
MUNG filespec <args>
|
||||||
|
|
||||||
|
starts tecoc to execute filespec. Equivalent to
|
||||||
|
I<args>$JEIfilespec$$
|
||||||
|
|
||||||
|
You can use "TECO @filespec <args>" instead of MUNG.
|
||||||
|
|
||||||
|
**************
|
||||||
|
Key Bindings
|
||||||
|
|
||||||
|
The keys mentioned in the teco.doc file are somewhat confusing.
|
||||||
|
This should help:
|
||||||
|
|
||||||
|
<DELIM> The "Esc" key, "Esc" echoes as "$", however the
|
||||||
|
teco.doc file shows it as '`'.
|
||||||
|
<BS> Type as Control-h, this isn't the "Backspace" key.
|
||||||
|
<DELETE> The "Backspace" key. This isn't the "Delete" key.
|
||||||
|
<CR> The "Enter" key.
|
||||||
|
<LF> Type as Control-j.
|
||||||
|
|
||||||
|
Note that the assignments for <BS> and <DELETE> shown here are
|
||||||
|
swapped. <BS> can be "Backspace" and <DELETE> can be control-h by
|
||||||
|
clearing ET&2048, e.g. 2048,0ET
|
||||||
|
|
||||||
|
|
||||||
|
**************
|
||||||
|
|
||||||
|
The Initialization File.
|
||||||
|
|
||||||
|
Tecoc mungs (executes as teco commands) the file TECO.INI in the
|
||||||
|
current directory before processing the command line. Initialization
|
||||||
|
can be done instead by defining a TEC_INIT environment variable. The
|
||||||
|
value is either the list of teco commands to execute or a "$" followed
|
||||||
|
by the pathname of the file containing the initialization file. This
|
||||||
|
allows a single, centrally located initialization file. REMEMBER that
|
||||||
|
the "$" must be escaped, i.e. "\$"
|
||||||
|
|
||||||
|
The initialization file can be used to make initial settings. It can
|
||||||
|
return a value, but the value setting is somewhat obscure.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
export TEC_INIT=1es
|
||||||
|
|
||||||
|
will cause successful searches to auto-display in all teco sessions.
|
||||||
|
|
||||||
|
**************
|
||||||
|
|
||||||
|
Changing the location of the memory file.
|
||||||
|
|
||||||
|
Define the environment variable TEC_MEMORY to be "$" followed by the
|
||||||
|
pathname of the file designated the memory file.
|
||||||
|
|
||||||
|
Examples (csh):
|
||||||
|
export TEC_MEMORY=~/teco.mem
|
||||||
|
export TEC_MEMORY=\$$TEC_MEMORY
|
||||||
|
|
||||||
|
will cause the name of the last edit file to be stored in the file
|
||||||
|
teco.mem in the home directory. By default the file name is tecoN.tmp in
|
||||||
|
the current directory, where "N" is the process ID of the parent process to
|
||||||
|
teco.
|
||||||
|
|
||||||
|
|
||||||
|
**************
|
||||||
|
|
||||||
|
The Libary directory
|
||||||
|
|
||||||
|
Defining the environment variable TEC_LIBRARY to be a directory path
|
||||||
|
(including the final "/") will allow the EI command to fetch
|
||||||
|
teco commands from this directory if the file is not found in the
|
||||||
|
current directory.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
export TEC_LIBRARY=\$/usr/local/lib/
|
||||||
|
|
||||||
|
will cause the directory /usr/local/lib to be searched for teco command files.
|
||||||
|
|
||||||
|
|
||||||
|
**************
|
||||||
|
|
||||||
|
Implemented flags:
|
||||||
|
|
||||||
|
ED&1 Allow carat "^" character in string searches
|
||||||
|
ED&2 Allow yank and _ unconditionally
|
||||||
|
ED&16 Failed searches preserve dot
|
||||||
|
ED&64 Move dot by one after each match in multiple occurance searches
|
||||||
|
|
||||||
|
ET&1 Type out in image mode
|
||||||
|
ET&2 Use scope for delete and control-U (default=1)
|
||||||
|
ET&4 Accept lowercase input (default=1)
|
||||||
|
ET&8 ^T reads without echo
|
||||||
|
ET&32 ^T reads with no wait
|
||||||
|
ET&128 MUNG mode (abort on error) cleared by "*" prompt
|
||||||
|
ET&2048 Swap backspace and delete
|
||||||
|
ET&4096 We are using 8 bit characters (default=1)
|
||||||
|
ET&32768 Trap control-C
|
||||||
|
|
||||||
|
EZ&1 Mark Henderson, who did much of the Unix port, likes the way
|
||||||
|
VAX/VMS keeps versions of files. VMS appends a semicolon followed
|
||||||
|
by a version number to files, and has the PURGE command to clean
|
||||||
|
out old versions of files. If this bit is off, TECO-C will handle
|
||||||
|
file version numbers, appending the appropriate version number to
|
||||||
|
file names. Mark supplied a "purge" program (distributed with TECO-C)
|
||||||
|
for users of this feature. Setting this flag turns off the feature,
|
||||||
|
to make TECO-C function as expected by the average Unix user. This
|
||||||
|
flag is set by default.
|
||||||
|
EZ&128 Don't stop read on formfeeds
|
||||||
|
EZ&256 If set, don't do newline translation on file read/write -- binary mode.
|
||||||
|
TECO is based on separate carriage return (CR) and line feed (LF)
|
||||||
|
line termination. Normally on file input newline (line feed)
|
||||||
|
characters are converted to CRLF pairs unless preceded
|
||||||
|
by a CR -- this allows reading DOS format files. On output CRLF pairs
|
||||||
|
are converted back to new line characters. Set this bit before starting
|
||||||
|
to edit a binary file, or when editing a DOS file for which no format
|
||||||
|
conversion is desired (ie file is saved back in DOS format).
|
||||||
|
EZ&8192 This bit is set by default, but has no significance in this release.
|
||||||
|
EZ&16384 Normally the backup file name is created by replacing the file extension
|
||||||
|
with "bak" -- foo.c becomes foo.bak, however if this bit is set then
|
||||||
|
the backup file name is created by simply adding ".bak" to the name -- foo.c
|
||||||
|
becomes foo.c.bak. This choice is overridden by EZ&1 = 0.
|
||||||
|
|
||||||
|
|
@ -0,0 +1,134 @@
|
||||||
|
Running TECOC on Linux
|
||||||
|
Tecoc takes a first argument of mung, teco, or make to control its
|
||||||
|
operating mode. In this Linux version, the name of the executable is
|
||||||
|
tested to provide this first argument. Typically soft links are used
|
||||||
|
to the tecoc executable, however aliases could be used instead. The
|
||||||
|
mapping is:
|
||||||
|
Make is tecoc make (note uppercase first letter)
|
||||||
|
teco is tecoc teco
|
||||||
|
mung is tecoc mung
|
||||||
|
inspect is tecoc teco -inspect
|
||||||
|
The provided TAR file has these four soft links defined. Extract the
|
||||||
|
TAR file into a directory in your path, typically /usr/local/bin,
|
||||||
|
after making sure none of the command names already exist for other
|
||||||
|
applications. Necessary environment variables and files are described below.
|
||||||
|
Several option switches are allowed on the TECO command line:
|
||||||
|
-in[spect] -- Read file only, don't create an output file.
|
||||||
|
-noc[reate] -- If file doesn't exist, don't create it.
|
||||||
|
-noi[ni] -- Don't execute INI file. (valid for MAKE or MUNG as well)
|
||||||
|
-nom[emory] -- don't save filename as "last edited file" (valid for
|
||||||
|
MAKE also)
|
||||||
|
-nop[age] -- Formfeeds don't stop file reads (valid for MAKE also)
|
||||||
|
-nor[ename] -- Don't rename files, but copy them to keep references correct
|
||||||
|
(OS/2 only)
|
||||||
|
+nnn -- sets NOPAGE and positions dot to line nnn.
|
||||||
|
The part of the switch name in the square brackets is optional. For
|
||||||
|
instance "-in" is the same as "-inspect".
|
||||||
|
MAKE filespec
|
||||||
|
starts tecoc to create file filespec. Does equivalent of EWfilespec$$
|
||||||
|
TECO filespec
|
||||||
|
starts tecoc to edit file filespec. Does equivalent of
|
||||||
|
EBfilespec$Y$
|
||||||
|
TECO filespec2=filespec1
|
||||||
|
starts tecoc to edit filespec1, writing to filespec2. Does
|
||||||
|
equivalent of ERfilespec1$EWfilespec2$Y$$
|
||||||
|
TECO
|
||||||
|
starts tecoc to edit last edited file. Filename is saved in file
|
||||||
|
named teco*.tmp in the current directory, unless overriden
|
||||||
|
(described below).
|
||||||
|
MUNG filespec <args>
|
||||||
|
starts tecoc to execute filespec. Equivalent to
|
||||||
|
I<args>$JEIfilespec$$
|
||||||
|
You can use "TECO @filespec <args>" instead of MUNG.
|
||||||
|
**************
|
||||||
|
Key Bindings
|
||||||
|
The keys mentioned in the teco.doc file are somewhat confusing.
|
||||||
|
This should help:
|
||||||
|
<DELIM> The "Esc" key, "Esc" echoes as "$", however the
|
||||||
|
teco.doc file shows it as '`'.
|
||||||
|
<BS> Type as Control-h, this isn't the "Backspace" key.
|
||||||
|
<DELETE> The "Backspace" key. This isn't the "Delete" key.
|
||||||
|
<CR> The "Enter" key.
|
||||||
|
<LF> Type as Control-j.
|
||||||
|
Note that the assignments for <BS> and <DELETE> shown here are
|
||||||
|
swapped. <BS> can be "Backspace" and <DELETE> can be control-h by
|
||||||
|
clearing ET&2048, e.g. 2048,0ET
|
||||||
|
**************
|
||||||
|
The Initialization File.
|
||||||
|
Tecoc mungs (executes as teco commands) the file TECO.INI in the
|
||||||
|
current directory before processing the command line. Initialization
|
||||||
|
can be done instead by defining a TEC_INIT environment variable. The
|
||||||
|
value is either the list of teco commands to execute or a "$" followed
|
||||||
|
by the pathname of the file containing the initialization file. This
|
||||||
|
allows a single, centrally located initialization file. REMEMBER that
|
||||||
|
the "$" must be escaped, i.e. "\$"
|
||||||
|
The initialization file can be used to make initial settings. It can
|
||||||
|
return a value, but the value setting is somewhat obscure.
|
||||||
|
Example (csh):
|
||||||
|
setenv TEC_INIT 1es
|
||||||
|
Example (bash):
|
||||||
|
TEC_INIT=1es
|
||||||
|
export TEC_INIT
|
||||||
|
will cause successful searches to auto-display in all teco sessions.
|
||||||
|
**************
|
||||||
|
Changing the location of the memory file.
|
||||||
|
Define the environment variable TEC_MEMORY to be "$" followed by the
|
||||||
|
pathname of the file designated the memory file.
|
||||||
|
Example (csh):
|
||||||
|
setenv TEC_MEMORY ~/teco.mem
|
||||||
|
setenv TEC_MEMORY \$$TEC_MEMORY
|
||||||
|
Example (bash):
|
||||||
|
TEC_MEMORY = ~/teco.mem
|
||||||
|
TEC_MEMORY = \$$TEC_MEMORY
|
||||||
|
export TEC_MEMORY
|
||||||
|
will cause the name of the last edit file to be stored in the file
|
||||||
|
teco.mem in the home directory. By default the file name is tecoN.tmp in
|
||||||
|
the current directory, where "N" is the process ID of the parent process to
|
||||||
|
teco.
|
||||||
|
**************
|
||||||
|
The Libary directory
|
||||||
|
Defining the environment variable TEC_LIBRARY to be a directory path
|
||||||
|
(including the final "/") will allow the EI command to fetch
|
||||||
|
teco commands from this directory if the file is not found in the
|
||||||
|
current directory.
|
||||||
|
Example (csh):
|
||||||
|
setenv TEC_LIBRARY=\$/usr/local/lib/
|
||||||
|
will cause the directory /usr/local/lib to be searched for teco command files.
|
||||||
|
**************
|
||||||
|
Implemented flags:
|
||||||
|
ED&1 Allow carat "^" character in string searches
|
||||||
|
ED&2 Allow yank and _ unconditionally
|
||||||
|
ED&16 Failed searches preserve dot
|
||||||
|
ED&64 Move dot by one after each match in multiple occurance searches
|
||||||
|
ET&1 Type out in image mode
|
||||||
|
ET&2 Use scope for delete and control-U (default=1)
|
||||||
|
ET&4 Accept lowercase input (default=1)
|
||||||
|
ET&8 ^T reads without echo
|
||||||
|
ET&32 ^T reads with no wait
|
||||||
|
ET&128 MUNG mode (abort on error) cleared by "*" prompt
|
||||||
|
ET&2048 Swap backspace and delete
|
||||||
|
ET&4096 We are using 8 bit characters (default=1)
|
||||||
|
ET&32768 Trap control-C
|
||||||
|
EZ&1 Mark Henderson, who did much of the Unix port, likes the way
|
||||||
|
VAX/VMS keeps versions of files. VMS appends a semicolon followed
|
||||||
|
by a version number to files, and has the PURGE command to clean
|
||||||
|
out old versions of files. If this bit is off, TECO-C will handle
|
||||||
|
file version numbers, appending the appropriate version number to
|
||||||
|
file names. Mark supplied a "purge" program (distributed with TECO-C)
|
||||||
|
for users of this feature. Setting this flag turns off the feature,
|
||||||
|
to make TECO-C function as expected by the average Unix user. This
|
||||||
|
flag is set by default.
|
||||||
|
EZ&128 Don't stop read on formfeeds
|
||||||
|
EZ&256 If set, don't do newline translation on file read/write -- binary mode.
|
||||||
|
TECO is based on separate carriage return (CR) and line feed (LF)
|
||||||
|
line termination. Normally on file input newline (line feed)
|
||||||
|
characters are converted to CRLF pairs unless preceded
|
||||||
|
by a CR -- this allows reading DOS format files. On output CRLF pairs
|
||||||
|
are converted back to new line characters. Set this bit before starting
|
||||||
|
to edit a binary file, or when editing a DOS file for which no format
|
||||||
|
conversion is desired (ie file is saved back in DOS format).
|
||||||
|
EZ&8192 This bit is set by default, but has no significance in this release.
|
||||||
|
EZ&16384 Normally the backup file name is created by replacing the file extension
|
||||||
|
with "bak" -- foo.c becomes foo.bak, however if this bit is set then
|
||||||
|
the backup file name is created by simply adding ".bak" to the name -- foo.c
|
||||||
|
becomes foo.c.bak. This choice is overridden by EZ&1 = 0.
|
||||||
|
|
@ -0,0 +1,121 @@
|
||||||
|
Running TECOC
|
||||||
|
|
||||||
|
Tecoc is typically started via batch commands to set the first
|
||||||
|
argument to MUNG, TECO, or MAKE. The batch files are typically called
|
||||||
|
mung, teco, make, and inspect. (Inspect does a TECO/INSPECT.)
|
||||||
|
|
||||||
|
Several option switches are allowed on the TECO command line:
|
||||||
|
|
||||||
|
/IN[SPECT] -- Read file only, don't create an output file.
|
||||||
|
/NOC[REATE] -- If file doesn't exist, don't create it.
|
||||||
|
/NOI[NI] -- Don't execute INI file. (valid for MAKE or MUNG as well)
|
||||||
|
/NOM[EMORY] -- don't save filename as "last edited file" (valid for
|
||||||
|
MAKE also)
|
||||||
|
/NOP[AGE] -- Formfeeds don't stop file reads (valid for MAKE also)
|
||||||
|
/NOR[ENAME] -- Don't rename files, but copy them to keep references correct
|
||||||
|
(OS/2 only)
|
||||||
|
+nnn -- sets NOPAGE and positions dot to line nnn.
|
||||||
|
|
||||||
|
The part of the switch name in the square brackets is optional. For
|
||||||
|
instance "/IN" is the same as "/INSPECT".
|
||||||
|
|
||||||
|
MAKE filespec
|
||||||
|
|
||||||
|
starts tecoc to create file filespec. Does equivalent of EWfilespec$$
|
||||||
|
|
||||||
|
TECO filespec
|
||||||
|
|
||||||
|
starts tecoc to edit file filespec. Does equivalent of
|
||||||
|
EBfilespec$Y$
|
||||||
|
|
||||||
|
TECO filespec2=filespec1
|
||||||
|
|
||||||
|
starts tecoc to edit filespec1, writing to filespec2. Does
|
||||||
|
equivalent of ERfilespec1$EWfilespec2$Y$$
|
||||||
|
|
||||||
|
TECO
|
||||||
|
|
||||||
|
starts tecoc to edit last edited file. Filename is saved in file
|
||||||
|
named teco*.tmp in the current directory, unless overriden
|
||||||
|
(described below).
|
||||||
|
|
||||||
|
MUNG filespec <args>
|
||||||
|
|
||||||
|
starts tecoc to execute filespec. Equivalent to
|
||||||
|
I<args>$JEIfilespec$$
|
||||||
|
|
||||||
|
You can use "TECO @filespec <args>" instead of MUNG.
|
||||||
|
|
||||||
|
**************
|
||||||
|
|
||||||
|
The Initialization File.
|
||||||
|
|
||||||
|
Tecoc mungs (executes as teco commands) the file TECO.INI in the
|
||||||
|
current directory before processing the command line. Initialization
|
||||||
|
can be done instead by defining a TEC$INIT environment variable (the
|
||||||
|
DOS "SET" command does this). The value is either the list of teco
|
||||||
|
commands to execute or a "$" followed by the pathname of the file
|
||||||
|
containing the initialization file. This allows a single, centrally
|
||||||
|
located initialization file.
|
||||||
|
|
||||||
|
The initialization file can be used to make initial settings. It can
|
||||||
|
return a value, but the value setting is somewhat obscure.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
set TEC$INIT=1es
|
||||||
|
|
||||||
|
will cause successful searches to auto-display in all teco sessions.
|
||||||
|
|
||||||
|
**************
|
||||||
|
|
||||||
|
Changing the location of the memory file.
|
||||||
|
|
||||||
|
Define the environment variable TEC$MEMORY to be "$" followed by the
|
||||||
|
pathname of the file designated the memory file.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
set TEC$MEMORY=$c:\teco.mem
|
||||||
|
|
||||||
|
will cause the name of the last edit file to be stored in the file
|
||||||
|
teco.mem in the root directory of drive C.
|
||||||
|
|
||||||
|
|
||||||
|
**************
|
||||||
|
|
||||||
|
The Libary directory
|
||||||
|
|
||||||
|
Defining the environment variable TEC$LIBRARY to be a directory path
|
||||||
|
(including the final "\" or "/") will allow the EI command to fetch
|
||||||
|
teco commands from this directory if the file is not found in the
|
||||||
|
current directory.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
set TEC$LIBRARY=c:\lib\teco\
|
||||||
|
|
||||||
|
will cause the directory c:\lib\teco to be searched for teco command files.
|
||||||
|
|
||||||
|
|
||||||
|
**************
|
||||||
|
|
||||||
|
Implemented flags:
|
||||||
|
|
||||||
|
ED&1 Allow carat "^" character in string searches
|
||||||
|
ED&2 Allow yank and _ unconditionally
|
||||||
|
ED&16 Failed searches preserve dot
|
||||||
|
ED&64 Move dot by one after each match in multiple occurance searches
|
||||||
|
|
||||||
|
ET&1 Type out in image mode
|
||||||
|
ET&2 Use scope for delete and control-U (default=1)
|
||||||
|
ET&4 Accept lowercase input (default=1)
|
||||||
|
ET&8 ^T reads without echo
|
||||||
|
ET&32 ^T reads with no wait
|
||||||
|
ET&128 MUNG mode (abort on error) cleared by "*" prompt
|
||||||
|
ET&2048 Swap backspace and delete (default=1)
|
||||||
|
ET&4096 We are using 8 bit characters (default=1)
|
||||||
|
ET&32768 Trap control-C
|
||||||
|
|
||||||
|
EZ&2 Don't rename files, copy them (OS/2 Version)
|
||||||
|
EZ&128 Don't stop read on formfeeds
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
TECO-C (version number 146)
|
||||||
|
|
||||||
|
Copyright 1983, 1990 by Pete Siemsen. This software is provided to
|
||||||
|
you free of charge for your own use. Use it as you see fit; if it doesn't
|
||||||
|
work, I disclaim all responsibility. You may re-distribute this software
|
||||||
|
UNCHANGED only if you include this copy-right notice. Alternatively, if
|
||||||
|
you change this software, you may re-distribute the result only if you
|
||||||
|
include BOTH this copyright notice, AND an additional notice identifying
|
||||||
|
you and indicating that you have changed the software.
|
||||||
|
|
||||||
|
This program is still under development. See file PROBLEMS.TXT for
|
||||||
|
notes I've written to myself about things to do to the program. If you
|
||||||
|
modify this code to enhance it or fix a bug, please communicate the changes
|
||||||
|
to me. My address is
|
||||||
|
|
||||||
|
Pete Siemsen
|
||||||
|
645 Ohio Avenue #302
|
||||||
|
Long Beach, Ca. 90814
|
||||||
|
|
||||||
|
(213) 433-3059 (home)
|
||||||
|
(213) 740-7391 (work)
|
||||||
|
Internet: siemsen@usc.edu
|
||||||
|
|
||||||
|
[NOTE -- This is old information. Better to contact me, Tom Almy, below.]
|
||||||
|
|
||||||
|
*******************************************************
|
||||||
|
|
||||||
|
This archive contains TECO-C modified and compiled for DOS, Win32,
|
||||||
|
and OS/2. The modifications have been made by:
|
||||||
|
|
||||||
|
Tom Almy
|
||||||
|
tomalmy@aracnet.com -or-
|
||||||
|
tom_almy@ieee.org
|
||||||
|
|
||||||
|
who is a "old time" TECO user. Not only did I port TECO-C but I also
|
||||||
|
corrected some bugs and modified the file backup algorithm to do
|
||||||
|
copying rather than renaming as an option. This makes it Workplace
|
||||||
|
Shell friendly. Both the Win32 and OS/2 version allow long file names.
|
||||||
|
|
||||||
|
Included files in this archive:
|
||||||
|
|
||||||
|
readme.1st This file
|
||||||
|
readme.txt Quick operating instructions for the TECO literate
|
||||||
|
wchart.txt List of all the implemented commands.
|
||||||
|
teco.doc The official teco reference.
|
||||||
|
inspect.cmd Command files to invoke tecoc
|
||||||
|
inspect.bat (cmd for OS/2, bat for DOS/Win32)
|
||||||
|
mung.cmd
|
||||||
|
mung.bat
|
||||||
|
teco.cmd
|
||||||
|
teco.bat
|
||||||
|
tmake.cmd this would be "make" but most people use the program
|
||||||
|
"make".
|
||||||
|
tmake.bat
|
||||||
|
tecocmd.btm Equivalent aliases for JPSoft products (4DOS, et cetera)
|
||||||
|
|
||||||
|
*.tes TECO command files for various things
|
||||||
|
*.tec Compressed TECO command files
|
||||||
|
|
||||||
|
|
||||||
|
The executable program is downloaded as a separate file.
|
||||||
|
|
@ -0,0 +1,142 @@
|
||||||
|
Running TECOC
|
||||||
|
|
||||||
|
NOTE -- IF YOU ARE USING LINUX, READ THE FILE README.LNX INSTEAD!
|
||||||
|
|
||||||
|
|
||||||
|
Tecoc is typically started via batch commands to set the first
|
||||||
|
argument to MUNG, TECO, or MAKE. The batch files are typically called
|
||||||
|
mung, teco, make, and inspect. (Inspect does a TECO/INSPECT.)
|
||||||
|
|
||||||
|
Several option switches are allowed on the TECO command line:
|
||||||
|
|
||||||
|
/IN[SPECT] -- Read file only, don't create an output file.
|
||||||
|
/NOC[REATE] -- If file doesn't exist, don't create it.
|
||||||
|
/NOI[NI] -- Don't execute INI file. (valid for MAKE or MUNG as well)
|
||||||
|
/NOM[EMORY] -- don't save filename as "last edited file" (valid for
|
||||||
|
MAKE also)
|
||||||
|
/NOP[AGE] -- Formfeeds don't stop file reads (valid for MAKE also)
|
||||||
|
/NOR[ENAME] -- Don't rename files, but copy them to keep references correct
|
||||||
|
(OS/2 only)
|
||||||
|
+nnn -- sets NOPAGE and positions dot to line nnn.
|
||||||
|
|
||||||
|
The part of the switch name in the square brackets is optional. For
|
||||||
|
instance "/IN" is the same as "/INSPECT".
|
||||||
|
|
||||||
|
MAKE filespec
|
||||||
|
|
||||||
|
starts tecoc to create file filespec. Does equivalent of EWfilespec$$
|
||||||
|
|
||||||
|
TECO filespec
|
||||||
|
|
||||||
|
starts tecoc to edit file filespec. Does equivalent of
|
||||||
|
EBfilespec$Y$
|
||||||
|
|
||||||
|
TECO filespec2=filespec1
|
||||||
|
|
||||||
|
starts tecoc to edit filespec1, writing to filespec2. Does
|
||||||
|
equivalent of ERfilespec1$EWfilespec2$Y$$
|
||||||
|
|
||||||
|
TECO
|
||||||
|
|
||||||
|
starts tecoc to edit last edited file. Filename is saved in file
|
||||||
|
named teco*.tmp in the current directory, unless overriden
|
||||||
|
(described below).
|
||||||
|
|
||||||
|
MUNG filespec <args>
|
||||||
|
|
||||||
|
starts tecoc to execute filespec. Equivalent to
|
||||||
|
I<args>$JEIfilespec$$
|
||||||
|
|
||||||
|
You can use "TECO @filespec <args>" instead of MUNG.
|
||||||
|
|
||||||
|
**************
|
||||||
|
Key Bindings
|
||||||
|
|
||||||
|
The keys mentioned in the teco.doc file are somewhat confusing.
|
||||||
|
This should help:
|
||||||
|
|
||||||
|
<DELIM> The "Esc" key, "Esc" echoes as "$", however the
|
||||||
|
teco.doc file shows it as '`'.
|
||||||
|
<BS> Type as Control-h, this isn't the "Backspace" key.
|
||||||
|
<DELETE> The "Backspace" key. This isn't the "Delete" key.
|
||||||
|
<CR> The "Enter" key.
|
||||||
|
<LF> Type as Control-j.
|
||||||
|
|
||||||
|
Note that the assignments for <BS> and <DELETE> shown here are
|
||||||
|
swapped. <BS> can be "Backspace" and <DELETE> can be control-h by
|
||||||
|
clearing ET&2048, e.g. 2048,0ET
|
||||||
|
|
||||||
|
|
||||||
|
**************
|
||||||
|
|
||||||
|
The Initialization File.
|
||||||
|
|
||||||
|
Tecoc mungs (executes as teco commands) the file TECO.INI in the
|
||||||
|
current directory before processing the command line. Initialization
|
||||||
|
can be done instead by defining a TEC$INIT environment variable (the
|
||||||
|
DOS "SET" command does this). The value is either the list of teco
|
||||||
|
commands to execute or a "$" followed by the pathname of the file
|
||||||
|
containing the initialization file. This allows a single, centrally
|
||||||
|
located initialization file.
|
||||||
|
|
||||||
|
The initialization file can be used to make initial settings. It can
|
||||||
|
return a value, but the value setting is somewhat obscure.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
set TEC$INIT=1es
|
||||||
|
|
||||||
|
will cause successful searches to auto-display in all teco sessions.
|
||||||
|
|
||||||
|
**************
|
||||||
|
|
||||||
|
Changing the location of the memory file.
|
||||||
|
|
||||||
|
Define the environment variable TEC$MEMORY to be "$" followed by the
|
||||||
|
pathname of the file designated the memory file.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
set TEC$MEMORY=$c:\teco.mem
|
||||||
|
|
||||||
|
will cause the name of the last edit file to be stored in the file
|
||||||
|
teco.mem in the root directory of drive C.
|
||||||
|
|
||||||
|
|
||||||
|
**************
|
||||||
|
|
||||||
|
The Libary directory
|
||||||
|
|
||||||
|
Defining the environment variable TEC$LIBRARY to be a directory path
|
||||||
|
(including the final "\" or "/") will allow the EI command to fetch
|
||||||
|
teco commands from this directory if the file is not found in the
|
||||||
|
current directory.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
set TEC$LIBRARY=c:\lib\teco\
|
||||||
|
|
||||||
|
will cause the directory c:\lib\teco to be searched for teco command files.
|
||||||
|
|
||||||
|
|
||||||
|
**************
|
||||||
|
|
||||||
|
Implemented flags:
|
||||||
|
|
||||||
|
ED&1 Allow carat "^" character in string searches
|
||||||
|
ED&2 Allow yank and _ unconditionally
|
||||||
|
ED&16 Failed searches preserve dot
|
||||||
|
ED&64 Move dot by one after each match in multiple occurance searches
|
||||||
|
|
||||||
|
ET&1 Type out in image mode
|
||||||
|
ET&2 Use scope for delete and control-U (default=1)
|
||||||
|
ET&4 Accept lowercase input (default=1)
|
||||||
|
ET&8 ^T reads without echo
|
||||||
|
ET&32 ^T reads with no wait
|
||||||
|
ET&128 MUNG mode (abort on error) cleared by "*" prompt
|
||||||
|
ET&2048 Swap backspace and delete (default=1)
|
||||||
|
ET&4096 We are using 8 bit characters (default=1)
|
||||||
|
ET&32768 Trap control-C
|
||||||
|
|
||||||
|
EZ&2 Don't rename files, copy them (OS/2 Version)
|
||||||
|
EZ&128 Don't stop read on formfeeds
|
||||||
|
|
@ -0,0 +1,80 @@
|
||||||
|
Running TECOC
|
||||||
|
Tecoc is typically started via batch commands to set the first
|
||||||
|
argument to MUNG, TECO, or MAKE. The batch files are typically called
|
||||||
|
mung, teco, make, and inspect. (Inspect does a TECO/INSPECT.)
|
||||||
|
Several option switches are allowed on the TECO command line:
|
||||||
|
/IN[SPECT] -- Read file only, don't create an output file.
|
||||||
|
/NOC[REATE] -- If file doesn't exist, don't create it.
|
||||||
|
/NOI[NI] -- Don't execute INI file. (valid for MAKE or MUNG as well)
|
||||||
|
/NOM[EMORY] -- don't save filename as "last edited file" (valid for
|
||||||
|
MAKE also)
|
||||||
|
/NOP[AGE] -- Formfeeds don't stop file reads (valid for MAKE also)
|
||||||
|
/NOR[ENAME] -- Don't rename files, but copy them to keep references correct
|
||||||
|
(OS/2 only)
|
||||||
|
+nnn -- sets NOPAGE and positions dot to line nnn.
|
||||||
|
The part of the switch name in the square brackets is optional. For
|
||||||
|
instance "/IN" is the same as "/INSPECT".
|
||||||
|
MAKE filespec
|
||||||
|
starts tecoc to create file filespec. Does equivalent of EWfilespec$$
|
||||||
|
TECO filespec
|
||||||
|
starts tecoc to edit file filespec. Does equivalent of
|
||||||
|
EBfilespec$Y$
|
||||||
|
TECO filespec2=filespec1
|
||||||
|
starts tecoc to edit filespec1, writing to filespec2. Does
|
||||||
|
equivalent of ERfilespec1$EWfilespec2$Y$$
|
||||||
|
TECO
|
||||||
|
starts tecoc to edit last edited file. Filename is saved in file
|
||||||
|
named teco*.tmp in the current directory, unless overriden
|
||||||
|
(described below).
|
||||||
|
MUNG filespec <args>
|
||||||
|
starts tecoc to execute filespec. Equivalent to
|
||||||
|
I<args>$JEIfilespec$$
|
||||||
|
You can use "TECO @filespec <args>" instead of MUNG.
|
||||||
|
**************
|
||||||
|
The Initialization File.
|
||||||
|
Tecoc mungs (executes as teco commands) the file TECO.INI in the
|
||||||
|
current directory before processing the command line. Initialization
|
||||||
|
can be done instead by defining a TEC$INIT environment variable (the
|
||||||
|
DOS "SET" command does this). The value is either the list of teco
|
||||||
|
commands to execute or a "$" followed by the pathname of the file
|
||||||
|
containing the initialization file. This allows a single, centrally
|
||||||
|
located initialization file.
|
||||||
|
The initialization file can be used to make initial settings. It can
|
||||||
|
return a value, but the value setting is somewhat obscure.
|
||||||
|
Example:
|
||||||
|
set TEC$INIT=1es
|
||||||
|
will cause successful searches to auto-display in all teco sessions.
|
||||||
|
**************
|
||||||
|
Changing the location of the memory file.
|
||||||
|
Define the environment variable TEC$MEMORY to be "$" followed by the
|
||||||
|
pathname of the file designated the memory file.
|
||||||
|
Example:
|
||||||
|
set TEC$MEMORY=$c:\teco.mem
|
||||||
|
will cause the name of the last edit file to be stored in the file
|
||||||
|
teco.mem in the root directory of drive C.
|
||||||
|
**************
|
||||||
|
The Libary directory
|
||||||
|
Defining the environment variable TEC$LIBRARY to be a directory path
|
||||||
|
(including the final "\" or "/") will allow the EI command to fetch
|
||||||
|
teco commands from this directory if the file is not found in the
|
||||||
|
current directory.
|
||||||
|
Example:
|
||||||
|
set TEC$LIBRARY=c:\lib\teco\
|
||||||
|
will cause the directory c:\lib\teco to be searched for teco command files.
|
||||||
|
**************
|
||||||
|
Implemented flags:
|
||||||
|
ED&1 Allow carat "^" character in string searches
|
||||||
|
ED&2 Allow yank and _ unconditionally
|
||||||
|
ED&16 Failed searches preserve dot
|
||||||
|
ED&64 Move dot by one after each match in multiple occurance searches
|
||||||
|
ET&1 Type out in image mode
|
||||||
|
ET&2 Use scope for delete and control-U (default=1)
|
||||||
|
ET&4 Accept lowercase input (default=1)
|
||||||
|
ET&8 ^T reads without echo
|
||||||
|
ET&32 ^T reads with no wait
|
||||||
|
ET&128 MUNG mode (abort on error) cleared by "*" prompt
|
||||||
|
ET&2048 Swap backspace and delete (default=1)
|
||||||
|
ET&4096 We are using 8 bit characters (default=1)
|
||||||
|
ET&32768 Trap control-C
|
||||||
|
EZ&2 Don't rename files, copy them (OS/2 Version)
|
||||||
|
EZ&128 Don't stop read on formfeeds
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,212 @@
|
||||||
|
NULL ignored
|
||||||
|
^A output message to terminal
|
||||||
|
^B current date
|
||||||
|
^C interrupt
|
||||||
|
^D set radix to decimal
|
||||||
|
^E form feed flag
|
||||||
|
^E<n> (match char) match ASCII code n
|
||||||
|
^E[] (match char) match one of list
|
||||||
|
^EA (match char) match alphabetics
|
||||||
|
^EB (match char) match separator character
|
||||||
|
^EC (match char) match symbol constituent
|
||||||
|
^ED (match char) match digit
|
||||||
|
^EGq (match char) match contents of q-register
|
||||||
|
^EL (match char) match line terminators
|
||||||
|
^EMx (match char) match any number of x
|
||||||
|
^EQq (string build char) use contents of q-register q
|
||||||
|
^ER (match char) match alphanumerics
|
||||||
|
^ES (match char) match spaces and/or tabs
|
||||||
|
^EUq (string build char) use ASCII code in q-register
|
||||||
|
^EV (match char) match lowercase
|
||||||
|
^EW (match char) match uppercase
|
||||||
|
^EX (match char) match anything
|
||||||
|
^F not implemented
|
||||||
|
^G^G kill command string
|
||||||
|
^G<SP> retype current command line
|
||||||
|
^G* retype entire current command line
|
||||||
|
^H current time
|
||||||
|
BS immediate mode: back up one line and type one line
|
||||||
|
TAB insert tab and text
|
||||||
|
LF ignored in commands
|
||||||
|
LF immediate mode: advance one line and type one line
|
||||||
|
VT not a TECO command
|
||||||
|
FF output a form feed to terminal
|
||||||
|
CR ignored
|
||||||
|
^N end of file flag
|
||||||
|
^Nx (match char) match any character but x
|
||||||
|
^O set radix to octal
|
||||||
|
^P not a TECO command
|
||||||
|
n^Q convert line offset to character offset
|
||||||
|
^Qx (string char) use x literally
|
||||||
|
^R value of current radix
|
||||||
|
n^R set radix to n
|
||||||
|
^Rx (string char) use x literally
|
||||||
|
^S -(length of last inserted string or found search string)
|
||||||
|
^S immediate mode: not yet implemented
|
||||||
|
^S (match char) match any separator character
|
||||||
|
^T ASCII value of next character typed in
|
||||||
|
n^T output character whose ASCII value is n to the terminal screen
|
||||||
|
^U (command line) erase current command line
|
||||||
|
^Uq put string into q-register
|
||||||
|
:^Uq append string to q-register
|
||||||
|
n^Uq put ASCII character "n" into q-register
|
||||||
|
n:^Uq append ASCII "n" to q-register
|
||||||
|
^V convert search strings to lowercase
|
||||||
|
^Vx (string char) convert x to lowercase
|
||||||
|
^W convert search strings to uppercase
|
||||||
|
^Wx (string char) convert x to uppercase
|
||||||
|
^X search mode flag
|
||||||
|
^X (match char) match any character
|
||||||
|
^Y equivalent to ".+^S,."
|
||||||
|
^Z size of text in all q-registers, plus command line
|
||||||
|
^Z^Z^Z quit TECO, leave everything as it was before TECO was entered
|
||||||
|
ESC command and string terminator
|
||||||
|
^[ like ESC
|
||||||
|
^\ not a TECO command
|
||||||
|
^] not a TECO command
|
||||||
|
^^x ASCII value of x
|
||||||
|
n^_ ones complement of n
|
||||||
|
SP ignored
|
||||||
|
! define tag
|
||||||
|
n"< test for less than zero
|
||||||
|
n"= test for equal to zero
|
||||||
|
n"> test for greater than zero
|
||||||
|
n"A test for alphabetic
|
||||||
|
n"C test for symbol constituent
|
||||||
|
n"D test for digit
|
||||||
|
n"E test for equal to zero
|
||||||
|
n"F test for false
|
||||||
|
n"G test for greater than zero
|
||||||
|
n"L test for less than zero
|
||||||
|
n"N test for not equal to zero
|
||||||
|
n"R test for alphanumeric
|
||||||
|
n"S test for successful
|
||||||
|
n"T test for true
|
||||||
|
n"U test for unsuccessful
|
||||||
|
n"V test for lowercase
|
||||||
|
n"W test for uppercase
|
||||||
|
# logical OR
|
||||||
|
$ separate TECO commands
|
||||||
|
n%q add n to q-register q, return the result
|
||||||
|
& logical AND
|
||||||
|
' end of conditional
|
||||||
|
( numeric expression grouping
|
||||||
|
) numeric expression grouping
|
||||||
|
* multiplication
|
||||||
|
*q immediate mode: save last command string in q-register q
|
||||||
|
+ addition
|
||||||
|
, numeric argument separator
|
||||||
|
- subtraction or negation
|
||||||
|
. current pointer position
|
||||||
|
/ division
|
||||||
|
/ immediate mode: type detailed explanation of error
|
||||||
|
0-9 numeric argument constructors
|
||||||
|
: modify next command
|
||||||
|
n; exit iteration of n is greater than or equal to zero
|
||||||
|
n:; exit iteration if n is less than or equal to zero
|
||||||
|
n< iterate n times
|
||||||
|
n= type n in decimal
|
||||||
|
n== type n in octal
|
||||||
|
n=== type n in hexadecimal
|
||||||
|
n:= type n in decimal, no carriage return
|
||||||
|
n:== type n in octal, no carriage return
|
||||||
|
n:=== type n in hexadecimal, no carriage return
|
||||||
|
> end iteration
|
||||||
|
? toggle trace mode
|
||||||
|
? immediate mode: type out erroneous command string
|
||||||
|
@ modify next text argument
|
||||||
|
A append next input page to edit buffer
|
||||||
|
nA ASCII value of character at .+n
|
||||||
|
n:A append n lines to input buffer
|
||||||
|
B always zero. represents beginning of edit buffer
|
||||||
|
nC advance n characters
|
||||||
|
nD delete n characters
|
||||||
|
m,nD delete between m and n (same as m,nK)
|
||||||
|
E%q write q-register to file
|
||||||
|
nE_ destructive search without page protection
|
||||||
|
EA select secondary output stream
|
||||||
|
EB open input and output files
|
||||||
|
EC copy input file to output file and close files
|
||||||
|
nEC not yet implemented
|
||||||
|
ED edit mode flag
|
||||||
|
EF close output file
|
||||||
|
EH help level flag
|
||||||
|
EI open indirect command file
|
||||||
|
EK kill output file
|
||||||
|
EL open log file
|
||||||
|
EN wildcard lookup
|
||||||
|
EO return version number of TECO
|
||||||
|
EP select secondary input stream
|
||||||
|
EQq read from file into q-register
|
||||||
|
ER open input file
|
||||||
|
ES search verification flag
|
||||||
|
ET type out control flag
|
||||||
|
EU case flagging flag
|
||||||
|
EV edit verify flag
|
||||||
|
EW open output file
|
||||||
|
EX close files and exit
|
||||||
|
EY read without yank protection
|
||||||
|
nF_ destructive search and replace
|
||||||
|
F' flow to end of conditional
|
||||||
|
F< flow to start of iteration
|
||||||
|
F> flow to end of iteration
|
||||||
|
F| flow to ELSE part of conditional
|
||||||
|
m,nFB search between locations m and n
|
||||||
|
nFB search, bounded by n lines
|
||||||
|
m,nFC search and replace between m and n
|
||||||
|
nFC search and replace over n lines
|
||||||
|
nFD search for and delete string
|
||||||
|
nFK search for string and delete intervening text
|
||||||
|
nFN paged search and replace
|
||||||
|
FR replace last string
|
||||||
|
nFS search and replace
|
||||||
|
Gq get string from q-register into edit buffer
|
||||||
|
G* get string from filespec buffer into edit buffer
|
||||||
|
G_ get string from search buffer into edit buffer
|
||||||
|
:Gq type text in q-register q
|
||||||
|
:G* type filespec
|
||||||
|
:G_ type search string
|
||||||
|
H equivalent to B,Z
|
||||||
|
I insert text
|
||||||
|
nI insert character whose ASCII value is n
|
||||||
|
nJ move pointer to J
|
||||||
|
nK kill n lines
|
||||||
|
m,nK delete between m and n (same as m,nD)
|
||||||
|
nL advance n lines
|
||||||
|
Mq execute commands in q-register
|
||||||
|
nN paged search
|
||||||
|
O go to label
|
||||||
|
nO goto selected label in list
|
||||||
|
nP advance n pages
|
||||||
|
m,nP write out characters m to n
|
||||||
|
nPW write edit buffer n times
|
||||||
|
m,nPW write out characters m to n
|
||||||
|
Qq number in q-register q
|
||||||
|
:Qq size of text in q-register q
|
||||||
|
nR back up n characters
|
||||||
|
nS search for nth occurrence of a string
|
||||||
|
::S compare string
|
||||||
|
nT type n lines
|
||||||
|
m,nT type characters between m and n
|
||||||
|
nUq put n into q-register q
|
||||||
|
nV view n lines
|
||||||
|
m,nV view m lines before, n lines after pointer
|
||||||
|
W not yet implemented
|
||||||
|
nXq put n lines into q-register q
|
||||||
|
m,nXq put character m through n into q-register q
|
||||||
|
n:Xq append n lines to q-register q
|
||||||
|
m,n:Xq append characters m through n to q-register q
|
||||||
|
Y yank a page into the edit buffer
|
||||||
|
Z end of buffer (number of characters in the edit buffer)
|
||||||
|
[q push q-register q onto q-register stack
|
||||||
|
\ value of string in edit buffer
|
||||||
|
n\ convert n to digits in edit buffer
|
||||||
|
]q pop q-register stack into q-register q
|
||||||
|
n_ destructive paged search
|
||||||
|
` not a TECO command
|
||||||
|
a-z treated as uppercase equivalents
|
||||||
|
{ not a TECO command
|
||||||
|
| start of ELSE part of conditional
|
||||||
|
} not a TECO command
|
||||||
|
~ not a TECO command
|
||||||
|
DEL not a TECO command
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
ED#2EDFilename(s): ^UBenEI<UAQA-127"E8328HKGBB,Z-1XBHK|QA-27"E13101;|QA-13"E0,32ET32,0ET1;|QA:^UB'''>27:^UB27:^UBMB@^UB\0UX<HK:EN"SIEBG*27I27IHXEMEY0UW0UZ<:FN\Search string: UAQA-27"E1UE|0UEON1'<UA!N1!QA-127"E8328HKGBB,Z-1XBHK|QA-27"E13101;|QA-13"EQE"E0,32ET32,0ET1;|QA:^UB:^UB'|QA:^UB'''>27:^UBNew string to replace search string: UAQA-27"E1UE|0UEON2'<UA!N2!QA-127"E8328HKGBB,Z-1XBHK|QA-27"E13101;|QA-13"EQE"E0,32ET32,0ET1;|QA:^UB:^UB'|QA:^UB'''>@:^UB\"SQW"E1UX1310:G*1310101UW'V1UZ|1;'>QZ"NEC|EK'|1;'>QX"ENo matches.'ex\27:^UBMB
|
||||||
|
|
@ -0,0 +1,237 @@
|
||||||
|
! This TECO macro written by Pete Siemsen of Midcom (Orange, Ca.) to !
|
||||||
|
! run under VAX/VMS V2.3 running TECO V36, 9-Mar-1982 !
|
||||||
|
! !
|
||||||
|
! This TECO macro changes one string to another in a set of files. It prompts!
|
||||||
|
! the user for a file specification (wildcards ok) and two strings: the old !
|
||||||
|
! one and the new one. It then goes through the file(s), making the change. !
|
||||||
|
! It is designed to be a convenient tool for users who are familiar with !
|
||||||
|
! the SEARCH program on most VAXes. CHANGE prompts for input and displays its!
|
||||||
|
! output very like the SEARCH program. Note that the strings prompted for by !
|
||||||
|
! this macro can be delimited: if the first character of the string is an !
|
||||||
|
! <ESC>, then only an <ESC> will terminate the string, else both <ESC> and !
|
||||||
|
! <CR><LF> will terminate the string. !
|
||||||
|
! !
|
||||||
|
! The general way this macro works is to build a hideous TECO command string !
|
||||||
|
! in q-register B, then execute the command string. We need to build the !
|
||||||
|
! string because we have to create an FN command, at least, to make the !
|
||||||
|
! changes. !
|
||||||
|
! !
|
||||||
|
! The following Q-registers are used: !
|
||||||
|
! !
|
||||||
|
! QA number ascii value of text character from the terminal !
|
||||||
|
! !
|
||||||
|
! QW number 0 if we haven't output the file specification of !
|
||||||
|
! the file in which the string was found, 1 if we !
|
||||||
|
! already have. This guy lets us output file specs !
|
||||||
|
! only for those files which contain the string !
|
||||||
|
! !
|
||||||
|
! QX number 0 if no changes have been made, else > 0 !
|
||||||
|
! This is only used to tell us if we should output !
|
||||||
|
! the "No matches." string when we're done. !
|
||||||
|
! !
|
||||||
|
! QZ number 0 if we haven't changed a string in the file, 1 if !
|
||||||
|
! we have. This guy tells us whether to close and kill !
|
||||||
|
! the output file (when no changes were made in the !
|
||||||
|
! file) or to close the output file normally (when !
|
||||||
|
! changes have been made). !
|
||||||
|
! !
|
||||||
|
! QB text This is the biggee. It holds the TECO command string !
|
||||||
|
! we are building. It is used twice, once to build and !
|
||||||
|
! execute the EN command that presets the TECO !
|
||||||
|
! wildcard lookup buffer, and once to build and !
|
||||||
|
! execute the command string that does all the work. !
|
||||||
|
! We could build just one string and execute it, but !
|
||||||
|
! then the user wouldn't know that he's misspelled his !
|
||||||
|
! file specification until after he's typed in the !
|
||||||
|
! old and new strings. !
|
||||||
|
! !
|
||||||
|
! QE text holds an EB command so we can execute it !
|
||||||
|
|
||||||
|
ED#2ED ! make Y command work like it should !
|
||||||
|
|
||||||
|
Filename(s): ! prompt for a file specification !
|
||||||
|
|
||||||
|
! read the wildcard file specification from the terminal and use it !
|
||||||
|
! in a TECO EN command to preset the wildcard lookup file specification !
|
||||||
|
|
||||||
|
@^UB%en% ! put EN in q-register B !
|
||||||
|
|
||||||
|
! Do an EI$ to throw away extraneous input in the type-ahead buffer. See !
|
||||||
|
! page 117-118 of the PDP-11 TECO User's Guide for an explanation of why !
|
||||||
|
! this is necessary. !
|
||||||
|
|
||||||
|
EI
|
||||||
|
<
|
||||||
|
UA ! get a character from the terminal !
|
||||||
|
QA-127"E ! if it's a delete !
|
||||||
|
8 ! send a backspace to the terminal !
|
||||||
|
32 ! send a space to the terminal !
|
||||||
|
8 ! send a backspace to the terminal !
|
||||||
|
HK ! clear the edit buffer !
|
||||||
|
GB ! get contents of q-register B !
|
||||||
|
B,Z-1XB ! copy back all but last character !
|
||||||
|
HK ! clear the edit buffer !
|
||||||
|
| ! else (it's not a delete) !
|
||||||
|
QA-27"E ! if it's an escape !
|
||||||
|
1310 ! output <CR><LF> !
|
||||||
|
1; ! get out of the loop !
|
||||||
|
| ! else (it's not a delete or escape) !
|
||||||
|
QA-13"E ! if it's a <CR> !
|
||||||
|
0,32ET ! set "read with no wait" !
|
||||||
|
! get the line feed that follows !
|
||||||
|
0,32ET ! set "read with wait" !
|
||||||
|
1; ! and get out of the loop !
|
||||||
|
| ! else (not <DEL>, <ESC>, or <CR>) !
|
||||||
|
QA:^UB ! append it to q-register B !
|
||||||
|
' ! endif !
|
||||||
|
' ! endif !
|
||||||
|
' ! endif !
|
||||||
|
>
|
||||||
|
27:^UB ! append an escape to q-register B !
|
||||||
|
27:^UB ! append an escape to q-register B !
|
||||||
|
MB ! execute the command in q-register B !
|
||||||
|
|
||||||
|
! The unsquished code inserted in Q-register B does the following: !
|
||||||
|
! 0UX zero the 'strings changed' flag !
|
||||||
|
! < loop through all files !
|
||||||
|
! HK clear the edit buffer !
|
||||||
|
! :EN^["S try to get a file specification !
|
||||||
|
! IEB^[ start building an EB command !
|
||||||
|
! G* fill in the file specification !
|
||||||
|
! 27I^[ put in the first terminating <ESC> !
|
||||||
|
! 27I^[ put in the second terminating <ESC> !
|
||||||
|
! HXE load the EB command into q-reg E !
|
||||||
|
! ME the EB command opens the file !
|
||||||
|
! Y get the first page of input !
|
||||||
|
! 0UW zero the 'display filespec?' flag !
|
||||||
|
! 0UZ zero the 'save output file?' flag !
|
||||||
|
! < loop for all changes in this file !
|
||||||
|
! :FN make the actual change !
|
||||||
|
|
||||||
|
@^UB%0UX < HK :EN"S IEB G* 27I 27I HXE ME Y 0UW 0UZ < :FN%
|
||||||
|
|
||||||
|
Search string: ! prompt for the search string !
|
||||||
|
|
||||||
|
UA
|
||||||
|
QA-27"E ! if it's an <ESC> !
|
||||||
|
1UE ! set 'escape terminator only' flag !
|
||||||
|
| ! else (first character not <ESC>) !
|
||||||
|
0UE ! clear 'escape terminator only' flag !
|
||||||
|
ON1 ! jump into the loop !
|
||||||
|
' ! endif !
|
||||||
|
|
||||||
|
<
|
||||||
|
UA ! get a character from the terminal !
|
||||||
|
!N1!
|
||||||
|
QA-127"E ! if it's a delete !
|
||||||
|
8 ! send a backspace to the terminal !
|
||||||
|
32 ! send a space to the terminal !
|
||||||
|
8 ! send a backspace to the terminal !
|
||||||
|
HK ! clear the edit buffer !
|
||||||
|
GB ! get contents of q-register B !
|
||||||
|
B,Z-1XB ! copy back all but last character !
|
||||||
|
HK ! clear the edit buffer !
|
||||||
|
| ! else (it's not a delete) !
|
||||||
|
QA-27"E ! if it's an escape !
|
||||||
|
1310 ! output <CR><LF> !
|
||||||
|
1; ! get out of the loop !
|
||||||
|
| ! else (it's not a delete or escape) !
|
||||||
|
QA-13"E ! if it's a <CR> !
|
||||||
|
QE"E ! if carriage returns terminate !
|
||||||
|
0,32ET ! set "read with no wait" !
|
||||||
|
! get the line feed that follows !
|
||||||
|
0,32ET ! set "read with wait" !
|
||||||
|
1; ! and get out of the loop !
|
||||||
|
|
|
||||||
|
QA:^UB
|
||||||
|
:^UB
|
||||||
|
'
|
||||||
|
| ! else (not <DEL>, <ESC>, or <CR>) !
|
||||||
|
QA:^UB ! append it to q-register B !
|
||||||
|
' ! endif !
|
||||||
|
' ! endif !
|
||||||
|
' ! endif !
|
||||||
|
>
|
||||||
|
27:^UB
|
||||||
|
New string to replace search string:
|
||||||
|
UA
|
||||||
|
QA-27"E ! if it's an <ESC> !
|
||||||
|
1UE ! set 'escape terminator only' flag !
|
||||||
|
| ! else (first character not <ESC>) !
|
||||||
|
0UE ! clear 'escape terminator only' flag !
|
||||||
|
ON2 ! jump into the loop !
|
||||||
|
' ! endif !
|
||||||
|
|
||||||
|
<
|
||||||
|
UA ! get a character from the terminal !
|
||||||
|
!N2!
|
||||||
|
QA-127"E ! if it's a delete !
|
||||||
|
8 ! send a backspace to the terminal !
|
||||||
|
32 ! send a space to the terminal !
|
||||||
|
8 ! send a backspace to the terminal !
|
||||||
|
HK ! clear the edit buffer !
|
||||||
|
GB ! get contents of q-register B !
|
||||||
|
B,Z-1XB ! copy back all but last character !
|
||||||
|
HK ! clear the edit buffer !
|
||||||
|
| ! else (it's not a delete) !
|
||||||
|
QA-27"E ! if it's an escape !
|
||||||
|
1310 ! output <CR><LF> !
|
||||||
|
1; ! get out of the loop !
|
||||||
|
| ! else (it's not a delete or escape) !
|
||||||
|
QA-13"E ! if it's a <CR> !
|
||||||
|
QE"E ! if carriage returns terminate !
|
||||||
|
0,32ET ! set "read with no wait" !
|
||||||
|
! get the line feed that follows !
|
||||||
|
0,32ET ! set "read with wait" !
|
||||||
|
1; ! and get out of the loop !
|
||||||
|
|
|
||||||
|
QA:^UB
|
||||||
|
:^UB
|
||||||
|
'
|
||||||
|
| ! else (not <DEL>, <ESC>, or <CR>) !
|
||||||
|
QA:^UB ! append it to q-register B !
|
||||||
|
' ! endif !
|
||||||
|
' ! endif !
|
||||||
|
' ! endif !
|
||||||
|
>
|
||||||
|
|
||||||
|
! The unsquished code appended to Q-register B does the following !
|
||||||
|
! ^[ terminate the :FN command !
|
||||||
|
! "S if a string was found !
|
||||||
|
! QW"E if haven't displayed file spec yet !
|
||||||
|
! 1UX^[ make the 'any found?' flag true !
|
||||||
|
! 13^T display a <CR> !
|
||||||
|
! 10^T display a <LF> !
|
||||||
|
! :G* display the file specification !
|
||||||
|
! 13^T display a <CR> !
|
||||||
|
! 10^T display a <LF> !
|
||||||
|
! 10^T display a <LF> !
|
||||||
|
! 1UW make 'display filespec?' flag false !
|
||||||
|
! ' endif !
|
||||||
|
! V view the changed line !
|
||||||
|
! 1UZ make the 'any found?' flag true !
|
||||||
|
! | else (search string not in file) !
|
||||||
|
! 1; terminate this loop !
|
||||||
|
! ' endif !
|
||||||
|
! > end of loop over the file !
|
||||||
|
! QZ"N if a string was found in this file !
|
||||||
|
! EC close and save the output file !
|
||||||
|
! | else (search string not in file) !
|
||||||
|
! EK close and delete the output file !
|
||||||
|
! ' endif !
|
||||||
|
! | else (no more files) !
|
||||||
|
! 1; terminate this loop !
|
||||||
|
! ' endif !
|
||||||
|
! > end of loop over all files !
|
||||||
|
! QX"E if didn't match the search string !
|
||||||
|
! ^ANo matches.^A tell the user !
|
||||||
|
! ' endif !
|
||||||
|
! ex^[ and we are finally done !
|
||||||
|
|
||||||
|
@:^UB% "S QW"E 1UX 13 10 :G* 13 10 10 1UW ' V 1UZ | 1; ' >
|
||||||
|
QZ"N EC | EK ' | 1; ' > QX"E No matches. ' ex %
|
||||||
|
|
||||||
|
27:^UB
|
||||||
|
|
||||||
|
MB
|
||||||
|
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
Q Register A qA:= :qA=Q Register .A q.A:= :q.A=^T
|
||||||
|
Q Register B qB:= :qB=Q Register .B q.B:= :q.B=^T
|
||||||
|
Q Register C qC:= :qC=Q Register .C q.C:= :q.C=^T
|
||||||
|
Q Register D qD:= :qD=Q Register .D q.D:= :q.D=^T
|
||||||
|
Q Register E qE:= :qE=Q Register .E q.E:= :q.E=^T
|
||||||
|
Q Register F qF:= :qF=Q Register .F q.F:= :q.F=^T
|
||||||
|
Q Register G qG:= :qG=Q Register .G q.G:= :q.G=^T
|
||||||
|
Q Register H qH:= :qH=Q Register .H q.H:= :q.H=^T
|
||||||
|
Q Register I qI:= :qI=Q Register .I q.I:= :q.I=^T
|
||||||
|
Q Register J qJ:= :qJ=Q Register .J q.J:= :q.J=^T
|
||||||
|
Q Register K qK:= :qK=Q Register .K q.K:= :q.K=^T
|
||||||
|
Q Register L qL:= :qL=Q Register .L q.L:= :q.L=^T
|
||||||
|
Q Register M qM:= :qM=Q Register .M q.M:= :q.M=^T
|
||||||
|
Q Register N qN:= :qN=Q Register .N q.N:= :q.N=^T
|
||||||
|
Q Register O qO:= :qO=Q Register .O q.O:= :q.O=^T
|
||||||
|
Q Register P qP:= :qP=Q Register .P q.P:= :q.P=^T
|
||||||
|
Q Register Q qQ:= :qQ=Q Register .Q q.Q:= :q.Q=^T
|
||||||
|
Q Register R qR:= :qR=Q Register .R q.R:= :q.R=^T
|
||||||
|
Q Register S qS:= :qS=Q Register .S q.S:= :q.S=^T
|
||||||
|
Q Register T qT:= :qT=Q Register .T q.T:= :q.T=^T
|
||||||
|
Q Register U qU:= :qU=Q Register .U q.U:= :q.U=^T
|
||||||
|
Q Register V qV:= :qV=Q Register .V q.V:= :q.V=^T
|
||||||
|
Q Register W qW:= :qW=Q Register .W q.W:= :q.W=^T
|
||||||
|
Q Register X qX:= :qX=Q Register .X q.X:= :q.X=^T
|
||||||
|
Q Register Y qY:= :qY=Q Register .Y q.Y:= :q.Y=^T
|
||||||
|
Q Register Z qZ:= :qZ=Q Register .Z q.Z:= :q.Z=^T
|
||||||
|
Q Register 0 q0:= :q0=Q Register .0 q.0:= :q.0=^T
|
||||||
|
Q Register 1 q1:= :q1=Q Register .1 q.1:= :q.1=^T
|
||||||
|
Q Register 2 q2:= :q2=Q Register .2 q.2:= :q.2=^T
|
||||||
|
Q Register 3 q3:= :q3=Q Register .3 q.3:= :q.3=^T
|
||||||
|
Q Register 4 q4:= :q4=Q Register .4 q.4:= :q.4=^T
|
||||||
|
Q Register 5 q5:= :q5=Q Register .5 q.5:= :q.5=^T
|
||||||
|
Q Register 6 q6:= :q6=Q Register .6 q.6:= :q.6=^T
|
||||||
|
Q Register 7 q7:= :q7=Q Register .7 q.7:= :q.7=^T
|
||||||
|
Q Register 8 q8:= :q8=Q Register .8 q.8:= :q.8=^T
|
||||||
|
Q Register 9 q9:= :q9=Q Register .9 q.9:= :q.9=^T
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
!DATE.TES!EI[M[D[Y[W[H[M[S[0[1U0(Q0/32)&15UM(Q0)&31UD(Q0/512)UYQDUW
|
||||||
|
QM-2"=31%W'QM-3"=59%W'QM-4"=90%W'QM-5"=120%W'QM-6"=151%W'QM-7"=181%W'
|
||||||
|
QM-8"=212%W'QM-9"=243%W'QM-10"=273%W'QM-11"=304%W'QM-12"=334%W'QY&3"=
|
||||||
|
QW-59">1%W''QY+QW+(QY-1/4)U1Q1-(Q1/7*7)U1Q1"=WSUN'Q1-1"=WMON'
|
||||||
|
Q1-2"=WTUE'Q1-3"=WWED'Q1-4"=WTHU'Q1-5"=WFRI'Q1-6"=WSAT'*2U0
|
||||||
|
Q0/3600UHQH*3600U1(Q0-Q1)/60UN(Q0-Q1)-(QN*60)US:GW32QM-10"<48'QM:=
|
||||||
|
47QD-10"<48'QD:=471900+QY:=32QH-10"<48'QH:=58QN-10"<48'QN:=58
|
||||||
|
QS-10"<48'QS=]1]0]S]M]H]W]Y]D]M
|
||||||
|
|
@ -0,0 +1,96 @@
|
||||||
|
!DATE.TEC!
|
||||||
|
! display the current date and time: !
|
||||||
|
! ^B == ((year-1900)*16+month)*32+day !
|
||||||
|
! ^H == (seconds since midnight)/2 !
|
||||||
|
|
||||||
|
ei
|
||||||
|
|
||||||
|
[M[D[Y[W[H[M[S[0[1 ! save used Q-reg's !
|
||||||
|
|
||||||
|
! Get MM/DD/YYYY in Q-reg's M,D,Y !
|
||||||
|
^B U0 ! 0.num = encoded date !
|
||||||
|
(Q0/32) & 15 UM ! M.num = month !
|
||||||
|
(Q0) & 31 UD ! D.num = day !
|
||||||
|
(Q0/512) UY ! Y.num = year !
|
||||||
|
|
||||||
|
! Get day of week in Q-reg W !
|
||||||
|
QD UW ! W.num = days this month !
|
||||||
|
QM-2 "= 31%W | ! add days before this month !
|
||||||
|
QM-3 "= 59%W |
|
||||||
|
QM-4 "= 90%W |
|
||||||
|
QM-5 "= 120%W |
|
||||||
|
QM-6 "= 151%W |
|
||||||
|
QM-7 "= 181%W |
|
||||||
|
QM-8 "= 212%W |
|
||||||
|
QM-9 "= 243%W |
|
||||||
|
QM-10 "= 273%W |
|
||||||
|
QM-11 "= 304%W |
|
||||||
|
QM-12 "= 334%W '''''''''''
|
||||||
|
QY & 3 "= ! correct for leap years !
|
||||||
|
QW-59 ">
|
||||||
|
1%W
|
||||||
|
'
|
||||||
|
'
|
||||||
|
QY+QW+(QY-1/4) U1
|
||||||
|
Q1-(Q1/7*7) U1
|
||||||
|
Q1-0"= @^UW%Sunday% |
|
||||||
|
Q1-1"= @^UW%Monday% |
|
||||||
|
Q1-2"= @^UW%Tuesday% |
|
||||||
|
Q1-3"= @^UW%Wednesday% |
|
||||||
|
Q1-4"= @^UW%Thursday% |
|
||||||
|
Q1-5"= @^UW%Friday% |
|
||||||
|
Q1-6"= @^UW%Saturday% '''''''
|
||||||
|
|
||||||
|
|
||||||
|
QM-1"= @^UM%January% | ! get name of month in Q-reg M !
|
||||||
|
QM-2"= @^UM%February% |
|
||||||
|
QM-3"= @^UM%March% |
|
||||||
|
QM-4"= @^UM%April% |
|
||||||
|
QM-5"= @^UM%May% |
|
||||||
|
QM-6"= @^UM%June% |
|
||||||
|
QM-7"= @^UM%July% |
|
||||||
|
QM-8"= @^UM%August% |
|
||||||
|
QM-9"= @^UM%September% |
|
||||||
|
QM-10"= @^UM%October% |
|
||||||
|
QM-11"= @^UM%November% |
|
||||||
|
QM-12"= @^UM%December% ''''''''''''
|
||||||
|
|
||||||
|
! Get HH:MM:SS in Q-reg's H,N,S !
|
||||||
|
^H*2 U0 ! 0.num = second's since midnight !
|
||||||
|
Q0/3600 UH ! H.num = hours !
|
||||||
|
QH*3600 U1 ! 1.num = hours (in seconds) !
|
||||||
|
(Q0-Q1)/60 UN ! N.num = minutes !
|
||||||
|
(Q0-Q1)-(QN*60) US ! S.num = seconds !
|
||||||
|
|
||||||
|
! Display DAY MM/DD/YYYY !
|
||||||
|
:GW ! display DAY !
|
||||||
|
32 ! display <SP> !
|
||||||
|
|
||||||
|
:GM ! display MONTH !
|
||||||
|
32 ! display <SP> !
|
||||||
|
|
||||||
|
! QM-10"< 48^T ' display leading zero? !
|
||||||
|
! QM:= display MM !
|
||||||
|
! 47^T display / !
|
||||||
|
|
||||||
|
QD-10"< 48^T ' ! display leading zero? !
|
||||||
|
QD:= ! display DD !
|
||||||
|
! 47^T display / !
|
||||||
|
44 ! display , !
|
||||||
|
32 ! display <SP> !
|
||||||
|
|
||||||
|
1900+QY := ! display YYYY !
|
||||||
|
32 ! display <SP> !
|
||||||
|
|
||||||
|
! Display HH:MM:DD !
|
||||||
|
QH-10"< 48^T ' ! display leading zero? !
|
||||||
|
QH:= ! display HH !
|
||||||
|
58^T ! display : !
|
||||||
|
QN-10"< 48^T ' ! display leading zero? !
|
||||||
|
QN:= ! display MM !
|
||||||
|
58^T ! display : !
|
||||||
|
QS-10"< 48^T ' ! display leading zero? !
|
||||||
|
QS= ! display SS<CR><LF> !
|
||||||
|
|
||||||
|
]1]0]S]M]H]W]Y]D]M ! restore used Q-reg's !
|
||||||
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
|
||||||
|
********************************************************
|
||||||
|
This macro will read the file and transform all <TAB>
|
||||||
|
characters into the appropriate number of <SPACE> chars.
|
||||||
|
Note that tab stops are assumed to be at every 8 spaces.
|
||||||
|
********************************************************
|
||||||
|
FEBH:XF27:FHKMFY<:N "U1;'.UB0L.UAQB-QAUC<QC-9"L1;'-8%C>9-QCUD
|
||||||
|
S -DQD<I >>EX
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
! Author: John Guidi, sped up by Pete Siemsen
|
||||||
|
Date: 20-July-79
|
||||||
|
|
||||||
|
Useage: MUNG DETAB filespec
|
||||||
|
|
||||||
|
Abstract: All tabs in the file specified will be replaced with
|
||||||
|
spaces. Tab stops are assumed to be at every 8 spaces.
|
||||||
|
!
|
||||||
|
|
||||||
|
|
||||||
|
********************************************************
|
||||||
|
This macro will read the file and transform all <TAB>
|
||||||
|
characters into the appropriate number of <SPACE> chars.
|
||||||
|
Note that tab stops are assumed to be at every 8 spaces.
|
||||||
|
********************************************************
|
||||||
|
|
||||||
|
|
||||||
|
@^UF%EB% ! set F up with EB command !
|
||||||
|
H:XF ! append filespec to F !
|
||||||
|
27@:^UF%% ! append <ESC> to F !
|
||||||
|
|
||||||
|
HK ! clear text buffer !
|
||||||
|
MF ! execute F to open input and output files !
|
||||||
|
Y ! pull first page into text buffer !
|
||||||
|
|
||||||
|
<
|
||||||
|
:@N/ /"U1;' ! search for a tab, leave loop when unsuccessful !
|
||||||
|
.UB ! put current pointer in B !
|
||||||
|
0L .UA ! put pointer to begining of line in A !
|
||||||
|
QB-QAUC ! put how many characters up to TAB in C !
|
||||||
|
< ! subtract 8 until QC is less than 9 !
|
||||||
|
QC-9"L
|
||||||
|
1;
|
||||||
|
'
|
||||||
|
-8%C
|
||||||
|
>
|
||||||
|
9-QCUD ! put number of spaces into D !
|
||||||
|
@S/ /-D ! find the tab again and delete it !
|
||||||
|
QD< ! insert the spaces !
|
||||||
|
@I/ /
|
||||||
|
>
|
||||||
|
>
|
||||||
|
EX ! close files !
|
||||||
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
!dir.tes-display directory![0[1[2.U0ZJ.U10U21*.*Q1"N80-Q1"G0,Q1X1''
|
||||||
|
EN^eq1Q1J<:EN;G*(1%2)-5"E13I10I0U2|15+<32I>'>Q1,ZTQ1,ZKQ0J]2]1]0
|
||||||
|
|
||||||
|
|
@ -0,0 +1,32 @@
|
||||||
|
!dir.tes-display directory!
|
||||||
|
[0 [1 [2 ! save Q-regs 0-2 !
|
||||||
|
.u0 ! remember where we are !
|
||||||
|
zj ! jump to end of buffer !
|
||||||
|
.u1 ! remember old end of buffer !
|
||||||
|
0u2 ! zero column count !
|
||||||
|
@^u1%*.*% ! default is get dir of everything !
|
||||||
|
q1"n ! is buffer not empty? !
|
||||||
|
80-q1"g ! is buffer length < maxpath? !
|
||||||
|
0,q1x1 ! assume edit buf = filespec !
|
||||||
|
' ! endif !
|
||||||
|
' ! endif !
|
||||||
|
en^eq1 ! preset wildcard lookup !
|
||||||
|
q1j ! jump to end of buffer !
|
||||||
|
< ! <build filename display !
|
||||||
|
:en; ! return filename, break if none !
|
||||||
|
g* ! put filename into edit buffer !
|
||||||
|
(1%2)-5"e ! is fifth and final column? !
|
||||||
|
13@i%% ! insert <CR> !
|
||||||
|
10@i%% ! insert <LF> !
|
||||||
|
0u2 ! reset column count !
|
||||||
|
| ! else !
|
||||||
|
15+^S< ! <do column mod 15 times !
|
||||||
|
32@i%% ! insert <SPACE> !
|
||||||
|
> ! > !
|
||||||
|
' ! endif !
|
||||||
|
> ! > !
|
||||||
|
q1,zt ! display what we built !
|
||||||
|
q1,zk ! kill what we built !
|
||||||
|
q0j ! jump to where we were !
|
||||||
|
]2 ]1 ]0 ! restore Q-regs 0-2 !
|
||||||
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
@^ul/<0a-13"e1;'0a"w0a+32id|c'>v/
|
||||||
|
q - register L loaded
|
||||||
|
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
This TECO macro makes a TECO command string printable by converting
|
||||||
|
escape characters to dollar signs and all control characters to the
|
||||||
|
tilde-character string which is usually printed on the terminal, except
|
||||||
|
for ^I (tab), ^M (cr), ^L (ff), and ^J (lf).
|
||||||
|
<Z-."E1;'0A-31"GCF<'0A-27"EI$DF<'0A-13"ECF<'0A-10"ECF<'0A-9"ECF<'
|
||||||
|
0A-12"ECF<'I^0A+64ID>
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
This TECO macro makes a TECO command string printable by converting
|
||||||
|
escape characters to dollar signs and all control characters to the
|
||||||
|
tilde-character string which is usually printed on the terminal, except
|
||||||
|
for ^I (tab), ^M (cr), ^L (ff), and ^J (lf).
|
||||||
|
|
||||||
|
<
|
||||||
|
z-."e1;' ! if at end of buffer, exit the loop !
|
||||||
|
0a-31"gcf<' ! it it's already printable, skip it !
|
||||||
|
0a-27"ei$df<' ! if it's ESCAPE, make it into a dollar-sign !
|
||||||
|
0a-13"ecf<' ! if it's carriage return, skip it !
|
||||||
|
0a-10"ecf<' ! if it's line feed, skip it !
|
||||||
|
0a-9"ecf<' ! if it's TAB, skip it !
|
||||||
|
0a-12"ecf<' ! if it's form feed, skip it !
|
||||||
|
i^0a+64id
|
||||||
|
>
|
||||||
|
|
||||||
|
|
@ -0,0 +1,80 @@
|
||||||
|
!SQU.TEC V40.00!@F0ED0ET&128"N0,0XP'0,128ETJ<@FS%^ES%%;>J:S/UB
|
||||||
|
QB"TET&64"E
|
||||||
|
''@R\[0[1[2[3+0U3X0K.U1ZJ.U2Q3&127"R|
|
||||||
|
?Invalid Q-register in INPLIN
|
||||||
|
OEXIT'IQ2,.XQ3&127IQ2,.X1Q2,.K!PROMPT!13ET&512"N0,1ET271,0ET
|
||||||
|
0:W-4"E['J|10'.-Q2+(0)"G0T|:G0Q2,ZT'!GETCH!U0Q0-127"EZ-Q2"N-D'
|
||||||
|
OPROMPT'Q0-21"EQ2,ZKOPROMPT'Q0-18"E1310:G0Q2,ZTOGETCH'Q0-26"E
|
||||||
|
Q2,ZK%0'Q0-27"E1310ODONE'Q3&128"EQ0-10"E13ODONE'Q0-13"EODONE'
|
||||||
|
'Q0IOGETCH!DONE!M1Q2,.K!EXIT!Q1J]3]2]1]0\0,0X9J:@FS%/D%%"S
|
||||||
|
::@FS%:%%"S0AQD|QY'|QB"TQ|IDelete CR/LF (Y/N) <N>? QMR''0QQ"A
|
||||||
|
0QQ&95-Y"E9DA.......TD..D.......U....Z...V.D''!BADNUM!0UO:Q9"NJ
|
||||||
|
:@FS%/L%%"S%/L specified with /D, /L ignored
|
||||||
|
::@FS%:%%"S0A"D<D.-Z;0A"D>'|D'''|J:@FS%/L%%"S::@FS%:%%"S0AQ0A"D<D
|
||||||
|
.-Z;0A"D0A:Q>'|D'|QY'|QB"TQ|
|
||||||
|
ISet line lengths (Y for 70, N, or length) <N>? QMR''0QQ"A
|
||||||
|
0QQ&95-Y"E9DA.......TO..O.......U....Z...V.O70UO''0QQ"D.UQZJGQC\UO
|
||||||
|
D.-Z"NZKQQJOBADNUM'QQJQO"EOBADNUM'
|
||||||
|
9DA.......TO..O.......U....Z...V.O'':Q9"NJ:@FS%/B%%"S::@FS%:%%"S
|
||||||
|
0A-N"E%/B:N specified with /D or /L, /B:N ignored
|
||||||
|
'D''|J:@FS%/B%%"S::@FS%:%%"S0AQD|QY'|QB"TQ|
|
||||||
|
IDelete blank lines (Y/N) <N>? QMR''0QQ"A0QQ&95-Y"E
|
||||||
|
9DA.......TB..........U....Z...V.D''':Q9"E
|
||||||
|
9DA.......T...........U....Z...V.D'J:@FS%/T%%"S::@FS%:%%"S0AQD|
|
||||||
|
QY'|QB"TQ|IDelete lexical TABs and FORM FEEDs (Y/N) <N>? QMR''
|
||||||
|
0QQ"A0QQ&95Q'0QQ-Y"EJG99JDIO12JDIOJ0,33X90,33K'CJ:@FS%/C%%"S
|
||||||
|
::@FS%:%%"S0AQD|QY'|QB"TQ|
|
||||||
|
IDelete comments (Y for SP/TAB, N, or set) <N>? QMR'':QQ"EQN'0QQUQ
|
||||||
|
QQ"VQQ-32UQ'QQ-N"E:9A|:9CQQ-Y"E32C9:C|GQXCK''
|
||||||
|
:91..1..........................:9@....EF1.$...1$$.1.$.1..1..1.1^$
|
||||||
|
:9.LLLLLLLLLLLLLLLLLLLLLLLLLL....D8/#*&\?()$!@1U8126<Q8:8%8>W
|
||||||
|
ET&512"EJ:@FS%/W%%"S::@FS%:%%"SD''|J:@FS%/W%%"S::@FS%:%%"S0AQD|QY'
|
||||||
|
|QB"TQ|IWatch progress (Y/N) <N>? QMR''0QQ"A0QQ&95-Y"E0:W-2"E
|
||||||
|
4,0:W'W-1W'''KJ:@FS%/A%%"S::@FS%:%%"S0AQD|QY'|QB"TQY|
|
||||||
|
IAutomatic mode (Y for %, N, or set) <N>? QMR'':QQ"N0QQUQQQ"VQQ-32UQ
|
||||||
|
'QQ-N"NQQ-Y"E%K|GQXKK'''0UHJ:@FS%/E%%"S::@FS%:%%"S0AQD|QY'|
|
||||||
|
QB"TQ|IAllow adjacent ESCapes (Y/N) <N>? QMR''0QQ"A0QQ&95-Y"E-1UH
|
||||||
|
''@Z*[10U1:QW"N-1,3:W0,4:W0,5:W'<!..!MW!.!ME;0AU0Q0"LOOFFEND'C
|
||||||
|
Q0&128"NQ0&127U0-DQ0I'!DISP!Q0Q90O^EQ0!L!Q0-32U0-DQ0IODISP!^!
|
||||||
|
0A&31U0C-2DQH"FQ0-27"E0A-27"EI^[CO..'.US0UT<-.;R0AUTQT&128"EQT-10"N
|
||||||
|
0;|-.;-1A-128-13"N0;'''>QSJQT-27"EI '''Q0IODISP!B!-1+2"E-2D'O..
|
||||||
|
!O!-D."N-1A&128"N-D'.-1"G-1A-10"E-2A-128-13"EQ0-13"E-2D|O..''''
|
||||||
|
Q0#128IQ0-13"E.-Z"E10IR'0A&127-10"ED'10I''O..!U!271.UC0AU0C
|
||||||
|
Q0-."E0AU0C'Q0"VQ0-32U0-DQ0I'Q1"T0A-(1A)"EO$$'|0A-27"EO$$''.USQ1"T
|
||||||
|
0A1D':QW"N:S^EQ1"UOSTRINGFAIL'.,4:WQSJMW':QK"E:QW"E0T10T'7ETUQ
|
||||||
|
ET#8#4-4ETU0QQET|G1R::S^EGK"S-DNU0|DYU0'':QW"N0,4:W32768W'Q0-Y"E
|
||||||
|
[E[C[SE-1UE0A-^^0Q1:E:E"E0UE'QEMZ]S]C]E"NOPRIORFAIL'CO$$$$'
|
||||||
|
O$$$!T!0U1!$!271.UC!$$!.USQ1"T0A1D'!$$$!:S^EQ1"UOSTRINGFAIL'
|
||||||
|
!$$$$!-D.UT27U0!AA!Q00QT-QS"GQSJ.,.+QT-QS:FB^EQ0"SG8:X1K0U0<
|
||||||
|
Q0Q10QSJ.,.+QT-QSFB^EQ0;%0-:Q8"EONOQUOTE'>Q0Q1U0QSJQ0IQC-1JI@
|
||||||
|
2%T''QTJQ0I0U1O..!1!0A-."EC'0A"V0A-32U0DQ0IO.'!V!CO.!@!-1U1!D!
|
||||||
|
-DO.!F!271.UC0AU0CQ0"VQ0-32U0-DQ0I'Q0-B"EO$$'Q0-C"EOF$$'
|
||||||
|
Q0-R"EO$$'Q0-S"EOF$$'Q0-N"EOF$$'Q0-_"EOF$$'O.!F$$!.US271
|
||||||
|
Q1"T0A1D':S^EQ1"UOSTRINGFAIL'-D.UT:S^EQ1"UOSTRINGFAIL'-D.UUQH"T
|
||||||
|
27U0Q00QU-QS"GQSJ.,.+QU-QS:FB^EQ0"UOF0'|OF0'|QU-QT"G27U0Q00QSJ
|
||||||
|
.,.+QU-QS:FB^EQ0"UOF0'''G8:X1K0U0<Q0Q10QSJ.,.+QU-QSFB^EQ0;
|
||||||
|
%0-:Q8"EONOQUOTE'>Q0Q1U0QSJQ0IQC-1JI@2%T2%U!F0!QTJQ0IQU-QTCQ0I
|
||||||
|
0U1O..!A!Q01.UC.USQ1"T0A1D':S^EQ1"UOSTRINGFAIL'-D.UTOAA!C!
|
||||||
|
::S^EGC"UOA'R.UCQ01Q1"T0A1D':S^EQ1"UOSTRINGFAIL'QC-1,.K0U1O..
|
||||||
|
!E!271.UC0AU0CQ0"VQ0-32U0-DQ0I'Q0-B"EO$$'Q0-G"EO$$'Q0-I"EO$$'
|
||||||
|
Q0-N"EO$$'Q0-R"EO$$'Q0-W"EO$$'Q0-_"EO$$'O.!Z!-DI^ZO..>Q1"T
|
||||||
|
1Trailing, pending @OERROR'0U10"N!OFFEND!
|
||||||
|
1End of buffer while sub-squishingOERROR!NOQUOTE!
|
||||||
|
1Can't find a quote characterOSETPOS!PRIORFAIL!
|
||||||
|
1Prior recursion level failedOSETPOS!STRINGFAIL!
|
||||||
|
1Unterminated string!SETPOS!:1 from squished .=QC\:X1K13:1
|
||||||
|
10:1QCJ0+.,.:X1|:110:1|:1.,+.:X1!ERROR!ZJMW0,0XW7?:G17
|
||||||
|
1310-1U1'Q1]1*@A*-1E.-ZQO"NZJI 'JMZ"EQO"N:QW"N-1,3:W0,4:W
|
||||||
|
0,5:W'J<MW<0A&128"N0;'C>0A&127-13"ED'D.-Z;.U0<0A&128"N0;'C><.U10L
|
||||||
|
.-Q0-1"L0;'R>Q1J-(0)-QO"GQ0J-1A-27"EI 'I
|
||||||
|
'><ZJ-Z;-1A-10"N-1A-13"N-1A-32"N0;'''-D>MW'QH"FZJ."E10I'-1A-10"N10I
|
||||||
|
'R."E13I'-1A-13"N13I''ZJ:QW"N0:W-4"E2,0:W'-1,3:W0,4:WMW'|
|
||||||
|
?Squish run failed; aborting any output
|
||||||
|
0,0XF'0*Z"EIFile <.TES or .TEC>? QMRGQ'0,0XR0,0XQEIMF0,0XFZ"E
|
||||||
|
Enter your macro then type MA$$
|
||||||
|
|J:@FS%=%%"SFEW0,.:XF.UF-:S."U:F.TEC'QFJ27:FQB"TET&64"E:F
|
||||||
|
Creating ":G*"
|
||||||
|
''0,.K'J:S."UZJI.TESHXQ:ER^EQQ"U-FS.TES.TEC''HXQHKER^EQQQB"T
|
||||||
|
ET&64"ESquishing ":G*"
|
||||||
|
'':QF"EY128,0ET<"TZJ12I':A;>MAMP|YQB"F128,0ET'"T"TZJ12I'MAMFHPW
|
||||||
|
HK|MF<"TZJ12I'MAHPWHK:Y;>'EFEX''
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,9 @@
|
||||||
|
:EN*.DIR"FNo subdirectories1310^C'
|
||||||
|
|
||||||
|
<:EN"FOL1'G*I
|
||||||
|
>!L1!J:S]"FNo subdirectories
|
||||||
|
^C'
|
||||||
|
Subdirectories of 0T
|
||||||
|
|
||||||
|
-C0,.XAJ<FS].;FS.DIR;1];L>J< :S:"F^C'T-6C.U1I:ENL-2CI*.DIR27II"FOL327II'<:EN27II"FOL227II'I27IIG*27II0LFS]27II.27IIFS.27II]27II0L S:27II.U1S]27IIQ1,.T
|
||||||
|
SR;127II0,.K>!L3!^C27II!L2!0,.XN0,.KMNL>
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
10u.n ! put 10 in main-level q-register .n !
|
||||||
|
@^U1/20u.n:m2/27:^U1 ! put 20u.n$:m2$$ in q-register 1 !
|
||||||
|
@^U2/:m3/27:^U2 ! put :m3$$ in q-register 2 !
|
||||||
|
@^U3/q.n=/27:^U3 ! put q.n=$$ into q-register 3 !
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,92 @@
|
||||||
|
|
||||||
|
Test the backslash command
|
||||||
|
|
||||||
|
|
||||||
|
! test 1: \ to get a number that's terminated by end-of-edit-buffer
|
||||||
|
test 2: \ to get a number that's terminated by characters
|
||||||
|
test 3: \ to get a number that's preceded by a unary plus
|
||||||
|
test 4: \ to get a number that's preceded by a unary minus
|
||||||
|
test 5: \ to write a digit string into the edit buffer
|
||||||
|
!
|
||||||
|
|
||||||
|
i1234
|
||||||
|
|
||||||
|
js1j ! set ^S to 1, to be sure the backslash sets it !
|
||||||
|
\-1234"e
|
||||||
|
.-4"e
|
||||||
|
^s+4"e
|
||||||
|
test 1 passed13^T10^T
|
||||||
|
|
|
||||||
|
test 1 failed, ^s is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 1 failed, dot is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 1 failed, should be 123413^T10^T
|
||||||
|
'
|
||||||
|
|
||||||
|
hki1234xyz
|
||||||
|
|
||||||
|
js1j ! set ^S to 1, to be sure the backslash sets it !
|
||||||
|
\-1234"e
|
||||||
|
.-4"e
|
||||||
|
^s+4"e
|
||||||
|
test 2 passed13^T10^T
|
||||||
|
|
|
||||||
|
test 2 failed, ^s is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 2 failed, dot is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 2 failed, should be 123413^T10^T
|
||||||
|
'
|
||||||
|
|
||||||
|
hki+1234xyz
|
||||||
|
|
||||||
|
js1j ! set ^S to 1, to be sure the backslash sets it !
|
||||||
|
\-1234"e
|
||||||
|
.-5"e
|
||||||
|
^s+5"e
|
||||||
|
test 3 passed13^T10^T
|
||||||
|
|
|
||||||
|
test 3 failed, ^s is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 3 failed, dot is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 3 failed, should be 123413^T10^T
|
||||||
|
'
|
||||||
|
|
||||||
|
hki-1234xyz
|
||||||
|
|
||||||
|
js1j ! set ^S to 1, to be sure the backslash sets it !
|
||||||
|
\+1234"e
|
||||||
|
.-5"e
|
||||||
|
^s+5"e
|
||||||
|
test 4 passed13^T10^T
|
||||||
|
|
|
||||||
|
test 4 failed, ^s is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 4 failed, dot is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 4 failed, should be 123413^T10^T
|
||||||
|
'
|
||||||
|
|
||||||
|
hk
|
||||||
|
i1js1jhk ! set ^S to 1, to be sure the backslash sets it !
|
||||||
|
1234\j::s1234"s
|
||||||
|
^s+4"e
|
||||||
|
test 5 passed13^T10^T
|
||||||
|
|
|
||||||
|
test 5 failed, ^s is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 5 failed.13^T10^T
|
||||||
|
'
|
||||||
|
|
||||||
|
hkex
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
|
||||||
|
Test the ::S command
|
||||||
|
|
||||||
|
|
||||||
|
! test 1: 1-character argument
|
||||||
|
test 2: 2-character argument
|
||||||
|
test 3: 3-character argument last char on end-of-buffer
|
||||||
|
test 4: no argument: use same one as test 3
|
||||||
|
test 5: 3-character argument that can't be found
|
||||||
|
!
|
||||||
|
iabcdef
|
||||||
|
3j::sd"s
|
||||||
|
.-4"e
|
||||||
|
^s+1"e
|
||||||
|
test 1 passed1310
|
||||||
|
|
|
||||||
|
test 1 failed, ^S is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 1 failed, dot is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 1 failed, search failed13^t10^T
|
||||||
|
'
|
||||||
|
3j::sde"s
|
||||||
|
.-5"e
|
||||||
|
^s+2"e
|
||||||
|
test 2 passed1310
|
||||||
|
|
|
||||||
|
test 2 failed, ^S is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 2 failed, dot is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 2 failed, search failed13^t10^T
|
||||||
|
'
|
||||||
|
3j::sdef"s
|
||||||
|
.-6"e
|
||||||
|
^s+3"e
|
||||||
|
test 3 passed1310
|
||||||
|
|
|
||||||
|
test 3 failed, ^S is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 3 failed, dot is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 3 failed, search failed13^t10^T
|
||||||
|
'
|
||||||
|
3j::s"s
|
||||||
|
.-6"e
|
||||||
|
^s+3"e
|
||||||
|
test 4 passed1310
|
||||||
|
|
|
||||||
|
test 4 failed, ^S is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 4 failed, dot is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 4 failed, search failed13^t10^T
|
||||||
|
'
|
||||||
|
3j::sabc"f
|
||||||
|
.-3"e
|
||||||
|
test 5 passed1310
|
||||||
|
|
|
||||||
|
test 5 failed, dot is wrong13^T10^T
|
||||||
|
'
|
||||||
|
|
|
||||||
|
test 5 succeeded, search failed13^t10^T
|
||||||
|
'
|
||||||
|
hkex
|
||||||
|
|
@ -0,0 +1,102 @@
|
||||||
|
|
||||||
|
This file tests the =, ==, ===, :=, :== and :=== commands.
|
||||||
|
It is dependent on the size in bytes of the variables used to
|
||||||
|
hold TECO numbers. This test gives the results to be expected
|
||||||
|
for a 16-bit implementation like TECO-11 and a 32-bit implementation
|
||||||
|
like TECO-C on a VAX.
|
||||||
|
|
||||||
|
Please strike any key to continue, or ^A to exit
|
||||||
|
|
||||||
|
-1"eex'
|
||||||
|
|
||||||
|
|
||||||
|
Test of = command. You should see
|
||||||
|
|
||||||
|
(16-bit implementation) (32-bit implementation)
|
||||||
|
|
||||||
|
-31072 100000
|
||||||
|
2 2
|
||||||
|
1 1
|
||||||
|
0 0
|
||||||
|
-1 -1
|
||||||
|
-2 -2
|
||||||
|
31072 -100000
|
||||||
|
|
||||||
|
|
||||||
|
100000=2=1=0=-1=-2=-100000=
|
||||||
|
|
||||||
|
Please strike any key to continue, or ^A to exit
|
||||||
|
|
||||||
|
-1"eex'
|
||||||
|
|
||||||
|
Test of == command. You should see
|
||||||
|
|
||||||
|
(16-bit implementation) (32-bit implementation)
|
||||||
|
|
||||||
|
72460 72460
|
||||||
|
2 2
|
||||||
|
1 1
|
||||||
|
0 0
|
||||||
|
177777 37777777777
|
||||||
|
177776 37777777776
|
||||||
|
105320 37777705320
|
||||||
|
|
||||||
|
|
||||||
|
30000==2==1==0==-1==-2==-30000==
|
||||||
|
|
||||||
|
Please strike any key to continue, or ^A to exit
|
||||||
|
|
||||||
|
-1"eex'
|
||||||
|
|
||||||
|
Test of === command. You should see
|
||||||
|
|
||||||
|
(16-bit implementation) (32-bit implementation)
|
||||||
|
|
||||||
|
7530 7530
|
||||||
|
2 2
|
||||||
|
1 1
|
||||||
|
0 0
|
||||||
|
FFFF FFFFFFFF
|
||||||
|
FFFE FFFFFFFE
|
||||||
|
8AD0 FFFF8AD0
|
||||||
|
|
||||||
|
|
||||||
|
30000===2===1===0===-1===-2===-30000===
|
||||||
|
|
||||||
|
Please strike any key to continue, or ^A to exit
|
||||||
|
|
||||||
|
-1"eex'
|
||||||
|
|
||||||
|
Test of := command. You should see
|
||||||
|
|
||||||
|
30000,2,1,0,-1,-2,-30000 (16 or 32 bit implementation)
|
||||||
|
|
||||||
|
|
||||||
|
30000:=,2:=,1:=,0:=,-1:=,-2:=,-30000:=
|
||||||
|
|
||||||
|
|
||||||
|
Please strike any key to continue, or ^A to exit
|
||||||
|
|
||||||
|
-1"eex'
|
||||||
|
|
||||||
|
Test of :== command. You should see
|
||||||
|
|
||||||
|
72460,2,1,0,177777,177776,105320 (16 bit implementation)
|
||||||
|
72460,2,1,0,37777777777,37777777776,37777705320 (32 bit implementation)
|
||||||
|
|
||||||
|
|
||||||
|
30000:==,2:==,1:==,0:==,-1:==,-2:==,-30000:==
|
||||||
|
|
||||||
|
|
||||||
|
Please strike any key to continue, or ^A to exit
|
||||||
|
|
||||||
|
-1"eex'
|
||||||
|
|
||||||
|
Test of :=== command. You should see
|
||||||
|
|
||||||
|
7530,2,1,0,FFFF,FFFE,8AD0 (16 bit implementation)
|
||||||
|
7350,2,1,0,FFFFFFFF,FFFFFFFE,FFFF8AD0 (32 bit implementation)
|
||||||
|
|
||||||
|
|
||||||
|
30000:===,2:===,1:===,0:===,-1:===,-2:===,-30000:===
|
||||||
|
ex
|
||||||
|
|
@ -0,0 +1,129 @@
|
||||||
|
|
||||||
|
Test the O command.
|
||||||
|
|
||||||
|
|
||||||
|
!
|
||||||
|
Testing jump commands is a little hairy. I do it by setting a
|
||||||
|
state variable. At every label, I test that we're in the proper state.
|
||||||
|
!
|
||||||
|
1us@O!test1!
|
||||||
|
|
||||||
|
!tag2!
|
||||||
|
qs-4"e
|
||||||
|
test 4 passed (jumping to 3rd (last) tag in a list works)13^T10^T
|
||||||
|
|
|
||||||
|
reached tag2 by mistake, terminating.13^T10^Todone
|
||||||
|
|
||||||
|
'
|
||||||
|
5usOtest5
|
||||||
|
|
||||||
|
|
||||||
|
!tag1!
|
||||||
|
qs-3"e
|
||||||
|
test 3 passed (jumping to 2nd (middle) tag in a list works)13^T10^T
|
||||||
|
|
|
||||||
|
reached tag1 by mistake, terminating.13^T10^Todone
|
||||||
|
|
||||||
|
'
|
||||||
|
4us2@O!tag0,tag1,tag2!
|
||||||
|
|
||||||
|
!tag0!
|
||||||
|
qs-2"e
|
||||||
|
test 2 passed (jumping to 0th (first) tag in a list works)13^T10^T
|
||||||
|
|
|
||||||
|
reached tag0 by mistake, terminating.13^T10^Todone
|
||||||
|
|
||||||
|
'
|
||||||
|
3us1@O!tag0,tag1,tag2!
|
||||||
|
|
||||||
|
|
||||||
|
!test1!
|
||||||
|
qs-1"e
|
||||||
|
test 1 passed (a simple jump works)13^T10^T
|
||||||
|
|
|
||||||
|
reached test1 by mistake, terminating.13^T10^Todone
|
||||||
|
|
||||||
|
'
|
||||||
|
2us0@O!tag0,tag1,tag2!
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
!test5!
|
||||||
|
qs-5"e
|
||||||
|
test 5 passed (another simple jump, escape-terminated)13^T10^T
|
||||||
|
|
|
||||||
|
reached test5 by mistake, terminating.13^T10^Todone
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
|
6us3@O!tag0,tag1,tag2!
|
||||||
|
qs-6"e
|
||||||
|
test 6 passed (too large tag index causes fall through)13^T10^T
|
||||||
|
|
|
||||||
|
test 6 failed, 13^T10^T
|
||||||
|
'
|
||||||
|
|
||||||
|
7us-1@O!tag0,tag1,tag2!
|
||||||
|
qs-7"e
|
||||||
|
test 7 passed (too small tag index causes fall through)13^T10^T
|
||||||
|
|
|
||||||
|
test 7 failed, 13^T10^T
|
||||||
|
'
|
||||||
|
|
||||||
|
8us2@O!tag0,tag1,,tag2!
|
||||||
|
qs-8"e
|
||||||
|
test 8 passed (an index to a null tag causes fall through)13^T10^T
|
||||||
|
|
|
||||||
|
test 8 failed, 13^T10^T
|
||||||
|
'
|
||||||
|
9us3@O!tag0,tag1,,test9!
|
||||||
|
test 9 failed, 13^T10^T
|
||||||
|
10usotest10
|
||||||
|
|
||||||
|
|
||||||
|
!test9!
|
||||||
|
qs-9"e
|
||||||
|
test 9 passed (index to tag past null tag works)13^T10^T
|
||||||
|
|
|
||||||
|
test 9 failed, 13^T10^T
|
||||||
|
'
|
||||||
|
10us2@O!,,test10!
|
||||||
|
|
||||||
|
test 9 failed, 13^T10^T
|
||||||
|
10usotest10
|
||||||
|
|
||||||
|
!test10!
|
||||||
|
qs-10"e
|
||||||
|
test 10 passed (index to tag past 2 null tags works)13^T10^T
|
||||||
|
|
|
||||||
|
test 10 failed, 13^T10^T
|
||||||
|
'
|
||||||
|
|
||||||
|
11us
|
||||||
|
|
||||||
|
<
|
||||||
|
<
|
||||||
|
<
|
||||||
|
<
|
||||||
|
@O!endloop2!
|
||||||
|
>
|
||||||
|
>
|
||||||
|
>
|
||||||
|
!endloop2!
|
||||||
|
qs-11"e
|
||||||
|
test 11 passed (jumping from inner to outer loop works)13^T10^T
|
||||||
|
12us@O!done!
|
||||||
|
|
|
||||||
|
reached endloop2 by mistake, terminating.13^T10^Todone
|
||||||
|
|
||||||
|
'
|
||||||
|
>
|
||||||
|
|
||||||
|
!done!
|
||||||
|
qs-12"e
|
||||||
|
test 12 passed (jumping completely out of nested loops works)13^T10^T
|
||||||
|
|
|
||||||
|
test 12 failed, 13^T10^T
|
||||||
|
'
|
||||||
|
ex
|
||||||
|
|
@ -0,0 +1,120 @@
|
||||||
|
ei
|
||||||
|
Test q-register commands
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1uaqa-1"nobadtest1'
|
||||||
|
2ubqb-2"nobadtest1'
|
||||||
|
3ucqc-3"nobadtest1'
|
||||||
|
4udqd-4"nobadtest1'
|
||||||
|
5ueqe-5"nobadtest1'
|
||||||
|
6ufqf-6"nobadtest1'
|
||||||
|
7ugqg-7"nobadtest1'
|
||||||
|
8uhqh-8"nobadtest1'
|
||||||
|
9uiqi-9"nobadtest1'
|
||||||
|
10ujqj-10"nobadtest1'
|
||||||
|
11ukqk-11"nobadtest1'
|
||||||
|
12ulql-12"nobadtest1'
|
||||||
|
13umqm-13"nobadtest1'
|
||||||
|
14unqn-14"nobadtest1'
|
||||||
|
15uoqo-15"nobadtest1'
|
||||||
|
16upqp-16"nobadtest1'
|
||||||
|
17uqqq-17"nobadtest1'
|
||||||
|
18urqr-18"nobadtest1'
|
||||||
|
19usqs-19"nobadtest1'
|
||||||
|
20utqt-20"nobadtest1'
|
||||||
|
21uuqu-21"nobadtest1'
|
||||||
|
22uvqv-22"nobadtest1'
|
||||||
|
23uwqw-23"nobadtest1'
|
||||||
|
24uxqx-24"nobadtest1'
|
||||||
|
25uyqy-25"nobadtest1'
|
||||||
|
26uzqz-26"nobadtest1'
|
||||||
|
1uAqA-1"nobadtest1'
|
||||||
|
2uBqB-2"nobadtest1'
|
||||||
|
3uCqC-3"nobadtest1'
|
||||||
|
4uDqD-4"nobadtest1'
|
||||||
|
5uEqE-5"nobadtest1'
|
||||||
|
6uFqF-6"nobadtest1'
|
||||||
|
7uGqG-7"nobadtest1'
|
||||||
|
8uHqH-8"nobadtest1'
|
||||||
|
9uIqI-9"nobadtest1'
|
||||||
|
10uJqJ-10"nobadtest1'
|
||||||
|
11uKqK-11"nobadtest1'
|
||||||
|
12uLqL-12"nobadtest1'
|
||||||
|
13uMqM-13"nobadtest1'
|
||||||
|
14uNqN-14"nobadtest1'
|
||||||
|
15uOqO-15"nobadtest1'
|
||||||
|
16uPqP-16"nobadtest1'
|
||||||
|
17uQqQ-17"nobadtest1'
|
||||||
|
18uRqR-18"nobadtest1'
|
||||||
|
19uSqS-19"nobadtest1'
|
||||||
|
20uTqT-20"nobadtest1'
|
||||||
|
21uUqU-21"nobadtest1'
|
||||||
|
22uVqV-22"nobadtest1'
|
||||||
|
23uWqW-23"nobadtest1'
|
||||||
|
24uXqX-24"nobadtest1'
|
||||||
|
25uYqY-25"nobadtest1'
|
||||||
|
26uZqZ-26"nobadtest1'
|
||||||
|
-9u0q0+9"nobadtest1'
|
||||||
|
-8u1q1+8"nobadtest1'
|
||||||
|
-7u2q2+7"nobadtest1'
|
||||||
|
-6u3q3+6"nobadtest1'
|
||||||
|
-5u4q4+5"nobadtest1'
|
||||||
|
-4u5q5+4"nobadtest1'
|
||||||
|
-3u6q6+3"nobadtest1'
|
||||||
|
-2u7q7+2"nobadtest1'
|
||||||
|
-1u8q8+1"nobadtest1'
|
||||||
|
0u9q9"nobadtest1'
|
||||||
|
101,102ua-101"nobadtest1'qa-102"nobadtest1'
|
||||||
|
test 1 passed (basic U and Q commands work)13^T10^T
|
||||||
|
otest1done
|
||||||
|
|
||||||
|
!badtest1!
|
||||||
|
test 1 failed.13^T10^T
|
||||||
|
!test1done!
|
||||||
|
|
||||||
|
10ua5ub2uc(qa+qb+qc)-17"e
|
||||||
|
test 2 passed (q-registers seem to work in expressions)13^T10^T
|
||||||
|
|
|
||||||
|
test 2 failed13^T10^T
|
||||||
|
'
|
||||||
|
|
||||||
|
! This test helps to see what's really supposed to happen in TECO when
|
||||||
|
you do a :M command and then refer to local q-registers in the macro.
|
||||||
|
The correct behavior is to use the local q-registers from the previous
|
||||||
|
macro level, if there are any. If not, use the ones from the previous
|
||||||
|
level, etc. The test verifies that three levels deep, values from
|
||||||
|
level 1 can be accessed if no intervening levels have local q-registers.
|
||||||
|
!
|
||||||
|
10u.n ! put 10 in main-level q-register .n !
|
||||||
|
@^U1/20u.n:m2/ ! put 20u.n$:m2$$ in q-register 1 !
|
||||||
|
27:^U1
|
||||||
|
@^U2/:m3/ ! put :m3$$ in q-register 2 !
|
||||||
|
27:^U2
|
||||||
|
@^U3/q.n/ ! put q.n$$ into q-register 3 !
|
||||||
|
27:^U3
|
||||||
|
m1+q.n-30"e
|
||||||
|
test 3 passed (:M commands use old local q-registers)13^T10^T
|
||||||
|
|
|
||||||
|
test 3 failed13^T10^T
|
||||||
|
'
|
||||||
|
:m1+q.n-40"e
|
||||||
|
test 4 passed (:M commands use old local q-registers)13^T10^T
|
||||||
|
|
|
||||||
|
test 4 failed13^T10^T
|
||||||
|
'
|
||||||
|
! If local macros are called, the : modifier is assumed (no local regs) !
|
||||||
|
|
||||||
|
10u.n ! put 10 in main-level q-register .n !
|
||||||
|
@^U1/20u.nm.2/ ! put 20u.n$m.2$$ in q-register .1 !
|
||||||
|
27:^U1
|
||||||
|
@^U.2/m.3/ ! put m.3$$ in q-register .2 !
|
||||||
|
27:^U.2
|
||||||
|
@^U.3/q.n/ ! put q.n$$ into q-register .3 !
|
||||||
|
27:^U.3
|
||||||
|
:m1+q.n-40"e
|
||||||
|
test 5 passed (M. commands use old local q-registers)13^T10^T
|
||||||
|
|
|
||||||
|
test 5 failed13^T10^T
|
||||||
|
'
|
||||||
|
ex
|
||||||
|
|
@ -0,0 +1,544 @@
|
||||||
|
|
||||||
|
|
||||||
|
This file tests search commands.
|
||||||
|
|
||||||
|
Please press the space bar to continue, or CTRL-A to exit
|
||||||
|
|
||||||
|
-1"eex'
|
||||||
|
|
||||||
|
Test some simple searches
|
||||||
|
|
||||||
|
|
||||||
|
hk iabcdefghi j
|
||||||
|
forward search for 1st char sa .-1"e passed
|
||||||
|
| failed!!!
|
||||||
|
'
|
||||||
|
forward search for 4th char sd .-4"e passed
|
||||||
|
| failed!!!
|
||||||
|
'
|
||||||
|
forward search for last char si .-9"e passed
|
||||||
|
| failed!!!
|
||||||
|
'
|
||||||
|
backwards search for 4th char -sd .-4"e passed
|
||||||
|
| failed!!!
|
||||||
|
'
|
||||||
|
backwards search for 1st char -sa .-1"e passed
|
||||||
|
| failed!!!
|
||||||
|
'
|
||||||
|
|
||||||
|
|
||||||
|
Please press the space bar to continue, or CTRL-A to exit
|
||||||
|
|
||||||
|
-1"eex'
|
||||||
|
|
||||||
|
Test the ^Ea match construct
|
||||||
|
|
||||||
|
|
||||||
|
test 1 jsa .-1"e passed
|
||||||
|
| failed!!!
|
||||||
|
'
|
||||||
|
test 2 jsba .-3"e passed
|
||||||
|
| failed!!!
|
||||||
|
'
|
||||||
|
test 3 jsha .-9"e passed
|
||||||
|
| failed!!!
|
||||||
|
'
|
||||||
|
test 4 jsbad .-4"e passed
|
||||||
|
| failed!!!
|
||||||
|
'
|
||||||
|
test 5 jsbaaa .-5"e passed
|
||||||
|
| failed!!!
|
||||||
|
'
|
||||||
|
test 6 jsaaaaaaaaa .-9"e passed
|
||||||
|
| failed!!!
|
||||||
|
'
|
||||||
|
hk
|
||||||
|
0i1i2i3i4i5i6i7i8i9i10i11i12i13i14i15i16i17i
|
||||||
|
18i19i20i21i22i23i24i25i26i27i28i29i30i31i
|
||||||
|
i !"#$%&'()*+,-./0123456789:;<=>?@[\]^_`{|}~127iiA
|
||||||
|
test 7 jsa .-77"e passed
|
||||||
|
| failed!!!
|
||||||
|
'
|
||||||
|
|
||||||
|
Test the ^Eb match construct
|
||||||
|
|
||||||
|
|
||||||
|
hki!@#$%&*()
|
||||||
|
jsb.-1"etest 1 passed
|
||||||
|
|test 1 failed!!!
|
||||||
|
'
|
||||||
|
js!b.-2"etest 2 passed
|
||||||
|
|test 2 failed!!!
|
||||||
|
'
|
||||||
|
js(b.-9"etest 3 passed
|
||||||
|
|test 3 failed!!!
|
||||||
|
'
|
||||||
|
js!b#.-3"etest 4 passed
|
||||||
|
|test 4 failed!!!
|
||||||
|
'
|
||||||
|
js!bbb.-4"etest 5 passed
|
||||||
|
|test 5 failed!!!
|
||||||
|
'
|
||||||
|
jsbbbbbbbbb.-9"etest 6 passed
|
||||||
|
|test 6 failed!!!
|
||||||
|
'
|
||||||
|
hkiABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!
|
||||||
|
jsb.-63"etest 7 passed
|
||||||
|
|test 7 failed!!!
|
||||||
|
'
|
||||||
|
|
||||||
|
Please press the space bar to continue, or CTRL-A to exit
|
||||||
|
|
||||||
|
-1"eex'
|
||||||
|
|
||||||
|
Test the ^Ec match construct
|
||||||
|
|
||||||
|
|
||||||
|
hkiabcdefghi
|
||||||
|
jsc.-1"etest 1 passed
|
||||||
|
|test 1 failed!!!
|
||||||
|
'
|
||||||
|
jsbc.-3"etest 2 passed
|
||||||
|
|test 2 failed!!!
|
||||||
|
'
|
||||||
|
jshc.-9"etest 3 passed
|
||||||
|
|test 3 failed!!!
|
||||||
|
'
|
||||||
|
jsbcd.-4"etest 4 passed
|
||||||
|
|test 4 failed!!!
|
||||||
|
'
|
||||||
|
jsbccc.-5"etest 5 passed
|
||||||
|
|test 5 failed!!!
|
||||||
|
'
|
||||||
|
jsccccccccc.-9"etest 6 passed
|
||||||
|
|test 6 failed!!!
|
||||||
|
'
|
||||||
|
hk0i1i2i3i4i5i6i7i8i9i10i11i12i13i14i15i16i17i
|
||||||
|
18i19i20i21i22i23i24i25i26i27i28i29i30i31i
|
||||||
|
i !"#%&'()*+,-/:;<=>?@[\]^`{|}~127iiA
|
||||||
|
jsc.-64"etest 7 passed
|
||||||
|
|test 7 failed!!!
|
||||||
|
'
|
||||||
|
hki0123456789$.
|
||||||
|
jscccccccccccc.-12"etest 8 passed
|
||||||
|
|test 8 failed!!!
|
||||||
|
'
|
||||||
|
|
||||||
|
Test the ^Ed match construct
|
||||||
|
|
||||||
|
|
||||||
|
hki0123456789
|
||||||
|
jsd.-1"etest 1 passed
|
||||||
|
|test 1 failed!!!
|
||||||
|
'
|
||||||
|
js1d.-3"etest 2 passed
|
||||||
|
|test 2 failed!!!
|
||||||
|
'
|
||||||
|
js8d.-10"etest 3 passed
|
||||||
|
|test 3 failed!!!
|
||||||
|
'
|
||||||
|
js2d4.-5"etest 4 passed
|
||||||
|
|test 4 failed!!!
|
||||||
|
'
|
||||||
|
js2ddd.-6"etest 5 passed
|
||||||
|
|test 5 failed!!!
|
||||||
|
'
|
||||||
|
jsdddddddddd.-10"etest 6 passed
|
||||||
|
|test 6 failed!!!
|
||||||
|
'
|
||||||
|
hk0i1i2i3i4i5i6i7i8i9i10i11i12i13i14i15i16i17i
|
||||||
|
18i19i20i21i22i23i24i25i26i27i28i29i30i31i
|
||||||
|
i !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTU
|
||||||
|
iVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~127ii0
|
||||||
|
jsd.-119"etest 7 passed
|
||||||
|
|test 7 failed!!!
|
||||||
|
'
|
||||||
|
|
||||||
|
Please press the space bar to continue, or CTRL-A to exit
|
||||||
|
|
||||||
|
-1"eex'
|
||||||
|
|
||||||
|
Test the ^Eg match construct
|
||||||
|
|
||||||
|
|
||||||
|
^Uadef
|
||||||
|
hkiabcdefghi
|
||||||
|
jsGa.-4"etest 1 passed
|
||||||
|
|test 1 failed!!!
|
||||||
|
'
|
||||||
|
0^Ua1:^Ua2:^Ua3:^Ua4:^Ua5:^Ua6:^Ua7:^Ua8:^Ua9:^Ua10:^Ua11:^Ua
|
||||||
|
12:^Ua13:^Ua14:^Ua15:^Ua16:^Ua17:^Ua18:^Ua19:^Ua20:^Ua21:^Ua
|
||||||
|
22:^Ua23:^Ua24:^Ua25:^Ua26:^Ua27:^Ua28:^Ua29:^Ua30:^Ua31:^Ua
|
||||||
|
:^Ua !"#$%&'()*+,-./0123456789:;<=>?@JKLMNOPQRSTU
|
||||||
|
:^UaVWXYZ[\]^_`jklmnopqrstuvwxyz{|}127i
|
||||||
|
j:sga"ftest 2 passed
|
||||||
|
|test 2 failed!!!
|
||||||
|
'
|
||||||
|
hkiabcdefghi@
|
||||||
|
jsga.-10"etest 3 passed
|
||||||
|
|test 3 failed!!!
|
||||||
|
'
|
||||||
|
hki@
|
||||||
|
jsga.-1"etest 4 passed
|
||||||
|
|test 4 failed!!!
|
||||||
|
'
|
||||||
|
|
||||||
|
Test the ^El match construct
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
!10 is line feed, 11 is vertical tab, 12 is form feed!
|
||||||
|
|
||||||
|
hk10i10i10i10i10i10i10i10i11i12i
|
||||||
|
jsl.-1"etest 1 passed
|
||||||
|
|test 1 failed!!!
|
||||||
|
'
|
||||||
|
hkixx10i10i10i10i10i10i10i11i12i
|
||||||
|
jsxxl.-3"etest 2 passed
|
||||||
|
|test 2 failed!!!
|
||||||
|
'
|
||||||
|
hkixxxxxxxx11i12i
|
||||||
|
jsl.-10"etest 3 passed
|
||||||
|
|test 3 failed!!!
|
||||||
|
'
|
||||||
|
hk10i10i10i10i10i10i10i10i11i12i
|
||||||
|
jsllllllllll.-10"etest 4 passed
|
||||||
|
|test 4 failed!!!
|
||||||
|
'
|
||||||
|
hk0i1i2i3i4i5i6i7i8i9i13i14i15i16i17i18i19i20i21i22i
|
||||||
|
23i24i25i26i27i28i29i30i31i
|
||||||
|
i !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU
|
||||||
|
iVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~127i12i
|
||||||
|
jsl.-126"etest 5 passed
|
||||||
|
|test 5 failed!!!
|
||||||
|
'
|
||||||
|
|
||||||
|
Please press the space bar to continue, or CTRL-A to exit
|
||||||
|
|
||||||
|
-1"eex'
|
||||||
|
|
||||||
|
Test the ^Er match construct
|
||||||
|
|
||||||
|
|
||||||
|
hki0123456789
|
||||||
|
jsr.-1"etest 1 passed
|
||||||
|
|test 1 failed!!!
|
||||||
|
'
|
||||||
|
js1r.-3"etest 2 passed
|
||||||
|
|test 2 failed!!!
|
||||||
|
'
|
||||||
|
js8r.-10"etest 3 passed
|
||||||
|
|test 3 failed!!!
|
||||||
|
'
|
||||||
|
js2r4.-5"etest 4 passed
|
||||||
|
|test 4 failed!!!
|
||||||
|
'
|
||||||
|
js2rrr.-6"etest 5 passed
|
||||||
|
|test 5 failed!!!
|
||||||
|
'
|
||||||
|
jsrrrrrrrrrr.-10"etest 6 passed
|
||||||
|
|test 6 failed!!!
|
||||||
|
'
|
||||||
|
hk0i1i2i3i4i5i6i7i8i9i10i11i12i13i14i15i16i17i
|
||||||
|
18i19i20i21i22i23i24i25i26i27i28i29i30i31i
|
||||||
|
i !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~127iia
|
||||||
|
jsr.-67"etest 7 passed
|
||||||
|
|test 7 failed!!!
|
||||||
|
'
|
||||||
|
|
||||||
|
Please press the space bar to continue, or CTRL-A to exit
|
||||||
|
|
||||||
|
-1"eex'
|
||||||
|
|
||||||
|
Test the ^Es match construct
|
||||||
|
|
||||||
|
|
||||||
|
hki
|
||||||
|
jss.-1"etest 1 passed
|
||||||
|
|test 1 failed!!!
|
||||||
|
'
|
||||||
|
hkiab cde
|
||||||
|
jsbs.-3"etest 2 passed
|
||||||
|
|test 2 failed!!!
|
||||||
|
'
|
||||||
|
hkiab de
|
||||||
|
jss.-7"etest 3 passed
|
||||||
|
|test 3 failed!!!
|
||||||
|
'
|
||||||
|
hkiab de
|
||||||
|
jsbsd.-4"etest 4 passed
|
||||||
|
|test 4 failed!!!
|
||||||
|
'
|
||||||
|
hkiab de
|
||||||
|
jsbsd.-11"etest 5 passed
|
||||||
|
|test 5 failed!!!
|
||||||
|
'
|
||||||
|
hk0i1i2i3i4i5i6i7i8i10i11i12i13i14i15i16i17i18i
|
||||||
|
19i20i21i22i23i24i25i26i27i28i29i30i31i
|
||||||
|
i!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||||
|
i[\]^_`abcdefghijklmnopqrstuvwxyz{|}~127ii
|
||||||
|
jss.-127"etest 6 passed
|
||||||
|
|test 6 failed!!!
|
||||||
|
'
|
||||||
|
|
||||||
|
Test the ^Ev match construct
|
||||||
|
|
||||||
|
|
||||||
|
hkiabcdefghij
|
||||||
|
jsv.-1"etest 1 passed
|
||||||
|
|test 1 failed!!!
|
||||||
|
'
|
||||||
|
jsabv.-3"etest 2 passed
|
||||||
|
|test 2 failed!!!
|
||||||
|
'
|
||||||
|
jsiv.-10"etest 3 passed
|
||||||
|
|test 3 failed!!!
|
||||||
|
'
|
||||||
|
jsbvd.-4"etest 4 passed
|
||||||
|
|test 4 failed!!!
|
||||||
|
'
|
||||||
|
jsbvvv.-5"etest 5 passed
|
||||||
|
|test 5 failed!!!
|
||||||
|
'
|
||||||
|
jsvvvvvvvvvv.-10"etest 6 passed
|
||||||
|
|test 6 failed!!!
|
||||||
|
'
|
||||||
|
hk0i1i2i3i4i5i6i7i8i9i10i11i12i13i14i15i16i17i
|
||||||
|
18i19i20i21i22i23i24i25i26i27i28i29i30i31i
|
||||||
|
i !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`{|}~127iia
|
||||||
|
jsv.-93"etest 7 passed
|
||||||
|
|test 7 failed!!!
|
||||||
|
'
|
||||||
|
|
||||||
|
Please press the space bar to continue, or CTRL-A to exit
|
||||||
|
|
||||||
|
-1"eex'
|
||||||
|
|
||||||
|
Test the ^Ew match construct
|
||||||
|
|
||||||
|
|
||||||
|
hkiABCDEFGHIJ
|
||||||
|
jsw.-1"etest 1 passed
|
||||||
|
|test 1 failed!!!
|
||||||
|
'
|
||||||
|
jsabw.-3"etest 2 passed
|
||||||
|
|test 2 failed!!!
|
||||||
|
'
|
||||||
|
jsiw.-10"etest 3 passed
|
||||||
|
|test 3 failed!!!
|
||||||
|
'
|
||||||
|
jsbwd.-4"etest 4 passed
|
||||||
|
|test 4 failed!!!
|
||||||
|
'
|
||||||
|
jsbwww.-5"etest 5 passed
|
||||||
|
|test 5 failed!!!
|
||||||
|
'
|
||||||
|
jswwwwwwwwww.-10"etest 6 passed
|
||||||
|
|test 6 failed!!!
|
||||||
|
'
|
||||||
|
hk0i1i2i3i4i5i6i7i8i9i10i11i12i13i14i15i16i17i
|
||||||
|
18i19i20i21i22i23i24i25i26i27i28i29i30i31i
|
||||||
|
i !"#$%&'()*+,-./:;<=>?@[\]^_`abcdefghijklmnopqrstuvwxyz{|}~127iiA
|
||||||
|
jsw.-93"etest 7 passed
|
||||||
|
|test 7 failed!!!
|
||||||
|
'
|
||||||
|
|
||||||
|
Test the ^Ex match construct
|
||||||
|
|
||||||
|
|
||||||
|
hki0123456789
|
||||||
|
jsx.-1"etest 1 passed
|
||||||
|
|test 1 failed!!!
|
||||||
|
'
|
||||||
|
js1x.-3"etest 2 passed
|
||||||
|
|test 2 failed!!!
|
||||||
|
'
|
||||||
|
js8x.-10"etest 3 passed
|
||||||
|
|test 3 failed!!!
|
||||||
|
'
|
||||||
|
js2x4.-5"etest 4 passed
|
||||||
|
|test 4 failed!!!
|
||||||
|
'
|
||||||
|
js2xxx.-6"etest 5 passed
|
||||||
|
|test 5 failed!!!
|
||||||
|
'
|
||||||
|
jsxxxxxxxxxx.-10"etest 6 passed
|
||||||
|
|test 6 failed!!!
|
||||||
|
'
|
||||||
|
|
||||||
|
Please press the space bar to continue, or CTRL-A to exit
|
||||||
|
|
||||||
|
-1"eex'
|
||||||
|
|
||||||
|
Test the ^N match construct
|
||||||
|
|
||||||
|
|
||||||
|
hkiaaaaaaaaab
|
||||||
|
jsa.-10"etest 1 passed
|
||||||
|
|test 1 failed!!!
|
||||||
|
'
|
||||||
|
jsa^Na.-10"etest 2 passed
|
||||||
|
|test 2 failed!!!
|
||||||
|
'
|
||||||
|
hkiAAAbAAA
|
||||||
|
jsaaa.-5"etest 3 passed
|
||||||
|
|test 3 failed!!!
|
||||||
|
'
|
||||||
|
hki0123456789x9876543210
|
||||||
|
jsd.-11"etest 4 passed
|
||||||
|
|test 4 failed!!!
|
||||||
|
'
|
||||||
|
hkiABCDEFGHIJKLMNOPQRSTUVWXYZaZZZZZ
|
||||||
|
js^N^EW.-27"etest 5 passed
|
||||||
|
|test 5 failed!!!
|
||||||
|
'
|
||||||
|
hkiabcdefghijklmnopqrstuvwxyz#oooo
|
||||||
|
jsv.-27"etest 6 passed
|
||||||
|
|test 6 failed!!!
|
||||||
|
'
|
||||||
|
|
||||||
|
Test the ^S match construct
|
||||||
|
|
||||||
|
|
||||||
|
hki!@#$%&*()
|
||||||
|
js^S.-1"etest 1 passed
|
||||||
|
|test 1 failed!!!
|
||||||
|
'
|
||||||
|
js!^S.-2"etest 2 passed
|
||||||
|
|test 2 failed!!!
|
||||||
|
'
|
||||||
|
js(^S.-9"etest 3 passed
|
||||||
|
|test 3 failed!!!
|
||||||
|
'
|
||||||
|
js!^S#.-3"etest 4 passed
|
||||||
|
|test 4 failed!!!
|
||||||
|
'
|
||||||
|
js!^S^S^S.-4"etest 5 passed
|
||||||
|
|test 5 failed!!!
|
||||||
|
'
|
||||||
|
js^S^S^S^S^S^S^S^S^S.-9"etest 6 passed
|
||||||
|
|test 6 failed!!!
|
||||||
|
'
|
||||||
|
hkiABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!
|
||||||
|
js^S.-63"etest 7 passed
|
||||||
|
|test 7 failed!!!
|
||||||
|
'
|
||||||
|
|
||||||
|
Please press the space bar to continue, or CTRL-A to exit
|
||||||
|
|
||||||
|
-1"eex'
|
||||||
|
|
||||||
|
Test the ^X match construct
|
||||||
|
|
||||||
|
|
||||||
|
hki0123456789
|
||||||
|
js^X.-1"etest 1 passed
|
||||||
|
|test 1 failed!!!
|
||||||
|
'
|
||||||
|
js1^X.-3"etest 2 passed
|
||||||
|
|test 2 failed!!!
|
||||||
|
'
|
||||||
|
js8^X.-10"etest 3 passed
|
||||||
|
|test 3 failed!!!
|
||||||
|
'
|
||||||
|
js2^X4.-5"etest 4 passed
|
||||||
|
|test 4 failed!!!
|
||||||
|
'
|
||||||
|
js2^x^x^x.-6"etest 5 passed
|
||||||
|
|test 5 failed!!!
|
||||||
|
'
|
||||||
|
js^X^x^x^X^X^X^X^X^X^X.-10"etest 6 passed
|
||||||
|
|test 6 failed!!!
|
||||||
|
'
|
||||||
|
|
||||||
|
The remaining tests test features not found in TECO-11.
|
||||||
|
|
||||||
|
eo-99"lexiting.
|
||||||
|
oexit'
|
||||||
|
|
||||||
|
Test the ^Em match construct
|
||||||
|
|
||||||
|
|
||||||
|
hkiabcdefghi
|
||||||
|
jsma.-1"etest 1 passed
|
||||||
|
|test 1 failed!!!
|
||||||
|
'
|
||||||
|
jsmd.-4"etest 2 passed
|
||||||
|
|test 2 failed!!!
|
||||||
|
'
|
||||||
|
jsmi.-9"etest 3 passed
|
||||||
|
|test 3 failed!!!
|
||||||
|
'
|
||||||
|
hkiabbbbbc
|
||||||
|
jsmb.-6"etest 4 passed
|
||||||
|
|test 4 failed!!!
|
||||||
|
'
|
||||||
|
jsa^Embc.-7"etest 5 passed
|
||||||
|
|test 5 failed!!!
|
||||||
|
'
|
||||||
|
jsabbbbb^Emc.-7"etest 6 passed
|
||||||
|
|test 6 failed!!!
|
||||||
|
'
|
||||||
|
|
||||||
|
Test the ^E<nnn> match construct
|
||||||
|
|
||||||
|
|
||||||
|
hkiabcdefghi
|
||||||
|
js<141>.-1"etest 1 passed
|
||||||
|
|test 1 failed!!!
|
||||||
|
'
|
||||||
|
jsb<143>.-3"etest 2 passed
|
||||||
|
|test 2 failed!!!
|
||||||
|
'
|
||||||
|
jsh<151>.-9"etest 3 passed
|
||||||
|
|test 3 failed!!!
|
||||||
|
'
|
||||||
|
jsb<143>d.-4"etest 4 passed
|
||||||
|
|test 4 failed!!!
|
||||||
|
'
|
||||||
|
jsb<143><144><145>.-5"etest 5 passed
|
||||||
|
|test 5 failed!!!
|
||||||
|
'
|
||||||
|
js<141><142><143><144><145><146><147><150><151>.-9"etest 6 passed
|
||||||
|
|test 6 failed!!!
|
||||||
|
'
|
||||||
|
hk0i1i2i3i4i5i6i7i8i9i10i11i12i13i14i15i16i17i
|
||||||
|
18i19i20i21i22i23i24i25i26i27i28i29i30i31i
|
||||||
|
i !"#$&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU
|
||||||
|
iVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~127ii%
|
||||||
|
js<45>.-128"etest 7 passed
|
||||||
|
|test 7 failed!!!
|
||||||
|
'
|
||||||
|
|
||||||
|
Please press the space bar to continue, or CTRL-A to exit
|
||||||
|
|
||||||
|
-1"eex'
|
||||||
|
|
||||||
|
Test the ^E[a,b,c...] match construct ???
|
||||||
|
|
||||||
|
|
||||||
|
hki!@#$%&*()
|
||||||
|
js[a,b,%,d].-5"etest 1 passed
|
||||||
|
|test 1 failed!!!
|
||||||
|
'
|
||||||
|
js![a,b,c,@].-2"etest 2 passed
|
||||||
|
|test 2 failed!!!
|
||||||
|
'
|
||||||
|
js([)].-9"etest 3 passed
|
||||||
|
|test 3 failed!!!
|
||||||
|
'
|
||||||
|
js![a,b,c,d,e,f,g,h,i,j,k,l,m,@]#.-3"etest 4 passed
|
||||||
|
|test 4 failed!!!
|
||||||
|
'
|
||||||
|
js!^S^S^S.-4"etest 5 passed
|
||||||
|
|test 5 failed!!!
|
||||||
|
'
|
||||||
|
js^S^S^S^S^S^S^S^S^S.-9"etest 6 passed
|
||||||
|
|test 6 failed!!!
|
||||||
|
'
|
||||||
|
hkiABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!
|
||||||
|
js^S.-63"etest 7 passed
|
||||||
|
|test 7 failed!!!
|
||||||
|
'
|
||||||
|
!exit!
|
||||||
|
ex
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
[i@^U.c/i
|
||||||
|
/27:^U.c@^U.i/qi<i >/27:^U.i27u.e0ui<z-."e1;'0u.a0u.d0u.s!c!0a"ecf<'0a-^^"ecsm.cm.if<'0a-^^"ec-1u.doc'0a-^^"ecm.cm.if<'0a-^^"ecm.cm.if<'0a-^^"ec-1u.doc'0a-^^"e2cm.cm.if<'0a-8"ec-1u.doc'0a-9"esu.em.cm.if<'0a-^^"ec-1u.doc'0a-^^"ecm.cm.if<'0a-^^"ec-1u.doc'0a-^^"ecq.d"tm.cm.if<|-1u.doc''0a-^^"ec-1u.doc'0a-^^"ecq.d"tm.cm.if<|-1u.doc''0a-^^"esu.em.cm.if<'0a-^^"ecm.cm.if<'0a-^^"ecm.cm.if<'0a-^^"ecq.d"tm.cm.if<|-1u.doc''0a-^^"ec-1u.doc'0a-27"ecm.cm.if<'0a-^^!"ecs!m.cm.if<'0a-^^""e2cm.c%im.if<'0a-^^%"e2c-1u.doc'0a-^^'"e-4dc-1%im.cm.if<'0a-^^@"ec-1q.aoc'0a-^^|"e-4dcm.cm.if<'0a-^^."ec-1u.doc'0a-^^;"ecm.cm.if<'0a-^^<"e2cm.c%im.if<'0a-^^>"ec-1%im.cm.if<'0a-^^["e2cm.cm.if<'0a-^^]"e2cm.cm.if<'0a-47"g0a-58"lc-1u.doc'
|
||||||
|
0a-^^a"ecm.cm.if<'0a-^^A"ecm.cm.if<'0a-^^b"ec-1u.doc'0a-^^B"ec-1u.doc'0a-^^c"ecm.cm.if<'0a-^^C"ecm.cm.if<'0a-^^d"ecm.cm.if<'0a-^^D"ecm.cm.if<'0a-^^e"eoe'0a-^^E"eoe'0a-^^f"eof'0a-^^F"eof'0a-^^g"e2cm.cm.if<'0a-^^G"e2cm.cm.if<'0a-^^h"ecf<'0a-^^H"ecf<'0a-^^i"esu.em.cm.if<'0a-^^I"esu.em.cm.if<'0a-^^j"ecm.cm.if<'0a-^^J"ecm.cm.if<'0a-^^k"ecm.cm.if<'0a-^^K"ecm.cm.if<'0a-^^l"ecm.cm.if<'0a-^^L"ecm.cm.if<'0a-^^m"e2cm.cm.if<'0a-^^M"e2cm.cm.if<'0a-^^n"esu.em.cm.if<'0a-^^N"esu.em.cm.if<'0a-^^o"esu.em.cm.if<'0a-^^O"esu.em.cm.if<'0a-^^q"e2c-1u.doc'0a-^^Q"e2c-1u.doc'0a-^^r"ecm.cm.if<'0a-^^R"ecm.cm.if<'0a-^^s"esu.em.cm.if<'0a-^^S"esu.em.cm.if<'0a-^^t"ecm.cm.if<'0a-^^T"ecm.cm.if<'0a-^^u"e2cm.cm.if<'0a-^^U"e2cm.cm.if<'0a-^^v"ecm.cm.if<'
|
||||||
|
0a-^^V"ecm.cm.if<'0a-^^w"ecm.cm.if<'0a-^^W"ecm.cm.if<'0a-^^x"e2cm.cm.if<'0a-^^X"e2cm.cm.if<'0a-^^y"ecm.cm.if<'0a-^^Y"ecm.cm.if<'0a-^^z"ec-1u.doc'0a-^^Z"ec-1u.doc'cf<!e!c0a-^^a"ecm.cm.if<'0A-^^a"ecm.cm.if<'0a-^^b"esu.em.cm.if<'0a-^^B"esu.em.cm.if<'0a-^^c"ecm.cm.if<'0a-^^C"ecm.cm.if<'0a-^^d"ecq.d"tm.cm.if<|-1u.doc''0a-^^D"ecq.d"tm.cm.if<|-1u.doc''0a-^^f"ecm.cm.if<'0a-^^F"ecm.cm.if<'0a-^^g"esu.em.cm.if<'0a-^^G"esu.em.cm.if<'0a-^^h"ecq.d"tm.cm.if<|-1u.doc''0a-^^H"ecq.d"tm.cm.if<|-1u.doc''0a-^^i"esu.em.cm.if<'0a-^^I"esu.em.cm.if<'0a-^^j"ec-1u.doc''0a-^^J"ec-1u.doc''0a-^^k"ecm.cm.if<'0a-^^K"ecm.cm.if<'0a-^^n"esu.em.cm.if<'0a-^^N"esu.em.cm.if<'0a-^^o"ec-1u.doc''0a-^^O"ec-1u.doc''0a-^^p"ecm.cm.if<'0a-^^P"ecm.cm.if<'
|
||||||
|
0a-^^q"ecm.cm.if<'0a-^^Q"ecm.cm.if<'0a-^^r"esu.em.cm.if<'0a-^^R"esu.em.cm.if<'0a-^^s"ecq.d"tm.cm.if<|-1u.doc''0a-^^S"ecq.d"tm.cm.if<|-1u.doc''0a-^^t"ecq.d"tm.cm.if<|-1u.doc''0a-^^T"ecq.d"tm.cm.if<|-1u.doc''0a-^^u"ecq.d"tm.cm.if<|-1u.doc''0a-^^U"ecq.d"tm.cm.if<|-1u.doc''0a-^^v"ecq.d"tm.cm.if<|-1u.doc''0a-^^V"ecq.d"tm.cm.if<|-1u.doc''0a-^^w"esu.em.cm.if<'0a-^^W"esu.em.cm.if<'0a-^^x"ecm.cm.if<'0a-^^X"ecm.cm.if<'cf<!f!c0a-^^'"ecm.cm.if<'0a-^^<"ecm.cm.if<'0a-^^>"ecm.cm.if<'0a-^^|"ecm.cm.if<'0a-^^b"esu.em.cm.if<'0a-^^B"esu.em.cm.if<'0a-^^c"esu.esu.em.cm.if<'0a-^^C"esu.esu.em.cm.if<'0a-^^d"esu.em.cm.if<'0a-^^D"esu.em.cm.if<'0a-^^n"esu.esu.em.cm.if<'0a-^^N"esu.esu.em.cm.if<'0a-^^r"esu.em.cm.if<'0a-^^R"esu.em.cm.if<'
|
||||||
|
0a-^^s"esu.esu.em.cm.if<'0a-^^S"esu.esu.em.cm.if<'0a-^^_"esu.esu.em.cm.if<'c>[i
|
||||||
|
|
@ -0,0 +1,187 @@
|
||||||
|
! This TECO macro indents TECO code to help make it readable
|
||||||
|
|
||||||
|
It does NOT handle @-modified commands correctly or caret-preceeded commands.
|
||||||
|
|
||||||
|
Q-REGISTERS USED:
|
||||||
|
|
||||||
|
q-register usage
|
||||||
|
|
||||||
|
.a true if @-sign modified
|
||||||
|
.c (text) insert carriage return/line feed
|
||||||
|
.d true if numeric argument
|
||||||
|
.i (text) insert indenting spaces
|
||||||
|
i indenting level
|
||||||
|
!
|
||||||
|
|
||||||
|
[i
|
||||||
|
|
||||||
|
@^U.c/i
|
||||||
|
/27:^U.c
|
||||||
|
|
||||||
|
@^U.i/qi<i >/27:^U.i
|
||||||
|
|
||||||
|
27u.e
|
||||||
|
0ui
|
||||||
|
<
|
||||||
|
z-."e1;'
|
||||||
|
0u.a
|
||||||
|
0u.d
|
||||||
|
0u.s
|
||||||
|
!c!
|
||||||
|
0a"ecf<'
|
||||||
|
0a-^^^A"ecs^Am.cm.if<'
|
||||||
|
0a-^^^B"ec-1u.doc'
|
||||||
|
0a-^^^C"ecm.cm.if<'
|
||||||
|
0a-^^^D"ecm.cm.if<'
|
||||||
|
0a-^^^E"ec-1u.doc'
|
||||||
|
0a-^^^G"e2cm.cm.if<'
|
||||||
|
0a-8"ec-1u.doc'
|
||||||
|
0a-9"es^Eu.em.cm.if<'
|
||||||
|
0a-^^^N"ec-1u.doc'
|
||||||
|
0a-^^^O"ecm.cm.if<'
|
||||||
|
0a-^^^Q"ec-1u.doc'
|
||||||
|
0a-^^^R"ecq.d"tm.cm.if<|-1u.doc''
|
||||||
|
0a-^^^S"ec-1u.doc'
|
||||||
|
0a-^^^T"ecq.d"tm.cm.if<|-1u.doc''
|
||||||
|
0a-^^^U"es^Eu.em.cm.if<'
|
||||||
|
0a-^^^V"ecm.cm.if<'
|
||||||
|
0a-^^^W"ecm.cm.if<'
|
||||||
|
0a-^^^X"ecq.d"tm.cm.if<|-1u.doc''
|
||||||
|
0a-^^^Z"ec-1u.doc'
|
||||||
|
0a-27"ecm.cm.if<'
|
||||||
|
0a-^^!"ecs!m.cm.if<'
|
||||||
|
0a-^^""e2cm.c%im.if<'
|
||||||
|
0a-^^%"e2c-1u.doc'
|
||||||
|
0a-^^'"e-4dc-1%im.cm.if<'
|
||||||
|
0a-^^@"ec-1q.aoc'
|
||||||
|
0a-^^|"e-4dcm.cm.if<'
|
||||||
|
0a-^^."ec-1u.doc'
|
||||||
|
0a-^^;"ecm.cm.if<'
|
||||||
|
0a-^^<"e2cm.c%im.if<'
|
||||||
|
0a-^^>"ec-1%im.cm.if<'
|
||||||
|
0a-^^["e2cm.cm.if<'
|
||||||
|
0a-^^]"e2cm.cm.if<'
|
||||||
|
0a-47"g0a-58"lc-1u.doc'
|
||||||
|
0a-^^a"ecm.cm.if<'
|
||||||
|
0a-^^A"ecm.cm.if<'
|
||||||
|
0a-^^b"ec-1u.doc'
|
||||||
|
0a-^^B"ec-1u.doc'
|
||||||
|
0a-^^c"ecm.cm.if<'
|
||||||
|
0a-^^C"ecm.cm.if<'
|
||||||
|
0a-^^d"ecm.cm.if<'
|
||||||
|
0a-^^D"ecm.cm.if<'
|
||||||
|
0a-^^e"eoe'
|
||||||
|
0a-^^E"eoe'
|
||||||
|
0a-^^f"eof'
|
||||||
|
0a-^^F"eof'
|
||||||
|
0a-^^g"e2cm.cm.if<'
|
||||||
|
0a-^^G"e2cm.cm.if<'
|
||||||
|
0a-^^h"ecf<'
|
||||||
|
0a-^^H"ecf<'
|
||||||
|
0a-^^i"es^Eu.em.cm.if<'
|
||||||
|
0a-^^I"es^Eu.em.cm.if<'
|
||||||
|
0a-^^j"ecm.cm.if<'
|
||||||
|
0a-^^J"ecm.cm.if<'
|
||||||
|
0a-^^k"ecm.cm.if<'
|
||||||
|
0a-^^K"ecm.cm.if<'
|
||||||
|
0a-^^l"ecm.cm.if<'
|
||||||
|
0a-^^L"ecm.cm.if<'
|
||||||
|
0a-^^m"e2cm.cm.if<'
|
||||||
|
0a-^^M"e2cm.cm.if<'
|
||||||
|
0a-^^n"es^Eu.em.cm.if<'
|
||||||
|
0a-^^N"es^Eu.em.cm.if<'
|
||||||
|
0a-^^o"es^Eu.em.cm.if<'
|
||||||
|
0a-^^O"es^Eu.em.cm.if<'
|
||||||
|
0a-^^q"e2c-1u.doc'
|
||||||
|
0a-^^Q"e2c-1u.doc'
|
||||||
|
0a-^^r"ecm.cm.if<'
|
||||||
|
0a-^^R"ecm.cm.if<'
|
||||||
|
0a-^^s"es^Eu.em.cm.if<'
|
||||||
|
0a-^^S"es^Eu.em.cm.if<'
|
||||||
|
0a-^^t"ecm.cm.if<'
|
||||||
|
0a-^^T"ecm.cm.if<'
|
||||||
|
0a-^^u"e2cm.cm.if<'
|
||||||
|
0a-^^U"e2cm.cm.if<'
|
||||||
|
0a-^^v"ecm.cm.if<'
|
||||||
|
0a-^^V"ecm.cm.if<'
|
||||||
|
0a-^^w"ecm.cm.if<'
|
||||||
|
0a-^^W"ecm.cm.if<'
|
||||||
|
0a-^^x"e2cm.cm.if<'
|
||||||
|
0a-^^X"e2cm.cm.if<'
|
||||||
|
0a-^^y"ecm.cm.if<'
|
||||||
|
0a-^^Y"ecm.cm.if<'
|
||||||
|
0a-^^z"ec-1u.doc'
|
||||||
|
0a-^^Z"ec-1u.doc'
|
||||||
|
c
|
||||||
|
f<
|
||||||
|
!e!
|
||||||
|
c
|
||||||
|
0a-^^a"ecm.cm.if<'
|
||||||
|
0A-^^a"ecm.cm.if<'
|
||||||
|
0a-^^b"es^Eu.em.cm.if<'
|
||||||
|
0a-^^B"es^Eu.em.cm.if<'
|
||||||
|
0a-^^c"ecm.cm.if<'
|
||||||
|
0a-^^C"ecm.cm.if<'
|
||||||
|
0a-^^d"ecq.d"tm.cm.if<|-1u.doc''
|
||||||
|
0a-^^D"ecq.d"tm.cm.if<|-1u.doc''
|
||||||
|
0a-^^f"ecm.cm.if<'
|
||||||
|
0a-^^F"ecm.cm.if<'
|
||||||
|
0a-^^g"es^Eu.em.cm.if<'
|
||||||
|
0a-^^G"es^Eu.em.cm.if<'
|
||||||
|
0a-^^h"ecq.d"tm.cm.if<|-1u.doc''
|
||||||
|
0a-^^H"ecq.d"tm.cm.if<|-1u.doc''
|
||||||
|
0a-^^i"es^Eu.em.cm.if<'
|
||||||
|
0a-^^I"es^Eu.em.cm.if<'
|
||||||
|
0a-^^j"ec-1u.doc''
|
||||||
|
0a-^^J"ec-1u.doc''
|
||||||
|
0a-^^k"ecm.cm.if<'
|
||||||
|
0a-^^K"ecm.cm.if<'
|
||||||
|
0a-^^n"es^Eu.em.cm.if<'
|
||||||
|
0a-^^N"es^Eu.em.cm.if<'
|
||||||
|
0a-^^o"ec-1u.doc''
|
||||||
|
0a-^^O"ec-1u.doc''
|
||||||
|
0a-^^p"ecm.cm.if<'
|
||||||
|
0a-^^P"ecm.cm.if<'
|
||||||
|
0a-^^q"ecm.cm.if<'
|
||||||
|
0a-^^Q"ecm.cm.if<'
|
||||||
|
0a-^^r"es^Eu.em.cm.if<'
|
||||||
|
0a-^^R"es^Eu.em.cm.if<'
|
||||||
|
0a-^^s"ecq.d"tm.cm.if<|-1u.doc''
|
||||||
|
0a-^^S"ecq.d"tm.cm.if<|-1u.doc''
|
||||||
|
0a-^^t"ecq.d"tm.cm.if<|-1u.doc''
|
||||||
|
0a-^^T"ecq.d"tm.cm.if<|-1u.doc''
|
||||||
|
0a-^^u"ecq.d"tm.cm.if<|-1u.doc''
|
||||||
|
0a-^^U"ecq.d"tm.cm.if<|-1u.doc''
|
||||||
|
0a-^^v"ecq.d"tm.cm.if<|-1u.doc''
|
||||||
|
0a-^^V"ecq.d"tm.cm.if<|-1u.doc''
|
||||||
|
0a-^^w"es^Eu.em.cm.if<'
|
||||||
|
0a-^^W"es^Eu.em.cm.if<'
|
||||||
|
0a-^^x"ecm.cm.if<'
|
||||||
|
0a-^^X"ecm.cm.if<'
|
||||||
|
c
|
||||||
|
f<
|
||||||
|
!f!
|
||||||
|
c
|
||||||
|
0a-^^'"ecm.cm.if<'
|
||||||
|
0a-^^<"ecm.cm.if<'
|
||||||
|
0a-^^>"ecm.cm.if<'
|
||||||
|
0a-^^|"ecm.cm.if<'
|
||||||
|
0a-^^b"es^Eu.em.cm.if<'
|
||||||
|
0a-^^B"es^Eu.em.cm.if<'
|
||||||
|
0a-^^c"es^Eu.es^Eu.em.cm.if<'
|
||||||
|
0a-^^C"es^Eu.es^Eu.em.cm.if<'
|
||||||
|
0a-^^d"es^Eu.em.cm.if<'
|
||||||
|
0a-^^D"es^Eu.em.cm.if<'
|
||||||
|
0a-^^n"es^Eu.es^Eu.em.cm.if<'
|
||||||
|
0a-^^N"es^Eu.es^Eu.em.cm.if<'
|
||||||
|
0a-^^r"es^Eu.em.cm.if<'
|
||||||
|
0a-^^R"es^Eu.em.cm.if<'
|
||||||
|
0a-^^s"es^Eu.es^Eu.em.cm.if<'
|
||||||
|
0a-^^S"es^Eu.es^Eu.em.cm.if<'
|
||||||
|
0a-^^_"es^Eu.es^Eu.em.cm.if<'
|
||||||
|
c
|
||||||
|
>
|
||||||
|
|
||||||
|
[i
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
@^uu/<0a-13"e1;'0a"v0a-32id|c'>v/
|
||||||
|
q - register U loaded
|
||||||
|
|
||||||
|
|
@ -0,0 +1,469 @@
|
||||||
|
AAREADME.TXT
|
||||||
|
|
||||||
|
This directory contains TECO-C, a version of TECO written in C.
|
||||||
|
It was written in C so the author could move comfortably from VAX/VMS
|
||||||
|
to various other machines, including MicroVaxes, which couldn't execute
|
||||||
|
TECO-11 prior to VMS 5.0 because they don't support PDP-11 compatibility
|
||||||
|
mode. TECO32, distributed with v5.0, solved this problem.
|
||||||
|
|
||||||
|
TECO-C is meant to be a complete implementation of TECO as defined
|
||||||
|
by the Standard TECO User's Guide, which is in file TECO.DOC. There is no
|
||||||
|
manual for TECO-C itself, but the Standard TECO manual was the specification
|
||||||
|
for TECO-C, so it serves as an excellent manual. TECO-C departs from the
|
||||||
|
Standard manual in only a few places (like no video mode), listed in file
|
||||||
|
PROBLEMS.TXT. There is quick-and-dirty "wall chart" of all TECO commands
|
||||||
|
in file WCHART.TXT.
|
||||||
|
|
||||||
|
This version of TECO-C runs under VMX/VMS, MS-DOS, AmigaDOS and Unix
|
||||||
|
(SunOS, Ultrix and System V on a Data General Aviion). If you find bugs or
|
||||||
|
have any comments about TECO-C, please contact
|
||||||
|
|
||||||
|
Pete Siemsen Pete Siemsen
|
||||||
|
645 Ohio Avenue #302 University of Southern California
|
||||||
|
Long Beach, Ca. 90814 1020 West Jefferson Blvd.
|
||||||
|
Los Angeles, CA 90089-0251
|
||||||
|
|
||||||
|
(213) 433-3059 (home) (213) 740-7391 (work)
|
||||||
|
|
||||||
|
Internet: siemsen@usc.edu
|
||||||
|
|
||||||
|
The following sections describe how to use or build TECO-C for
|
||||||
|
different environments. The command line syntax is the same as the syntax
|
||||||
|
for TECO-11 command lines.
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
U N D E R V A X / V M S
|
||||||
|
|
||||||
|
TECO-C was mostly developed under VAX/VMS. It compiles and links
|
||||||
|
using VAX C 3.1 under VMS version 5.3.
|
||||||
|
|
||||||
|
To set up: inspect and modify ZVLOGIN.COM and then add it to your
|
||||||
|
LOGIN.COM
|
||||||
|
|
||||||
|
To compile: inspect/edit ZVBLD.COM, then SUBMIT it
|
||||||
|
|
||||||
|
To link: use the "LT" command (defined in ZVLOGIN.COM)
|
||||||
|
|
||||||
|
To run: inspect/edit the symbol definitions in ZVLOGIN.COM
|
||||||
|
Note: TECO-C uses the same command line syntax as TECO32
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
U N D E R M S - D O S
|
||||||
|
|
||||||
|
TECO-C compiles/links under Turbo C v2.00 under MS-DOS 4.01 and
|
||||||
|
Concurrent DOS 386 v3.0.
|
||||||
|
|
||||||
|
To build: run MAKE on MAKEFILE.TC. to build TECO from scratch say:
|
||||||
|
"make -fmakefile.tc -DALL". see MAKEFILE.TC for other make
|
||||||
|
-D options. also see MAKETECO.BAT.
|
||||||
|
|
||||||
|
To run: use TECO.BAT to edit a file or MUNG.BAT to run a macro,
|
||||||
|
for example: TECO filename.
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
U N D E R U N I X
|
||||||
|
|
||||||
|
To compile and link: use the make utility on "makefile.sun" (for SunOS) or
|
||||||
|
"makefile.ulx" (for Ultrix) or "makefile.dg" (for System V Unix
|
||||||
|
on a Data General Aviion).
|
||||||
|
|
||||||
|
To run: define aliases and environment variables in your .cshrc file.
|
||||||
|
Here's an example, assuming my initialization file is named
|
||||||
|
.tecorc and it's in my home directory, and my macros are in a
|
||||||
|
directory named tecoc under my main directory. You'll have to
|
||||||
|
change the directory names, of course.
|
||||||
|
|
||||||
|
setenv TEC_INIT \$/home/sol/siemsen/.tecorc
|
||||||
|
setenv TEC_LIBRARY /home/sol/siemsen/tecoc/
|
||||||
|
alias te '/home/sol/siemsen/tecoc/tecoc teco -nocreate'
|
||||||
|
alias mung '/home/sol/siemsen/tecoc/tecoc mung'
|
||||||
|
alias tma '/home/sol/siemsen/tecoc/tecoc make'
|
||||||
|
|
||||||
|
After doing this, "te" runs tecoc.
|
||||||
|
|
||||||
|
|
||||||
|
Unix Command line
|
||||||
|
---- ------- ----
|
||||||
|
|
||||||
|
To make Unix users more comfortable, TECO-C uses Unix-like options syntax
|
||||||
|
instead of the familiar "/" style used under VAX/VMS. The options can be
|
||||||
|
abbreviated. They are (optional characters in square brackets):
|
||||||
|
|
||||||
|
-in[spect]
|
||||||
|
-noc[reate]
|
||||||
|
-noi[ni]
|
||||||
|
-nom[emory]
|
||||||
|
-sc[roll]
|
||||||
|
-scroll:nnn:SEEALL
|
||||||
|
do nnn,7:W and 1,3:W
|
||||||
|
|
||||||
|
|
||||||
|
-nop[age]
|
||||||
|
Don't separate input into pages. Instead, treat form feeds as
|
||||||
|
normal characters.
|
||||||
|
+nnn
|
||||||
|
where nnn is any number of digits. Go to line number nnn and set
|
||||||
|
nopage. Note this uses the UNIX end of line convention for use with
|
||||||
|
cc output &c. The non-unix line termination will still be used for
|
||||||
|
nL and other intrinsic TECO commands, this just controls the
|
||||||
|
starting line AT INVOCATION.
|
||||||
|
|
||||||
|
|
||||||
|
EZ Mode Control Flag
|
||||||
|
-- ---- ------- ----
|
||||||
|
|
||||||
|
To add functionality, TECO-C is sensitive to bits in an extra mode control
|
||||||
|
flag in addition to the standard ones. Bits in the EZ mode control flag are
|
||||||
|
used in different ways by different operating systems. Under Unix, bits in
|
||||||
|
the flag have the following meanings:
|
||||||
|
|
||||||
|
1 Mark Henderson, who did much of the Unix port, likes the way
|
||||||
|
VAX/VMS keeps versions of files. VMS appends a semicolon followed
|
||||||
|
by a version number to files, and has the PURGE command to clean
|
||||||
|
out old versions of files. If this bit is off, TECO-C will handle
|
||||||
|
file version numbers, appending the appropriate version number to
|
||||||
|
file names. Mark supplied a "purge" program (distributed with TECO-C)
|
||||||
|
for users of this feature. Setting this flag turns off the feature,
|
||||||
|
to make TECO-C function as expected by the average Unix user. This
|
||||||
|
flag is set by default.
|
||||||
|
|
||||||
|
8 I don't know what this flag does. It only makes sense when TECO-C
|
||||||
|
is compiled with CURSES support.
|
||||||
|
|
||||||
|
16 If set, when it's time to beep, use an audio beep, and if it fails,
|
||||||
|
then try a video flash. If clear, try a video flash, and if it
|
||||||
|
fails, use an audio beep. This bit works only if TECO-C was compiled
|
||||||
|
with CURSES support. This bit is off by default.
|
||||||
|
|
||||||
|
32 If set, and split screen scrolling mode is on (see the 7:W command),
|
||||||
|
TECO-C puts a line between the upper and lower scrolling regions.
|
||||||
|
If off, don't display a line. This bit works only if TECO-C was
|
||||||
|
compiled with CURSES support. This bit is off by default.
|
||||||
|
|
||||||
|
128 If set, don't stop on form feeds when reading. If clear, a form
|
||||||
|
fed in the input stream stops the read (the standard TECO style).
|
||||||
|
This bit is off by default.
|
||||||
|
|
||||||
|
256 If set, use Unix-style newline terminators. This means when files
|
||||||
|
are read in, carriage-returns are not added to the end of lines,
|
||||||
|
and when the user types the RETURN key, only a newline is entered
|
||||||
|
into the command line (usually a carriage-return/line-feed pair is
|
||||||
|
entered). Old macros (and old TECO users) may get confused if this
|
||||||
|
bit is set, but it's required if CURSES support is compiled into
|
||||||
|
TECO-C.
|
||||||
|
|
||||||
|
2048 If set, use a bottom-tee symbol instead of a diamond to indicate
|
||||||
|
the end-of-buffer. This bit works only if TECO-C was compiled with
|
||||||
|
CURSES support. This bit is off by default.
|
||||||
|
|
||||||
|
8192 If set, don't show CR in SCROLL mode (like standard TECO). If clear,
|
||||||
|
show CR (a graphics character indicating a carriage return) when in
|
||||||
|
SCROLL mode. This bit works only if TECO-C was compiled with CURSES
|
||||||
|
support. This bit is on by default.
|
||||||
|
|
||||||
|
|
||||||
|
Filename Memory
|
||||||
|
-------- ------
|
||||||
|
|
||||||
|
TECO tries to remember the last file edited by TECO, so that after you've
|
||||||
|
edited a file once, you can re-edit without having to type the file name
|
||||||
|
on the command line. TECO-C implements this under Unix by writing and reading
|
||||||
|
files named /tmp/tecoxxx.tmp, where "xxx" is the process id of the parent
|
||||||
|
process.
|
||||||
|
|
||||||
|
|
||||||
|
NOTE: There is another TECO in C, written by Matt Fichtenbaum, which
|
||||||
|
runs under Unix. It is part of the DECUS TECO Collection. Contact Pete
|
||||||
|
Siemsen at the above address for a copy.
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
U N D E R A M I G A D O S
|
||||||
|
|
||||||
|
To compile and link: see makefile.ami, (note: it needs tecoc.lnk)
|
||||||
|
|
||||||
|
Comments from the author of the Amiga code:
|
||||||
|
|
||||||
|
I've completed my TECOC port to the Amiga. It has been tested on an
|
||||||
|
Amiga 1000 under AmigaDOS 1.3.2. My system configuration is:
|
||||||
|
|
||||||
|
68000 microprocessor
|
||||||
|
2.5 megs memory
|
||||||
|
80 meg hard drive
|
||||||
|
Old Amiga chip set
|
||||||
|
SAS Institute C for the Amiga version 5.10
|
||||||
|
|
||||||
|
TECO-C runs in the CLI window it was started from, and it should run
|
||||||
|
over a terminal hooked to an Amiga serial port as well.
|
||||||
|
|
||||||
|
Adding 'W' command stuff would probably best be done by one of the
|
||||||
|
termcap ports to the Amiga, however, TECO would have to handle
|
||||||
|
SIGWINCH-like events, unless it is modified to open it's own window of
|
||||||
|
a particular size without a resizing gadget. It wouldn't be to hard to
|
||||||
|
write a terminal driver for Amiga windows using hard-coded escape
|
||||||
|
sequences either, but then that would lose over a serial port.
|
||||||
|
|
||||||
|
EzFlag
|
||||||
|
------
|
||||||
|
|
||||||
|
The EZ flag is system-dependent. Under AmigaDOS, bits in the flag have the
|
||||||
|
following meanings:
|
||||||
|
|
||||||
|
128 If set, don't stop on form feeds when reading. If clear, a form
|
||||||
|
fed in the input stream stops the read (the standard TECO style).
|
||||||
|
This bit os off by default.
|
||||||
|
|
||||||
|
256 If set, use Unix-style newline terminators. This means when files
|
||||||
|
are read in, carriage-returns are not added to the end of lines,
|
||||||
|
and when the user types the RETURN key, only a newline is entered
|
||||||
|
into the command line (usually a carriage-return/line-feed pair is
|
||||||
|
entered). Old macros (and old TECO users) may get confused if this
|
||||||
|
bit is set, but it's required if CURSES support is compiled into
|
||||||
|
TECO-C.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
F I L E S
|
||||||
|
|
||||||
|
|
||||||
|
aareadme.txt this readme file
|
||||||
|
baksrc.c backwards search
|
||||||
|
bldstr.c build a string with string build constructs
|
||||||
|
change.tec change macro squished
|
||||||
|
change.tes change macro source. this macro allows you to
|
||||||
|
replace one string with another in a group of
|
||||||
|
files using match constructs.
|
||||||
|
changes.txt contains teco-c release notes starting from
|
||||||
|
version 1.00 (TVERSION = 100)
|
||||||
|
chmacs.h ctype.h for teco-c
|
||||||
|
clenup.c clean up before exiting teco-c
|
||||||
|
clpars.h command line parsing macro, created by genclp.c
|
||||||
|
clpars.tec command line parsing macro squished
|
||||||
|
clpars.tes command line parsing macro source
|
||||||
|
cmatch.c match character with match construct
|
||||||
|
date.tec date macro squished
|
||||||
|
date.tes date macro source. this macro displays the
|
||||||
|
date and time.
|
||||||
|
dchars.h define identifiers for control characters
|
||||||
|
deferr.h define identifiers for error messages
|
||||||
|
defext.h EXTERN decarations for global variables
|
||||||
|
detab.tec de-tabify macro squished
|
||||||
|
detab.tes de-tabify macro source. this macro converts
|
||||||
|
tabs to spaces
|
||||||
|
dir.tec "display directory" macro, in squished form
|
||||||
|
dir.tes "display directory" macro source. This macro simply
|
||||||
|
displays the directory. a wildcarded filename
|
||||||
|
in the edit buffer can control what is displayed.
|
||||||
|
docjr.c code common to ExeC, ExeJ, and ExeR
|
||||||
|
doeves.c work code for EV and ES
|
||||||
|
doflag.c changes a mode control flag (ED,EH,ES,ET,EU,EV,^X)
|
||||||
|
dscren.h terminal types for 0:W command
|
||||||
|
echoit.c display character in its printable form
|
||||||
|
err.c display teco-c's error messages
|
||||||
|
exea.c execute A
|
||||||
|
exeats.c execute at-sign @
|
||||||
|
exeb.c execute B
|
||||||
|
exebar.c execute |
|
||||||
|
exebsl.c execute backslash \
|
||||||
|
exec.c execute C
|
||||||
|
execcc.c execute control-caret ^^
|
||||||
|
execln.c execute colon modifiers : and ::
|
||||||
|
execom.c execute comma ,
|
||||||
|
execrt.c execute caret ^
|
||||||
|
execst.c execute a TECO command string
|
||||||
|
execta.c execute ^A
|
||||||
|
exectc.c execute ^C
|
||||||
|
exectd.c execute ^D
|
||||||
|
execte.c execute ^E
|
||||||
|
execti.c execute ^I
|
||||||
|
exectl.c execute ^L
|
||||||
|
exectn.c execute ^N
|
||||||
|
execto.c execute ^O
|
||||||
|
exectp.c execute ^P
|
||||||
|
exectq.c execute ^Q
|
||||||
|
exectr.c execute ^R
|
||||||
|
exects.c execute ^S
|
||||||
|
exectt.c execute ^T
|
||||||
|
exectu.c execute ^U
|
||||||
|
exectv.c execute ^V
|
||||||
|
exectw.c execute ^W
|
||||||
|
exectx.c execute ^X
|
||||||
|
execty.c execute ^Y
|
||||||
|
exectz.c execute ^Z
|
||||||
|
exed.c execute D
|
||||||
|
exedgt.c execute digit (0-9)
|
||||||
|
exedot.c execute dot .
|
||||||
|
exedqu.c execute double quote "
|
||||||
|
exee.c execute E
|
||||||
|
exeequ.c execute equals =, ==, and ===
|
||||||
|
exeesc.c execute escape
|
||||||
|
exeexc.c execute exclamation point !
|
||||||
|
exeey.c execute EY
|
||||||
|
exef.c execute F
|
||||||
|
exefb.c execute FB
|
||||||
|
exeg.c execute G
|
||||||
|
exegtr.c execute greater than sign >
|
||||||
|
exeh.c execute H
|
||||||
|
exei.c execute I
|
||||||
|
exeill.c "execute" illegal command
|
||||||
|
exej.c execute J
|
||||||
|
exek.c execute K
|
||||||
|
exel.c execute L
|
||||||
|
exelbr.c execute left-bracket [
|
||||||
|
exelst.c execute less than sign <
|
||||||
|
exem.c execute M
|
||||||
|
exen.c execute N
|
||||||
|
exenul.c execute null ^@
|
||||||
|
exenyi.c "execute" not-yet-implemented command
|
||||||
|
exeo.c execute O
|
||||||
|
exeopr.c execute operator (+,-,(,#,/,&,^_,*)
|
||||||
|
exep.c execute P (see singlp.c)
|
||||||
|
exeprc.c execute percent sign %
|
||||||
|
exepw.c execute PW
|
||||||
|
exeq.c execute Q
|
||||||
|
exeqes.c execute question mark ?
|
||||||
|
exer.c execute R
|
||||||
|
exerbr.c execute right bracket ]
|
||||||
|
exertp.c execute right paren )
|
||||||
|
exes.c execute S
|
||||||
|
exescl.c execute semicolon ;
|
||||||
|
exet.c execute T
|
||||||
|
exeu.c execute U
|
||||||
|
exeund.c execute underscore _
|
||||||
|
exeusc.c execute unit separator character ^_
|
||||||
|
exev.c execute V
|
||||||
|
exew.c execute W
|
||||||
|
exex.c execute X
|
||||||
|
exey.c execute Y
|
||||||
|
exez.c execute Z
|
||||||
|
findes.c find end of string
|
||||||
|
findqr.c find q-register name
|
||||||
|
flowec.c flow to end of conditional
|
||||||
|
flowee.c flow to else part of conditional
|
||||||
|
flowel.c flow to end of loop
|
||||||
|
fmtmac.tec PDP-11 .MAC formatter squished
|
||||||
|
fmtmac.tes PDP-11 .MAC formatter source. this macro does
|
||||||
|
case formatting for PDP-11 macro (.MAC) source files
|
||||||
|
format.tec FORTRAN formatter squished
|
||||||
|
format.tes FORTRAN formatter source. formats the first part of
|
||||||
|
a FORTRAN source line.
|
||||||
|
genclp.c generates the command line parsing macro in clpars.h
|
||||||
|
getara.c get area in edit buffer an "m,n" argument defines
|
||||||
|
getnma.c get numeric argument off expression stack
|
||||||
|
inccbp.c increments command buffer pointer
|
||||||
|
init.c teco-c initializatin routines
|
||||||
|
insstr.c insert string into edit buffer
|
||||||
|
isradx.c is digit within current radix?
|
||||||
|
ln2chr.c convert line-number to character-number (^Q)
|
||||||
|
lowcase.tec convert edit buffer to lowercase macro, see upcase.tec
|
||||||
|
makdbf.c make digit buffer, binary to ascii in current radix
|
||||||
|
makefile.ami AmigaDOS make file
|
||||||
|
makefile.cct CodeCenter under SunOS
|
||||||
|
makefile.dg System V Unix make file (works on Data General Aviion)
|
||||||
|
makefile.sun SunOS make file
|
||||||
|
makefile.tc Turbo C make file (MS-DOS)
|
||||||
|
makefile.ulx Ultrix make file
|
||||||
|
maketeco.bat MS-DOS batch file to make teco. this is probably how
|
||||||
|
the temdos.exe executable file was made.
|
||||||
|
makprnt.tec make printable macro squished
|
||||||
|
makprnt.tes make printable macro squished. this macro makes a
|
||||||
|
string with embedded control characters printable
|
||||||
|
makrom.c make room in Q-register for new text
|
||||||
|
mung.bat MS-DOS batch to execute a teco macro from command line
|
||||||
|
pg.mem a programmer's guide. it may be useful to anyone
|
||||||
|
fixing bugs, adding features, or porting teco-c to
|
||||||
|
a new environment.
|
||||||
|
pkzip.rsp a PKZIP response file used to build TECOC.ZIP archive
|
||||||
|
popmac.c pop macro environment off macro stack
|
||||||
|
problems.txt contains notes about bugs and ideas
|
||||||
|
pshmac.c push current macro environment on macro stack
|
||||||
|
pushex.c push expression onto stack, try to reduce it
|
||||||
|
rdline.c read a line
|
||||||
|
rdpage.c read a page
|
||||||
|
readcs.c read command string
|
||||||
|
replac.c code for search and replace commands
|
||||||
|
search.c code for most of the search comamnds
|
||||||
|
search.tec search macro squished
|
||||||
|
search.tes search macro source. this macro finds a string in
|
||||||
|
a group of files using teco match constructs
|
||||||
|
singlp.c does a single P command
|
||||||
|
skpcmd.c skip over current command in command bufer
|
||||||
|
squ.bat MS-DOS batch file to run squ.tec w/standard options
|
||||||
|
squ.tec squish macro squished
|
||||||
|
squ.tes squish macro source. this macro takes a teco macro
|
||||||
|
source file and makes it as small and as fast (and
|
||||||
|
as unreadable) as possible
|
||||||
|
srclop.c search loop, handles loop arguments for search
|
||||||
|
sserch.c do a simple search
|
||||||
|
sub.tec ?
|
||||||
|
tabort.c terminate teco-c
|
||||||
|
tctlib.rsp a Turbo C TLIB response file used by makefile.tc
|
||||||
|
teco.bat MS-DOS batch file to run teco-c
|
||||||
|
teco.doc Standard TECO documentation from DECUS
|
||||||
|
teco.tes teco initialization file
|
||||||
|
tecoc.c the main source module, contains all the definitions
|
||||||
|
of system-independent global variables, as well as
|
||||||
|
comments explaining what they are.
|
||||||
|
tecoc.exe the teco-c executable for VMS
|
||||||
|
tecoc.h defines structures, general identifiers, and
|
||||||
|
the in-line debugging scheme.
|
||||||
|
tecoc.lnk link file needed under AmigaDOS (see makefile.ami)
|
||||||
|
tecoin.tes teco initialization file
|
||||||
|
temsdos.exe the teco-c executable for MS-DOS
|
||||||
|
tst.bat MS-DOS batch file to run the test macros
|
||||||
|
tst.com VMS command procedure to run the test macros
|
||||||
|
tstbsl.tec --
|
||||||
|
tstcss.tec |
|
||||||
|
tstequ.tec | these macros contain code which tests some
|
||||||
|
tsto.tec | aspects of teco-c
|
||||||
|
tstpw.tec |
|
||||||
|
tstqr.tec |
|
||||||
|
tstsrc.tec --
|
||||||
|
typbuf.c types a buffer on the screen, converting unprintable
|
||||||
|
characters to printable as nescessary.
|
||||||
|
type.tec type a file macro squished
|
||||||
|
type.tes type a file macro source. this macro apparently
|
||||||
|
types a file on the console with all kinds of
|
||||||
|
wonderful options.
|
||||||
|
typest.c types the erroneous command string for errors
|
||||||
|
uminus.c unary minus (converts -C to -1C)
|
||||||
|
unsqu.tec unsquish macro squished
|
||||||
|
unsqu.tes unsquish macro source. this macro does some simple
|
||||||
|
formatting of a squished teco macro to make it more
|
||||||
|
readable (like indenting)
|
||||||
|
upcase.tec convert edit buffer to uppercase macro, see lowcase.tec
|
||||||
|
vrbmsg.h verbose forms of teco error messages
|
||||||
|
vtedit.tec vtedit macro squished
|
||||||
|
vtedit.tes vtedit macro source. humongous screen editor macro.
|
||||||
|
note: this macro does NOT run under teco-c.
|
||||||
|
wchart.txt contains a wall chart of TECO commands
|
||||||
|
wrpage.c write a page
|
||||||
|
zamiga.c AmigaDOS system dependent code.
|
||||||
|
zfirst.c dummy module used if CHECKSUM_CODE is TRUE in zport.h
|
||||||
|
zfrsrc.c do a forward search using VAX SCANC instruction
|
||||||
|
zmsdos.c MS-DOS system dependant code
|
||||||
|
zport.h portability header file.
|
||||||
|
zunix.c SunOS (Unix) system dependant code
|
||||||
|
zunkn.c UNKNOWN system dependant code (function stubs)
|
||||||
|
zvms.c VAX/VMS system dependant code
|
||||||
|
|
||||||
|
|
||||||
|
The W command does not work, but the EXEW.C file contains code
|
||||||
|
to tell you what the command would have done if it had been executed. I used
|
||||||
|
this to play with executing VTEDIT.TEC under TECOC in order to find bugs.
|
||||||
|
|
||||||
|
I maintain the DECUS TECO Collection, a bunch of stuff relating to
|
||||||
|
TECO. It includes sources for DEC's TECO-11 v39, three TECOs written in C,
|
||||||
|
including ones for VAX/VMS, MS-DOS, SunOS (Unix) and Ultrix, the current
|
||||||
|
Standard TECO manual, two EMACs-like macro packages and LOTS of macros.
|
||||||
|
|
||||||
|
I you have something that you feel should be included in this
|
||||||
|
collection, or if you would like to improve the software, please contact
|
||||||
|
me at the above address.
|
||||||
|
|
||||||
|
|
||||||
|
Pete Siemsen
|
||||||
|
|
@ -0,0 +1,333 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
This program provides basic communication with a remote computer.
|
||||||
|
The remote machine is connected to /dev/tty01. It is assumed to be a VAX
|
||||||
|
running VMS. This program sends whatever is typed at the keyboard to the
|
||||||
|
remote machine and puts whatever the remote machine sends on the terminal
|
||||||
|
screen.
|
||||||
|
When this program is invoked, connections to the serial port and
|
||||||
|
the keyboard are made and the user is left in the communication state. To
|
||||||
|
terminate the program, use control-N, then period.
|
||||||
|
A special feature is the "trapping" of what the modem sends to one
|
||||||
|
or more files. Basically, the program was written to provide a way to
|
||||||
|
get a large number of files from the VAX to this machine (XENIX). The idea
|
||||||
|
is to log in to the VAX and execute a command like "TYPE *.C". When VAX/VMS
|
||||||
|
types out files which match the wildcard filename "*.C", it
|
||||||
|
precedes the text of each file with a header line containing the file name.
|
||||||
|
This program is sensitive to these headers, and uses them to name output
|
||||||
|
files. Thus, running this program and typing "TYPE *.C" to VMS on the
|
||||||
|
remote machine should produce one file in the current directory for each
|
||||||
|
file typed on the remote machine.
|
||||||
|
This program seems to be similar to the CU program provided by UNIX.
|
||||||
|
When I wrote the first version of this program, I didn't know about CU.
|
||||||
|
When I learned of CU, I had trouble getting it working, so I just decided
|
||||||
|
to use this program.
|
||||||
|
A feature of setting port characteristics with stty is that the port's
|
||||||
|
characteristics remain set after the program exits. This is inconvenient in
|
||||||
|
the case of the console, so this program tries to re-set the characteristics
|
||||||
|
before exiting.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <sgtty.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#define BOOLEAN char
|
||||||
|
#define CMPECHO 0777767 /* complement of ECHO in sgtty.h */
|
||||||
|
#define KEY "SD0:[PETE.TECO.TECOC]"
|
||||||
|
#define KEY_LEN 21
|
||||||
|
#define FALSE 0
|
||||||
|
#define TRUE 1
|
||||||
|
char buffer[100]; /* character buffer */
|
||||||
|
char chr; /* one character */
|
||||||
|
struct sgttyb cons_cb; /* console charactertistics block */
|
||||||
|
int cons_fd; /* console file descriptor */
|
||||||
|
int cons_flags_saved; /* saved value of cons_cb.sg_flags */
|
||||||
|
BOOLEAN cons_opened; /* console need to be closed? */
|
||||||
|
BOOLEAN cons_set; /* console characteristics changed? */
|
||||||
|
struct sgttyb modm_cb; /* modem characteristics block */
|
||||||
|
int modm_fd; /* modem file descriptor */
|
||||||
|
int modm_flags_saved; /* saved value of modm_cb.sg_flags */
|
||||||
|
char modm_ispeed_saved; /* saved value of modm_cb.sg_ispeed */
|
||||||
|
char modm_ospeed_saved; /* saved value of modm_cb.sg_ospeed */
|
||||||
|
BOOLEAN modm_opened; /* does the modem need to be closed? */
|
||||||
|
BOOLEAN modm_set; /* modem characteristics changed? */
|
||||||
|
int proc_id; /* process identification */
|
||||||
|
BOOLEAN trapping; /* trapping modem input to a file? */
|
||||||
|
FILE *splice_fp; /* splice file descriptor */
|
||||||
|
FILE *trap_fp; /* capture file descriptor */
|
||||||
|
reset_modm_port()
|
||||||
|
{
|
||||||
|
modm_cb.sg_ispeed = modm_ispeed_saved;
|
||||||
|
modm_cb.sg_ospeed = modm_ospeed_saved;
|
||||||
|
modm_cb.sg_flags = modm_flags_saved;
|
||||||
|
printf("Amodem: re-sttying the modem port\n");
|
||||||
|
if (stty(modm_fd, &modm_cb) != 0)
|
||||||
|
{
|
||||||
|
printf("Amodem: couldn't re-stty the modem port\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close_modm_port()
|
||||||
|
{
|
||||||
|
printf("Amodem: closing the modem port\n");
|
||||||
|
if (close(modm_fd) == -1)
|
||||||
|
{
|
||||||
|
printf("Amodem: couldn't close the modem port\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reset_cons_port()
|
||||||
|
{
|
||||||
|
cons_cb.sg_flags = cons_flags_saved;
|
||||||
|
printf("Amodem: re-sttying the console port\r\n");
|
||||||
|
if (stty(cons_fd, &cons_cb) != 0)
|
||||||
|
{
|
||||||
|
printf("Amodem: couldn't re-stty the console port\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close_cons_port()
|
||||||
|
{
|
||||||
|
printf("Amodem: closing the console port\r\n");
|
||||||
|
if (close(cons_fd) == -1)
|
||||||
|
{
|
||||||
|
printf("Amodem: couldn't close the console port\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cleanup_and_exit()
|
||||||
|
{
|
||||||
|
if (proc_id == 0)
|
||||||
|
{
|
||||||
|
if (trapping)
|
||||||
|
{
|
||||||
|
printf("Amodem: closing trap file\r\n");
|
||||||
|
if (fclose(trap_fp) == EOF)
|
||||||
|
printf("cleanup: unable to close trap file\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (cons_set)
|
||||||
|
reset_cons_port();
|
||||||
|
if (cons_opened)
|
||||||
|
close_cons_port();
|
||||||
|
if (modm_set)
|
||||||
|
reset_modm_port();
|
||||||
|
if (modm_opened)
|
||||||
|
close_modm_port();
|
||||||
|
}
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
open_console() /* open console port */
|
||||||
|
{
|
||||||
|
cons_fd = open("/dev/tty",2);
|
||||||
|
if (cons_fd == -1)
|
||||||
|
{
|
||||||
|
printf ("Amodem: couldn't open the console port\n");
|
||||||
|
cleanup_and_exit();
|
||||||
|
}
|
||||||
|
cons_opened = TRUE;
|
||||||
|
if (gtty(cons_fd, &cons_cb) != 0)
|
||||||
|
{
|
||||||
|
printf("Amodem: couldn't gtty the console port\n");
|
||||||
|
cleanup_and_exit();
|
||||||
|
}
|
||||||
|
cons_flags_saved = cons_cb.sg_flags;
|
||||||
|
cons_cb.sg_flags = RAW;
|
||||||
|
if (stty(cons_fd, &cons_cb) != 0)
|
||||||
|
{
|
||||||
|
printf("Amodem: couldn't stty the console port\n");
|
||||||
|
cleanup_and_exit();
|
||||||
|
}
|
||||||
|
cons_set = TRUE;
|
||||||
|
}
|
||||||
|
open_modem() /* open modem port (serial port A, or /dev/tty01)*/
|
||||||
|
{
|
||||||
|
modm_fd = open("/dev/tty01",2);
|
||||||
|
if (modm_fd == -1)
|
||||||
|
{
|
||||||
|
printf ("Amodem: couldn't open the modem port\n");
|
||||||
|
cleanup_and_exit();
|
||||||
|
}
|
||||||
|
modm_opened = TRUE;
|
||||||
|
if (gtty(modm_fd, &modm_cb) != 0)
|
||||||
|
{
|
||||||
|
printf("Amodem: couldn't gtty the modem port\n");
|
||||||
|
cleanup_and_exit();
|
||||||
|
}
|
||||||
|
modm_ispeed_saved = modm_cb.sg_ispeed;
|
||||||
|
modm_ospeed_saved = modm_cb.sg_ospeed;
|
||||||
|
modm_cb.sg_ispeed = modm_cb.sg_ospeed = B1200;
|
||||||
|
modm_flags_saved = modm_cb.sg_flags;
|
||||||
|
modm_cb.sg_flags = RAW;
|
||||||
|
if (stty(modm_fd, &modm_cb) != 0)
|
||||||
|
{
|
||||||
|
printf("Amodem: couldn't stty the modem port\n");
|
||||||
|
cleanup_and_exit();
|
||||||
|
}
|
||||||
|
modm_set = TRUE;
|
||||||
|
}
|
||||||
|
cmd_char()
|
||||||
|
{
|
||||||
|
#define FBFSIZ 20
|
||||||
|
#define MAXLINE 132
|
||||||
|
int idx;
|
||||||
|
char FNamBuf[FBFSIZ];
|
||||||
|
char fline[MAXLINE];
|
||||||
|
char *line;
|
||||||
|
read(cons_fd, &chr, 1);
|
||||||
|
switch (chr){
|
||||||
|
case '.':
|
||||||
|
if (kill(proc_id, SIGTERM) != 0)
|
||||||
|
printf("cmd_char: kill failed\n");
|
||||||
|
cleanup_and_exit();
|
||||||
|
break;
|
||||||
|
case '\016':
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
case 'S':
|
||||||
|
printf("\r\nname of file to splice into output: ");
|
||||||
|
idx = 0;
|
||||||
|
while (chr != '\15')
|
||||||
|
{
|
||||||
|
read(cons_fd, &chr, 1);
|
||||||
|
write(cons_fd, &chr, 1);
|
||||||
|
if (chr == '\15')
|
||||||
|
{
|
||||||
|
FNamBuf[idx] = '\0';
|
||||||
|
write(cons_fd, "\n", 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FNamBuf[idx] = chr;
|
||||||
|
if (idx++ > FBFSIZ)
|
||||||
|
{
|
||||||
|
printf("file name too long\r\n");
|
||||||
|
chr = '\15';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (access(FNamBuf, 4) != 0)
|
||||||
|
{
|
||||||
|
printf("that file does not exist\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((splice_fp = fopen(FNamBuf, "r")) == NULL)
|
||||||
|
{
|
||||||
|
printf("\tUnable to open %s\r\n", FNamBuf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
line = &fline[0];
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
line = fgets(line, MAXLINE, splice_fp);
|
||||||
|
if (line == NULL)
|
||||||
|
break;
|
||||||
|
write(modm_fd, line, strlen(line) - 1);
|
||||||
|
write(modm_fd, "\r", 1);
|
||||||
|
}
|
||||||
|
if (fclose(splice_fp) == EOF)
|
||||||
|
{
|
||||||
|
printf("Unable to close %s\r\n", FNamBuf);
|
||||||
|
cleanup_and_exit();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("\r\n");
|
||||||
|
printf("\r\n");
|
||||||
|
printf("Control-N options are:");
|
||||||
|
printf("\r\n");
|
||||||
|
printf("\r\n");
|
||||||
|
printf("1.\t. to terminate this program");
|
||||||
|
printf("\r\n");
|
||||||
|
printf("2.\t^n to send a control-N");
|
||||||
|
printf("\r\n");
|
||||||
|
printf("3.\ts to splice a file into the output");
|
||||||
|
printf("\r\n");
|
||||||
|
printf("\r\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tst_line() /* if line contains the key, trap to file */
|
||||||
|
{
|
||||||
|
char *index();
|
||||||
|
char *semi;
|
||||||
|
char *tmpptr;
|
||||||
|
if (strncmp(buffer, KEY, KEY_LEN) == 0)
|
||||||
|
{
|
||||||
|
if (trapping)
|
||||||
|
if (fclose(trap_fp) == EOF)
|
||||||
|
{
|
||||||
|
printf("Amodem: unable to close trap file\n");
|
||||||
|
cleanup_and_exit();
|
||||||
|
}
|
||||||
|
semi = index(buffer, ';');
|
||||||
|
*semi = '\0';
|
||||||
|
tmpptr = buffer;
|
||||||
|
while (*tmpptr != '\0')
|
||||||
|
{
|
||||||
|
if (isupper(*tmpptr))
|
||||||
|
*tmpptr = tolower(*tmpptr);
|
||||||
|
tmpptr++;
|
||||||
|
}
|
||||||
|
if ((trap_fp = fopen(&buffer[KEY_LEN], "w")) == NULL)
|
||||||
|
{
|
||||||
|
printf("Unable to create file AMODEM.OUT\r\n");
|
||||||
|
cleanup_and_exit();
|
||||||
|
}
|
||||||
|
trapping = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parent_send() /* reads keyboard, sends to tty01 */
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
read(cons_fd, &chr, 1);
|
||||||
|
if (chr == '\016')
|
||||||
|
cmd_char();
|
||||||
|
write(modm_fd, &chr, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
child_receive() /* reads tty01, sends to terminal screen */
|
||||||
|
{
|
||||||
|
char *ptr;
|
||||||
|
ptr = &buffer[0];
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
read(modm_fd, &chr, 1);
|
||||||
|
write(cons_fd, &chr, 1);
|
||||||
|
if ((trapping) && (chr != '\r'))
|
||||||
|
putc(chr, trap_fp);
|
||||||
|
*ptr++ = chr;
|
||||||
|
if (chr == '\n')
|
||||||
|
{
|
||||||
|
tst_line();
|
||||||
|
ptr = &buffer[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
cons_opened = cons_set = modm_opened = modm_set = trapping = FALSE;
|
||||||
|
signal(SIGINT, cleanup_and_exit);
|
||||||
|
signal(SIGTERM, cleanup_and_exit);
|
||||||
|
open_console(),
|
||||||
|
open_modem();
|
||||||
|
printf("\r\n");
|
||||||
|
printf("\r\n");
|
||||||
|
printf("Communication established.");
|
||||||
|
printf("\r\n");
|
||||||
|
printf("\r\n");
|
||||||
|
proc_id = fork();
|
||||||
|
if (proc_id == -1)
|
||||||
|
{
|
||||||
|
printf("Amodem: fork failed\n");
|
||||||
|
cleanup_and_exit();
|
||||||
|
}
|
||||||
|
if (proc_id == 0)
|
||||||
|
child_receive();
|
||||||
|
else
|
||||||
|
parent_send();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,338 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
BakSrc()
|
||||||
|
This recursive function does a backward search in the edit buffer,
|
||||||
|
looking for a string which will match the first match construct in the search
|
||||||
|
buffer. Basically, it is the high-speed part of the search algorithm: it
|
||||||
|
scans the edit buffer looking for the first character in the search string.
|
||||||
|
On entry, SStPtr points to the first match construct in the search
|
||||||
|
buffer. On exit, SStPtr points to the last character of the first match
|
||||||
|
construct in the search buffer.
|
||||||
|
SBfPtr points to the character following the last character in
|
||||||
|
the search string. This function does not modify SBfPtr.
|
||||||
|
On entry, EBPtr1 points to the place in the edit buffer where
|
||||||
|
the search starts. On exit, if the search was successful, EBPtr1 will
|
||||||
|
point to the found character. If the search was unsuccessful, EBPtr1 will
|
||||||
|
be less than EndSAr.
|
||||||
|
On entry, EBPtr2 is undefined. On exit, if the search was
|
||||||
|
successful, EBPtr2 points to the last character of the found string. If
|
||||||
|
the search was unsuccessful, EBPtr2 is undefined.
|
||||||
|
EndSAr points to the end of the search area (where the search ends).
|
||||||
|
Note that for backwards searches, EndSAr is less than EBPtr1. This function
|
||||||
|
does not modify EndSAr.
|
||||||
|
Match constructs are:
|
||||||
|
^X match any character
|
||||||
|
^S match a separator character (not letter or digit)
|
||||||
|
^N match anything but following match construct
|
||||||
|
^EA match any alphabetic
|
||||||
|
^EB match a separator character (not letter or digit)
|
||||||
|
^EC match symbol constituent
|
||||||
|
^ED match any digit
|
||||||
|
^EGq match any character in q-register q
|
||||||
|
^EL match any line terminator (LF, VT, FF)
|
||||||
|
^EM match non-null string of following match construct
|
||||||
|
^ER match any alphanumeric
|
||||||
|
^ES match non-null string of spaces and/or tabs
|
||||||
|
^EV match lowercase alphabetic
|
||||||
|
^EW match uppercase alphabetic
|
||||||
|
^EX match any character
|
||||||
|
^E<nnn> match character with ASCII code nnn (octal)
|
||||||
|
^E[x1,x2,...xn] match any of the match constructs x1, x2, etc.
|
||||||
|
else match the character itself
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "dchars.h" /* define identifiers for characters */
|
||||||
|
#include "chmacs.h" /* define character processing macros */
|
||||||
|
#include "deferr.h" /* define identifiers for error messages */
|
||||||
|
DEFAULT BakSrc() /* forward search for 1st search char */
|
||||||
|
{
|
||||||
|
unsigned char Charac; /* holds a character */
|
||||||
|
charptr LstBeg; /* beginning of ^E[x1,x2,...] list */
|
||||||
|
char OtCase; /* "other" case character */
|
||||||
|
charptr QRPtr; /* pointer into q-register text */
|
||||||
|
BOOLEAN SamChr; /* same character indicator */
|
||||||
|
charptr SavEP2; /* temporary holder of EBPtr2 */
|
||||||
|
charptr SavSSP; /* temporary holder of SStPtr */
|
||||||
|
DEFAULT Status; /* FindQR() status for ^EGq */
|
||||||
|
charptr TCBfPt; /* temporary holder of CBfPtr */
|
||||||
|
charptr TCStEn; /* temporary holder of CStEnd */
|
||||||
|
LONG TmpLng; /* holds octal number for ^E<nnn> */
|
||||||
|
#if DEBUGGING
|
||||||
|
static char *DbgFNm = "BakSrc";
|
||||||
|
sprintf(DbgSBf,"*SStPtr = '%c', *EBPtr1 = '%c'", *SStPtr, *EBPtr1);
|
||||||
|
DbgFEn(3,DbgFNm,DbgSBf);
|
||||||
|
#endif
|
||||||
|
switch (*SStPtr) {
|
||||||
|
case CTRL_X: /* ^X match any char */
|
||||||
|
break;
|
||||||
|
case CTRL_S: /* ^S match separator char */
|
||||||
|
for (; EBPtr1 >= EndSAr; --EBPtr1) {
|
||||||
|
if (!Is_Alnum(*EBPtr1)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CTRL_N: /* ^Nx match any BUT next match construct */
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ISS); /* illegal search string */
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE, no ^N arg");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
SavSSP = SStPtr;
|
||||||
|
for (;EBPtr1>=EndSAr;--EBPtr1) {
|
||||||
|
EBPtr2 = EBPtr1;
|
||||||
|
SStPtr = SavSSP;
|
||||||
|
if (CMatch(&SamChr) == FAILURE) {
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE, CMatch failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (!SamChr) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CTRL_E: /* ^E match construct */
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE); /* ICE = illegal ^E */
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE, no ^E arg");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
switch (To_Upper(*SStPtr)) {
|
||||||
|
case 'A': /* ^EA match any alphabetic */
|
||||||
|
for (; EBPtr1 >= EndSAr; --EBPtr1) {
|
||||||
|
if (Is_Alpha(*EBPtr1)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'B': /* ^EB match any separator (==^S) */
|
||||||
|
for (; EBPtr1 >= EndSAr; --EBPtr1) {
|
||||||
|
if (!Is_Alnum(*EBPtr1)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'C': /* ^EC match symbol constitient */
|
||||||
|
for (; EBPtr1 >= EndSAr; --EBPtr1) {
|
||||||
|
if (Is_SyCon(*EBPtr1)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'D': /* ^ED match any digit */
|
||||||
|
for (; EBPtr1 >= EndSAr; --EBPtr1) {
|
||||||
|
if (Is_Digit(*EBPtr1)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'G': /* ^EGq match any char in Q-reg q */
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE, no ^EG arg");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
TCBfPt = CBfPtr; /* save CBfPtr */
|
||||||
|
TCStEn = CStEnd; /* save CStEnd */
|
||||||
|
CBfPtr = SStPtr;
|
||||||
|
CStEnd = SBfPtr;
|
||||||
|
Status = FindQR();
|
||||||
|
SStPtr = CBfPtr;
|
||||||
|
SBfPtr = CStEnd;
|
||||||
|
CBfPtr = TCBfPt; /* restore CBfPtr */
|
||||||
|
CStEnd = TCStEn; /* restore CStEnd */
|
||||||
|
if (Status == FAILURE) {
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE, ^EG FindQR failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
for (; EBPtr1 >= EndSAr; --EBPtr1) {
|
||||||
|
QRPtr = QR->Start;
|
||||||
|
while (QRPtr < QR->End_P1) {
|
||||||
|
if (*QRPtr++ == *EBPtr1) {
|
||||||
|
goto kludge;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
kludge: break;
|
||||||
|
case 'L': /* ^EL match line terminator */
|
||||||
|
for (; EBPtr1 >= EndSAr; --EBPtr1) {
|
||||||
|
if (IsEOL(*EBPtr1)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'M': /* ^EM match multiple next constructs */
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE, no ^EM arg");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
SavSSP = SStPtr;
|
||||||
|
if (BakSrc() == FAILURE) {
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (EBPtr1 < EndSAr) { /* if not found */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
SavEP2 = EBPtr2;
|
||||||
|
while (EBPtr1 > EndSAr) {
|
||||||
|
EBPtr1--;
|
||||||
|
EBPtr2 = EBPtr1;
|
||||||
|
SStPtr = SavSSP;
|
||||||
|
if (CMatch(&SamChr) == FAILURE) {
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (!SamChr) {
|
||||||
|
EBPtr1++;
|
||||||
|
EBPtr2 = SavEP2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DBGFEX(3,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
case 'R': /* ^ER match any alphanumeric */
|
||||||
|
for (; EBPtr1 >= EndSAr; --EBPtr1) {
|
||||||
|
if (Is_Alnum(*EBPtr1)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'S': /* ^ES match any spaces/tabs */
|
||||||
|
for (; EBPtr1 >= EndSAr; --EBPtr1) {
|
||||||
|
if ((*EBPtr1 == SPACE) || (*EBPtr1 == TABCHR)) {
|
||||||
|
EBPtr2 = EBPtr1;
|
||||||
|
while (EBPtr1 > EndSAr) {
|
||||||
|
EBPtr1--;
|
||||||
|
if ((*EBPtr1 != SPACE) &&
|
||||||
|
(*EBPtr1 != TABCHR)) {
|
||||||
|
EBPtr1++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DBGFEX(3,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'V': /* ^EV match any lowercase char */
|
||||||
|
for (; EBPtr1 >= EndSAr; --EBPtr1) {
|
||||||
|
if (Is_Lower(*EBPtr1)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'W': /* ^EW match any uppercase character */
|
||||||
|
for (; EBPtr1 >= EndSAr; --EBPtr1) {
|
||||||
|
if (Is_Upper(*EBPtr1)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'X': /* ^EX match any char (==^X) */
|
||||||
|
break;
|
||||||
|
case '<': /* ^E<n> match char w/ASCII octal code n */
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE, no ^E<> arg");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
TmpLng = 0;
|
||||||
|
while (Is_Digit(*SStPtr)) {
|
||||||
|
TmpLng = (TmpLng * 8) + (*SStPtr - '0');
|
||||||
|
if (TmpLng > 127) {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (*SStPtr != '>') {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
Charac = (unsigned char)TmpLng;
|
||||||
|
for (; EBPtr1 >= EndSAr; --EBPtr1) {
|
||||||
|
if (*EBPtr1 == Charac) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '[': /* ^E[x1,x2,...] match any one of x1,x2,... */
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE, no ^E[] arg");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
LstBeg = SStPtr;
|
||||||
|
for (; EBPtr1 >= EndSAr; --EBPtr1) {
|
||||||
|
while (*SStPtr != ']') {
|
||||||
|
if (*SStPtr == ',') {
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
EBPtr2 = EBPtr1;
|
||||||
|
if (CMatch(&SamChr) == FAILURE) {
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (SamChr) {
|
||||||
|
while (*SStPtr != ']') {
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EBPtr2 = EBPtr1;
|
||||||
|
DBGFEX(3,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SStPtr = LstBeg;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE, bad ^E arg");
|
||||||
|
return FAILURE;
|
||||||
|
} /* end of ^E switch */
|
||||||
|
break;
|
||||||
|
default: /* edit buffer char must match search string char */
|
||||||
|
if (SMFlag) { /* if case dependence */
|
||||||
|
for (; EBPtr1 >= EndSAr; --EBPtr1) {
|
||||||
|
if (*EBPtr1 == *SStPtr) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { /* else case independence */
|
||||||
|
OtCase = Is_Upper(*SStPtr)
|
||||||
|
? To_Lower(*SStPtr)
|
||||||
|
: To_Upper(*SStPtr);
|
||||||
|
for (; EBPtr1 >= EndSAr; --EBPtr1) {
|
||||||
|
if ((*EBPtr1 == *SStPtr) || (*EBPtr1 == OtCase)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} /* end of switch */
|
||||||
|
EBPtr2 = EBPtr1;
|
||||||
|
DBGFEX(3,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,243 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
BldStr()
|
||||||
|
This function "builds" a string. This means converting string
|
||||||
|
build constructs in the input string into their intended equivalents
|
||||||
|
in the output string. The string build constructs are as follows:
|
||||||
|
^Q use next character literally, not as a string build char
|
||||||
|
^R use next character literally, not as a string build char
|
||||||
|
^V lowercase the next character
|
||||||
|
^V^V lowercase all following characters
|
||||||
|
^W uppercase the next character
|
||||||
|
^W^W uppercase all following characters
|
||||||
|
^EQq use string in q-register q here
|
||||||
|
^EUq use ASCII char for number in q-register q here
|
||||||
|
When this function is called, CBfPtr points to the first character
|
||||||
|
of the input string. It is assumed that the string is terminated by an ESCAPE
|
||||||
|
character (or something else if the calling command was @-modified). If the
|
||||||
|
string is not properly terminated this function will die with "unterminated
|
||||||
|
command" when it encounters CStEnd while looking for the terminator character.
|
||||||
|
When this function returns, CBfPtr points to the ESCAPE which
|
||||||
|
terminates the string, the built string is in the buffer pointed to by
|
||||||
|
XBfBeg, and XBfPtr points to the character after the last character in
|
||||||
|
the built string.
|
||||||
|
The commands which contain a filename (EB, EI, EN, ER and
|
||||||
|
EW) use this function. The EG command, which exits with an operating system
|
||||||
|
command line, uses this function. The O command, which jumps to a tag, uses
|
||||||
|
this function. The search commands (E_, FK, FN, FS, F_, N, S and _) use this
|
||||||
|
function.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "deferr.h" /* define identifiers for error messages */
|
||||||
|
#include "dchars.h" /* define identifiers for characters */
|
||||||
|
#include "chmacs.h" /* define character processing macros */
|
||||||
|
#if USE_PROTOTYPES
|
||||||
|
static DEFAULT DoCtVW(charptr EndArg, unsigned char TmpChr);
|
||||||
|
static DEFAULT DoCtE(charptr EndArg, charptr XBfEnd);
|
||||||
|
#endif
|
||||||
|
static charptr BBfPtr; /* pointer into XBf */
|
||||||
|
static int CaseCv; /* case conversion */
|
||||||
|
static unsigned char WVFlag; /* ^W or ^V flag */
|
||||||
|
static DEFAULT DoCtVW(EndArg, TmpChr) /* do a control-V or control-W */
|
||||||
|
charptr EndArg; /* ptr to end of string argument */
|
||||||
|
unsigned char TmpChr; /* temporary character */
|
||||||
|
{
|
||||||
|
DBGFEN(3,"DoCtVW",NULL);
|
||||||
|
WVFlag = TmpChr;
|
||||||
|
if (++CBfPtr == EndArg) { /* move past ^W or ^V, too far? */
|
||||||
|
ErrMsg(ERR_ISS); /* yes, illegal search string */
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if ((*CBfPtr == '^') && ((EdFlag & ED_CARET_OK) == 0)) {
|
||||||
|
if (++CBfPtr == EndArg) {
|
||||||
|
ErrMsg(ERR_ISS);
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
TmpChr = To_Upper(*CBfPtr);
|
||||||
|
if ((TmpChr < '@') || (TmpChr > '_')) {
|
||||||
|
ErrChr(ERR_IUC, *CBfPtr);
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
TmpChr &= '\077';
|
||||||
|
} else {
|
||||||
|
TmpChr = *CBfPtr;
|
||||||
|
}
|
||||||
|
if (WVFlag == CTRL_V) {
|
||||||
|
if (TmpChr == CTRL_V) {
|
||||||
|
CaseCv = LOWER;
|
||||||
|
} else {
|
||||||
|
*BBfPtr++ = To_Lower(TmpChr);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (TmpChr == CTRL_W) {
|
||||||
|
CaseCv = UPPER;
|
||||||
|
} else {
|
||||||
|
*BBfPtr++ = To_Upper(TmpChr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WVFlag = '\0';
|
||||||
|
DBGFEX(2,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
static DEFAULT DoCtE(EndArg, XBfEnd) /* do a control-E */
|
||||||
|
charptr EndArg; /* ptr to end of string argument */
|
||||||
|
charptr XBfEnd; /* end of build-string buffer */
|
||||||
|
{
|
||||||
|
DEFAULT Status; /* returned from FindQR */
|
||||||
|
charptr TCStEn; /* temporary holder of CStEnd */
|
||||||
|
DBGFEN(3,"DoCtE",NULL);
|
||||||
|
if (++CBfPtr == EndArg) { /* move past ^E, too far? */
|
||||||
|
ErrMsg(ERR_ICE); /* yes, illegal ^E command */
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if ((*CBfPtr == 'Q') || (*CBfPtr == 'q')) {
|
||||||
|
if (++CBfPtr == EndArg) {
|
||||||
|
ErrMsg(ERR_ISS);
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* handle filespec buffer and search string buffer
|
||||||
|
*/
|
||||||
|
if (*CBfPtr=='*' || *CBfPtr=='_') {
|
||||||
|
charptr BufPtr, BufBeg;
|
||||||
|
if (*CBfPtr=='*') {
|
||||||
|
BufPtr=FBfPtr;
|
||||||
|
BufBeg=FBfBeg;
|
||||||
|
} else {
|
||||||
|
BufPtr=SBfPtr;
|
||||||
|
BufBeg=SBfBeg;
|
||||||
|
}
|
||||||
|
if ((BufPtr-BufBeg) > (XBfEnd-BBfPtr)) {
|
||||||
|
ErrMsg(ERR_STL);
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
MEMMOVE(BBfPtr, BufBeg, (SIZE_T)(BufPtr - BufBeg));
|
||||||
|
BBfPtr += BufPtr-BufBeg;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* it really must be a Q reg reference after all
|
||||||
|
*/
|
||||||
|
TCStEn = CStEnd; /* save CStEnd */
|
||||||
|
CStEnd = EndArg;
|
||||||
|
Status = FindQR();
|
||||||
|
CStEnd = TCStEn; /* restore CStEnd */
|
||||||
|
if (Status == FAILURE) {
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if ((QR->End_P1-QR->Start) > (XBfEnd-BBfPtr)) {
|
||||||
|
ErrMsg(ERR_STL);
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
MEMMOVE(BBfPtr, QR->Start, (SIZE_T)(QR->End_P1 - QR->Start));
|
||||||
|
BBfPtr += QR->End_P1 - QR->Start;
|
||||||
|
}
|
||||||
|
} else if ((*CBfPtr == 'U') || (*CBfPtr == 'u')) {
|
||||||
|
if (++CBfPtr == EndArg) {
|
||||||
|
ErrMsg(ERR_ISS);
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
TCStEn = CStEnd; /* save CStEnd */
|
||||||
|
CStEnd = EndArg;
|
||||||
|
Status = FindQR();
|
||||||
|
CStEnd = TCStEn; /* restore CStEnd */
|
||||||
|
if (Status == FAILURE) {
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
*BBfPtr++ = (char)QR->Number;
|
||||||
|
} else {
|
||||||
|
*BBfPtr++ = CTRL_E;
|
||||||
|
*BBfPtr++ = *CBfPtr;
|
||||||
|
}
|
||||||
|
DBGFEX(2,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
DEFAULT BldStr(XBfBeg, XBfEnd, XBfPtr) /* build a string */
|
||||||
|
charptr XBfBeg; /* beginning of build-string buffer */
|
||||||
|
charptr XBfEnd; /* end of build-string buffer */
|
||||||
|
charptr (*XBfPtr); /* pointer into build-string buffer */
|
||||||
|
{
|
||||||
|
charptr EndArg; /* end of input string, plus 1 */
|
||||||
|
unsigned char TmpChr; /* temporary character */
|
||||||
|
DBGFEN(2,"BldStr",NULL);
|
||||||
|
if (FindES(ESCAPE) == FAILURE) { /* move CBfPtr to end of argument */
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE, FindES(ESCAPE) failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
WVFlag = '\0'; /* initialize ^W and ^V flag */
|
||||||
|
CaseCv = IniSrM; /* initialize internal search mode */
|
||||||
|
BBfPtr = XBfBeg; /* initialize ptr into build-string buffer */
|
||||||
|
EndArg = CBfPtr; /* save pointer to end of argument */
|
||||||
|
CBfPtr = ArgPtr; /* reset to beginning of argument */
|
||||||
|
while (CBfPtr < EndArg) {
|
||||||
|
if ((*CBfPtr == '^') && ((EdFlag & ED_CARET_OK) == 0)) {
|
||||||
|
if (++CBfPtr == EndArg) {
|
||||||
|
ErrMsg(ERR_ISS);
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE, no char after ^");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
TmpChr = To_Upper(*CBfPtr);
|
||||||
|
if ((TmpChr < '@') || (TmpChr > '_')) {
|
||||||
|
ErrChr(ERR_IUC, *CBfPtr);
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE, bad char after ^");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
TmpChr &= '\077';
|
||||||
|
} else {
|
||||||
|
TmpChr = *CBfPtr;
|
||||||
|
}
|
||||||
|
switch (TmpChr) {
|
||||||
|
case CTRL_R:
|
||||||
|
case CTRL_Q:
|
||||||
|
if (++CBfPtr == EndArg) {
|
||||||
|
ErrMsg(ERR_ISS);
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
*BBfPtr++ = *CBfPtr;
|
||||||
|
break;
|
||||||
|
case CTRL_V:
|
||||||
|
case CTRL_W:
|
||||||
|
if (DoCtVW(EndArg, TmpChr) == FAILURE) {
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE, DoCtVW failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CTRL_E:
|
||||||
|
if (DoCtE(EndArg, XBfEnd) == FAILURE) {
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE, DoCtE failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (CaseCv == LOWER) {
|
||||||
|
TmpChr = To_Lower(TmpChr);
|
||||||
|
} else if (CaseCv == UPPER) {
|
||||||
|
TmpChr = To_Upper(TmpChr);
|
||||||
|
}
|
||||||
|
*BBfPtr++ = TmpChr;
|
||||||
|
}
|
||||||
|
if (BBfPtr > XBfEnd) {
|
||||||
|
ErrMsg(ERR_STL); /* string too long */
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE, string too long");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
++CBfPtr;
|
||||||
|
}
|
||||||
|
*XBfPtr = BBfPtr;
|
||||||
|
#if DEBUGGING
|
||||||
|
sprintf(DbgSBf,"string = \"%.*s\"", (int)(BBfPtr-XBfBeg), XBfBeg);
|
||||||
|
DbgFEx(2,DbgFNm,DbgSBf);
|
||||||
|
#endif
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,816 @@
|
||||||
|
This file contains release notes for TECOC. The "base version"
|
||||||
|
is 100 (reported by the EO command). The version number starts at 100 to
|
||||||
|
avoid confusion with TECO-11 version numbers, which were close to 40 as of
|
||||||
|
01-Jan-1987.
|
||||||
|
10-Dec-1987 version 100
|
||||||
|
baseline version as of Fall Decus Symposium, Anaheim
|
||||||
|
04-Jan-1988 version 101 (mostly stuff for XENIX)
|
||||||
|
1. created this file
|
||||||
|
2. changed EXEEO.C to make the version number 101.
|
||||||
|
3. changed FBFSIZ (file name size) to 20 in AMODEM.C
|
||||||
|
4. changed XAFTER.CSH to execute under CSH instead of SH
|
||||||
|
5. removed unused tags IFTag and OFTag from ZPORT.H
|
||||||
|
6. added comment about this file to AAAREADME.TXT
|
||||||
|
7. Created an updated XBUILD.CSH.
|
||||||
|
8. added a tab to INIT.C.
|
||||||
|
9. Added debugging code to PARSCL.C, MEMINI.C, ZINIFL.C, MUNG.C, ZREMBR.C,
|
||||||
|
and INIOPN.C. This code is activated only if the variable DbgLvl is
|
||||||
|
initialized to 1 in DBGDSP.C.
|
||||||
|
10. Added semi-colon to line 181 of ZOPINP.C so it'll compile.
|
||||||
|
11. Changed ZREMBR.C so it returns NO in XENIX section.
|
||||||
|
12. Added code to set TrmTyp in XENIX section of ZTRMNL.C.
|
||||||
|
13. Changed SCRNOP.C so it tests TrmTyp (not OpCode) against UNTERM.
|
||||||
|
14. Added XENIX sections to ZDSPCH.C, ZDSPBF.C and ZCHIN.C.
|
||||||
|
23-Jan-1988 version 102
|
||||||
|
1. changed EXEEO.C to make the version number 102.
|
||||||
|
2. changed the debugging code in ZABORT.C to avoid an infinite loop
|
||||||
|
3. removed "signal(SIGTERM, ZAbort)" from XENIX code in ZINIT.C
|
||||||
|
4. changed ZTRMNL.C to support control-Cs under XENIX
|
||||||
|
5. check for control-C in ZCHIN.C, needed to do it in all other Z routines
|
||||||
|
6. added XENIX section to ZRDLIN.C
|
||||||
|
7. define sys$close in ZOPINP.C and ZOPOUT.C
|
||||||
|
8. define sys$get, sys$putmsg in ZRDEI.C
|
||||||
|
9. renamed/modified all the .CSH and .COM files so they start with "Z" and
|
||||||
|
updated AAAREADME.TXT to reflect the changes.
|
||||||
|
10. added file FALL87.RNO, updated AAAREADME.TXT about it
|
||||||
|
11. fixed comment in RDLINE.C.
|
||||||
|
12. changed || to | in ZHELP.C so / immediate commands are okay under VMS.
|
||||||
|
13. fixed "invalid buffer size" bug for reading large files by changing
|
||||||
|
"65536" to "65535" in ZRDLIN.C.
|
||||||
|
14. fixed control-C handling, so that type-out of a large buffer works.
|
||||||
|
Changed EXECST.C, ZDSPBF.C, FRSTCH.C, READCS.C.
|
||||||
|
15. added a test to EXECST.C so that commands like "<test$$" will
|
||||||
|
now produce "unterminated command" errors, as they should
|
||||||
|
16. modified EXEEI.C to make EI$$ a null command to make CHANGE.TEC work
|
||||||
|
30-Jan-1988 version 103 ( to make CHANGE.TEC work )
|
||||||
|
1. changed EXEEO.C to make the version number 103.
|
||||||
|
2. changed definition of Mung from DEFAULT to VOID in MUNG.C.
|
||||||
|
3. changed TmpEI from DEFAULT to VOID in TMPEI.C, ZINIFL.C, MUNG.C
|
||||||
|
4. removed superfluous "else" from ZSWILD.C
|
||||||
|
5. moved WFab, WNam initialization from ZINIFL.C to ZINIT.C
|
||||||
|
6. set WFab.fab$l_fna in ZINIT.C to make EN command work
|
||||||
|
7. added XENIX section to ZCPYBL.C
|
||||||
|
8. fixed XENIX section of ZICLOS.C
|
||||||
|
9. fixed XENIX section of ZOPOUT.C
|
||||||
|
10. fixed XENIX section of ZRDLIN.C
|
||||||
|
11. fixed XENIX section of ZWRITE.C
|
||||||
|
12. changed constants for XENIX in ZPORT.H
|
||||||
|
13. changed calloc to malloc in ZALLOC.C, merged similar sections
|
||||||
|
14. added debugging code to RDLINE.C
|
||||||
|
15. added debugging line to WRBUFR.C
|
||||||
|
16. fixed unlink call in ZOCLOS.C, added debugging code
|
||||||
|
17. fixed unlink call in ZOCLDE.C
|
||||||
|
18. added -O switch to CC commands in XMKBLD.CSH (optimizes code)
|
||||||
|
31-Mar-1988 version 104
|
||||||
|
1. changed EXEEO.C to make the version number 104.
|
||||||
|
2. changed the way code is compiled under XENIX: deleted XMKBLD.CSH,
|
||||||
|
created ZXBLD.CSH and ZXDBLD.CSH, modified ZXLOGIN.CSH and ZXCCC.CSH
|
||||||
|
3. fixed XENIX file creation mode in ZOPOUT.C
|
||||||
|
4. fixed XENIX section of ZMKOFN.C
|
||||||
|
5. fixed setting of CmdMod and EStTop in EXEEB.C
|
||||||
|
6. removed unnecessary call to ExeEY in INIOPN.C
|
||||||
|
7. fixed XENIX file renaming in ZOCLOS.C
|
||||||
|
8. used auto-decrement instead of addition in MEMINI.C
|
||||||
|
9. Renamed CHRFUNCS.H to CHRMACS.H. All references to CHRFUNCS.H
|
||||||
|
had to be changed: many files modified. Also changed macros that
|
||||||
|
are in CHRMACS.H to use an array. Merged that array with the one that
|
||||||
|
was in ReadCS.
|
||||||
|
10. made ZTrmnl define TrmTyp as UNTERM when we're running in a batch job.
|
||||||
|
11. took out "dying" message in GETNMA.C
|
||||||
|
12. fixed CR/LF appending in EXEEQU.C
|
||||||
|
13. fixed file output code in ZDSPCH.C
|
||||||
|
13-Apr-1988 version 105
|
||||||
|
1. changed EXEEO.C to make the version number 105.
|
||||||
|
2. removed extra tab from ZINIT.C
|
||||||
|
3. renamed XAFTER.CSH to ZXAFTER.CSH
|
||||||
|
4. changed ZXAFTER.CSH so it renames CHRMACS.H, not CHRFUNCS.H
|
||||||
|
5. added improved error reporting in ZOPINP.C
|
||||||
|
6. added "cc -c tecoc.c" to ZXBLD.CSH
|
||||||
|
7. added "/STANDARD=PORTABLE" qualifiers to CC commands in ZVBLD.COM
|
||||||
|
8. Fixed ZWrite to append LFs correctly under XENIX
|
||||||
|
9. Fixed ZChIn to make CR/LFs under XENIX out of LFs.
|
||||||
|
10. changed ZOpOut to use fopen instead of creat/fdopen.
|
||||||
|
11. overhauled error reporting. Many modules changed, including all "Z" files.
|
||||||
|
Added OpnOut and ZErMsg.
|
||||||
|
12. Replaced GroEBf with InsStr to merge several copies of the same code
|
||||||
|
sequence. Affected ExeBSl, ExeCtI, ExeG, ExeI, Replac.
|
||||||
|
13. Removed post-copy of memory after ZRaloc calls. ZRaloc does it.
|
||||||
|
14. Took /STANDARD=PORTABLE off VMS compile commands to prevent warnings
|
||||||
|
about "globalref".
|
||||||
|
30-Jul-1988 version 106
|
||||||
|
1. changed EXEEO.C to make the version number 106.
|
||||||
|
2. fixed some error reporting bugs.
|
||||||
|
3. check for mung mode failure in ExeCSt, not ErrMsg
|
||||||
|
4. changed EI buffer size to 20000 to let TSTSRC.TEC be input
|
||||||
|
06-Aug-1988 version 107
|
||||||
|
1. changed EXEEO.C to make the version number 107.
|
||||||
|
2. fixed FR command.
|
||||||
|
3. fixed it so two control-C's terminate TECOC, as it should be.
|
||||||
|
4. overhauled command-line parsing to make it use a TECO macro to do it,
|
||||||
|
like TECO-11 does. Major changes to initialization code. I did this to
|
||||||
|
provide the extra power and to make invocation of TECOC the same as TECO-11
|
||||||
|
under VAX/VMS. Created ExeEG, ZExeEJ, ZEgIni, ZEgLib, ZEgMem, ZEgSym
|
||||||
|
and ZEgVte. Deleted ZIniFl, Mung, ZExeEG.
|
||||||
|
5. fixed ::S command.
|
||||||
|
6. fixed ] command's memory deallocation.
|
||||||
|
22-Feb-1989 version 108 ( porting to Turbo C )
|
||||||
|
1. changed EXEEO.C to make the version number 108.
|
||||||
|
2. created function prototypes (without arguments) in DefTeco.h and removed
|
||||||
|
them from all other files.
|
||||||
|
3. changed /REPLACE to /INSERT in ZVBLD.COM
|
||||||
|
4. fixed definition of ErrTxt in BldStr.
|
||||||
|
5. moved "#include stsdef" into VAX section of ZErMsg.
|
||||||
|
6. moved expressions out of "if" statements to avoid compiler warnings in
|
||||||
|
FindQR, MakDBf, PshMac, StCopy, ZTrmnl.
|
||||||
|
7. Deleted reference to ZDefErr.h from ZOClDe.
|
||||||
|
8. deleted ZError.h
|
||||||
|
9. changed "ErrMag" to "ErrMsg" in ZOClos.
|
||||||
|
10. removed variables declared but never used in DoEI, ExeEG, WrBufr, ZOClos.
|
||||||
|
11. removed "return(xxx)" from XENIX section of ZHhelp, which is a VOID
|
||||||
|
function.
|
||||||
|
12. Express 32768 in octal in DefTeco.h for ET_TRAP_CTRL_C to avoid problems
|
||||||
|
putting it into an unsigned EtFlag.
|
||||||
|
13. Added type-cast to ZCpyBl call in RdLine.
|
||||||
|
14. changed XENIX section of ZExeEJ so it defines ZExeEJ, not ZExCtH.
|
||||||
|
15. Replaced the Execut function with syntax for calling a function whose
|
||||||
|
address you have in a variable.
|
||||||
|
16. Made mods to make it run under Turbo C under MS-DOS. Added __TURBOC__
|
||||||
|
sections to Zxxxx.c files and created ZPBLD.BAT and ZPDBLD.BAT.
|
||||||
|
19. Fixed Turbo C section in ZDspBf, ZDspCh, ZChIn, ZWrite.
|
||||||
|
20. Changed "LONG" to "ptrdiff_t" in several files.
|
||||||
|
21. Added Turbo C section to ZPrsCL.
|
||||||
|
Just to get it working, commented out the Turbo C code in ZPrsCL.
|
||||||
|
This prevents the command-line macro from executing, which avoids the
|
||||||
|
execution of EJ and EG commands in the macro. EJ and EG are not yet
|
||||||
|
supported for non-VMS environments. It now limps under Turbo C/MS-DOS
|
||||||
|
28-Feb-1989 version 109 ( more porting to Turbo C )
|
||||||
|
1. changed EXEEO.C to make the version number 109.
|
||||||
|
2. made type conversions explicit via type casts in various functions.
|
||||||
|
3. replaced calls to ZChrIt with type-cast "(char)" and deleted ZChrIt
|
||||||
|
4. appended all the Dbgxxx functions to the end of TECOC.C and changed
|
||||||
|
compile/link so there is no separate debugging library. This simplifies
|
||||||
|
the link sequence.
|
||||||
|
5. fixed VDOW.C and VSETW.C so setting DEBUGGING to NO will not cause
|
||||||
|
compilation errors.
|
||||||
|
6. changed references to .h files to lowercase so you don't have to
|
||||||
|
explicitly rename them after copying them from one machine to another
|
||||||
|
7. various minor changes so it will build for an UNKNOWN environment
|
||||||
|
8. use FILENAME_MAX, an ANSI C identifier
|
||||||
|
9. changed the XENIX identifier to the more general __UNIX__ and restructured
|
||||||
|
the conditional compilation code to use "#elif".
|
||||||
|
10. replaced StCopy with strcpy
|
||||||
|
11. replaced ZCpyBl with MEMMOVE
|
||||||
|
12. created a file named MAKEFILE for use with Unix "make".
|
||||||
|
13. improved type definitions and casting to keep lint happy.
|
||||||
|
14. use EXIT_FAILURE and EXIT_SUCCESS in calls to exit() and ZAbort().
|
||||||
|
15. Defined return codes for the EJ command in systems other than VMS
|
||||||
|
so the command-line parsing macro could function.
|
||||||
|
16. Removed references to StCopy and ZCpyBl from ZPBLD.BAT and deleted
|
||||||
|
ZPLNK.BAT. Fixed ZPLNK.BAT to not refer to DBGTECOC.LIB.
|
||||||
|
28-Feb-1989 version 110
|
||||||
|
1. changed EXEEO.C to make the version number 110.
|
||||||
|
2. made the 2048 bit of the ET flag cause the BACKSPACE character to be
|
||||||
|
treated just like the DEL character on input. This supports the
|
||||||
|
conventions used by IBM PCs and Unix. On those systems, you'll have
|
||||||
|
trouble getting a BACKSPACE into the command line, a minor problem.
|
||||||
|
3. to simplify an effort to port TECO-C to RT-11, renamed the following
|
||||||
|
files so the name portion of the filespec is 6 characters or less.
|
||||||
|
renamed CHRMACS.H to CHMACS.H
|
||||||
|
renamed COMMANDS.TXT to WCHART.TXT
|
||||||
|
renamed DEFCHARS.H to DCHARS.H
|
||||||
|
renamed DEFSCREN.H to DSCREN.H
|
||||||
|
renamed DEFTECO.H to TECOC.H
|
||||||
|
renamed TEC0_V40.TEC to TECV40.TEC
|
||||||
|
renamed TECO_V40.TES to TECV40.TES
|
||||||
|
The following files were not renamed, and are the only remaining files
|
||||||
|
with names longer than 6 characters.
|
||||||
|
AAAREADME.TXT I just didn't want to rename this one
|
||||||
|
GETTECO. used only on Unix systems
|
||||||
|
MAKEFILE. used only on Unix systems
|
||||||
|
PROBLEMS.TXT I just didn't want to rename this one
|
||||||
|
RELEASE.TXT I just didn't want to rename this one
|
||||||
|
ZVLOGIN.COM used only on VAX/VMS systems
|
||||||
|
ZXAFTER.CSH used only on Xenix systems
|
||||||
|
ZXLOGIN.CSH used only on Xenix systems
|
||||||
|
4. Fixed ZPBLD.BAT: removed superfluous -I option, added ECHO statements so
|
||||||
|
you can tell how far it's gotten, lowercased file names.
|
||||||
|
5. Removed definition of TraceM from ZExCtC, which doesn't use TraceM.
|
||||||
|
6. Don't return a value from ZDoCmd or ZHelp, they're VOID functions.
|
||||||
|
7. Fixed Sun and Turbo C sections of ZExeEJ and ZClnEG.
|
||||||
|
8. Changed second argument of PushEx from BYTE to DEFAULT.
|
||||||
|
9. Made ZClnEG a LONG function to match it's use in ExeEG.
|
||||||
|
10. Made MakDBf calls in PushEx and GetNMA use a type cast when passing
|
||||||
|
EstTop and EstBot so it works under Turbo C.
|
||||||
|
12. Fixed expression syntax in CLPARS.TES.
|
||||||
|
13. Fixed handling of :ER commands in Turbo C section of ZOpInp.
|
||||||
|
14. Added function prototypes to tecoc.h. They're conditionally compiled
|
||||||
|
based on the new USE_PROTOTYPES identifier defined in zport.h.
|
||||||
|
15. Replaced GENCLP.TEC with GENCLP.C.
|
||||||
|
11-Jun-1989 version 111
|
||||||
|
1. changed EXEEO.C to make the version number 111.
|
||||||
|
2. More type-casts added to allow Turbo C to compile the code when the
|
||||||
|
function prototypes are used (USE_PROTOTYPE == YES).
|
||||||
|
3. Moved setting of EtFlag out of ZInit.c and into ZTrmnl.c.
|
||||||
|
28-Jun-1989 version 112
|
||||||
|
1. changed EXEEO.C to make the version number 112.
|
||||||
|
2. changed || to | in ZTrmnl.c to fix setting of EtFlag.
|
||||||
|
3. changed CrType to VT100 in ZTrmnl.c for IBM-PC so ANSI sequences are used.
|
||||||
|
4. rewrote logic to fix bugs and improve readability in InpDel.c.
|
||||||
|
5. renamed ScrnOp to ZScrOp so IBM-PC screen handling could be added.
|
||||||
|
6. replaced old usage of ET_BKSP_IS_DEL with new code in ZChIn.
|
||||||
|
7. added error message generation to ZChIn
|
||||||
|
8. fixed ZVBLD.COM so the link of GENCLP has LNK$LIBRARY defined
|
||||||
|
9. changed mktemp to tmpnam (ANSI) in ZOpOut.c.
|
||||||
|
10. merged VDoW, VGetW and VSetW into ExeW
|
||||||
|
11. Lots of little changes to reduce messages produced by lint and by
|
||||||
|
Turbo C when the -w switch (maximum warnings) is used.
|
||||||
|
19-Jul-1989 version 113
|
||||||
|
1. changed EXEEO.C to make the version number 113.
|
||||||
|
2. Fixed ZPBLD.BAT and ZPTLIB.BAT
|
||||||
|
3. Added code for IBM PC to ZScrOp.c
|
||||||
|
4. Added FFLINS, used in InpDel and ReadCS.
|
||||||
|
5. Fixed comments in FindQR and tecoc
|
||||||
|
6. Changed ugly \015 to \r, \012 to \n, \011 to \t in all files
|
||||||
|
7. More type casting to reduce warnings from Turbo C.
|
||||||
|
8. Changed almost every file to insert new "charptr" and "QRptr" types.
|
||||||
|
These are needed to support the brain-damaged memory access on IBM-PCs,
|
||||||
|
where the pointers need to be "HUGE" to work.
|
||||||
|
9. fixed a bug in MakRom that caused :X commands (among others) to fail.
|
||||||
|
10. Converted QBfBeg, QBfPtr and QNumbr to the simpler QR
|
||||||
|
11. Rewrote GENCLP so it makes a file that Turbo C reads correctly.
|
||||||
|
12. Made a SIZE_T typedef to support Turbo C.
|
||||||
|
13. Used farmalloc in ZAlloc, farfree in ZFree and farrealloc in ZRaloc in
|
||||||
|
Turbo C sections.
|
||||||
|
14. made 0EJ return 0 for Turbo C.
|
||||||
|
15. Fixed ZWrite code for Turbo C.
|
||||||
|
02-Aug-1989 version 114
|
||||||
|
1. changed EXEEO.C to make the version number 114.
|
||||||
|
2. Renamed RELEASE.TXT to CHANGES.TXT
|
||||||
|
3. merged all the Z files into ZVMS,C, ZMSDOS.C, ZUNIX.C, ZUNKN.C
|
||||||
|
4. merged all the SKP files into SKPCMD.C
|
||||||
|
5. merged CHKHLP.C, FRSTCH.C and INPDEL.C into READCS.C
|
||||||
|
6. merged REDUCE.C into PUSHEX.C
|
||||||
|
7. merged MEMINI.C into INIT.C
|
||||||
|
8. merged DOEI.C into EXEEI.C
|
||||||
|
9. merged DOFBFC.C into SRCLOP.C
|
||||||
|
10. merged EXEE*.C files into EXEE.C (EXEEB.C is an exception)
|
||||||
|
11. merged EXEF*.C files into EXEF.C (EXEFB.C is an exception)
|
||||||
|
12. Implemented colon modifier on EW command. This is an undocumented
|
||||||
|
feature required for the CLPARS macro to work on non-VAXen.
|
||||||
|
13. merged ZFILES.H into ZVMS.C, ZMSDOS.C, ZUNIX.C
|
||||||
|
14. fixed GENCLP.C yet again, for VMS
|
||||||
|
15. fixed memory shuffling bug in RDLINE.C
|
||||||
|
21-Aug-1989 version 115 (Manfred Siemsen)
|
||||||
|
1. Changed ExeEO() in EXEE.C to make the version number 115
|
||||||
|
2. Created DEFEXT.H, replaced all EXTERN lines with #include "defext.h"
|
||||||
|
3. Modified all #if DEBUGGING...#endif lines to call 3 debugging
|
||||||
|
functions: DbgFEn() upon function entry, DbgFEx() upon function
|
||||||
|
exit, and DbgFMs() for messages in the body of a function. Also,
|
||||||
|
indented the debugging lines so they line up under the code they
|
||||||
|
"belong" with, instead of being munched over on the left margin.
|
||||||
|
4. Modified debugging routines to use sprintf/printf to display
|
||||||
|
values of variables instead of displaying things "manually" through
|
||||||
|
other Teco-C build/display routines. We still avoid the use of
|
||||||
|
sprint/printf in non-debugging code.
|
||||||
|
5. Modified the indentation scheme to more closely match K&R
|
||||||
|
6. Put squiggly braces '{}' around ALL statements, even if they
|
||||||
|
aren't required.
|
||||||
|
7. Modified the comment scheme to be consistent with Pete's
|
||||||
|
latest X-window'ish standard.
|
||||||
|
8. Created a Turbo C MAKEFILE (MAKEFILE.TC).
|
||||||
|
9. Began implementation of ZPWild() and ZSWild() in ZMSDOS.C. It
|
||||||
|
seems to work ok, but there should be more error checking put in
|
||||||
|
to guard against the user entering a bizarre filename.
|
||||||
|
10 Implememted ZDoCmd() in ZMSDOS.C. Required change to ExeEG() in
|
||||||
|
EXEE.C. If it wasn't :EG, TxtLen was never set, might have been
|
||||||
|
garbage, moved TxtLen assignment out of "if (COLON..." statement.
|
||||||
|
Also, ZAbort() was called if TxtLen was not zero, should have
|
||||||
|
been called if TxtLen *is* zero.
|
||||||
|
30-Aug-1989 version 116
|
||||||
|
1. Changed ExeEO() in EXEE.C to make the version number 116
|
||||||
|
2. rearranged includes in "Z" files so that my .h files come after the
|
||||||
|
system ones. This was needed so ZPORT.H can redefine FILENAME_MAX,
|
||||||
|
which on VMS is wrong (38 ain't right). Rearranged ZPORT.H for the
|
||||||
|
same reason.
|
||||||
|
3. Replaced ERRMSG.C with ERR.C and created the new error reporting
|
||||||
|
functions ErrChr and ErrStr. Doing this removes places where I was
|
||||||
|
writing into string literals, which worked but wasn't real kosher.
|
||||||
|
It also makes lint happy about ErrMsg (fixed number of arguments now)
|
||||||
|
and modularizes the error code. Merged DSPCHR.C and VRBERR.C into
|
||||||
|
ERR.C.
|
||||||
|
4. Created ZVrbos.
|
||||||
|
5. Fixed error message numbering.
|
||||||
|
6. Fixed prototype for ErrDsp and ErrPst in ERR.C.
|
||||||
|
7. Commented out illegal test case in TSTQR.TEC.
|
||||||
|
8. Made Charac a char instead of an int in ZChIn to fix bug.
|
||||||
|
21-Oct-1989 version 117
|
||||||
|
1. Changed ExeEO() in EXEE.C to make the version number 117
|
||||||
|
2. Moved #endif in TECOC.C from just after DbgSlv() to just after
|
||||||
|
DbgDsp() so DbgDsp() wasn't included when DEBUGGING is FALSE.
|
||||||
|
3. Updated MAKEFILE.TC.
|
||||||
|
4. Updated ZPTLIB.BAT.
|
||||||
|
6. Changed prototype of ZVrbos in ZMSDOS.C, ZVMS.C, ZUNIX.C,
|
||||||
|
ZUNKN.C, and TECOC.H.
|
||||||
|
7. Changed DoEI() comment in EXEE.C.
|
||||||
|
8. Made ZRdEI() call ZRdLin() instead of calling fgets() directly.
|
||||||
|
9. Changed ZWrite() to ZWrLin(), it's more descriptive.
|
||||||
|
23-Oct-1989 version 118
|
||||||
|
1. Changed ExeEO() in EXEE.C to make the version number 118
|
||||||
|
2. minor fixes to make lint happy
|
||||||
|
3. Changed ZChIn() in ZMSDOS.C to ignore any IBM PC scan code
|
||||||
|
other than DEL to eliminate the "Unrecognized character" bomb.
|
||||||
|
4. Changed CLPARS.TES so filespec memory works on PC's.
|
||||||
|
5. Changed EXEQ.C to fix numeric expression parsing
|
||||||
|
6. Change definition of FEArry[] from (*F[])() to (*F[])(VOID)
|
||||||
|
to eliminate Turboc C "function w/no prototype" warning.
|
||||||
|
03-Nov-1989 version 119 (Manfred)
|
||||||
|
1. Changed ExeEO() in EXEE.C to make the version number 119.
|
||||||
|
2. Because of some bizzare behaviour, the CHECKSUM_CODE #define and routines
|
||||||
|
were added to check code at runtime to make sure it wasn't being
|
||||||
|
overwritten. These routines read the Turbo C .MAP file to get the order
|
||||||
|
and length of all the modules, calculates and stores an initial checksum
|
||||||
|
for each module; and then compares the initial checksum of each module
|
||||||
|
with the checksum calculated after every command is executed in ExeCSt().
|
||||||
|
3. Changed ZAlloc(), ZRaloc(), and ZFree() to return and expect a new
|
||||||
|
type "voidptr" instead of charptr's. I then removed the casts before
|
||||||
|
ZAlloc() and ZRaloc() returns in the code. Borland Turbo C says that
|
||||||
|
explictly casting returns from malloc/realloc hides things from the
|
||||||
|
compiler and is bad practice in ANSI C.
|
||||||
|
4. Changed "struct QReg *LQTabl" to "QRptr LQTabl" in the definition of
|
||||||
|
MStck in TECOC.H per phone call w/Pete.
|
||||||
|
5. Changed an incorrect call to DbgFEn() in ZOpOut()...should have displayed
|
||||||
|
DbgSBf instead of "".
|
||||||
|
6. Changed the DbgFEn(), DbgFEx(), and DbgFMs() calls to send NULL instead
|
||||||
|
of "" if there is no special debugging message to display. This saves
|
||||||
|
space when Turbo C is not merging duplicate strings (tcc -d). Otherwise
|
||||||
|
there are billions of "" strings in the .EXE file ("" strings take 1
|
||||||
|
byte of space because they contain a '\0'). I used CHANGE.TEC to do it!
|
||||||
|
7. Changed ZRaloc() in ZMSDOS.C to manually reallocate blocks. There is a
|
||||||
|
problem with Turbo C's farrealloc() in that it uses movedata() to move
|
||||||
|
data from the old block to the new block. Movedata() expects a size_t
|
||||||
|
as the number of bytes to move. size_t under Turbo C v2 is *always* a
|
||||||
|
16-bit unsigned int regardless of memory model. This means that if the
|
||||||
|
old block is >64K, movedata() won't move the data correctly from the old
|
||||||
|
block to the new block when the old block is >64K.
|
||||||
|
8. Implemented the ^B system date (ZExCtB) and ^H system time (ZExCtH)
|
||||||
|
routines in ZMSDOS.C using DOS calls. EIDATE.TES$ will display the
|
||||||
|
current date and time.
|
||||||
|
9. Initialized ff_status in ZMSDOS.C to -1 so EN$$ with no preceding
|
||||||
|
ENfilename$$ doesn't blow up by calling findnext() with no initial
|
||||||
|
findfirst(). Is <File Not Found ""> a reasonable return?
|
||||||
|
10.Changed ExeRBr() so that End_P1 is set to NULL when Start is set to
|
||||||
|
NULL after the ZFree(QR->Start). Otherwise, End_P1 might not be NULL
|
||||||
|
and will cause problems for those routines which blindly subtract
|
||||||
|
End_P1 from Start to get the length of text in the Q-register.
|
||||||
|
11.Changed the line in ^EQq logic part of BldStr() where QR->End_P1 was
|
||||||
|
being subtracted from QR-Start, when it should be the other way around.
|
||||||
|
12.Changed FArray[] in ExeCSt(). The ^Q entry was ExeNYI(), it should have
|
||||||
|
been ExeCtQ(). The ^_ entry was ExeOpr(), it should have been ExeUsc().
|
||||||
|
Actually, both ExeOpr() and ExeUsc() would have pushed ^_ on the stack,
|
||||||
|
so it was a...uh...push.
|
||||||
|
13.Changed ^G entry FCAray[] in ExeCrt() from ExeNul() to ExeIll() so it
|
||||||
|
jibes with FArray[] in ExeCSt() entry.
|
||||||
|
14.The logic in ReadEI() in EXEE.C determining whether or not to add a
|
||||||
|
trailing CR-LF to the line read from the EI file was wrong. ReadEI()
|
||||||
|
now calls ZRdlin() to read lines from the EI file. ZRdLin() returns
|
||||||
|
the length of the read line *without* the trailing newline returned by
|
||||||
|
fgets(). The ReadEI() logic was checking if the line ended in VT or
|
||||||
|
in ESC-CR-LF. Since the line returned by ZRdLin() should never end in
|
||||||
|
CR-LF, the ESC check was bogus. I changed it to only add a CR-LF if
|
||||||
|
the line did NOT end in VT or ESC which I think was the original intent.
|
||||||
|
15.While playing with ReadEI() in EXEE.C, I was having problems reading in
|
||||||
|
a huge macro (>ZBFINIT bytes long). The problem was that if the EI
|
||||||
|
buffer became full (ie: BufPtr == ZBfEnd), ReadEI() was calling
|
||||||
|
ZRdLin() with (ZBfEnd-BufPtr == 0). ZRdLin() was in turn essentially
|
||||||
|
calling "fgets(buf,0,fp)". When told to read into a 0 size buffer,
|
||||||
|
fgets() simply returns the buffer. ZRdLin() only fails if fgets()
|
||||||
|
returned NULL or if an error happened, otherwise it will happily
|
||||||
|
return 0 as the length of the line it read, therefore, back in
|
||||||
|
ReadEI(), the "BufPtr += line_len" never incremented BufPtr
|
||||||
|
anywhere and ReadEI() never broke out of it's FOREVER loop, it
|
||||||
|
looped infinitely, reading zero bytes into a zero length buffer.
|
||||||
|
I added the ZBFMIN and ZBFEXP #defines in ZPORT.H and changed ReadEI()
|
||||||
|
so it dynamically reallocates the EI buffer when it is close to
|
||||||
|
becoming full.
|
||||||
|
16.Changed ExeCtu(). The call to MakRom() used to make the Q-register
|
||||||
|
text area 1 character longer when doing a "n^Qq" was sending the wrong
|
||||||
|
argument. It was sending the new *total* size of the text area
|
||||||
|
(end-start+1) instead of the *additional* size of the text area (1 byte).
|
||||||
|
17.Changed the way the CLPARS macro is handled:
|
||||||
|
a) If USE_ANSI_CLPARS is FALSE.
|
||||||
|
Changed CLPARS.TES to not clear itself out of memory when it was
|
||||||
|
finished. The CLPARS macro is loaded and executed in Q-register Y.
|
||||||
|
The last thing it did was a "0,0XY" to clear itself out. The problem
|
||||||
|
is that ExeX() would call ZFree() to clear Q-register Y, leaving
|
||||||
|
CBfPtr effectively pointing into a free'ed memory area. This wasn't
|
||||||
|
fatal because the "0,0XY" was the very last thing in the CLPARS macro
|
||||||
|
so no further TECO instructions were looked for in the free'ed area;
|
||||||
|
but, technically it was wrong. I removed the "0,0XY" from the CLPARS
|
||||||
|
macro and changed ZPrsCl() so it manually ZFree()'s Q-register Y after
|
||||||
|
it finishes executing it.
|
||||||
|
Note: SQU also uses this technique: issuing a '0,0Xq' at the tail end of
|
||||||
|
a macro loaded in Q-register 'q' to clear the macro out after it
|
||||||
|
finishes executing. If this is a common TECO macro practice, maybe
|
||||||
|
we'll have to think this through a little more.
|
||||||
|
b) If USE_ANSI_CLPARS is TRUE
|
||||||
|
If USE_ANSI_CLPARS is true, the CLPARS macro is stored as one
|
||||||
|
gigantic string in clpars[]. If USE_ANSI_CLPARS is false, the
|
||||||
|
CLPARS macro is split into lines and stored as an array of strings
|
||||||
|
in *clpars[]. The advantage to USE_ANSI_CLPARS is that to execute
|
||||||
|
the CLPARS macro, ZPrsCL() simply made the text area pointers of
|
||||||
|
Q-register Y point at clpars[] to "load" Q-register Y before doing
|
||||||
|
the MY$$. Otherwise, if USE_ANSI_CLPARS is false, the CLPARS
|
||||||
|
macro is executed by (slowly) loading it from *clpars[], line-by-line,
|
||||||
|
into Q-register Y and then doing the "MY$$".
|
||||||
|
The problem was that if USE_ANSI_CLPARS was true, Q-register Y held
|
||||||
|
statically allocated data which could cause problems when the CLPARS
|
||||||
|
macro did the "0,0XY" to clean up. "0,0XY" would make ExeX() try to
|
||||||
|
ZFree() the statically allocated clpars[] string.
|
||||||
|
While looking at this problem I noticed that, other than for historical
|
||||||
|
reasons, there is no reason the CLPARS macro *has* to be executed from
|
||||||
|
Q-register Y. I changed ZPrsCL() so that if USE_ANSI_CLPRS is true, it
|
||||||
|
directly executes the CLPARS macro from the clpars[] string without
|
||||||
|
bothering to load it into Q-register Y first.
|
||||||
|
18.Removed TRACE_IMBEDDED_MACRO.
|
||||||
|
19.Removed static initialization of QRgstr[] in TECOC.C and moved it
|
||||||
|
into MemIni() in INIT.C along with the other initializations of
|
||||||
|
global static arrays (QStack[], etc). [See suggestion (1) below]
|
||||||
|
20.Changed ExeEO to return ExeNYI() for "nEO".
|
||||||
|
21.Changed DoEI(). DoEI() calls PshMac(), ExeCSt(), and PopMac(). If the
|
||||||
|
ExeCSt() failed, it would do a return(FAILURE) without doing the PopMac(),
|
||||||
|
leaving the macro stack off and CBfPtr pointing into the EI buffer. DoEI()
|
||||||
|
was changed so that it does a PopMac() even if ExeCSt() fails. This same
|
||||||
|
type of logic was changed in ExeM().
|
||||||
|
This problem didn't appear unless you tried executing a macro from a file
|
||||||
|
or from a Q-register which failed miserably.
|
||||||
|
22.Changed ReadEI() <again>. When ReadEI() finds a line containing double
|
||||||
|
<ESC>'s, it returns to DoEI(), which then executes everything up to that
|
||||||
|
point. DoEI() then re-calls ReadEI() to finish reading the EI file. The
|
||||||
|
problem was that if there were any commands *after* the two <ESC>'s on
|
||||||
|
the last line read, they would be lost in the shuffle because ReadEI()
|
||||||
|
would start reading into the beginning of ZBf. The SQU.TEC macro had
|
||||||
|
a line with commands after a double <ESC>.
|
||||||
|
23.Fixed ExeO(). ExeO() wasn't completely comparing the desired tag with
|
||||||
|
the tag in the command string. So, if the command string had two tag
|
||||||
|
names which start out the same way, for example:
|
||||||
|
!aa!
|
||||||
|
!a!
|
||||||
|
"Oa" would goto !aa!.
|
||||||
|
24.Changed the way some of the colon-modified commands work. I ran into a
|
||||||
|
situation in SQU where "Y<:A;>" was used. If the yank read in the entire
|
||||||
|
buffer, ExeA() would fail immediately, without clearing the colon-modified
|
||||||
|
bit in CmdMod, thus "passing" CmdMod to ";" converting it to ":;". "n;"
|
||||||
|
breaks if n is zero or positive, "n:;" breaks if n is negative. "Passing"
|
||||||
|
CmdMod to ExeSCl() this way completely altered the sense of the ";" break.
|
||||||
|
25.Fixed case flagging in TypBuf() and made it faster by not doing the
|
||||||
|
Is_Lower() and Is_Upper() checking if EuFlag() is set to EU_NONE.
|
||||||
|
26.Rewrote ZCpyBl() in ZMSDOS.C to use memmove() and memcpy(). They
|
||||||
|
both use 80x86 string instructions and make things much faster.
|
||||||
|
27.PopMac() was clearing the contents of the local Q-register table,
|
||||||
|
but wasn't de-allocating the table itself.
|
||||||
|
28.Changed PshMac(), PopMac(), FindQR(), and Init() to use pointers into
|
||||||
|
the MStack[] and MStack[].QRgstr tables instead of doing redundant array
|
||||||
|
references. Changed Reduce() in PUSHEX.C to use pointers into EStack[]
|
||||||
|
for the same reason. Using pointers should be faster?
|
||||||
|
29.The digit buffer (DBfBeg) was initialized in TECOC.C as:
|
||||||
|
charptr *DBfBeg = " ";
|
||||||
|
then digits were poked into this statically allocated string which really
|
||||||
|
isn't kosher. Changed it so DBfBeg is initialized in MemIni() in INIT.C.
|
||||||
|
06-Dec-1989 version 120
|
||||||
|
1. Changed ExeEO() in EXEE.C to make the version number 120.
|
||||||
|
2. Fixed bug in ZDspBf caused by "length" wrapping when unsigned.
|
||||||
|
3. various little fixups.
|
||||||
|
07-Dec-1989 version 121
|
||||||
|
1. Changed ExeEO() in EXEE.C to make the version number 121.
|
||||||
|
2. Made EC clear the edit buffer after writing files. Thanks, Phil.
|
||||||
|
3. Fixed ZFWrite in ZMSDOS.C to handle files > 64k better.
|
||||||
|
20-Dec-1989 version 122
|
||||||
|
1. Changed ExeEO() in EXEE.C to make the version number 122.
|
||||||
|
2. Added TVERSION (version number of TECOC-C) to TECOC.C
|
||||||
|
3. Fixed ZRdLin in ZVMS.C to make EI commands work.
|
||||||
|
4. Removed the ZInit function. It was being called late (after MemIni),
|
||||||
|
and turned out to be unused anyway.
|
||||||
|
04-Feb-1990 version 123
|
||||||
|
1. Changed ExeEO() in EXEE.C to make the version number 123.
|
||||||
|
2. Removed funny handling of lines terminated with <ESC><CR><LF> do let
|
||||||
|
MS-DOS users edit macros without funnyness.
|
||||||
|
3. Regularized the "debugging level" numbers documented with DbgDMs in
|
||||||
|
TECOC.C.
|
||||||
|
4. Fixed looping logic in SrcLop to make "n_text$" commands work.
|
||||||
|
5. Fixed bug in ClTrEx in ZVMS.C so running from batch works.
|
||||||
|
20-Feb-1990 version 124
|
||||||
|
1. Changed TVERSION in TECOC.H to 124.
|
||||||
|
2. Rewrote MakDBf to make it more portable.
|
||||||
|
2-Mar-1990 version 125
|
||||||
|
1. Changed TVERSION in TECOC.H to 125.
|
||||||
|
2. Fixed so HP with an empty buffer doesn't cause an error message.
|
||||||
|
3. Moved the decision about whether to add/remove CR/LF pairs to/from the end
|
||||||
|
of lines when doing file I/O into the system-dependent functions. This
|
||||||
|
was needed to make MD-DOS happy, and is really where this stuff should
|
||||||
|
be anyway.
|
||||||
|
4. Defined GotCtC as "volatile".
|
||||||
|
5. Rewrote ZRdLin in ZVMS.C to do what TECO-11 really does with all the
|
||||||
|
special characters.
|
||||||
|
6. Put a check for an open output file into ExeEC, so the command HKEFEX
|
||||||
|
will work even if there's more pages in the input file.
|
||||||
|
7. Merged WrBufr and ZWrLin into a singl function called ZWrBfr. Deleted
|
||||||
|
WRBUFR.C and updated the build files. This was needed to provide system
|
||||||
|
dependent control over output so MS-DOS I/O could be cleaned up.
|
||||||
|
22-May-1990 version 126
|
||||||
|
1. Changed TVERSION in TECOC.H to 126.
|
||||||
|
2. Removed code that adds a CR/LF to each record read by ReadEI.
|
||||||
|
3. Fixed VMS output code in ZWrBfr broken in version 125.
|
||||||
|
4. Changed TypBuf so it is interruptable by ^C after displaying a line.
|
||||||
|
5. Defined ChkCtC() so that ^C's work better under MS-DOS.
|
||||||
|
6. Changed ZSWild & ZPWild to work better under CHANGE.TEC.
|
||||||
|
7. Folded wildcard filename buffer (WBf) into "normal" filename buffer (FBf)
|
||||||
|
so G* after ENfilespec$ returns "filespec".
|
||||||
|
1-June-1990 version 127
|
||||||
|
1. Changed TVERSION in TECOC.H to 127.
|
||||||
|
2. Modified ZDoCmd() in ZMSDOS.C so you can EGfilename.BAT$.
|
||||||
|
3. Added EBfFul to avoid "?MEM memory overflow" messages when reading large
|
||||||
|
files. Now TECO-C quietly stops reading.
|
||||||
|
4. Reduced number of times ChkCtC() is called to speed display up.
|
||||||
|
5. renamed AAAREADME.TXT to AAREADME.TXT, needed by MS-DOS
|
||||||
|
8-June-1990 version 128
|
||||||
|
1. Changed TVERSION in TECOC.H to 128.
|
||||||
|
2. Fixed loops that initialize IsOpnI, IsEofI and IsOpnO in Memini. Thanks
|
||||||
|
to Chuck Cranor.
|
||||||
|
3. Added ZExit, ZClnUp and ClenUp and replaced ZAbort with TAbort. This
|
||||||
|
modularizes exit handling.
|
||||||
|
4. Applied lots of fixes to zunix.c suggested by Chuck Cranor. These include
|
||||||
|
terminal initialization and use of termcap for terminal sequences.
|
||||||
|
5. Added a type cast to FindQR to prevent a compiler warning.
|
||||||
|
13-June-1990 version 129
|
||||||
|
1. Changed TVERSION in TECOC.H to 129.
|
||||||
|
2. Made n^T display n modulo 256 instead of generating an error when n
|
||||||
|
is out-of-range. Now it matches documentation.
|
||||||
|
3. Worked on file I/O in ZUNIX.C.
|
||||||
|
20-June-1990 version 130
|
||||||
|
1. Changed TVERSION in TECOC.H to 130.
|
||||||
|
2. Applied Tom Almy's MS-DOS fixes to prevent conversions of line feeds
|
||||||
|
written to the terminal to carriage-return/line-feed pairs.
|
||||||
|
3. Applied Tom Almy's fixes to the search code. Now backwards searches
|
||||||
|
work better.
|
||||||
|
4. Applied Tom Almy's fixes so eight-bit characters are better supported.
|
||||||
|
5. Minor fixes to ExeW.
|
||||||
|
6. Replaced ZRdLin in ZMSDOS.C with Tom Almy's superior version.
|
||||||
|
7. EBfFul was a global used only by RdLine, ExeA and RdPage. I made it
|
||||||
|
an argument. Seemed like the right thing to do.
|
||||||
|
8. Changed the type of the length argument to InsStr from LONG to ptrdiff_t.
|
||||||
|
9. Applied Tom Almy's fixes to DoEvEs and ReadCS.
|
||||||
|
10. Fixed up PG.RNO and created a new PG.MEM.
|
||||||
|
11. Removed BYTE identifier from ZPORT.H and did related fixups.
|
||||||
|
12. Started (by no means complete) supporting 8-bit characters throughout
|
||||||
|
the code. In most cases, this means changing things declared "char"
|
||||||
|
to be declared "unsigned char".
|
||||||
|
13. Deleted DSPCHR.C, which wasn't even compiled.
|
||||||
|
17-July-1990 version 131 (Manfred)
|
||||||
|
0. Changed TVERSION in TECOC.H to 131
|
||||||
|
1. In TECOC.C, ChrMsk[], changed 128 RCS_DEL entries Pete added to RCS_DEF.
|
||||||
|
2. In ZMSDOS.C, added #include <fcntl.h> to get O_BINARY #define. In
|
||||||
|
ZTrmnl(), added "setmode(fileno(stdout),O_BINARY)" per Tom Almy.
|
||||||
|
3. In MAKEFILE.TC, added -K (default to unsigned char) to TCC so string
|
||||||
|
literals which are signed char ptr's don't conflict with the unsigned
|
||||||
|
char ptr's now used all over to get eight-bit chars per Tom Almy.
|
||||||
|
Also added tabort.obj to TECOC_OBJS macro. Also added -DTCPP100 macro.
|
||||||
|
4. In ZPORT.H, changed EBFEXP, EBFINIT, IBFEXP, IBFINIT from 64000
|
||||||
|
to 64000L to get rid of TC++'s "Constant is long" warnings.
|
||||||
|
5. In ERR.C, ToErr(), got rid of TC++'s "Conversion may lose significant
|
||||||
|
digits" in Sbuf[DBfPtr-DBfBeg] line by using SLen to hold DBf length;
|
||||||
|
changed bogus compare "> '\126'" to "> '\177'"; also, the final ']'
|
||||||
|
was overwriting last digit in SBuf.
|
||||||
|
6. In RDLINE.C, changed function return type of expand_ibf from an
|
||||||
|
"static" to "static void". Also added prototype.
|
||||||
|
7. In TECOC.H, added prototype for errprt().
|
||||||
|
8. In RDLINE.C, expand_ibf(), added #if DEBUGGING lines so DbgFNm is declared.
|
||||||
|
9. In ZMSDOS.C, ZRdLin(), fixed typo in #if DEBUGGING "FAILURE" section.
|
||||||
|
10. In ZMSDOS.C, ZRaloc(), added test for TC++ v1.00 since the heap layout
|
||||||
|
has changed. In TC v2.0? mimic farrealloc(), in TC++ v1.00 call
|
||||||
|
farrealloc() directly.
|
||||||
|
18-July-1990 version 132
|
||||||
|
0. Changed TVERSION in TECOC.H to 132
|
||||||
|
1. lots more work to resolve type mismatches, so lint and gcc don't
|
||||||
|
complain so much.
|
||||||
|
2. fixed the ? immediate-mode command.
|
||||||
|
3. used GAPMIN in RdLine to fix wasteful memory use.
|
||||||
|
4. removed superflous parentheses from return statements.
|
||||||
|
5. to test that identifiers defined in ZPORT.H are minimally consistent,
|
||||||
|
added some tests in TECOC.C
|
||||||
|
6. To finish up eightbit handling, added ZSetTT, a function to let TECO set
|
||||||
|
terminal characteristics. Since it's there, added code so the 1:W and
|
||||||
|
2:W commands change screen size. Not video yet, but a little closer.
|
||||||
|
7. Changed ZMkOFN into a macro named ZMKOFN.
|
||||||
|
8. Fixed ZChIn to handle NoWait correctly.
|
||||||
|
9. Fixed handling of 0,32et bit.
|
||||||
|
(8-August-1990 Manfred)
|
||||||
|
10. In TECOC.C, changed "\n" to "\r\n" in debugging displays since stdout
|
||||||
|
is now in binary mode.
|
||||||
|
11. In INIT.C, in MemIni(), added Tom Almy's suggestion to temporarily
|
||||||
|
allocate a small chunk of memory to be used as a small-allocation
|
||||||
|
memory pool which may help keep memory fragmentation down.
|
||||||
|
12. In ZPORT.H, removed unused UWORD typedef.
|
||||||
|
13. In ZMSDOS.C, in ZVrBos(), changed old style function definition.
|
||||||
|
14. In ZMSDOS.C, propagated MPtrs[] dynamic allocation tracking to ZRaloc(),
|
||||||
|
added TC++'s new heapcheck() routines to check the heap on every alloc,
|
||||||
|
realloc, and free. We *are* DEBUGGING and don't care about speed
|
||||||
|
penalties, right?
|
||||||
|
15. In ERR.C, the one-line error messages for ERR_PES and ERR_PDO were
|
||||||
|
switched (Argh!).
|
||||||
|
16. In ZPORT.H, expanded EXS_SIZE, LPS_SIZE, MCS_SIZE, and QRS_SIZE so
|
||||||
|
SQU.TEC has some breathing room. Should these expand themselves?
|
||||||
|
17. Some of the .TEC and .TES files supplied with TECO-C were padded with
|
||||||
|
NUL's and some lines ending with ESC had an extra CR.
|
||||||
|
18. In ZMSDOS.C, ZDspCH() called write(). should call fwrite() or we're
|
||||||
|
mixing calls to write/fwrite on stdout which is bad. also, the code
|
||||||
|
which directly set stdout->flags'_F_BIN bit after setmode(stdout) in
|
||||||
|
ZTrmnl() somehow was lost between Pete's version and mine (?)
|
||||||
|
19. In ZMSDOS.C, in ZRdLin(), iBuf was cast as "char far *", should have
|
||||||
|
been cast simply as a "char *" otherwise compiling w/small data model
|
||||||
|
doesn't work.
|
||||||
|
20. In CHANGE.TES, changed some ^U constructs so it's now SQUishable.
|
||||||
|
21. In ZMSDOS.C, added ff_path[] to save ENfilespec$ wildcard lookup
|
||||||
|
filename since we can't be sure FBf will still contain the wildcard
|
||||||
|
lookup filename between ENfilespec$ and EN$.
|
||||||
|
22. Changed CLPARS.TES so when you MUNG there's no leftover trash in
|
||||||
|
q-register 0. (Pete)
|
||||||
|
19-August-1990 version 133 (Manfred)
|
||||||
|
0. Changed TVERSION in TECOC.H to 133
|
||||||
|
1. In EXEO.C, added support for computed gotos (nOtag0,tag1...$)
|
||||||
|
2. In INIT.C, in MemIni(), the digit buffer was being overrun on -1== since
|
||||||
|
the calculation to allocate the digit buffer either: a) didn't take into
|
||||||
|
account that 32-bits-per-long/3-bits-per-octal-digit doesn't divide evenly
|
||||||
|
(loses 2 bits), or b) didn't take into account that ExeEqu() might append
|
||||||
|
<CR><LF> to the digit buffer for =, ==, or === display purposes.
|
||||||
|
3. In ZMSDOS.C, fixed MPtrs[] tracking in ZRaloc, didn't work correctly
|
||||||
|
when farrealloc() eventually returns NULL.
|
||||||
|
4. In TECOC.C, added Turbo C's heapcheck() routine to check_consistency().
|
||||||
|
5. In RDLINE.C, in RdLine(), after expand_ibf(), was calling ZRdLin() even
|
||||||
|
if EBfFul was set TRUE. I don't think it should, even though we might be
|
||||||
|
able to read a line less than IBFMIN bytes long.
|
||||||
|
9-September-1990 version 134 (Pete)
|
||||||
|
0. Changed TVERSION in TECOC.H to 134
|
||||||
|
1. Changed the way I handle conditional inclusion of debugging code.
|
||||||
|
Borrowing from the way the ANSI assert macro works, all the debugging
|
||||||
|
functions are now macros, which don't produce any code if DEBUGGING
|
||||||
|
is FALSE.
|
||||||
|
2. Added TECOC.OPT so the VAX linker puts literal text strings into a
|
||||||
|
non-writeable PSECT.
|
||||||
|
3. Fixed ExeBSl so it will read a numeric string from the edit buffer even
|
||||||
|
if it's preceded by a minus-sign or plus-sign, and fixed TSTBSL.TEC
|
||||||
|
so it tests for these cases.
|
||||||
|
18-October-1990 version 135 (Pete)
|
||||||
|
0. Changed TVERSION in TECOC.H to 135.
|
||||||
|
1. Updated PG.RNH/PG.MEM again.
|
||||||
|
2. Fixed define of DBGFEX in TECOC.H so DEBUGGING works again.
|
||||||
|
3. Fixed FindQR and ExeM to make TECO-C handle :M commands correctly.
|
||||||
|
21-November-1990 version 136
|
||||||
|
0. Changed TVERSION in TECOC.H to 136.
|
||||||
|
1. Fixed DBGFEX syntax bug on line 1118 of ZMSDOS.C
|
||||||
|
2. Removed extra close parenthesis in EXEW.C
|
||||||
|
3. Fixed BLDSTR.C to allow searching for nulls. Thanks to Tom Almy.
|
||||||
|
4. Fixed ExeFGt to work correctly. Bug found by Richard Graham.
|
||||||
|
5. Added missing enblosing braces in InsStr. Thanks to Mark Henderson.
|
||||||
|
6. Added Mark Henderson's additional code to BldStr to provide ^EQ* (file
|
||||||
|
spec buffer) and ^EQ_ (search string buffer) support. Then broke BldStr
|
||||||
|
into functions for readability.
|
||||||
|
7. Inserted Mark Henderson's time and date code into ZUNIX.C. Testing with
|
||||||
|
DATE.TEC revealed a slight bug, fixed.
|
||||||
|
8. Added ZAMIGA.C and some mods to ZPORT.H from Ben Mesander to support
|
||||||
|
TECO-C under Amiga-DOS. Thanks Ben!
|
||||||
|
9. Fixed ExeEQ so it preserves the state of FFPage when reading files.
|
||||||
|
Thanks to Mark Henderson.
|
||||||
|
10. Added ZBell function to make the bell sound better under MS-DOS.
|
||||||
|
Thanks to Steve Freyder.
|
||||||
|
11. Added Mark Henderson's code (he got glob.c from Berkeley stuff)
|
||||||
|
to do wild-carding of file names. Reorganized it some. Thanks, Mark.
|
||||||
|
12. Added Mark's code to name backup files sort of like VMS. Not sure I
|
||||||
|
like this yet, because I haven't tried it. ED bit 4 controls it, like
|
||||||
|
so (from Mark:)
|
||||||
|
ED&4 now specifies the mechanism for backup files
|
||||||
|
if ED&4 is set then we use the foo foo.bak mechanism (as originally)
|
||||||
|
if ED&4 is clear the first backup file will be named foo;1, the
|
||||||
|
second foo;2, ...&c. Sort of VMS like, but the most recent
|
||||||
|
version will be known by the name foo.
|
||||||
|
13. Mark added TECFILES environment variable.
|
||||||
|
If for ei commands and TECO.INI the file is not found in the
|
||||||
|
current directory the directory $(TECFILES) will be searched.
|
||||||
|
I've been keeping my teco startup files in ~/.teco
|
||||||
|
26-December-1990 version 137
|
||||||
|
0. Changed TVERSION in TECOC.H to 137.
|
||||||
|
1. Minor fixups to get ZUNIX.C to compile.
|
||||||
|
2. Moved the line that resets FFPage to zero. It was in RdPage, now it's
|
||||||
|
in RdLine so a 1:a command now correctly resets flag. Thanks to Richard
|
||||||
|
Graham for reporting this one.
|
||||||
|
3. Modified ExeCtE so you can now set the flag as well as get its value,
|
||||||
|
like in TECO-11 and TECO-32.
|
||||||
|
4. Fixed ExeBSl so it sets RefLen when it converts a digit string in the
|
||||||
|
edit buffer into a binary value. Thanks to Mark Henderson.
|
||||||
|
5. Merged in new Amiga support files from Ben Mesander. There's a new
|
||||||
|
ZAMIGA.C, which now has time and date support. Ben supplied files
|
||||||
|
MAKEFILE.AMI and TECOC.LNK for building on the Amiga.
|
||||||
|
29-December-1990 version 138
|
||||||
|
0. Changed TVERSION in TECOC.H to 138.
|
||||||
|
1. Rewrote the TSTO.TEC macro, which pointed out a bug in TECO-32!
|
||||||
|
2. Added "smallcode smalldata" to LFLAGS vlue in MAKEFILE.AMI to make TECO-C
|
||||||
|
smaller (for faster startup) under AmigaDOS. Thanks to Ben Mesander.
|
||||||
|
3. Moved OpnInp and OpnOut into ExeE because only ExeE functions call them.
|
||||||
|
4. Changed ZOpInp function in ZVMS to do the right thing with the default
|
||||||
|
macro library directory. ZAMIGA.C, ZUNIX.C and ZMSDOS.C need to be
|
||||||
|
changed.
|
||||||
|
10-January-1991 version 139
|
||||||
|
0. Changed TVERSION in TECOC.H to 139.
|
||||||
|
1. Fixed ZUNIX.C so it handles default EI file names correctly. Still needs
|
||||||
|
ZClnEG to be implemented.
|
||||||
|
2. Applied Mark Henderson's patch to ZChIn to fix Control-C handling.
|
||||||
|
3. Applied Mark Henderson's patch to ExeEQ to fix EBFEnd pointer screw-up
|
||||||
|
when reading a large file with EQ. Thanks again, Mark!
|
||||||
|
4. Applied Ben Masander's patch to ZAMIGA.C to correctly call isatty.
|
||||||
|
5. Implemented "SYM" part of :EG command for VAX/VMS, so TECO-C can set DCL
|
||||||
|
symbols like DEC's TECO.
|
||||||
|
20-January-1991 version 140
|
||||||
|
0. Changed TVERSION in TECOC.H to 140.
|
||||||
|
1. Reworked ExeEG and ZClnEG to make it work under Unix and to do the
|
||||||
|
system dependent stuff in the right places.
|
||||||
|
2. Modified GENCLP to make it create clpars as "unsigned char" instead of
|
||||||
|
"signed char" to remove a gcc warning. Made GENCLP compile/link/run under
|
||||||
|
SunOS and modified MAKEFILE.SUN to include processing of GENCLP.
|
||||||
|
3. Changed GENCLP.C to define clpars as "const" for ANSI compilers.
|
||||||
|
4. Received another ZAMIGA.C from Ben Mesander. He is now using RCS to
|
||||||
|
control revisions, so there'll be version numbers for ZAMIGA.C from now
|
||||||
|
on. This is version 1.4.
|
||||||
|
5. Implemented Mark Henderson's suggestion to make the size of error
|
||||||
|
message buffers a #define'd identifier. I named it ERBFSIZ.
|
||||||
|
6. Merged in Mark Henderson's video support. This involved a LOT of
|
||||||
|
changes, including:
|
||||||
|
a. Merged MOVE.C into ZUNIX.C
|
||||||
|
b. changed VOID to VVOID to avoid clashing with CURSES.H
|
||||||
|
c. lots of added code with "#if CURSES" control
|
||||||
|
d. created VIDEO.TXT
|
||||||
|
e. created an EZ mode control flag for Mark's bits.
|
||||||
|
f. added exetil.c
|
||||||
|
23-February-1991 version 141
|
||||||
|
0. Changed TVERSION in TECOC.H to 141.
|
||||||
|
1. Some slight changes to make lint happy.
|
||||||
|
2. From Manfred: added DBGFEN calls to DoCtVW and DoCtE in BldStr, fixed
|
||||||
|
DbgFNm in ExeF, removed extra "#include <dos.h>" from ZMSDOS.C, added
|
||||||
|
"fclose(fp)" to init_code_checksums in ZMSDOS.C, and some other minor
|
||||||
|
fixups in ZMSDOS.C. Changed MAKEFILE.TC to avoid "Abnormal Program
|
||||||
|
Termination".
|
||||||
|
3. Added check of terminal width & height to ExeW for 0,1:w error.
|
||||||
|
4. Added Mark Henderson's fix to let ZUNIX.C compile under SunOS 4.0.
|
||||||
|
15-March-1991 version 142
|
||||||
|
0. Changed TVERSION in TECOC.H to 142.
|
||||||
|
1. Added Ben's fixes to slight build problems on AmigaDOS.
|
||||||
|
2. Fixed makefile.sun to make it handle SunOS 4.1 as well as 4.0. Still
|
||||||
|
needs hand-editing to the makefile before running it. Defaults to 4.1.
|
||||||
|
3. Added some fixes to ZUNIX.C to reduce gcc warnings.
|
||||||
|
4. Repaired makefile.sun, which was broken.
|
||||||
|
5. Fixed EXEFTIL.C and EXEF.C so they compile when DEBUGGING is defined.
|
||||||
|
20-April-1991 version 143
|
||||||
|
0. Changed TVERSION in TECOC.H to 143.
|
||||||
|
1. Changed CLPARS.TEC to parse Unix command lines with "-" for options
|
||||||
|
instead of "/".
|
||||||
|
2. Under Unix, changed ZClnEg to implement last-file-edited memory using
|
||||||
|
files in /tmp instead of gawdawful TECF00.TMP files in the current
|
||||||
|
directory.
|
||||||
|
3. Slight include file #ifdef changes to let it compile under SunOS 4.1.1.
|
||||||
|
4. Changed makefile.sun to not use a library. It's much faster this way.
|
||||||
|
5. Added case for tilde command to SkpCmd.c.
|
||||||
|
6. Those C files that directly include curses.h needed to have the
|
||||||
|
#include moved above zport.h.
|
||||||
|
7. Fixed ExeW so if we're not compiled with video, it returns nothing
|
||||||
|
instead of FAILURE, like TECO32. Returning FAILURE causes the current
|
||||||
|
macro to fail, and the current macro might be CLPARS!
|
||||||
|
8. Fixed ZUNIX.C so ET_UNIXNL is correctly defined.
|
||||||
|
9. Added Jerry Leichter's fixes to port to Ultrix, including makefile.ulx.
|
||||||
|
10. Fixed bug in ZUNIX.C where ZDspCh was being called with a string instead
|
||||||
|
of a character. Thanks Jerry!
|
||||||
|
2-June-1991 version 144
|
||||||
|
0. Changed TVERSION in TECOC.H to 144.
|
||||||
|
1. For the ^P command (for debugging, must compile with DEBUGGING set)
|
||||||
|
to work, each function that starts with a call to DBGFEN needs to have
|
||||||
|
a call to DBGFEX before every exit point, or the pretty nesting gets
|
||||||
|
screwed up. Added some DBGFEX calls to BldStr and ZOClos (in ZUNIX.C)
|
||||||
|
to fix the display when 4,0 is used.
|
||||||
|
2. Fixed DoFlag, ExeCtR, ExeCtT, ExeW and ExeBSl so they check the expression
|
||||||
|
stack correctly. They can now be used in expressions without problems.
|
||||||
|
Thanks to Mark Henderson and Jerry Leichter for reporting this.
|
||||||
|
3. Moved the check for "negative argument to comma" from ExeCom to GetAra,
|
||||||
|
where it belongs. This allows -1,5:w commands to work. Thanks to Jerry
|
||||||
|
Leichter.
|
||||||
|
4. Instead of "unterminated command", GetNmA now returns "ill-formed
|
||||||
|
expression", an new error message, when the stack is bogus.
|
||||||
|
5-June-1991 version 145
|
||||||
|
0. Changed TVERSION in TECOC.H to 145.
|
||||||
|
1. Modified PshMac to test set NumArg correctly, so a command like
|
||||||
|
^UA1$2+MA=$$ will work.
|
||||||
|
2. The "#else" on line 122 of ZUNIX.C should be a "#endif".
|
||||||
|
5-June-1991 to 18-June-1993 version 146
|
||||||
|
0. Changed TVERSION in TECOC.H to 146.
|
||||||
|
1. Removed the ~ and F~ commands (the EXETIL.C file and the ExeFTi function)
|
||||||
|
They were temporary commands used by Mark Henderson.
|
||||||
|
3. Added makefile.cct, fixed various minor nits suggested by CodeCenter.
|
||||||
|
4. Fixed error in the way the EI command reads files. If the file being
|
||||||
|
read was too large for the buffer, memory was getting stomped. Thanks
|
||||||
|
to Mark Henderson for reporting the bug in detail and suggesting a fix.
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
Chmacs.h
|
||||||
|
These are tested relational expressions. The ones defined for some
|
||||||
|
C's, like isalnum, tolower, etc do not always work, because they rely on bit
|
||||||
|
patterns within ASCII. These work.
|
||||||
|
Note: if this file is included, the tecoc.h file must precede it.
|
||||||
|
*****************************************************************************/
|
||||||
|
extern unsigned char ChrMsk[];
|
||||||
|
#define Is_Upper(ch) (ChrMsk[(ch)] & CM_UPPER)
|
||||||
|
#define Is_Lower(ch) (ChrMsk[(ch)] & CM_LOWER)
|
||||||
|
#define Is_Digit(ch) (ChrMsk[(ch)] & CM_DIGIT)
|
||||||
|
#define Is_Alpha(ch) (ChrMsk[(ch)] & (CM_UPPER | CM_LOWER))
|
||||||
|
#define Is_Alnum(ch) (ChrMsk[(ch)] & (CM_UPPER | CM_LOWER | CM_DIGIT))
|
||||||
|
#define To_Lower(ch) (Is_Upper(ch) ? (ch)+' ' : (ch) )
|
||||||
|
#define To_Upper(ch) (Is_Lower(ch) ? (ch)-' ' : (ch) )
|
||||||
|
/*****************************************************************************
|
||||||
|
these are TECO-specific. The above are not.
|
||||||
|
*****************************************************************************/
|
||||||
|
/* is line terminator */
|
||||||
|
#define IsEOL(ch) (ChrMsk[(ch)] & CM_LINE_TERM)
|
||||||
|
/* is symbol constituent */
|
||||||
|
#define Is_SyCon(ch) (Is_Alnum(ch) || ch == '.' || ch == '_' || ch == '$')
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ClenUp()
|
||||||
|
This function "cleans up" in preparation for terminating TECO-C. All
|
||||||
|
open files are closed and memory is freed.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
VVOID ClenUp (VVOID) /* cleanup for TECO-C abort */
|
||||||
|
{
|
||||||
|
QRptr QRp;
|
||||||
|
int i;
|
||||||
|
ZIClos(PINPFL); /* Close the primary and secondary... */
|
||||||
|
ZIClos(SINPFL); /* ...input streams, if they're open */
|
||||||
|
ZOClDe(POUTFL); /* Close the primary and secondary... */
|
||||||
|
ZOClDe(SOUTFL); /* ...output streams, if they're open */
|
||||||
|
/*
|
||||||
|
* free dynamically allocated buffers
|
||||||
|
*/
|
||||||
|
if (CBfBeg) ZFree((voidptr)CBfBeg); /* the command buffer */
|
||||||
|
if (DBfBeg) ZFree((voidptr)DBfBeg); /* the digit buffer */
|
||||||
|
if (EBfBeg) ZFree((voidptr)EBfBeg); /* the edit buffer */
|
||||||
|
if (FBfBeg) ZFree((voidptr)FBfBeg); /* the filename buffer */
|
||||||
|
if (SBfBeg) ZFree((voidptr)SBfBeg); /* the search string buffer */
|
||||||
|
/*
|
||||||
|
* free the global [0-35] and main-level local [36-71] Q-registers,
|
||||||
|
* and then the Q-register stack.
|
||||||
|
*/
|
||||||
|
for (QRp = QRgstr, i = 0; i < 72; ++i, ++QRp) {
|
||||||
|
if (QRp->Start != NULL) {
|
||||||
|
ZFree((voidptr)QRp->Start);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (QRp = QStack, i = 0; i < QRS_SIZE; ++i, ++QRp) {
|
||||||
|
if (QRp->Start != NULL) {
|
||||||
|
ZFree((voidptr)QRp->Start);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ZClnUp(); /* do system-dependent cleanup */
|
||||||
|
#if DEBUGGING
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* at this point, there shouldn't be any block malloc'ed by TECO-C.
|
||||||
|
* except if we're here because we EX'ed out of a macro, and we can't
|
||||||
|
* get to the ZBf buffer allocated in ExeEI, so the ZBf buffer is
|
||||||
|
* left hanging.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
!CLPARS.TEC V2.3 14-May-2004 Tom Almy, Pete Siemsen, and Mark Henderson!
|
||||||
|
[F0,0XF[90,0X9[00,0X0[20,0X210U0[0U0[00EDU0[0ED&4EDEUU0[0-1EU
|
||||||
|
ESU0[00ESETU0[032768#32#8#1,0ETQ1U00U1[10,0X10U4
|
||||||
|
(-1EJ-25600)*(-1EJ-25858)"E-UY|/UY'@.T/:QF"E.U.1Iteco0EJ\.-Q1U.L
|
||||||
|
Q.L-8"GQ.1+4JQ.L-8D4C'I.tmpQ.1,.XFQ.1,.D'/27:.TQ0+1"E32768U0'
|
||||||
|
32768"E:EITECO"S]1Q0#32768U1[1JODONE''Z"EGZ0,0XZ'J::S^ES"SD'
|
||||||
|
::STECO32"S-2D'ZJ-:S^ES"S.-Z"EFR''Z"EODONE'Q0&32767U10,0X10,0X9
|
||||||
|
J:S^ES^EUYNOI"SONOINI'J:S^EUYNOI"FONONOINI'!NOINI!
|
||||||
|
D::SN"S-D::SI"S-D''::S^ES"SD0A"AI ''Q1#4096U1!NONOINI!Q1&4096"E
|
||||||
|
HX0HKEPEAEF:EGINI"SG*J0A-36"EDHX1HK:ER^EQ1"SYHX1HKECG1|
|
||||||
|
%Can't find initialization file ":G1"1310''0,0X1|0,0X1
|
||||||
|
(-1EJ-5)*(-1EJ-1024)"EEN[]*.*:EN"SG*JS[R0KFS.]JS]0,.X1HK''
|
||||||
|
:ER^EQ1TECO.INI"SYHX9HKECG90,0X9''EREWZ"NZJ.U0G1I=G0Q0JZX9ZK]1
|
||||||
|
]0Q0ET]0Q0ES]0Q0EU]0Q0ED]0Q0]0Q0]2HX0HKG9JS=0,.-1X90,.KM0+0U90,0X0
|
||||||
|
[20,0X210U0[0U0[00EDU0[0ED&4EDEUU0[0-1EUESU0[00ES
|
||||||
|
ETU0[032768#32#8#1,0ET[1G9X1K0,0X9Q9U1J::S^ES"SD'
|
||||||
|
ZJ-:S^ES"S.-Z"EFR''Z"EOSCOPES'|G0''J:S^ES^EUYNOM"SONOMEMORY'
|
||||||
|
J:S^EUYNOM"FONONOMEMORY'!NOMEMORY!
|
||||||
|
D::SE"S-D::SM"S-D::SO"S-D::SR"S-D::SY"S-D'''''
|
||||||
|
::S^ES"SD0A"AI ''Q1#4U1!NONOMEMORY!J:S^ES^EUYNOC"SONOCREATE'
|
||||||
|
J:S^EUYNOC"FONONOCREATE'!NOCREATE!
|
||||||
|
D::SR"S-D::SE"S-D::SA"S-D::ST"S-D::SE"S-D'''''
|
||||||
|
::S^ES"SD0A"AI ''Q1#256U1!NONOCREATE!J:S^ES^EUYNOP"SONOPAGE'
|
||||||
|
J:S^EUYNOP"FONONOPAGE'!NOPAGE!D::SA"S-D::SG"S-D::SE"S-D'''
|
||||||
|
::S^ES"SD0A"AI ''Q1#64U1!NONOPAGE!J:S^ES^EUYNOR"SONORENAME'
|
||||||
|
J:S^EUYNOR"FONONORENAME'!NORENAME!D::SA"S-D::SG"S-D::SE"S-D'''
|
||||||
|
::S^ES"SD0A"AI ''Q1#512U1!NONORENAME!
|
||||||
|
J::STE"S<0A"AC|1;'>::S^ES@"S0KIMUNG ''J::SMU"S-2D<0A"AD|1;'>
|
||||||
|
::S^ES"SD'(-1EJ-5)*(-1EJ-1024)"EJ::S""S-D::S^ES"SD'''ZU0
|
||||||
|
(-1EJ-25600)*(-1EJ-25858)"EJ:S-"SR.-Q0"L.U0''|J:S/"SR.-Q0"L.U0'''
|
||||||
|
J:S^ES"S.-Q0"L.U0''J<S,;.U1Q1-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>0,.X.0
|
||||||
|
:Q.0"E?How can I MUNG nothing?1310'::S^ES 0,.K0U0EI^EQ.0
|
||||||
|
JODONE'J:S^ES^EUYVT"SOVTEDIT'J:S^EUYVT"FONOVTEDIT'!VTEDIT!
|
||||||
|
The VTEDIT command line option is not supported by TECOC1310
|
||||||
|
!NOVTEDIT!J:S^ES+"SD\U40,128EZD::Ss"SD0A"AI '''Q1&64"N0,128EZ'
|
||||||
|
J:S^ES^EUYSC"SOSCROLL'J:S^EUYSC"FONOSCROLL'!SCROLL!
|
||||||
|
D::SR"S-D::SO"S-D::SL"S-D::SL"S-D''''::S:^ED"SR-D\U2FR|0U2'
|
||||||
|
::S:S"S-2D::SE"S-D::SE"S-D::SA"S-D::SL"S-D::SL"S-D'''''Q1#16U1'
|
||||||
|
::S^ES"SD0A"AI ''Q1#128U1!NOSCROLL!J::STE"S-2D<0A"AD|1;'>
|
||||||
|
::S^ES"SD'J:S^ES^EUYIN"SOINSPECT'J:S^EUYIN"FONOINSPECT'!INSPECT!
|
||||||
|
D::SS"S-D::SP"S-D::SE"S-D::SC"S-D::ST"S-D'''''
|
||||||
|
::S^ES"SD0A"AI ''Q1#2U1!NOINSPECT!J:S^ES^EUYFI"SOFIND'
|
||||||
|
J:S^EUYFI"FONOFIND'!FIND!
|
||||||
|
The /FIND command line option is not supported by TECOC1310
|
||||||
|
!NOFIND!J<.-Z;0A-9"EDF<'0A-32"EDF<'C-1A-""E:S""S
|
||||||
|
(-1EJ-25857)*(-1EJ-25858)"E0J2<@FS/"//>ZJ'|ZJ''>Q1&4#Z"E:EGMEM"SG*J
|
||||||
|
::S$"SD|OGOTIT'|M.TGF'HX0HKEPEAEF:ER^EQ0"SYL."N-1A-10"E-D''
|
||||||
|
."N-1A-13"E-D''ZKHX0HKECG0'EREW0,0X0!GOTIT!ZJZ"NQ1#32768#16384U1''
|
||||||
|
Q1&16384"NQ1&2"EEdi|Inspec'ting file "HT"1310'Z"E
|
||||||
|
Q1&2"EOSCOPES'?How can I inspect nothing?1310'Q1&2"EJ:S="S
|
||||||
|
0,.-1X00,.KZU0HX2HK:Q2"N:ER^EQ2"UG2HX0HKONOTFND'':Q0"NEW^EQ0'Q0"N
|
||||||
|
Q1#2048U1'OREMEM''HX0HKQ1&2"E:EB^EQ0"SQ1#2048U1OREMEM':ERQ0"S
|
||||||
|
Q1#2048U1%Can't write to file -- opening for input only1310OREMEM
|
||||||
|
'Q1&256"NQ1&32768"EONOTFND''%Can't find file ":G0"1310
|
||||||
|
Q1&32768"E%Creating new file1310OCREATE|
|
||||||
|
%Ignoring TECO's memory1310Q1#8192U10,0X0OREMEM'':ER^EQ0"S
|
||||||
|
Q1#2048U1OSCOPES'!NOTFND!?Can't find file ":G0"?1310'
|
||||||
|
J::SMA"S-2D<0A"AD|1;'>::S^ES"SD'J<.-Z;0A-9"EDF<'0A-32"EDF<'C
|
||||||
|
-1A-""E:S""S(-1EJ-25857)*(-1EJ-25858)"E0J2<@FS/"//>ZJ'|ZJ''>
|
||||||
|
Z"E?How can I MAKE nothing?1310'
|
||||||
|
Z-4"EJ::SLOVE"SNot war?1310''HX0HK!CREATE!EW^EQ0OREMEM'
|
||||||
|
%Unrecognized command "HTHK"1310OSCOPES!REMEM!Q1&8192"E
|
||||||
|
Q1&(32768#4)"NOSCOPES':Q0"EOSCOPES'':EGMEM"SZJG*C::S$"U
|
||||||
|
ZK:EGMEM ^EQ0OSCOPES|-1DZXFZK'|M.T'EA:EW^EQF"SG0HPWHKEF'EW!SCOPES!
|
||||||
|
!YANK!Q1&2048"NY'JQ1&128"NET&512"E
|
||||||
|
%Your terminal is not an interactive scope1310|Q2"E2:W-4U2'0,3:W
|
||||||
|
Q1&16"N1,3:W'0,5:WQ1&32"N1,5:W'Q2,7:W-Q2"N
|
||||||
|
%Your terminal doesn't support scrolling1310'''!DONE!Q4-1"G
|
||||||
|
Q4-1:S^J"U0J''Q1&64"N0,128EZ'Q1&512"N0,2EZ']1]0Q0ET]0Q0ES]0Q0EU]0Q0ED
|
||||||
|
]0Q0]0Q0]2]0]9]F0U.10U.L0U40UY0,0X.T
|
||||||
|
|
@ -0,0 +1,808 @@
|
||||||
|
!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 !
|
||||||
|
|
||||||
|
|
@ -0,0 +1,279 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
CMatch()
|
||||||
|
This recursive function trys to match one match construct with the
|
||||||
|
character pointed to by EBPtr2. It sets SamChr, which indicates whether the
|
||||||
|
match was successful or not. SStPtr is left pointing to the last character
|
||||||
|
of the match construct.
|
||||||
|
If the match construct is ^Em or ^S, then EBPtr2 will be updated to
|
||||||
|
point to the last matched character. In this case, RhtSid is needed to
|
||||||
|
indicate the limit past which EBPtr2 should not be incremented.
|
||||||
|
Match constructs are:
|
||||||
|
^X match any character
|
||||||
|
^S match a separator character (not letter or digit)
|
||||||
|
^N match anything but following match construct
|
||||||
|
^EA match any alphabetic
|
||||||
|
^EB match a separator character (not letter or digit)
|
||||||
|
^EC match symbol constituent
|
||||||
|
^ED match any digit
|
||||||
|
^EGq match any character in q-register q
|
||||||
|
^EL match any line terminator (LF, VT, FF)
|
||||||
|
^EM match non-null string of following match construct
|
||||||
|
^ER match any alphanumeric
|
||||||
|
^ES match non-null string of spaces and/or tabs
|
||||||
|
^EV match lowercase alphabetic
|
||||||
|
^EW match uppercase alphabetic
|
||||||
|
^EX match any character
|
||||||
|
^E<nnn> match character with ASCII code nnn (octal)
|
||||||
|
^E[x1,x2,...xn] match any of the match constructs x1, x2, etc.
|
||||||
|
else match the character itself
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "dchars.h" /* define identifiers for characters */
|
||||||
|
#include "chmacs.h" /* define character processing macros */
|
||||||
|
#include "deferr.h" /* define identifiers for error messages */
|
||||||
|
DEFAULT CMatch(SamChr) /* match a character */
|
||||||
|
BOOLEAN *SamChr; /* returned match indicator */
|
||||||
|
{
|
||||||
|
BOOLEAN ChrMat; /* character match indicator */
|
||||||
|
char OtCase; /* "other" case character */
|
||||||
|
charptr QRPtr; /* pointer into q-register text */
|
||||||
|
charptr SavEP2; /* temporary holder of EBPtr2 */
|
||||||
|
charptr SavSSP; /* temporary holder of SStPtr */
|
||||||
|
DEFAULT Status; /* FindQR() status for ^EGq */
|
||||||
|
charptr TCBfPt; /* temporary holder of CBfPtr */
|
||||||
|
charptr TCStEn; /* temporary holder of CStEnd */
|
||||||
|
unsigned int TmpChr; /* accumulator for ^E<nnn> */
|
||||||
|
#if DEBUGGING
|
||||||
|
static char *DbgFNm = "CMatch";
|
||||||
|
sprintf(DbgSBf,"*SStPtr = '%c', *EBPtr2 = '%c'", *SStPtr, *EBPtr2);
|
||||||
|
DbgFEn(3,DbgFNm,DbgSBf);
|
||||||
|
#endif
|
||||||
|
switch (*SStPtr) {
|
||||||
|
case CTRL_X:
|
||||||
|
*SamChr = TRUE;
|
||||||
|
break;
|
||||||
|
case CTRL_S:
|
||||||
|
*SamChr = !Is_Alnum(*EBPtr2);
|
||||||
|
break;
|
||||||
|
case CTRL_N:
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ISS); /* ill. search str. */
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (CMatch(&ChrMat) == FAILURE) {
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
*SamChr = !ChrMat;
|
||||||
|
#if DEBUGGING
|
||||||
|
sprintf(DbgSBf,"SUCCESS, *SamChr = %s",
|
||||||
|
(*SamChr == TRUE) ? "TRUE" : "FALSE");
|
||||||
|
DbgFEx(3,DbgFNm,DbgSBf);
|
||||||
|
#endif
|
||||||
|
return SUCCESS;
|
||||||
|
case CTRL_E:
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE); /* ICE = illegal ^E */
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
switch (To_Upper(*SStPtr)) {
|
||||||
|
case 'A':
|
||||||
|
*SamChr = Is_Alpha(*EBPtr2);
|
||||||
|
break;
|
||||||
|
case 'B':
|
||||||
|
*SamChr = !Is_Alnum(*EBPtr2);
|
||||||
|
break;
|
||||||
|
case 'C':
|
||||||
|
*SamChr = Is_SyCon(*EBPtr2);
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
*SamChr = Is_Digit(*EBPtr2);
|
||||||
|
break;
|
||||||
|
case 'G':
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE); /* ill. ^E command */
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
TCBfPt = CBfPtr; /* save CBfPtr */
|
||||||
|
TCStEn = CStEnd; /* save CStEnd */
|
||||||
|
CBfPtr = SStPtr;
|
||||||
|
CStEnd = SBfPtr;
|
||||||
|
Status = FindQR();
|
||||||
|
SStPtr = CBfPtr;
|
||||||
|
SBfPtr = CStEnd;
|
||||||
|
CBfPtr = TCBfPt; /* restore CBfPtr */
|
||||||
|
CStEnd = TCStEn; /* restore CStEnd */
|
||||||
|
if (Status == FAILURE) {
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
QRPtr = QR->Start;
|
||||||
|
while (QRPtr < QR->End_P1) {
|
||||||
|
if (*QRPtr++ == *EBPtr2) {
|
||||||
|
*SamChr = TRUE;
|
||||||
|
#if DEBUGGING
|
||||||
|
sprintf(DbgSBf,"SUCCESS, *SamChr = %s", (*SamChr)?"TRUE":"FALSE");
|
||||||
|
DbgFEx(3,DbgFNm,DbgSBf);
|
||||||
|
#endif
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*SamChr = FALSE;
|
||||||
|
break;
|
||||||
|
case 'L':
|
||||||
|
*SamChr = IsEOL(*EBPtr2);
|
||||||
|
break;
|
||||||
|
case 'M':
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
SavSSP = SStPtr;
|
||||||
|
if (CMatch(&ChrMat) == FAILURE) {
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
*SamChr = ChrMat;
|
||||||
|
if (ChrMat) {
|
||||||
|
while (EBPtr2 <= RhtSid) {
|
||||||
|
SavEP2 = EBPtr2;
|
||||||
|
++EBPtr2;
|
||||||
|
SStPtr = SavSSP;
|
||||||
|
if (CMatch(&ChrMat) == FAILURE) {
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (!ChrMat) {
|
||||||
|
EBPtr2 = SavEP2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if DEBUGGING
|
||||||
|
sprintf(DbgSBf,"SUCCESS, *SamChr = %s",(*SamChr)?"TRUE":"FALSE");
|
||||||
|
DbgFEx(3,DbgFNm,DbgSBf);
|
||||||
|
#endif
|
||||||
|
return SUCCESS;
|
||||||
|
case 'R':
|
||||||
|
*SamChr = Is_Alnum(*EBPtr2);
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
if ((*EBPtr2 != SPACE) && (*EBPtr2 != TABCHR)) {
|
||||||
|
*SamChr = FALSE;
|
||||||
|
} else {
|
||||||
|
*SamChr = TRUE;
|
||||||
|
while (EBPtr2 <= RhtSid) {
|
||||||
|
++EBPtr2;
|
||||||
|
if ((*EBPtr2 != SPACE) && (*EBPtr2 != TABCHR)) {
|
||||||
|
EBPtr2--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'V':
|
||||||
|
*SamChr = Is_Lower(*EBPtr2);
|
||||||
|
break;
|
||||||
|
case 'W':
|
||||||
|
*SamChr = Is_Upper(*EBPtr2);
|
||||||
|
break;
|
||||||
|
case 'X':
|
||||||
|
*SamChr = TRUE;
|
||||||
|
break;
|
||||||
|
case '<':
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3, DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
TmpChr = 0;
|
||||||
|
while (Is_Digit(*SStPtr)) {
|
||||||
|
TmpChr *= 8;
|
||||||
|
TmpChr += *SStPtr - '0';
|
||||||
|
if (TmpChr > 255) {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (*SStPtr != '>') {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
*SamChr = (*EBPtr2 == (unsigned char)TmpChr);
|
||||||
|
break;
|
||||||
|
case '[':
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
while (*SStPtr != ']') {
|
||||||
|
if (*SStPtr == ',') {
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (CMatch(&ChrMat) == FAILURE) {
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (ChrMat) {
|
||||||
|
while (*SStPtr != ']') {
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*SamChr = TRUE;
|
||||||
|
#if DEBUGGING
|
||||||
|
sprintf(DbgSBf,"SUCCESS, *SamChr = %s",
|
||||||
|
(*SamChr) ? "TRUE" : "FALSE");
|
||||||
|
DbgFEx(3,DbgFNm,DbgSBf);
|
||||||
|
#endif
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
if (++SStPtr == SBfPtr) {
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ErrMsg(ERR_ICE);
|
||||||
|
DBGFEX(3,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
} /* end of ^E switch */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (SMFlag == 0) { /* if case independence */
|
||||||
|
OtCase = Is_Upper(*SStPtr) ? To_Lower(*SStPtr)
|
||||||
|
: To_Upper(*SStPtr);
|
||||||
|
*SamChr = ((*EBPtr2 == *SStPtr) || (*EBPtr2 == OtCase));
|
||||||
|
} else {
|
||||||
|
*SamChr = (*EBPtr2 == *SStPtr);
|
||||||
|
}
|
||||||
|
} /* end of switch */
|
||||||
|
#if DEBUGGING
|
||||||
|
sprintf(DbgSBf,"SUCCESS, *SamChr = %s", (*SamChr) ? "TRUE" : "FALSE");
|
||||||
|
DbgFEx(3,DbgFNm,DbgSBf);
|
||||||
|
#endif
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
DChars.h
|
||||||
|
This header file defines identifiers for control characters.
|
||||||
|
*****************************************************************************/
|
||||||
|
#define CTRL_A '\001' /* SOH - start of heading */
|
||||||
|
#define CTRL_B '\002' /* STX - start of text */
|
||||||
|
#define CTRL_C '\003' /* ETX - end of text */
|
||||||
|
#define CTRL_D '\004' /* EOT - end of transmission */
|
||||||
|
#define CTRL_E '\005' /* ENQ - enquiry */
|
||||||
|
#define CTRL_F '\006' /* ACK - acknowledge */
|
||||||
|
#define CTRL_G '\007' /* BEL - bell */
|
||||||
|
#define BAKSPC '\010' /* BS - backspace control H */
|
||||||
|
#define TABCHR '\011' /* HT - horizontal tab control I */
|
||||||
|
#define LINEFD '\012' /* LF - line feed control J */
|
||||||
|
#define VRTTAB '\013' /* VT - vertical tab control K */
|
||||||
|
#define FORMFD '\014' /* FF - form feed control L */
|
||||||
|
#define CRETRN '\015' /* CR - carriage return control M */
|
||||||
|
#define CTRL_N '\016' /* SO - shift out */
|
||||||
|
#define CTRL_O '\017' /* SI - shift in */
|
||||||
|
#define CTRL_P '\020' /* DLE - data link escape */
|
||||||
|
#define CTRL_Q '\021' /* DC1 - device control 1 */
|
||||||
|
#define CTRL_R '\022' /* DC2 - device control 2 */
|
||||||
|
#define CTRL_S '\023' /* DC3 - device control 3 */
|
||||||
|
#define CTRL_T '\024' /* DC4 - device control 4 */
|
||||||
|
#define CTRL_U '\025' /* NAK - negative acknowledge */
|
||||||
|
#define CTRL_V '\026' /* SYN - synchronous idle */
|
||||||
|
#define CTRL_W '\027' /* ETB - end of transmission block */
|
||||||
|
#define CTRL_X '\030' /* CAN - cancel */
|
||||||
|
#define CTRL_Y '\031' /* EM - end of medium */
|
||||||
|
#define CTRL_Z '\032' /* SUB - substitute */
|
||||||
|
#define ESCAPE '\033' /* ESC - escape control [ */
|
||||||
|
#define FSCHAR '\034' /* FS - file separator control \ */
|
||||||
|
#define GSCHAR '\035' /* GS - group separator control ] */
|
||||||
|
#define RSCHAR '\036' /* RS - record separator control ^ */
|
||||||
|
#define USCHAR '\037' /* US - unit separator control _ */
|
||||||
|
#define SPACE '\040' /* SP - space */
|
||||||
|
#define DELETE '\177' /* DEL - delete */
|
||||||
|
|
@ -0,0 +1,93 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
DefErr.h
|
||||||
|
This file defines identifiers for error messages generated by TECOC-C.
|
||||||
|
The codes that are commented out are those that were defined in TECO-11, but
|
||||||
|
are not used by TECOC-C.
|
||||||
|
IMPORTANT: if you change this file, you will need to change
|
||||||
|
TECOC.RNH, DEFERR.H, VRBMSG.H and ERR.C.
|
||||||
|
*****************************************************************************/
|
||||||
|
#define ERR_XXX -1 /* no error */
|
||||||
|
#define ERR_ARG 0 /* improper arguments */
|
||||||
|
#define ERR_BNI 1 /* > not in iteration */
|
||||||
|
#define ERR_DTB 2 /* delete too big */
|
||||||
|
#define ERR_FNF 3 /* file not found "filename" */
|
||||||
|
#define ERR_ICE 4 /* illegal ^E command in search argument */
|
||||||
|
#define ERR_IEC 5 /* illegal character "x" after E */
|
||||||
|
#define ERR_IFC 6 /* illegal character "x" after F */
|
||||||
|
#define ERR_IIA 7 /* illegal insert argument */
|
||||||
|
#define ERR_ILL 8 /* illegal command "x" */
|
||||||
|
#define ERR_ILN 9 /* illegal number */
|
||||||
|
#define ERR_IPA 10 /* negative or 0 argument to P */
|
||||||
|
#define ERR_IQC 11 /* illegal character "x" following " */
|
||||||
|
#define ERR_IQN 12 /* illegal q-register name "x" */
|
||||||
|
#define ERR_IRA 13 /* illegal radix argument to ^R */
|
||||||
|
#define ERR_ISA 14 /* illegal search argument */
|
||||||
|
#define ERR_ISS 15 /* illegal search string */
|
||||||
|
#define ERR_IUC 16 /* illegal character "x" following ^ */
|
||||||
|
#define ERR_MAP 17 /* missing ' */
|
||||||
|
#define ERR_MEM 18 /* memory overflow */
|
||||||
|
#define ERR_NAB 19 /* no argument before ^_ */
|
||||||
|
#define ERR_NAC 20 /* no argument before , */
|
||||||
|
#define ERR_NAE 21 /* no argument before = */
|
||||||
|
#define ERR_NAP 22 /* no argument before ) */
|
||||||
|
#define ERR_NAQ 23 /* no argument before " */
|
||||||
|
#define ERR_NAS 24 /* no argument before ; */
|
||||||
|
#define ERR_NAU 25 /* no argument before U */
|
||||||
|
#define ERR_NCA 26 /* negative argument to , */
|
||||||
|
#define ERR_NFI 27 /* no file for input */
|
||||||
|
#define ERR_NFO 28 /* no file for output */
|
||||||
|
#define ERR_NYA 29 /* numeric argument with Y */
|
||||||
|
#define ERR_NYI 30 /* not yet implemented */
|
||||||
|
#define ERR_OFO 31 /* output file already open */
|
||||||
|
#define ERR_PDO 32 /* push-down list overflow */
|
||||||
|
#define ERR_PES 33 /* attempt to pop empty stack */
|
||||||
|
#define ERR_POP 34 /* attempt to move pointer off page with "x" */
|
||||||
|
#define ERR_SNI 35 /* ; not in iteration */
|
||||||
|
#define ERR_SRH 36 /* search failure "text" */
|
||||||
|
#define ERR_STL 37 /* string too long */
|
||||||
|
#define ERR_TAG 38 /* missing tag !tag! */
|
||||||
|
#define ERR_UTC 39 /* unterminated command "x" */
|
||||||
|
#define ERR_UTM 40 /* unterminated macro */
|
||||||
|
#define ERR_XAB 41 /* execution aborted */
|
||||||
|
#define ERR_YCA 42 /* Y command aborted */
|
||||||
|
/*
|
||||||
|
* The following errors aren't listed in the Standard TECO Manual, but
|
||||||
|
* were added for use by TECO-C.
|
||||||
|
*/
|
||||||
|
#define ERR_IFE 43 /* ill-formed numeric expression */
|
||||||
|
#define ERR_SYS 44 /* %s */
|
||||||
|
#define ERR_UCD 45 /* unable to close and delete output file */
|
||||||
|
#define ERR_UCI 46 /* unable to close input file */
|
||||||
|
#define ERR_UCO 47 /* unable to close output file */
|
||||||
|
#define ERR_UFI 48 /* unable to open file "x" for input */
|
||||||
|
#define ERR_UFO 49 /* unable to open file "x" for output */
|
||||||
|
#define ERR_URC 50 /* unable to read character from terminal */
|
||||||
|
#define ERR_URE 51 /* unable to read TECO command file */
|
||||||
|
#define ERR_URL 52 /* unable to read line from input file */
|
||||||
|
#define ERR_UWL 53 /* unable to write line to output file */
|
||||||
|
/*
|
||||||
|
Standard TECO errors that possibly should be generated by TECOC-C:
|
||||||
|
?CON Confused use of conditionals
|
||||||
|
?FER File error
|
||||||
|
?INP Input error
|
||||||
|
?OUT Output error
|
||||||
|
Standard TECO errors not used by TECO-C are:
|
||||||
|
?CCL CCL.SV not found or EG argument too long
|
||||||
|
?CPQ Can't pop into Q-register (TECO-C uses PES)
|
||||||
|
?DEV Invalid device
|
||||||
|
?ERR RSTS/E error message (RSTS/E only)
|
||||||
|
?FUL Output Command would have overflowed output device
|
||||||
|
?IFN Illegal character "x" in filename
|
||||||
|
?MLA Missing Left Angle Bracket
|
||||||
|
?MLP Missing (
|
||||||
|
?MRA Missing Right Angle Bracket
|
||||||
|
?MRP Missing )
|
||||||
|
?MSC Missing Start of Conditional
|
||||||
|
?NPA Negative or 0 argument to P (TECO-C uses IPA)
|
||||||
|
?NRO No room for output
|
||||||
|
?UTM Unterminated macro
|
||||||
|
?WLO System Device Write-Locked
|
||||||
|
?nnn I/O Error or Directive Error (RSX-11 only)
|
||||||
|
%Superseding existing filed (TECO-11 only)
|
||||||
|
%Search fail in iter (TECO-11 only)
|
||||||
|
*/
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
DefExt.h
|
||||||
|
This header file declares as EXTERN all the variables declared as
|
||||||
|
GLOBAL in Tecoc.c for use by everyone else.
|
||||||
|
*****************************************************************************/
|
||||||
|
EXTERN charptr AraBeg; /* beginning of text m,n area */
|
||||||
|
EXTERN charptr AraEnd; /* end of text m,n area */
|
||||||
|
EXTERN charptr ArgPtr; /* beginning of text argument */
|
||||||
|
EXTERN charptr CBfBeg; /* command buffer beginning */
|
||||||
|
EXTERN charptr CBfEnd; /* command buffer end */
|
||||||
|
EXTERN charptr CBfPtr; /* pointer into command string */
|
||||||
|
EXTERN char CmdMod; /* command modifiers flags for @, ;, etc. */
|
||||||
|
EXTERN DEFAULT CrType; /* value of 0:W (terminal type) */
|
||||||
|
EXTERN charptr CStBeg; /* command string beginning */
|
||||||
|
EXTERN charptr CStEnd; /* pointer to last char of command string */
|
||||||
|
EXTERN DEFAULT CurInp; /* index of current input stream in IFiles */
|
||||||
|
EXTERN DEFAULT CurOut; /* index of current output stream in OFiles */
|
||||||
|
EXTERN charptr DBfBeg; /* digit buffer beginning */
|
||||||
|
EXTERN charptr DBfPtr; /* digit buffer pointer */
|
||||||
|
#if DEBUGGING
|
||||||
|
EXTERN char DbgSBf[]; /* debug message sprintf() buffer */
|
||||||
|
#endif
|
||||||
|
EXTERN charptr EBfBeg; /* edit buffer beginning */
|
||||||
|
EXTERN charptr EBfEnd; /* edit buffer end */
|
||||||
|
EXTERN charptr EBPtr1; /* pointer to start of found string */
|
||||||
|
EXTERN charptr EBPtr2; /* pointer to end of found string */
|
||||||
|
EXTERN WORD EdFlag; /* ED mode control flag */
|
||||||
|
EXTERN WORD EhFlag; /* EH mode control flag */
|
||||||
|
EXTERN charptr EndSAr; /* end of search area */
|
||||||
|
EXTERN char ErrTxt[]; /* holds part of error message */
|
||||||
|
EXTERN WORD EsFlag; /* ES mode control flag */
|
||||||
|
EXTERN WORD EStBot; /* expression stack bottom */
|
||||||
|
EXTERN struct EStck EStack[]; /* expression stack */
|
||||||
|
EXTERN WORD EStTop; /* expression stack top */
|
||||||
|
EXTERN WORD EtFlag; /* ET mode control flag */
|
||||||
|
EXTERN WORD EuFlag; /* EU mode control flag */
|
||||||
|
EXTERN WORD EvFlag; /* EV mode control flag */
|
||||||
|
EXTERN WORD EzFlag; /* EZ mode control flag */
|
||||||
|
EXTERN charptr FBfBeg; /* beginning of filename buffer */
|
||||||
|
EXTERN charptr FBfEnd; /* end of filename buffer */
|
||||||
|
EXTERN charptr FBfPtr; /* pointer into filename buffer */
|
||||||
|
EXTERN LONG FFPage; /* form feed flag (returned by ^E command) */
|
||||||
|
EXTERN charptr GapBeg; /* edit buffer gap beginning */
|
||||||
|
EXTERN charptr GapEnd; /* end of edit buffer gap */
|
||||||
|
EXTERNV BOOLEAN GotCtC; /* TRUE if the user just hit a control-C */
|
||||||
|
EXTERN charptr IBfEnd; /* end of input buffer */
|
||||||
|
EXTERN charptr IBfEnd; /* input buffer end */
|
||||||
|
EXTERN int IniSrM; /* initial search mode */
|
||||||
|
EXTERN BOOLEAN IsEofI[]; /* input file has reached end of file */
|
||||||
|
EXTERN BOOLEAN IsOpnI[]; /* input file is opened indicators */
|
||||||
|
EXTERN BOOLEAN IsOpnO[]; /* output file is opened indicators */
|
||||||
|
EXTERN WORD LStBot; /* loop stack bottom */
|
||||||
|
EXTERN struct LStck LStack[]; /* loop stack */
|
||||||
|
EXTERN struct LStck LStack[]; /* loop stack */
|
||||||
|
EXTERN WORD LstErr; /* number of last error message */
|
||||||
|
EXTERN WORD LStTop; /* loop stack top */
|
||||||
|
EXTERN LONG MArgmt; /* m part of m,n numeric argument pair */
|
||||||
|
EXTERN BOOLEAN Matchd; /* indicates successful search */
|
||||||
|
EXTERN struct MStck MStack[]; /* macro stack */
|
||||||
|
EXTERN WORD MStTop; /* macro stack top */
|
||||||
|
EXTERN LONG NArgmt; /* numeric argument */
|
||||||
|
EXTERN QRptr QR; /* pointer to q-register structure */
|
||||||
|
EXTERN struct QReg QRgstr[]; /* global q-registers */
|
||||||
|
EXTERN struct QReg QStack[]; /* q-register stack */
|
||||||
|
EXTERN WORD QStTop; /* top of q-register stack */
|
||||||
|
EXTERN DEFAULT Radix; /* TECO-C's current radix, 2-36 */
|
||||||
|
EXTERN LONG RefLen; /* value returned by ^S command */
|
||||||
|
EXTERN charptr RhtSid; /* right-hand side of area to be searched */
|
||||||
|
EXTERN charptr SBfBeg; /* search string buffer beginning */
|
||||||
|
EXTERN charptr SBfEnd; /* search string buffer end */
|
||||||
|
EXTERN charptr SBfPtr; /* end of search string, plus one */
|
||||||
|
EXTERN LONG SIncrm; /* search increment, 1 (forward), -1 (back) */
|
||||||
|
EXTERN WORD SMFlag; /* search mode flag */
|
||||||
|
EXTERN WORD SrcTyp; /* type of search (E_SEARCH, N_SEARCH, etc) */
|
||||||
|
EXTERN charptr SStPtr; /* pointer into search string */
|
||||||
|
EXTERN BOOLEAN TraceM; /* trace mode flag */
|
||||||
|
#if VIDEO
|
||||||
|
EXTERN DEFAULT HldFlg; /* value of 5:W (hold mode flag) */
|
||||||
|
EXTERN DEFAULT HtSize; /* value of 1:W (screen width) */
|
||||||
|
EXTERN DEFAULT MrkFlg; /* value of 4:W */
|
||||||
|
EXTERN DEFAULT ScroLn; /* value of 7:W */
|
||||||
|
EXTERN DEFAULT SeeAll; /* value of 3:W */
|
||||||
|
EXTERN DEFAULT TopDot; /* value of 6:W */
|
||||||
|
EXTERN DEFAULT VtSize; /* value of 2:W (screen height) */
|
||||||
|
#if CURSES
|
||||||
|
EXTERN DEFAULT SpcMrk; /* value of 8:W */
|
||||||
|
EXTERN DEFAULT KeyPad; /* value of 9:W */
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
DoCJR()
|
||||||
|
This function contains the code that's common to the C, J and R
|
||||||
|
commands. It is called by ExeC, ExeJ and ExeR only.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "deferr.h" /* define identifiers for error messages */
|
||||||
|
DEFAULT DoCJR(HowFar) /* do C, J or R stuff */
|
||||||
|
LONG HowFar; /* positive or negative displacement */
|
||||||
|
{
|
||||||
|
LONG InRange;
|
||||||
|
BOOLEAN ColonMod;
|
||||||
|
#if DEBUGGING
|
||||||
|
static char *DbgFNm = "DoCJR";
|
||||||
|
sprintf(DbgSBf,"HowFar = %ld", HowFar);
|
||||||
|
DbgFEn(2,DbgFNm,DbgSBf);
|
||||||
|
#endif
|
||||||
|
ColonMod = (CmdMod & COLON); /* is it :C, :J, or :R? */
|
||||||
|
CmdMod &= ~COLON; /* clear : flag */
|
||||||
|
InRange = -1; /* -1 means SUCCESS in TECO */
|
||||||
|
if (HowFar > 0) {
|
||||||
|
if ((GapEnd+HowFar) > EBfEnd) {
|
||||||
|
InRange = 0; /* 0 means FAILURE in TECO */
|
||||||
|
} else {
|
||||||
|
MEMMOVE(GapBeg, GapEnd+1, HowFar);
|
||||||
|
GapBeg += HowFar;
|
||||||
|
GapEnd += HowFar;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((GapBeg+HowFar) < EBfBeg) {
|
||||||
|
InRange = 0; /* 0 means FAILURE in TECO */
|
||||||
|
} else {
|
||||||
|
GapBeg += HowFar;
|
||||||
|
GapEnd += HowFar;
|
||||||
|
MEMMOVE(GapEnd+1, GapBeg, -(HowFar));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ColonMod) { /* if colon modifier */
|
||||||
|
DBGFEX(2,DbgFNm,"PushEx");
|
||||||
|
return PushEx(InRange, OPERAND);
|
||||||
|
} else {
|
||||||
|
if (InRange == 0) { /* if out-of-bounds */
|
||||||
|
ErrChr(ERR_POP, *CBfPtr);
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
EStTop = EStBot; /* clear expression stack */
|
||||||
|
DBGFEX(2,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,88 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
DoEvEs()
|
||||||
|
This function "does" what's specified by the EV (edit verify) or
|
||||||
|
ES (search verify) flag. The ES and EV flags are mode control flags that
|
||||||
|
allow the user to cause TECO to display a part of the edit buffer after
|
||||||
|
executing a command string (edit verify) or after a search (search verify).
|
||||||
|
Both the ES and EV flags are 0 by default, which means don't do anything.
|
||||||
|
This function is only called when the ES or EV flag is non-zero.
|
||||||
|
The flag is passed to this function for decoding. This function
|
||||||
|
examines the flag and acts accordingly. Both the ES and EV flags have the
|
||||||
|
following meaning:
|
||||||
|
-1 do a 1V command to display the current line
|
||||||
|
0 do nothing (this function is not even called)
|
||||||
|
1-31 type out current line with line-feed at CP
|
||||||
|
32-255 type out current line with ASCII character (32-255) at CP
|
||||||
|
else bottom byte as above, top byte is argument to V command
|
||||||
|
*****************************************************************************/
|
||||||
|
#if CURSES /* need to define standout and standend? */
|
||||||
|
#if ULTRIX
|
||||||
|
#include <cursesX.h> /* note: this has to come before zport.h */
|
||||||
|
#else
|
||||||
|
#include <curses.h> /* note: this has to come before zport.h */
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "dchars.h" /* define identifiers for characters */
|
||||||
|
VVOID DoEvEs(Flag) /* EV or ES flag code */
|
||||||
|
WORD Flag;
|
||||||
|
{
|
||||||
|
unsigned char PtChar; /* special "CP" character */
|
||||||
|
unsigned char VLines; /* argument to V command */
|
||||||
|
if (Flag == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Flag == -1) { /* -1 means do a 1V command */
|
||||||
|
VLines = 1; /* view 1 line */
|
||||||
|
PtChar = '\0';
|
||||||
|
} else {
|
||||||
|
PtChar = (unsigned char)Flag;
|
||||||
|
VLines = (unsigned char)(Flag >> 8);
|
||||||
|
if (VLines == 0) { /* be sure it's at least 1 */
|
||||||
|
VLines = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TypBuf(GapBeg+Ln2Chr((LONG)1 - (LONG)VLines), GapBeg);
|
||||||
|
#if CURSES
|
||||||
|
if (GapEnd+1 < EBfEnd) {
|
||||||
|
unsigned char c = *(GapEnd + 1);
|
||||||
|
standout();
|
||||||
|
if (c=='\b') {
|
||||||
|
ZDspBf("^H", 2);
|
||||||
|
} else if (c=='\r') {
|
||||||
|
ZDspBf("^M", 2);
|
||||||
|
} else if (c=='\n') {
|
||||||
|
ZDspBf("^J", 2);
|
||||||
|
} else if (c & 0200) {
|
||||||
|
int i;
|
||||||
|
char a,b;
|
||||||
|
c = c & 0177;
|
||||||
|
i = c/16;
|
||||||
|
if (i==0)
|
||||||
|
a='8';
|
||||||
|
else if (i==1)
|
||||||
|
a=9;
|
||||||
|
else
|
||||||
|
a = i - 2 + 'A';
|
||||||
|
i = (c % 16);
|
||||||
|
b = (i > 9) ? i - 10 + 'A' : i + '0';
|
||||||
|
ZDspCh('[');
|
||||||
|
ZDspCh(a);
|
||||||
|
ZDspCh(b);
|
||||||
|
ZDspCh(']');
|
||||||
|
} else
|
||||||
|
ZDspCh(c);
|
||||||
|
standend();
|
||||||
|
TypBuf(GapEnd+2, GapEnd + Ln2Chr((LONG)VLines)+1);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if ((PtChar >= '\001') && (PtChar <= '\037')) {
|
||||||
|
ZDspCh(LINEFD);
|
||||||
|
} else if (PtChar != 0) {
|
||||||
|
ZDspCh(PtChar);
|
||||||
|
}
|
||||||
|
TypBuf(GapEnd+1, GapEnd+Ln2Chr((LONG)VLines)+1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
DoFlag()
|
||||||
|
This function gets or sets the value of a TECO mode control flag.
|
||||||
|
The TECO mode control flags are ED, EH, ES, ET, EU, EV, EZ and ^X.
|
||||||
|
The EO flag can only be examined, not set, so ExeEO does not call this
|
||||||
|
function.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
DEFAULT DoFlag(Flag) /* handle a mode control flag */
|
||||||
|
WORD *Flag;
|
||||||
|
{
|
||||||
|
DBGFEN(2,"DoFlag",NULL);
|
||||||
|
if ((EStTop == EStBot) || /* if no numeric arg or */
|
||||||
|
(EStack[EStTop].ElType != OPERAND)) { /* partial expression */
|
||||||
|
DBGFEX(2,DbgFNm,"PushEx");
|
||||||
|
return PushEx((LONG)*Flag, OPERAND); /* return the flag */
|
||||||
|
}
|
||||||
|
if (GetNmA() == FAILURE) { /* get the numeric argument */
|
||||||
|
DBGFEX(2,DbgFNm,"FAILURE, GetNmA() failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if ((CmdMod & MARGIS) == '\0') { /* if it's n<flag> */
|
||||||
|
*Flag = (WORD)NArgmt; /* set the flag to n */
|
||||||
|
} else if (MArgmt && NArgmt) { /* else if it's m,n<flag> */
|
||||||
|
*Flag &= (WORD)~MArgmt; /* turn off m bits */
|
||||||
|
*Flag |= (WORD)NArgmt; /* turn on n bits */
|
||||||
|
} else if ((MArgmt == 0) && NArgmt) { /* else if it's 0,n<flag> */
|
||||||
|
*Flag |= (WORD)NArgmt; /* turn on n bits */
|
||||||
|
} else if ((MArgmt) && (NArgmt == 0)) { /* else if it's m,0<flag> */
|
||||||
|
*Flag &= (WORD)~MArgmt; /* turn off m bits */
|
||||||
|
}
|
||||||
|
EStTop = EStBot; /* clear expression stack */
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
DBGFEX(2,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
DScren.h
|
||||||
|
Terminal types (0:W command, CrType variable). The strange
|
||||||
|
numbering is what is used in TECO-11.
|
||||||
|
*****************************************************************************/
|
||||||
|
#define UNTERM -1 /* unknown */
|
||||||
|
#define VT52 0 /* VT52 */
|
||||||
|
#define VT61 1 /* VT61 */
|
||||||
|
#define VT100V 2 /* VT100 in VT52 mode */
|
||||||
|
#define VT100 4 /* VT100 in ANSI mode */
|
||||||
|
#define VT05 6 /* VT05 */
|
||||||
|
#define VT102 8 /* VT102 */
|
||||||
|
#define VK100 10 /* VK100 */
|
||||||
|
#define VT200 11 /* VT200 in VT200 mode */
|
||||||
|
#define VT200A 12 /* VT200 in ANSI (VT100) mode */
|
||||||
|
#define VT200V 13 /* VT200 in VT52 mode */
|
||||||
|
#define IBMPC 14 /* IBM PC console */
|
||||||
|
/*****************************************************************************
|
||||||
|
Screen function codes. These are used in calls to ZScrOp.
|
||||||
|
*****************************************************************************/
|
||||||
|
#define SCR_CUP 1 /* move cursor up 1 row */
|
||||||
|
#define SCR_EEL 2 /* erase to end of line */
|
||||||
|
#define SCR_RON 3 /* reverse-video on */
|
||||||
|
#define SCR_ROF 4 /* reverse-video off */
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
EchoIt()
|
||||||
|
This function displays a character in it's printable form, either
|
||||||
|
as CH, ^CH, or [CH].
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global identifiers */
|
||||||
|
#include "dchars.h" /* define identifiers for characters */
|
||||||
|
VVOID EchoIt(Charac)
|
||||||
|
unsigned char Charac;
|
||||||
|
{
|
||||||
|
if (Charac > USCHAR && Charac < DELETE) { /* displayable? */
|
||||||
|
ZDspCh(Charac);
|
||||||
|
} else if (Charac & '\200') { /* eighth bit set? */
|
||||||
|
if (EtFlag & ET_EIGHTBIT) { /* term can display */
|
||||||
|
ZDspCh(Charac);
|
||||||
|
} else {
|
||||||
|
ZDspCh('['); /* display as [ch] */
|
||||||
|
MakDBf((LONG)Charac,16);
|
||||||
|
*DBfPtr++ = ']';
|
||||||
|
ZDspBf(DBfBeg, DBfPtr-DBfBeg);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (Charac) {
|
||||||
|
case BAKSPC:
|
||||||
|
case TABCHR:
|
||||||
|
case LINEFD:
|
||||||
|
case CRETRN:
|
||||||
|
ZDspCh(Charac);
|
||||||
|
break;
|
||||||
|
case ESCAPE:
|
||||||
|
ZDspCh('$');
|
||||||
|
break;
|
||||||
|
case FORMFD:
|
||||||
|
ZDspCh('\r');
|
||||||
|
/* fall through to VRTTAB */
|
||||||
|
case VRTTAB:
|
||||||
|
ZDspBf("\n\n\n\n", 4);
|
||||||
|
break;
|
||||||
|
case DELETE:
|
||||||
|
break;
|
||||||
|
case CTRL_G:
|
||||||
|
ZDspCh(CTRL_G);
|
||||||
|
/* fall through to default case */
|
||||||
|
default: /* display as ^ch */
|
||||||
|
ZDspCh('^');
|
||||||
|
ZDspCh(Charac | '\100');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,273 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ErrChr(), ErrMsg(), ErrStr(), ErrUTC(), ErrVrb()
|
||||||
|
These functions display TECO's error messages.
|
||||||
|
ErrChr display a message that contains a special character
|
||||||
|
ErrMsg display a message given the message number
|
||||||
|
ErrStr display a message that contains a special string
|
||||||
|
ErrUTC display UTC or UTM based on macro stack depth
|
||||||
|
ErrVrb display the verbose form of an error message
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "deferr.h" /* define error message codes */
|
||||||
|
#include "dchars.h" /* define identifiers for characters */
|
||||||
|
#include <string.h> /* prototype for strlen() */
|
||||||
|
#if USE_PROTOTYPES
|
||||||
|
static VVOID ErrDsp(WORD ErrNum, unsigned char *ELine);
|
||||||
|
static VVOID ToErr(unsigned char Charac, charptr *PtrPtr);
|
||||||
|
#endif
|
||||||
|
/****
|
||||||
|
IMPORTANT: if you change this list, you must also change DEFERR.H,
|
||||||
|
TECOC.RNH and VRBMSG.H !!!
|
||||||
|
****/
|
||||||
|
static char *Errors[] = {
|
||||||
|
/* 0*/ "ARG Improper arguments",
|
||||||
|
/* 1*/ "BNI > not in iteration",
|
||||||
|
/* 2*/ "DTB Delete too big",
|
||||||
|
/* 3*/ "FNF File not found \"%s\"",
|
||||||
|
/* 4*/ "ICE Illegal ^E command in search argument",
|
||||||
|
/* 5*/ "IEC Illegal character \"%s\" after E",
|
||||||
|
/* 6*/ "IFC Illegal character \"%s\" after F",
|
||||||
|
/* 7*/ "IIA Illegal insert argument",
|
||||||
|
/* 8*/ "ILL Illegal command \"%s\"",
|
||||||
|
/* 9*/ "ILN Illegal number",
|
||||||
|
/* 10*/ "IPA Negative or 0 argument to P",
|
||||||
|
/* 11*/ "IQC Illegal \" character",
|
||||||
|
/* 12*/ "IQN Illegal Q-register name \"%s\"",
|
||||||
|
/* 13*/ "IRA Illegal radix argument to ^R",
|
||||||
|
/* 14*/ "ISA Illegal search argument",
|
||||||
|
/* 15*/ "ISS Illegal search string",
|
||||||
|
/* 16*/ "IUC Illegal character \"%s\" following ^",
|
||||||
|
/* 17*/ "MAP Missing '",
|
||||||
|
/* 18*/ "MEM Memory overflow",
|
||||||
|
/* 19*/ "NAB No argument before ^_ ",
|
||||||
|
/* 20*/ "NAC No argument before ,",
|
||||||
|
/* 21*/ "NAE No argument before =",
|
||||||
|
/* 22*/ "NAP No argument before )",
|
||||||
|
/* 23*/ "NAQ No argument before \"",
|
||||||
|
/* 24*/ "NAS No argument before ;",
|
||||||
|
/* 25*/ "NAU No argument before U",
|
||||||
|
/* 26*/ "NCA Negative argument to ,",
|
||||||
|
/* 27*/ "NFI No file for input",
|
||||||
|
/* 28*/ "NFO No file for output",
|
||||||
|
/* 29*/ "NYA Numeric argument with Y",
|
||||||
|
/* 30*/ "NYI Not yet implemented",
|
||||||
|
/* 31*/ "OFO Output file already open",
|
||||||
|
/* 32*/ "PDO Push-down list overflow",
|
||||||
|
/* 33*/ "PES Attempt to pop an empty stack",
|
||||||
|
/* 34*/ "POP Attempt to move pointer off page with \"%s\"",
|
||||||
|
/* 35*/ "SNI ; not in iteration",
|
||||||
|
/* 36*/ "SRH Search failure \"%s\"",
|
||||||
|
/* 37*/ "STL String too long",
|
||||||
|
/* 38*/ "TAG Missing tag !%s!",
|
||||||
|
/* 39*/ "UTC Unterminated command",
|
||||||
|
/* 40*/ "UTM Unterminated macro",
|
||||||
|
/* 41*/ "XAB Execution aborted",
|
||||||
|
/* 42*/ "YCA Y command aborted",
|
||||||
|
/* 43*/ "IFE ill-formed numeric expression",
|
||||||
|
/* 44*/ "SYS %s",
|
||||||
|
/* 45*/ "UCD unable to close and delete output file %s",
|
||||||
|
/* 46*/ "UCI unable to close input file",
|
||||||
|
/* 47*/ "UCO unable to close output file",
|
||||||
|
/* 48*/ "UFI unable to open file %s for input",
|
||||||
|
/* 49*/ "UFO unable to open file %s for output",
|
||||||
|
/* 50*/ "URC unable to read character from terminal",
|
||||||
|
/* 51*/ "URE unable to read TECO command file",
|
||||||
|
/* 52*/ "URL unable to read line from input file",
|
||||||
|
/* 53*/ "UWL unable to write line to output file"
|
||||||
|
};
|
||||||
|
/*****************************************************************************
|
||||||
|
ErrUTC()
|
||||||
|
Simply call ErrMsg with either ERR_UTC (unterminated command) or
|
||||||
|
ERR_UTM (unterminated macro) depending on whether we're in a macro or not.
|
||||||
|
*****************************************************************************/
|
||||||
|
VVOID ErrUTC()
|
||||||
|
{
|
||||||
|
ErrMsg((MStTop < 0) ? ERR_UTC : ERR_UTM);
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
ErrVrb()
|
||||||
|
This function displays the verbose form of an error message.
|
||||||
|
The verbose form is a short paragraph explaining the error condition in
|
||||||
|
some detail. This function is called from ErrDsp when the least significant
|
||||||
|
two bits of the EH flag are set to 3, or from FrstCh when the user types
|
||||||
|
a / immediately after receiving a short error message.
|
||||||
|
Verbose explanations of error messages are stored in the HELP system
|
||||||
|
so that they can be accessed using the HELP command. Therefore this function
|
||||||
|
calls ZHelp to display the verbose messages.
|
||||||
|
*****************************************************************************/
|
||||||
|
VVOID ErrVrb(ErrNum) /* display verbose error message */
|
||||||
|
WORD ErrNum; /* error message number */
|
||||||
|
{
|
||||||
|
DBGFEN(3,"ErrVrb",NULL);
|
||||||
|
ZVrbos(ErrNum, Errors[ErrNum]);
|
||||||
|
DBGFEX(3,DbgFNm,NULL);
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
ErrDsp()
|
||||||
|
This function displays a TECO error message on the terminal screen.
|
||||||
|
This function is passed the number of the error message and the text of the
|
||||||
|
error message.
|
||||||
|
The EH flag controls how verbose the error message will be. The two
|
||||||
|
least significant bits of the EH flag control how verbose the error message
|
||||||
|
is. The third bit (mask is EH_COMMAND) causes the erroneous command string up
|
||||||
|
to and including the erroneous command to be displayed.
|
||||||
|
The low two bits of EH have the following meanings:
|
||||||
|
0 same as 2
|
||||||
|
1 only the three letter code is output
|
||||||
|
2 three letter code and one-line error message
|
||||||
|
3 three letter code, one-lien message and paragraph
|
||||||
|
*****************************************************************************/
|
||||||
|
static VVOID ErrDsp(ErrNum, ELine)
|
||||||
|
WORD ErrNum; /* the error number */
|
||||||
|
unsigned char *ELine; /* error message text */
|
||||||
|
{
|
||||||
|
WORD HlpLvl;
|
||||||
|
ptrdiff_t lenn;
|
||||||
|
HlpLvl = (EhFlag & 3) ? (EhFlag & 3) : 2;
|
||||||
|
lenn = (HlpLvl < 2) ? 4 : strlen(ELine);
|
||||||
|
ZDspBf(ELine, lenn);
|
||||||
|
if (HlpLvl == 3) { /* if paragraph */
|
||||||
|
ErrVrb(ErrNum); /* display paragraph */
|
||||||
|
}
|
||||||
|
ZDspBf("\r\n", 2);
|
||||||
|
if (EhFlag & EH_COMMAND) { /* if error string display is on */
|
||||||
|
TypESt();
|
||||||
|
}
|
||||||
|
LstErr = ErrNum;
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
ToErr()
|
||||||
|
Given a character and a buffer pointer, this function puts the
|
||||||
|
displayable representation for the character into the buffer and updates
|
||||||
|
the buffer position. For most characters, the displayable representation
|
||||||
|
is the character itself.
|
||||||
|
*****************************************************************************/
|
||||||
|
static VVOID ToErr(Charac, PtrPtr)
|
||||||
|
unsigned char Charac;
|
||||||
|
charptr *PtrPtr;
|
||||||
|
{
|
||||||
|
char SBuf[5];
|
||||||
|
char *SPtr;
|
||||||
|
size_t SLen;
|
||||||
|
switch (Charac) {
|
||||||
|
case TABCHR: SPtr = "<TAB>"; SLen = 5; break;
|
||||||
|
case LINEFD: SPtr = "<LF>"; SLen = 4; break;
|
||||||
|
case VRTTAB: SPtr = "<VT>"; SLen = 4; break;
|
||||||
|
case FORMFD: SPtr = "<FF>"; SLen = 4; break;
|
||||||
|
case CRETRN: SPtr = "<CR>"; SLen = 4; break;
|
||||||
|
case ESCAPE: SPtr = "<ESC>"; SLen = 5; break;
|
||||||
|
case '\0': SPtr = "<NUL>"; SLen = 5; break;
|
||||||
|
default: if (Charac >= DELETE) {
|
||||||
|
SPtr = SBuf;
|
||||||
|
MakDBf((LONG)Charac, 16);
|
||||||
|
SLen = (size_t) (DBfPtr - DBfBeg);
|
||||||
|
SBuf[0] = '[';
|
||||||
|
MEMMOVE(&SBuf[1], DBfBeg, SLen);
|
||||||
|
SBuf[++SLen] = ']';
|
||||||
|
++SLen;
|
||||||
|
} else if (Charac < SPACE) {
|
||||||
|
SPtr = SBuf;
|
||||||
|
MEMMOVE(SBuf, "<^x>", 4);
|
||||||
|
SBuf[2] = Charac + '@';
|
||||||
|
SLen = 4;
|
||||||
|
} else {
|
||||||
|
SPtr = (char *)&Charac;
|
||||||
|
SLen = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
MEMMOVE(*PtrPtr, SPtr, SLen);
|
||||||
|
*PtrPtr += SLen;
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
*****************************************************************************/
|
||||||
|
VVOID ErrChr(ErrNum, EChr) /* display error message with character arg */
|
||||||
|
WORD ErrNum; /* the error number */
|
||||||
|
unsigned char EChr; /* character to imbed in message */
|
||||||
|
{
|
||||||
|
char *TmpPtr;
|
||||||
|
unsigned char ErrBuf[ERBFSIZ];
|
||||||
|
charptr EPtr = ErrBuf;
|
||||||
|
*EPtr++ = '?';
|
||||||
|
TmpPtr = Errors[ErrNum];
|
||||||
|
while (*TmpPtr != '%') { /* copy up to "%" */
|
||||||
|
*EPtr++ = *TmpPtr++;
|
||||||
|
}
|
||||||
|
ToErr(EChr, &EPtr); /* copy the %c character */
|
||||||
|
TmpPtr++; /* skip % */
|
||||||
|
TmpPtr++; /* skip c */
|
||||||
|
while (*TmpPtr) { /* copy rest of string */
|
||||||
|
*EPtr++ = *TmpPtr++;
|
||||||
|
}
|
||||||
|
*EPtr = '\0';
|
||||||
|
ErrDsp(ErrNum, ErrBuf);
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
*****************************************************************************/
|
||||||
|
VVOID ErrMsg(ErrNum) /* display error message */
|
||||||
|
WORD ErrNum; /* the error number */
|
||||||
|
{
|
||||||
|
char *TmpPtr;
|
||||||
|
unsigned char ErrBuf[ERBFSIZ];
|
||||||
|
charptr EPtr = ErrBuf;
|
||||||
|
*EPtr++ = '?';
|
||||||
|
TmpPtr = Errors[ErrNum];
|
||||||
|
while (*TmpPtr) { /* copy rest of string */
|
||||||
|
*EPtr++ = *TmpPtr++;
|
||||||
|
}
|
||||||
|
*EPtr = '\0';
|
||||||
|
ErrDsp(ErrNum, ErrBuf);
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
*****************************************************************************/
|
||||||
|
VVOID ErrStr(ErrNum, EStr) /* display error message with string arg */
|
||||||
|
WORD ErrNum; /* the error number */
|
||||||
|
char *EStr; /* string to imbed in message */
|
||||||
|
{
|
||||||
|
char *TmpPtr;
|
||||||
|
unsigned char ErrBuf[ERBFSIZ];
|
||||||
|
charptr EPtr = ErrBuf;
|
||||||
|
*EPtr++ = '?';
|
||||||
|
TmpPtr = Errors[ErrNum];
|
||||||
|
while (*TmpPtr != '%') { /* copy up to "%" */
|
||||||
|
*EPtr++ = *TmpPtr++;
|
||||||
|
}
|
||||||
|
while (*EStr) { /* copy %s string */
|
||||||
|
ToErr((unsigned char)*EStr++, &EPtr);
|
||||||
|
}
|
||||||
|
TmpPtr++; /* skip % */
|
||||||
|
TmpPtr++; /* skip s */
|
||||||
|
while (*TmpPtr) { /* copy rest of string */
|
||||||
|
*EPtr++ = *TmpPtr++;
|
||||||
|
}
|
||||||
|
*EPtr = '\0';
|
||||||
|
ErrDsp(ErrNum, ErrBuf);
|
||||||
|
}
|
||||||
|
/*****************************************************************************
|
||||||
|
*****************************************************************************/
|
||||||
|
VVOID ErrPSt(ErrNum, EBeg, EEnd) /* display error message with string arg */
|
||||||
|
WORD ErrNum; /* the error number */
|
||||||
|
charptr EBeg; /* string to imbed in message */
|
||||||
|
charptr EEnd; /* ptr to char after last char */
|
||||||
|
{
|
||||||
|
char *TmpPtr;
|
||||||
|
unsigned char ErrBuf[ERBFSIZ];
|
||||||
|
charptr EPtr = ErrBuf;
|
||||||
|
*EPtr++ = '?';
|
||||||
|
TmpPtr = Errors[ErrNum];
|
||||||
|
while (*TmpPtr != '%') { /* copy up to "%" */
|
||||||
|
*EPtr++ = *TmpPtr++;
|
||||||
|
}
|
||||||
|
while (EBeg < EEnd) { /* copy %s string */
|
||||||
|
ToErr(*EBeg++, &EPtr);
|
||||||
|
}
|
||||||
|
TmpPtr++; /* skip % */
|
||||||
|
TmpPtr++; /* skip s */
|
||||||
|
while (*TmpPtr) { /* copy rest of string */
|
||||||
|
*EPtr++ = *TmpPtr++;
|
||||||
|
}
|
||||||
|
*EPtr = '\0';
|
||||||
|
ErrDsp(ErrNum, ErrBuf);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,113 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeA()
|
||||||
|
This function executes an A command.
|
||||||
|
A Appends the next page of the input file to the contents
|
||||||
|
of the text buffer, thus combining the two pages of
|
||||||
|
text on a single page with no intervening form feed
|
||||||
|
character. This command takes no argument. To perform
|
||||||
|
n Appends, use the n<A> construct. Note that nA is a
|
||||||
|
completely different command.
|
||||||
|
:A Equivalent to the A command except that a value is
|
||||||
|
returned. -1 is returned if the append succeeded, and
|
||||||
|
0 is returned if the append failed because the
|
||||||
|
end-of-the-input-file had previously been reached (^N
|
||||||
|
flag is -1 at start of this command).
|
||||||
|
n:A Appends n lines of text from the input file to the
|
||||||
|
contents of the text buffer. The value of n must not
|
||||||
|
be negative. A value is returned indicating whether or
|
||||||
|
not there were in fact n lines remaining in the input
|
||||||
|
file. -1 is returned if the command succeeded. 0 is
|
||||||
|
returned if end-of-file on the input file was
|
||||||
|
encountered before all n lines were read in. Note that
|
||||||
|
the command can succeed and yet read in fewer than n
|
||||||
|
lines in the case that the text buffer fills up.
|
||||||
|
nA Equivalent to the ASCII code for the .+n+1th character
|
||||||
|
in the buffer (that is, the character to the right of
|
||||||
|
buffer pointer position .+n). The expression -1A is
|
||||||
|
equivalent to the ASCII code of the character
|
||||||
|
immediately preceding the pointer and 0A is equivalent
|
||||||
|
to the ASCII code of the character immediately
|
||||||
|
following the pointer (the current character). If the
|
||||||
|
character position referenced lies outside the bounds
|
||||||
|
of the text buffer, this command returns a -1.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "deferr.h" /* define identifiers for error messages */
|
||||||
|
DEFAULT ExeA() /* execute an A command */
|
||||||
|
{
|
||||||
|
BOOLEAN EBfFul;
|
||||||
|
unsigned char TmpChr;
|
||||||
|
BOOLEAN ColonMod;
|
||||||
|
DBGFEN(1,"ExeA",NULL);
|
||||||
|
ColonMod = (CmdMod & COLON); /* is it :A or n:A */
|
||||||
|
CmdMod &= ~COLON; /* clear : flag */
|
||||||
|
/*
|
||||||
|
* if we have a numeric argument, it's nA or n:A
|
||||||
|
*/
|
||||||
|
if (EStTop > EStBot) { /* if numeric argument */
|
||||||
|
UMinus(); /* if it's -A, make it -1A */
|
||||||
|
if (GetNmA() == FAILURE) { /* get numeric argument */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE, GetNmA() failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (ColonMod) { /* if it's n:A */
|
||||||
|
if (NArgmt < 1) {
|
||||||
|
ErrMsg(ERR_IPA);
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE, n:A, n < 1");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
while (NArgmt-- > 0) {
|
||||||
|
EBfFul = FALSE;
|
||||||
|
if (RdLine(&EBfFul) == FAILURE) {
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE, RdLine() failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (EBfFul) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (IsEofI[CurInp]) { /* if end-of-file */
|
||||||
|
DBGFEX(1,DbgFNm,"PushEx(0)");
|
||||||
|
return PushEx(0L, OPERAND);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DBGFEX(1,DbgFNm,"PushEx(-1)");
|
||||||
|
return PushEx(-1L, OPERAND);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* it's nA
|
||||||
|
*/
|
||||||
|
if (NArgmt < 0) {
|
||||||
|
if ((GapBeg+NArgmt) < EBfBeg) {
|
||||||
|
DBGFEX(1,DbgFNm,"PushEx(-1)");
|
||||||
|
return PushEx(-1L, OPERAND);
|
||||||
|
}
|
||||||
|
TmpChr = *(GapBeg+NArgmt);
|
||||||
|
} else {
|
||||||
|
if ((GapEnd+NArgmt+1) > EBfEnd) {
|
||||||
|
DBGFEX(1,DbgFNm,"PushEx(-1)");
|
||||||
|
return PushEx(-1L, OPERAND);
|
||||||
|
}
|
||||||
|
TmpChr = *(GapEnd+NArgmt+1);
|
||||||
|
}
|
||||||
|
#if DEBUGGING
|
||||||
|
sprintf(DbgSBf,"PushEx(%d)", TmpChr);
|
||||||
|
DbgFEx(1,DbgFNm,DbgSBf);
|
||||||
|
#endif
|
||||||
|
return PushEx((LONG)TmpChr, OPERAND);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* if there is no numeric argument, must be A or :A
|
||||||
|
*/
|
||||||
|
if (IsEofI[CurInp]) { /* if already at end-of-file */
|
||||||
|
DBGFEX(1,DbgFNm,(ColonMod) ? "PushEx(0)" : "SUCCESS");
|
||||||
|
return ((ColonMod) ? PushEx(0L,OPERAND) : SUCCESS);
|
||||||
|
}
|
||||||
|
if (RdPage() == FAILURE) { /* read a page */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE, RdPage() failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
DBGFEX(1,DbgFNm,(ColonMod) ? "PushEx(-1)" : "SUCCESS");
|
||||||
|
return (ColonMod) ? PushEx(-1L, OPERAND) : SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeAtS()
|
||||||
|
This function executes an @ (at-sign) command.
|
||||||
|
This function implements the at-sign modifier by setting a bit in
|
||||||
|
the CmdMod variable. Commands which are sensitive to at-sign modification
|
||||||
|
check CmdMod explicitly.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
DEFAULT ExeAtS() /* execute an @ (at sign) command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeAtS",NULL);
|
||||||
|
CmdMod |= ATSIGN; /* set at sign */
|
||||||
|
DBGFEX(1,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeB()
|
||||||
|
This function executes a B command.
|
||||||
|
B Always equivalent to zero. Thus, B represents the
|
||||||
|
position preceding the first character in the buffer.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
DEFAULT ExeB() /* execute a B command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeB",NULL);
|
||||||
|
DBGFEX(1,DbgFNm,"PushEx(0)");
|
||||||
|
return PushEx(0L, OPERAND);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeBar()
|
||||||
|
This function executes a | (vertical bar) command.
|
||||||
|
| Start ELSE part of conditional
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "deferr.h" /* define identifiers for error messages */
|
||||||
|
DEFAULT ExeBar() /* execute | (vertical bar) command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeBar",NULL);
|
||||||
|
if (FlowEC() == FAILURE) { /* flow to ' */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
EStTop = EStBot; /* clear expression stack */
|
||||||
|
DBGFEX(1,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,86 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeBSl()
|
||||||
|
This function executes a \ (backslash) command.
|
||||||
|
\ Value of digit string in buffer
|
||||||
|
n\ Convert n to digits in buffer
|
||||||
|
The backslash command allows the user to convert binary numbers
|
||||||
|
to/from their ASCII representations. If a numeric argument precedes the
|
||||||
|
backslash command, then the ASCII representation for the number is inserted
|
||||||
|
into the edit buffer at the current point. If there is no preceding numeric
|
||||||
|
argument, then the number in it's ASCII representation in the edit buffer is
|
||||||
|
converted to binary, and is returned by the backslash command. In either
|
||||||
|
case, TECO's current radix controls how the numbers are represented. If
|
||||||
|
the current radix is decimal, then a plus or minus sign can precede an
|
||||||
|
ASCII number being read, and a minus sign will be generated if necessary
|
||||||
|
for a number being generated. When converting a string that's in the edit
|
||||||
|
buffer, the character pointer is left at the end of the string in the buffer.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "chmacs.h" /* define character processing macros */
|
||||||
|
DEFAULT ExeBSl() /* execute a \ (backslash) command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeBSl",NULL);
|
||||||
|
/*
|
||||||
|
* Handle the case where there's no numeric argument: convert the digit
|
||||||
|
* string in the edit buffer into a binary value and push it onto the
|
||||||
|
* expression stack.
|
||||||
|
*/
|
||||||
|
if ((EStTop == EStBot) || /* if no numeric arg or */
|
||||||
|
(EStack[EStTop].ElType != OPERAND)) { /* partial expression */
|
||||||
|
LONG StrVal = 0;
|
||||||
|
RefLen=0;
|
||||||
|
if (GapEnd != EBfEnd) { /* if not at end of buffer */
|
||||||
|
BOOLEAN negative = FALSE;
|
||||||
|
char NxtChr;
|
||||||
|
if (*(GapEnd+1) == '-') { /* minus sign? */
|
||||||
|
RefLen--;
|
||||||
|
GapEnd++; /* move forward... */
|
||||||
|
*GapBeg++ = *GapEnd; /* ... one character */
|
||||||
|
negative = TRUE;
|
||||||
|
} else if (*(GapEnd+1) == '+') { /* plus sign? */
|
||||||
|
RefLen--;
|
||||||
|
GapEnd++; /* move forward... */
|
||||||
|
*GapBeg++ = *GapEnd; /* ... one character */
|
||||||
|
}
|
||||||
|
while ((GapEnd != EBfEnd) && (IsRadx(*(GapEnd+1)))) {
|
||||||
|
RefLen--;
|
||||||
|
GapEnd++; /* move forward... */
|
||||||
|
*GapBeg++ = *GapEnd; /* ... one character */
|
||||||
|
NxtChr = *GapEnd;
|
||||||
|
if (Is_Digit(NxtChr))
|
||||||
|
NxtChr -= '0';
|
||||||
|
else if (Is_Upper(NxtChr))
|
||||||
|
NxtChr -= '\67';
|
||||||
|
else
|
||||||
|
NxtChr -= '\127';
|
||||||
|
StrVal = (StrVal * Radix) + NxtChr;
|
||||||
|
}
|
||||||
|
if (negative)
|
||||||
|
StrVal = -StrVal;
|
||||||
|
}
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
#if DEBUGGING
|
||||||
|
sprintf(DbgSBf,"PushEx(%ld)", StrVal);
|
||||||
|
DbgFEx(1,DbgFNm,DbgSBf);
|
||||||
|
#endif
|
||||||
|
return PushEx(StrVal,OPERAND);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* If we made it to here, then there is a numeric argument
|
||||||
|
*/
|
||||||
|
if (GetNmA() == FAILURE) { /* get numeric argument */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
MakDBf(NArgmt, Radix); /* convert it to ASCII */
|
||||||
|
if (InsStr(DBfBeg, DBfPtr-DBfBeg) == FAILURE) {
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
EStTop = EStBot; /* clear expression stack */
|
||||||
|
DBGFEX(1,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeC()
|
||||||
|
This function executes a C command.
|
||||||
|
nC Advance n characters
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
DEFAULT ExeC() /* execute a C command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeC",NULL);
|
||||||
|
if (EStTop == EStBot) { /* if no numeric argument */
|
||||||
|
NArgmt = 1; /* default is 1C */
|
||||||
|
} else {
|
||||||
|
UMinus(); /* if it's -C, make it -1C */
|
||||||
|
if (GetNmA() == FAILURE) {
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DBGFEX(1,DbgFNm,"DoCJR");
|
||||||
|
return DoCJR(NArgmt);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCCC()
|
||||||
|
This function executes a ^^ (control-caret or caret-caret) command.
|
||||||
|
^^x Equivilent to the ASCII value of x
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "deferr.h" /* define identifiers for error messages */
|
||||||
|
DEFAULT ExeCCC() /* execute a control-^ command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeCCC",NULL);
|
||||||
|
if (IncCBP() == FAILURE) {
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
DBGFEX(1,DbgFNm,"PushEx()");
|
||||||
|
return PushEx((LONG)*CBfPtr, OPERAND);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCln()
|
||||||
|
This function handles the colon and double-colon modifiers.
|
||||||
|
This function implements the modifiers by setting bits in the
|
||||||
|
CmdMod variable. Commands which are sensitive to colon or double colon
|
||||||
|
modification check CmdMod explicitly.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
DEFAULT ExeCln() /* execute : or :: modifiers */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeCln",NULL);
|
||||||
|
if (CmdMod & COLON) { /* if colon bit is set */
|
||||||
|
CmdMod &= ~COLON; /* clear colon bit */
|
||||||
|
CmdMod |= DCOLON; /* set double-colon bit */
|
||||||
|
} else {
|
||||||
|
CmdMod |= COLON; /* set colon bit */
|
||||||
|
}
|
||||||
|
DBGFEX(1,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCom()
|
||||||
|
This function executes a , (comma argument separator) command.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "deferr.h" /* define identifiers for error messages */
|
||||||
|
DEFAULT ExeCom() /* execute a , (comma) command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeCom",NULL);
|
||||||
|
if (EStTop == EStBot) { /* if no numeric argument */
|
||||||
|
ErrMsg(ERR_NAC); /* no arg before , */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (GetNmA() == FAILURE) {
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
MArgmt = NArgmt;
|
||||||
|
CmdMod |= MARGIS;
|
||||||
|
DBGFEX(1,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCrt()
|
||||||
|
This function "executes" a ^ (caret) command. Most TECO commands
|
||||||
|
which are control characters (^A, ^B, etc) can also be entered as a caret
|
||||||
|
and letter combination. For example, control-A can also be entered as
|
||||||
|
caret-A.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "chmacs.h" /* define character processing macros */
|
||||||
|
#include "deferr.h" /* define identifiers for error messages */
|
||||||
|
DEFAULT ExeCrt() /* execute a ^ (caret) command */
|
||||||
|
{
|
||||||
|
unsigned char TmpChr;
|
||||||
|
static DEFAULT (*FCAray[])(VVOID) = {
|
||||||
|
/* ^A*/ ExeCtA, /* ^B*/ ZExCtB, /* ^C*/ ExeCtC,
|
||||||
|
/* ^D*/ ExeCtD, /* ^E*/ ExeCtE, /* ^F*/ ExeNYI,
|
||||||
|
/* ^G*/ ExeIll, /* ^H*/ ZExCtH, /*TAB*/ ExeCtI,
|
||||||
|
/* LF*/ ExeNul, /* VT*/ ExeIll, /* FF*/ ExeCtL,
|
||||||
|
/* CR*/ ExeNul, /* ^N*/ ExeCtN, /* ^O*/ ExeCtO,
|
||||||
|
/* ^P*/ ExeCtP, /* ^Q*/ ExeCtQ, /* ^R*/ ExeCtR,
|
||||||
|
/* ^S*/ ExeCtS, /* ^T*/ ExeCtT, /* ^U*/ ExeCtU,
|
||||||
|
/* ^V*/ ExeCtV, /* ^W*/ ExeCtW, /* ^X*/ ExeCtX,
|
||||||
|
/* ^Y*/ ExeCtY, /* ^Z*/ ExeCtZ, /* ^[*/ ExeEsc,
|
||||||
|
/* ^\*/ ExeIll, /* ^]*/ ExeIll, /* ^^*/ ExeCCC,
|
||||||
|
/* ^_*/ ExeUsc
|
||||||
|
};
|
||||||
|
if (IncCBP() == FAILURE) {
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
TmpChr = To_Upper(*CBfPtr);
|
||||||
|
if ((TmpChr < 'A') || (TmpChr > '_')) {
|
||||||
|
ErrChr(ERR_IUC, *CBfPtr);
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
return (*FCAray[TmpChr-'A'])();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,113 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCSt()
|
||||||
|
This function executes a TECO command string. The string is pointed
|
||||||
|
to by CBfPtr. The last character in the string is pointed to by CStEnd.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "deferr.h" /* define identifiers for error messages */
|
||||||
|
DEFAULT ExeCSt() /* execute command string */
|
||||||
|
{
|
||||||
|
DEFAULT status;
|
||||||
|
static DEFAULT (*FArray[])(VVOID) = {
|
||||||
|
/*NUL*/ ExeNul, /* ^A*/ ExeCtA, /* ^B*/ ZExCtB, /* ^C*/ ExeCtC,
|
||||||
|
/* ^D*/ ExeCtD, /* ^E*/ ExeCtE, /* ^F*/ ExeNYI, /* ^G*/ ExeIll,
|
||||||
|
/* ^H*/ ZExCtH, /* ^I*/ ExeCtI, /* LF*/ ExeNul, /* VT*/ ExeIll,
|
||||||
|
/* ^L*/ ExeCtL, /* CR*/ ExeNul, /* ^N*/ ExeCtN, /* ^O*/ ExeCtO,
|
||||||
|
/* ^P*/ ExeCtP, /* ^Q*/ ExeCtQ, /* ^R*/ ExeCtR, /* ^S*/ ExeCtS,
|
||||||
|
/* ^T*/ ExeCtT, /* ^U*/ ExeCtU, /* ^V*/ ExeCtV, /* ^W*/ ExeCtW,
|
||||||
|
/* ^X*/ ExeCtX, /* ^Y*/ ExeCtY, /* ^Z*/ ExeCtZ, /*ESC*/ ExeEsc,
|
||||||
|
/* ^\*/ ExeIll, /* ^]*/ ExeIll, /* ^^*/ ExeCCC, /* ^_*/ ExeUsc,
|
||||||
|
/* SP*/ ExeNul, /* ! */ ExeExc, /* " */ ExeDQu, /* # */ ExeOpr,
|
||||||
|
/* $ */ ExeEsc, /* % */ ExePrc, /* & */ ExeOpr, /* ' */ ExeNul,
|
||||||
|
/* ( */ ExeOpr, /* ) */ ExeRtP, /* * */ ExeOpr, /* + */ ExeOpr,
|
||||||
|
/* , */ ExeCom, /* - */ ExeOpr, /* . */ ExeDot, /* / */ ExeOpr,
|
||||||
|
/* 0 */ ExeDgt, /* 1 */ ExeDgt, /* 2 */ ExeDgt, /* 3 */ ExeDgt,
|
||||||
|
/* 4 */ ExeDgt, /* 5 */ ExeDgt, /* 6 */ ExeDgt, /* 7 */ ExeDgt,
|
||||||
|
/* 8 */ ExeDgt, /* 9 */ ExeDgt, /* : */ ExeCln, /* ; */ ExeSCl,
|
||||||
|
/* < */ ExeLst, /* = */ ExeEqu, /* > */ ExeGtr, /* ? */ ExeQes,
|
||||||
|
/* @ */ ExeAtS, /* A */ ExeA, /* B */ ExeB, /* C */ ExeC,
|
||||||
|
/* D */ ExeD, /* E */ ExeE, /* F */ ExeF, /* G */ ExeG,
|
||||||
|
/* H */ ExeH, /* I */ ExeI, /* J */ ExeJ, /* K */ ExeK,
|
||||||
|
/* L */ ExeL, /* M */ ExeM, /* N */ ExeN, /* O */ ExeO,
|
||||||
|
/* P */ ExeP, /* Q */ ExeQ, /* R */ ExeR, /* S */ ExeS,
|
||||||
|
/* T */ ExeT, /* U */ ExeU, /* V */ ExeV, /* W */ ExeW,
|
||||||
|
/* X */ ExeX, /* Y */ ExeY, /* Z */ ExeZ, /* [ */ ExeLBr,
|
||||||
|
/* \ */ ExeBSl, /* ] */ ExeRBr, /* ^ */ ExeCrt, /* _ */ ExeUnd,
|
||||||
|
/* ` */ ExeIll, /* a */ ExeA, /* b */ ExeB, /* c */ ExeC,
|
||||||
|
/* d */ ExeD, /* e */ ExeE, /* f */ ExeF, /* g */ ExeG,
|
||||||
|
/* h */ ExeH, /* i */ ExeI, /* j */ ExeJ, /* k */ ExeK,
|
||||||
|
/* l */ ExeL, /* m */ ExeM, /* n */ ExeN, /* o */ ExeO,
|
||||||
|
/* p */ ExeP, /* q */ ExeQ, /* r */ ExeR, /* s */ ExeS,
|
||||||
|
/* t */ ExeT, /* u */ ExeU, /* v */ ExeV, /* w */ ExeW,
|
||||||
|
/* x */ ExeX, /* y */ ExeY, /* z */ ExeZ, /* { */ ExeIll,
|
||||||
|
/* | */ ExeBar, /* } */ ExeIll, /* ~ */ ExeIll, /*DEL*/ ExeIll,
|
||||||
|
/*129*/ ExeIll, /*130*/ ExeIll, /*131*/ ExeIll, /*132*/ ExeIll,
|
||||||
|
/*133*/ ExeIll, /*134*/ ExeIll, /*135*/ ExeIll, /*136*/ ExeIll,
|
||||||
|
/*137*/ ExeIll, /*138*/ ExeIll, /*139*/ ExeIll, /*140*/ ExeIll,
|
||||||
|
/*141*/ ExeIll, /*142*/ ExeIll, /*143*/ ExeIll, /*144*/ ExeIll,
|
||||||
|
/*145*/ ExeIll, /*146*/ ExeIll, /*147*/ ExeIll, /*148*/ ExeIll,
|
||||||
|
/*149*/ ExeIll, /*150*/ ExeIll, /*151*/ ExeIll, /*152*/ ExeIll,
|
||||||
|
/*153*/ ExeIll, /*154*/ ExeIll, /*155*/ ExeIll, /*156*/ ExeIll,
|
||||||
|
/*157*/ ExeIll, /*158*/ ExeIll, /*159*/ ExeIll, /*160*/ ExeIll,
|
||||||
|
/*161*/ ExeIll, /*162*/ ExeIll, /*163*/ ExeIll, /*164*/ ExeIll,
|
||||||
|
/*165*/ ExeIll, /*166*/ ExeIll, /*167*/ ExeIll, /*168*/ ExeIll,
|
||||||
|
/*169*/ ExeIll, /*170*/ ExeIll, /*171*/ ExeIll, /*172*/ ExeIll,
|
||||||
|
/*173*/ ExeIll, /*174*/ ExeIll, /*175*/ ExeIll, /*176*/ ExeIll,
|
||||||
|
/*177*/ ExeIll, /*178*/ ExeIll, /*179*/ ExeIll, /*180*/ ExeIll,
|
||||||
|
/*181*/ ExeIll, /*182*/ ExeIll, /*183*/ ExeIll, /*184*/ ExeIll,
|
||||||
|
/*185*/ ExeIll, /*186*/ ExeIll, /*187*/ ExeIll, /*188*/ ExeIll,
|
||||||
|
/*189*/ ExeIll, /*190*/ ExeIll, /*191*/ ExeIll, /*192*/ ExeIll,
|
||||||
|
/*193*/ ExeIll, /*194*/ ExeIll, /*195*/ ExeIll, /*196*/ ExeIll,
|
||||||
|
/*197*/ ExeIll, /*198*/ ExeIll, /*199*/ ExeIll, /*200*/ ExeIll,
|
||||||
|
/*201*/ ExeIll, /*202*/ ExeIll, /*203*/ ExeIll, /*204*/ ExeIll,
|
||||||
|
/*205*/ ExeIll, /*206*/ ExeIll, /*207*/ ExeIll, /*208*/ ExeIll,
|
||||||
|
/*209*/ ExeIll, /*210*/ ExeIll, /*211*/ ExeIll, /*212*/ ExeIll,
|
||||||
|
/*213*/ ExeIll, /*214*/ ExeIll, /*215*/ ExeIll, /*216*/ ExeIll,
|
||||||
|
/*217*/ ExeIll, /*218*/ ExeIll, /*219*/ ExeIll, /*220*/ ExeIll,
|
||||||
|
/*221*/ ExeIll, /*222*/ ExeIll, /*223*/ ExeIll, /*224*/ ExeIll,
|
||||||
|
/*225*/ ExeIll, /*226*/ ExeIll, /*227*/ ExeIll, /*228*/ ExeIll,
|
||||||
|
/*229*/ ExeIll, /*230*/ ExeIll, /*231*/ ExeIll, /*232*/ ExeIll,
|
||||||
|
/*233*/ ExeIll, /*234*/ ExeIll, /*235*/ ExeIll, /*236*/ ExeIll,
|
||||||
|
/*237*/ ExeIll, /*238*/ ExeIll, /*239*/ ExeIll, /*240*/ ExeIll,
|
||||||
|
/*241*/ ExeIll, /*242*/ ExeIll, /*243*/ ExeIll, /*244*/ ExeIll,
|
||||||
|
/*245*/ ExeIll, /*246*/ ExeIll, /*247*/ ExeIll, /*248*/ ExeIll,
|
||||||
|
/*249*/ ExeIll, /*250*/ ExeIll, /*251*/ ExeIll, /*252*/ ExeIll,
|
||||||
|
/*253*/ ExeIll, /*254*/ ExeIll, /*255*/ ExeIll, /*256*/ ExeIll
|
||||||
|
};
|
||||||
|
DBGFEN(4,"ExeCSt",NULL);
|
||||||
|
while (CBfPtr <= CStEnd) { /* while more commands */
|
||||||
|
if (TraceM) { /* if trace mode is on */
|
||||||
|
EchoIt(*CBfPtr); /* display the command */
|
||||||
|
}
|
||||||
|
status = (*FArray[*CBfPtr])(); /* execute command */
|
||||||
|
#if CONSISTENCY_CHECKING
|
||||||
|
check_consistency();
|
||||||
|
#endif
|
||||||
|
#if CHECKSUM_CODE
|
||||||
|
check_code_checksums ();
|
||||||
|
#endif
|
||||||
|
ZCHKKB(); /* kludge for MS-DOS only */
|
||||||
|
if (GotCtC) { /* if got a control-C */
|
||||||
|
GotCtC = FALSE;
|
||||||
|
ErrMsg(ERR_XAB); /* XAB = execution aborted */
|
||||||
|
DBGFEX(4,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
if (status == FAILURE) { /* did command fail? */
|
||||||
|
if (EtFlag & ET_MUNG_MODE) { /* if in mung mode */
|
||||||
|
TAbort(EXIT_FAILURE); /* ... terminate */
|
||||||
|
} else {
|
||||||
|
DBGFEX(4,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CBfPtr++; /* move to next command */
|
||||||
|
}
|
||||||
|
if (LStTop != LStBot) { /* if unclosed loop */
|
||||||
|
ErrUTC(); /* unterminated command */
|
||||||
|
}
|
||||||
|
DBGFEX(4,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtA()
|
||||||
|
This function executes a ^A (control-A or caret-A) command.
|
||||||
|
^Atext^A Types "text" on the terminal. The closing
|
||||||
|
character must be a control-A.
|
||||||
|
@^A/text/ Equivilent to ^A except text can be bracketed
|
||||||
|
with any character, avoids need for second ^A.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "dchars.h" /* define identifiers for characters */
|
||||||
|
DEFAULT ExeCtA() /* execute a ^A (control-A) command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeCtA",NULL);
|
||||||
|
if (FindES(CTRL_A) == FAILURE) { /* find end of string */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE, FindES() failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
TypBuf(ArgPtr, CBfPtr);
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
EStTop = EStBot; /* clear expression stack */
|
||||||
|
DBGFEX(1,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtC()
|
||||||
|
This function executes a control-C command.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "dchars.h" /* define identifiers for characters */
|
||||||
|
DEFAULT ExeCtC() /* execute an control-C command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeCtC",NULL);
|
||||||
|
if ((CBfPtr < CStEnd) && (*(CBfPtr+1) == CTRL_C)) { /* if it's ^C^C */
|
||||||
|
TAbort(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
EStTop = EStBot; /* clear expression stack */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtD()
|
||||||
|
This function executes a ^D (control-D or caret-D) command. This
|
||||||
|
command sets the radix to decimal.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
DEFAULT ExeCtD() /* execute a ^D (control-D) command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeCtD",NULL);
|
||||||
|
Radix = 10;
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
DBGFEX(1,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtE()
|
||||||
|
This function executes a ^E (control-E or caret-E) command, which
|
||||||
|
returns the value of the form feed flag. The form feed flag is -1 if the
|
||||||
|
last read operation was terminated because a form feed was encountered. It
|
||||||
|
is 0 otherwise. If the ^E command is preceded by a numeric argument, then
|
||||||
|
the command sets the value of the form feed flag. The form feed flag is
|
||||||
|
used by the output code to indicate whether a form feed should be appended
|
||||||
|
when the edit buffer is written to the output file.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
DEFAULT ExeCtE() /* execute a ^E (control-E) command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeCtE",NULL);
|
||||||
|
if (EStTop > EStBot) { /* if numeric argument */
|
||||||
|
if (GetNmA() == FAILURE) { /* get numeric arg */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
FFPage = (NArgmt == -1) ? -1 : 0;
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
DBGFEX(1,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
DBGFEX(1,DbgFNm,"PushEx(FFPage)");
|
||||||
|
return PushEx(FFPage, OPERAND);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtI()
|
||||||
|
This function executes a ^I (control-I or caret-I) command. This
|
||||||
|
is equivilent to the I command, except the <TAB> is inserted as well.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "dchars.h" /* define identifiers for characters */
|
||||||
|
DEFAULT ExeCtI() /* execute control-I (tab) command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeCtI",NULL);
|
||||||
|
if (FindES(ESCAPE) == FAILURE) { /* find end of text arg */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (InsStr(ArgPtr-1, (CBfPtr-ArgPtr)+1) == FAILURE) {
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
EStTop = EStBot; /* clear expression stack */
|
||||||
|
DBGFEX(1,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtL()
|
||||||
|
This function executes a ^L (control-L or caret-L) command.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "dchars.h" /* define identifiers for characters */
|
||||||
|
DEFAULT ExeCtL() /* execute an ^L (control-L) command */
|
||||||
|
{
|
||||||
|
ZDspCh(FORMFD);
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtN()
|
||||||
|
This function executes a ^N (control-N or caret-N) command.
|
||||||
|
^N <CTRL/N> (caret/N) is the end of file flag. It is
|
||||||
|
equivalent to -1 if the file open on the currently
|
||||||
|
selected input stream is at end of file, and zero
|
||||||
|
otherwise.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
DEFAULT ExeCtN() /* execute a ^N (control-N) command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeCtN",NULL);
|
||||||
|
DBGFEX(1,DbgFNm,"PushEx()");
|
||||||
|
return PushEx((IsEofI[CurInp] ? -1L : 0L), OPERAND);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtO()
|
||||||
|
This function executes a ^O (control-O or caret-O) command. This
|
||||||
|
command sets the radix to octal.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
DEFAULT ExeCtO() /* execute a ^O (control-O) command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeCtO",NULL);
|
||||||
|
Radix = 8; /* set radix to octal */
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
DBGFEX(1,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtP()
|
||||||
|
This function executes a ^P (control-P or caret-P) command. ^P
|
||||||
|
is not a TECO command and is used to set TECO-C debugging parameters. For
|
||||||
|
more information on the debugging routines, see the DEBUGGING lines in
|
||||||
|
Tecoc.c.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
DEFAULT ExeCtP() /* execute a ^P (control-P) command */
|
||||||
|
{
|
||||||
|
#if DEBUGGING
|
||||||
|
if (DbgDsp() == FAILURE) {
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
EStTop = EStBot; /* clear expression stack */
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
return SUCCESS;
|
||||||
|
#else
|
||||||
|
return (ExeIll ()); /* Illegal command */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtQ()
|
||||||
|
This function executes a ^Q (control-Q or caret-Q) command.
|
||||||
|
n^Q returns number of characters between the buffer pointer
|
||||||
|
and the nth line separator (n^QC == nL).
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
DEFAULT ExeCtQ() /* execute a ^Q (control-Q) command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeCtQ",NULL);
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
if (EStTop == EStBot) { /* if no numeric argument */
|
||||||
|
DBGFEX(1,DbgFNm,"PushEx(0)");
|
||||||
|
return PushEx(0L, OPERAND);
|
||||||
|
}
|
||||||
|
if (GetNmA() == FAILURE) { /* get numeric argument */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
DBGFEX(1,DbgFNm,"PushEx()");
|
||||||
|
return PushEx(Ln2Chr(NArgmt), OPERAND);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtR()
|
||||||
|
This function executes a ^R (control-R or caret-R) command. The
|
||||||
|
control-R command sets TECO's radix, which controls how ASCII strings are
|
||||||
|
converted to/from their binary representations. The current radix is used
|
||||||
|
by the backslash command and whenever TECO encounters a string of digits in
|
||||||
|
a command string.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "deferr.h" /* define identifiers for error messages */
|
||||||
|
DEFAULT ExeCtR() /* execute a ^R (control-R) command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeCtR",NULL);
|
||||||
|
if ((EStTop == EStBot) || /* if no numeric arg or */
|
||||||
|
(EStack[EStTop].ElType != OPERAND)) { /* partial expression */
|
||||||
|
DBGFEX(1,DbgFNm,"PushEx");
|
||||||
|
return PushEx((LONG)Radix, OPERAND);
|
||||||
|
}
|
||||||
|
if (GetNmA() == FAILURE) {
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE, GetNmA() failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if ((NArgmt != 8) && (NArgmt != 10) && (NArgmt != 16)) {
|
||||||
|
ErrMsg(ERR_IRA); /* illegal radix with ^R */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE, illegal radix");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
Radix = (DEFAULT)NArgmt;
|
||||||
|
DBGFEX(1,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtS()
|
||||||
|
This function executes a ^S (control-S or caret-S) command. This
|
||||||
|
is equivilent to the negative of the last referenced string (last insert,
|
||||||
|
string found, or string inserted with "G" command).
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
DEFAULT ExeCtS() /* execute a ^S (control-S) command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeCtS",NULL);
|
||||||
|
DBGFEX(1,DbgFNm,"PushEx(RefLen)");
|
||||||
|
return PushEx(RefLen, OPERAND);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtT()
|
||||||
|
This function executes a ^T (control-T or caret-T) command.
|
||||||
|
^T ASCII value of next char typed
|
||||||
|
n^T Types out character for ASCII code n.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "deferr.h" /* define identifiers for error messages */
|
||||||
|
DEFAULT ExeCtT() /* execute a ^T (control-T) command */
|
||||||
|
{
|
||||||
|
DEFAULT lchar;
|
||||||
|
DBGFEN(1,"ExeCtT",NULL);
|
||||||
|
if ((EStTop == EStBot) || /* if no numeric arg or */
|
||||||
|
(EStack[EStTop].ElType != OPERAND)) { /* partial expression */
|
||||||
|
lchar = ZChIn(EtFlag & ET_NO_WAIT); /* read a character */
|
||||||
|
if (GotCtC) { /* if got a control-C */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (((EtFlag & ET_NO_ECHO) == 0) && (lchar != -1)) {
|
||||||
|
EchoIt((unsigned char)lchar);
|
||||||
|
}
|
||||||
|
DBGFEX(1,DbgFNm,"PushEx()");
|
||||||
|
return PushEx((LONG)lchar, OPERAND);
|
||||||
|
}
|
||||||
|
if (GetNmA() == FAILURE) { /* get numeric arg */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE, GetNmA() failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if ((CmdMod & COLON) || (EtFlag & ET_IMAGE_MODE)) {
|
||||||
|
ZDspCh((char)NArgmt);
|
||||||
|
} else {
|
||||||
|
EchoIt((unsigned char)NArgmt);
|
||||||
|
}
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
DBGFEX(1,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,136 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtU()
|
||||||
|
This function executes a ^U (control-U or caret-U) command.
|
||||||
|
^Uqstring`
|
||||||
|
This command inserts character string "string" into the text
|
||||||
|
storage area of Q-register q. When entering a command string
|
||||||
|
from the terminal, you must specify ^U using the caret/U
|
||||||
|
format, since the <CTRL/U> character is the line erase
|
||||||
|
immediate action command.
|
||||||
|
:^Uqstring`
|
||||||
|
This command appends character string "string" to the text
|
||||||
|
storage area of Q-register "q".
|
||||||
|
n^Uq' This form of the ^Uq` command inserts the single character
|
||||||
|
whose ASCII code is n into the text storage area of
|
||||||
|
Q-register "q". (n is taken modulo 256 in TECO-11, modulo
|
||||||
|
128 in other TECOs.)
|
||||||
|
n:^Uq` This form of the :^Uq` command appends the single character
|
||||||
|
whose ASCII code is n to the text storage area of Q-register
|
||||||
|
"q". (n is taken modulo 256 in TECO-11, modulo 128 in other
|
||||||
|
TECOs.) [not in TECO-8]
|
||||||
|
@^Uq/string/
|
||||||
|
@:^Uq/string/
|
||||||
|
n@^Uq//
|
||||||
|
n@:^Uq//
|
||||||
|
Equivalent, respectively, to the ^Uqstring`, :^Uqstring`,
|
||||||
|
n^Uq`, and n:^Uq` commands, except that alternate delimiters
|
||||||
|
are used and no <DELIM> characters are necessary.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "deferr.h" /* define identifiers for error messages */
|
||||||
|
#include "dchars.h" /* define identifiers for characters */
|
||||||
|
DEFAULT ExeCtU() /* execute a ^U (control-U) command */
|
||||||
|
{
|
||||||
|
ptrdiff_t TmpSiz;
|
||||||
|
DBGFEN(1,"ExeCtU",NULL);
|
||||||
|
/*
|
||||||
|
* increment CBfPtr past ^U
|
||||||
|
*/
|
||||||
|
if (IncCBP() == FAILURE) {
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE, IncCBP() failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* try to find Q-register name after ^U
|
||||||
|
*/
|
||||||
|
if (FindQR() == FAILURE) {
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE, FindQR() failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* If there is a colon modifier, we are appending to the Q-register text.
|
||||||
|
* If there isn't a colon modifier, we are replacing the text currently
|
||||||
|
* in the Q-register. If there is any text currently in the Q-register,
|
||||||
|
* we have to zap it first.
|
||||||
|
*/
|
||||||
|
if (!(CmdMod & COLON)) { /* if no colon modifier */
|
||||||
|
if (QR->Start != NULL) { /* if not empty */
|
||||||
|
ZFree((voidptr)QR->Start); /* free the memory */
|
||||||
|
QR->Start = QR->End_P1 = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* If there is a numeric argument n, we are dealing with a character to
|
||||||
|
* place into or append to the Q-register.
|
||||||
|
*/
|
||||||
|
if (EStTop > EStBot) { /* if numeric argument */
|
||||||
|
if (GetNmA() == FAILURE) { /* get numeric argument */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE, GetNmA() failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (CmdMod & ATSIGN) { /* it's @^U// */
|
||||||
|
/*
|
||||||
|
* increment CBfPtr to 1st delimiter
|
||||||
|
*/
|
||||||
|
if (IncCBP() == FAILURE) {
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE, IncCBP() failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* increment CBfPtr to 2nd delimiter
|
||||||
|
*/
|
||||||
|
if (IncCBP() == FAILURE) {
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE, IncCBP() failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* the two delimiters should be the same
|
||||||
|
*/
|
||||||
|
if (*CBfPtr != *(CBfPtr-1)) {
|
||||||
|
ErrMsg(ERR_IIA);
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE, ERR_IIA");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Increase the size of the text area by 1 character
|
||||||
|
*/
|
||||||
|
if (MakRom((SIZE_T) 1) == FAILURE) {
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE, MakRom() failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Append the character to the Q-register
|
||||||
|
*/
|
||||||
|
*(QR->End_P1) = (char) NArgmt;
|
||||||
|
QR->End_P1++;
|
||||||
|
} else { /* else no numeric argument */
|
||||||
|
/*
|
||||||
|
* We must be dealing with a string, find the end of the string.
|
||||||
|
*/
|
||||||
|
if (FindES(ESCAPE) == FAILURE) {
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE, FindES() failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
TmpSiz = CBfPtr - ArgPtr;
|
||||||
|
if (TmpSiz > 0) {
|
||||||
|
/*
|
||||||
|
* make room for the string
|
||||||
|
*/
|
||||||
|
if (MakRom((SIZE_T)TmpSiz) == FAILURE) {
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE, MakRom() failed");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Append the string to the Q-register text
|
||||||
|
*/
|
||||||
|
MEMMOVE(QR->End_P1, ArgPtr, (SIZE_T)TmpSiz);
|
||||||
|
QR->End_P1 += TmpSiz;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
DBGFEX(1,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtV()
|
||||||
|
This function executes a ^V (control-V or caret-V) command.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "deferr.h" /* define identifiers for error messages */
|
||||||
|
DEFAULT ExeCtV() /* execute a ^V (control-V) command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeCtV",NULL);
|
||||||
|
if (EStTop == EStBot) { /* if no numeric argument */
|
||||||
|
IniSrM = LOWER;
|
||||||
|
} else {
|
||||||
|
if (GetNmA() == FAILURE) { /* get numeric argument */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (NArgmt) { /* if it wasn't 0^V */
|
||||||
|
ErrMsg(ERR_ARG); /* improper arguments */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
IniSrM = NONE;
|
||||||
|
}
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
DBGFEX(1,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtW()
|
||||||
|
This function executes a control-W command.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
#include "deferr.h" /* define identifiers for error messages */
|
||||||
|
DEFAULT ExeCtW() /* execute a ^W (control-W) command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeCtW",NULL);
|
||||||
|
if (EStTop == EStBot) { /* if no numeric argument */
|
||||||
|
IniSrM = UPPER;
|
||||||
|
} else {
|
||||||
|
if (GetNmA() == FAILURE) { /* get numeric argument */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
if (NArgmt) { /* if it wasn't 0^W */
|
||||||
|
ErrMsg(ERR_ARG); /* improper arguments */
|
||||||
|
DBGFEX(1,DbgFNm,"FAILURE");
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
IniSrM = NONE;
|
||||||
|
}
|
||||||
|
CmdMod = '\0'; /* clear modifiers flags */
|
||||||
|
DBGFEX(1,DbgFNm,"SUCCESS");
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtX()
|
||||||
|
This function executes a control-X command.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
DEFAULT ExeCtX() /* execute a ^X (control-X) command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeCtX",NULL);
|
||||||
|
DBGFEX(1,DbgFNm,"DoFlag()");
|
||||||
|
return DoFlag(&SMFlag);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtY()
|
||||||
|
This function executes a control-Y command.
|
||||||
|
^Y <CTRL/Y> (caret/Y) is equivalent to ".+^S,.", the n,m
|
||||||
|
numeric argument spanning the text just searched for or
|
||||||
|
inserted. This value may be used to recover from
|
||||||
|
inserting a string in the wrong place. Type "^YXSFR`"
|
||||||
|
to store the string in Q-register S and remove it from
|
||||||
|
the buffer. You can then position the pointer to the
|
||||||
|
right place and type "GS" to insert the string.
|
||||||
|
[TECO-11 only]
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
DEFAULT ExeCtY() /* execute ^Y command */
|
||||||
|
{
|
||||||
|
DBGFEN(1,"ExeCtY",NULL);
|
||||||
|
MArgmt = (GapBeg-EBfBeg) + RefLen; /* set m part of m,n pair */
|
||||||
|
CmdMod |= MARGIS; /* say that m part exists */
|
||||||
|
DBGFEX(1,DbgFNm,"PushEx()");
|
||||||
|
return PushEx((LONG)(GapBeg-EBfBeg), OPERAND); /* push n part */
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
ExeCtZ()
|
||||||
|
This function executes a control-Z command.
|
||||||
|
^Z <CTRL/Z> (caret/Z) is equivalent to the total space
|
||||||
|
occupied by text in the Q-registers (including the
|
||||||
|
command line currently being executed).
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "zport.h" /* define portability identifiers */
|
||||||
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
#include "defext.h" /* define external global variables */
|
||||||
|
DEFAULT ExeCtZ() /* execute a ^Z (control-Z) command */
|
||||||
|
{
|
||||||
|
LONG TmpLng;
|
||||||
|
WORD TmpWrd;
|
||||||
|
DBGFEN(1,"ExeCtZ",NULL);
|
||||||
|
TmpLng = (CStEnd - CStBeg) + 1;
|
||||||
|
for (TmpWrd = 0; TmpWrd < 36; ++TmpWrd) {
|
||||||
|
TmpLng += QRgstr[TmpWrd].End_P1 - QRgstr[TmpWrd].Start;
|
||||||
|
}
|
||||||
|
#if DEBUGGING
|
||||||
|
sprintf(DbgSBf,"PushEx(%ld)", TmpLng);
|
||||||
|
DbgFEx(1,DbgFNm,DbgSBf);
|
||||||
|
#endif
|
||||||
|
return PushEx(TmpLng,OPERAND);
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue