00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "setup.h"
00010
00011 #if EMACS_EDITOR && ! RUN_TIME
00012
00013 #define _EDBASIC_SOURCE_
00014 #include "ed.h"
00015
00016
00017
00018
00019
00020
00021 #if VAX_VMS
00022 #include <stsdef.h>
00023 #include <ssdef.h>
00024 #include <descrip.h>
00025 #include <iodef.h>
00026 #include <ttdef.h>
00027 #include <tt2def.h>
00028
00029 #define NIBUF 128
00030 #define NOBUF 1024
00031 #define EFN 0
00032 #define ESC '\033'
00033 #define TERM '~'
00034
00035 static char obuf[NOBUF];
00036 static int nobuf;
00037 static char ibuf[NIBUF];
00038 static int nibuf;
00039 static int ibufi;
00040 static int oldmode[3];
00041 static int newmode[3];
00042 static short iochan;
00043 #endif
00044
00045 #if WIN_MVC || WIN_BTC || WIN_GCC
00046 #include <dos.h>
00047 #endif
00048
00049 #if UNIX_7 || UNIX_V || LINUX || DARWIN
00050 #include <sys/ioctl.h>
00051 #include <sgtty.h>
00052 static struct sgttyb ostate;
00053 static struct sgttyb nstate;
00054 #endif
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 #if WIN_BTC
00075 #pragma argsused
00076 #endif
00077 globle int gotobol(
00078 void *theEnv,
00079 int f,
00080 int n)
00081 {
00082 curwp->w_doto = 0;
00083 return (TRUE);
00084 }
00085
00086
00087
00088
00089
00090
00091
00092 globle int backchar(
00093 void *theEnv,
00094 int f,
00095 int n)
00096 {
00097 register LINE *lp;
00098
00099 if (n < 0)
00100 return (forwchar(theEnv,f, -n));
00101 while (n--)
00102 {
00103 if (curwp->w_doto == 0)
00104 {
00105 if ((lp=lback(curwp->w_dotp)) == curbp->b_linep)
00106 { return (FALSE); }
00107 curwp->w_dotp = lp;
00108 curwp->w_doto = llength(lp);
00109 curwp->w_flag |= WFMOVE;
00110 }
00111 else
00112 { curwp->w_doto--; }
00113 }
00114 return (TRUE);
00115 }
00116
00117
00118
00119
00120 #if WIN_BTC
00121 #pragma argsused
00122 #endif
00123 globle int gotoeol(
00124 void *theEnv,
00125 int f,
00126 int n)
00127 {
00128 curwp->w_doto = llength(curwp->w_dotp);
00129 return (TRUE);
00130 }
00131
00132
00133
00134
00135
00136
00137
00138 globle int forwchar(
00139 void *theEnv,
00140 int f,
00141 int n)
00142 {
00143 if (n < 0)
00144 return (backchar(theEnv,f, -n));
00145 while (n--) {
00146 if (curwp->w_doto == llength(curwp->w_dotp)) {
00147 if (curwp->w_dotp == curbp->b_linep)
00148 return (FALSE);
00149 curwp->w_dotp = lforw(curwp->w_dotp);
00150 curwp->w_doto = 0;
00151 curwp->w_flag |= WFMOVE;
00152 } else
00153 curwp->w_doto++;
00154 }
00155 return (TRUE);
00156 }
00157
00158
00159
00160
00161
00162
00163 #if WIN_BTC
00164 #pragma argsused
00165 #endif
00166 globle int gotobob(
00167 void *theEnv,
00168 int f,
00169 int n)
00170 {
00171 curwp->w_dotp = lforw(curbp->b_linep);
00172 curwp->w_doto = 0;
00173 curwp->w_flag |= WFHARD;
00174 return (TRUE);
00175 }
00176
00177
00178
00179
00180
00181
00182 #if WIN_BTC
00183 #pragma argsused
00184 #endif
00185 globle int gotoeob(
00186 void *theEnv,
00187 int f,
00188 int n)
00189 {
00190 curwp->w_dotp = curbp->b_linep;
00191 curwp->w_doto = 0;
00192 curwp->w_flag |= WFHARD;
00193 return (TRUE);
00194 }
00195
00196
00197
00198
00199
00200
00201
00202 globle int forwline(
00203 void *theEnv,
00204 int f,
00205 int n)
00206 {
00207 register LINE *dlp;
00208
00209 if (n < 0)
00210 return (backline(theEnv,f, -n));
00211 if ((lastflag&CFCPCN) == 0)
00212 curgoal = curcol;
00213 thisflag |= CFCPCN;
00214 dlp = curwp->w_dotp;
00215 while (n-- && dlp!=curbp->b_linep)
00216 dlp = lforw(dlp);
00217 curwp->w_dotp = dlp;
00218 curwp->w_doto = getgoal(dlp);
00219 curwp->w_flag |= WFMOVE;
00220 return (TRUE);
00221 }
00222
00223
00224
00225
00226
00227
00228
00229 globle int backline(
00230 void *theEnv,
00231 int f,
00232 int n)
00233 {
00234 register LINE *dlp;
00235
00236 if (n < 0)
00237 return (forwline(theEnv,f, -n));
00238 if ((lastflag&CFCPCN) == 0)
00239 curgoal = curcol;
00240 thisflag |= CFCPCN;
00241 dlp = curwp->w_dotp;
00242 while (n-- && lback(dlp)!=curbp->b_linep)
00243 dlp = lback(dlp);
00244 curwp->w_dotp = dlp;
00245 curwp->w_doto = getgoal(dlp);
00246 curwp->w_flag |= WFMOVE;
00247 return (TRUE);
00248 }
00249
00250
00251
00252
00253
00254
00255 globle int getgoal(
00256 LINE *dlp)
00257 {
00258 register int c;
00259 register int col;
00260 register int newcol;
00261 register int dbo;
00262
00263 col = 0;
00264 dbo = 0;
00265 while (dbo != llength(dlp)) {
00266 c = lgetc(dlp, dbo);
00267 newcol = col;
00268 if (c == '\t')
00269 newcol |= 0x07;
00270 else if (c<0x20 || c==0x7F)
00271 ++newcol;
00272 ++newcol;
00273 if (newcol > curgoal)
00274 break;
00275 col = newcol;
00276 ++dbo;
00277 }
00278 return (dbo);
00279 }
00280
00281
00282
00283
00284
00285
00286
00287 globle int forwpage(
00288 void *theEnv,
00289 int f,
00290 int n)
00291 {
00292 register LINE *lp;
00293
00294 if (f == FALSE) {
00295 n = curwp->w_ntrows - 2;
00296 if (n <= 0)
00297 n = 1;
00298 } else if (n < 0)
00299 return (backpage(theEnv,f, -n));
00300 #if CVMVAS
00301 else
00302 n *= curwp->w_ntrows;
00303 #endif
00304 lp = curwp->w_linep;
00305 while (n-- && lp!=curbp->b_linep)
00306 lp = lforw(lp);
00307 curwp->w_linep = lp;
00308 curwp->w_dotp = lp;
00309 curwp->w_doto = 0;
00310 curwp->w_flag |= WFHARD;
00311 return (TRUE);
00312 }
00313
00314
00315
00316
00317
00318
00319
00320 globle int backpage(
00321 void *theEnv,
00322 int f,
00323 int n)
00324 {
00325 register LINE *lp;
00326
00327 if (f == FALSE) {
00328 n = curwp->w_ntrows - 2;
00329 if (n <= 0)
00330 n = 1;
00331 } else if (n < 0)
00332 return (forwpage(theEnv,f, -n));
00333 #if CVMVAS
00334 else
00335 n *= curwp->w_ntrows;
00336 #endif
00337 lp = curwp->w_linep;
00338 while (n-- && lback(lp)!=curbp->b_linep)
00339 lp = lback(lp);
00340 curwp->w_linep = lp;
00341 curwp->w_dotp = lp;
00342 curwp->w_doto = 0;
00343 curwp->w_flag |= WFHARD;
00344 return (TRUE);
00345 }
00346
00347
00348
00349
00350
00351 #if WIN_BTC
00352 #pragma argsused
00353 #endif
00354 globle int setmark(
00355 void *theEnv,
00356 int f,
00357 int n)
00358 {
00359 curwp->w_markp = curwp->w_dotp;
00360 curwp->w_marko = curwp->w_doto;
00361 mlwrite("[Mark set]");
00362 return (TRUE);
00363 }
00364
00365
00366
00367
00368
00369
00370
00371 #if WIN_BTC
00372 #pragma argsused
00373 #endif
00374 globle int swapmark(
00375 void *theEnv,
00376 int f,
00377 int n)
00378 {
00379 register LINE *odotp;
00380 register int odoto;
00381
00382 if (curwp->w_markp == NULL)
00383 {
00384 mlwrite("No mark in this window");
00385 return (FALSE);
00386 }
00387
00388 odotp = curwp->w_dotp;
00389 odoto = curwp->w_doto;
00390 curwp->w_dotp = curwp->w_markp;
00391 curwp->w_doto = curwp->w_marko;
00392 curwp->w_markp = odotp;
00393 curwp->w_marko = odoto;
00394 curwp->w_flag |= WFMOVE;
00395 return (TRUE);
00396 }
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416 #if WIN_BTC
00417 #pragma argsused
00418 #endif
00419 globle int wrapword(
00420 void *theEnv)
00421 {
00422 register int cnt, oldp;
00423 oldp = (int) curwp->w_dotp;
00424 cnt = -1;
00425 do {
00426 cnt++;
00427 if (! backchar(theEnv,0, 1))
00428 return(FALSE);
00429 }
00430 while (! inword());
00431 if (! backword(theEnv,0, 1))
00432 return(FALSE);
00433 if (oldp == (int) (curwp->w_dotp && curwp->w_doto)) {
00434 if (! backdel(theEnv,0, 1))
00435 return(FALSE);
00436 if (! newline(theEnv,0, 1))
00437 return(FALSE);
00438 }
00439 return(forwword(theEnv,0, 1) && forwchar(theEnv,0, cnt));
00440 }
00441
00442
00443
00444
00445
00446
00447 #if WIN_BTC
00448 #pragma argsused
00449 #endif
00450 globle int backword(
00451 void *theEnv,
00452 int f,
00453 int n)
00454 {
00455 if (n < 0)
00456 return (forwword(theEnv,f, -n));
00457 if (backchar(theEnv,FALSE, 1) == FALSE)
00458 return (FALSE);
00459 while (n--) {
00460 while (inword() == FALSE) {
00461 if (backchar(theEnv,FALSE, 1) == FALSE)
00462 return (FALSE);
00463 }
00464 while (inword() != FALSE) {
00465 if (backchar(theEnv,FALSE, 1) == FALSE)
00466 return (FALSE);
00467 }
00468 }
00469 return (forwchar(theEnv,FALSE, 1));
00470 }
00471
00472
00473
00474
00475
00476 #if WIN_BTC
00477 #pragma argsused
00478 #endif
00479 globle int forwword(
00480 void *theEnv,
00481 int f,
00482 int n)
00483 {
00484 if (n < 0)
00485 return (backword(theEnv,f, -n));
00486 while (n--) {
00487 while (inword() == FALSE) {
00488 if (forwchar(theEnv,FALSE, 1) == FALSE)
00489 return (FALSE);
00490 }
00491 while (inword() != FALSE) {
00492 if (forwchar(theEnv,FALSE, 1) == FALSE)
00493 return (FALSE);
00494 }
00495 }
00496 return (TRUE);
00497 }
00498
00499
00500
00501
00502
00503
00504 #if WIN_BTC
00505 #pragma argsused
00506 #endif
00507 globle int upperword(
00508 void *theEnv,
00509 int f,
00510 int n)
00511 {
00512 register int c;
00513
00514 if (n < 0)
00515 return (FALSE);
00516 while (n--) {
00517 while (inword() == FALSE) {
00518 if (forwchar(theEnv,FALSE, 1) == FALSE)
00519 return (FALSE);
00520 }
00521 while (inword() != FALSE) {
00522 c = lgetc(curwp->w_dotp, curwp->w_doto);
00523 if (c>='a' && c<='z') {
00524 c -= 'a'-'A';
00525 lputc(curwp->w_dotp, curwp->w_doto, c);
00526 lchange(WFHARD);
00527 }
00528 if (forwchar(theEnv,FALSE, 1) == FALSE)
00529 return (FALSE);
00530 }
00531 }
00532 return (TRUE);
00533 }
00534
00535
00536
00537
00538
00539
00540 #if WIN_BTC
00541 #pragma argsused
00542 #endif
00543 globle int lowerword(
00544 void *theEnv,
00545 int f,
00546 int n)
00547 {
00548 register int c;
00549
00550 if (n < 0)
00551 return (FALSE);
00552 while (n--) {
00553 while (inword() == FALSE) {
00554 if (forwchar(theEnv,FALSE, 1) == FALSE)
00555 return (FALSE);
00556 }
00557 while (inword() != FALSE) {
00558 c = lgetc(curwp->w_dotp, curwp->w_doto);
00559 if (c>='A' && c<='Z') {
00560 c += 'a'-'A';
00561 lputc(curwp->w_dotp, curwp->w_doto, c);
00562 lchange(WFHARD);
00563 }
00564 if (forwchar(theEnv,FALSE, 1) == FALSE)
00565 return (FALSE);
00566 }
00567 }
00568 return (TRUE);
00569 }
00570
00571
00572
00573
00574
00575
00576
00577 #if WIN_BTC
00578 #pragma argsused
00579 #endif
00580 globle int capword(
00581 void *theEnv,
00582 int f,
00583 int n)
00584 {
00585 register int c;
00586
00587 if (n < 0)
00588 return (FALSE);
00589 while (n--) {
00590 while (inword() == FALSE) {
00591 if (forwchar(theEnv,FALSE, 1) == FALSE)
00592 return (FALSE);
00593 }
00594 if (inword() != FALSE) {
00595 c = lgetc(curwp->w_dotp, curwp->w_doto);
00596 if (c>='a' && c<='z') {
00597 c -= 'a'-'A';
00598 lputc(curwp->w_dotp, curwp->w_doto, c);
00599 lchange(WFHARD);
00600 }
00601 if (forwchar(theEnv,FALSE, 1) == FALSE)
00602 return (FALSE);
00603 while (inword() != FALSE) {
00604 c = lgetc(curwp->w_dotp, curwp->w_doto);
00605 if (c>='A' && c<='Z') {
00606 c += 'a'-'A';
00607 lputc(curwp->w_dotp, curwp->w_doto, c);
00608 lchange(WFHARD);
00609 }
00610 if (forwchar(theEnv,FALSE, 1) == FALSE)
00611 return (FALSE);
00612 }
00613 }
00614 }
00615 return (TRUE);
00616 }
00617
00618
00619
00620
00621
00622
00623 #if WIN_BTC
00624 #pragma argsused
00625 #endif
00626 globle int delfword(
00627 void *theEnv,
00628 int f,
00629 int n)
00630 {
00631 register int size;
00632 register LINE *dotp;
00633 register int doto;
00634
00635 if (n < 0)
00636 return (FALSE);
00637
00638 if ((lastflag&CFKILL) == 0)
00639 kdelete(theEnv);
00640 thisflag |= CFKILL;
00641
00642 dotp = curwp->w_dotp;
00643 doto = curwp->w_doto;
00644 size = 0;
00645 while (n--) {
00646 while (inword() == FALSE) {
00647 if (forwchar(theEnv,FALSE, 1) == FALSE)
00648 return (FALSE);
00649 ++size;
00650 }
00651 while (inword() != FALSE) {
00652 if (forwchar(theEnv,FALSE, 1) == FALSE)
00653 return (FALSE);
00654 ++size;
00655 }
00656 }
00657 curwp->w_dotp = dotp;
00658 curwp->w_doto = doto;
00659 return (ldelete(theEnv,(long) size, TRUE));
00660 }
00661
00662
00663
00664
00665
00666
00667 #if WIN_BTC
00668 #pragma argsused
00669 #endif
00670 globle int delbword(
00671 void *theEnv,
00672 int f,
00673 int n)
00674 {
00675 register int size;
00676
00677 if (n < 0)
00678 return (FALSE);
00679 if (backchar(theEnv,FALSE, 1) == FALSE)
00680 return (FALSE);
00681
00682 if ((lastflag&CFKILL) == 0)
00683 kdelete(theEnv);
00684 thisflag |= CFKILL;
00685
00686 size = 0;
00687 while (n--) {
00688 while (inword() == FALSE) {
00689 if (backchar(theEnv,FALSE, 1) == FALSE)
00690 return (FALSE);
00691 ++size;
00692 }
00693 while (inword() != FALSE) {
00694 if (backchar(theEnv,FALSE, 1) == FALSE)
00695 return (FALSE);
00696 ++size;
00697 }
00698 }
00699 if (forwchar(theEnv,FALSE, 1) == FALSE)
00700 return (FALSE);
00701 return (ldelete(theEnv,(long) size, TRUE));
00702 }
00703
00704
00705
00706
00707
00708 globle int inword()
00709 {
00710 register int c;
00711
00712 if (curwp->w_doto == llength(curwp->w_dotp))
00713 return (FALSE);
00714 c = lgetc(curwp->w_dotp, curwp->w_doto);
00715 if (c>='a' && c<='z')
00716 return (TRUE);
00717 if (c>='A' && c<='Z')
00718 return (TRUE);
00719 if (c>='0' && c<='9')
00720 return (TRUE);
00721 if (c=='$')
00722 return (TRUE);
00723 return (FALSE);
00724 }
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744 #if WIN_BTC
00745 #pragma argsused
00746 #endif
00747 globle int killregion(
00748 void *theEnv,
00749 int f,
00750 int n)
00751 {
00752 register int s;
00753 REGION region;
00754
00755 if ((s=getregion(®ion)) != TRUE)
00756 { return (s); }
00757 if ((lastflag&CFKILL) == 0)
00758 { kdelete(theEnv); }
00759 thisflag |= CFKILL;
00760 curwp->w_dotp = region.r_linep;
00761 curwp->w_doto = region.r_offset;
00762 return (ldelete(theEnv,region.r_size, TRUE));
00763 }
00764
00765
00766
00767
00768
00769
00770
00771 #if WIN_BTC
00772 #pragma argsused
00773 #endif
00774 globle int copyregion(
00775 void *theEnv,
00776 int f,
00777 int n)
00778 {
00779 register LINE *linep;
00780 register int loffs;
00781 register int s;
00782 REGION region;
00783
00784 if ((s=getregion(®ion)) != TRUE)
00785 return (s);
00786 if ((lastflag&CFKILL) == 0)
00787 kdelete(theEnv);
00788 thisflag |= CFKILL;
00789 linep = region.r_linep;
00790 loffs = region.r_offset;
00791 while (region.r_size--) {
00792 if (loffs == llength(linep)) {
00793 if ((s=kinsert(theEnv,'\n')) != TRUE)
00794 return (s);
00795 linep = lforw(linep);
00796 loffs = 0;
00797 } else {
00798 if ((s=kinsert(theEnv,lgetc(linep, loffs))) != TRUE)
00799 return (s);
00800 ++loffs;
00801 }
00802 }
00803 mlwrite("Region copied to buffer");
00804 return (TRUE);
00805 }
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815 #if WIN_BTC
00816 #pragma argsused
00817 #endif
00818 globle int lowerregion(
00819 void *theEnv,
00820 int f,
00821 int n)
00822 {
00823 register LINE *linep;
00824 register int loffs;
00825 register int c;
00826 register int s;
00827 REGION region;
00828
00829 if ((s=getregion(®ion)) != TRUE)
00830 return (s);
00831 lchange(WFHARD);
00832 linep = region.r_linep;
00833 loffs = region.r_offset;
00834 while (region.r_size--) {
00835 if (loffs == llength(linep)) {
00836 linep = lforw(linep);
00837 loffs = 0;
00838 } else {
00839 c = lgetc(linep, loffs);
00840 if (c>='A' && c<='Z')
00841 lputc(linep, loffs, c+'a'-'A');
00842 ++loffs;
00843 }
00844 }
00845 return (TRUE);
00846 }
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856 #if WIN_BTC
00857 #pragma argsused
00858 #endif
00859 globle int upperregion(
00860 void *theEnv,
00861 int f,
00862 int n)
00863 {
00864 register LINE *linep;
00865 register int loffs;
00866 register int c;
00867 register int s;
00868 REGION region;
00869
00870 if ((s=getregion(®ion)) != TRUE)
00871 return (s);
00872 lchange(WFHARD);
00873 linep = region.r_linep;
00874 loffs = region.r_offset;
00875 while (region.r_size--) {
00876 if (loffs == llength(linep)) {
00877 linep = lforw(linep);
00878 loffs = 0;
00879 } else {
00880 c = lgetc(linep, loffs);
00881 if (c>='a' && c<='z')
00882 lputc(linep, loffs, c-'a'+'A');
00883 ++loffs;
00884 }
00885 }
00886 return (TRUE);
00887 }
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900 globle int getregion(
00901 REGION *rp)
00902 {
00903 register LINE *flp;
00904 register LINE *blp;
00905 long fsize;
00906 long bsize;
00907
00908 if (curwp->w_markp == NULL) {
00909 mlwrite("No mark set in this window");
00910 return (FALSE);
00911 }
00912 if (curwp->w_dotp == curwp->w_markp) {
00913 rp->r_linep = curwp->w_dotp;
00914 if (curwp->w_doto < curwp->w_marko) {
00915 rp->r_offset = curwp->w_doto;
00916 rp->r_size = (long) (curwp->w_marko-curwp->w_doto);
00917 } else {
00918 rp->r_offset = curwp->w_marko;
00919 rp->r_size = (long) (curwp->w_doto-curwp->w_marko);
00920 }
00921 return (TRUE);
00922 }
00923 blp = curwp->w_dotp;
00924 bsize = (long) curwp->w_doto;
00925 flp = curwp->w_dotp;
00926 fsize = (long) (llength(flp)-curwp->w_doto+1);
00927 while (flp!=curbp->b_linep || lback(blp)!=curbp->b_linep) {
00928 if (flp != curbp->b_linep) {
00929 flp = lforw(flp);
00930 if (flp == curwp->w_markp) {
00931 rp->r_linep = curwp->w_dotp;
00932 rp->r_offset = curwp->w_doto;
00933 rp->r_size = fsize+curwp->w_marko;
00934 return (TRUE);
00935 }
00936 fsize += llength(flp)+1;
00937 }
00938 if (lback(blp) != curbp->b_linep) {
00939 blp = lback(blp);
00940 bsize += llength(blp)+1;
00941 if (blp == curwp->w_markp) {
00942 rp->r_linep = blp;
00943 rp->r_offset = curwp->w_marko;
00944 rp->r_size = bsize - curwp->w_marko;
00945 return (TRUE);
00946 }
00947 }
00948 }
00949 mlwrite("Bug: lost mark");
00950 return (FALSE);
00951 }
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968 #if WIN_BTC
00969 #pragma argsused
00970 #endif
00971 globle int fileread(
00972 void *theEnv,
00973 int f,
00974 int n)
00975 {
00976 register int s;
00977 char fname[NFILEN];
00978
00979 if ((s=mlreply(theEnv,"Visit file: ", fname, NFILEN)) != TRUE)
00980 { return (s); }
00981 return (readin(theEnv,fname));
00982 }
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996 #if WIN_BTC
00997 #pragma argsused
00998 #endif
00999 globle int filevisit(
01000 void *theEnv,
01001 int f,
01002 int n)
01003 {
01004 register int s;
01005 char fname[NFILEN];
01006
01007 if ((s=mlreply(theEnv,"Find file: ", fname, NFILEN)) != TRUE)
01008 return (s);
01009 filevisit_guts(theEnv,fname);
01010 return(TRUE);
01011 }
01012
01013 globle int filevisit_guts(
01014 void *theEnv,
01015 char fname[])
01016 {
01017 register BUFFER *bp;
01018 register WINDOW *wp;
01019 register LINE *lp;
01020 register int i;
01021 register int s;
01022 char bname[NBUFN];
01023
01024 for (bp=bheadp; bp!=NULL; bp=bp->b_bufp) {
01025 if ((bp->b_flag&BFTEMP)==0 && strcmp(bp->b_fname, fname)==0) {
01026 if (--curbp->b_nwnd == 0) {
01027 curbp->b_dotp = curwp->w_dotp;
01028 curbp->b_doto = curwp->w_doto;
01029 curbp->b_markp = curwp->w_markp;
01030 curbp->b_marko = curwp->w_marko;
01031 }
01032 curbp = bp;
01033 curwp->w_bufp = bp;
01034 if (bp->b_nwnd++ == 0) {
01035 curwp->w_dotp = bp->b_dotp;
01036 curwp->w_doto = bp->b_doto;
01037 curwp->w_markp = bp->b_markp;
01038 curwp->w_marko = bp->b_marko;
01039 } else {
01040 wp = wheadp;
01041 while (wp != NULL) {
01042 if (wp!=curwp && wp->w_bufp==bp) {
01043 curwp->w_dotp = wp->w_dotp;
01044 curwp->w_doto = wp->w_doto;
01045 curwp->w_markp = wp->w_markp;
01046 curwp->w_marko = wp->w_marko;
01047 break;
01048 }
01049 wp = wp->w_wndp;
01050 }
01051 }
01052 lp = curwp->w_dotp;
01053 i = curwp->w_ntrows/2;
01054 while (i-- && lback(lp)!=curbp->b_linep)
01055 lp = lback(lp);
01056 curwp->w_linep = lp;
01057 curwp->w_flag |= WFMODE|WFHARD;
01058 mlwrite("[Old buffer]");
01059 return (TRUE);
01060 }
01061 }
01062 makename(bname, fname);
01063 while ((bp=bfind(theEnv,bname, FALSE, 0)) != NULL) {
01064 s = mlreply(theEnv,"Buffer name: ", bname, NBUFN);
01065 if (s == ABORT)
01066 return (s);
01067 if (s == FALSE) {
01068 makename(bname, fname);
01069 break;
01070 }
01071 }
01072 if (bp==NULL && (bp=bfind(theEnv,bname, TRUE, 0))==NULL) {
01073 mlwrite("Cannot create buffer");
01074 return (FALSE);
01075 }
01076 if (--curbp->b_nwnd == 0) {
01077 curbp->b_dotp = curwp->w_dotp;
01078 curbp->b_doto = curwp->w_doto;
01079 curbp->b_markp = curwp->w_markp;
01080 curbp->b_marko = curwp->w_marko;
01081 }
01082 genstrcpy(lastbufn, curbp->b_bname);
01083
01084 curbp = bp;
01085 curwp->w_bufp = bp;
01086 curbp->b_nwnd++;
01087 return (readin(theEnv,fname));
01088 }
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098 globle int readin(
01099 void *theEnv,
01100 char fname[])
01101 {
01102 register LINE *lp1;
01103 register LINE *lp2;
01104 register int i;
01105 register WINDOW *wp;
01106 register BUFFER *bp;
01107 register int s;
01108 register int nbytes;
01109 register int nline;
01110 char line[NLINE];
01111
01112 bp = curbp;
01113 if ((s=bclear(theEnv,bp)) != TRUE)
01114 return (s);
01115 bp->b_flag &= ~(BFTEMP|BFCHG);
01116 genstrcpy(bp->b_fname, fname);
01117 if ((s=ffropen(fname)) == FIOERR)
01118 goto out;
01119 if (s == FIOFNF) {
01120 mlwrite("[New file]");
01121 goto out;
01122 }
01123 mlwrite("[Reading file]");
01124 nline = 0;
01125 while ((s=ffgetline(line, NLINE)) == FIOSUC) {
01126 nbytes = strlen(line);
01127 if ((lp1=lalloc(theEnv,nbytes)) == NULL) {
01128 s = FIOERR;
01129 break;
01130 }
01131 lp2 = lback(curbp->b_linep);
01132 lp2->l_fp = lp1;
01133 lp1->l_fp = curbp->b_linep;
01134 lp1->l_bp = lp2;
01135 curbp->b_linep->l_bp = lp1;
01136 for (i=0; i<nbytes; ++i)
01137 lputc(lp1, i, line[i]);
01138 ++nline;
01139 }
01140 ffclose();
01141 if (s == FIOEOF) {
01142 if (nline == 1)
01143 mlwrite("[Read 1 line]");
01144 else
01145 mlwrite("[Read %d lines]", nline);
01146 }
01147 out:
01148 for (wp=wheadp; wp!=NULL; wp=wp->w_wndp) {
01149 if (wp->w_bufp == curbp) {
01150 wp->w_linep = lforw(curbp->b_linep);
01151 wp->w_dotp = lforw(curbp->b_linep);
01152 wp->w_doto = 0;
01153 wp->w_markp = NULL;
01154 wp->w_marko = 0;
01155 wp->w_flag |= WFMODE|WFHARD;
01156 }
01157 }
01158 if (s == FIOERR)
01159 return (FALSE);
01160 return (TRUE);
01161 }
01162
01163
01164
01165
01166
01167
01168
01169
01170 globle int makename(
01171 char bname[],
01172 char fname[])
01173 {
01174 register char *cp1;
01175 register char *cp2;
01176
01177 cp1 = &fname[0];
01178 while (*cp1 != 0)
01179 ++cp1;
01180
01181 #if VAX_VMS
01182 while (cp1!=&fname[0] && cp1[-1]!=':' && cp1[-1]!=']')
01183 --cp1;
01184 #endif
01185
01186 #if WIN_MVC || WIN_BTC || WIN_GCC
01187 while (cp1!=&fname[0] && cp1[-1]!=':' && cp1[-1]!='\\')
01188 --cp1;
01189 #endif
01190 #if UNIX_7 || UNIX_V || LINUX || DARWIN
01191 while (cp1!=&fname[0] && cp1[-1]!='/')
01192 --cp1;
01193 #endif
01194 cp2 = &bname[0];
01195 while (cp2!=&bname[NBUFN-1] && *cp1!=0 && *cp1!=';')
01196 *cp2++ = *cp1++;
01197 *cp2 = 0;
01198 return(TRUE);
01199 }
01200
01201
01202
01203
01204
01205
01206
01207
01208
01209
01210
01211
01212 #if WIN_BTC
01213 #pragma argsused
01214 #endif
01215 globle int filewrite(
01216 void *theEnv,
01217 int f,
01218 int n)
01219 {
01220 register WINDOW *wp;
01221 register int s;
01222 char fname[NFILEN];
01223 char prompt[NFILEN + 15];
01224
01225 gensprintf(prompt,"Write file [%s]: ",curbp->b_fname);
01226 if ((s=mlreply(theEnv,prompt, fname, NFILEN)) != TRUE) {
01227 if (s == FALSE)
01228 genstrcpy(fname, curbp->b_fname);
01229 else
01230 return (s);
01231 }
01232 if ((s=writeout(fname)) == TRUE) {
01233 genstrcpy(curbp->b_fname, fname);
01234 curbp->b_flag &= ~BFCHG;
01235 wp = wheadp;
01236 while (wp != NULL) {
01237 if (wp->w_bufp == curbp)
01238 wp->w_flag |= WFMODE;
01239 wp = wp->w_wndp;
01240 }
01241 }
01242 return (s);
01243 }
01244
01245
01246
01247
01248
01249
01250
01251
01252
01253 #if WIN_BTC
01254 #pragma argsused
01255 #endif
01256 globle int filesave(
01257 void *theEnv,
01258 int f,
01259 int n)
01260 {
01261 register WINDOW *wp;
01262 register int s;
01263
01264 if ((curbp->b_flag&BFCHG) == 0)
01265 return (TRUE);
01266 if (curbp->b_fname[0] == 0) {
01267 mlwrite("No file name");
01268 return (FALSE);
01269 }
01270 if ((s=writeout(curbp->b_fname)) == TRUE) {
01271 curbp->b_flag &= ~BFCHG;
01272 wp = wheadp;
01273 while (wp != NULL) {
01274 if (wp->w_bufp == curbp)
01275 wp->w_flag |= WFMODE;
01276 wp = wp->w_wndp;
01277 }
01278 }
01279 return (s);
01280 }
01281
01282
01283
01284
01285
01286
01287
01288
01289
01290 globle int writeout(
01291 char *fn)
01292 {
01293 register int s;
01294 register LINE *lp;
01295 register int nline;
01296
01297 if ((s=ffwopen(fn)) != FIOSUC)
01298 return (FALSE);
01299 lp = lforw(curbp->b_linep);
01300 nline = 0;
01301 while (lp != curbp->b_linep) {
01302 if ((s=ffputline(&lp->l_text[0], llength(lp))) != FIOSUC)
01303 break;
01304 ++nline;
01305 lp = lforw(lp);
01306 }
01307 if (s == FIOSUC) {
01308 s = ffclose();
01309 if (s == FIOSUC) {
01310 if (nline == 1)
01311 mlwrite("[Wrote 1 line]");
01312 else
01313 mlwrite("[Wrote %d lines]", nline);
01314 }
01315 } else
01316 ffclose();
01317 if (s != FIOSUC)
01318 return (FALSE);
01319 return (TRUE);
01320 }
01321
01322
01323
01324
01325
01326
01327
01328
01329
01330
01331
01332
01333
01334 #if WIN_BTC
01335 #pragma argsused
01336 #endif
01337 globle int filename(
01338 void *theEnv,
01339 int f,
01340 int n)
01341 {
01342 register WINDOW *wp;
01343 register int s;
01344 char fname[NFILEN];
01345
01346 if ((s=mlreply(theEnv,"Name: ", fname, NFILEN)) == ABORT)
01347 return (s);
01348 if (s == FALSE)
01349 genstrcpy(curbp->b_fname, "");
01350 else
01351 genstrcpy(curbp->b_fname, fname);
01352 wp = wheadp;
01353 while (wp != NULL) {
01354 if (wp->w_bufp == curbp)
01355 wp->w_flag |= WFMODE;
01356 wp = wp->w_wndp;
01357 }
01358 return (TRUE);
01359 }
01360
01361
01362
01363
01364
01365
01366 static FILE *ffp;
01367
01368
01369
01370
01371
01372
01373
01374
01375
01376
01377 globle int ffropen(
01378 char *fn)
01379 {
01380 if ((ffp=fopen(fn, "r")) == NULL)
01381 return (FIOFNF);
01382 return (FIOSUC);
01383 }
01384
01385
01386
01387
01388
01389 globle int ffwopen(
01390 char *fn)
01391 {
01392 #if VAX_VMS
01393 register int fd;
01394
01395 if ((fd=creat(fn, 0666, "rfm=var", "rat=cr")) < 0
01396 || (ffp=fdopen(fd, "w")) == NULL) {
01397 #else
01398 if ((ffp=fopen(fn, "w")) == NULL) {
01399 #endif
01400 mlwrite("Cannot open file for writing");
01401 return (FIOERR);
01402 }
01403 return (FIOSUC);
01404 }
01405
01406
01407
01408
01409 globle int ffclose()
01410 {
01411 #if UNIX_7 || UNIX_V || LINUX || DARWIN
01412 if (fclose(ffp) != FALSE) {
01413 mlwrite("Error closing file");
01414 return(FIOERR);
01415 }
01416 #else
01417 fclose(ffp);
01418 #endif
01419 return (FIOSUC);
01420 }
01421
01422
01423
01424
01425
01426
01427 globle int ffputline(
01428 char buf[],
01429 int nbuf)
01430 {
01431 register int i;
01432
01433 for (i = 0; i < nbuf; ++i)
01434 fputc(buf[i]&0xFF, ffp);
01435
01436 fputc('\n', ffp);
01437
01438 if (ferror(ffp)) {
01439 mlwrite("Write I/O error");
01440 return (FIOERR);
01441 }
01442
01443 return (FIOSUC);
01444 }
01445
01446
01447
01448
01449
01450
01451
01452 globle int ffgetline(
01453 char buf[],
01454 int nbuf)
01455 {
01456 register int c;
01457 register int i;
01458
01459 i = 0;
01460
01461 while ((c = fgetc(ffp)) != EOF && c != '\n') {
01462 if (i >= nbuf-1) {
01463 mlwrite("File has long line");
01464 return (FIOERR);
01465 }
01466 buf[i++] = (char) c;
01467 }
01468
01469 if (c == EOF) {
01470 if (ferror(ffp)) {
01471 mlwrite("File read error");
01472 return (FIOERR);
01473 }
01474
01475 if (i != 0) {
01476 mlwrite("File has funny line at EOF");
01477 return (FIOERR);
01478 }
01479 return (FIOEOF);
01480 }
01481
01482 buf[i] = 0;
01483 return (FIOSUC);
01484 }
01485
01486
01487
01488
01489
01490
01491
01492
01493
01494
01495
01496
01497
01498
01499
01500
01501
01502
01503 globle void ttopen()
01504 {
01505 #if VAX_VMS
01506 struct dsc$descriptor idsc;
01507 struct dsc$descriptor odsc;
01508 char oname[40];
01509 int iosb[2];
01510 int status;
01511
01512 odsc.dsc$a_pointer = "SYS$INPUT";
01513 odsc.dsc$w_length = strlen(odsc.dsc$a_pointer);
01514 odsc.dsc$b_dtype = DSC$K_DTYPE_T;
01515 odsc.dsc$b_class = DSC$K_CLASS_S;
01516 idsc.dsc$b_dtype = DSC$K_DTYPE_T;
01517 idsc.dsc$b_class = DSC$K_CLASS_S;
01518 do {
01519 idsc.dsc$a_pointer = odsc.dsc$a_pointer;
01520 idsc.dsc$w_length = odsc.dsc$w_length;
01521 odsc.dsc$a_pointer = &oname[0];
01522 odsc.dsc$w_length = sizeof(oname);
01523 status = LIB$SYS_TRNLOG(&idsc, &odsc.dsc$w_length, &odsc);
01524 if (status!=SS$_NORMAL && status!=SS$_NOTRAN)
01525 exit(status);
01526 if (oname[0] == 0x1B) {
01527 odsc.dsc$a_pointer += 4;
01528 odsc.dsc$w_length -= 4;
01529 }
01530 } while (status == SS$_NORMAL);
01531 status = SYS$ASSIGN(&odsc, &iochan, 0, 0);
01532 if (status != SS$_NORMAL)
01533 exit(status);
01534 status = SYS$QIOW(EFN, iochan, IO$_SENSEMODE, iosb, 0, 0,
01535 oldmode, sizeof(oldmode), 0, 0, 0, 0);
01536 if (status!=SS$_NORMAL || (iosb[0]&0xFFFF)!=SS$_NORMAL)
01537 exit(status);
01538 newmode[0] = oldmode[0];
01539 newmode[1] = oldmode[1] | TT$M_PASSALL | TT$M_NOECHO;
01540 newmode[1] &= ~(TT$M_TTSYNC|TT$M_HOSTSYNC);
01541 newmode[2] = oldmode[2] | TT2$M_PASTHRU;
01542 status = SYS$QIOW(EFN, iochan, IO$_SETMODE, iosb, 0, 0,
01543 newmode, sizeof(newmode), 0, 0, 0, 0);
01544 if (status!=SS$_NORMAL || (iosb[0]&0xFFFF)!=SS$_NORMAL)
01545 exit(status);
01546 #endif
01547
01548 #if UNIX_7 || UNIX_V || LINUX || DARWIN
01549 ioctl(1,TIOCGETP,&ostate);
01550 ioctl(1,TIOCGETP,&nstate);
01551
01552
01553 nstate.sg_flags |= RAW;
01554 nstate.sg_flags &= ~(ECHO|CRMOD);
01555
01556 ioctl(1,TIOCSETP,&nstate);
01557 #endif
01558 }
01559
01560
01561
01562
01563
01564 globle void ttclose()
01565 {
01566 #if VAX_VMS
01567 int status;
01568 int iosb[1];
01569
01570 ttflush();
01571 status = SYS$QIOW(EFN, iochan, IO$_SETMODE, iosb, 0, 0,
01572 oldmode, sizeof(oldmode), 0, 0, 0, 0);
01573 if (status!=SS$_NORMAL || (iosb[0]&0xFFFF)!=SS$_NORMAL)
01574 exit(status);
01575 status = SYS$DASSGN(iochan);
01576 if (status != SS$_NORMAL)
01577 exit(status);
01578 #endif
01579
01580 #if UNIX_7 || UNIX_V || LINUX || DARWIN
01581
01582 ioctl(1,TIOCSETP,&ostate);
01583 #endif
01584 }
01585
01586
01587
01588
01589
01590
01591 #if WIN_BTC
01592 #pragma argsused
01593 #endif
01594 globle void ttputc(
01595 int c)
01596 {
01597 #if VAX_VMS
01598 if (nobuf >= NOBUF)
01599 ttflush();
01600 obuf[nobuf++] = c;
01601 #endif
01602
01603 #if UNIX_7 || UNIX_V || LINUX || DARWIN
01604 fputc(c, stdout);
01605 #endif
01606 }
01607
01608
01609
01610
01611
01612 globle void ttflush()
01613 {
01614 #if VAX_VMS
01615 int status;
01616 int iosb[2];
01617
01618 status = SS$_NORMAL;
01619 if (nobuf != 0) {
01620 status = SYS$QIOW(EFN, iochan, IO$_WRITELBLK|IO$M_NOFORMAT,
01621 iosb, 0, 0, obuf, nobuf, 0, 0, 0, 0);
01622 if (status == SS$_NORMAL)
01623 status = iosb[0] & 0xFFFF;
01624 nobuf = 0;
01625 }
01626
01627 #endif
01628
01629 #if UNIX_7 || UNIX_V || LINUX || DARWIN
01630 fflush(stdout);
01631 #endif
01632 }
01633
01634
01635
01636
01637
01638
01639 globle int ttgetc()
01640 {
01641 #if VAX_VMS
01642 int status;
01643 int iosb[2];
01644 long term[2];
01645
01646 while (ibufi >= nibuf) {
01647 ibufi = 0;
01648 term[0] = 0;
01649 term[1] = 0;
01650 status = SYS$QIOW(EFN, iochan,
01651 IO$_READLBLK|IO$M_TIMED|IO$M_NOFILTR|IO$M_PURGE,
01652 iosb, 0, 0, ibuf, NIBUF, 0, term, 0, 0);
01653 if (status != SS$_NORMAL)
01654 exit(status);
01655 status = iosb[0] & 0xFFFF;
01656 if (status!=SS$_NORMAL && status!=SS$_TIMEOUT)
01657 exit(status);
01658 nibuf = (iosb[0]>>16) + (iosb[1]>>16);
01659 if (nibuf == 0) {
01660 status = SYS$QIOW(EFN, iochan,IO$_READLBLK|
01661 IO$M_NOFILTR|IO$M_PURGE,
01662 iosb, 0, 0, ibuf, 1, 0, term, 0, 0);
01663 if (status != SS$_NORMAL)
01664 exit(status);
01665 status = (iosb[0]&0xFFFF);
01666 if (status != SS$_NORMAL)
01667 exit(status);
01668 nibuf = (iosb[0]>>16) + (iosb[1]>>16);
01669 }
01670 }
01671 if (ibuf[ibufi] == ESC)
01672 {
01673 status = SYS$QIOW(EFN,iochan,IO$_READLBLK|IO$M_NOFILTR|IO$M_TIMED,
01674 iosb,0,0,ibuf+1,4,0,term,0,0);
01675 nibuf = (iosb[0]>>16) + (iosb[1]>>16) + 1;
01676 if ((status == SS$_NORMAL) && (nibuf > 1))
01677 return(parse_esc_seq());
01678 if ((status != SS$_NORMAL) && (status != SS$_TIMEOUT))
01679 exit(status);
01680 }
01681 return (ibuf[ibufi++] & 0xFF);
01682 #endif
01683
01684 #if WIN_MVC || WIN_BTC || WIN_GCC
01685 return (fgetc(stdin));
01686 #endif
01687
01688 #if UNIX_7 || UNIX_V || LINUX || DARWIN
01689 return(fgetc(stdin));
01690 #endif
01691 }
01692
01693 #if VAX_VMS
01694
01695
01696
01697 globle int parse_esc_seq() {
01698
01699 int index, num;
01700
01701 index = ibufi + 1;
01702 if ((ibuf[index] != '[') && (ibuf[index] != 'O')) {
01703 if ((ibuf[index] >= 'a') && (ibuf[index] <= 'z'))
01704 ibuf[index] = ibuf[index] - ('a' - 'A');
01705 if ((ibuf[index] >= '\000') && (ibuf[index] <= '\037'))
01706 ibuf[index] = COTL | ibuf[index];
01707 ibufi = nibuf + 1;
01708 return (META | ibuf[index]);
01709 }
01710 if (ibuf[index] == '[') index++;
01711 ibufi = nibuf + 1;
01712 switch (ibuf[index]) {
01713 case 'A' : return(COTL | 'P');
01714 break;
01715 case 'B' : return(COTL | 'N');
01716 break;
01717 case 'C' : return(COTL | 'F');
01718 break;
01719 case 'D' : return(COTL | 'B');
01720 break;
01721 case '1' : case '2' : case '3' :
01722 case '4' : case '5' : case '6' :
01723 if (ibuf[index + 1] != TERM)
01724 num = (ibuf[index] - 48)*10 + (ibuf[++index] -48);
01725 else num = ibuf[index] - 48;
01726 switch (num) {
01727 case 1 : return(COTL | 'S');
01728 break;
01729 case 2 : return(COTL | 'Y');
01730 break;
01731 case 3 : return(COTL | 'W');
01732 break;
01733 case 4 : return(COTL | '@');
01734 break;
01735 case 5 : return(META | 'V');
01736 break;
01737 case 6 : return(COTL | 'V');
01738 break;
01739 default : return BADKEY;
01740 }
01741 break;
01742 default : return BADKEY;
01743 }
01744 return(TRUE);
01745 }
01746 #endif
01747
01748 #endif
01749
01750
01751