TVX: PD Editor (5 of 7, repost)
wampler at unmvax.UUCP
wampler at unmvax.UUCP
Fri Jan 17 03:30:46 AEST 1986
#--------CUT---------CUT---------CUT---------CUT--------#
#########################################################
# #
# This is a shell archive file. To extract files: #
# #
# 1) Make a directory (like tvx) for the files. #
# 2) Write a file, such as "filen.shar", containing #
# this archive file into the directory. #
# 3) Type "sh file.shar". Do not use csh. #
# #
#########################################################
#
#
echo Extracting tvx_ptch.c:
sed 's/^X//' >tvx_ptch.c <<\SHAR_EOF
X/* --------------------------------- tvx_ptch.c --------------------------- */
X#include "tvx_defs.ic"
X
X#define EXTERN
X#include "tvx_glbl.ic"
X
X/*=======================================================================
X
X tvpatch - program to patch tvx with config.tvx file
X
X first version 6/19/84
X 7/25/84 - fixed to correspond to tvx version, add extra command
X 2/14/85 - version to correspond with rest
X 5/15/85 - again, batched to correspond
X 9/20/85 - fixed for new version of tvx, unix added
X
X======================================================================= */
X
X#ifndef UNIX
X char filein[] = "A:TVX.EXE";
X char fileout[]= "A:TEMP1.$$$";
X#else
X char filein[80] = "tvx";
X char fileout[80]= "tvx_temp";
X#endif
X char config[80];
X
X
X/* define our general control item structure for general patching */
X
X#define BL remark("")
X#define RMK remark
X#define PR prompt
X
X char clower(), cupper();
X extern char *malloc();
X extern FILE *fopen();
X FILE *tvxin, *cfgin, *tvxout;
X
X/* =============================>>> MAIN <<<============================= */
X main()
X {
X
X char ans[80];
X
XTOP:
X cls();
X RMK("TVX_PTCH - Version 11/12/85");
X BL;
XRMK(" This program is used to permanently alter TVX to match the options");
XRMK("selected with the TVX_CNFG program. It will read in the configuration");
XRMK("file you specify (such as CONFIG.TVX), and patch TVX to reflect those");
XRMK("values. Then you won't need to use the '-c' switch when using TVX.");
X BL;
XRMK("*** You may press CONTROL-C at any time to cancel this installation. ***");
X
X do
X {
X BL;
X#ifndef UNIX
X PR("On which drive is TVX.EXE located? (A, B, ...): ");
X ureply(ans,10);
X filein[0] = ans[0];
X#endif
X if ( !(tvxin = fopen(filein,FILEREAD)))
X {
X PR("TVX not found on specified drive, try again: ");
X RMK(filein);
X#ifdef UNIX
X PR("Please enter name of tvx executable file: ");
X reply(filein,79);
X#endif
X continue;
X }
X fclose(tvxin);
X break;
X }
X while (1);
X
X#ifndef UNIX
X fileout[0] = cupper(ans[0]);
X#endif
X
X do
X {
X BL;
X PR("Enter the name of the configuration file to use: ");
X reply(config,79);
X if ( !(cfgin = fopen(config,FILEREAD)))
X {
X RMK("Configuration not found on specified drive, try again.");
X continue;
X }
X
X rdcfg(lexsym,LEXVALUES+1);
X rdcfg(synofr,20);
X rdcfg(synoto,20);
X rdcfg(funchar,50);
X rdcfg(funcmd,50);
X rdcfg(&funkey,1);
X rdcfg(&autoin,1);
X rdcfg(&ddline,1);
X rdcfg(&dscrl,1);
X rdcfg(&dxcase,1);
X rdcfg(&wraplm,1);
X rdcfg(&use_wild,1);
X rdcfg(&usebak,1);
X logdef = usebak;
X#ifdef MSDOS
X rdcfg(&usecz,1);
X#endif
X fclose(cfgin);
X break;
X }
X while (1);
X
X BL;
X RMK("TVX is being modified to match your choices.");
X RMK("This may take several minutes.");
X BL;
X
X fpatch(filein); /* patch tvx */
X
X cls();
X RMK("Modification completed. TVX is ready to use without the -c now.");
X BL;
X }
X
X/* =============================>>> RDCFG <<<============================= */
X rdcfg(toset,cnt)
X char *toset;
X int cnt;
X { /* read cnt vals from cfgin */
X
X FAST int i,val;
X
X for (i = 0 ; i < cnt ; ++i)
X {
X if ((val = fgetc(cfgin)) == EOF)
X {
X remark("Invalid configuration file, aborting");
X fclose(cfgin);
X exit(999);
X }
X *toset++ = val; /* replace with new commands */
X }
X }
X
X/* =============================>>> FPATCH <<<============================= */
X fpatch(fn)
X char *fn;
X {
X static int byt;
X static int i;
X static int didpatch;
X static char *begptr; /* patch area pointers */
X
X prompt("Patching "); remark(filein);
X
X#ifndef UNIX
X fn[0] = fileout[0]; /* set drive */
X#endif
X didpatch = FALSE;
X if (!(tvxin = fopen(fn,FILEREAD)))
X {
X PR("Unable to find file to patch: "); PR(fn);
X RMK(". Aborting to operating system.");
X exit(999);
X }
X if (!(tvxout = fopen(fileout,FILEWRITE)))
X {
X PR("Unable to create new file, aborting: ");
X RMK(fileout);
X exit(999);
X }
X
X while ((byt = fgetc(tvxin)) != EOF)
X {
X fputc(byt,tvxout);
X if (byt == '#') /* look for first sharp */
X {
X for (i = 1 ; i <= 4 ; ++i)
X {
X if ((byt = fgetc(tvxin)) == EOF)
X goto l900;
X fputc(byt,tvxout); /* echo */
X if (byt != '#')
X goto l800;
X }
X byt = fgetc(tvxin); /* should be : next */
X fputc(byt,tvxout);
X if (byt != ':')
X goto l800;
X
X/* fall thru means found patch area -- code to patch follows */
X
X for (begptr = (char *) &addx ; begptr < (char *) &endpatch ;
X ++begptr)
X {
X if ((byt = fgetc(tvxin)) == EOF) /* read byte from file */
X goto l900;
X fputc(*begptr,tvxout); /* replace with byte from my area */
X }
X didpatch = TRUE;
X }
Xl800: byt = byt; /* compiler bug */
X }
X
X
Xl900:
X fclose(tvxin);
X fclose(tvxout);
X if (!didpatch)
X {
X RMK("********* ERROR ********");
X RMK("The file just checked was not a proper version of the program!");
X RMK("Please check that your are using a valid copy of the");
X RMK("program file supplied with this initialization program!");
X RMK("Unable to make patch, aborting");
X exit(999);
X }
X unlink(fn);
X fn[0] = fileout[0]; /* fix the drive */
X if (rename(fileout,fn) != 0)
X {
X RMK("Unable to rename temporary patch file");
X exit(999);
X }
X }
X
X/* =============================>>> OK <<<============================= */
X ok(msg)
X char *msg;
X {
X char rp[11];
X PR(msg); PR(" (y/n) ");
X lreply(rp,10);
X return (rp[0] == 'y');
X }
X
X/* ============================>>> RVALID <<<=========================== */
X rvalid(chr,okstr)
X char chr,*okstr;
X {
X /* sees if chr is in okstr */
X
X SLOW int i;
X SLOW char ch;
X
X ch = clower(chr);
X while (*okstr)
X {
X if (ch == clower(*okstr++))
X return TRUE;
X }
X return FALSE;
X }
X
X/* =============================>>> CLS <<<============================= */
X cls()
X {
X int i;
X
X for (i = 0 ; i < 25 ; ++i)
X BL;
X }
X
X#define EXTENDED /* my own extended lib functions */
X/* #define STANDARD /* the set of standard functions i use */
X#define LOCAL static /* make all local globals, i think */
X
X
X#ifdef EXTENDED
X/*=============================>>> CLOWER <<<================================*/
X char clower(ch)
X char ch;
X {
X return ((ch >='A' && ch<='Z') ? ch + ' ' : ch);
X }
X
X/*=============================>>> CUPPER <<<================================*/
X char cupper(ch)
X char ch;
X {
X return ((ch >= 'a' && ch <= 'z') ? ch - ' ' : ch);
X }
X
X/* =========================>>> LOWER <<<==============================*/
X lower(str)
X char str[];
X {
X FAST int i;
X
X for (i=0 ; str[i] ; ++i)
X str[i]=clower(str[i]);
X
X }
X
X/*=============================>>> PROMPT <<<================================*/
X prompt(msg)
X char msg[];
X {
X printf("%s",msg);
X }
X
X
X/*=============================>>> REMARK <<<================================*/
X remark(msg)
X char msg[];
X {
X printf("%s\n",msg);
X }
X
X/*=============================>>> UPPER <<<================================*/
X upper(str)
X char str[];
X {
X static int i;
X
X for (i=0 ; str[i] ; ++i)
X str[i]=cupper(str[i]);
X }
X
X
X/*=============================>>> LREPLY <<<================================*/
X lreply(msg,maxc)
X char msg[];
X int maxc;
X {
X reply(msg,maxc);
X lower(msg);
X }
X
X/*=============================>>> UREPLY <<<================================*/
X ureply(msg,maxc)
X char msg[];
X int maxc;
X {
X reply(msg,maxc);
X upper(msg);
X }
X
X/*=============================>>> REPLY <<<================================*/
X reply(msg,maxc)
X char msg[];
X int maxc;
X {
X#ifdef UNIX
X gets(msg);
X#else
X gets(msg,maxc,stdin);
X#endif
X }
X
X/*=============================>>> RDINT <<<================================*/
X rdint(val)
X int *val;
X {
X char chrrep[12];
X reply(chrrep,11);
X *val = atoi(chrrep);
X }
X#endif
X/* --------------------------------- tvx_ptch.c --------------------------- */
SHAR_EOF
echo Extracting tvx_cfg.c:
sed 's/^X//' >tvx_cfg.c <<\SHAR_EOF
X/* ------------------------------- tvx_cfg.c ------------------------ */
X#include "tvx_defs.ic"
X
X#define BL remark("")
X
X char synofr[20] = /* from table */
X {' ',13,']',000,000,000,000,000,000,000,00,00,00,00,00,00,00,00,00,00};
X char synoto[20] = /* translate to table */
X {'r','d','{',00,000,0,000,00,00,000,00,00,00,00,00,00,00,00,00,00};
X char funkey = 0; /* leading char for function key */
X char funchar[50] = /* code sent by function key */
X {
X 000, 000, 000, 000, 000, 000, 000, 000, 000, 000,
X 000, 000, 000, 000, 000, 000, 000, 000, 000, 000,
X 000, 000, 000, 000, 000, 000, 000, 000, 000, 000,
X 000, 000, 000, 000, 000, 000, 000, 000, 000, 000,
X 000, 000, 000, 000, 000, 000, 000, 000, 000, 000,
X };
X char funcmd[50] = /* equivalent command */
X {
X 000, 000, 000, 000, 000, 000, 000, 000, 000, 000,
X 000, 000, 000, 000, 000, 000, 000, 000, 000, 000,
X 000, 000, 000, 000, 000, 000, 000, 000, 000, 000,
X 000, 000, 000, 000, 000, 000, 000, 000, 000, 000,
X 000, 000, 000, 000, 000, 000, 000, 000, 000, 000,
X };
X
X/* define standard command set */
X
X char lexsym[LEXVALUES+1] = { E0, 'r', 'l', 'd', 'u',
X 4, 21, 8, 'k', 'i', 11, '"', '\'', ',', '.', 'f', 6, 'p',
X 'b', 'e', 2, 'v', 'o', '/', 's', 'g', 23, 25, 24, ';', '&',
X 'm', ':', '=', 7, 9, '{', 'a', 16, '?', 'h', 20, 'c', 'j', 't',
X 'n', 14, 15, 5, 18, '#', '*', '(', ')' };
X
X char newlex[LEXVALUES+1] ;
X
X char autoin, dsplin, scroll, xcases, warplm, wildch, funesc;
X char rp[80];
X
X FILE *f, *fopen();
X
X main()
X {
X
X FAST int i, val;
X
X cls();
X remark("TVX define a configuration file -- Version 11/12/85");
X BL;
X for (;;)
X {
X prompt("Enter name of file to save configuration in: ");
X reply(rp,79);
X if ((f = fopen(rp,FILEWRITE)) == 0)
X continue;
X else
X break;
X }
X
X
X remark("Standard commands settable by this program:");
X
X BL;
Xremark("Commands (n => count allowed):");
Xremark("nA Append lines B Buff begin ^B File begin nC Change chrs nD Down");
Xremark("n^D Down column E Buff end nF Find ^F Find-file G Get save buf");
Xremark("^G Unkill nH Half page nI Insert J Jump back nK Kill ch");
Xremark("n^K Kill line nL Left M Mem stat nN Note loc n^N Reset loc");
Xremark("nO Open line nP Page ^P Print screen ^Q Quit nR Right");
Xremark("nS Save lines ^S Read file nT Tidy ^T Abort nU Up");
Xremark("n^U Up column V Verify n^W Write buff nBS Del ch n; Re-Find");
Xremark(" / Delete last = Change last ' Del ln beg \" Del ln end , Ln beg");
Xremark(" . Line end nTAB Word rt n{ Word left n& Rpt agn");
Xremark("? Help * Ins find pat n:p Set param p ^O Op. System");
Xremark("n^E Edit rptbuf ^R Restore rpt n#k Execute rpt n k times");
Xremark("Note: <> repeat, @ command file, and ESCAPE cannot be changed.");
X BL;
X
X for (;;)
X {
X BL;
X prompt("Use standard command definitions? (y/n) ");
X lreply(rp,10);
X if (*rp == 'y')
X {
X for (i=0 ; i <= LEXVALUES ; ++i)
X fputc(lexsym[i],f); /* write to file */
X goto LEXDONE;
X }
X else if (*rp == 'n')
X break;
X }
X
XCAGAIN:
X cls();
X remark("You now must re-define all 47 commands. You may simply enter");
X remark("the key of the command (followed by a RETURN), or the decimal");
X remark("code of the key, followed by a RETURN.");
X BL;
X/* define new commands */
X for (i=0 ; i <= LEXVALUES ; ++i)
X newlex[i] = 0; /* clear */
X set(1,"cursor right (r)");
X set(2,"cursor left (l)");
X set(3,"cursor down (d)");
X set(4,"cursor up (u)");
X set(5,"cursor down in col (^d)");
X set(6,"cursor up in col (^u)");
X set(7,"del prev char (backspace)");
X set(8,"kill character (k)");
X set(9,"enter insert mode (i)");
X set(10,"kill a line (^k)");
X set(11,"delete to end of line (\")");
X set(12,"delete to beginning of line (')");
X set(13,"cursor to beginning of line (,)");
X set(14,"cursor to end of line (.)");
X set(15,"find (f)");
X set(16,"find across buffer (^f)");
X set(17,"scroll screen one page (p)");
X set(18,"beginning of buffer (b)");
X set(19,"end of buffer (e)");
X set(20,"beginning of file (^b)");
X set(21,"verify screen (v)");
X set(22,"open line (o)");
X set(23,"delete last thing (/)");
X set(24,"save line in save buff (s)");
X set(25,"get save buffer (g)");
X set(26,"write buffer (^w)");
X set(27,"save external file in save buffer (^y)");
X set(28,"exit (^x)");
X set(29,"find again (;)");
X set(30,"execute repeat buffer (&)");
X set(31,"memory status line (m)");
X set(32,"set parameter (:)");
X set(33,"delete last thing, enter insert (=)");
X set(34,"get back last killed line (^g)");
X set(35,"word rigth (tab)");
X set(36,"word left ({)");
X set(37,"append line to save buffer (a)");
X set(38,"print screen (^p)");
X set(39,"help (?)");
X set(40,"scroll page half screen (h)");
X set(41,"abort edit session (^t)");
X set(42,"change characters (c)");
X set(43,"jump back (j)");
X set(44,"tidy (fill to margin) (t)");
X set(45,"note position (n)");
X set(46,"return to noted position (^n)");
X set(47,"'push' to operating system (^O)");
X set(48,"Edit repeat buffer (^E)");
X set(49,"Restore repeat buffer (^R)");
X set(50,"Execute repeat buffer k (#)");
X set(51,"Insert last find match (*)");
X
X cls();
Xremark("Commands have been defined. You can start over if you made any mistakes.");
X remark("");
X prompt("Are they ok? (y/n) ");
X lreply(rp,10);
X if (*rp == 'n')
X goto CAGAIN;
X
X for (i=0 ; i <= LEXVALUES ; ++i)
X {
X fputc(newlex[i],f); /* write to file */
X lexsym[i] = newlex[i];
X }
X
XLEXDONE:
X syno();
X funkeys();
X
X cls();
X prompt("Use autoindent (n default) (y/n): ");
X lreply(rp,10);
X if (*rp == 'y')
X fputc(1,f);
X else
X fputc(0,f);
X
X BL;
X prompt("Home display line: (1-66, 16 default): ");
X rdint(&val);
X if (val > 66 || val <= 0)
X fputc(16,f);
X else
X fputc(val,f);
X
X BL;
X prompt("Scroll window (0 default): ");
X rdint(&val);
X if (val > 24)
X val = 0;
X fputc(val,f);
X
X BL;
X prompt("Find case (e=exact,a=any, any default): ");
X lreply(rp,10);
X if (*rp == 'e')
X fputc(1,f);
X else
X fputc(0,f);
X
X BL;
X
X prompt("Auto line wrap width (0 default): ");
X rdint(&val);
X if (val > 79)
X val = 0;
X fputc(val,f);
X
X BL;
X prompt("Use wild cards (y default) (y/n)? ");
X lreply(rp,10);
X if (*rp == 'n')
X fputc(0,f);
X else
X fputc(1,f);
X
X BL;
X prompt("Use BACKUP.LOG file (n default) (y/n)? ");
X lreply(rp,10);
X if (*rp == 'y')
X fputc(1,f);
X else
X fputc(0,f);
X
X#ifdef MSDOS
X BL;
X remark("The editor can recognize Ctrl-z as EOF, or it can ignore ^Z and");
X remark("just use the standard MS-DOS end of file mark.");
X prompt("Should the editor recognize Ctrl-Z as EOF? (y/n) ");
X lreply(rp,10);
X if (*rp == 'y')
X fputc(1,f);
X else
X fputc(0,f);
X#endif
X
X cls();
X remark("Configuration file created.");
X fclose(f);
X }
X
X/* ===============================>>> FUNKEYS <<<========================*/
X funkeys()
X {
X
X FAST int j,i,val;
X SLOW int fun;
X
XFAGAIN:
X cls();
X remark("You may now define up to 49 function keys to be translated to");
X remark("commands OR letters. This translation will take place before");
X remark("the editor gets the character at any level -- thus the translation");
X remark("will apply equally to command mode and insert mode. The translation");
X remark("assumes each function key generates a 2 character sequence. The");
X remark("first character is an 'escape' character that must be the same for");
X remark("each key. If the 'escape' character is really ESC, then you must");
X remark("also define one function key to have ESC as its translation value.");
X remark("When asked for the function key, simply press the key, followed by");
X remark("RETURN. Enter either the character or decimal value of the translation.");
X
X for (i = 0 ; i < 50 ; ++i)
X {
X funchar[i] = funcmd[i] = 0;
X }
X
X BL;
X prompt("Do you want to define any function keys? (y/n) ");
X lreply(rp,10);
X if (*rp == 'n')
X goto WTFUN;
X
X BL;
X remark("Now, please press ANY function key so the program can identify");
X prompt("the 'function key escape' code (followed by a RETURN): ");
X reply(rp,10);
X funesc = *rp; /* this should be the escape char */
X if (funesc == 27)
X {
X BL;
X remark("IMPORTANT: You MUST define a function key to send an ESCAPE (decimal 27).");
X remark("If you don't, then you won't be able to end insert mode or repeat loops.");
X remark("The program doesn't have logic to make sure you do this, so don't forget!");
X BL;
X }
X
X for (i = 0 ; i < 50 ; ++i)
X {
XFUNAGAIN:
X prompt("Press function key to define (RETURN only to exit): ");
X rp[1] = 0;
X reply(rp,10);
X fun = rp[1];
X if (rp[1] == 0)
X break;
X for (j = 0 ; j < 50 ; ++j)
X {
X if (fun == funchar[j])
X {
X remark("That's been used already, try again.");
X goto FUNAGAIN;
X }
X }
X funchar[i] = fun;
X prompt("Now enter the character/command it gets translated to: ");
X reply(rp,10);
X val = getval(rp);
X funcmd[i] = val;
X }
X
X cls();
Xremark("Functions have been defined. You can start over if you made any mistakes.");
X remark("");
X prompt("Are they ok? (y/n) ");
X lreply(rp,10);
X if (*rp == 'n')
X goto FAGAIN;
X
XWTFUN:
X for (i = 0 ; i < 50 ; ++i)
X {
X fputc(funchar[i],f);
X }
X for (i = 0 ; i < 50 ; ++i)
X {
X fputc(funcmd[i],f);
X }
X fputc(funesc,f);
X }
X
X
X/* ===============================>>> GETVAL <<<========================*/
X getval(str)
X char *str;
X {
X /* return one byte value */
X
X if (*str >= '0' && *str <= '9')
X return (atoi(str));
X else
X return (*str & 0377);
X }
X
X/* ===============================>>> SET <<<========================*/
X set(indx,msg)
X int indx;
X char *msg;
X {
X /* set newlex[indx] to a new value */
X
X SLOW int val,i;
X
XSAGAIN:
X prompt("Enter new command for "); prompt(msg); prompt(": ");
X reply(rp,10);
X val = getval(rp);
X
X if (val == 0)
X {
X remark("Invalid value, try again");
X goto SAGAIN;
X }
X for (i = 1 ; i <= LEXVALUES ; ++i)
X {
X if (val == newlex[i])
X {
X remark("That value has been already used. Try again.");
X goto SAGAIN;
X }
X }
X newlex[indx] = val; /* save value */
X
X }
X
X/* ===============================>>> SYNO <<<========================*/
X syno()
X {
X
X FAST int j, i, valfrom, valto, found;
X
XSAGAIN:
X cls();
X remark("You may now define up to 19 synonyms. For example, you might");
X remark("want to define a space to be a synonym for right, or RETURN");
X remark("the same as down. You must use unused values, however. You");
X remark("can't use a existing command as a synonym. You may enter the");
X remark("character followed by a RETURN, or the decimal value of the key.");
X
X for (i = 0 ; i < 20 ; ++i)
X {
X synofr[i] = synoto[i] = 0;
X }
X
X for (i = 0 ; i < 19 ; ++i)
X {
XSYNAGAIN:
X BL;
X prompt("Enter the new synonym (RETURN when done): ");
X reply(rp,10);
X valfrom = getval(rp);
X if (valfrom == 0)
X break;
X for (j = 1 ; j <= LEXVALUES ; ++j)
X {
X if (lexsym[j] == valfrom)
X {
X remark("That is already a command! Try again.");
X goto SYNAGAIN;
X }
X }
X prompt("Enter the equivalent command: ");
X reply(rp,10);
X valto = getval(rp);
X for (j = 1, found = FALSE ; j <= LEXVALUES ; ++j)
X {
X if (lexsym[j] == valto)
X found = TRUE;
X }
X if (!found)
X {
X remark("That is not a defined command. Try again.");
X goto SYNAGAIN;
X }
X
X synofr[i] = valfrom;
X synoto[i] = valto;
X }
X cls();
X
Xremark("Synonyms have been defined. You can start over if you made any mistakes.");
X remark("");
X prompt("Are they ok? (y/n) ");
X lreply(rp,10);
X if (*rp == 'n')
X goto SAGAIN;
X
X for (i = 0 ; i < 20 ; ++i)
X fputc(synofr[i],f);
X for (i = 0 ; i < 20 ; ++i)
X fputc(synoto[i],f);
X
X }
X
X/* ===============================>>> CLS <<<========================*/
X cls()
X {
X FAST int i;
X for (i = 0 ; i < 25 ; ++i)
X remark("");
X }
X
X#define EXTENDED /* my own extended lib functions */
X/* #define STANDARD /* the set of standard functions i use */
X#define LOCAL static /* make all local globals, i think */
X
X#ifdef EXTENDED
X/*=============================>>> CLOWER <<<================================*/
X char clower(ch)
X char ch;
X {
X return ((ch >='A' && ch<='Z') ? ch + ' ' : ch);
X }
X
X/*=============================>>> CUPPER <<<================================*/
X char cupper(ch)
X char ch;
X {
X return ((ch >= 'a' && ch <= 'z') ? ch - ' ' : ch);
X }
X
X/* =========================>>> LOWER <<<==============================*/
X lower(str)
X char str[];
X {
X FAST int i;
X
X for (i=0 ; str[i] ; ++i)
X str[i]=clower(str[i]);
X
X }
X
X/*=============================>>> PROMPT <<<================================*/
X prompt(msg)
X char msg[];
X {
X printf("%s",msg);
X }
X
X
X/*=============================>>> REMARK <<<================================*/
X remark(msg)
X char msg[];
X {
X printf("%s\n",msg);
X }
X
X/*=============================>>> UPPER <<<================================*/
X upper(str)
X char str[];
X {
X static int i;
X
X for (i=0 ; str[i] ; ++i)
X str[i]=cupper(str[i]);
X }
X
X
X/*=============================>>> LREPLY <<<================================*/
X lreply(msg,maxc)
X char msg[];
X int maxc;
X {
X reply(msg,maxc);
X lower(msg);
X }
X
X/*=============================>>> UREPLY <<<================================*/
X ureply(msg,maxc)
X char msg[];
X int maxc;
X {
X reply(msg,maxc);
X upper(msg);
X }
X
X/*=============================>>> REPLY <<<================================*/
X reply(msg,maxc)
X char msg[];
X int maxc;
X {
X#ifdef UNIX
X gets(msg);
X#else
X ms_reply(msg,maxc);
X#endif
X }
X
X/*=============================>>> RDINT <<<================================*/
X rdint(val)
X int *val;
X {
X char chrrep[12];
X reply(chrrep,11);
X *val = atoi(chrrep);
X }
X#endif
X#ifdef MSDOS
X/*=============================>>> MS_REPLY <<<================================*/
X ms_reply(msg,maxc)
X char msg[];
X int maxc;
X {
X#define CBS 8 /* Backspace */
X#define CDL1 21 /* ^U */
X#define CDL2 24 /* ^X */
X#define CABORT 3 /* ^C */
X#define CRET 13 /* cr */
X#define BACKSPACE 8
X
X static char ch, rp;
X static int i;
X
X
X for (i = 0 ; i < maxc ; ) /* i -> next char */
X {
X ch = bdos(7,-1) & 0377; /* read the character */
X if (ch == CBS) /* back space */
X {
X if (i > 0) /* must be something to delete */
X {
X --i; /* wipe out char */
X bdos(2,BACKSPACE); bdos(2,' '); bdos(2,BACKSPACE);
X if (msg[i] < ' ') /* double echo ^ chrs */
X {
X bdos(2,BACKSPACE); bdos(2,' '); bdos(2,BACKSPACE);
X }
X }
X }
X#ifdef USE_WIPE
X else if (ch == CDL1 || ch == CDL2) /* wipe whole line */
X {
X i = 0; /* set for loop ++ */
X remark("#");
X prompt("Re-enter? ");
X }
X#endif
X else if (ch == CABORT)
X {
X remark("^C");
X prompt("Exit to operating system - are you sure? (y/n) ");
X rp = bdos(7,-1) & 0377;
X if (rp == 'y' || rp =='Y')
X {
X remark("y");
X exit(0);
X }
X remark("n");
X msg[i] = 0;
X prompt("Re-enter? "); prompt(msg); /* re-echo */
X }
X else if (ch == CRET) /* ret, so done */
X {
X remark("");
X msg[i] = 0;
X return;
X }
X else
X {
X msg[i++] = ch;
X msg[i] = 0; /* always 0 terminate */
X if (ch < ' ')
X {
X ch += '@';
X bdos(2,'^');
X }
X bdos(2,ch); /* echo char */
X }
X } /* end for */
X
X remark("");
X }
X
X#endif
X/* ------------------------------- tvx_cfg.c ------------------------ */
SHAR_EOF
echo ALL DONE!
exit 0
More information about the Comp.sources.unix
mailing list