diff -cbr src-orig/basic.c src/basic.c *** src-orig/basic.c Mon Dec 16 11:42:16 1991 --- src/basic.c Sun Dec 22 16:19:00 1991 *************** *** 164,169 **** --- 164,207 ---- return(TRUE); } + #if KEEPPOS + + /* + * Move to the top of the screen. The standsrd screen code does most of the + * hard parts of update. + * + */ + PASCAL NEAR gotobos(f, n) + int f, n; + { + curwp->w_dotp = curwp->w_linep; + curwp->w_doto = 0; + curwp->w_flag |= WFHARD; + return(TRUE); + } /* gotobos */ + + + /* + * Goto the end of the screen. + */ + PASCAL NEAR gotoeos(f, n) + int f, n; + { + register LINE *lp; + int currow; + + lp = curwp->w_linep; + currow = curwp->w_ntrows - 1; + while (currow-- && lp!=curbp->b_linep) lp = lforw(lp); + curwp->w_dotp = lp; + curwp->w_doto = 0; + curwp->w_flag |= WFHARD; + return(TRUE); + } /* gotoeos */ + + #endif + + /* * Move forward by full lines. If the number of lines to move is less than * zero, call the backward line function to actually do it. The last command *************** *** 440,445 **** --- 478,488 ---- { register LINE *lp; + #if KEEPPOS + int currow; + register LINE *lp1; + #endif + if (f == FALSE) { n = curwp->w_ntrows - 2; /* Default scroll. */ if (n <= 0) /* Forget the overlap */ *************** *** 447,457 **** } else if (n < 0) return(backpage(f, -n)); lp = curwp->w_linep; while (n-- && lp!=curbp->b_linep) lp = lforw(lp); curwp->w_linep = lp; ! curwp->w_dotp = lp; curwp->w_doto = 0; curwp->w_flag |= WFHARD; return(TRUE); } --- 490,521 ---- } else if (n < 0) return(backpage(f, -n)); lp = curwp->w_linep; + + #if KEEPPOS + if ((lastflag&CFCPCN) == 0) + curgoal = getccol(FALSE); + /* flag this command as a line move */ + thisflag |= CFCPCN; + lp1 = lp; + currow = 0; + while (lp1 != curwp->w_dotp ) { + currow++; + lp1 = lforw(lp1); + } + #endif + while (n-- && lp!=curbp->b_linep) lp = lforw(lp); curwp->w_linep = lp; ! ! #if KEEPPOS ! while (currow-- && lp!=curbp->b_linep) lp = lforw(lp); ! curwp->w_doto = getgoal(lp); ! #else curwp->w_doto = 0; + #endif + + curwp->w_dotp = lp; curwp->w_flag |= WFHARD; return(TRUE); } *************** *** 470,475 **** --- 534,544 ---- { register LINE *lp; + #if KEEPPOS + int currow; + register LINE *lp1; + #endif + if (f == FALSE) { n = curwp->w_ntrows - 2; /* Default scroll. */ if (n <= 0) /* Don't blow up if the */ *************** *** 477,487 **** } else if (n < 0) return(forwpage(f, -n)); lp = curwp->w_linep; while (n-- && lback(lp)!=curbp->b_linep) lp = lback(lp); curwp->w_linep = lp; ! curwp->w_dotp = lp; curwp->w_doto = 0; curwp->w_flag |= WFHARD; return(TRUE); } --- 546,577 ---- } else if (n < 0) return(forwpage(f, -n)); lp = curwp->w_linep; + + #if KEEPPOS + if ((lastflag&CFCPCN) == 0) + curgoal = getccol(FALSE); + /* flag this command as a line move */ + thisflag |= CFCPCN; + lp1 = lp; + currow = 0; + while (lp1 != curwp->w_dotp ) { + currow++; + lp1 = lforw(lp1); + } + #endif + while (n-- && lback(lp)!=curbp->b_linep) lp = lback(lp); curwp->w_linep = lp; ! ! #if KEEPPOS ! while (currow-- && lp!=curbp->b_linep) lp = lforw(lp); ! curwp->w_doto = getgoal(lp); ! #else curwp->w_doto = 0; + #endif + + curwp->w_dotp = lp; curwp->w_flag |= WFHARD; return(TRUE); } diff -cbr src-orig/bind.c src/bind.c *** src-orig/bind.c Mon Dec 16 11:42:16 1991 --- src/bind.c Sun Dec 22 16:19:00 1991 *************** *** 772,777 **** --- 772,782 ---- c = c & 255; /* strip the prefixes */ + if ((c & 255) == 127) { + *ptr++ = '^'; + c = '?'; + } + /* and output the final sequence */ *ptr++ = c; *************** *** 938,944 **** if (*keyname == '^' && *(keyname+1) != 0) { c |= CTRL; ++keyname; ! uppercase(keyname); } /* A literal control character? (Boo, hiss) */ --- 943,949 ---- if (*keyname == '^' && *(keyname+1) != 0) { c |= CTRL; ++keyname; ! /* uppercase(keyname); */ } /* A literal control character? (Boo, hiss) */ diff -cbr src-orig/char.c src/char.c *** src-orig/char.c Mon Dec 16 11:42:16 1991 --- src/char.c Sun Dec 22 16:19:00 1991 *************** *** 139,145 **** upcase[index ^ DIFCASE] = index; } ! #if MSDOS /* setup various extended IBM-PC characters */ upcase[0x80] = 0x87; /* C with a cedilla */ lowcase[0x81] = 0x9a; /* U with an umlaut */ --- 139,145 ---- upcase[index ^ DIFCASE] = index; } ! #if MSDOS | OS2 /* setup various extended IBM-PC characters */ upcase[0x80] = 0x87; /* C with a cedilla */ lowcase[0x81] = 0x9a; /* U with an umlaut */ diff -cbr src-orig/display.c src/display.c *** src-orig/display.c Mon Dec 16 11:42:16 1991 --- src/display.c Sun Dec 22 16:19:02 1991 *************** *** 885,891 **** --- 885,897 ---- || req || rev #endif ) { + #if OS2NPM + ttrow = row; /* special optimization */ + ttcol = 0; + os2vmove(row, 0); /* Go to start of line. */ + #else movecursor(row, 0); /* Go to start of line. */ + #endif /* set rev video if needed */ if (rev != req) (*term.t_rev)(req); *************** *** 979,985 **** --- 985,997 ---- } /* move to the begining of the text to update */ + #if OS2NPM + ttrow = row; /* special optimization */ + ttcol = upcol; + os2vmove(row, upcol); /* Go to start of line. */ + #else movecursor(row, upcol); + #endif #if REVSTA if (rev) diff -cbr src-orig/dolock.c src/dolock.c *** src-orig/dolock.c Mon Dec 16 11:42:16 1991 --- src/dolock.c Sun Dec 22 16:19:02 1991 *************** *** 71,79 **** --- 71,81 ---- #if ZTC extern volatile int errno; #else + #if MSC == 0 extern int errno; #endif #endif + #endif #define LOCKDIR "_xlk" #define LOCKMSG "LOCK ERROR -- " diff -cbr src-orig/edef.h src/edef.h *** src-orig/edef.h Mon Dec 16 11:44:30 1991 --- src/edef.h Sun Dec 22 16:19:22 1991 *************** *** 27,33 **** NOSHARE int DNEAR eolexist = TRUE; /* does clear to EOL exist? */ NOSHARE int DNEAR revexist = FALSE; /* does reverse video exist? */ NOSHARE int DNEAR exec_error = FALSE; /* macro execution error pending? */ ! NOSHARE int DNEAR flickcode = TRUE; /* do flicker supression? */ CONST char *modename[] = { /* name of modes */ "WRAP", "CMODE", "SPELL", "EXACT", "VIEW", "OVER", "MAGIC", "CRYPT", "ASAVE", "REP"}; --- 27,33 ---- NOSHARE int DNEAR eolexist = TRUE; /* does clear to EOL exist? */ NOSHARE int DNEAR revexist = FALSE; /* does reverse video exist? */ NOSHARE int DNEAR exec_error = FALSE; /* macro execution error pending? */ ! NOSHARE int DNEAR flickcode = FALSE; /* do flicker supression? */ CONST char *modename[] = { /* name of modes */ "WRAP", "CMODE", "SPELL", "EXACT", "VIEW", "OVER", "MAGIC", "CRYPT", "ASAVE", "REP"}; *************** *** 93,98 **** --- 93,101 ---- NOSHARE int DNEAR kbdmode = STOP; /* current keyboard macro mode */ NOSHARE int DNEAR kbdrep = 0; /* number of repetitions */ NOSHARE int DNEAR restflag = FALSE; /* restricted use? */ + #ifdef BACKUP + NOSHARE int DNEAR bakfile = TRUE; /* save the bakfile */ + #endif NOSHARE int DNEAR lastkey = 0; /* last keystoke */ NOSHARE int DNEAR seed = 0; /* random number seed */ NOSHARE long envram = 0l; /* # of bytes current in use by malloc */ *************** *** 277,282 **** --- 280,288 ---- NOSHARE extern int kbdmode; /* current keyboard macro mode */ NOSHARE extern int kbdrep; /* number of repetitions */ NOSHARE extern int restflag; /* restricted use? */ + #ifdef BACKUP + NOSHARE extern int bakfile; /* save the bakfile */ + #endif NOSHARE extern int lastkey; /* last keystoke */ NOSHARE extern int seed; /* random number seed */ NOSHARE extern long envram; /* # of bytes current in use by malloc */ diff -cbr src-orig/efunc.h src/efunc.h *** src-orig/efunc.h Mon Dec 16 11:44:30 1991 --- src/efunc.h Sun Dec 22 16:19:22 1991 *************** *** 27,32 **** --- 27,35 ---- {"begin-macro", ctlxlp}, {"beginning-of-file", gotobob}, {"beginning-of-line", gotobol}, + #if KEEPPOS + {"beginning-of-screen", gotobos}, + #endif {"bind-to-key", bindtokey}, {"buffer-position", showcpos}, {"case-region-lower", lowerregion}, *************** *** 39,44 **** --- 42,50 ---- {"change-screen-row", new_row_org}, {"change-screen-size", newsize}, {"change-screen-width", newwidth}, + #if CHDIR + {"change-working-directory", changedir}, + #endif {"clear-and-redraw", refresh}, {"clear-message-line", clrmes}, {"copy-region", copyregion}, *************** *** 48,53 **** --- 54,60 ---- {"delete-blank-lines", deblank}, {"delete-buffer", killbuffer}, {"delete-global-mode", delgmode}, + {"delete-line", delline}, {"delete-mode", delmode}, {"delete-next-character", forwdel}, {"delete-next-word", delfword}, *************** *** 72,77 **** --- 79,87 ---- {"end-macro", ctlxrp}, {"end-of-file", gotoeob}, {"end-of-line", gotoeol}, + #ifdef KEEPPOS + {"end-of-screen", gotoeos}, + #endif {"end-of-word", endword}, {"entab-line", entab}, {"entab-region", entab}, *************** *** 227,232 **** --- 237,243 ---- #if CTAGS {"tag-word", tagword}, #endif + {"toggle-over-mode", toggleovermode}, {"transpose-characters", twiddle}, {"trim-line", trim}, {"trim-region", trim}, diff -cbr src-orig/epath.h src/epath.h *** src-orig/epath.h Mon Dec 16 11:44:30 1991 --- src/epath.h Sun Dec 22 16:19:24 1991 *************** *** 44,54 **** #if MSDOS { ! "emacs.rc", ! "emacs.hlp", ! "\\sys\\public\\", ! "\\usr\\bin\\", ! "\\bin\\", "\\", "" }; --- 44,54 ---- #if MSDOS { ! "me.rc", ! "me.hlp", ! "c:\\bin\\", ! "c:\\etc\\", ! "c:\\", "\\", "" }; *************** *** 56,67 **** #if OS2 { ! "emacs.rc", ! "emacs.hlp", ! "C:\\OS2\\SYSTEM\\", ! "C:\\OS2\\DLL\\", ! "C:\\OS2\\BIN\\", ! "C:\\OS2\\", "\\", "" }; --- 56,67 ---- #if OS2 { ! "me.rc", ! "me.hlp", ! "c:\\bin\\", ! "c:\\etc\\", ! "c:\\os2\\", ! "c:\\", "\\", "" }; *************** *** 71,78 **** { ".emacsrc", "emacs.hlp", - "/usr/local/", "/usr/lib/", "" }; #endif --- 71,80 ---- { ".emacsrc", "emacs.hlp", "/usr/lib/", + "/usr/local/", + "/usr/local/lib/", + "/usr/local/lib/emacs/", "" }; #endif diff -cbr src-orig/eproto.h src/eproto.h *** src-orig/eproto.h Mon Dec 16 11:44:30 1991 --- src/eproto.h Sun Dec 22 16:19:26 1991 *************** *** 284,289 **** --- 284,290 ---- extern PASCAL NEAR forwpage(int f, int n); extern PASCAL NEAR forwword(int f, int n); extern PASCAL NEAR freewhile(WHBLOCK *wp); + extern PASCAL NEAR getbackupname(char *backup, char *file); extern PASCAL NEAR getccol(int bflg); extern PASCAL NEAR getcmd(void); extern PASCAL NEAR getfence(int f, int n); *************** *** 336,341 **** --- 337,343 ---- extern PASCAL NEAR lowrite(char c); extern PASCAL NEAR macarg(char *tok); extern PASCAL NEAR macrotokey(int f, int n); + extern PASCAL NEAR makebackup(char *filename); extern PASCAL NEAR makelist(int iflag); extern PASCAL NEAR mouse_screen(void); extern PASCAL NEAR screenlist(int iflag); *************** *** 488,501 **** extern int PASCAL NEAR backtagword(int f, int n); /* return from tagged word */ #endif /* some library redefinitions */ char *strcat(char *, char *); char *strcpy(char *, char *); #if RAMSIZE == 0 ! char *malloc(int); #endif ! char *realloc(char *block, int siz); #else --- 490,515 ---- extern int PASCAL NEAR backtagword(int f, int n); /* return from tagged word */ #endif + extern PASCAL NEAR toggleovermode(int f, int n); + extern PASCAL NEAR delline(int f, int n); + + #if KEEPPOS + extern PASCAL NEAR gotobos(int f, int n); /* goto beginning of screen */ + extern PASCAL NEAR gotoeos(int f, int n); /* goto end of screen */ + #endif + + #if CHDIR + extern PASCAL NEAR changedir(int f, int n); + #endif + /* some library redefinitions */ char *strcat(char *, char *); char *strcpy(char *, char *); #if RAMSIZE == 0 ! void *malloc(size_t); #endif ! void *realloc(void *block, size_t siz); #else *************** *** 766,771 **** --- 780,786 ---- extern PASCAL NEAR forwpage(); extern PASCAL NEAR forwword(); extern PASCAL NEAR freewhile(); + extern PASCAL NEAR getbackupname(); extern PASCAL NEAR getccol(); extern PASCAL NEAR getcmd(); extern PASCAL NEAR getfence(); *************** *** 819,824 **** --- 834,840 ---- extern PASCAL NEAR lowrite(); extern PASCAL NEAR macarg(); extern PASCAL NEAR macrotokey(); + extern PASCAL NEAR makebackup(); extern PASCAL NEAR makelist(); extern PASCAL NEAR mouse_screen(); extern PASCAL NEAR screenlist(); *************** *** 969,974 **** --- 985,1002 ---- extern int PASCAL NEAR tagword(); /* vi-like tagging */ extern int PASCAL NEAR retagword(); /* Try again (if redefined) */ extern int PASCAL NEAR backtagword(); /* return from tagged word */ + #endif + + extern PASCAL NEAR toggleovermode(); + extern PASCAL NEAR delline(); + + #if KEEPPOS + extern PASCAL NEAR gotobos(); /* goto beginning of screen */ + extern PASCAL NEAR gotoeos(); /* goto end of screen */ + #endif + + #if CHDIR + extern PASCAL NEAR changedir(); #endif /* some library redefinitions */ diff -cbr src-orig/estruct.h src/estruct.h *** src-orig/estruct.h Mon Dec 16 11:44:32 1991 --- src/estruct.h Sun Dec 22 14:42:36 1991 *************** *** 146,162 **** #define REVSTA 1 /* Status line appears in reverse video */ #define COLOR 1 /* color commands and windows */ ! #define FILOCK 1 /* file locking under unix BSD 4.2 */ #define ISRCH 1 /* Incremental searches like ITS EMACS */ ! #define FLABEL 1 /* function key label code [HP150] */ #define CRYPT 1 /* file encryption enabled? */ #define MAGIC 1 /* include regular expression matching? */ #define MOUSE 1 /* Include routines for mouse actions */ #define NOISY 1 /* Use a fancy BELL if it exists */ ! #define CTAGS 0 /* include vi-like tagging? */ #define SPEECH 0 /* spoken EMACS, for the sight impared [not ready] */ #define VARARG 1 /* use varargs.h for mlwrite() */ /* Character set options */ /* [Set one of these!!] */ #define ASCII 1 /* always using ASCII char sequences for now */ --- 146,167 ---- #define REVSTA 1 /* Status line appears in reverse video */ #define COLOR 1 /* color commands and windows */ ! #define FILOCK 0 /* file locking under unix BSD 4.2 */ #define ISRCH 1 /* Incremental searches like ITS EMACS */ ! #define FLABEL 0 /* function key label code [HP150] */ #define CRYPT 1 /* file encryption enabled? */ #define MAGIC 1 /* include regular expression matching? */ #define MOUSE 1 /* Include routines for mouse actions */ #define NOISY 1 /* Use a fancy BELL if it exists */ ! #define CTAGS 1 /* include vi-like tagging? */ #define SPEECH 0 /* spoken EMACS, for the sight impared [not ready] */ #define VARARG 1 /* use varargs.h for mlwrite() */ + #define BACKUP 0 /* retain original file as backup (MSDOS, UNIX) */ + #define SOFTAB 1 /* in OVER mode, are tabs and returns soft? */ + #define KEEPPOS 1 /* Maintain cursor position when paging */ + #define CHDIR 1 /* code for changing working directory */ + /* Character set options */ /* [Set one of these!!] */ #define ASCII 1 /* always using ASCII char sequences for now */ *************** *** 222,228 **** #if MSDOS & (TURBO | MSC | TIPC) #define NEAR #define DNEAR ! #define PASCAL pascal #define CDECL cdecl #else #if MSDOS & ZTC --- 227,233 ---- #if MSDOS & (TURBO | MSC | TIPC) #define NEAR #define DNEAR ! #define PASCAL /* pascal */ #define CDECL cdecl #else #if MSDOS & ZTC *************** *** 397,403 **** /* internal constants */ #define NBINDS 300 /* max # of bound keys */ ! #if AOSVS | VMS #define NFILEN 256 #else #define NFILEN 80 /* # of bytes, file name */ --- 402,408 ---- /* internal constants */ #define NBINDS 300 /* max # of bound keys */ ! #if AOSVS | VMS | OS2 #define NFILEN 256 #else #define NFILEN 80 /* # of bytes, file name */ *************** *** 655,660 **** --- 660,668 ---- char b_bname[NBUFN]; /* Buffer name */ #if CRYPT char b_key[NPAT]; /* current encrypted key */ + #endif + #if BACKUP /* -- ZU */ + short b_bupflg; /* true if file was backed up */ #endif } BUFFER; diff -cbr src-orig/file.c src/file.c *** src-orig/file.c Mon Dec 16 11:42:18 1991 --- src/file.c Sun Dec 22 16:37:44 1991 *************** *** 11,18 **** #include "eproto.h" #include "edef.h" #include "elang.h" ! #if BSD | SUN | V7 #include #include #endif --- 11,19 ---- #include "eproto.h" #include "edef.h" #include "elang.h" ! #if V7 | USG | HPUX | BSD | SUN | XENIX | MSDOS | OS2 #include + #undef CDECL #include #endif *************** *** 176,182 **** register int cmark; /* current mark */ char bname[NBUFN]; /* buffer name to put file */ ! #if MSDOS | OS2 | AOSVS | VMS | TOS mklower(fname); /* msdos isn't case sensitive */ #endif for (bp=bheadp; bp!=NULL; bp=bp->b_bufp) { --- 177,183 ---- register int cmark; /* current mark */ char bname[NBUFN]; /* buffer name to put file */ ! #if MSDOS | _OS2 | AOSVS | VMS | TOS mklower(fname); /* msdos isn't case sensitive */ #endif for (bp=bheadp; bp!=NULL; bp=bp->b_bufp) { *************** *** 262,267 **** --- 263,271 ---- if ((s=bclear(bp)) != TRUE) /* Might be old. */ return(s); bp->b_flag &= ~(BFINVS|BFCHG); + #if BACKUP + curbp->b_bupflg = FALSE; /* no backup file yet */ + #endif strcpy(bp->b_fname, fname); /* let a user macro get hold of things...if he wants */ *************** *** 465,470 **** --- 469,477 ---- if ((s=writeout(fname, "w")) == TRUE) { strcpy(curbp->b_fname, fname); curbp->b_flag &= ~BFCHG; + #if BACKUP + curbp->b_bupflg = TRUE; + #endif /* Update mode lines. */ upmode(); } *************** *** 486,491 **** --- 493,501 ---- return(s); if ((s=writeout(fname, "a")) == TRUE) { curbp->b_flag &= ~BFCHG; + #if BACKUP + curbp->b_bupflg = TRUE; + #endif /* Update mode lines. */ upmode(); } *************** *** 549,555 **** * This function performs the details of file writing. It uses * the file management routines in the "fileio.c" package. The * number of lines written is displayed. Several errors are ! * posible, and cause writeout to return a FALSE result. When * $ssave is TRUE, the buffer is written out to a temporary * file, and then the old file is unlinked and the temporary * renamed to the original name. Before the file is written, --- 559,565 ---- * This function performs the details of file writing. It uses * the file management routines in the "fileio.c" package. The * number of lines written is displayed. Several errors are ! * possible, and cause writeout to return a FALSE result. When * $ssave is TRUE, the buffer is written out to a temporary * file, and then the old file is unlinked and the temporary * renamed to the original name. Before the file is written, *************** *** 654,662 **** #endif /* erase original file */ /* rename temporary file to original name */ if (unlink(fn) == 0 && rename(tname, fn) == 0) { ! #if BSD | SUN | V7 ! chmod(fn, (int)st.st_uid, (int)st.st_gid); chmod(fn, (int)st.st_mode); #else ; --- 664,676 ---- #endif /* erase original file */ /* rename temporary file to original name */ + #if BACKUP + if (makebackup(fn) == TRUE && rename(tname, fn) == 0) { + #else if (unlink(fn) == 0 && rename(tname, fn) == 0) { ! #endif ! #if V7 | USG | HPUX | BSD | SUN | XENIX ! chown(fn, (int)st.st_uid, (int)st.st_gid); chmod(fn, (int)st.st_mode); #else ; *************** *** 870,872 **** --- 884,1018 ---- return(TRUE); } + /* -- ZU */ + /* Make a backup file. + * This is done by renaming the original file to a new name. + * The name of the backup file is defined as follows: + * + * MSDOS: The base file name remains untouched, the extension has a tilde (~) + * as its first character and the other characters moved one place + * to the right. + * UNIX: The first character is a '#'. The rest of the name is moved one + * place to the right. The length of the filename may not exceed 14 + * characters (for BSD the limit is 255). + * + * No other operating system supported by now. + */ + #if BACKUP + + PASCAL NEAR makebackup( filename ) + char *filename; + { + char backupname[NFILEN]; + #if MSDOS | OS2 | V7 | USG | HPUX | BSD | SUN | XENIX + if ( curbp->b_bupflg || /* already backed up */ + !bakfile /* no backup file wanted */ + ) { + if( unlink( filename ) == 0 ) + return( TRUE ); + else + return( FALSE ); + } + + getbackupname( backupname, filename ); + + if( !fexist( filename )) /* no original file - */ + return( TRUE ); /* nothing to backup */ + + if( fexist( backupname )) + if( unlink( backupname )) /* file is readonly */ + return( FALSE ); + + if( rename( filename, backupname ) != 0 ) + return( FALSE ); + + return( TRUE ); + #else /* for all other operating systems return fail */ + return( FALSE ); + #endif /* MSDOS | V7 | USG | HPUX | BSD | SUN | XENIX */ + } + + /* Make the name of the backup file according to the original file name + * This routines knows about the filename possibilities of the different + * operating systems. + */ + PASCAL NEAR getbackupname( backup, file ) + char *backup; + char *file; + { + char temp[NFILEN]; + int index; + char *dotpos; + + strcpy( backup, file ); + #if MSDOS | OS2 + for( index = strlen( backup ) -1; index >= 0 && backup[index] != '.'; + index-- ) + ; + if( index < 0 ) + strcat( backup, ".~" ); + else { + strcpy( temp, &backup[index +1] ); + backup[index +1] = '~'; /* first char of new extension */ + temp[2] = '\0'; /* extension is at most 3 chars */ + strcpy( &backup[index +2], temp ); + } + #endif /* MSDOS */ + + #if V7 | USG | HPUX | BSD | SUN | XENIX + /* strcpy( temp, "#" ); */ + *temp = 0; + for( index = strlen( backup ) -1; index >= 0 && backup[index] != '/'; + index-- ) + ; + if( index >= 0 ) + strcat( temp, &backup[index +1] ); + else + strncat( temp, backup, NFILEN -1 ); + + #if BSD /* BSD allows filenames up to 255 characters */ + #if NFILEN < 255 + if( strlen( temp ) > NFILEN ) + temp[NFILEN] = '\0'; + #else + if( strlen( temp ) > 254 ) + temp[255] = '\0'; + #endif + #else /* other Unixes allow only 14 characters */ + if( strlen( temp ) > 12 ) + temp[ 13] = '\0'; + #endif + strcat(temp,"-"); + if( index >= 0 ) + strncpy( &backup[index +1], temp, NFILEN - strlen( backup ) -1 ); + else + strncpy( backup, temp, NFILEN - strlen( backup ) -1 ); + #endif /* V7 | USG | HPUX | BSD | SUN | XENIX */ + } + + #endif /* BACKUP */ + + #if CHDIR + /* + * Change current working directory + */ + PASCAL NEAR changedir(f, n) + int f, n; + { + char buf[NSTRING + 32]; /* message buffer */ + char *fname; /* file user wishes to find */ /* file name */ + register int s; /* status return */ + + if (restflag) /* don't allow this command if restricted */ + return(resterr()); + + if ((fname = gtfilename("New directory")) != NULL) + changecwd(fname); + + strcpy(buf, "Current directory = "); + getcwd(buf + 20, NSTRING); + mlwrite(buf); + + return(TRUE); + } + #endif diff -cbr src-orig/ibmpc.c src/ibmpc.c *** src-orig/ibmpc.c Mon Dec 16 11:42:18 1991 --- src/ibmpc.c Sun Dec 22 16:19:06 1991 *************** *** 14,21 **** #include "elang.h" #if IBMPC ! #define NROW 50 /* Max Screen size. */ ! #define NCOL 80 /* Edit if you want to. */ #define MARGIN 8 /* size of minimim margin and */ #define SCRSIZ 64 /* scroll size for extended lines */ #define NPAUSE 200 /* # times thru update to pause */ --- 14,21 ---- #include "elang.h" #if IBMPC ! #define NROW 80 /* Max Screen size. */ ! #define NCOL 140 /* Edit if you want to. */ #define MARGIN 8 /* size of minimim margin and */ #define SCRSIZ 64 /* scroll size for extended lines */ #define NPAUSE 200 /* # times thru update to pause */ *************** *** 419,432 **** --- 419,442 ---- ttclose(); } + static CtrlC_State; /* -- ZU */ PASCAL NEAR ibmkopen() /* open the keyboard */ { + rg.x.ax = 0x3300; /* -- ZU */ + intdos( &rg, &rg ); /* . */ + CtrlC_State = rg.h.dl; /* -- UZ */ + rg.x.ax = 0x3301; + rg.h.dl = 0x00; + intdos(&rg, &rg); } PASCAL NEAR ibmkclose() /* close the keyboard */ { + rg.x.ax = 0x3301; /* -- ZU */ + rg.h.dl = CtrlC_State; /* . */ + intdos(&rg, &rg); /* -- UZ */ } PASCAL NEAR scinit(type) /* initialize the screen head pointers */ diff -cbr src-orig/input.c src/input.c *** src-orig/input.c Mon Dec 16 11:42:20 1991 --- src/input.c Sun Dec 22 17:05:42 1991 *************** *** 46,51 **** --- 46,60 ---- #include "edef.h" #include "elang.h" + #if USG | BSD | V7 + #include + #include + extern struct passwd *getpwnam(); + #if USG + #define index strchr + #endif + #endif + /* * Ask a yes or no question in the message line. Return either TRUE, FALSE, or * ABORT. The ABORT status is returned if the user bumps out of the question *************** *** 218,223 **** --- 227,236 ---- register int ec; /* extended input character */ int cpos; /* current column on screen output */ static char buf[NSTRING];/* buffer to hold tentative name */ + #if USG | BSD | V7 | XENIX + char *home; + struct passwd *pwd; + #endif /* if we are executing a command line get the next arg and match it */ if (clexec) { *************** *** 296,303 **** TTflush(); if (buf[cpos - 1] == 0) return(buf); } else { ! if (cpos < maxlen && c > ' ') { buf[cpos++] = c; mlout(c); ++ttcol; --- 309,383 ---- TTflush(); if (buf[cpos - 1] == 0) return(buf); + #if USG | BSD | V7 | XENIX + } else if (c == '/' && type == CMP_FILENAME && buf[0] == '~') { + int i; + if (cpos == 1) { + if (home = (char *)getenv("HOME")) { + mlout('\b'); /* backup over ~ */ + mlout(' '); + mlout('\b'); + ttcol--; + TTflush(); + strcpy(buf, home); + cpos = strlen(buf); + if (buf[cpos-1] != '/') + buf[cpos++] = '/'; + for (i = 0; i < cpos; i++) { + mlout(buf[i]); + ttcol++; + } + TTflush(); + } else + goto nextc; + } else { + buf[cpos] = '\0'; + if (pwd = getpwnam(&buf[1])) { + while (cpos != 0) { /* kill */ + mlout('\b'); /* line */ + mlout(' '); + mlout('\b'); + --cpos; + --ttcol; + } + TTflush(); + strcpy(buf, pwd->pw_dir); + cpos = strlen(buf); + if (buf[cpos-1] != '/') + buf[cpos++] = '/'; + for (i = 0; i < cpos; i++) { + mlout(buf[i]); + ttcol++; + } + TTflush(); + } else + goto nextc; + } + } else if (c == '/' && type == CMP_FILENAME && buf[0] == '$') { + int i; + buf[cpos] = '\0'; + if (home = (char *)getenv(&buf[1])) { + while (cpos != 0) { /* kill */ + mlout('\b'); /* line */ + mlout(' '); + mlout('\b'); + --cpos; + --ttcol; + } + TTflush(); + strcpy(buf, home); + cpos = strlen(buf); + buf[cpos++] = '/'; + for (i = 0; i < cpos; i++) { + mlout(buf[i]); + ttcol++; + } + TTflush(); + } else + goto nextc; + #endif } else { ! nextc: if (cpos < maxlen && c > ' ') { buf[cpos++] = c; mlout(c); ++ttcol; *************** *** 482,488 **** --- 562,572 ---- while (fname) { /* is this a match? */ + #if OS2 + if (strnicmp(name,fname,*cpos) == 0) { + #else if (strncmp(name,fname,*cpos) == 0) { + #endif /* count the number of matches */ matches++; *************** *** 515,524 **** --- 599,615 ---- return; } + while (*cpos != 0) { + mlout('\b'); /* clear the old prefix out, just in case */ + (*cpos)--; /* the case of the name has changed (OS/2) */ + ttcol--; + } + /* the longestmatch array contains the longest match so copy and print it */ for ( ; (*cpos < (NSTRING-1)) && (*cpos < longestlen); (*cpos)++) { name[*cpos] = longestmatch[*cpos]; TTputc(name[*cpos]); + ttcol++; } name[*cpos] = 0; diff -cbr src-orig/keyboard.c src/keyboard.c *** src-orig/keyboard.c Mon Dec 16 11:42:20 1991 --- src/keyboard.c Sun Dec 22 16:19:06 1991 *************** *** 74,81 **** --- 74,85 ---- /* some others as well */ switch (c) { + case 1: return(ALTD | CTRL | '['); case 3: return(0); /* null */ + case 0x0F: return(SHFT | CTRL | 'I'); /* backtab */ + case 0x94: return(SPEC | CTRL | 'I'); /* ctrl tab */ + case 0xA5: return(ALTD | CTRL | 'I'); /* alt tab */ case 0x10: return(ALTD | 'Q'); case 0x11: return(ALTD | 'W'); diff -cbr src-orig/line.c src/line.c *** src-orig/line.c Mon Dec 16 11:42:20 1991 --- src/line.c Sun Dec 22 16:19:08 1991 *************** *** 838,843 **** --- 838,882 ---- return(TRUE); } + + /* + * Delete the line the cursor is on + */ + PASCAL NEAR delline(f, n) + int f, n; + { + + /* Use the lines associated with i in order to keep the + cursor in the same column when deleting a line. If you + comment these lines out then the cursor will revert to + the first column. */ + + int i,i1; + + i1 = lastflag; + i = getccol(FALSE); + gotobol(f,n); + + lastflag = thisflag; + thisflag = 0; + setmark(f,n); + + lastflag = thisflag; + thisflag = 0; + forwline(f,n); + + lastflag = i1; /* This so if several lines are killed at the */ + thisflag = 0; /* same time, they will all go into the same */ + killregion(f, n); /* kill buffer */ + + curgoal = i; + curwp->w_doto = getgoal(curwp->w_dotp); + + lastflag = i1; + return(TRUE); + } + + /* * Delete all of the text saved in the kill buffer. Called by commands when a * new kill context is being created. The kill buffer array is released, just diff -cbr src-orig/main.c src/main.c *** src-orig/main.c Mon Dec 16 11:42:20 1991 --- src/main.c Sun Dec 22 16:19:08 1991 *************** *** 218,227 **** #if WMCS if (argv[carg][0] == ':') { #else ! if (argv[carg][0] == '-') { #endif switch (argv[carg][1]) { /* Process Startup macroes */ case 'c': /* -c for changable file */ case 'C': viewflag = FALSE; --- 218,242 ---- #if WMCS if (argv[carg][0] == ':') { #else ! if (argv[carg][0] == '-' || argv[carg][0] == '+') { ! /* ^^^^^^^^^^^^^^^^^^^^^^^ */ ! /* added by J.Bayer to allow */ ! /* compatability with vi */ #endif + /* J.Bayer, 9/22/88 */ + if (argv[carg][0] == '+') { /* + to emulate vi */ + gotoflag = TRUE; + gline = asc_int(&argv[carg][1]); + } else switch (argv[carg][1]) { /* Process Startup macroes */ + #ifdef BACKUP + /* J. Bayer 9/22/88 */ + case 'b': /* -b for no bakfile creation */ + case 'B': + bakfile = FALSE; + break; + #endif case 'c': /* -c for changable file */ case 'C': viewflag = FALSE; *************** *** 881,886 **** --- 896,902 ---- prefix |= META; prenum = n; predef = f; + thisflag = lastflag; /* jbayer */ return(TRUE); } *************** *** 892,897 **** --- 908,914 ---- prefix |= CTLX; prenum = n; predef = f; + thisflag = lastflag; /* jbayer */ return(TRUE); } diff -cbr src-orig/mouse.c src/mouse.c *** src-orig/mouse.c Mon Dec 16 11:42:20 1991 --- src/mouse.c Sun Dec 22 16:19:10 1991 *************** *** 600,605 **** --- 600,607 ---- int row; { + if (wp==NULL) + return(FALSE); if (row == wp->w_toprow+wp->w_ntrows && modeflag) return(TRUE); return(FALSE); diff -cbr src-orig/msdos.c src/msdos.c *** src-orig/msdos.c Mon Dec 16 11:42:20 1991 --- src/msdos.c Sun Dec 22 16:19:12 1991 *************** *** 27,32 **** --- 27,33 ---- struct ffblk fileblock; /* structure for directory searches */ #endif #if MSC | ZTC + #include #include struct find_t fileblock; /* structure for directory searches */ *************** *** 42,47 **** --- 43,55 ---- #include #endif + #if MSC + #ifdef SWAPLIB + #include + #define spawnl(m, n1, n2, a, x) swap_spawnlp(n1, n2, a, x) + #endif + #endif + /* Some global variable */ #define INBUFSIZ 40 static int mexist; /* is the mouse driver installed? */ *************** *** 114,120 **** #if MSC | TURBO | DTL | LATTICE | MWC int86x(0x21, &rg, &rg, &segreg); miaddr = (((long)segreg.es) << 16) + (long)rg.x.bx; ! if (miaddr == 0 || *(char * far)miaddr == 0xcf) { #endif #if ZTC int86x(0x21, &rg, &rg, &segreg); --- 122,128 ---- #if MSC | TURBO | DTL | LATTICE | MWC int86x(0x21, &rg, &rg, &segreg); miaddr = (((long)segreg.es) << 16) + (long)rg.x.bx; ! if (miaddr == 0 || *(char far *) miaddr == 0xcf) { #endif #if ZTC int86x(0x21, &rg, &rg, &segreg); *************** *** 440,449 **** --- 448,459 ---- movecursor(term.t_nrow, 0); /* Seek to last line. */ TTflush(); TTkclose(); + TTclose(); /* -- ZU */ shellprog(""); #if WINDOW_TEXT refresh_screen(first_screen); #endif + TTopen(); /* -- ZU */ TTkopen(); sgarbf = TRUE; return(TRUE); *************** *** 470,476 **** --- 480,488 ---- return(s); movecursor(term.t_nrow - 1, 0); TTkclose(); + TTclose(); shellprog(line); + TTopen(); TTkopen(); /* if we are interactive, pause here */ *************** *** 493,499 **** */ PASCAL NEAR execprg(f, n) ! { register int s; char line[NLINE]; --- 505,511 ---- */ PASCAL NEAR execprg(f, n) ! int f, n; { register int s; char line[NLINE]; *************** *** 506,515 **** --- 518,529 ---- return(s); movecursor(term.t_nrow - 1, 0); TTkclose(); + TTclose(); /* -- ZU */ execprog(line); #if WINDOW_TEXT refresh_screen(first_screen); #endif + TTopen(); /* -- ZU */ TTkopen(); /* if we are interactive, pause here */ if (clexec == FALSE) { *************** *** 579,588 **** --- 593,604 ---- /* execute the command */ TTkclose(); + TTclose(); shellprog(line); #if WINDOW_TEXT refresh_screen(first_screen); #endif + TTopen(); TTkopen(); sgarbf = TRUE; *************** *** 657,666 **** --- 673,684 ---- strcat(line," fltout"); movecursor(term.t_nrow - 1, 0); TTkclose(); + TTclose(); shellprog(line); #if WINDOW_TEXT refresh_screen(first_screen); #endif + TTopen(); TTkopen(); sgarbf = TRUE; s = TRUE; *************** *** 711,720 **** --- 729,742 ---- char *getenv(); /* detect current switch character and set us up to use it */ + #if 0 regs.h.ah = 0x37; /* get setting data */ regs.h.al = 0x00; /* get switch character */ intdos(®s, ®s); swchar = (char)regs.h.dl; + #else + swchar = '/'; + #endif /* get name of system shell */ if ((shell = getenv("COMSPEC")) == NULL) { *************** *** 754,764 **** char *cmd; /* Incoming command line to execute */ { ! char *sp; /* temporary string pointer */ char f1[38]; /* FCB1 area (not initialized */ char f2[38]; /* FCB2 area (not initialized */ - char prog[NSTRING]; /* program filespec */ - char tail[NSTRING]; /* command tail with length byte */ union REGS regs; /* parameters for dos call */ #if MWC == 0 struct SREGS segreg; /* segment registers for dis call */ --- 776,784 ---- char *cmd; /* Incoming command line to execute */ { ! #ifndef NEWSPAWN char f1[38]; /* FCB1 area (not initialized */ char f2[38]; /* FCB2 area (not initialized */ union REGS regs; /* parameters for dos call */ #if MWC == 0 struct SREGS segreg; /* segment registers for dis call */ *************** *** 769,774 **** --- 789,799 ---- char *fcb1; /* 4 byte pointer to FCB at PSP+5Ch */ char *fcb2; /* 4 byte pointer to FCB at PSP+6Ch */ } pblock; + #endif + char *sp; /* temporary string pointer */ + char prog[NSTRING]; /* program filespec */ + char tail[NSTRING]; /* command tail with length byte */ + char curdir[NFILEN]; /* current directory save space */ /* parse the command name from the command line */ sp = prog; *************** *** 776,781 **** --- 801,807 ---- *sp++ = *cmd++; *sp = 0; + #ifndef NEWSPAWN /* and parse out the command tail */ while (*cmd && ((*cmd == ' ') || (*cmd == '\t'))) ++cmd; *************** *** 782,787 **** --- 808,814 ---- *tail = (char)(strlen(cmd)); /* record the byte length */ strcpy(&tail[1], cmd); strcat(&tail[1], "\r"); + #endif /* look up the program on the path trying various extentions */ if ((sp = flook(prog, TRUE)) == NULL) *************** *** 792,797 **** --- 819,827 ---- } strcpy(prog, sp); + getcwd(curdir, sizeof(curdir)); /* save current directory */ + + #ifndef NEWSPAWN #if MWC == 0 /* get a pointer to this PSPs environment segment number */ segread(&segreg); *************** *** 858,863 **** --- 888,897 ---- } else rval = -_doserrno; /* failed child call */ #endif + #else + rval = spawnl(P_WAIT, prog, prog, cmd, NULL); + #endif + chdir( curdir ); /* restore current directory */ return((rval < 0) ? FALSE : TRUE); } *************** *** 1052,1054 **** --- 1086,1105 ---- #endif #endif #endif + + #if CHDIR + changecwd(dir) + char *dir; + { + char drive[5]; + unsigned total; + + _splitpath(dir, drive, NULL, NULL, NULL); + + if ( drive[0] != 0 ) + _dos_setdrive(toupper(drive[0]) - '@', &total); + + chdir(dir); + } + #endif + diff -cbr src-orig/os2.c src/os2.c *** src-orig/os2.c Mon Dec 16 11:42:20 1991 --- src/os2.c Sun Dec 22 16:42:30 1991 *************** *** 11,16 **** --- 11,18 ---- */ + #define INCL_BASE + #define INCL_NOPM #define INCL_DOS #include "os2.h" *************** *** 19,35 **** #undef PASCAL #undef NEAR #undef HIBYTE #include "estruct.h" #include "eproto.h" #if OS2 - #define INCL_BASE #include "elang.h" #include "edef.h" /* * Create a subjob with a copy of the command intrepreter in it. When the * command interpreter exits, mark the screen as garbage so that you do a full --- 21,39 ---- #undef PASCAL #undef NEAR #undef HIBYTE + #undef COLOR #include "estruct.h" #include "eproto.h" #if OS2 #include "elang.h" #include "edef.h" + #include + /* * Create a subjob with a copy of the command intrepreter in it. When the * command interpreter exits, mark the screen as garbage so that you do a full *************** *** 37,42 **** --- 41,47 ---- * Under some (unknown) condition, you don't get one free when DCL starts up. */ spawncli(f, n) + int f, n; { /* don't allow this command if restricted */ if (restflag) *************** *** 58,63 **** --- 63,69 ---- * done. Bound to "C-X !". */ spawn(f, n) + int f, n; { register int s; char line[NLINE]; *************** *** 90,95 **** --- 96,102 ---- */ execprg(f, n) + int f, n; { register int s; char line[NLINE]; *************** *** 121,126 **** --- 128,134 ---- * MicroEMACS don't try to use the same file. */ pipecmd(f, n) + int f, n; { register WINDOW *wp; /* pointer to new window */ register BUFFER *bp; /* pointer to buffer to zot */ *************** *** 211,217 **** * MicroEMACS don't try to use the same file. */ filter(f, n) ! { register int s; /* return status from CLI */ register BUFFER *bp; /* pointer to buffer to zot */ --- 219,225 ---- * MicroEMACS don't try to use the same file. */ filter(f, n) ! int f, n; { register int s; /* return status from CLI */ register BUFFER *bp; /* pointer to buffer to zot */ *************** *** 308,318 **** return(FALSE); /* No shell located */ } ! /* ! * We are actually setting up a shell inside a shell here. ! * Is there a better way? ! */ ! return(system(shell)); } --- 316,322 ---- return(FALSE); /* No shell located */ } ! return(spawnl(P_WAIT, shell, shell, NULL)); } *************** *** 324,330 **** char failName[NFILEN]; char prog[NSTRING]; /* name of program */ USHORT i; ! PRESULTCODES results; /* --- 328,334 ---- char failName[NFILEN]; char prog[NSTRING]; /* name of program */ USHORT i; ! RESULTCODES results; /* *************** *** 352,360 **** --- 356,367 ---- if ((sp = flook(prog, TRUE)) == NULL) if ((sp = flook(strcat(prog, ".exe"), TRUE)) == NULL) { strcpy(&prog[strlen(prog)-4], ".com"); + if ((sp = flook(prog, TRUE)) == NULL) { + strcpy(&prog[strlen(prog)-4], ".cmd"); if ((sp = flook(prog, TRUE)) == NULL) return(FALSE); } + } strcpy(prog, sp); /* *************** *** 361,374 **** * Execute the program synchronously. We wait for child * to return. */ ! return (0 == DosExecPgm( failName, NFILEN, EXEC_SYNC, ! args, 0, results, prog)); } /* FILE Directory routines */ ! FILEFINDBUF pBuf; /* buffer to hold file information */ HDIR hDir; /* directory handle */ int num_found; /* number of directory entries found/to find */ --- 368,381 ---- * Execute the program synchronously. We wait for child * to return. */ ! return (0 == DosExecPgm(failName, sizeof(failName), EXEC_SYNC, ! args, 0, &results, prog)); } /* FILE Directory routines */ ! FILEFINDBUF fbuf; /* buffer to hold file information */ HDIR hDir; /* directory handle */ int num_found; /* number of directory entries found/to find */ *************** *** 415,430 **** /* and call for the first file */ num_found = 1; ! hDir = HDIR_CREATE; if (DosFindFirst(fname, &hDir, FILE_NORMAL|FILE_DIRECTORY, ! &pBuf, sizeof(pBuf), &num_found, 0L) != 0) return(NULL); /* return the first file name! */ strcpy(rbuf, path); ! strcat(rbuf, pBuf.achName); ! mklower(rbuf); ! if (pBuf.attrFile == FILE_DIRECTORY) strcat(rbuf, DIRSEPSTR); return(rbuf); } --- 422,437 ---- /* and call for the first file */ num_found = 1; ! hDir = HDIR_SYSTEM; if (DosFindFirst(fname, &hDir, FILE_NORMAL|FILE_DIRECTORY, ! &fbuf, sizeof(fbuf), &num_found, 0L) != 0) return(NULL); /* return the first file name! */ strcpy(rbuf, path); ! strcat(rbuf, fbuf.achName); ! /* mklower(rbuf); */ ! if (fbuf.attrFile == FILE_DIRECTORY) strcat(rbuf, DIRSEPSTR); return(rbuf); } *************** *** 438,451 **** char fname[NFILEN]; /* file/path for DOS call */ /* and call for the next file */ ! if (DosFindNext(hDir, (void *)&pBuf, sizeof(pBuf), &num_found) != 0) return(NULL); /* return the first file name! */ strcpy(rbuf, path); ! strcat(rbuf, pBuf.achName); ! mklower(rbuf); ! if (pBuf.attrFile == FILE_DIRECTORY) strcat(rbuf, DIRSEPSTR); return(rbuf); } --- 445,458 ---- char fname[NFILEN]; /* file/path for DOS call */ /* and call for the next file */ ! if (DosFindNext(hDir, (void *)&fbuf, sizeof(fbuf), &num_found) != 0) return(NULL); /* return the first file name! */ strcpy(rbuf, path); ! strcat(rbuf, fbuf.achName); ! /* mklower(rbuf); */ ! if (fbuf.attrFile == FILE_DIRECTORY) strcat(rbuf, DIRSEPSTR); return(rbuf); } *************** *** 465,567 **** return(sp); } ! #if OBSOLETE ! /* extcode: resolve MSDOS extended character codes ! encoding the proper sequences into emacs ! printable character specifications ! */ ! ! int extcode( ! unsigned c /* byte following a zero extended char byte */ ! ) ! ! { ! /* function keys 1 through 9 */ ! if (c >= 59 && c < 68) ! return(SPEC | c - 58 + '0'); ! ! /* function key 10 */ ! if (c == 68) ! return(SPEC | '0'); ! ! /* shifted function keys */ ! if (c >= 84 && c < 93) ! return(SPEC | SHFT | c - 83 + '0'); ! if (c == 93) ! return(SPEC | SHFT | '0'); ! ! /* control function keys */ ! if (c >= 94 && c < 103) ! return(SPEC | CTRL | c - 93 + '0'); ! if (c == 103) ! return(SPEC | CTRL | '0'); ! ! /* ALTed function keys */ ! if (c >= 104 && c < 113) ! return(SPEC | ALTD | c - 103 + '0'); ! if (c == 113) ! return(SPEC | ALTD | '0'); ! ! /* ALTed number keys */ ! if (c >= 120 && c < 129) ! return(ALTD | c - 119 + '0'); ! if (c == 130) ! return(ALTD | '0'); ! ! /* some others as well */ ! switch (c) { ! case 3: return(0); /* null */ ! case 15: return(SHFT | CTRL | 'I'); /* backtab */ ! ! case 16: return(ALTD | 'Q'); ! case 17: return(ALTD | 'W'); ! case 18: return(ALTD | 'E'); ! case 19: return(ALTD | 'R'); ! case 20: return(ALTD | 'T'); ! case 21: return(ALTD | 'Y'); ! case 22: return(ALTD | 'U'); ! case 23: return(ALTD | 'I'); ! case 24: return(ALTD | 'O'); ! case 25: return(ALTD | 'P'); ! ! case 30: return(ALTD | 'A'); ! case 31: return(ALTD | 'S'); ! case 32: return(ALTD | 'D'); ! case 33: return(ALTD | 'F'); ! case 34: return(ALTD | 'G'); ! case 35: return(ALTD | 'H'); ! case 36: return(ALTD | 'J'); ! case 37: return(ALTD | 'K'); ! case 38: return(ALTD | 'L'); ! ! case 44: return(ALTD | 'Z'); ! case 45: return(ALTD | 'X'); ! case 46: return(ALTD | 'C'); ! case 47: return(ALTD | 'V'); ! case 48: return(ALTD | 'B'); ! case 49: return(ALTD | 'N'); ! case 50: return(ALTD | 'M'); ! ! case 71: return(SPEC | '<'); /* HOME */ ! case 72: return(SPEC | 'P'); /* cursor up */ ! case 73: return(SPEC | 'Z'); /* page up */ ! case 75: return(SPEC | 'B'); /* cursor left */ ! case 77: return(SPEC | 'F'); /* cursor right */ ! case 79: return(SPEC | '>'); /* end */ ! case 80: return(SPEC | 'N'); /* cursor down */ ! case 81: return(SPEC | 'V'); /* page down */ ! case 82: return(SPEC | 'C'); /* insert */ ! case 83: return(SPEC | 'D'); /* delete */ ! case 115: return(SPEC | CTRL | 'B'); /* control left */ ! case 116: return(SPEC | CTRL | 'F'); /* control right */ ! case 117: return(SPEC | CTRL | '>'); /* control END */ ! case 118: return(SPEC | CTRL | 'V'); /* control page down */ ! case 119: return(SPEC | CTRL | '<'); /* control HOME */ ! case 132: return(SPEC | CTRL | 'Z'); /* control page up */ ! } ! return(ALTD | c); } ! #endif /* obsolete */ #endif --- 472,492 ---- return(sp); } ! ! #if CHDIR ! changecwd(dir) ! char *dir; ! { ! char drive[5]; ! _splitpath(dir, drive, NULL, NULL, NULL); ! ! if ( drive[0] != 0 ) ! DosSelectDisk(toupper(drive[0]) - '@'); ! ! chdir(dir); } ! #endif ! #endif diff -cbr src-orig/os2npm.c src/os2npm.c *** src-orig/os2npm.c Mon Dec 16 11:42:20 1991 --- src/os2npm.c Sun Dec 22 16:19:16 1991 *************** *** 12,17 **** --- 12,18 ---- */ #define INCL_BASE + #define INCL_NOPM #include #define termdef 1 /* don't define "term" external */ *************** *** 18,23 **** --- 19,25 ---- #include + #undef COLOR #undef PASCAL #undef NEAR #undef HIBYTE *************** *** 33,41 **** * We need COLOR as defined in estruct.h, so edit it out of os2def.h. */ #include ! #define NROW 50 /* Screen size. */ ! #define NCOL 80 /* Edit if you want to. */ #define MARGIN 8 /* size of minimim margin and */ #define SCRSIZ 64 /* scroll size for extended lines */ #define NPAUSE 100 /* # times thru update to pause */ --- 35,44 ---- * We need COLOR as defined in estruct.h, so edit it out of os2def.h. */ #include + #include ! #define NROW 128 /* Screen size. */ ! #define NCOL 140 /* Edit if you want to. */ #define MARGIN 8 /* size of minimim margin and */ #define SCRSIZ 64 /* scroll size for extended lines */ #define NPAUSE 100 /* # times thru update to pause */ *************** *** 47,56 **** #define NDRIVE 4 /* number of video modes */ ! int dtype = -1; /* current video mode */ ! char drvname[][8] = { /* names of video modes */ ! "CGA", "MONO", "EGA", "VGA" ! }; /* Forward references. */ --- 50,57 ---- #define NDRIVE 4 /* number of video modes */ ! int mono = 0; ! /* Forward references. */ *************** *** 84,91 **** } os2rcell = {0, 0x07}; static struct { /* initial states */ - USHORT ansiState; /* ANSI translation */ - VIOCONFIGINFO vioConfigInfo; /* video configuration */ VIOMODEINFO vioModeInfo; /* video mode */ KBDINFO kbdInfo; /* keyboard info */ } initial; --- 85,90 ---- *************** *** 153,159 **** PASCAL NEAR os2fcol( int color) /* color to set */ { ! if (dtype != CDMONO) cfcolor = ctrans[color]; else cfcolor = 7; --- 152,158 ---- PASCAL NEAR os2fcol( int color) /* color to set */ { ! if (!mono) cfcolor = ctrans[color]; else cfcolor = 7; *************** *** 175,181 **** PASCAL NEAR os2bcol( int color) /* color to set */ { ! if (dtype != CDMONO) cbcolor = ctrans[color]; else cbcolor = 0; --- 174,180 ---- PASCAL NEAR os2bcol( int color) /* color to set */ { ! if (!mono) cbcolor = ctrans[color]; else cbcolor = 0; *************** *** 202,208 **** --- 201,225 ---- { os2row = row; os2col = col; + if ( _osmode == OS2_MODE ) VioSetCurPos(os2row, os2col, 0); + else + _asm + { + mov ah,2 + mov bh,0 + mov dh,byte ptr os2row + mov dl,byte ptr os2col + int 0x10 + } + } + + os2vmove( /* speedup for special case in updateline */ + int row, + int col) + { + os2row = row; + os2col = col; } *************** *** 215,221 **** { if (lvbMin <= lvbMax) { /* did anything change? */ VioShowBuf(lvbMin * 2, (lvbMax - lvbMin + 1) * 2, 0); ! VioSetCurPos(os2row, os2col, 0); } lvbMin = lvbLen; lvbMax = 0; --- 232,238 ---- { if (lvbMin <= lvbMax) { /* did anything change? */ VioShowBuf(lvbMin * 2, (lvbMax - lvbMin + 1) * 2, 0); ! os2move(os2row, os2col); } lvbMin = lvbLen; lvbMax = 0; *************** *** 256,262 **** /* Function, edit or alt- key? */ if (keyInfo.chChar == 0 || keyInfo.chChar == 0xE0) { ! nextc = extcode(keyInfo.chScan); /* hold on to scan code */ return(0); } return(keyInfo.chChar & 255); --- 273,280 ---- /* Function, edit or alt- key? */ if (keyInfo.chChar == 0 || keyInfo.chChar == 0xE0) { ! nextc = extcode(keyInfo.chScan | (keyInfo.chChar << 8)); ! /* hold on to scan code */ return(0); } return(keyInfo.chChar & 255); *************** *** 294,300 **** USHORT i; if (c == '\n' || c == '\r') { /* returns and linefeeds */ ! return; } if (c == '\b') { /* backspace */ cell = ' ' | (revflag ? *(USHORT *)&os2rcell : *(USHORT *)&os2cell); --- 312,318 ---- USHORT i; if (c == '\n' || c == '\r') { /* returns and linefeeds */ ! return 0; } if (c == '\b') { /* backspace */ cell = ' ' | (revflag ? *(USHORT *)&os2rcell : *(USHORT *)&os2cell); *************** *** 347,353 **** USHORT i; #if COLOR ! if (dtype != CDMONO) cell |= (ctrans[gbcolor] << 4 | ctrans[gfcolor]) << 8; else cell |= 0x0700; --- 365,371 ---- USHORT i; #if COLOR ! if (!mono) cell |= (ctrans[gbcolor] << 4 | ctrans[gfcolor]) << 8; else cell |= 0x0700; *************** *** 382,425 **** /* Change the screen resolution. */ /*----------------------------------------------------------------------*/ PASCAL NEAR os2cres(char *res) /* name of desired video mode */ { ! USHORT err; ! int type; /* video mode type */ VIOMODEINFO vioModeInfo; vioModeInfo = initial.vioModeInfo; ! /* From the name, find the type of video mode. */ ! for (type = 0; type < NDRIVE; type++) { ! if (strcmp(res, drvname[type]) == 0) ! break; ! } ! if (type == NDRIVE) ! return(FALSE); /* not a mode we know about */ ! ! ! switch (type) { ! case CDMONO: ! case CDCGA: ! vioModeInfo.row = 25; ! break; ! case CDEGA: ! vioModeInfo.row = 43; ! break; ! case CDVGA: ! vioModeInfo.row = 50; ! break; ! } ! if (VioSetMode(&vioModeInfo, 0)) /* change modes */ ! return(FALSE); /* couldn't do it */ newsize(TRUE, vioModeInfo.row); /* reset the $sres environment variable */ ! strcpy(sres, drvname[type]); ! dtype = type; /* set the current mode */ return TRUE; } --- 400,461 ---- /* Change the screen resolution. */ /*----------------------------------------------------------------------*/ + static int checkmode(VIOMODEINFO *vmi, int scans, int lines, int font) + { + int diff = scans - lines * font; + + if ( (0 <= diff) && (diff < font) ) + { + vmi -> vres = scans; + vmi -> row = lines; + return(TRUE); + } + else + return(FALSE); + + } + PASCAL NEAR os2cres(char *res) /* name of desired video mode */ { ! USHORT lines; VIOMODEINFO vioModeInfo; + if ( ((lines = atoi(res)) < 16) || (lines >= NROW) ) + return(FALSE); + vioModeInfo = initial.vioModeInfo; + vioModeInfo.vres = vioModeInfo.vres / vioModeInfo.row * lines; + vioModeInfo.row = lines; ! if (VioSetMode(&vioModeInfo, 0)) ! { ! /* only 350, 400 or 480 scan lines allowed ? */ ! /* (i.e. full screen) */ ! vioModeInfo = initial.vioModeInfo; ! ! if ( !(checkmode(&vioModeInfo, 480, lines, 16) || ! checkmode(&vioModeInfo, 480, lines, 14) || ! checkmode(&vioModeInfo, 480, lines, 8) || ! checkmode(&vioModeInfo, 400, lines, 16) || ! checkmode(&vioModeInfo, 400, lines, 14) || ! checkmode(&vioModeInfo, 400, lines, 8) || ! checkmode(&vioModeInfo, 350, lines, 16) || ! checkmode(&vioModeInfo, 350, lines, 14) || ! checkmode(&vioModeInfo, 350, lines, 8)) ) ! return(FALSE); ! vioModeInfo.hres = (vioModeInfo.vres == 350) ? 640 : 720; + if (VioSetMode(&vioModeInfo, 0)) + return(FALSE); + } + + VioGetMode(&vioModeInfo, 0); + term.t_ncol = vioModeInfo.col; newsize(TRUE, vioModeInfo.row); /* reset the $sres environment variable */ ! itoa(vioModeInfo.row, sres, 10); return TRUE; } *************** *** 454,486 **** PASCAL NEAR os2open() { ! initial.vioConfigInfo.cb = 0x0A; ! VioGetConfig(0, &initial.vioConfigInfo, 0); ! switch (initial.vioConfigInfo.adapter) { ! case 3: ! dtype = CDVGA; ! break; ! case 2: ! dtype = CDEGA; ! break; ! case 1: ! dtype = CDCGA; ! break; ! case 0: ! default: ! dtype = CDMONO; ! } ! strcpy(sres, drvname[dtype]); ! initial.vioModeInfo.cb = 0x0E; VioGetMode(&initial.vioModeInfo, 0); ! newsize(TRUE, initial.vioModeInfo.row); ! VioGetAnsi(&initial.ansiState, 0); VioGetBuf((PULONG)&lvb, &lvbLen, 0); lvbMin = lvbLen; lvbMax = 0; revexist = TRUE; revflag = FALSE; } --- 490,531 ---- PASCAL NEAR os2open() { ! VIOINTENSITY vi; ! PFNSIGHANDLER oldhandler; ! USHORT oldact; ! initial.vioModeInfo.cb = sizeof(initial.vioModeInfo); VioGetMode(&initial.vioModeInfo, 0); ! mono = (initial.vioModeInfo.color == COLORS_2); ! ! if ( _osmode == OS2_MODE ) ! { ! term.t_ncol = initial.vioModeInfo.col; ! term.t_nrow = initial.vioModeInfo.row; ! } ! else ! { ! term.t_ncol = *((char *) 0x0040004AL); ! term.t_nrow = *((char *) 0x00400084L) + 1; ! } ! ! newsize(TRUE, term.t_nrow); ! itoa(term.t_nrow + 1, sres, 10); ! vi.cb = sizeof(vi); ! vi.type = 2; ! vi.fs = 1; ! VioSetState(&vi, 0); ! VioGetBuf((PULONG)&lvb, &lvbLen, 0); lvbMin = lvbLen; lvbMax = 0; + DosSetSigHandler((PFNSIGHANDLER) NULL, &oldhandler, &oldact, + SIGA_IGNORE, SIG_CTRLBREAK); + DosSetSigHandler((PFNSIGHANDLER) NULL, &oldhandler, &oldact, + SIGA_IGNORE, SIG_CTRLC); + revexist = TRUE; revflag = FALSE; } *************** *** 493,502 **** PASCAL NEAR os2close() { ! VioSetAnsi(initial.ansiState, 0); VioSetMode(&initial.vioModeInfo, 0); VioSetCurPos(initial.vioModeInfo.row - 1, initial.vioModeInfo.col - 1, 0); } /*----------------------------------------------------------------------*/ --- 538,551 ---- PASCAL NEAR os2close() { ! if ( _osmode == OS2_MODE ) ! { VioSetMode(&initial.vioModeInfo, 0); VioSetCurPos(initial.vioModeInfo.row - 1, initial.vioModeInfo.col - 1, 0); + } + else + os2move(term.t_nrow - 1, term.t_ncol - 1); } /*----------------------------------------------------------------------*/ *************** *** 508,514 **** { KBDINFO kbdInfo; ! initial.kbdInfo.cb = 0x000A; KbdGetStatus(&initial.kbdInfo, 0); kbdInfo = initial.kbdInfo; kbdInfo.fsMask &= ~0x0001; /* not echo on */ --- 557,563 ---- { KBDINFO kbdInfo; ! initial.kbdInfo.cb = sizeof(initial.kbdInfo); KbdGetStatus(&initial.kbdInfo, 0); kbdInfo = initial.kbdInfo; kbdInfo.fsMask &= ~0x0001; /* not echo on */ diff -cbr src-orig/random.c src/random.c *** src-orig/random.c Mon Dec 16 11:42:22 1991 --- src/random.c Sun Dec 22 16:19:18 1991 *************** *** 265,270 **** --- 265,289 ---- stabsize = n; return(TRUE); } + + #if SOFTAB + + if (curwp->w_bufp->b_mode & MDOVER) { + if (! tabsize) { + curgoal = getccol(FALSE) | 0x07; + curgoal++; + } + else { + curgoal = tabsize - (getccol(FALSE) % tabsize) + getccol(FALSE); + } + + curwp->w_doto = getgoal(curwp->w_dotp); + return(TRUE); + } + + #endif + + if (!stabsize) return(linsert(1, '\t')); return(linsert(stabsize - (getccol(FALSE) % stabsize), ' ')); *************** *** 451,456 **** --- 470,497 ---- return(s); } + + /* + * Toggle overwrite mode. Bound to the ins key. + */ + PASCAL NEAR toggleovermode(f, n) /* toggle overwrite mode */ + + int f, n; /* default and argument */ + + { + if (curwp->w_bufp->b_mode & MDOVER) + { + curwp->w_bufp->b_mode &= ~MDOVER; + curwp->w_bufp->b_mode |= MDREPL; + } + else if (curwp->w_bufp->b_mode & MDREPL) + curwp->w_bufp->b_mode &= ~MDREPL; + else + curwp->w_bufp->b_mode |= MDOVER; + upmode(); + } + + /* * Insert a newline. Bound to "C-M". If we are in CMODE, do automatic * indentation as specified. *************** *** 462,467 **** --- 503,517 ---- { register int s; + #if SOFTAB + + if (curwp->w_bufp->b_mode & MDOVER) { + gotobol(f,1); + thisflag = 0; + return(forwline(f,1)); + } + #endif + if (curbp->b_mode&MDVIEW) /* don't allow this command if */ return(rdonly()); /* we are in read only mode */ if (n < 0) *************** *** 868,876 **** register char *scan; /* scanning pointer to convert prompt */ register int i; /* loop index */ register int status; /* error return on input */ - #if COLOR register int uflag; /* was modename uppercase? */ - #endif char prompt[50]; /* string to prompt user with */ char cbuf[NPAT]; /* buffer to recieve mode name into */ --- 918,924 ---- *************** *** 898,906 **** /* make it uppercase */ scan = cbuf; - #if COLOR uflag = (*scan >= 'A' && *scan <= 'Z'); - #endif while (*scan) uppercase(scan++); --- 946,952 ---- diff -cbr src-orig/unix.c src/unix.c *** src-orig/unix.c Mon Dec 16 11:42:24 1991 --- src/unix.c Sun Dec 22 17:12:10 1991 *************** *** 802,807 **** --- 802,810 ---- int status; struct capbind * cb; struct keybind * kp; + #ifdef TIOCGWINSZ + struct winsize win; + #endif char * getenv(), * tgetstr(); #if HPUX *************** *** 831,840 **** exit(1); } /* Get size from termcap */ term.t_nrow = tgetnum("li") - 1; term.t_ncol = tgetnum("co"); ! if (term.t_nrow < 3 || term.t_ncol < 3) { puts("Screen size is too small!"); exit(1); } --- 834,861 ---- exit(1); } + term.t_nrow = -1; + term.t_ncol = -1; + + #ifdef TIOCGWINSZ + if (ioctl (0, TIOCGWINSZ, &win) == 0) { + if (win.ws_col) + term.t_ncol = win.ws_col; + else + term.t_ncol = -1; + if (win.ws_row) + term.t_nrow = win.ws_row - 1; + else + term.t_nrow = -1; + } + #endif /* TIOCGWINSZ */ + /* Get size from termcap */ + if ( term.t_nrow == -1 ) term.t_nrow = tgetnum("li") - 1; + if ( term.t_ncol == -1 ) term.t_ncol = tgetnum("co"); ! if (term.t_nrow < 15 || term.t_ncol < 64) { puts("Screen size is too small!"); exit(1); } *************** *** 1537,1542 **** --- 1558,1571 ---- /* Return the next file name! */ return(rbuf); } + + #if CHDIR + changecwd(dir) + char *dir; + { + chdir(dir); + } + #endif #if FLABEL int fnclabel(f, n) /* label a function key */ diff -cbr src-orig/window.c src/window.c *** src-orig/window.c Mon Dec 16 11:42:24 1991 --- src/window.c Sun Dec 22 16:19:20 1991 *************** *** 37,43 **** --- 37,46 ---- { if (f == FALSE) + { sgarbf = TRUE; + thisflag = lastflag; /* jbayer */ + } else { curwp->w_force = 0; /* Center dot. */