/*** table.c - function tables for editor
*
* Modifications:
*
* 26-Nov-1991 mz Strip off near/far
*
* IMPORTANT: cmdTable and swiTable MUST be sorted according to name of the
* command/switch. The table searching logic in ASSIGN.C will break otherwise.
*
* IMPORTANT: The names in cmdTable and SwiTable MUST be in lower case.
*************************************************************************/
#include "z.h"
// #define toPIF(x) (PIF)(long)(void *)&x
/* short form to allow compact table description
*/
#define ANO NOARG
#define ATXT TEXTARG
#define ANUL NULLARG
#define ALIN LINEARG
#define ASTR STREAMARG
#define ABOX BOXARG
#define ANUM NUMARG
#define AMRK MARKARG
#define AEOL NULLEOL
#define AEOW NULLEOW
#define ABST BOXSTR
#define FK FASTKEY
#define MD MODIFIES
#define KM KEEPMETA
#define WFN WINDOWFUNC
#define CFN CURSORFUNC
/* names of internal editor functions
*
* Each function has a definition of how arguments are to be processed.
* This definition is comprised of a bitmap describing which arguments are
* legal and, if so, how they are to be interpreted. The definitions are:
*
*
* MODIFIES MD The function will modify the contents of the file being
* editted.
*
* KEEPMETA KM The function being executed does not take the
* prefix. The state of the flag is preserved
* across this editor function.
*
* CURSORFUNC CFN The function being executed is a cursor movement
* function. It is allowed within the context of
* an to select a file range on the screen; it
* cannot take an . It does not remove highlighting
* that is present on the screen.
*
* WINDOWFUNC WFN The function being executed is a window movement
* function. It does not remove highlighting that is
* present on the screen.
*
* NOARG ANO The function accepts the absence of an function.
* When called the function receives a pointer to a
* structure containing the location where the function
* is expected to be applied.
*
* TEXTARG ATXT The function accepts a textual argument that may
* be typed in or selected on the screen. The function is
* called with a pointer to the asciz text of the
* argument. See NULLEOL, NULLEOW, BOXSTR.
*
* NULLARG ANUL The function accepts an with no discernable
* cursor movement (cursor is on position). The
* function is called with a pointer to a structure
* containing the location of the arg within the file.
*
* NULLEOL AEOL The function accepts an with no discernable
* cursor movement (cursor is on position). The
* function is called with a pointer to a structure
* indicating TEXTARG and containing a pointer to the
* asciz text of the line from the cursor to end-of-line.
*
* NULLEOW AEOW The function accepts an with no discernable
* cursor movement (cursor is on position). The
* function is called with a pointer to a structure
* indicating TEXTARG and containing a pointer to the
* asciz text of the line from the cursor to the next
* whitespace.
*
* LINEARG ALIN The function accepts an that is in the same
* column as the cursor. The function is expected to be
* applied to all lines beginning in the range to
* cursor inclusive. The function is called with a
* pointer to a structure containing the beginning
* line of the range and the ending line of the range
*
* STREAMARG ASTR The function accepts an that is considered to
* apply beginning at a specific file location and
* proceeding through all intervening lines and line-
* breaks up until just to the left of the ending file
* position. The function is called with a pointer to
* a structure containing the beginning point of the range
* and the first point just beyond the end of the range.
*
* BOXARG ABOX The function accepts an that is considered to
* apply to a rectangle on the screen. The function is
* called with a pointer to a structure containing the
* left and right column boundaries (inclusive) and the
* top and bottom line numbers (inclusive) that describe
* the region.
*
* BOXSTR ABST If a BOXARG is presented to the function and the box
* contains only a single line, the function is called
* with a pointer to a structure marked TEXTARG and
* containing a pointer to the selection as an asciz
* string.
*
* NUMARG ANUM If text was specified and is numeric, it is considered
* to represent a number of lines offset from the cursor
* and represents the other end of an arg. The
* above tests are then applied, excluding TEXTARG.
*
* MARKARG AMRK If text was specified and interpreted as a mark, it is
* considered to be the other end of an arg. The above
* tests are then applied, excluding TEXTARG.
*
* FASTKEY FK The command will be repeated while the user holds down
* the invoking key.
*/
struct cmdDesc cmdTable[] = {
/* 0|KM|CFN|WFN|ANO|ATXT|ANUL|AEOL|AEOW|ALIN|ASTR|ABOX|ABST|ANUM|AMRK|MD|FK*/
{"arg", doarg, 0,0|KM },
{"assign", assign, 0,0 |ANO|ATXT |AEOL |ALIN |ABOX|ABST|ANUM|AMRK },
{"backtab", backtab, 0,0 |CFN },
{"begfile", begfile, 0,0 |CFN },
{"begline", begline, 0,0 |CFN },
{"boxstream", BoxStream, 0,0 |CFN },
{"cancel", cancel, 0,0 |ANO|ATXT|ANUL |ALIN|ASTR|ABOX },
{"cdelete", cdelete, 0,0 |CFN |MD },
{"compile", compile, 0,0 |ANO|ATXT|ANUL |ABST },
{"copy", zpick, 0,0 |ANO|ATXT |AEOL |ALIN|ASTR|ABOX |ANUM|AMRK },
{"curdate", curdate, 0,0 |ANO |MD },
{"curday", curday, 0,0 |ANO |MD },
{"curtime", curtime, 0,0 |ANO |MD },
{"delete", delete, 0,0 |ANO |ANUL |ALIN|ASTR|ABOX |MD },
{"down", down, 0,0 |CFN |FK},
{"emacscdel", emacscdel, 0,0 |ANO |MD },
{"emacsnewl", emacsnewl, 0,0 |ANO |MD },
{"endfile", endfile, 0,0 |CFN },
{"endline", endline, 0,0 |CFN },
{"environment",environment,0,0 |ANO|ATXT|ANUL |ALIN |ABOX },
{"execute", zexecute, 0,0 |ATXT |AEOL |ALIN |ABST|ANUM },
{"exit", zexit, 0,0 |ANO |ANUL },
// {"filter", filter, 0,0|KM |ANO|ATXT|ANUL| |ALIN |ABOX |ANUM|AMRK|MD }.
{"graphic", graphic, 0,0 |ANO |ALIN|ASTR|ABOX |MD },
{"home", home, 0,0 |CFN },
{"information",information,0,0 |ANO },
{"initialize", zinit, 0,0 |ANO|ATXT |AEOW |ABST },
{"insert", insert, 0,0 |ANO |ANUL |ALIN|ASTR|ABOX |MD },
{"insertmode", insertmode, 0,0 |ANO },
{"lastselect", lastselect, 0,0|KM |ANO },
{"lasttext", lasttext, 0,0|KM |ANO |ANUL |ALIN|ASTR|ABOX },
{"ldelete", ldelete, 0,0 |ANO |ANUL |ALIN|ASTR|ABOX |ANUM|AMRK|MD },
{"left", left, 0,0 |CFN |FK},
{"linsert", linsert, 0,0 |ANO |ANUL |ALIN|ASTR|ABOX |ANUM|AMRK|MD },
{"mark", mark, 0,0 |ANO|ATXT|ANUL |ABST },
{"message", zmessage, 0,0 |ANO|ATXT|ANUL |ALIN|ASTR|ABOX },
{"meta", meta, 0,0|KM },
{"mgrep", mgrep, 0,0 |ANO|ATXT |AEOW |ABST },
{"mlines", mlines, 0,0 |WFN|ANO|ATXT|ANUL |FK},
{"mpage", mpage, 0,0 |CFN |FK},
{"mpara", mpara, 0,0 |CFN |FK},
{"mreplace", mreplace, 0,0 |ANO |ANUL |MD },
{"msearch", msearch, 0,0 |ANO|ATXT |AEOW |ABST },
{"mword", mword, 0,0 |CFN |FK},
{"newline", newline, 0,0 |CFN },
{"nextmsg", nextmsg, 0,0 |ANO|ATXT|ANUL },
{"noedit", noedit, 0,0 |CFN },
{"noop", noop, 0,0 |ANO |ALIN|ASTR|ABOX |MD },
{"paste", put, 0,0 |ANO|ATXT |AEOL |ALIN|ASTR|ABOX |MD },
{"pbal", pbal, 0,0 |ANO |ANUL |MD },
{"plines", plines, 0,0 |WFN|ANO|ATXT|ANUL |FK},
{"ppage", ppage, 0,0 |CFN |FK},
{"ppara", ppara, 0,0 |CFN |FK},
{"print", zPrint, 0,0 |ANO|ATXT |ALIN|ASTR|ABOX },
{"prompt", promptarg, 0,0|KM |ANO|ATXT |ALIN|ASTR|ABOX },
{"psearch", psearch, 0,0 |ANO|ATXT |AEOW |ABST },
{"pword", pword, 0,0 |CFN |FK},
{"qreplace", qreplace, 0,0 |ANO |ANUL |ALIN|ASTR|ABOX |ANUM|AMRK|MD },
{"quote", quote, 0,0 |ANO |ALIN|ASTR|ABOX |MD },
{"record", record, 0,0 |ANO|ATXT|ANUL },
{"refresh", refresh, 0,0 |ANO |ANUL },
{"repeat", repeat, 0,0 |ANO },
{"replace", zreplace, 0,0 |ANO |ANUL |ALIN|ASTR|ABOX |ANUM|AMRK|MD },
{"restcur", restcur, 0,0 |ANO },
{"right", right, 0,0 |CFN |FK},
{"saveall", saveall, 0,0 |ANO },
{"savecur", savecur, 0,0 |ANO },
{"savetmpfile", savetmpfile, 0,0 |ANO },
{"sdelete", sdelete, 0,0 |ANO |ANUL |ALIN|ASTR|ABOX |MD },
{"searchall", searchall, 0,0 |ANO|ATXT |AEOW |ABST },
{"setfile", setfile, 0,0 |ANO|ATXT|ANUL |ABST },
{"setwindow", setwindow, 0,0 |ANO |ANUL },
{"shell", zspawn, 0,0 |ANO|ATXT |AEOL |ALIN |ABOX },
{"sinsert", sinsert, 0,0 |ANO |ANUL |ALIN|ASTR|ABOX |MD },
{"tab", tab, 0,0 |CFN },
{"tell", ztell, 0,0 |ANO|ATXT|ANUL },
{"unassigned", unassigned, 0,0 |ANO|ATXT|ANUL |ALIN|ASTR|ABOX },
{"undo", zundo, 0,0 |ANO },
{"up", up, 0,0 |CFN |FK},
{"window", window, 0,0 |ANO |ANUL },
{"getfocus", focus, 0,0 |ANO },
{NULL, NULL, 0,0 }
};
/* names of switches */
struct swiDesc swiTable[] = {
{ "askexit", toPIF(fAskExit), SWI_BOOLEAN },
{ "askrtn", toPIF(fAskRtn), SWI_BOOLEAN },
{ "autosave", toPIF(fAutoSave), SWI_BOOLEAN },
{ "backup", (PIF)SetBackup, SWI_SPECIAL2 },
{ "case", toPIF(fSrchCaseSwit), SWI_BOOLEAN },
{ "cursorsize", (PIF)SetCursorSizeSw, SWI_SPECIAL2 },
#if DEBUG
{ "debug", toPIF(debug), SWI_NUMERIC | RADIX10},
#endif
{ "displaycursor", toPIF(fDisplayCursorLoc), SWI_BOOLEAN },
{ "editreadonly", toPIF(fEditRO), SWI_BOOLEAN },
{ "entab", toPIF(EnTab), SWI_NUMERIC | RADIX10},
{ "enterboxmode", toPIF(fBoxArg), SWI_BOOLEAN },
{ "enterinsmode", toPIF(fInsert), SWI_BOOLEAN },
{ "errcolor", toPIF(errColor), SWI_NUMERIC | RADIX16},
{ "errprompt", toPIF(fErrPrompt), SWI_BOOLEAN },
{ "extmake", (PIF)SetExt, SWI_SPECIAL2 },
{ "fgcolor", toPIF(fgColor), SWI_NUMERIC | RADIX16},
{ "filetab", (PIF)SetFileTab, SWI_SPECIAL2 },
// { "filtcmd", (PIF)SetFilter, SWI_SPECIAL},
{ "height", toPIF(YSIZE), SWI_SCREEN },
{ "hgcolor", toPIF(hgColor), SWI_NUMERIC | RADIX16},
{ "hike", toPIF(hike), SWI_NUMERIC | RADIX10},
{ "hscroll", toPIF(hscroll), SWI_NUMERIC | RADIX10},
{ "infcolor", toPIF(infColor), SWI_NUMERIC | RADIX16},
{ "keyboard", (PIF)SetKeyboard, SWI_SPECIAL },
{ "load", (PIF)SetLoad, SWI_SPECIAL2 },
{ "markfile", (PIF)SetMarkFile, SWI_SPECIAL2 },
{ "msgflush", toPIF(fMsgflush), SWI_BOOLEAN },
{ "noise", toPIF(cNoise), SWI_NUMERIC | RADIX10},
{ "printcmd", SetPrintCmd, SWI_SPECIAL },
{ "readonly", SetROnly, SWI_SPECIAL },
{ "realtabs", toPIF(fRealTabs), SWI_BOOLEAN },
{ "rmargin", toPIF(xMargin), SWI_NUMERIC | RADIX10},
{ "savescreen", toPIF(fSaveScreen), SWI_BOOLEAN },
{ "searchwrap", toPIF(fSrchWrapSwit), SWI_BOOLEAN },
{ "selcolor", toPIF(selColor), SWI_NUMERIC | RADIX16},
{ "shortnames", toPIF(fShortNames), SWI_BOOLEAN },
{ "snow", toPIF(fCgaSnow), SWI_BOOLEAN },
{ "softcr", toPIF(fSoftCR), SWI_BOOLEAN },
{ "stacolor", toPIF(staColor), SWI_NUMERIC | RADIX16},
{ "tabalign", toPIF(fTabAlign), SWI_BOOLEAN },
{ "tabdisp", SetTabDisp, SWI_SPECIAL },
{ "tabstops", toPIF(tabstops), SWI_NUMERIC | RADIX10},
{ "tmpsav", toPIF(tmpsav), SWI_NUMERIC | RADIX10},
{ "traildisp", SetTrailDisp, SWI_SPECIAL },
{ "trailspace", toPIF(fTrailSpace), SWI_BOOLEAN },
{ "undelcount", toPIF(cUndelCount), SWI_NUMERIC | RADIX10},
{ "undocount", toPIF(cUndo), SWI_NUMERIC | RADIX10},
{ "unixre", toPIF(fUnixRE), SWI_BOOLEAN },
{ "usemouse", toPIF(fUseMouse), SWI_BOOLEAN },
{ "viewonly", toPIF(fGlobalRO), SWI_BOOLEAN },
{ "vscroll", toPIF(vscroll), SWI_NUMERIC | RADIX10},
{ "wdcolor", toPIF(wdColor), SWI_NUMERIC | RADIX16},
{ "width", toPIF(XSIZE), SWI_SCREEN },
{ "wordwrap", toPIF(fWordWrap), SWI_BOOLEAN },
{ NULL, NULL, 0 }
};
/* c keyword table for softcr routine */
char * cftab[] = {
"if" ,
"else" ,
"for" ,
"while" ,
"do" ,
"case" ,
"default" ,
NULL
};
/* file type table. Z identifies files by their extention. Many extentions
* can be a single type. The soft tabbing algorithms and the compile commands
* are driven by this mechanism.
*/
struct fTypeInfo ftypetbl[] = {
{ "c", CFILE },
{ "h", CFILE },
{ "asm", ASMFILE },
{ "inc", ASMFILE },
{ "pas", PASFILE },
{ "for", FORFILE },
{ "lsp", LSPFILE },
{ "bas", BASFILE },
{ NULL, TEXTFILE }
};
/* mpTypepName - pointers to the textual names of each type
*/
char * mpTypepName[] =
{ "text", /* #define TEXTFILE 0 */
"C", /* #define CFILE 1 */
"macro", /* #define ASMFILE 2 */
"pascal", /* #define PASFILE 3 */
"fortran", /* #define FORFILE 4 */
"lisp", /* #define LSPFILE 5 */
"BASIC" /* #define BASFILE 6 */
};