00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #define VERSION "ELVIS 1.5, by Steve Kirkendall (23 March 1992)"
00011 #define COPYING "This version of ELVIS is freely redistributable."
00012
00013 #include <errno.h>
00014 extern int errno;
00015 #if TOS && !defined(__GNUC__)
00016 #define ENOENT (-AEFILNF)
00017 #endif
00018
00019 #if TOS || VMS
00020 # include <types.h>
00021 # define O_RDONLY 0
00022 # define O_WRONLY 1
00023 # define O_RDWR 2
00024 # ifdef __GNUC__
00025 # define S_IJDIR S_IFDIR
00026 # endif
00027 #else
00028 # if OSK
00029 # include <modes.h>
00030 # define O_RDONLY S_IREAD
00031 # define O_WRONLY S_IWRITE
00032 # define O_RDWR (S_IREAD | S_IWRITE)
00033 # define ENOENT E_PNNF
00034 # define sprintf Sprintf
00035 # else
00036 # include <sys/types.h>
00037 # if COHERENT
00038 # include <sys/fcntl.h>
00039 # else
00040 # include <fcntl.h>
00041 # endif
00042 # endif
00043 #endif
00044
00045 #ifndef O_BINARY
00046 # define O_BINARY 0
00047 #endif
00048
00049 #include "curses.h"
00050
00051 #include <signal.h>
00052
00053
00054
00055
00056 #define INFINITY 2000000001L
00057 #define LONGKEY 10
00058 #ifndef MAXRCLEN
00059 # define MAXRCLEN 1000
00060 #endif
00061
00062
00063
00064
00065 #define MAXBLKS (BLKSIZE / sizeof(unsigned short))
00066 typedef union
00067 {
00068 char c[BLKSIZE];
00069 unsigned short n[MAXBLKS];
00070 }
00071 BLK;
00072
00073
00074
00075
00076 extern BLK hdr;
00077 extern BLK *blkget();
00078 extern BLK *blkadd();
00079
00080
00081
00082 extern struct _viflags
00083 {
00084 short file;
00085 }
00086 viflags;
00087
00088
00089 #define NEWFILE 0x0001
00090 #define READONLY 0x0002
00091 #define HADNUL 0x0004
00092 #define MODIFIED 0x0008
00093 #define NOFILE 0x0010
00094 #define ADDEDNL 0x0020
00095 #define HADBS 0x0040
00096 #define UNDOABLE 0x0080
00097 #define NOTEDITED 0x0100
00098
00099
00100 #define setflag(x,y) viflags.x |= y
00101 #define clrflag(x,y) viflags.x &= ~y
00102 #define tstflag(x,y) (viflags.x & y)
00103 #define initflags() viflags.file = 0;
00104
00105
00106 extern char o_autoindent[1];
00107 extern char o_autoprint[1];
00108 extern char o_autotab[1];
00109 extern char o_autowrite[1];
00110 extern char o_columns[3];
00111 extern char o_directory[30];
00112 extern char o_edcompatible[1];
00113 extern char o_equalprg[80];
00114 extern char o_errorbells[1];
00115 extern char o_exrefresh[1];
00116 extern char o_ignorecase[1];
00117 extern char o_keytime[3];
00118 extern char o_keywordprg[80];
00119 extern char o_lines[3];
00120 extern char o_list[1];
00121 extern char o_number[1];
00122 extern char o_readonly[1];
00123 extern char o_remap[1];
00124 extern char o_report[3];
00125 extern char o_scroll[3];
00126 extern char o_shell[60];
00127 extern char o_shiftwidth[3];
00128 extern char o_sidescroll[3];
00129 extern char o_sync[1];
00130 extern char o_tabstop[3];
00131 extern char o_term[30];
00132 extern char o_flash[1];
00133 extern char o_warn[1];
00134 extern char o_wrapscan[1];
00135
00136 #ifndef CRUNCH
00137 extern char o_beautify[1];
00138 extern char o_exrc[1];
00139 extern char o_mesg[1];
00140 extern char o_more[1];
00141 extern char o_novice[1];
00142 extern char o_prompt[1];
00143 extern char o_taglength[3];
00144 extern char o_terse[1];
00145 extern char o_window[3];
00146 extern char o_wrapmargin[3];
00147 extern char o_writeany[1];
00148 #endif
00149
00150 #ifndef NO_ERRLIST
00151 extern char o_cc[30];
00152 extern char o_make[30];
00153 #endif
00154
00155 #ifndef NO_CHARATTR
00156 extern char o_charattr[1];
00157 #endif
00158
00159 #ifndef NO_DIGRAPH
00160 extern char o_digraph[1];
00161 extern char o_flipcase[80];
00162 #endif
00163
00164 #ifndef NO_SENTENCE
00165 extern char o_hideformat[1];
00166 #endif
00167
00168 #ifndef NO_EXTENSIONS
00169 extern char o_inputmode[1];
00170 extern char o_ruler[1];
00171 #endif
00172
00173 #ifndef NO_MAGIC
00174 extern char o_magic[1];
00175 #endif
00176
00177 #ifndef NO_MODELINES
00178 extern char o_modelines[1];
00179 #endif
00180
00181 #ifndef NO_SENTENCE
00182 extern char o_paragraphs[30];
00183 extern char o_sections[30];
00184 #endif
00185
00186 #if MSDOS
00187 extern char o_pcbios[1];
00188 #endif
00189
00190 #ifndef NO_SHOWMATCH
00191 extern char o_showmatch[1];
00192 #endif
00193
00194 #ifndef NO_SHOWMODE
00195 extern char o_smd[1];
00196 #endif
00197
00198
00199
00200
00201 extern char U_text[BLKSIZE];
00202 extern long U_line;
00203
00204
00205
00206
00207 typedef long MARK;
00208 #define markline(x) (long)((x) / BLKSIZE)
00209 #define markidx(x) (int)((x) & (BLKSIZE - 1))
00210 #define MARK_UNSET ((MARK)0)
00211 #define MARK_FIRST ((MARK)BLKSIZE)
00212 #define MARK_LAST ((MARK)(nlines * BLKSIZE))
00213 #define MARK_AT_LINE(x) ((MARK)(x) * BLKSIZE)
00214
00215 #define NMARKS 29
00216 extern MARK mark[NMARKS];
00217 extern MARK cursor;
00218
00219
00220
00221
00222 extern long origtime;
00223 extern char origname[256];
00224 extern char prevorig[256];
00225 extern long prevline;
00226
00227
00228
00229
00230 extern int tmpfd;
00231 extern int tmpnum;
00232 extern long lnum[MAXBLKS];
00233 extern long nlines;
00234 extern char args[BLKSIZE];
00235 extern int argno;
00236 extern int nargs;
00237 extern long changes;
00238 extern int significant;
00239 extern BLK tmpblk;
00240 extern long topline;
00241 extern int leftcol;
00242 #define botline (topline + LINES - 2)
00243 #define rightcol (leftcol + COLS - (*o_number ? 9 : 1))
00244 extern int physcol;
00245 extern int physrow;
00246 extern int exwrote;
00247 extern int doingdot;
00248 extern int doingglobal;
00249 extern long rptlines;
00250 extern char *rptlabel;
00251 extern char *fetchline();
00252 extern char *parseptrn();
00253 extern MARK paste();
00254 extern char *wildcard();
00255 extern MARK input();
00256 extern char *linespec();
00257 #define ctrl(ch) ((ch)&037)
00258 #ifndef NO_RECYCLE
00259 extern long allocate();
00260 #endif
00261 extern int trapint();
00262 extern int deathtrap();
00263 extern void blkdirty();
00264 extern void blkflush();
00265 extern void blksync();
00266 extern void blkinit();
00267 extern void beep();
00268 extern void exrefresh();
00269 extern void msg();
00270 extern void endmsgs();
00271 extern void garbage();
00272 extern void redraw();
00273 extern void resume_curses();
00274 extern void beforedo();
00275 extern void afterdo();
00276 extern void abortdo();
00277 extern int undo();
00278 extern void dumpkey();
00279 extern void mapkey();
00280 extern void savekeys();
00281 extern void redrawrange();
00282 extern void cut();
00283 extern void delete();
00284 extern void add();
00285 extern void change();
00286 extern void cutswitch();
00287 extern void do_abbr();
00288 extern void do_digraph();
00289 extern void exstring();
00290 extern void dumpopts();
00291 extern void setopts();
00292 extern void saveopts();
00293 extern void savedigs();
00294 extern void saveabbr();
00295 extern void savecolor();
00296 extern void cutname();
00297 extern void cutname();
00298 extern void initopts();
00299 extern void cutend();
00300 #ifndef CRUNCH
00301 extern int wset;
00302 #endif
00303
00304
00305
00306
00307 #define BeforeAfter(before, after) for((before),bavar=1;bavar;(after),bavar=0)
00308 #define ChangeText BeforeAfter(beforedo(FALSE),afterdo())
00309
00310 extern int bavar;
00311
00312
00313
00314
00315
00316 extern MARK m_updnto();
00317 extern MARK m_right();
00318 extern MARK m_left();
00319 extern MARK m_tocol();
00320 extern MARK m_front();
00321 extern MARK m_rear();
00322 extern MARK m_fword();
00323 extern MARK m_bword();
00324 extern MARK m_eword();
00325 extern MARK m_paragraph();
00326 extern MARK m_match();
00327 #ifndef NO_SENTENCE
00328 extern MARK m_sentence();
00329 #endif
00330 extern MARK m_tomark();
00331 #ifndef NO_EXTENSIONS
00332 extern MARK m_wsrch();
00333 #endif
00334 extern MARK m_nsrch();
00335 extern MARK m_Nsrch();
00336 extern MARK m_fsrch();
00337 extern MARK m_bsrch();
00338 #ifndef NO_CHARSEARCH
00339 extern MARK m__ch();
00340 extern MARK m_fch();
00341 extern MARK m_tch();
00342 extern MARK m_Fch();
00343 extern MARK m_Tch();
00344 #endif
00345 extern MARK m_row();
00346 extern MARK m_z();
00347 extern MARK m_scroll();
00348
00349
00350
00351 extern MARK adjmove();
00352
00353
00354 #define DEFAULT(val) if (cnt < 1) cnt = (val)
00355
00356
00357 extern int plen;
00358 extern long pline;
00359 extern long pchgs;
00360 extern char *ptext;
00361 extern void pfetch();
00362 extern char digraph();
00363
00364
00365
00366
00367 #define buildmark(text) (MARK)(BLKSIZE * pline + (int)((text) - ptext))
00368
00369
00370
00371
00372
00373 #define CMD_NULL 0
00374 #define CMD_ABBR 1
00375 #define CMD_ARGS 2
00376 #define CMD_APPEND 3
00377 #define CMD_AT 4
00378 #define CMD_BANG 5
00379 #define CMD_CC 6
00380 #define CMD_CD 7
00381 #define CMD_CHANGE 8
00382 #define CMD_COLOR 9
00383 #define CMD_COPY 10
00384 #define CMD_DELETE 11
00385 #define CMD_DIGRAPH 12
00386 #define CMD_EDIT 13
00387 #define CMD_EQUAL 14
00388 #define CMD_ERRLIST 15
00389 #define CMD_FILE 16
00390 #define CMD_GLOBAL 17
00391 #define CMD_INSERT 18
00392 #define CMD_JOIN 19
00393 #define CMD_LIST 20
00394 #define CMD_MAKE 21
00395 #define CMD_MAP 22
00396 #define CMD_MARK 23
00397 #define CMD_MKEXRC 24
00398 #define CMD_MOVE 25
00399 #define CMD_NEXT 26
00400 #define CMD_NUMBER 27
00401 #define CMD_PRESERVE 28
00402 #define CMD_PREVIOUS 29
00403 #define CMD_PRINT 30
00404 #define CMD_PUT 31
00405 #define CMD_QUIT 32
00406 #define CMD_READ 33
00407 #define CMD_RECOVER 34
00408 #define CMD_REWIND 35
00409 #define CMD_SET 36
00410 #define CMD_SHELL 37
00411 #define CMD_SHIFTL 38
00412 #define CMD_SHIFTR 39
00413 #define CMD_SOURCE 40
00414 #define CMD_STOP 41
00415 #define CMD_SUBAGAIN 42
00416 #define CMD_SUBSTITUTE 43
00417 #define CMD_SUSPEND 44
00418 #define CMD_TR 45
00419 #define CMD_TAG 46
00420 #define CMD_UNABBR 47
00421 #define CMD_UNDO 48
00422 #define CMD_UNMAP 49
00423 #define CMD_VERSION 50
00424 #define CMD_VGLOBAL 51
00425 #define CMD_VISUAL 52
00426 #define CMD_WQUIT 53
00427 #define CMD_WRITE 54
00428 #define CMD_XIT 55
00429 #define CMD_YANK 56
00430 #ifdef DEBUG
00431 # define CMD_DEBUG 57
00432 # define CMD_VALIDATE 58
00433 #endif
00434 typedef int CMD;
00435
00436 extern void ex();
00437 extern void vi();
00438 extern void doexcmd();
00439
00440 extern void cmd_append();
00441 extern void cmd_args();
00442 #ifndef NO_AT
00443 extern void cmd_at();
00444 #endif
00445 extern void cmd_cd();
00446 #ifndef NO_COLOR
00447 extern void cmd_color();
00448 #endif
00449 extern void cmd_delete();
00450 #ifndef NO_DIGRAPH
00451 extern void cmd_digraph();
00452 #endif
00453 extern void cmd_edit();
00454 #ifndef NO_ERRLIST
00455 extern void cmd_errlist();
00456 #endif
00457 extern void cmd_file();
00458 extern void cmd_global();
00459 extern void cmd_join();
00460 extern void cmd_mark();
00461 #ifndef NO_ERRLIST
00462 extern void cmd_make();
00463 #endif
00464 extern void cmd_map();
00465 #ifndef NO_MKEXRC
00466 extern void cmd_mkexrc();
00467 #endif
00468 extern void cmd_next();
00469 extern void cmd_print();
00470 extern void cmd_put();
00471 extern void cmd_read();
00472 extern void cmd_set();
00473 extern void cmd_shell();
00474 extern void cmd_shift();
00475 extern void cmd_source();
00476 extern void cmd_substitute();
00477 extern void cmd_tag();
00478 extern void cmd_undo();
00479 extern void cmd_version();
00480 extern void cmd_write();
00481 extern void cmd_xit();
00482 extern void cmd_move();
00483 #ifdef DEBUG
00484 extern void cmd_debug();
00485 extern void cmd_validate();
00486 #endif
00487 #ifdef SIGTSTP
00488 extern void cmd_suspend();
00489 #endif
00490
00491
00492
00493
00494 extern MARK v_1ex();
00495 extern MARK v_mark();
00496 extern MARK v_quit();
00497 extern MARK v_redraw();
00498 extern MARK v_ulcase();
00499 extern MARK v_undo();
00500 extern MARK v_xchar();
00501 extern MARK v_replace();
00502 extern MARK v_overtype();
00503 extern MARK v_selcut();
00504 extern MARK v_paste();
00505 extern MARK v_yank();
00506 extern MARK v_delete();
00507 extern MARK v_join();
00508 extern MARK v_insert();
00509 extern MARK v_change();
00510 extern MARK v_subst();
00511 extern MARK v_lshift();
00512 extern MARK v_rshift();
00513 extern MARK v_reformat();
00514 extern MARK v_filter();
00515 extern MARK v_status();
00516 extern MARK v_switch();
00517 extern MARK v_tag();
00518 extern MARK v_xit();
00519 extern MARK v_undoline();
00520 extern MARK v_again();
00521 #ifndef NO_EXTENSIONS
00522 extern MARK v_keyword();
00523 extern MARK v_increment();
00524 #endif
00525 #ifndef NO_ERRLIST
00526 extern MARK v_errlist();
00527 #endif
00528 #ifndef NO_AT
00529 extern MARK v_at();
00530 #endif
00531 #ifdef SIGTSTP
00532 extern MARK v_suspend();
00533 #endif
00534 #ifndef NO_POPUP
00535 extern MARK v_popup();
00536 #endif
00537
00538
00539
00540 #define NO_FLAGS 0x00
00541 #define MVMT 0x01
00542 #define PTMV 0x02
00543 #define FRNT 0x04
00544 #define INCL 0x08
00545 #define LNMD 0x10
00546 #define NCOL 0x20
00547 #define NREL 0x40
00548 #define SDOT 0x80
00549 #ifndef NO_VISIBLE
00550 # define VIZ 0x100
00551 #else
00552 # define VIZ 0
00553 #endif
00554
00555
00556
00557
00558
00559
00560
00561 extern int force_flags;
00562
00563
00564
00565
00566 #define MODE_EX 1
00567 #define MODE_VI 2
00568 #define MODE_COLON 3
00569 #define MODE_QUIT 4
00570 extern int mode;
00571
00572 #define WHEN_VICMD 1
00573 #define WHEN_VIINP 2
00574 #define WHEN_VIREP 4
00575 #define WHEN_EX 8
00576 #define WHEN_MSG 16
00577 #define WHEN_POPUP 32
00578 #define WHEN_REP1 64
00579 #define WHEN_CUT 128
00580 #define WHEN_MARK 256
00581 #define WHEN_CHAR 512
00582 #define WHEN_INMV 4096
00583 #define WHEN_FREE 8192
00584 #define WHENMASK (WHEN_VICMD|WHEN_VIINP|WHEN_VIREP|WHEN_REP1|WHEN_CUT|WHEN_MARK|WHEN_CHAR)
00585
00586 #ifndef NO_VISIBLE
00587 extern MARK V_from;
00588 extern int V_linemd;
00589 extern MARK v_start();
00590 #endif
00591
00592 #ifdef DEBUG
00593 # define malloc(size) dbmalloc(size, __FILE__, __LINE__)
00594 # define free(ptr) dbfree(ptr, __FILE__, __LINE__)
00595 extern char *dbmalloc();
00596 #endif