Restore video mode for Linux & Mac
Various other bug and speed improvements Documentation enhancementsmain
parent
0e17d45276
commit
2e7ac11277
|
@ -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.
|
|
@ -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.
|
|
@ -39,6 +39,6 @@ mung link to tecoc
|
||||||
teco link to tecoc
|
teco link to tecoc
|
||||||
Inspect link to tecoc
|
Inspect link to tecoc
|
||||||
lib:
|
lib:
|
||||||
*.tes *.tec TECO macros
|
*.tes TECO command files for various things
|
||||||
src:
|
*.tec Compressed TECO command files
|
||||||
Full source files for Linux version
|
src: Full source files
|
||||||
|
|
|
@ -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)
|
10
src/genclp.c
10
src/genclp.c
|
@ -36,7 +36,11 @@ open_clpars_tec(ifile)
|
||||||
FILE **ifile;
|
FILE **ifile;
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
#ifdef MSDOS
|
||||||
|
*ifile = fopen("clpars.tec","rb");
|
||||||
|
#else
|
||||||
*ifile = fopen("clpars.tec","r");
|
*ifile = fopen("clpars.tec","r");
|
||||||
|
#endif
|
||||||
if (*ifile == NULL)
|
if (*ifile == NULL)
|
||||||
{
|
{
|
||||||
puts("genclp: Unable to open file CLPARS.TEC for reading");
|
puts("genclp: Unable to open file CLPARS.TEC for reading");
|
||||||
|
@ -52,7 +56,11 @@ open_clpars_h(ofile)
|
||||||
FILE **ofile;
|
FILE **ofile;
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
#ifdef MSDOS
|
||||||
|
*ofile = fopen("clpars.h","wt");
|
||||||
|
#else
|
||||||
*ofile = fopen("clpars.h","w");
|
*ofile = fopen("clpars.h","w");
|
||||||
|
#endif
|
||||||
if (*ofile == NULL)
|
if (*ofile == NULL)
|
||||||
{
|
{
|
||||||
puts("genclp: Unable to open file CLPARS.C for writing");
|
puts("genclp: Unable to open file CLPARS.C for writing");
|
||||||
|
@ -206,7 +214,7 @@ main()
|
||||||
open_clpars_tec(&ifile);
|
open_clpars_tec(&ifile);
|
||||||
write_header(ofile);
|
write_header(ofile);
|
||||||
write_line("#if USE_ANSI_CLPARS\n", 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);
|
cnvrt(ifile, ofile, TRUE);
|
||||||
close_clpars_tec(ifile);
|
close_clpars_tec(ifile);
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -2,27 +2,41 @@
|
||||||
# This makefile builds TECOC on Linux
|
# This makefile builds TECOC on Linux
|
||||||
# Before running it, inspect the lines between here and the line containing
|
# Before running it, inspect the lines between here and the line containing
|
||||||
# all #'s to select the way you want TECO-C built.
|
# all #'s to select the way you want TECO-C built.
|
||||||
|
|
||||||
# If you want to compile with built-in debugging support, uncomment the
|
# If you want to compile with built-in debugging support, uncomment the
|
||||||
# following line. When debugging is compiled in, the control-P command
|
# 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
|
# 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
|
# 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
|
# makes TECO-C larger and a little slower, so you should only use this
|
||||||
# when you're debugging TECO-C.
|
# when you're debugging TECO-C.
|
||||||
|
|
||||||
#DEBG = -DDEBUGGING
|
#DEBG = -DDEBUGGING
|
||||||
|
|
||||||
# If you're debugging TECO-C, use this option to compile in a consistency
|
# If you're debugging TECO-C, use this option to compile in a consistency
|
||||||
# checking function called after each command executes. The function checks
|
# checking function called after each command executes. The function checks
|
||||||
# the sanity of TECO-C's internal variables. This obviously slows things
|
# the sanity of TECO-C's internal variables. This obviously slows things
|
||||||
# down a little.
|
# down a little.
|
||||||
|
|
||||||
#CCHEK = -DCONSISTENCY_CHECKING
|
#CCHEK = -DCONSISTENCY_CHECKING
|
||||||
|
|
||||||
# If you want to use gcc, uncomment the following lines, which override the
|
# 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
|
# COMPILE.c macro so it doesn't stick in the -target option, which gcc
|
||||||
# doesn't understand.
|
# doesn't understand.
|
||||||
|
|
||||||
CC= gcc
|
CC= gcc
|
||||||
#CFLAGS= ${OSVERS} ${DEBG} ${CCHEK} -O -Wall -Wshadow -Wpointer-arith -Wcast-qual -DLINUX
|
|
||||||
CFLAGS= ${OSVERS} ${DEBG} ${CCHEK} -O -DLINUX
|
# Uncomment the following line for non-video teco
|
||||||
#TERMOBJS = -ltermcap
|
#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
|
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) -c -g
|
||||||
|
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
|
||||||
CFILES= baksrc.c bldstr.c clenup.c cmatch.c docjr.c doeves.c doflag.c \
|
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 \
|
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 \
|
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 \
|
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 \
|
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
|
tabort.c typbuf.c typest.c uminus.c wrpage.c zfrsrc.c zlinux.c
|
||||||
|
|
||||||
OBJECTS= $(CFILES:.c=.o)
|
OBJECTS= $(CFILES:.c=.o)
|
||||||
|
|
||||||
tecoc: tecoc.o ${OBJECTS}
|
tecoc: tecoc.o ${OBJECTS}
|
||||||
${LINK.c} -s -o $@ tecoc.o ${OBJECTS} ${TERMOBJS}
|
${LINK.c} -s -o $@ tecoc.o ${OBJECTS} ${TERMOBJS}
|
||||||
|
|
||||||
tecoc.o: tecoc.c zport.h tecoc.h deferr.h dchars.h chmacs.h
|
tecoc.o: tecoc.c zport.h tecoc.h deferr.h dchars.h chmacs.h
|
||||||
|
|
||||||
clpars.h: genclp clpars.tec
|
clpars.h: genclp clpars.tec
|
||||||
genclp
|
./genclp
|
||||||
|
|
||||||
genclp: genclp.o
|
genclp: genclp.o
|
||||||
${LINK.c} -o $@ genclp.o
|
${LINK.c} -o $@ genclp.o
|
||||||
|
|
||||||
genclp.o: genclp.c
|
genclp.o: genclp.c
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@for i in makedep? ${OBJECTS} ; do \
|
@for i in makedep? ${OBJECTS} ; do \
|
||||||
if [ -f $$i ] ; then rm $$i ; fi ; \
|
if [ -f $$i ] ; then rm $$i ; fi ; \
|
||||||
done
|
done
|
||||||
rm -f tecoc tecoc.o core
|
rm -f tecoc tecoc.o core genclp.o genclp clpars.h *.tmp *~ *.bak
|
||||||
|
|
||||||
tags:
|
tags:
|
||||||
etags *.c *.h
|
etags *.c *.h
|
||||||
|
|
||||||
lint:
|
lint:
|
||||||
# b = report unreachable break statements
|
# b = report unreachable break statements
|
||||||
# c = complain about casts with questionable portability
|
# c = complain about casts with questionable portability
|
||||||
# h = apply heuristic tests
|
# h = apply heuristic tests
|
||||||
# x = report unused externs
|
# x = report unused externs
|
||||||
lint -bchx -DSUNOS4_0 tecoc.c ${CFILES}
|
lint -bchx -DSUNOS4_0 tecoc.c ${CFILES}
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Invoking this target (with "make depend") causes a new version of this
|
# 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
|
# 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
|
# "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.
|
# DELETE" line will be replaced with a new set of dependency rules.
|
||||||
#
|
#
|
||||||
|
|
||||||
depend: makedep
|
depend: makedep
|
||||||
@echo '/^# DO NOT DELETE THIS LINE/+1,$$d' >makedep0
|
@echo '/^# DO NOT DELETE THIS LINE/+1,$$d' >makedep0
|
||||||
@echo '$$r makedep5' >>makedep0
|
@echo '$$r makedep5' >>makedep0
|
||||||
|
@ -75,6 +101,7 @@ depend: makedep
|
||||||
@ed - makefile < makedep0
|
@ed - makefile < makedep0
|
||||||
@rm makedep?
|
@rm makedep?
|
||||||
@echo "new version of makefile generated, old version in makefile.bak"
|
@echo "new version of makefile generated, old version in makefile.bak"
|
||||||
|
|
||||||
makedep: FRC
|
makedep: FRC
|
||||||
@cat /dev/null >makedep5
|
@cat /dev/null >makedep5
|
||||||
@echo "generating include file dependency list..."
|
@echo "generating include file dependency list..."
|
||||||
|
@ -100,6 +127,8 @@ makedep: FRC
|
||||||
@cat makedepe
|
@cat makedepe
|
||||||
@(if [ -s makedepe ]; then false; fi)
|
@(if [ -s makedepe ]; then false; fi)
|
||||||
FRC:
|
FRC:
|
||||||
|
|
||||||
|
|
||||||
# DO NOT DELETE THIS LINE -- make depend uses it
|
# 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
|
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
|
bldstr.o: bldstr.c zport.h tecoc.h defext.h deferr.h dchars.h chmacs.h
|
|
@ -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
|
# Before running it, inspect the lines between here and the line containing
|
||||||
# all #'s to select the way you want TECO-C built.
|
# all #'s to select the way you want TECO-C built.
|
||||||
|
|
||||||
# If you want to compile with built-in debugging support, uncomment the
|
# If you want to compile with built-in debugging support, uncomment the
|
||||||
# following line. When debugging is compiled in, the control-P command
|
# 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
|
# 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
|
# 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
|
# makes TECO-C larger and a little slower, so you should only use this
|
||||||
# when you're debugging TECO-C.
|
# when you're debugging TECO-C.
|
||||||
|
|
||||||
#DEBG = -DDEBUGGING
|
#DEBG = -DDEBUGGING
|
||||||
|
|
||||||
# If you're debugging TECO-C, use this option to compile in a consistency
|
# If you're debugging TECO-C, use this option to compile in a consistency
|
||||||
# checking function called after each command executes. The function checks
|
# checking function called after each command executes. The function checks
|
||||||
# the sanity of TECO-C's internal variables. This obviously slows things
|
# the sanity of TECO-C's internal variables. This obviously slows things
|
||||||
# down a little.
|
# down a little.
|
||||||
|
|
||||||
#CCHEK = -DCONSISTENCY_CHECKING
|
#CCHEK = -DCONSISTENCY_CHECKING
|
||||||
|
|
||||||
# If you want to use gcc, uncomment the following lines, which override the
|
# 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
|
# COMPILE.c macro so it doesn't stick in the -target option, which gcc
|
||||||
# doesn't understand.
|
# doesn't understand.
|
||||||
|
|
||||||
CC= gcc
|
CC= gcc
|
||||||
#CFLAGS= ${OSVERS} ${DEBG} ${CCHEK} -O -Wall -Wshadow -Wpointer-arith -Wcast-qual -DLINUX
|
|
||||||
CFLAGS= ${OSVERS} ${DEBG} ${CCHEK} -O -DOSX
|
# Uncomment the following line for non-video teco
|
||||||
#TERMOBJS = -ltermcap
|
#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
|
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) -c -g
|
||||||
|
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
|
||||||
CFILES= baksrc.c bldstr.c clenup.c cmatch.c docjr.c doeves.c doflag.c \
|
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 \
|
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 \
|
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 \
|
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 \
|
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
|
tabort.c typbuf.c typest.c uminus.c wrpage.c zfrsrc.c zosx.c
|
||||||
|
|
||||||
OBJECTS= $(CFILES:.c=.o)
|
OBJECTS= $(CFILES:.c=.o)
|
||||||
|
|
||||||
tecoc: tecoc.o ${OBJECTS}
|
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
|
tecoc.o: tecoc.c zport.h tecoc.h deferr.h dchars.h chmacs.h
|
||||||
|
|
||||||
clpars.h: genclp clpars.tec
|
clpars.h: genclp clpars.tec
|
||||||
./genclp
|
./genclp
|
||||||
|
|
||||||
genclp: genclp.o
|
genclp: genclp.o
|
||||||
${LINK.c} -o $@ genclp.o
|
${LINK.c} -o $@ genclp.o
|
||||||
|
|
||||||
genclp.o: genclp.c
|
genclp.o: genclp.c
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@for i in makedep? ${OBJECTS} ; do \
|
@for i in makedep? ${OBJECTS} ; do \
|
||||||
if [ -f $$i ] ; then rm $$i ; fi ; \
|
if [ -f $$i ] ; then rm $$i ; fi ; \
|
||||||
done
|
done
|
||||||
rm -f tecoc tecoc.o core
|
rm -f tecoc tecoc.o core genclp.o genclp clpars.h *.tmp *~ *.bak
|
||||||
|
|
||||||
tags:
|
tags:
|
||||||
etags *.c *.h
|
etags *.c *.h
|
||||||
|
|
||||||
lint:
|
lint:
|
||||||
# b = report unreachable break statements
|
# b = report unreachable break statements
|
||||||
# c = complain about casts with questionable portability
|
# c = complain about casts with questionable portability
|
||||||
# h = apply heuristic tests
|
# h = apply heuristic tests
|
||||||
# x = report unused externs
|
# x = report unused externs
|
||||||
lint -bchx -DSUNOS4_0 tecoc.c ${CFILES}
|
lint -bchx -DSUNOS4_0 tecoc.c ${CFILES}
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Invoking this target (with "make depend") causes a new version of this
|
# 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
|
# 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
|
# "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.
|
# DELETE" line will be replaced with a new set of dependency rules.
|
||||||
#
|
#
|
||||||
|
|
||||||
depend: makedep
|
depend: makedep
|
||||||
@echo '/^# DO NOT DELETE THIS LINE/+1,$$d' >makedep0
|
@echo '/^# DO NOT DELETE THIS LINE/+1,$$d' >makedep0
|
||||||
@echo '$$r makedep5' >>makedep0
|
@echo '$$r makedep5' >>makedep0
|
||||||
|
@ -75,6 +101,7 @@ depend: makedep
|
||||||
@ed - makefile < makedep0
|
@ed - makefile < makedep0
|
||||||
@rm makedep?
|
@rm makedep?
|
||||||
@echo "new version of makefile generated, old version in makefile.bak"
|
@echo "new version of makefile generated, old version in makefile.bak"
|
||||||
|
|
||||||
makedep: FRC
|
makedep: FRC
|
||||||
@cat /dev/null >makedep5
|
@cat /dev/null >makedep5
|
||||||
@echo "generating include file dependency list..."
|
@echo "generating include file dependency list..."
|
||||||
|
@ -100,6 +127,8 @@ makedep: FRC
|
||||||
@cat makedepe
|
@cat makedepe
|
||||||
@(if [ -s makedepe ]; then false; fi)
|
@(if [ -s makedepe ]; then false; fi)
|
||||||
FRC:
|
FRC:
|
||||||
|
|
||||||
|
|
||||||
# DO NOT DELETE THIS LINE -- make depend uses it
|
# 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
|
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
|
bldstr.o: bldstr.c zport.h tecoc.h defext.h deferr.h dchars.h chmacs.h
|
||||||
|
|
872
src/zlinux.c
872
src/zlinux.c
File diff suppressed because it is too large
Load Diff
|
@ -17,6 +17,7 @@
|
||||||
#include <string.h> /* prototypes for strlen(), strcat(), ... */
|
#include <string.h> /* prototypes for strlen(), strcat(), ... */
|
||||||
#include <utime.h> /* prototype for utime() */
|
#include <utime.h> /* prototype for utime() */
|
||||||
#include <sys/stat.h> /* prototype for stat() */
|
#include <sys/stat.h> /* prototype for stat() */
|
||||||
|
#include <malloc.h>
|
||||||
|
|
||||||
#include "zport.h" /* define portability identifiers */
|
#include "zport.h" /* define portability identifiers */
|
||||||
#include "tecoc.h" /* define general identifiers */
|
#include "tecoc.h" /* define general identifiers */
|
||||||
|
|
804
src/zosx.c
804
src/zosx.c
|
@ -1,6 +1,6 @@
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
ZLinux.c
|
zosx.c
|
||||||
System dependent code for Linux
|
System dependent code for Mac OS X
|
||||||
This is based on zunix.c, with changes (see comments "TAA")
|
This is based on zunix.c, with changes (see comments "TAA")
|
||||||
for enhanced functionality.
|
for enhanced functionality.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
@ -24,6 +24,9 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#include <glob.h> /* Rewritten 05/04 by TAA to use glob function */
|
#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 "zport.h" /* define portability identifiers */
|
||||||
#include "tecoc.h" /* define general identifiers */
|
#include "tecoc.h" /* define general identifiers */
|
||||||
#include "chmacs.h" /* define character processing macros */
|
#include "chmacs.h" /* define character processing macros */
|
||||||
|
@ -32,6 +35,62 @@
|
||||||
#include "deferr.h" /* define identifiers for error messages */
|
#include "deferr.h" /* define identifiers for error messages */
|
||||||
#include "defext.h" /* define external global variables */
|
#include "defext.h" /* define external global variables */
|
||||||
#include "dscren.h" /* define identifiers for screen i/o */
|
#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 BOOLEAN tty_set = FALSE; /* Has the terminal been set? */
|
||||||
static struct termios out, cur; /* terminal characteristics buffers */
|
static struct termios out, cur; /* terminal characteristics buffers */
|
||||||
static char tbuf[1024]; /* store TERMCAP entry here */
|
static char tbuf[1024]; /* store TERMCAP entry here */
|
||||||
|
@ -104,7 +163,14 @@ this function controls the signal generator directly.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
VVOID ZBell(VVOID)
|
VVOID ZBell(VVOID)
|
||||||
{
|
{
|
||||||
|
#if CURSES
|
||||||
|
if (EzFlag & EZ_AUDIO_BEEP)
|
||||||
|
beep(); /* audio beep */
|
||||||
|
else
|
||||||
|
flash(); /* visible flash */
|
||||||
|
#else
|
||||||
ZDspCh('\7');
|
ZDspCh('\7');
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
ZChIn()
|
ZChIn()
|
||||||
|
@ -132,7 +198,11 @@ BOOLEAN NoWait; /* return immediately? */
|
||||||
LastLF = FALSE;
|
LastLF = FALSE;
|
||||||
return (DEFAULT)LINEFD;
|
return (DEFAULT)LINEFD;
|
||||||
}
|
}
|
||||||
|
#if CURSES
|
||||||
|
if ((Charac = getch()) == ERR) {
|
||||||
|
#else
|
||||||
if (read(fileno(stdin), &Charac, 1) != 1) {
|
if (read(fileno(stdin), &Charac, 1) != 1) {
|
||||||
|
#endif
|
||||||
if (GotCtC || SupGotCtC)
|
if (GotCtC || SupGotCtC)
|
||||||
return (DEFAULT)CTRL_C;
|
return (DEFAULT)CTRL_C;
|
||||||
if (!GotCtC) {
|
if (!GotCtC) {
|
||||||
|
@ -269,8 +339,14 @@ voidptr cp;
|
||||||
VVOID ZClnUp(VVOID) /* cleanup for TECO-C abort */
|
VVOID ZClnUp(VVOID) /* cleanup for TECO-C abort */
|
||||||
{
|
{
|
||||||
DBGFEN(3,"ZClnUp","closing terminal channels and exiting");
|
DBGFEN(3,"ZClnUp","closing terminal channels and exiting");
|
||||||
|
#if !CURSES
|
||||||
if (tty_set == TRUE)
|
if (tty_set == TRUE)
|
||||||
|
#ifdef LINUX
|
||||||
tcsetattr(0, TCSANOW, &out);
|
tcsetattr(0, TCSANOW, &out);
|
||||||
|
#else
|
||||||
|
ioctl(0, TIOCSETP, &out);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
ZDoCmd()
|
ZDoCmd()
|
||||||
|
@ -303,6 +379,242 @@ VVOID ZDoCmd(charptr GBfBeg, charptr GBfPtr) /* die and pass command to OS */
|
||||||
(void)perror ("");
|
(void)perror ("");
|
||||||
ZExit (EXIT_SUCCESS);
|
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()
|
ZDspBf()
|
||||||
This function displays a buffer of a given length on the terminal
|
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;
|
charptr buffer;
|
||||||
SIZE_T length;
|
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) {
|
if (write(fileno(stdout), buffer, length) == -1) {
|
||||||
puts("Unable to write to terminal in function ZDspBf");
|
puts("Unable to write to terminal in function ZDspBf");
|
||||||
TAbort(EXIT_FAILURE);
|
TAbort(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
ZDspCh()
|
ZDspCh()
|
||||||
|
@ -330,10 +659,14 @@ SIZE_T length;
|
||||||
VVOID ZDspCh(Charac) /* output a character to terminal */
|
VVOID ZDspCh(Charac) /* output a character to terminal */
|
||||||
char Charac;
|
char Charac;
|
||||||
{
|
{
|
||||||
|
#if CURSES
|
||||||
|
zaddch(Charac,1);
|
||||||
|
#else
|
||||||
if (write(fileno(stdout), &Charac, 1) == -1) {
|
if (write(fileno(stdout), &Charac, 1) == -1) {
|
||||||
puts("Unable to write to terminal in function ZDspCh");
|
puts("Unable to write to terminal in function ZDspCh");
|
||||||
TAbort(EXIT_FAILURE);
|
TAbort(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
ZExCtB()
|
ZExCtB()
|
||||||
|
@ -420,6 +753,11 @@ DEFAULT ZExeEJ() /* execute an EJ command */
|
||||||
VVOID ZExit(estat) /* terminate TECO-C */
|
VVOID ZExit(estat) /* terminate TECO-C */
|
||||||
DEFAULT estat;
|
DEFAULT estat;
|
||||||
{
|
{
|
||||||
|
#if CURSES
|
||||||
|
nodelay(stdscr,FALSE); /* to avoid a bug in some System V.2 */
|
||||||
|
/* releases of curses */
|
||||||
|
endwin();
|
||||||
|
#endif
|
||||||
ZClnUp();
|
ZClnUp();
|
||||||
exit(estat);
|
exit(estat);
|
||||||
}
|
}
|
||||||
|
@ -670,7 +1008,8 @@ BOOLEAN RepFNF; /* report "file not found" error? */
|
||||||
charptr dummyp = NULL;
|
charptr dummyp = NULL;
|
||||||
char TmpBfr[FILENAME_MAX];
|
char TmpBfr[FILENAME_MAX];
|
||||||
ptrdiff_t TmpLen = FBfPtr-FBfBeg;
|
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 */
|
(void)strcat(FBfBeg,".tec"); /* append .tec */
|
||||||
FBfPtr += 4;
|
FBfPtr += 4;
|
||||||
if ((IFiles[IfIndx] = fopen(FBfBeg, "r")) != NULL) {
|
if ((IFiles[IfIndx] = fopen(FBfBeg, "r")) != NULL) {
|
||||||
|
@ -691,7 +1030,7 @@ BOOLEAN RepFNF; /* report "file not found" error? */
|
||||||
IFisCR[IfIndx] = 0;
|
IFisCR[IfIndx] = 0;
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
if (strchr(FBfBeg,'.') == NULL) { /* if no dot */
|
if (noDot) { /* if no dot */
|
||||||
(void)strcat(FBfBeg,".tec"); /* append .tec */
|
(void)strcat(FBfBeg,".tec"); /* append .tec */
|
||||||
FBfPtr += 4;
|
FBfPtr += 4;
|
||||||
if ((IFiles[IfIndx] = fopen(FBfBeg, "r")) != NULL) {
|
if ((IFiles[IfIndx] = fopen(FBfBeg, "r")) != NULL) {
|
||||||
|
@ -1044,6 +1383,21 @@ DEFAULT *retlen; /* returned length of string */
|
||||||
VVOID ZScrOp(OpCode) /* do a screen operation */
|
VVOID ZScrOp(OpCode) /* do a screen operation */
|
||||||
int OpCode; /* code for 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 */
|
// if (CrType == UNTERM || tbuf[0] == 0) {/* if unknown terminal type */
|
||||||
// return; /* can't do screen operations */
|
// return; /* can't do screen operations */
|
||||||
// }
|
// }
|
||||||
|
@ -1164,46 +1518,85 @@ static void sigstop()
|
||||||
VVOID ZTrmnl() /* set up I/O to the terminal */
|
VVOID ZTrmnl() /* set up I/O to the terminal */
|
||||||
{
|
{
|
||||||
EtFlag = ET_READ_LOWER | /* guess: term has lowercase and */
|
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_EIGHTBIT | /* terminal uses 8-bit characters */
|
||||||
ET_SCOPE; /* it's a scope, not hardcopy */
|
ET_SCOPE; /* it's a scope, not hardcopy */
|
||||||
EzFlag = EZ_NO_VER | /* don't do VMS-style file versions */
|
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 */
|
EZ_INVCR; /* don't show little c/r characters */
|
||||||
/*
|
/*
|
||||||
* get terminal characteristics and set some signals
|
* get terminal characteristics and set some signals
|
||||||
*/
|
*/
|
||||||
|
#if !CURSES
|
||||||
if (tcgetattr(0, &out) != -1)
|
if (tcgetattr(0, &out) != -1)
|
||||||
tty_set = TRUE; /* tell ZClnUp to clean up */
|
tty_set = TRUE; /* tell ZClnUp to clean up */
|
||||||
tcgetattr(0, &cur);
|
tcgetattr(0, &cur);
|
||||||
#ifdef SIGTSTP
|
#ifdef SIGTSTP
|
||||||
signal(SIGTSTP, sigstop); /* call sigstop on stop (control-Z) */
|
signal(SIGTSTP, sigstop); /* call sigstop on stop (control-Z) */
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
* set CBREAK/noECHO/noCRMOD
|
* 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 &= ~ICANON;
|
||||||
cur.c_lflag &= ~ECHO;
|
cur.c_lflag &= ~ECHO;
|
||||||
cur.c_oflag &= ~ONLCR;
|
cur.c_oflag &= ~ONLCR;
|
||||||
cur.c_iflag &= ~(ICRNL | INLCR);
|
cur.c_iflag &= ~(ICRNL | INLCR);
|
||||||
tcsetattr(0, TCSANOW, &cur);
|
tcsetattr(0, TCSANOW, &cur);
|
||||||
|
#endif
|
||||||
signal(SIGINT, CntrlC); /* call CntrlC on interrupt */
|
signal(SIGINT, CntrlC); /* call CntrlC on interrupt */
|
||||||
signal(SIGHUP, sighup); /* call sighup on hang up */
|
signal(SIGHUP, sighup); /* call sighup on hang up */
|
||||||
siginterrupt(SIGINT, 1);
|
siginterrupt(SIGINT, 1);
|
||||||
/*
|
/*
|
||||||
* set up termcap stuff
|
* 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
|
CrType = VT102; /* Let's pretend we are a VT102
|
||||||
even though we are really using
|
even though we are really using
|
||||||
termcap! */
|
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()
|
ZVrbos()
|
||||||
|
@ -1262,7 +1655,7 @@ charptr BfrEnd; /* address of output buffer end */
|
||||||
BfrPtr--;
|
BfrPtr--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fputc(*BfrPtr, OFiles[OfIndx].OStrem) == EOF) {
|
if (putc(*BfrPtr, OFiles[OfIndx].OStrem) == EOF) {
|
||||||
ZErMsg();
|
ZErMsg();
|
||||||
ErrMsg(ERR_UWL);
|
ErrMsg(ERR_UWL);
|
||||||
DBGFEX(2,DbgFNm,"FAILURE");
|
DBGFEX(2,DbgFNm,"FAILURE");
|
||||||
|
@ -1353,3 +1746,384 @@ char *target;
|
||||||
closedir(dirp);
|
closedir(dirp);
|
||||||
return (found) ? maxver : -2;
|
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
|
||||||
|
|
124
src/zunix.c
124
src/zunix.c
|
@ -34,6 +34,12 @@
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
#ifdef LINUX
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#endif
|
||||||
#if CURSES
|
#if CURSES
|
||||||
#include <curses.h> /* has to come before zport.h */
|
#include <curses.h> /* has to come before zport.h */
|
||||||
#endif
|
#endif
|
||||||
|
@ -85,9 +91,14 @@ unsigned char *pscope_start;
|
||||||
#define LB ((EzFlag & EZ_VT100GRAPHICS) ? ACS_LLCORNER : '[')
|
#define LB ((EzFlag & EZ_VT100GRAPHICS) ? ACS_LLCORNER : '[')
|
||||||
#define RB ((EzFlag & EZ_VT100GRAPHICS) ? ACS_LRCORNER : ']')
|
#define RB ((EzFlag & EZ_VT100GRAPHICS) ? ACS_LRCORNER : ']')
|
||||||
#else /* else (not CURSES) ----------------------*/
|
#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. */
|
#include <sgtty.h> /* define CBREAK, ECHO, TIOCGETP, etc. */
|
||||||
static BOOLEAN tty_set = FALSE; /* Has the terminal been set? */
|
static BOOLEAN tty_set = FALSE; /* Has the terminal been set? */
|
||||||
static struct sgttyb out, cur; /* terminal characteristics buffers */
|
static struct sgttyb out, cur; /* terminal characteristics buffers */
|
||||||
|
#endif
|
||||||
static char tbuf[1024]; /* store TERMCAP entry here */
|
static char tbuf[1024]; /* store TERMCAP entry here */
|
||||||
static char tarea[1024]; /* store decoded TERMCAP stuff here */
|
static char tarea[1024]; /* store decoded TERMCAP stuff here */
|
||||||
static char *ce; /* TERMCAP sequence: clear to end-of-line */
|
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 */
|
int tgetent(); /* load a terminal capability buffer */
|
||||||
char *tgetstr(); /* get str value of a terminal capability */
|
char *tgetstr(); /* get str value of a terminal capability */
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef LINUX
|
||||||
|
#else
|
||||||
int access(); /* determine accessibility of a file */
|
int access(); /* determine accessibility of a file */
|
||||||
int atoi(); /* convert ASCII digits to inary integer */
|
int atoi(); /* convert ASCII digits to inary integer */
|
||||||
int execlp(); /* terminate and execute a system command */
|
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 time(); /* get current time */
|
||||||
int unlink(); /* remove link to file (delete the file) */
|
int unlink(); /* remove link to file (delete the file) */
|
||||||
int write(); /* write to a file */
|
int write(); /* write to a file */
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
* The SunOS 4.0 system include files don't have declarations for some
|
* 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
|
* 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 vernum(); /* see bottom of this file */
|
||||||
static int movefile(); /* see bottom of this file */
|
static int movefile(); /* see bottom of this file */
|
||||||
extern int sys_nerr; /* number of system error messages */
|
extern int sys_nerr; /* number of system error messages */
|
||||||
|
#ifndef LINUX
|
||||||
extern char *sys_errlist[]; /* error message text */
|
extern char *sys_errlist[]; /* error message text */
|
||||||
|
#endif
|
||||||
static int SupGotCtC = 0;
|
static int SupGotCtC = 0;
|
||||||
static char **wild_list = (char **)0; /* wild-card file name list */
|
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
|
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.
|
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)
|
static LONG do_egmem(EGOper,TxtPtr)
|
||||||
DEFAULT EGOper; /* operation: get, set or clear */
|
DEFAULT EGOper; /* operation: get, set or clear */
|
||||||
charptr TxtPtr; /* if setting, value to set */
|
charptr TxtPtr; /* if setting, value to set */
|
||||||
|
@ -379,6 +436,7 @@ charptr TxtPtr; /* if setting, value to set */
|
||||||
DBGFEX(1,DbgFNm,"-1 (success)");
|
DBGFEX(1,DbgFNm,"-1 (success)");
|
||||||
return -1; /* return "success" */
|
return -1; /* return "success" */
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
See the definition of MEMMOVE in ZPORT.H for a description of this
|
See the definition of MEMMOVE in ZPORT.H for a description of this
|
||||||
function.
|
function.
|
||||||
|
@ -418,8 +476,12 @@ VVOID ZClnUp(VVOID) /* cleanup for TECO-C abort */
|
||||||
DBGFEN(3,"ZClnUp","closing terminal channels and exiting");
|
DBGFEN(3,"ZClnUp","closing terminal channels and exiting");
|
||||||
#if !CURSES
|
#if !CURSES
|
||||||
if (tty_set == TRUE)
|
if (tty_set == TRUE)
|
||||||
|
#ifdef LINUX
|
||||||
|
tcsetattr(0, TCSANOW, &out);
|
||||||
|
#else
|
||||||
ioctl(0, TIOCSETP, &out);
|
ioctl(0, TIOCSETP, &out);
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
ZDoCmd()
|
ZDoCmd()
|
||||||
|
@ -749,12 +811,12 @@ current date encoded in the following way:
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
DEFAULT ZExCtB() /* return current date */
|
DEFAULT ZExCtB() /* return current date */
|
||||||
{
|
{
|
||||||
time_t clock;
|
time_t clockt;
|
||||||
struct tm *time_of_day;
|
struct tm *time_of_day;
|
||||||
int tecodate;
|
int tecodate;
|
||||||
DBGFEN(1,"ZExCtB","");
|
DBGFEN(1,"ZExCtB","");
|
||||||
clock=time(NULL);
|
clockt=time(NULL);
|
||||||
time_of_day=localtime(&clock);
|
time_of_day=localtime(&clockt);
|
||||||
tecodate = ((time_of_day->tm_year)*16+time_of_day->tm_mon+1)*32
|
tecodate = ((time_of_day->tm_year)*16+time_of_day->tm_mon+1)*32
|
||||||
+ time_of_day->tm_mday ;
|
+ time_of_day->tm_mday ;
|
||||||
DBGFEX(1,DbgFNm,"PushEx()");
|
DBGFEX(1,DbgFNm,"PushEx()");
|
||||||
|
@ -768,12 +830,12 @@ current time encoded in the following way:
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
DEFAULT ZExCtH() /* return current time */
|
DEFAULT ZExCtH() /* return current time */
|
||||||
{
|
{
|
||||||
time_t clock;
|
time_t clockt;
|
||||||
struct tm *time_of_day;
|
struct tm *time_of_day;
|
||||||
int tecotime;
|
int tecotime;
|
||||||
DBGFEN(1,"ZExCtH","");
|
DBGFEN(1,"ZExCtH","");
|
||||||
clock=time(NULL);
|
clockt=time(NULL);
|
||||||
time_of_day=localtime(&clock);
|
time_of_day=localtime(&clockt);
|
||||||
tecotime = time_of_day->tm_hour * 60 /* hours * 60 */;
|
tecotime = time_of_day->tm_hour * 60 /* hours * 60 */;
|
||||||
tecotime += time_of_day->tm_min; /* minutes */
|
tecotime += time_of_day->tm_min; /* minutes */
|
||||||
tecotime *= 30;
|
tecotime *= 30;
|
||||||
|
@ -1071,7 +1133,8 @@ BOOLEAN RepFNF; /* report "file not found" error? */
|
||||||
charptr dummyp = NULL;
|
charptr dummyp = NULL;
|
||||||
char TmpBfr[FILENAME_MAX];
|
char TmpBfr[FILENAME_MAX];
|
||||||
ptrdiff_t TmpLen = FBfPtr-FBfBeg;
|
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 */
|
(void)strcat(FBfBeg,".tec"); /* append .tec */
|
||||||
FBfPtr += 4;
|
FBfPtr += 4;
|
||||||
if ((IFiles[IfIndx] = fopen(FBfBeg, "r")) != NULL) {
|
if ((IFiles[IfIndx] = fopen(FBfBeg, "r")) != NULL) {
|
||||||
|
@ -1090,7 +1153,7 @@ BOOLEAN RepFNF; /* report "file not found" error? */
|
||||||
DBGFEX(1,DbgFNm,"SUCCESS");
|
DBGFEX(1,DbgFNm,"SUCCESS");
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
if (strchr(FBfBeg,'.') == NULL) { /* if no dot */
|
if (noDot) { /* if no dot */
|
||||||
(void)strcat(FBfBeg,".tec"); /* append .tec */
|
(void)strcat(FBfBeg,".tec"); /* append .tec */
|
||||||
FBfPtr += 4;
|
FBfPtr += 4;
|
||||||
if ((IFiles[IfIndx] = fopen(FBfBeg, "r")) != NULL) {
|
if ((IFiles[IfIndx] = fopen(FBfBeg, "r")) != NULL) {
|
||||||
|
@ -1239,7 +1302,8 @@ char *argv[];
|
||||||
/*
|
/*
|
||||||
* execute imbedded command line-parsing macro directly from clpars[]
|
* 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 */
|
CStEnd = clpars + CLPARS_LEN; /* command string end */
|
||||||
EStTop = EStBot; /* clear expression stack */
|
EStTop = EStBot; /* clear expression stack */
|
||||||
ExeCSt(); /* execute command string */
|
ExeCSt(); /* execute command string */
|
||||||
|
@ -1421,6 +1485,7 @@ int OpCode; /* code for operation */
|
||||||
}
|
}
|
||||||
refresh();
|
refresh();
|
||||||
#else
|
#else
|
||||||
|
#ifndef LINUX // BAD for now, but do we really want this??
|
||||||
if (CrType == UNTERM || tbuf[0] == 0) {/* if unknown terminal type */
|
if (CrType == UNTERM || tbuf[0] == 0) {/* if unknown terminal type */
|
||||||
return; /* can't do screen operations */
|
return; /* can't do screen operations */
|
||||||
}
|
}
|
||||||
|
@ -1434,6 +1499,7 @@ int OpCode; /* code for operation */
|
||||||
case SCR_RON: tputs(so, 1, ZDspCh);
|
case SCR_RON: tputs(so, 1, ZDspCh);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
ZSetTT()
|
ZSetTT()
|
||||||
|
@ -1527,12 +1593,21 @@ static void sighup()
|
||||||
*/
|
*/
|
||||||
static void sigstop()
|
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);
|
ioctl(0, TIOCSETP, &out);
|
||||||
puts("[Suspending...]\r\n");
|
puts("[Suspending...]\r\n");
|
||||||
kill(getpid(), SIGSTOP);
|
kill(getpid(), SIGSTOP);
|
||||||
puts("[Resuming...]\r\n");
|
puts("[Resuming...]\r\n");
|
||||||
ioctl(0, TIOCSETP, &cur);
|
ioctl(0, TIOCSETP, &cur);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
#ifndef LINUX
|
||||||
/*
|
/*
|
||||||
* xtgetstr() - just like tgetstr() except it returns "" instead of
|
* xtgetstr() - just like tgetstr() except it returns "" instead of
|
||||||
* NULL if the tgetstr() fails. As in tcsh 5.18.
|
* NULL if the tgetstr() fails. As in tcsh 5.18.
|
||||||
|
@ -1547,6 +1622,7 @@ char **a;
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
* ZTrmnl - set up terminal modes
|
* 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
|
* get terminal characteristics and set some signals
|
||||||
*/
|
*/
|
||||||
#if !CURSES
|
#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)
|
if (ioctl(0, TIOCGETP, &out) != -1)
|
||||||
tty_set = TRUE; /* tell ZClnUp to clean up */
|
tty_set = TRUE; /* tell ZClnUp to clean up */
|
||||||
ioctl(0, TIOCGETP, &cur);
|
ioctl(0, TIOCGETP, &cur);
|
||||||
|
#endif
|
||||||
#ifdef SIGTSTP
|
#ifdef SIGTSTP
|
||||||
signal(SIGTSTP, sigstop); /* call sigstop on stop (control-Z) */
|
signal(SIGTSTP, sigstop); /* call sigstop on stop (control-Z) */
|
||||||
#endif
|
#endif
|
||||||
|
@ -1591,11 +1673,19 @@ VVOID ZTrmnl() /* set up I/O to the terminal */
|
||||||
nonl(); /* don't add CRs to NEWLINEs (CRMOD) */
|
nonl(); /* don't add CRs to NEWLINEs (CRMOD) */
|
||||||
curwin = stdscr;
|
curwin = stdscr;
|
||||||
ScopeFlg = 0; /* not writing in scope */
|
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
|
#else
|
||||||
cur.sg_flags |= CBREAK; /* don't wait for CRs (CBREAK) */
|
cur.sg_flags |= CBREAK; /* don't wait for CRs (CBREAK) */
|
||||||
cur.sg_flags &= ~ECHO; /* don't echo characters (ECHO) */
|
cur.sg_flags &= ~ECHO; /* don't echo characters (ECHO) */
|
||||||
cur.sg_flags &= ~CRMOD; /* don't add CRs to NEWLINEs (CRMOD) */
|
cur.sg_flags &= ~CRMOD; /* don't add CRs to NEWLINEs (CRMOD) */
|
||||||
ioctl(0, TIOCSETP, &cur); /* set the new modes */
|
ioctl(0, TIOCSETP, &cur); /* set the new modes */
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
signal(SIGINT, CntrlC); /* call CntrlC on interrupt */
|
signal(SIGINT, CntrlC); /* call CntrlC on interrupt */
|
||||||
signal(SIGHUP, sighup); /* call sighup on hang up */
|
signal(SIGHUP, sighup); /* call sighup on hang up */
|
||||||
|
@ -1605,6 +1695,8 @@ VVOID ZTrmnl() /* set up I/O to the terminal */
|
||||||
*/
|
*/
|
||||||
#if !CURSES
|
#if !CURSES
|
||||||
tbuf[0] = 0;
|
tbuf[0] = 0;
|
||||||
|
#ifdef LINUX // BAD for now but do we really want this??
|
||||||
|
#else
|
||||||
if ((ta = getenv("TERM")) == NULL) { /* get terminal type */
|
if ((ta = getenv("TERM")) == NULL) { /* get terminal type */
|
||||||
ta = "dumb";
|
ta = "dumb";
|
||||||
}
|
}
|
||||||
|
@ -1614,6 +1706,7 @@ VVOID ZTrmnl() /* set up I/O to the terminal */
|
||||||
se = xtgetstr("se",&ta); /* end standout mode (rev. video) */
|
se = xtgetstr("se",&ta); /* end standout mode (rev. video) */
|
||||||
so = xtgetstr("so",&ta); /* begin standout mode */
|
so = xtgetstr("so",&ta); /* begin standout mode */
|
||||||
up = xtgetstr("up",&ta); /* cursor up */
|
up = xtgetstr("up",&ta); /* cursor up */
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
CrType = VT102; /* Let's pretend we are a VT102
|
CrType = VT102; /* Let's pretend we are a VT102
|
||||||
even though we are really using
|
even though we are really using
|
||||||
|
@ -1688,7 +1781,7 @@ charptr BfrEnd; /* address of output buffer end */
|
||||||
BfrPtr--;
|
BfrPtr--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fputc(*BfrPtr, OFiles[OfIndx].OStrem) == EOF) {
|
if (putc(*BfrPtr, OFiles[OfIndx].OStrem) == EOF) {
|
||||||
ZErMsg();
|
ZErMsg();
|
||||||
ErrMsg(ERR_UWL);
|
ErrMsg(ERR_UWL);
|
||||||
DBGFEX(2,DbgFNm,"FAILURE");
|
DBGFEX(2,DbgFNm,"FAILURE");
|
||||||
|
@ -1986,7 +2079,7 @@ register char *s, *p;
|
||||||
case '[':
|
case '[':
|
||||||
ok = 0;
|
ok = 0;
|
||||||
lc = 077777;
|
lc = 077777;
|
||||||
while (cc = *p++) {
|
while ((cc = *p++) != 0) {
|
||||||
if (cc == ']') {
|
if (cc == ']') {
|
||||||
if (ok)
|
if (ok)
|
||||||
break;
|
break;
|
||||||
|
@ -2076,12 +2169,21 @@ char *pattern;
|
||||||
return;
|
return;
|
||||||
goto p_err2;
|
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)
|
if (fstat(dirp->dd_fd, &stb) < 0)
|
||||||
goto p_err1;
|
goto p_err1;
|
||||||
if (!isdir(stb)) {
|
if (!isdir(stb)) {
|
||||||
errno = ENOTDIR;
|
errno = ENOTDIR;
|
||||||
goto p_err1;
|
goto p_err1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
while ((dp = readdir(dirp)) != NULL) {
|
while ((dp = readdir(dirp)) != NULL) {
|
||||||
if (dp->d_ino == 0)
|
if (dp->d_ino == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue