Restore video mode for Linux & Mac

Various other bug and speed improvements
Documentation enhancements
main
Blake McBride 2015-05-30 13:42:07 -05:00
parent 0e17d45276
commit 2e7ac11277
12 changed files with 5353 additions and 70 deletions

996
doc/changes.txt 100644
View File

@ -0,0 +1,996 @@
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.

292
doc/problems.txt 100644
View File

@ -0,0 +1,292 @@
This file contains informal notes about TECO-C. It includes bugs
and ideas for improvements.
[Unfortunately, it isn't as up to date as possible, some problems
in here are fixed, some aren't strictly "problems"...Manfred]
. Mark made ~ and F~ commands which aren't documented.
. Mark aded Curses support, which works for split screen scrolling but
doesn't support vtedit. It also needs to completely enter or leave
split screen mode when the 7:W command is executed, because I/O is
lousy to the screen if curses is active, even when all it should do
is simple output to the screen.
. n,m:w commands should return a value, but don't
. Steve Freyder's bug: <-^N-1;a> on a large file loops infinitely under
MS-DOS and/or Unix?
. if you set eightbit (4096,0et) with TECOC and exit, it stays set. If you
do it with TECO32, it doesn't. Why? Changing the screen height/width
works as expected. (VMS)
. do a 0,1:w to TECO32, it just returns. Do it to TECOC, it dies with
bad parameter value. TECOC should be the same.
. I do a getdvi on the output channel and then do a sensemode in
open_output_terminal. They're redundant. The sensemode should be it.
. EW causes a backup file to be created.
Problems reported by Richard Graham:
. EI$ doesn't seem to work. EIfilename$ does. (unsure about this)
. :]p= returns -1 10 times, then 0 if executed when TECO first starts
up on a PC.
. Try ":stext$ .ue :s$" and get ISA error, and then (on PC) the ?
command doesn't work. Generalized problem: TECO-C doesn't
"overwrite" a numeric value that's on the stack with a new one.
. How to search for a control-E? ED flag # 1, ^Eq and ^Eu don't
seem to let Richard do it. He says TECO-11 will take FS^E$^E$.
Problems running under Unix:
. ^C doesn't work.
. look at "man 3 time" and "man localtime" to implement date/time
. Is there a way to sensibly set ET_EIGHTBIT under Unix?
. ZUNIX.C's ZChIn doesn't handle the NoWait argument
Problems running on PC:
1. editing .EXE files doesn't work. should it?
2. ZChIn doesn't handle PC-extended characters from the keyboard
3. After the work to make ^C's work better, doing a ^C in the
middle of a macro like detab.tec now works; but, ".=" displays
0. shouldn't . be in the middle of the file wherever the
^C happened?
There's a test case in TSTQR.TEC that causes TECO-11 to give the
UTC error. TECOC does too, but from then on it's screwed up. Why?
To support eight-bit characters, there are several places where casts
to "unsigned char" are used. The better solution is to go through the
code and declare everything to be unsigned char, then delete the
casts. Some of the casts are in CHMACS.H.
If you search for a string using a match control construct and the
search fails, the "?SRH Search failure "xxx"" error message shows the
match control construct with a <> surrounding it. TECO-11/32 does
not.
BldStr is used by commands other than search commands, yet it reports
the "illegal search string" error sometimes. It looks like the error
messages from TECO-11/32 aren't really correct. Need an error message
like "illegal string build construct" or something.
The error message "illegal ^E command in search string" would be
better if it were "illegal ^E construct in search string"
In ERR.C, the routines ErrMsg, ErrStr and ErrPSt all share code. Fix
it. make verbose messages for system errors. flesh out error
handling in z files Make a test case that checks the cases:
1. call to ErrMsg
2. call to ErrChr
3. call to ErrStr
4. call to ErrPSt
5. call to ZVrbos on VAX and non-VAX machines
re-indent the code (automatically) to use 4-space indenting. This
will solve the problem that some lines are now too long. use clean
indenting scheme
A command like n+^T$$ won't get parsed right. Is this a general
problem?
merge zfrsrc and baksrc
convert pushex to pshnbr and pshopr
terminal modes aren't right on Sun
use standard Isdigit, etc. macros/functions?
The non-VMS ZPrscl's concatenate argv's and spaces to re-construct the
command line. There are better ways that are operating-system
dependent.
The construct: <0a"ad>' is not well-formed in TECOC, but it is in
TECO-11/32 The loop exits when the "end loop" command is skipped. In
TECOC, this means the loop nesting control variable isn't decremented,
so we "think" we're still in a loop even though we're not. This isn't
a problem in TECO-11/32. A more common programming construct is:
<0a"ad|1;'> which works without problems in TECOC.
The @-modified form of the ! "command" is supported in TECO-11/32, not
in TECOC.
In BOTH tecos, output of a long string to SYS$OUTPUT doesn't work if
the string is long enough. TECOC gets a signal, TECO-11/32 gets a
"OPCODE reserved to Digital" error. To fix, must make the "terminal
output buffer" dynamic.
All system calls must correctly handle being interrupted by control-C.
Page 228 of "Unix Programmer's Manual, Volume 1" talks about this a
little. Each system call should check for errors, but should not
treat control-Cs as an error.
If type ^C while it's executing a macro, get "Operation completed
under control-C" and a dollar sign!
If you type a control-C while help is being displayed, you get two
prompts
Control-C works fine at command splits. Checks need to be inserted
everywhere commands do loops on command arguments. For instance, 23p
needs a check in the loop that calls SinglP.
Does ExeCtT do the right thing when it's read with no wait and the
user types control-C?
The following weird thing happens (I forget which TECO):
1. compile a file/DEBUG/NOOPT in one terminal session
2. open the file with TECO in another session
3. debug the application in the first session. Can't find file.
4. do ^Z^Z to leave TECO in the second session
5. file is deleted!!!
The ^EUq string build construct behaves differently than the
TECO-11/32 algorithm for a special case: if the character in the
q-register is a ^E. The command "5uas^EUA$" will search for ^E in
TECO-11/32 and will fail in TECO-C.
ZFrSrc exists only because I was playing with SCANC on a VAX. Delete
the VAX-specific code and then merge what's left with BakSrc, using
SIncrm in the loops. This is much cleaner.
Local q-registers need to be tested further.
CBf, SBf, TBf, ZBf do not expand?
Finish creation of TSTPW.TEC, a test case that demonstrates that
ZWRITE mimics TECO-11/32 for all cases of the edit buffer/gap and all
cases of line termination: FF, VT, CR/LF, $/CR/LF, and GapBeg and
GapEnd.
Open SOFDEV.RNO for reading, do _glossary$v$$ and see junk. Also, do
rt -r notes.rno and then y$$y$$ and see an extra blank line at the
bottom of the buffer.
Use TRNLNM instead of TRNLOG in ZINIT and ZEXEEI. Make a
general-purpose logical name translation procedure to be used by both?
File COMMANDS.TXT has several "not implemented" lines that aren't
right
Add help text for E%q and EQq to hlp file.
In TECO-11/32, the EG command uses the BldStr-like routine to build
its string. Teco-c should call BldStr from ZExeEG.
The macro system needs to be carefully checked.
If do 8192ET, then a null command string with just two escapes won't
"work". Need to hit three, and then get an error.
Scan Appendix C of TECO-11/32 manual for goodies.
In ZExeEI:
1. status != RMS$_NORMAL in ZRedEI does not error
gracefully.
2. If find $$ in the middle of the read buffer, can't
continue after executing the string.
3. EI buffer won't expand.
4. File closure on error on ^C ?
ExeCSt was changed to do CBfPtr < CStEnd instead of CBfPtr <= CStEnd.
Track and check.
Why clear q-register stack in MemIni if it's been statically
initialized in TECOC?
Page 5 of TECO.LST shows ET and ED encodings. Compare/contrast
In ExeFGt, if we're not in a loop, should behave as if we're
<ESC><ESC>. We're not doing that now. Put in
If (MstTop)
{
CBfPtr = CStEnd;
return(SUCCESS);
}
into the code before the first return(FAILURE).
On the VAX, deal with disk quota overflow. Larry Kilgallen described
the handling of this: when you get a disk quota exceeded, just issue
the identical $PUT call again to exploit overdraft. This doesn't work
for creating files.
Date and time (^B and ^H) commands work under VAX/VMS. They will work
differently under other systems. Make a standard?
Say jz10v instead of zj10v and the two TECO's behave differently
Normal TECO handles two numbers in a row differently than TECO-C does.
TECO-C dies with a debugging message!!!
use register variables
use declaration of variables within blocks
see if type casts are superfluous in places. C already does it?
The September 1984 issue of Scientific American has an article by
Niklaus Wirth that describes a fast searching algorithm. Use it?
The entire ", ', <, >, O system should be checked.
CmdMod should be checked.
Is MovGap right?
The W command is stubbed out now. For debugging, ExeW exists, SkpE
skips over EG, EM, EN and EZ as if they were valid commands. A
problem with this is that the command to turn on SEEALL mode
"-1,3:W^[" returns ERR_NCA error, "negative argument to comma".
The code for INCCBP and the other places where ++CBfPtr happens needs
the MStTop test to be changed. Now, if a UTC should be reported, it's
not. It returns SUCCESS!
ExeO needs it's handling of CBfPtr to be fixed. There aren't checks
against CStEnd, and the last "--CBfPtr" may be wrong.
Shouldn't CBfPtr be renamed CStPtr? It would relate better to CStBeg,
CStEnd, etc.
help subsystem works on VAX, won't on another machine
Get rid of ??? which marks unfinished or questionable stuff. Get rid
of calls to ExeNYI.
DoEvEs doesn't implement the ES flag exactly like the manual says
DoEvEs has a system-dependent structure (UDummy)
the free function is an int on the VAX, void on the SAGE
Standard input and standard output are not used to communicate with
the terminal. UNIX people may expect that they are. This rules out
using TECO-C in a pipe-oriented manner.
Use DbgDCh instead of ZDspCh in ErrMsg for passed string displaying
difference between TypChr, EchoIt, CharOut?
COLON sounds like a character identifier. So does ATSIGN.
ChrFuncs requires DefChars
memory overflow
skipping commands is NOT finished.
In help, for errors, trace down the possible ways the code can print
each error message. Some of them are unobvious. Give an explanation
of all the ways an error can be generated to help a user figure out
his error.
Page 92 of the manual lists two informational messages. The 16 bit of
the ET mode control flag suppresses informational messages. These
messages are neither generated nor suppressed by TECO-C.
Doing an "ERfilename$" puts the expanded filespec in the filespec
buffer. Under TECO-11/32, doing a subsequent "ER$" to change I/O
streams does not wipe out the filespec buffer. It does in TECO-C.
For all the xxxBeg, xxxEnd, xxxPtr things, change all the comments to
xxxBeg; /* first char of xxx buffer */
xxxEnd; /* last char of xxx buffer */
xxxPtr; /* last char of xxx, plus 1 */
check the MOBY MUNGER. It mentions lots of bugs in other TECOs. Some
of the bugs are esoteric and quite possibly exist in TECO-C
nulls are not stripped from input.
VAX TPU is able to read a file that is currently locked by another
user, which is useful for looking at BATCH log files while a BATCH job
is running. TECO-C can't. I looked at the microfiche code to see how
TPU does it. It seems to try to open the file, and if it gets
RMS$_FLK, then it tries to open the file again after setting the UPI
bit in FAB$SHR. This means that it is supposed to do block I/O to the
file. I couldn't find the place where actual file reading is done
(it's in $fileio, which is in TPU$CAL_MODULE, which I couldn't find.)
Does TPU do block I/O (section mapping?)
The following commands are not yet implemented in TECO-C
W video scope control
^Y equivalent to ".+^S,."
EL open log file
^F return value in console switch register
nEC control memory management
The following commands are not implemented in TECO-C, and probably
never will be, as they require operating system features that cannot
be assumed by a portable TECO.
EZ zero output tape
EM position magnetic tape
In addition, most of the commands defined in Appendix C of
the manual (Incompatible, Obsolete and System-Specific Commands)
are not implemented.
The ^R command (set or return radix) supports the 8, 10 and 16
radices. TECO-C parses command-line numeric arguments using the
current radix. This can make command execution confusing for radix
16. Consider the command string "14A=$$", which returns the ascii
value of the 14th character after the character pointer. If the radix
is 16, the "A" is parsed as part of the number, and the ascii value of
a completely different character will be returned.
This is a trade-off. TECO-11/32 always parses command-line arguments
using radix 10. This destroys TECO's utility as a calculator for
hexadecimal. I believe access to a base 16 calculator is more
important than possible user confusion. Thus, be careful if you want
to change TECO's radix. Remember to change it back. Also note that
if you use TECO-C as a hexadecimal calculator, you must precede
hexadecimal numbers which start with one of the letters A-F with a 0
in order to make TECO-C parse the number correctly.
You won't get "%Superseding file" messages.
Differences between TECO-C and TECO-11 or TECO32 under VMS:
. video only under Unix, commands somewhat different, see VIDEO.TXT
. Command line syntax different under Unix.
. EO returns 100+
. 2048 bit of ET flag reverses meaning of DELETE and BACKSPACE keys
. -1EJ command returns additional operating system types
. 0:W returns additional terminal types
. s^n$ gives "invalid search argument", TECO-11/32 does nothing
. on ^Z^Z^Z, third ^Z is echoed
. default directory is TECO$MACROS for EI command
. TECO-C won't allow HP or HPW when edit buffer is empty
. TECO-C supports q-register I/O commands E% and EQ, TECO-11
doesn't
. TECO-C supports ^EQ* and ^EQ_ as string build contructs, TECO-11
doesn't
. TECO-C does case sensitivity correctly, not with bit checking,
so TECO-C does not consider "`","{","|","}" and "~" to be
equivalent to "@","[","\","]" and "^", respectively.
. The -P, -Y, and -N commands, which are implemented in TECO-11
version 39, are not yet implemented in TECO-C.
. TECO-11 supports switches on file name arguments to commands like
ER, EB, etc. TECO-C does not.
. TECO-11/32 supports files with nonstandard record formats (like
FORTRAN carriage control). TECO-C does not.
. TECO-11/32 does funny stuff with lines ending in <ESC><CR><LF>.
TECO-C doesn't (it can't under MS-DOS, which uses <CR><LF> as
line terminators in files.)
. Escape-sequence handling not in TECOC yet.
. <DELIM> can be anything in TECO-11/32, not in TECOC
. :EGcmd args' is in TECO-11/32
. ^T on/off handling in TECO-11/32 is better than in TECOC
. values returned by initialization macro are used by TECO-11/32
. ^E can be set by the user in TECO-11/32
. :^T command exists in TECO-11/32
. nOtag0,tag1,tag2$ with an "n" that's out-of-range is supposed to
. cause no branch at all. Under TECO-32, a negative "n" causes a
branch to tag0. TECO-C correctly does no branch.

View File

@ -39,6 +39,6 @@ mung link to tecoc
teco link to tecoc
Inspect link to tecoc
lib:
*.tes *.tec TECO macros
src:
Full source files for Linux version
*.tes TECO command files for various things
*.tec Compressed TECO command files
src: Full source files

85
doc/video.txt 100644
View File

@ -0,0 +1,85 @@
Notes from Blake McBride (blake@mcbride.name)
Video support under Linux & Mac OS/X has been restored. Getting it to
work under Windows would probably be easy (given ncurses support).
See the makefile's for instructions on enabling or disabling video
support.
When a file is being edited, you can execute: 5,7:w$$ to enter video
mode (the $ is the escape key). The "5" means 5 scroll lines at the
bottom of the screen. The remaining screen space is for the video
display.
Video mode can be exited with: 0,7:w$$
As shown below, you can also startup in video mode using:
teco -scroll:5 myfile.txt
----------------------------------------------------------------------
Original notes
Command line
------- ----
-NOPAGE
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.
-SCROLL:nnn
do nnn,7:w
-SCROLL:nnn:SEEALL
do nnn,7:W and 1,3:W
-INSPECT
Same as /INSPECT
-NOMEMORY
Same as /NOMEMORY
Video
-----
^W Immediate mode command - try to place line containing dot in
centre of scope window
-4W Complete redraw of screen
-1W Stop refreshing scope before each prompt
1W Start refreshing scope before each prompt
0W refresh scope
3:w Seeall Mode (set to 1 if SeeAll is on, 0 otherwise)
seeall is more unix style then you might expect
5:w Hold mode is not properly implemented. I don't like it anyway.
7:W Number of lines in command window. The size of the scope window
will be (Rows - 7:W (- 1 if ET&256))
8:w Attribute for special characters. This is highly implementation
dependent (curses implementation dependent). Under SUN OS 4.1
0 - no marking
1 - underline
2 - reverse
4 - blink
8 - dim
16 - bold
128 - ALT_CHARSET
currently controls marking of <CR> `
END OF PAGE (BTEE/+)
9:W Bit 0 - keypad support on
Bit 1 - do not do timeout escape sequence detection
ET&1 image mode - doesn't really do much with curses version
ET&2 use scope for delete and control-U
ET&4 accept lowercase input
ET&32 read with no wait on control-T (unimplemented - easy though)
ET&2048 reverse roles of BS and DEL (good if you use stty erase ^H,
in particular the key placement of BS is sometimes much easier
to get at then DEL). Should I have it detect the kill character
and automatically set this?
ET&8192 accept ` as escape (for VT220 terminals)
ET&16384 special VT200 mode
ET&32768 trap control-C
EZ&1 if false VMS style versioning for backup files (multiple backups)
if true only one backup level (foo, foo.bak)
EZ&8 if TRUE use LARROW (<) for CR, if false use `
EZ&16 if set then prefer audio beep else visual flash
EZ&32 winline divider for scope
EZ&128 if set DO NOT stop read on FF otherwise make pages as usual
EZ&256 UNIX NL-convert LF to <CR><LF> on input and invert on output
ED&512 controls scope display. If set will use VT100 line drawing
characters for CR and LF (in non-scope mode). May degrade
performance.
EZ&2048 if set use BTEE for end of buffer, else use DIAMOND
(desirable for pathological terminal types)
EZ&8192 don't show CR in scope - closer to TECO-11, but really
not as good in my opinion (Mark Henderson)

View File

@ -36,7 +36,11 @@ open_clpars_tec(ifile)
FILE **ifile;
#endif
{
#ifdef MSDOS
*ifile = fopen("clpars.tec","rb");
#else
*ifile = fopen("clpars.tec","r");
#endif
if (*ifile == NULL)
{
puts("genclp: Unable to open file CLPARS.TEC for reading");
@ -52,7 +56,11 @@ open_clpars_h(ofile)
FILE **ofile;
#endif
{
#ifdef MSDOS
*ofile = fopen("clpars.h","wt");
#else
*ofile = fopen("clpars.h","w");
#endif
if (*ofile == NULL)
{
puts("genclp: Unable to open file CLPARS.C for writing");
@ -206,7 +214,7 @@ main()
open_clpars_tec(&ifile);
write_header(ofile);
write_line("#if USE_ANSI_CLPARS\n", ofile);
write_line("unsigned const char clpars[] = {\n", ofile);
write_line("unsigned char clpars[] = {\n", ofile);
cnvrt(ifile, ofile, TRUE);
close_clpars_tec(ifile);
/*

View File

@ -2,27 +2,41 @@
# This makefile builds TECOC on Linux
# Before running it, inspect the lines between here and the line containing
# all #'s to select the way you want TECO-C built.
# If you want to compile with built-in debugging support, uncomment the
# following line. When debugging is compiled in, the control-P command
# can be used to turn on function tracing or get views of internal data
# structures (see the DbgDsp function in tecoc.c). Compiling in this support
# makes TECO-C larger and a little slower, so you should only use this
# when you're debugging TECO-C.
#DEBG = -DDEBUGGING
# If you're debugging TECO-C, use this option to compile in a consistency
# checking function called after each command executes. The function checks
# the sanity of TECO-C's internal variables. This obviously slows things
# down a little.
#CCHEK = -DCONSISTENCY_CHECKING
# If you want to use gcc, uncomment the following lines, which override the
# COMPILE.c macro so it doesn't stick in the -target option, which gcc
# doesn't understand.
CC= gcc
#CFLAGS= ${OSVERS} ${DEBG} ${CCHEK} -O -Wall -Wshadow -Wpointer-arith -Wcast-qual -DLINUX
CFLAGS= ${OSVERS} ${DEBG} ${CCHEK} -O -DLINUX
#TERMOBJS = -ltermcap
# Uncomment the following line for non-video teco
#CFLAGS= ${OSVERS} ${DEBG} ${CCHEK} -O -DLINUX
# Or, uncomment the following two lines for video teco
CFLAGS= ${OSVERS} ${DEBG} ${CCHEK} -O -DLINUX -DCURSES
TERMOBJS = -lncurses
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) -c -g
#############################################################################
CFILES= baksrc.c bldstr.c clenup.c cmatch.c docjr.c doeves.c doflag.c \
echoit.c err.c exea.c exeats.c exeb.c exebar.c exebsl.c exec.c \
execcc.c execln.c execom.c execrt.c execst.c execta.c exectc.c \
@ -39,34 +53,46 @@ CFILES= baksrc.c bldstr.c clenup.c cmatch.c docjr.c doeves.c doflag.c \
makdbf.c makrom.c popmac.c pshmac.c pushex.c rdline.c rdpage.c \
readcs.c replac.c search.c singlp.c skpcmd.c srclop.c sserch.c \
tabort.c typbuf.c typest.c uminus.c wrpage.c zfrsrc.c zlinux.c
OBJECTS= $(CFILES:.c=.o)
tecoc: tecoc.o ${OBJECTS}
${LINK.c} -s -o $@ tecoc.o ${OBJECTS} ${TERMOBJS}
tecoc.o: tecoc.c zport.h tecoc.h deferr.h dchars.h chmacs.h
clpars.h: genclp clpars.tec
genclp
./genclp
genclp: genclp.o
${LINK.c} -o $@ genclp.o
genclp.o: genclp.c
clean:
@for i in makedep? ${OBJECTS} ; do \
if [ -f $$i ] ; then rm $$i ; fi ; \
done
rm -f tecoc tecoc.o core
rm -f tecoc tecoc.o core genclp.o genclp clpars.h *.tmp *~ *.bak
tags:
etags *.c *.h
lint:
# b = report unreachable break statements
# c = complain about casts with questionable portability
# h = apply heuristic tests
# x = report unused externs
lint -bchx -DSUNOS4_0 tecoc.c ${CFILES}
#
# Invoking this target (with "make depend") causes a new version of this
# file to be created. This current version will be saved in a file named
# "makefile.bak". In the new file, the lines following the special "DO NOT
# DELETE" line will be replaced with a new set of dependency rules.
#
depend: makedep
@echo '/^# DO NOT DELETE THIS LINE/+1,$$d' >makedep0
@echo '$$r makedep5' >>makedep0
@ -75,6 +101,7 @@ depend: makedep
@ed - makefile < makedep0
@rm makedep?
@echo "new version of makefile generated, old version in makefile.bak"
makedep: FRC
@cat /dev/null >makedep5
@echo "generating include file dependency list..."
@ -100,6 +127,8 @@ makedep: FRC
@cat makedepe
@(if [ -s makedepe ]; then false; fi)
FRC:
# DO NOT DELETE THIS LINE -- make depend uses it
baksrc.o: baksrc.c zport.h tecoc.h defext.h dchars.h chmacs.h deferr.h
bldstr.o: bldstr.c zport.h tecoc.h defext.h deferr.h dchars.h chmacs.h

View File

@ -1,28 +1,42 @@
#
# This makefile builds TECOC on Linux
# This makefile builds TECOC on Mac OS X
# Before running it, inspect the lines between here and the line containing
# all #'s to select the way you want TECO-C built.
# If you want to compile with built-in debugging support, uncomment the
# following line. When debugging is compiled in, the control-P command
# can be used to turn on function tracing or get views of internal data
# structures (see the DbgDsp function in tecoc.c). Compiling in this support
# makes TECO-C larger and a little slower, so you should only use this
# when you're debugging TECO-C.
#DEBG = -DDEBUGGING
# If you're debugging TECO-C, use this option to compile in a consistency
# checking function called after each command executes. The function checks
# the sanity of TECO-C's internal variables. This obviously slows things
# down a little.
#CCHEK = -DCONSISTENCY_CHECKING
# If you want to use gcc, uncomment the following lines, which override the
# COMPILE.c macro so it doesn't stick in the -target option, which gcc
# doesn't understand.
CC= gcc
#CFLAGS= ${OSVERS} ${DEBG} ${CCHEK} -O -Wall -Wshadow -Wpointer-arith -Wcast-qual -DLINUX
CFLAGS= ${OSVERS} ${DEBG} ${CCHEK} -O -DOSX
#TERMOBJS = -ltermcap
# Uncomment the following line for non-video teco
#CFLAGS= ${OSVERS} ${DEBG} ${CCHEK} -O -DOSX
# Or, uncomment the following two lines for video teco
CFLAGS= ${OSVERS} ${DEBG} ${CCHEK} -O -DOSX -DCURSES
TERMOBJS = -lncurses
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) -c -g
#############################################################################
CFILES= baksrc.c bldstr.c clenup.c cmatch.c docjr.c doeves.c doflag.c \
echoit.c err.c exea.c exeats.c exeb.c exebar.c exebsl.c exec.c \
execcc.c execln.c execom.c execrt.c execst.c execta.c exectc.c \
@ -39,34 +53,46 @@ CFILES= baksrc.c bldstr.c clenup.c cmatch.c docjr.c doeves.c doflag.c \
makdbf.c makrom.c popmac.c pshmac.c pushex.c rdline.c rdpage.c \
readcs.c replac.c search.c singlp.c skpcmd.c srclop.c sserch.c \
tabort.c typbuf.c typest.c uminus.c wrpage.c zfrsrc.c zosx.c
OBJECTS= $(CFILES:.c=.o)
tecoc: tecoc.o ${OBJECTS}
${LINK.c} -s -o $@ tecoc.o ${OBJECTS} ${TERMOBJS}
${LINK.c} -o $@ tecoc.o ${OBJECTS} ${TERMOBJS}
tecoc.o: tecoc.c zport.h tecoc.h deferr.h dchars.h chmacs.h
clpars.h: genclp clpars.tec
./genclp
genclp: genclp.o
${LINK.c} -o $@ genclp.o
genclp.o: genclp.c
clean:
@for i in makedep? ${OBJECTS} ; do \
if [ -f $$i ] ; then rm $$i ; fi ; \
done
rm -f tecoc tecoc.o core
rm -f tecoc tecoc.o core genclp.o genclp clpars.h *.tmp *~ *.bak
tags:
etags *.c *.h
lint:
# b = report unreachable break statements
# c = complain about casts with questionable portability
# h = apply heuristic tests
# x = report unused externs
lint -bchx -DSUNOS4_0 tecoc.c ${CFILES}
#
# Invoking this target (with "make depend") causes a new version of this
# file to be created. This current version will be saved in a file named
# "makefile.bak". In the new file, the lines following the special "DO NOT
# DELETE" line will be replaced with a new set of dependency rules.
#
depend: makedep
@echo '/^# DO NOT DELETE THIS LINE/+1,$$d' >makedep0
@echo '$$r makedep5' >>makedep0
@ -75,6 +101,7 @@ depend: makedep
@ed - makefile < makedep0
@rm makedep?
@echo "new version of makefile generated, old version in makefile.bak"
makedep: FRC
@cat /dev/null >makedep5
@echo "generating include file dependency list..."
@ -100,6 +127,8 @@ makedep: FRC
@cat makedepe
@(if [ -s makedepe ]; then false; fi)
FRC:
# DO NOT DELETE THIS LINE -- make depend uses it
baksrc.o: baksrc.c zport.h tecoc.h defext.h dchars.h chmacs.h deferr.h
bldstr.o: bldstr.c zport.h tecoc.h defext.h deferr.h dchars.h chmacs.h

File diff suppressed because it is too large Load Diff

View File

@ -17,6 +17,7 @@
#include <string.h> /* prototypes for strlen(), strcat(), ... */
#include <utime.h> /* prototype for utime() */
#include <sys/stat.h> /* prototype for stat() */
#include <malloc.h>
#include "zport.h" /* define portability identifiers */
#include "tecoc.h" /* define general identifiers */

View File

@ -1,6 +1,6 @@
/*****************************************************************************
ZLinux.c
System dependent code for Linux
zosx.c
System dependent code for Mac OS X
This is based on zunix.c, with changes (see comments "TAA")
for enhanced functionality.
*****************************************************************************/
@ -24,6 +24,9 @@
#include <unistd.h>
#include <termios.h>
#include <glob.h> /* Rewritten 05/04 by TAA to use glob function */
#if CURSES
#include <curses.h> /* has to come before zport.h */
#endif
#include "zport.h" /* define portability identifiers */
#include "tecoc.h" /* define general identifiers */
#include "chmacs.h" /* define character processing macros */
@ -32,6 +35,62 @@
#include "deferr.h" /* define identifiers for error messages */
#include "defext.h" /* define external global variables */
#include "dscren.h" /* define identifiers for screen i/o */
#if CURSES
/*
* The ACS_xxx symbols are defined in the SunOS version of curses, but not
* in either the BSD or X/OPEN Ultrix versions. Who knows where else they
* are defined? Isn't portability wonderful?
*
* Note that this code implicitly assumes a VT100-compatible terminal.
* Tough. (Jerry Leichter, June 1991)
*/
#ifndef ACS_PLMINUS
#define ACS_PLMINUS (A_ALTCHARSET | 0x67)
#define ACS_LLCORNER (A_ALTCHARSET | 0x60)
#define ACS_LRCORNER (A_ALTCHARSET | 0x6A)
#define ACS_LARROW (A_ALTCHARSET | 0x7C) /* Really not-equal */
#define ACS_HLINE (A_ALTCHARSET | 0x71)
#define ACS_BTEE (A_ALTCHARSET | 0x76)
#define ACS_DIAMOND (A_ALTCHARSET | 0x60)
#define ACS_RTEE (A_ALTCHARSET | 0x75)
#endif
WINDOW *curwin;
int ScopeFlg = 0; /* for ZDspCh and ZDspBuf */
int olddot;
#define DOT (GapBeg - EBfBeg)
#define ISSCW (ScopeFlg)
unsigned char *p_scope_start;
int scope_start;
int winline;
int cursoratbottomline;
int cursorattopline;
static int colsave;
int dotx,doty; /* position of cursor in scope */
int dotx1, doty1; /* pos. after printing character in scope */
int skiprefresh = 0;
int cmdx,cmdy; /* position of cursor in command buffer */
int scope_start, scope_end;
unsigned char *pscope_start;
#define CT ((EzFlag & EZ_VT100GRAPHICS) ? ACS_PLMINUS : '^')
#define LB ((EzFlag & EZ_VT100GRAPHICS) ? ACS_LLCORNER : '[')
#define RB ((EzFlag & EZ_VT100GRAPHICS) ? ACS_LRCORNER : ']')
#else /* else (not CURSES) ----------------------*/
#ifdef LINUX
static struct termios out, cur; /* terminal characteristics buffers */
#else
#include <sgtty.h> /* define CBREAK, ECHO, TIOCGETP, etc. */
static struct sgttyb out, cur; /* terminal characteristics buffers */
#endif
static char tbuf[1024]; /* store TERMCAP entry here */
static char tarea[1024]; /* store decoded TERMCAP stuff here */
static char *ce; /* TERMCAP sequence: clear to end-of-line */
static char *up; /* TERMCAP sequence: cursor up */
static char *so; /* TERMCAP sequence: reverse video on */
static char *se; /* TERMCAP sequence: reverse video off */
int tputs(); /* send termcap string to a given function */
int tgetent(); /* load a terminal capability buffer */
char *tgetstr(); /* get str value of a terminal capability */
#endif
static BOOLEAN tty_set = FALSE; /* Has the terminal been set? */
static struct termios out, cur; /* terminal characteristics buffers */
static char tbuf[1024]; /* store TERMCAP entry here */
@ -104,7 +163,14 @@ this function controls the signal generator directly.
*****************************************************************************/
VVOID ZBell(VVOID)
{
#if CURSES
if (EzFlag & EZ_AUDIO_BEEP)
beep(); /* audio beep */
else
flash(); /* visible flash */
#else
ZDspCh('\7');
#endif
}
/*****************************************************************************
ZChIn()
@ -132,7 +198,11 @@ BOOLEAN NoWait; /* return immediately? */
LastLF = FALSE;
return (DEFAULT)LINEFD;
}
#if CURSES
if ((Charac = getch()) == ERR) {
#else
if (read(fileno(stdin), &Charac, 1) != 1) {
#endif
if (GotCtC || SupGotCtC)
return (DEFAULT)CTRL_C;
if (!GotCtC) {
@ -269,8 +339,14 @@ voidptr cp;
VVOID ZClnUp(VVOID) /* cleanup for TECO-C abort */
{
DBGFEN(3,"ZClnUp","closing terminal channels and exiting");
#if !CURSES
if (tty_set == TRUE)
#ifdef LINUX
tcsetattr(0, TCSANOW, &out);
#else
ioctl(0, TIOCSETP, &out);
#endif
#endif
}
/*****************************************************************************
ZDoCmd()
@ -303,6 +379,242 @@ VVOID ZDoCmd(charptr GBfBeg, charptr GBfPtr) /* die and pass command to OS */
(void)perror ("");
ZExit (EXIT_SUCCESS);
}
#if CURSES
static void
zaddch(c,wecho)
char c;
int wecho; /* if set - also do refresh */
{
static int retflag = 0;
int needrefresh = 1;
int y,x;
if (c=='\n') {
if (!retflag) /* previous char was not \r */
waddch(curwin,c);
else { /* this LF is part of a CRLF sequence */
waddch(curwin,'\n'); /* this may force a scroll */
waddch(curwin,'\r');
}
} else if (c=='\b') { /* backspace */
getyx(stdscr,y,x);
if (x==0 && y>0)
move(y-1,HtSize - 1);
else if (x>0)
move(y,x-1);
else /* x==0 and y==0 */
;
} else { /* c is neither a newline nor a backspace */
if (retflag)
waddch(curwin,'\r');
if (c!='\r') {
if (ISSCW) {
getyx(stdscr,y,x);
if (x < HtSize -1)
waddch(curwin,c);
} else
if (wecho) {
#ifdef ULTRIX
waddch(curwin,c);
#else
wechochar(curwin,c);
needrefresh = 0;
#endif
} else
waddch(curwin,c);
}
}
retflag = (c=='\r');
if (wecho && needrefresh)
refresh();
}
static void
specon()
{
if (SpcMrk)
wattron(stdscr,0400000L * (long) SpcMrk);
}
static void
specoff()
{
if (SpcMrk)
wattroff(stdscr,0400000L * (long) SpcMrk);
}
static void
gr_on()
{
wattron(stdscr,A_ALTCHARSET);
}
static void
gr_off()
{
wattroff(stdscr,A_ALTCHARSET);
}
static int
intabs(t)
int t;
{
return (t<0) ? -t : t;
}
static void
zaddch2(c)
char c;
{
static int retflag = 0;
if (SeeAll) {
if (c=='\n') {
if (EzFlag & EZ_VT100GRAPHICS) {
gr_on();
waddch(curwin, 'e');
gr_off();
} else {
waddch(curwin,CT);
waddch(curwin,'J');
}
if (!retflag) { /* previous character was not \r */
waddch(curwin,c);
} else { /* this LF is in a CRLF sequence */
waddch(curwin,'\n');
waddch(curwin,'\r');
}
} else { /* c is not a newline */
if (c=='\r') {
if (EzFlag & EZ_VT100GRAPHICS) {
gr_on();
waddch(curwin,'d'); gr_off();
} else {
waddch(curwin,CT);
waddch(curwin,'M');
}
} else if (c=='\t') {
if (EzFlag & EZ_VT100GRAPHICS) {
int y,x,y1,x1,cntr;
getyx(curwin,y,x);
waddch(curwin,'\t');
getyx(curwin,y1,x1);
move(y,x);
gr_on();
cntr = 0;
waddch(curwin,'b');
getyx(curwin,y,x);
while ((cntr < 8) && (y!=y1 || x!=x1) &&
(y<VtSize - winline - ScroLn)) {
waddch(curwin,'~');
cntr++;
getyx(curwin,y,x);
}
gr_off();
} else {
waddch(curwin,CT); waddch(curwin,'I');
}
} else if (c=='\f') {
if (EzFlag & EZ_VT100GRAPHICS) {
gr_on();
waddch(curwin,'c');
gr_off();
} else {
waddch(curwin,CT);
waddch(curwin,'L');
}
waddch(curwin,'\n');
waddch(curwin,'\r');
} else if (c==27) {
if (EzFlag & EZ_VT100GRAPHICS) {
gr_on();
waddch(curwin,'{');
gr_off();
} else {
waddch(curwin,CT);
waddch(curwin,'[');
}
} else if (c==VRTTAB) { /* Vertical tab */
if (EzFlag & EZ_VT100GRAPHICS) {
gr_on();
waddch(curwin,'i');
gr_off();
} else {
waddch(curwin,CT);
waddch(curwin,'K');
}
waddch(curwin,'\n');
waddch(curwin,'\r');
} else if (c=='\b') {
waddch(curwin,CT);
waddch(curwin,'H');
} else if (c & 0200) {
int i;
char a,b;
waddch(curwin,LB);
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');
waddch(curwin,a);
waddch(curwin,b);
waddch(curwin,RB);
} else if (c < 32) {
waddch(curwin, CT);
waddch(curwin, c | 64);
} else
waddch(curwin,c);
}
retflag = (c==CRETRN);
} else { /* not in SEEALL mode */
c = c & 0177; /* dump 8th bit */
if (c=='\n') {
waddch(curwin,'\n');
waddch(curwin,'\r');
} else if (c=='\b') {
waddch(curwin,'^');
waddch(curwin,'H');
} else { /* c is neither a newline nor a backspace */
switch (c) {
case CRETRN:
if (EzFlag & EZ_INVCR) {
waddch(curwin, ' ');
} else if (EzFlag & EZ_VT100GRAPHICS) {
gr_on();
waddch(curwin, 'd');
gr_off();
} else if (EzFlag & EZ_ARROW) {
specon();
waddch(curwin, ACS_LARROW);
specoff();
} else {
specon();
waddch(curwin,'`');
specoff();
}
break;
case ESCAPE:
specon();
waddch(curwin,'$');
specoff();
break;
case VRTTAB:
case FORMFD:
if (EzFlag & EZ_VT100GRAPHICS) {
gr_on();
waddch(curwin,c);
gr_off();
} else {
waddch(curwin, c);
}
waddch(curwin, '\n');
waddch(curwin, '\r');
default:
waddch(curwin,c);
}
}
retflag = (c=='\r');
}
}
#endif
/*****************************************************************************
ZDspBf()
This function displays a buffer of a given length on the terminal
@ -318,10 +630,27 @@ VVOID ZDspBf(buffer, length) /* output a buffer to terminal */
charptr buffer;
SIZE_T length;
{
#if CURSES
int i;
int y,x;
for (i=0;i<length;i++) {
if (ISSCW) {
getyx(stdscr,y,x);
if (x>=(HtSize-1))
break;
}
if (!GotCtC)
zaddch(*(buffer+i),0);
else
break;
}
wrefresh(curwin);
#else
if (write(fileno(stdout), buffer, length) == -1) {
puts("Unable to write to terminal in function ZDspBf");
TAbort(EXIT_FAILURE);
}
#endif
}
/*****************************************************************************
ZDspCh()
@ -330,10 +659,14 @@ SIZE_T length;
VVOID ZDspCh(Charac) /* output a character to terminal */
char Charac;
{
#if CURSES
zaddch(Charac,1);
#else
if (write(fileno(stdout), &Charac, 1) == -1) {
puts("Unable to write to terminal in function ZDspCh");
TAbort(EXIT_FAILURE);
}
#endif
}
/*****************************************************************************
ZExCtB()
@ -420,6 +753,11 @@ DEFAULT ZExeEJ() /* execute an EJ command */
VVOID ZExit(estat) /* terminate TECO-C */
DEFAULT estat;
{
#if CURSES
nodelay(stdscr,FALSE); /* to avoid a bug in some System V.2 */
/* releases of curses */
endwin();
#endif
ZClnUp();
exit(estat);
}
@ -670,7 +1008,8 @@ BOOLEAN RepFNF; /* report "file not found" error? */
charptr dummyp = NULL;
char TmpBfr[FILENAME_MAX];
ptrdiff_t TmpLen = FBfPtr-FBfBeg;
if (strchr(FBfBeg,'.') == NULL) { /* if no dot */
BOOLEAN noDot;
if (noDot = strchr(FBfBeg,'.') == NULL) { /* if no dot */
(void)strcat(FBfBeg,".tec"); /* append .tec */
FBfPtr += 4;
if ((IFiles[IfIndx] = fopen(FBfBeg, "r")) != NULL) {
@ -691,7 +1030,7 @@ BOOLEAN RepFNF; /* report "file not found" error? */
IFisCR[IfIndx] = 0;
return SUCCESS;
}
if (strchr(FBfBeg,'.') == NULL) { /* if no dot */
if (noDot) { /* if no dot */
(void)strcat(FBfBeg,".tec"); /* append .tec */
FBfPtr += 4;
if ((IFiles[IfIndx] = fopen(FBfBeg, "r")) != NULL) {
@ -1044,6 +1383,21 @@ DEFAULT *retlen; /* returned length of string */
VVOID ZScrOp(OpCode) /* do a screen operation */
int OpCode; /* code for operation */
{
#if CURSES
int x,y;
switch (OpCode) {
case SCR_EEL: clrtoeol();
break;
case SCR_CUP: getyx(stdscr,y,x);
if (y-1)
move(y-1,x);
break;
case SCR_ROF: standend(); break;
case SCR_RON: standout(); break;
}
refresh();
#endif
// if (CrType == UNTERM || tbuf[0] == 0) {/* if unknown terminal type */
// return; /* can't do screen operations */
// }
@ -1164,46 +1518,85 @@ static void sigstop()
VVOID ZTrmnl() /* set up I/O to the terminal */
{
EtFlag = ET_READ_LOWER | /* guess: term has lowercase and */
#if CURSES
ET_WAT_SCOPE | /* "WATCH" support exists */
#endif
ET_EIGHTBIT | /* terminal uses 8-bit characters */
ET_SCOPE; /* it's a scope, not hardcopy */
EzFlag = EZ_NO_VER | /* don't do VMS-style file versions */
#if CURSES
/* EZ_UNIXNL | * don't add CRs to newlines */
#endif
EZ_INVCR; /* don't show little c/r characters */
/*
* get terminal characteristics and set some signals
*/
#if !CURSES
if (tcgetattr(0, &out) != -1)
tty_set = TRUE; /* tell ZClnUp to clean up */
tcgetattr(0, &cur);
#ifdef SIGTSTP
signal(SIGTSTP, sigstop); /* call sigstop on stop (control-Z) */
#endif
#endif
/*
* set CBREAK/noECHO/noCRMOD
*/
#if CURSES
initscr(); /* initialize screens */
#ifdef ULTRIX
setupterm(0,1,0); /* Enable termcap compatibility */
#endif
scrollok(stdscr,TRUE); /* scroll if cursor moves too hi/lo */
idlok(stdscr,TRUE); /* use hardware insert/delete line */
cbreak(); /* don't wait for CRs (CBREAK) */
noecho(); /* don't echo characters (ECHO) */
nonl(); /* don't add CRs to NEWLINEs (CRMOD) */
curwin = stdscr;
ScopeFlg = 0; /* not writing in scope */
#else /* NOT CURSES */
cur.c_lflag &= ~ICANON;
cur.c_lflag &= ~ECHO;
cur.c_oflag &= ~ONLCR;
cur.c_iflag &= ~(ICRNL | INLCR);
tcsetattr(0, TCSANOW, &cur);
#endif
signal(SIGINT, CntrlC); /* call CntrlC on interrupt */
signal(SIGHUP, sighup); /* call sighup on hang up */
siginterrupt(SIGINT, 1);
/*
* set up termcap stuff
*/
tbuf[0] = 0;
// if ((ta = getenv("TERM")) == NULL) { /* get terminal type */
// ta = "dumb";
// }
// tgetent(tbuf, ta); /* tbuf gets terminal description */
// ta = tarea;
// ce = xtgetstr("ce",&ta); /* clear to end of line */
// se = xtgetstr("se",&ta); /* end standout mode (rev. video) */
// so = xtgetstr("so",&ta); /* begin standout mode */
// up = xtgetstr("up",&ta); /* cursor up */
CrType = VT102; /* Let's pretend we are a VT102
even though we are really using
termcap! */
#if !CURSES
tbuf[0] = 0;
#ifdef LINUX // BAD for now but do we really want this??
#else
if ((ta = getenv("TERM")) == NULL) { /* get terminal type */
ta = "dumb";
}
tgetent(tbuf, ta); /* tbuf gets terminal description */
ta = tarea;
ce = xtgetstr("ce",&ta); /* clear to end of line */
se = xtgetstr("se",&ta); /* end standout mode (rev. video) */
so = xtgetstr("so",&ta); /* begin standout mode */
up = xtgetstr("up",&ta); /* cursor up */
#endif
#endif
#if VIDEO
#if CURSES
#ifdef ULTRIX
VtSize = LINES;
HtSize = COLS;
#else
getmaxyx(stdscr, VtSize, HtSize);
#endif
#else
VtSize = HtSize = 0;
#endif
#endif
}
/*****************************************************************************
ZVrbos()
@ -1262,7 +1655,7 @@ charptr BfrEnd; /* address of output buffer end */
BfrPtr--;
}
}
if (fputc(*BfrPtr, OFiles[OfIndx].OStrem) == EOF) {
if (putc(*BfrPtr, OFiles[OfIndx].OStrem) == EOF) {
ZErMsg();
ErrMsg(ERR_UWL);
DBGFEX(2,DbgFNm,"FAILURE");
@ -1353,3 +1746,384 @@ char *target;
closedir(dirp);
return (found) ? maxver : -2;
}
#if CURSES
static void movedot(HowFar)
LONG HowFar; /* positive or negative displacement */
{
if (HowFar > 0) {
if ((GapEnd+HowFar) > EBfEnd) {
HowFar = EBfEnd - GapEnd;
}
MEMMOVE(GapBeg, GapEnd+1, HowFar);
GapBeg += HowFar;
GapEnd += HowFar;
} else {
if ((GapBeg+HowFar) < EBfBeg) {
HowFar = EBfBeg - GapBeg;
}
GapBeg += HowFar;
GapEnd += HowFar;
MEMMOVE(GapEnd+1, GapBeg, -(HowFar));
}
}
static void
drawline()
{
int i;
if (winline) {
move(VtSize - ScroLn - 1, 0);
for (i=0;i<HtSize; i++)
addch(ACS_HLINE);
}
}
static void
initialize_scope()
{
/*
* not dotx, doty will be character and line offsets from 0,0
* wrap will not effect these
*/
dotx = doty = 0;
olddot = 0;
getyx(stdscr,cmdy,cmdx);
move(0,0);
clear();
p_scope_start=GapBeg;
scope_start = DOT;
if (winline)
drawline();
move(cmdy,cmdx);
refresh();
}
static void
finish()
{
int x;
int y;
getyx(stdscr,y,x);
if (y >= VtSize - winline - ScroLn)
return;
clrtoeol();
for (x=y+1;x<VtSize - winline - ScroLn; x++) {
move(x,0);
clrtoeol();
}
}
void
redraw()
{
int cccmdx;
int cccmdy;
int flag = 0;
int x;
int y;
int charcounter;
unsigned char *curptr;
if (ScroLn == 0)
return;
getyx(stdscr,cccmdy,cccmdx);
draw_all:
if (EBfBeg == GapBeg && EBfEnd==GapEnd) {
int i;
move(0,0);
scope_start = 0;
p_scope_start = EBfBeg;
standout();
specon();
getyx(stdscr, doty, dotx);
addch((EzFlag & EZ_BTEE) ? ACS_BTEE : ACS_DIAMOND);
specoff();
standend();
getyx(stdscr, doty1, dotx1);
clrtoeol();
for (i=1; i<=VtSize - ScroLn - 1 - winline;i++) {
move(i,0);
clrtoeol();
}
drawline();
move(cccmdy,cccmdx);
olddot = 0;
return;
}
if ((intabs(olddot - DOT) > HtSize * (VtSize - ScroLn))
|| HldFlg) {
/* admittedly a heuristic ! */
int linedisp, disp;
int siz = VtSize - ScroLn - 1 - winline;
linedisp = siz/2-2;
if (linedisp > 0) {
disp = Ln2Chr(-linedisp);
p_scope_start = GapBeg + disp;
scope_start = DOT + disp;
goto l1; /* no need to do stuff to get to beginning
of line */
}
}
if (p_scope_start > EBfBeg) {
/* set p_scope_start to beginning of line */
if (scope_start > DOT) { /* move */
p_scope_start = GapBeg;
scope_start = DOT;
}
flag = 0;
while ((p_scope_start > EBfBeg) && !flag) {
--p_scope_start;
if (IsEOL(*p_scope_start))
flag++;
}
if (p_scope_start != EBfBeg || IsEOL(*p_scope_start))
++p_scope_start;
}
/*
* note here p_scope_start may still be at GapBeg after all this number of
* characters we "backed up" is GapBeg - p_scope_start
*/
l1: olddot = DOT; move(0,0);
charcounter = GapBeg - p_scope_start;
if (p_scope_start < GapBeg) {
for (curptr=p_scope_start; curptr < GapBeg; curptr++) {
int redrawflag;
zaddch2(*curptr);
getyx(stdscr,y,x);
if (y>VtSize - ScroLn - 1 - winline) {
int lines = 0;
unsigned char *charpointer;
/*
* we didn't get to print dot - try moving p_scope_start one line forward or
* if lots of lines in between DOT and p_scope_start then just redraw
*/
move(y-1,0);
clrtoeol();
redrawflag = 0;
if (p_scope_start >= EBfEnd) {
finish();
drawline();
move(cccmdy,cccmdx);
return; /* blew it */
}
/* about how many lines ? */
for (charpointer = p_scope_start;
charpointer < GapBeg; charpointer++) {
if (IsEOL(*charpointer))
lines++;
if (lines > 2*(VtSize - ScroLn))
break;
}
if (lines > 2*(VtSize-ScroLn)) {
/* just redraw everything */
p_scope_start = GapBeg;
scope_start = DOT;
move(0,0);
/* clear(); */
p_scope_start = GapBeg;
scope_start = DOT;
goto draw_all;
}
/* move forward a line */
while (p_scope_start < GapBeg && !IsEOL(*p_scope_start)) {
++p_scope_start;
++scope_start;
}
if (IsEOL(*p_scope_start)) {
p_scope_start++; scope_start++;
}
if (p_scope_start >= GapBeg) {
p_scope_start = GapBeg;
scope_start = DOT;
}
goto l1;
}
}
}
curptr = GapEnd+1;
standout();
getyx(stdscr, doty, dotx);
if (curptr > EBfEnd) {
getyx(stdscr,y,x);
if (y <= VtSize - ScroLn - 1 - winline) {
specon();
addch((EzFlag & EZ_BTEE) ? ACS_BTEE : ACS_DIAMOND);
specoff();
standend();
getyx(stdscr, doty1, dotx1);
}
finish();
drawline();
move(cccmdy,cccmdx);
clrtoeol();
return;
} else {
if (*curptr=='\n') {
if (!(SeeAll) && (y <= VtSize - ScroLn - 1 - winline)) {
if (EzFlag & EZ_VT100GRAPHICS) {
gr_on(); waddch(curwin,'e'); gr_off();
} else
addch(ACS_RTEE);
}
}
zaddch2(*curptr);
}
standend();
getyx(stdscr, doty1, dotx1);
curptr++;
getyx(stdscr,y,x);
if (y>VtSize - ScroLn - 1 - winline) {
drawline();
move(cccmdy,cccmdx);
return;
}
while ((curptr <= EBfEnd)) {
zaddch2(*curptr);
getyx(stdscr,y,x);
if (y>=VtSize - ScroLn - winline)
break;
++curptr;
}
if (y < VtSize - ScroLn - winline && curptr > EBfEnd) {
specon();
addch((EzFlag & EZ_BTEE) ? ACS_BTEE : ACS_DIAMOND);
specoff();
}
finish();
drawline();
move(cccmdy,cccmdx);
}
void
centre()
{
int linedisp, disp;
int siz = VtSize - ScroLn - 1 - winline;
linedisp = siz/2-2;
if (linedisp > 0) {
disp = Ln2Chr(-linedisp); /* disp <= 0 */
p_scope_start = GapBeg + disp;
scope_start = DOT + disp;
} else {
p_scope_start = GapBeg;
scope_start = DOT;
}
redraw();
}
void
dolf()
{
if (!skiprefresh)
redraw();
}
void
dobs()
{
if (!skiprefresh)
redraw();
}
void
ccs()
{
colsave = (-1);
}
void
do_right()
{
colsave = (-1);
CmdMod &= ~COLON;
if (GapEnd < EBfEnd) {
DoCJR(1);
redraw();
refresh();
}
}
void
do_left()
{
colsave = (-1);
CmdMod &= ~COLON;
if (EBfBeg < GapBeg) {
DoCJR(-1);
redraw();
refresh();
}
}
void
do_sf()
{
}
void
do_sr()
{
}
void
do_up()
{
int disp = Ln2Chr(-1); int ll; int dist;
if (colsave < 0) {
colsave = -Ln2Chr(0);
}
CmdMod &= ~COLON;
/*
* find length of prev line in characters
*/
ll = Ln2Chr(0) - Ln2Chr(-1) - 1;
if (ll==(-1))
return;
dist = disp + ((colsave >= ll) ? ll : colsave);
movedot(dist);
redraw();
refresh();
}
void
do_down()
{
int disp = Ln2Chr(1);
int ll, dist;
if (colsave < 0) {
colsave = -Ln2Chr(0);
}
CmdMod &= ~COLON;
ll = Ln2Chr(2) - Ln2Chr(1) - 1;
if (ll==(-1)) {
movedot(EBfEnd - GapEnd);
} else {
dist = disp + ((colsave >= ll) ? ll : colsave);
movedot(dist);
}
redraw();
refresh();
}
void
do_seetog() /* toggle SeeAll mode */
{
SeeAll = (SeeAll > 0) ? 0 : 1;
redraw();
refresh();
}
void
keypad_on()
{
keypad(stdscr, (KeyPad & 1));
keypad(stdscr, (KeyPad & 2));
}
void
keypad_off()
{
#ifndef ULTRIX
notimeout(stdscr, FALSE);
#endif
keypad(stdscr, FALSE);
}
void
Scope(bot) /* first crack */
int bot;
{
if (bot <0)
return;
if (bot == 0) {
setscrreg(0, VtSize -1);
} else {
winline = (EzFlag & EZ_WIN_LINE) ? 1 : 0;
setscrreg(VtSize - bot, VtSize - 1);
move(VtSize - bot, 0);
curwin = stdscr;
initialize_scope();
}
}
#endif

View File

@ -34,6 +34,12 @@
#include <sys/stat.h>
#include <sys/wait.h>
#include <pwd.h>
#ifdef LINUX
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
#endif
#if CURSES
#include <curses.h> /* has to come before zport.h */
#endif
@ -85,9 +91,14 @@ unsigned char *pscope_start;
#define LB ((EzFlag & EZ_VT100GRAPHICS) ? ACS_LLCORNER : '[')
#define RB ((EzFlag & EZ_VT100GRAPHICS) ? ACS_LRCORNER : ']')
#else /* else (not CURSES) ----------------------*/
#ifdef LINUX
static BOOLEAN tty_set = FALSE; /* Has the terminal been set? */
static struct termios out, cur; /* terminal characteristics buffers */
#else
#include <sgtty.h> /* define CBREAK, ECHO, TIOCGETP, etc. */
static BOOLEAN tty_set = FALSE; /* Has the terminal been set? */
static struct sgttyb out, cur; /* terminal characteristics buffers */
#endif
static char tbuf[1024]; /* store TERMCAP entry here */
static char tarea[1024]; /* store decoded TERMCAP stuff here */
static char *ce; /* TERMCAP sequence: clear to end-of-line */
@ -98,6 +109,8 @@ int tputs(); /* send termcap string to a given function */
int tgetent(); /* load a terminal capability buffer */
char *tgetstr(); /* get str value of a terminal capability */
#endif
#ifdef LINUX
#else
int access(); /* determine accessibility of a file */
int atoi(); /* convert ASCII digits to inary integer */
int execlp(); /* terminate and execute a system command */
@ -122,6 +135,7 @@ int stat(); /* get information about a file */
int time(); /* get current time */
int unlink(); /* remove link to file (delete the file) */
int write(); /* write to a file */
#endif
/*
* The SunOS 4.0 system include files don't have declarations for some
* functions, so add them here to keep gcc from complaining about implicit
@ -144,7 +158,9 @@ static char **glob(); /* see bottom of this file */
static int vernum(); /* see bottom of this file */
static int movefile(); /* see bottom of this file */
extern int sys_nerr; /* number of system error messages */
#ifndef LINUX
extern char *sys_errlist[]; /* error message text */
#endif
static int SupGotCtC = 0;
static char **wild_list = (char **)0; /* wild-card file name list */
/*****************************************************************************
@ -298,6 +314,47 @@ So I partially implemented :EG for Unix. :EG can read the "INI", "LIB" and
using a file (ugh) to save the name of the last-file-edited. The file is
stored in /tmp so it gets deleted when the system boots.
*****************************************************************************/
#ifdef LINUX
LONG ZClnEG( /* execute special :EG command */
DEFAULT EGWhat, /* what to get/set/clear: MEM, LIB, etc. */
DEFAULT EGOper, /* operation: get, set or clear */
charptr TxtPtr) /* if setting, value to set */
{
char *cp=NULL; /* environment variable name */
char buf[100]; /* enough for envname + 80 char filename */
LONG retval; /* -1L on success, 0L on failure */
DBGFEN(2,"ZClnEG",NULL);
DBGFEX(2,DbgFNm,"0");
switch (EGWhat) {
case EG_INI: cp = "TEC_INIT"; break;
case EG_LIB: cp = "TEC_LIBRARY"; break;
case EG_MEM: cp = "TEC_MEMORY"; break;
#if VIDEO
case EG_VTE: cp = "TEC_VTEDIT"; break;
#endif
default: return 0L;
}
if (EGOper == GET_VAL) {
if ((cp = getenv(cp)) == NULL) {
retval = 0L; /* return failure */
} else {
retval = -1L; /* success, copy to FBf */
strcpy((char*)FBfBeg, cp);
FBfPtr = FBfBeg + strlen(cp);
}
} else {
strcpy(buf, cp); /* build NAME= */
strcat(buf, "=");
if (EGOper == SET_VAL) { /* concatenate new value */
strcat(buf, (char *)TxtPtr);
}
retval = (putenv(buf) != 0) /* if putenv() failed */
? 0L /* then return failure */
: -1L; /* else return success */
}
return retval;
}
#else /* Not LINUX */
static LONG do_egmem(EGOper,TxtPtr)
DEFAULT EGOper; /* operation: get, set or clear */
charptr TxtPtr; /* if setting, value to set */
@ -379,6 +436,7 @@ charptr TxtPtr; /* if setting, value to set */
DBGFEX(1,DbgFNm,"-1 (success)");
return -1; /* return "success" */
}
#endif
/*****************************************************************************
See the definition of MEMMOVE in ZPORT.H for a description of this
function.
@ -418,8 +476,12 @@ VVOID ZClnUp(VVOID) /* cleanup for TECO-C abort */
DBGFEN(3,"ZClnUp","closing terminal channels and exiting");
#if !CURSES
if (tty_set == TRUE)
#ifdef LINUX
tcsetattr(0, TCSANOW, &out);
#else
ioctl(0, TIOCSETP, &out);
#endif
#endif
}
/*****************************************************************************
ZDoCmd()
@ -749,12 +811,12 @@ current date encoded in the following way:
*****************************************************************************/
DEFAULT ZExCtB() /* return current date */
{
time_t clock;
time_t clockt;
struct tm *time_of_day;
int tecodate;
DBGFEN(1,"ZExCtB","");
clock=time(NULL);
time_of_day=localtime(&clock);
clockt=time(NULL);
time_of_day=localtime(&clockt);
tecodate = ((time_of_day->tm_year)*16+time_of_day->tm_mon+1)*32
+ time_of_day->tm_mday ;
DBGFEX(1,DbgFNm,"PushEx()");
@ -768,12 +830,12 @@ current time encoded in the following way:
*****************************************************************************/
DEFAULT ZExCtH() /* return current time */
{
time_t clock;
time_t clockt;
struct tm *time_of_day;
int tecotime;
DBGFEN(1,"ZExCtH","");
clock=time(NULL);
time_of_day=localtime(&clock);
clockt=time(NULL);
time_of_day=localtime(&clockt);
tecotime = time_of_day->tm_hour * 60 /* hours * 60 */;
tecotime += time_of_day->tm_min; /* minutes */
tecotime *= 30;
@ -1071,7 +1133,8 @@ BOOLEAN RepFNF; /* report "file not found" error? */
charptr dummyp = NULL;
char TmpBfr[FILENAME_MAX];
ptrdiff_t TmpLen = FBfPtr-FBfBeg;
if (strchr(FBfBeg,'.') == NULL) { /* if no dot */
BOOLEAN noDot;
if (noDot = strchr(FBfBeg,'.') == NULL) { /* if no dot */
(void)strcat(FBfBeg,".tec"); /* append .tec */
FBfPtr += 4;
if ((IFiles[IfIndx] = fopen(FBfBeg, "r")) != NULL) {
@ -1090,7 +1153,7 @@ BOOLEAN RepFNF; /* report "file not found" error? */
DBGFEX(1,DbgFNm,"SUCCESS");
return SUCCESS;
}
if (strchr(FBfBeg,'.') == NULL) { /* if no dot */
if (noDot) { /* if no dot */
(void)strcat(FBfBeg,".tec"); /* append .tec */
FBfPtr += 4;
if ((IFiles[IfIndx] = fopen(FBfBeg, "r")) != NULL) {
@ -1239,7 +1302,8 @@ char *argv[];
/*
* execute imbedded command line-parsing macro directly from clpars[]
*/
CStBeg = CBfPtr = clpars; /* command string start */
CStBeg = clpars; /* command string start */
CBfPtr = clpars; /* command string start */
CStEnd = clpars + CLPARS_LEN; /* command string end */
EStTop = EStBot; /* clear expression stack */
ExeCSt(); /* execute command string */
@ -1421,6 +1485,7 @@ int OpCode; /* code for operation */
}
refresh();
#else
#ifndef LINUX // BAD for now, but do we really want this??
if (CrType == UNTERM || tbuf[0] == 0) {/* if unknown terminal type */
return; /* can't do screen operations */
}
@ -1434,6 +1499,7 @@ int OpCode; /* code for operation */
case SCR_RON: tputs(so, 1, ZDspCh);
}
#endif
#endif
}
/*****************************************************************************
ZSetTT()
@ -1527,12 +1593,21 @@ static void sighup()
*/
static void sigstop()
{
#ifdef LINUX
tcsetattr(0, TCSANOW, &out);
puts("[Suspending...]\r\n");
kill(getpid(), SIGSTOP);
puts("[Resuming...]\r\n");
tcsetattr(0, TCSANOW, &cur);
#else
ioctl(0, TIOCSETP, &out);
puts("[Suspending...]\r\n");
kill(getpid(), SIGSTOP);
puts("[Resuming...]\r\n");
ioctl(0, TIOCSETP, &cur);
#endif
}
#ifndef LINUX
/*
* xtgetstr() - just like tgetstr() except it returns "" instead of
* NULL if the tgetstr() fails. As in tcsh 5.18.
@ -1547,6 +1622,7 @@ char **a;
return r;
}
#endif
#endif
/*
* ZTrmnl - set up terminal modes
*/
@ -1569,9 +1645,15 @@ VVOID ZTrmnl() /* set up I/O to the terminal */
* get terminal characteristics and set some signals
*/
#if !CURSES
#ifdef LINUX
if (tcgetattr(0, &out) != -1)
tty_set = TRUE; /* tell ZClnUp to clean up */
tcgetattr(0, &cur);
#else
if (ioctl(0, TIOCGETP, &out) != -1)
tty_set = TRUE; /* tell ZClnUp to clean up */
ioctl(0, TIOCGETP, &cur);
#endif
#ifdef SIGTSTP
signal(SIGTSTP, sigstop); /* call sigstop on stop (control-Z) */
#endif
@ -1591,11 +1673,19 @@ VVOID ZTrmnl() /* set up I/O to the terminal */
nonl(); /* don't add CRs to NEWLINEs (CRMOD) */
curwin = stdscr;
ScopeFlg = 0; /* not writing in scope */
#else /* NOT CURSES */
#ifdef LINUX
cur.c_lflag &= ~ICANON;
cur.c_lflag &= ~ECHO;
cur.c_oflag &= ~ONLCR;
cur.c_iflag &= ~(ICRNL | INLCR);
tcsetattr(0, TCSANOW, &cur);
#else
cur.sg_flags |= CBREAK; /* don't wait for CRs (CBREAK) */
cur.sg_flags &= ~ECHO; /* don't echo characters (ECHO) */
cur.sg_flags &= ~CRMOD; /* don't add CRs to NEWLINEs (CRMOD) */
ioctl(0, TIOCSETP, &cur); /* set the new modes */
#endif
#endif
signal(SIGINT, CntrlC); /* call CntrlC on interrupt */
signal(SIGHUP, sighup); /* call sighup on hang up */
@ -1605,6 +1695,8 @@ VVOID ZTrmnl() /* set up I/O to the terminal */
*/
#if !CURSES
tbuf[0] = 0;
#ifdef LINUX // BAD for now but do we really want this??
#else
if ((ta = getenv("TERM")) == NULL) { /* get terminal type */
ta = "dumb";
}
@ -1614,6 +1706,7 @@ VVOID ZTrmnl() /* set up I/O to the terminal */
se = xtgetstr("se",&ta); /* end standout mode (rev. video) */
so = xtgetstr("so",&ta); /* begin standout mode */
up = xtgetstr("up",&ta); /* cursor up */
#endif
#endif
CrType = VT102; /* Let's pretend we are a VT102
even though we are really using
@ -1688,7 +1781,7 @@ charptr BfrEnd; /* address of output buffer end */
BfrPtr--;
}
}
if (fputc(*BfrPtr, OFiles[OfIndx].OStrem) == EOF) {
if (putc(*BfrPtr, OFiles[OfIndx].OStrem) == EOF) {
ZErMsg();
ErrMsg(ERR_UWL);
DBGFEX(2,DbgFNm,"FAILURE");
@ -1986,7 +2079,7 @@ register char *s, *p;
case '[':
ok = 0;
lc = 077777;
while (cc = *p++) {
while ((cc = *p++) != 0) {
if (cc == ']') {
if (ok)
break;
@ -2076,12 +2169,21 @@ char *pattern;
return;
goto p_err2;
}
#ifdef LINUX
if (fstat(dirfd(dirp), &stb) < 0)
goto p_err1;
if (!isdir(stb)) {
errno = ENOTDIR;
goto p_err1;
}
#else
if (fstat(dirp->dd_fd, &stb) < 0)
goto p_err1;
if (!isdir(stb)) {
errno = ENOTDIR;
goto p_err1;
}
#endif
while ((dp = readdir(dirp)) != NULL) {
if (dp->d_ino == 0)
continue;

2153
src/zwin32.c 100644

File diff suppressed because it is too large Load Diff