00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "setup.h"
00010
00011 #if EMACS_EDITOR && ! RUN_TIME
00012
00013 #define _EDSTRUCT_SOURCE_
00014 #include "ed.h"
00015
00016 #include <stdarg.h>
00017
00018
00019
00020
00021
00022
00023 typedef struct VIDEO {
00024 short v_flag;
00025 char v_text[1];
00026 } VIDEO;
00027
00028 #define VFCHG 0x0001
00029
00030 globle int mpresf = FALSE;
00031 globle int sgarbf = TRUE;
00032
00033 static int vtrow = 0;
00034 static int vtcol = 0;
00035 static int ttrow = HUGE;
00036 static int ttcol = HUGE;
00037
00038 static VIDEO **vscreen;
00039 static VIDEO **pscreen;
00040
00041
00042
00043
00044
00045
00046 #define NBLOCK 16
00047 #define KBLOCK 256
00048
00049 static char *kbufp = NULL;
00050 static int kused = 0;
00051 static int ksize = 0;
00052
00053 static void int_to_ascii(char [],int,int);
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 #if WIN_BTC
00073 #pragma argsused
00074 #endif
00075 globle int usebuffer(
00076 void *theEnv,
00077 int f,
00078 int n)
00079 {
00080 register BUFFER *bp;
00081 register WINDOW *wp;
00082 register int s;
00083 char bufn[NBUFN];
00084 char prompt[NBUFN + 15];
00085
00086 gensprintf(prompt,"Use buffer [%s]: ",lastbufn);
00087 if ((s=mlreply(theEnv,prompt, bufn, NBUFN)) != TRUE) {
00088 if (( s == FALSE) && (strlen(lastbufn) != 0))
00089 genstrcpy(bufn, lastbufn);
00090 else
00091 return (s);
00092 }
00093 if ((bp=bfind(theEnv,bufn, TRUE, 0)) == NULL)
00094 return (FALSE);
00095 genstrcpy(lastbufn, curbp->b_bname);
00096 if (--curbp->b_nwnd == 0) {
00097 curbp->b_dotp = curwp->w_dotp;
00098 curbp->b_doto = curwp->w_doto;
00099 curbp->b_markp = curwp->w_markp;
00100 curbp->b_marko = curwp->w_marko;
00101 }
00102 curbp = bp;
00103 curwp->w_bufp = bp;
00104 curwp->w_linep = bp->b_linep;
00105 curwp->w_flag |= WFMODE|WFFORCE|WFHARD;
00106 if (bp->b_nwnd++ == 0) {
00107 curwp->w_dotp = bp->b_dotp;
00108 curwp->w_doto = bp->b_doto;
00109 curwp->w_markp = bp->b_markp;
00110 curwp->w_marko = bp->b_marko;
00111 return (TRUE);
00112 }
00113 wp = wheadp;
00114 while (wp != NULL) {
00115 if (wp!=curwp && wp->w_bufp==bp) {
00116 curwp->w_dotp = wp->w_dotp;
00117 curwp->w_doto = wp->w_doto;
00118 curwp->w_markp = wp->w_markp;
00119 curwp->w_marko = wp->w_marko;
00120 break;
00121 }
00122 wp = wp->w_wndp;
00123 }
00124 return (TRUE);
00125 }
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 #if WIN_BTC
00136 #pragma argsused
00137 #endif
00138 globle int killbuffer(
00139 void *theEnv,
00140 int f,
00141 int n)
00142 {
00143 register BUFFER *bp;
00144 register BUFFER *bp1;
00145 register BUFFER *bp2;
00146 register int s;
00147 char bufn[NBUFN];
00148
00149 if ((s=mlreply(theEnv,"Kill buffer: ", bufn, NBUFN)) != TRUE)
00150 return (s);
00151 if ((bp=bfind(theEnv,bufn, FALSE, 0)) == NULL)
00152 return (TRUE);
00153 if (bp->b_nwnd != 0) {
00154 mlwrite("Buffer is being displayed");
00155 return (FALSE);
00156 }
00157 if ((s=bclear(theEnv,bp)) != TRUE)
00158 return (s);
00159 genfree(theEnv,(void *) bp->b_linep,(unsigned) (sizeof(LINE) + bp->b_linep->l_size));
00160 bp1 = NULL;
00161 bp2 = bheadp;
00162 while (bp2 != bp) {
00163 bp1 = bp2;
00164 bp2 = bp2->b_bufp;
00165 }
00166 bp2 = bp2->b_bufp;
00167 if (bp1 == NULL)
00168 bheadp = bp2;
00169 else
00170 bp1->b_bufp = bp2;
00171 genfree(theEnv,(void *) bp, (unsigned) sizeof(BUFFER));
00172 mlwrite("Buffer Killed!");
00173 return (TRUE);
00174 }
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186 #if WIN_BTC
00187 #pragma argsused
00188 #endif
00189 globle int listbuffers(
00190 void *theEnv,
00191 int f,
00192 int n)
00193 {
00194 register WINDOW *wp;
00195 register BUFFER *bp;
00196 register int s;
00197
00198 if ((s=makelist(theEnv)) != TRUE)
00199 return (s);
00200 if (blistp->b_nwnd == 0) {
00201 if ((wp=wpopup(theEnv)) == NULL)
00202 return (FALSE);
00203 bp = wp->w_bufp;
00204 if (--bp->b_nwnd == 0) {
00205 bp->b_dotp = wp->w_dotp;
00206 bp->b_doto = wp->w_doto;
00207 bp->b_markp = wp->w_markp;
00208 bp->b_marko = wp->w_marko;
00209 }
00210 wp->w_bufp = blistp;
00211 ++blistp->b_nwnd;
00212 }
00213 wp = wheadp;
00214 while (wp != NULL) {
00215 if (wp->w_bufp == blistp) {
00216 wp->w_linep = lforw(blistp->b_linep);
00217 wp->w_dotp = lforw(blistp->b_linep);
00218 wp->w_doto = 0;
00219 wp->w_markp = NULL;
00220 wp->w_marko = 0;
00221 wp->w_flag |= WFMODE|WFHARD;
00222 }
00223 wp = wp->w_wndp;
00224 }
00225 return (TRUE);
00226 }
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236 globle int makelist(
00237 void *theEnv)
00238 {
00239 register char *cp1;
00240 register char *cp2;
00241 register int c;
00242 register BUFFER *bp;
00243 register LINE *lp;
00244 register int nbytes;
00245 register int s;
00246 char b[6+1];
00247 char line[128];
00248
00249 blistp->b_flag &= ~BFCHG;
00250 if ((s=bclear(theEnv,blistp)) != TRUE)
00251 return (s);
00252 genstrcpy(blistp->b_fname, "");
00253 if (addline(theEnv,blistp,"C Size Buffer File") == FALSE
00254 || addline(theEnv,blistp,"- ---- ------ ----") == FALSE)
00255 return (FALSE);
00256 bp = bheadp;
00257 while (bp != NULL) {
00258 if ((bp->b_flag&BFTEMP) != 0) {
00259 bp = bp->b_bufp;
00260 continue;
00261 }
00262 cp1 = &line[0];
00263 if ((bp->b_flag&BFCHG) != 0)
00264 *cp1++ = '*';
00265 else
00266 *cp1++ = ' ';
00267 *cp1++ = ' ';
00268 nbytes = 0;
00269 lp = lforw(bp->b_linep);
00270 while (lp != bp->b_linep) {
00271 nbytes += llength(lp)+1;
00272 lp = lforw(lp);
00273 }
00274 int_to_ascii(b, 6, nbytes);
00275 cp2 = &b[0];
00276 while ((c = *cp2++) != 0)
00277 *cp1++ = (char) c;
00278 *cp1++ = ' ';
00279 cp2 = &bp->b_bname[0];
00280 while ((c = *cp2++) != 0)
00281 *cp1++ = (char) c;
00282 cp2 = &bp->b_fname[0];
00283 if (*cp2 != 0) {
00284 while (cp1 < &line[1+1+6+1+NBUFN+1])
00285 *cp1++ = ' ';
00286 while ((c = *cp2++) != 0) {
00287 if (cp1 < &line[128-1])
00288 *cp1++ = (char) c;
00289 }
00290 }
00291 *cp1 = 0;
00292 if (addline(theEnv,blistp,line) == FALSE)
00293 return (FALSE);
00294 bp = bp->b_bufp;
00295 }
00296 return (TRUE);
00297 }
00298
00299
00300
00301
00302
00303
00304
00305
00306 globle int addline(
00307 void *theEnv,
00308 BUFFER *bufferp,
00309 char *text)
00310 {
00311 register LINE *lp;
00312 register int i;
00313 register int ntext;
00314
00315 ntext = strlen(text);
00316 if ((lp=lalloc(theEnv,ntext)) == NULL)
00317 return (FALSE);
00318 for (i=0; i<ntext; ++i)
00319 lputc(lp, i, text[i]);
00320 bufferp->b_linep->l_bp->l_fp = lp;
00321 lp->l_bp = bufferp->b_linep->l_bp;
00322 bufferp->b_linep->l_bp = lp;
00323 lp->l_fp = bufferp->b_linep;
00324 if (bufferp->b_dotp == bufferp->b_linep)
00325 bufferp->b_dotp = lp;
00326 return (TRUE);
00327 }
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339 globle int anycb()
00340 {
00341 register BUFFER *bp;
00342
00343 bp = bheadp;
00344 while (bp != NULL) {
00345 if ((bp->b_flag&BFTEMP)==0 && (bp->b_flag&BFCHG)!=0)
00346 return (TRUE);
00347 bp = bp->b_bufp;
00348 }
00349 return (FALSE);
00350 }
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360 globle BUFFER *bfind(
00361 void *theEnv,
00362 char *bname,
00363 int cflag,
00364 int bflag)
00365 {
00366 register BUFFER *bp;
00367 register LINE *lp;
00368
00369 bp = bheadp;
00370 while (bp != NULL) {
00371 if (strcmp(bname, bp->b_bname) == 0) {
00372 if ((bp->b_flag&BFTEMP) != 0) {
00373 mlwrite("Cannot select builtin buffer");
00374 return (NULL);
00375 }
00376 return (bp);
00377 }
00378 bp = bp->b_bufp;
00379 }
00380 if (cflag != FALSE) {
00381 if ((bp=(BUFFER *)genalloc(theEnv,(unsigned) sizeof(BUFFER))) == NULL)
00382 return (NULL);
00383 if ((lp=lalloc(theEnv,0)) == NULL) {
00384 genfree(theEnv,(void *) bp,(unsigned) sizeof(BUFFER));
00385 return (NULL);
00386 }
00387 bp->b_bufp = bheadp;
00388 bheadp = bp;
00389 bp->b_dotp = lp;
00390 bp->b_doto = 0;
00391 bp->b_markp = NULL;
00392 bp->b_marko = 0;
00393 bp->b_flag = (char) bflag;
00394 bp->b_nwnd = 0;
00395 bp->b_linep = lp;
00396 genstrcpy(bp->b_fname, "");
00397 genstrcpy(bp->b_bname, bname);
00398 lp->l_fp = lp;
00399 lp->l_bp = lp;
00400 }
00401 return (bp);
00402 }
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414 globle int bclear(
00415 void *theEnv,
00416 BUFFER *bp)
00417 {
00418 register LINE *lp;
00419 register int s;
00420
00421 if ((bp->b_flag&BFTEMP) == 0
00422 && (bp->b_flag&BFCHG) != 0
00423 && (s=mlyesno(theEnv,"Discard changes")) != TRUE)
00424 return (s);
00425 bp->b_flag &= ~BFCHG;
00426
00427 while ((lp=lforw(bp->b_linep)) != bp->b_linep)
00428 lfree(theEnv,lp);
00429 bp->b_dotp = bp->b_linep;
00430 bp->b_doto = 0;
00431 bp->b_markp = NULL;
00432 bp->b_marko = 0;
00433 return (TRUE);
00434 }
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460 globle LINE *lalloc(
00461 void *theEnv,
00462 int used)
00463 {
00464 register LINE *lp;
00465 register int size;
00466
00467 size = (used+NBLOCK-1) & ~(NBLOCK-1);
00468 if (size == 0)
00469 size = NBLOCK;
00470 lp = (LINE *) genalloc(theEnv,(unsigned) sizeof(LINE)+size);
00471 lp->l_size = size;
00472 lp->l_used = used;
00473 return (lp);
00474 }
00475
00476
00477
00478
00479
00480
00481
00482 globle void lfree(
00483 void *theEnv,
00484 LINE *lp)
00485 {
00486 register BUFFER *bp;
00487 register WINDOW *wp;
00488
00489 wp = wheadp;
00490 while (wp != NULL) {
00491 if (wp->w_linep == lp)
00492 wp->w_linep = lp->l_fp;
00493 if (wp->w_dotp == lp) {
00494 wp->w_dotp = lp->l_fp;
00495 wp->w_doto = 0;
00496 }
00497 if (wp->w_markp == lp) {
00498 wp->w_markp = lp->l_fp;
00499 wp->w_marko = 0;
00500 }
00501 wp = wp->w_wndp;
00502 }
00503 bp = bheadp;
00504 while (bp != NULL) {
00505 if (bp->b_nwnd == 0) {
00506 if (bp->b_dotp == lp) {
00507 bp->b_dotp = lp->l_fp;
00508 bp->b_doto = 0;
00509 }
00510 if (bp->b_markp == lp) {
00511 bp->b_markp = lp->l_fp;
00512 bp->b_marko = 0;
00513 }
00514 }
00515 bp = bp->b_bufp;
00516 }
00517 lp->l_bp->l_fp = lp->l_fp;
00518 lp->l_fp->l_bp = lp->l_bp;
00519 genfree(theEnv,(void *) lp, (unsigned) (sizeof(LINE) + lp->l_size));
00520 }
00521
00522
00523
00524
00525
00526
00527
00528
00529 globle void lchange(
00530 int flag)
00531 {
00532 register WINDOW *wp;
00533
00534 if (curbp->b_nwnd != 1)
00535 flag = WFHARD;
00536 if ((curbp->b_flag&BFCHG) == 0) {
00537 flag |= WFMODE;
00538 curbp->b_flag |= BFCHG;
00539 }
00540 wp = wheadp;
00541 while (wp != NULL) {
00542 if (wp->w_bufp == curbp)
00543 wp->w_flag |= flag;
00544 wp = wp->w_wndp;
00545 }
00546 }
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557 globle int linsert(
00558 void *theEnv,
00559 int n,
00560 int c)
00561 {
00562 register char *cp1;
00563 register char *cp2;
00564 register LINE *lp1;
00565 register LINE *lp2;
00566 register LINE *lp3;
00567 register int doto;
00568 register int i;
00569 register WINDOW *wp;
00570
00571 lchange(WFEDIT);
00572 lp1 = curwp->w_dotp;
00573 if (lp1 == curbp->b_linep) {
00574 if (curwp->w_doto != 0) {
00575 mlwrite("bug: linsert");
00576 return (FALSE);
00577 }
00578 if ((lp2=lalloc(theEnv,n)) == NULL)
00579 return (FALSE);
00580 lp3 = lp1->l_bp;
00581 lp3->l_fp = lp2;
00582 lp2->l_fp = lp1;
00583 lp1->l_bp = lp2;
00584 lp2->l_bp = lp3;
00585 for (i=0; i<n; ++i)
00586 lp2->l_text[i] = (char) c;
00587 curwp->w_dotp = lp2;
00588 curwp->w_doto = n;
00589 return (TRUE);
00590 }
00591 doto = curwp->w_doto;
00592 if (lp1->l_used+n > lp1->l_size) {
00593 if ((lp2=lalloc(theEnv,lp1->l_used+n)) == NULL)
00594 return (FALSE);
00595 cp1 = &lp1->l_text[0];
00596 cp2 = &lp2->l_text[0];
00597 while (cp1 != &lp1->l_text[doto])
00598 *cp2++ = *cp1++;
00599 cp2 += n;
00600 while (cp1 != &lp1->l_text[lp1->l_used])
00601 *cp2++ = *cp1++;
00602 lp1->l_bp->l_fp = lp2;
00603 lp2->l_fp = lp1->l_fp;
00604 lp1->l_fp->l_bp = lp2;
00605 lp2->l_bp = lp1->l_bp;
00606 genfree(theEnv,(void *) lp1, (unsigned) (sizeof(LINE) + lp1->l_size));
00607 } else {
00608 lp2 = lp1;
00609 lp2->l_used += n;
00610 cp2 = &lp1->l_text[lp1->l_used];
00611 cp1 = cp2-n;
00612 while (cp1 != &lp1->l_text[doto])
00613 *--cp2 = *--cp1;
00614 }
00615 for (i=0; i<n; ++i)
00616 lp2->l_text[doto+i] = (char) c;
00617 wp = wheadp;
00618 while (wp != NULL) {
00619 if (wp->w_linep == lp1)
00620 wp->w_linep = lp2;
00621 if (wp->w_dotp == lp1) {
00622 wp->w_dotp = lp2;
00623 if (wp==curwp || wp->w_doto>doto)
00624 wp->w_doto += n;
00625 }
00626 if (wp->w_markp == lp1) {
00627 wp->w_markp = lp2;
00628 if (wp->w_marko > doto)
00629 wp->w_marko += n;
00630 }
00631 wp = wp->w_wndp;
00632 }
00633 return (TRUE);
00634 }
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644 globle int lnewline(
00645 void *theEnv)
00646 {
00647 register char *cp1;
00648 register char *cp2;
00649 register LINE *lp1;
00650 register LINE *lp2;
00651 register int doto;
00652 register WINDOW *wp;
00653
00654 lchange(WFHARD);
00655 lp1 = curwp->w_dotp;
00656 doto = curwp->w_doto;
00657 if ((lp2=lalloc(theEnv,doto)) == NULL)
00658 return (FALSE);
00659 cp1 = &lp1->l_text[0];
00660 cp2 = &lp2->l_text[0];
00661 while (cp1 != &lp1->l_text[doto])
00662 *cp2++ = *cp1++;
00663 cp2 = &lp1->l_text[0];
00664 while (cp1 != &lp1->l_text[lp1->l_used])
00665 *cp2++ = *cp1++;
00666 lp1->l_used -= doto;
00667 lp2->l_bp = lp1->l_bp;
00668 lp1->l_bp = lp2;
00669 lp2->l_bp->l_fp = lp2;
00670 lp2->l_fp = lp1;
00671 wp = wheadp;
00672 while (wp != NULL) {
00673 if (wp->w_linep == lp1)
00674 wp->w_linep = lp2;
00675 if (wp->w_dotp == lp1) {
00676 if (wp->w_doto < doto)
00677 wp->w_dotp = lp2;
00678 else
00679 wp->w_doto -= doto;
00680 }
00681 if (wp->w_markp == lp1) {
00682 if (wp->w_marko < doto)
00683 wp->w_markp = lp2;
00684 else
00685 wp->w_marko -= doto;
00686 }
00687 wp = wp->w_wndp;
00688 }
00689 return (TRUE);
00690 }
00691
00692
00693
00694
00695
00696
00697
00698 globle int ldelete(
00699 void *theEnv,
00700 long n,
00701 int kflag)
00702 {
00703 register char *cp1;
00704 register char *cp2;
00705 register LINE *dotp;
00706 register int doto;
00707 register int chunk;
00708 register WINDOW *wp;
00709
00710 while (n != 0) {
00711 dotp = curwp->w_dotp;
00712 doto = curwp->w_doto;
00713 if (dotp == curbp->b_linep)
00714 return (FALSE);
00715 chunk = dotp->l_used-doto;
00716 if (chunk > (int) n)
00717 chunk = (int) n;
00718 if (chunk == 0) {
00719 lchange(WFHARD);
00720 if (ldelnewline(theEnv) == FALSE
00721 || (kflag!=FALSE && kinsert(theEnv,'\n')==FALSE))
00722 return (FALSE);
00723 --n;
00724 continue;
00725 }
00726 lchange(WFEDIT);
00727 cp1 = &dotp->l_text[doto];
00728 cp2 = cp1 + chunk;
00729 if (kflag != FALSE) {
00730 while (cp1 != cp2) {
00731 if (kinsert(theEnv,*cp1) == FALSE)
00732 return (FALSE);
00733 ++cp1;
00734 }
00735 cp1 = &dotp->l_text[doto];
00736 }
00737 while (cp2 != &dotp->l_text[dotp->l_used])
00738 *cp1++ = *cp2++;
00739 dotp->l_used -= chunk;
00740 wp = wheadp;
00741 while (wp != NULL) {
00742 if (wp->w_dotp==dotp && wp->w_doto>=doto) {
00743 wp->w_doto -= chunk;
00744 if (wp->w_doto < doto)
00745 wp->w_doto = doto;
00746 }
00747 if (wp->w_markp==dotp && wp->w_marko>=doto) {
00748 wp->w_marko -= chunk;
00749 if (wp->w_marko < doto)
00750 wp->w_marko = doto;
00751 }
00752 wp = wp->w_wndp;
00753 }
00754 n -= chunk;
00755 }
00756 return (TRUE);
00757 }
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768 globle int ldelnewline(
00769 void *theEnv)
00770 {
00771 register char *cp1;
00772 register char *cp2;
00773 register LINE *lp1;
00774 register LINE *lp2;
00775 register LINE *lp3;
00776 register WINDOW *wp;
00777
00778 lp1 = curwp->w_dotp;
00779 lp2 = lp1->l_fp;
00780 if (lp2 == curbp->b_linep) {
00781 if (lp1->l_used == 0)
00782 lfree(theEnv,lp1);
00783 return (TRUE);
00784 }
00785 if (lp2->l_used <= lp1->l_size-lp1->l_used) {
00786 cp1 = &lp1->l_text[lp1->l_used];
00787 cp2 = &lp2->l_text[0];
00788 while (cp2 != &lp2->l_text[lp2->l_used])
00789 *cp1++ = *cp2++;
00790 wp = wheadp;
00791 while (wp != NULL) {
00792 if (wp->w_linep == lp2)
00793 wp->w_linep = lp1;
00794 if (wp->w_dotp == lp2) {
00795 wp->w_dotp = lp1;
00796 wp->w_doto += lp1->l_used;
00797 }
00798 if (wp->w_markp == lp2) {
00799 wp->w_markp = lp1;
00800 wp->w_marko += lp1->l_used;
00801 }
00802 wp = wp->w_wndp;
00803 }
00804 lp1->l_used += lp2->l_used;
00805 lp1->l_fp = lp2->l_fp;
00806 lp2->l_fp->l_bp = lp1;
00807 genfree(theEnv,(void *) lp2, (unsigned) (sizeof(LINE) + lp2->l_size));
00808 return (TRUE);
00809 }
00810 if ((lp3=lalloc(theEnv,lp1->l_used+lp2->l_used)) == NULL)
00811 return (FALSE);
00812 cp1 = &lp1->l_text[0];
00813 cp2 = &lp3->l_text[0];
00814 while (cp1 != &lp1->l_text[lp1->l_used])
00815 *cp2++ = *cp1++;
00816 cp1 = &lp2->l_text[0];
00817 while (cp1 != &lp2->l_text[lp2->l_used])
00818 *cp2++ = *cp1++;
00819 lp1->l_bp->l_fp = lp3;
00820 lp3->l_fp = lp2->l_fp;
00821 lp2->l_fp->l_bp = lp3;
00822 lp3->l_bp = lp1->l_bp;
00823 wp = wheadp;
00824 while (wp != NULL) {
00825 if (wp->w_linep==lp1 || wp->w_linep==lp2)
00826 wp->w_linep = lp3;
00827 if (wp->w_dotp == lp1)
00828 wp->w_dotp = lp3;
00829 else if (wp->w_dotp == lp2) {
00830 wp->w_dotp = lp3;
00831 wp->w_doto += lp1->l_used;
00832 }
00833 if (wp->w_markp == lp1)
00834 wp->w_markp = lp3;
00835 else if (wp->w_markp == lp2) {
00836 wp->w_markp = lp3;
00837 wp->w_marko += lp1->l_used;
00838 }
00839 wp = wp->w_wndp;
00840 }
00841 genfree(theEnv,(void *) lp1, (unsigned) (sizeof(LINE) + lp1->l_size));
00842 genfree(theEnv,(void *) lp2, (unsigned) (sizeof(LINE) + lp2->l_size));
00843 return (TRUE);
00844 }
00845
00846
00847
00848
00849
00850
00851 globle void kdelete(
00852 void *theEnv)
00853 {
00854 if (kbufp != NULL) {
00855 genfree(theEnv,(void *) kbufp, (unsigned) ksize);
00856 kbufp = NULL;
00857 kused = 0;
00858 ksize = 0;
00859 }
00860 }
00861
00862
00863
00864
00865
00866
00867
00868 globle int kinsert(
00869 void *theEnv,
00870 int c)
00871 {
00872 #if WIN_MVC || WIN_BTC
00873 char *nbufp;
00874 #else
00875 register char *nbufp;
00876 #endif
00877 register int i;
00878
00879 if (kused == ksize) {
00880 if ((nbufp= (char *) genalloc(theEnv,(unsigned) ksize+KBLOCK)) == NULL)
00881 return (FALSE);
00882 for (i=0; i<ksize; ++i)
00883 nbufp[i] = kbufp[i];
00884 if (kbufp != NULL)
00885 genfree(theEnv,(void *) kbufp, (unsigned) ksize);
00886 kbufp = nbufp;
00887 ksize += KBLOCK;
00888 }
00889 kbufp[kused++] = (char) c;
00890 return (TRUE);
00891 }
00892
00893
00894
00895
00896
00897
00898 globle int kremove(
00899 int n)
00900 {
00901 if (n >= kused)
00902 return (-1);
00903 else
00904 return (kbufp[n] & 0xFF);
00905 }
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925 #if WIN_BTC
00926 #pragma argsused
00927 #endif
00928 globle int reposition(
00929 void *theEnv,
00930 int f,
00931 int n)
00932 {
00933 curwp->w_force = (char) n;
00934 curwp->w_flag |= WFFORCE;
00935 return (TRUE);
00936 }
00937
00938
00939
00940
00941
00942 #if WIN_BTC
00943 #pragma argsused
00944 #endif
00945 globle int EditorRefresh(
00946 void *theEnv,
00947 int f,
00948 int n)
00949 {
00950 if (f == FALSE)
00951 sgarbf = TRUE;
00952 else
00953 {
00954 curwp->w_force = 0;
00955 curwp->w_flag |= WFFORCE;
00956 }
00957
00958 return (TRUE);
00959 }
00960
00961
00962
00963
00964
00965
00966 #if WIN_BTC
00967 #pragma argsused
00968 #endif
00969 globle int nextwind(
00970 void *theEnv,
00971 int f,
00972 int n)
00973 {
00974 register WINDOW *wp;
00975
00976 if ((wp = curwp->w_wndp) == NULL)
00977 wp = wheadp;
00978
00979 curwp = wp;
00980 curbp = wp->w_bufp;
00981 return (TRUE);
00982 }
00983
00984
00985
00986
00987
00988
00989 #if WIN_BTC
00990 #pragma argsused
00991 #endif
00992 globle int prevwind(
00993 void *theEnv,
00994 int f,
00995 int n)
00996 {
00997 register WINDOW *wp1;
00998 register WINDOW *wp2;
00999
01000 wp1 = wheadp;
01001 wp2 = curwp;
01002
01003 if (wp1 == wp2)
01004 wp2 = NULL;
01005
01006 while (wp1->w_wndp != wp2)
01007 wp1 = wp1->w_wndp;
01008
01009 curwp = wp1;
01010 curbp = wp1->w_bufp;
01011 return (TRUE);
01012 }
01013
01014
01015
01016
01017
01018
01019
01020
01021 globle int mvdnwind(
01022 void *theEnv,
01023 int f,
01024 int n)
01025 {
01026 return (mvupwind(theEnv,f, -n));
01027 }
01028
01029
01030
01031
01032
01033
01034
01035
01036 #if WIN_BTC
01037 #pragma argsused
01038 #endif
01039 globle int mvupwind(
01040 void *theEnv,
01041 int f,
01042 int n)
01043 {
01044 register LINE *lp;
01045 register int i;
01046
01047 lp = curwp->w_linep;
01048
01049 if (n < 0)
01050 {
01051 while (n++ && lp!=curbp->b_linep)
01052 lp = lforw(lp);
01053 }
01054 else
01055 {
01056 while (n-- && lback(lp)!=curbp->b_linep)
01057 lp = lback(lp);
01058 }
01059
01060 curwp->w_linep = lp;
01061 curwp->w_flag |= WFHARD;
01062
01063 for (i = 0; i < curwp->w_ntrows; ++i)
01064 {
01065 if (lp == curwp->w_dotp)
01066 return (TRUE);
01067 if (lp == curbp->b_linep)
01068 break;
01069 lp = lforw(lp);
01070 }
01071
01072 lp = curwp->w_linep;
01073 i = curwp->w_ntrows/2;
01074
01075 while (i-- && lp != curbp->b_linep)
01076 lp = lforw(lp);
01077
01078 curwp->w_dotp = lp;
01079 curwp->w_doto = 0;
01080 return (TRUE);
01081 }
01082
01083
01084
01085
01086
01087
01088
01089
01090 #if WIN_BTC
01091 #pragma argsused
01092 #endif
01093 globle int onlywind(
01094 void *theEnv,
01095 int f,
01096 int n)
01097 {
01098 register WINDOW *wp;
01099 register LINE *lp;
01100 register int i;
01101
01102 while (wheadp != curwp) {
01103 wp = wheadp;
01104 wheadp = wp->w_wndp;
01105 if (--wp->w_bufp->b_nwnd == 0) {
01106 wp->w_bufp->b_dotp = wp->w_dotp;
01107 wp->w_bufp->b_doto = wp->w_doto;
01108 wp->w_bufp->b_markp = wp->w_markp;
01109 wp->w_bufp->b_marko = wp->w_marko;
01110 }
01111 genfree(theEnv,(void *) wp, (unsigned) sizeof(WINDOW));
01112 }
01113 while (curwp->w_wndp != NULL) {
01114 wp = curwp->w_wndp;
01115 curwp->w_wndp = wp->w_wndp;
01116 if (--wp->w_bufp->b_nwnd == 0) {
01117 wp->w_bufp->b_dotp = wp->w_dotp;
01118 wp->w_bufp->b_doto = wp->w_doto;
01119 wp->w_bufp->b_markp = wp->w_markp;
01120 wp->w_bufp->b_marko = wp->w_marko;
01121 }
01122 genfree(theEnv,(void *) wp, (unsigned) sizeof(WINDOW));
01123 }
01124 lp = curwp->w_linep;
01125 i = curwp->w_toprow;
01126 while (i!=0 && lback(lp)!=curbp->b_linep) {
01127 --i;
01128 lp = lback(lp);
01129 }
01130 curwp->w_toprow = 0;
01131 curwp->w_ntrows = (char) (term.t_nrow-1);
01132 curwp->w_linep = lp;
01133 curwp->w_flag |= WFMODE|WFHARD;
01134 return (TRUE);
01135 }
01136
01137
01138
01139
01140
01141
01142 #if WIN_BTC
01143 #pragma argsused
01144 #endif
01145 globle int splitwind(
01146 void *theEnv,
01147 int f,
01148 int n)
01149 {
01150 register WINDOW *wp;
01151 register LINE *lp;
01152 register int ntru;
01153 register int ntrl;
01154 register int ntrd;
01155 register WINDOW *wp1;
01156 register WINDOW *wp2;
01157
01158 if (curwp->w_ntrows < 3) {
01159 mlwrite("Cannot split a %d line window", curwp->w_ntrows);
01160 return (FALSE);
01161 }
01162 if ((wp = (WINDOW *) genalloc(theEnv,(unsigned) sizeof(WINDOW))) == NULL) {
01163 mlwrite("Cannot allocate WINDOW block");
01164 return (FALSE);
01165 }
01166 ++curbp->b_nwnd;
01167 wp->w_bufp = curbp;
01168 wp->w_dotp = curwp->w_dotp;
01169 wp->w_doto = curwp->w_doto;
01170 wp->w_markp = curwp->w_markp;
01171 wp->w_marko = curwp->w_marko;
01172 wp->w_flag = 0;
01173 wp->w_force = 0;
01174 ntru = (curwp->w_ntrows-1) / 2;
01175 ntrl = (curwp->w_ntrows-1) - ntru;
01176 lp = curwp->w_linep;
01177 ntrd = 0;
01178 while (lp != curwp->w_dotp) {
01179 ++ntrd;
01180 lp = lforw(lp);
01181 }
01182 lp = curwp->w_linep;
01183 if (ntrd <= ntru) {
01184 if (ntrd == ntru)
01185 lp = lforw(lp);
01186 curwp->w_ntrows = (char) ntru;
01187 wp->w_wndp = curwp->w_wndp;
01188 curwp->w_wndp = wp;
01189 wp->w_toprow = curwp->w_toprow+ntru+1;
01190 wp->w_ntrows = (char) ntrl;
01191 } else {
01192 wp1 = NULL;
01193 wp2 = wheadp;
01194 while (wp2 != curwp) {
01195 wp1 = wp2;
01196 wp2 = wp2->w_wndp;
01197 }
01198 if (wp1 == NULL)
01199 wheadp = wp;
01200 else
01201 wp1->w_wndp = wp;
01202 wp->w_wndp = curwp;
01203 wp->w_toprow = curwp->w_toprow;
01204 wp->w_ntrows = (char) ntru;
01205 ++ntru;
01206 curwp->w_toprow += (char) ntru;
01207 curwp->w_ntrows = (char) ntrl;
01208 while (ntru--)
01209 lp = lforw(lp);
01210 }
01211 curwp->w_linep = lp;
01212 wp->w_linep = lp;
01213 curwp->w_flag |= WFMODE|WFHARD;
01214 wp->w_flag |= WFMODE|WFHARD;
01215 return (TRUE);
01216 }
01217
01218
01219
01220
01221
01222
01223
01224 globle int enlargewind(
01225 void *theEnv,
01226 int f,
01227 int n)
01228 {
01229 register WINDOW *adjwp;
01230 register LINE *lp;
01231 register int i;
01232
01233 if (n < 0)
01234 return (shrinkwind(theEnv,f, -n));
01235 if (wheadp->w_wndp == NULL) {
01236 mlwrite("Only one window");
01237 return (FALSE);
01238 }
01239 if ((adjwp=curwp->w_wndp) == NULL) {
01240 adjwp = wheadp;
01241 while (adjwp->w_wndp != curwp)
01242 adjwp = adjwp->w_wndp;
01243 }
01244 if (adjwp->w_ntrows <= (char) n) {
01245 mlwrite("Impossible change");
01246 return (FALSE);
01247 }
01248 if (curwp->w_wndp == adjwp) {
01249 lp = adjwp->w_linep;
01250 for (i=0; i<n && lp!=adjwp->w_bufp->b_linep; ++i)
01251 lp = lforw(lp);
01252 adjwp->w_linep = lp;
01253 adjwp->w_toprow += (char) n;
01254 } else {
01255 lp = curwp->w_linep;
01256 for (i=0; i<n && lback(lp)!=curbp->b_linep; ++i)
01257 lp = lback(lp);
01258 curwp->w_linep = lp;
01259 curwp->w_toprow -= (char) n;
01260 }
01261 curwp->w_ntrows += (char) n;
01262 adjwp->w_ntrows -= (char) n;
01263 curwp->w_flag |= WFMODE|WFHARD;
01264 adjwp->w_flag |= WFMODE|WFHARD;
01265 return (TRUE);
01266 }
01267
01268
01269
01270
01271
01272
01273 globle int shrinkwind(
01274 void *theEnv,
01275 int f,
01276 int n)
01277 {
01278 register WINDOW *adjwp;
01279 register LINE *lp;
01280 register int i;
01281
01282 if (n < 0)
01283 return (enlargewind(theEnv,f, -n));
01284 if (wheadp->w_wndp == NULL) {
01285 mlwrite("Only one window");
01286 return (FALSE);
01287 }
01288 if ((adjwp=curwp->w_wndp) == NULL) {
01289 adjwp = wheadp;
01290 while (adjwp->w_wndp != curwp)
01291 adjwp = adjwp->w_wndp;
01292 }
01293 if (curwp->w_ntrows <= (char) n) {
01294 mlwrite("Impossible change");
01295 return (FALSE);
01296 }
01297 if (curwp->w_wndp == adjwp) {
01298 lp = adjwp->w_linep;
01299 for (i=0; i<n && lback(lp)!=adjwp->w_bufp->b_linep; ++i)
01300 lp = lback(lp);
01301 adjwp->w_linep = lp;
01302 adjwp->w_toprow -= (char) n;
01303 } else {
01304 lp = curwp->w_linep;
01305 for (i=0; i<n && lp!=curbp->b_linep; ++i)
01306 lp = lforw(lp);
01307 curwp->w_linep = lp;
01308 curwp->w_toprow += (char) n;
01309 }
01310 curwp->w_ntrows -= (char) n;
01311 adjwp->w_ntrows += (char) n;
01312 curwp->w_flag |= WFMODE|WFHARD;
01313 adjwp->w_flag |= WFMODE|WFHARD;
01314 return (TRUE);
01315 }
01316
01317
01318
01319
01320
01321
01322 globle WINDOW *wpopup(
01323 void *theEnv)
01324 {
01325 register WINDOW *wp;
01326
01327 if (wheadp->w_wndp == NULL
01328 && splitwind(theEnv,FALSE, 0) == FALSE)
01329 return (NULL);
01330 wp = wheadp;
01331 while (wp!=NULL && wp==curwp)
01332 wp = wp->w_wndp;
01333 return (wp);
01334 }
01335
01336
01337
01338
01339
01340
01341
01342
01343
01344
01345
01346
01347
01348
01349
01350
01351
01352
01353
01354 #define WFDEBUG 0
01355
01356
01357
01358
01359
01360
01361
01362
01363 globle void vtinit(
01364 void *theEnv)
01365 {
01366 register int i;
01367
01368 register VIDEO *vp;
01369
01370 (*term.t_open)();
01371 vscreen = (VIDEO **) genalloc(theEnv,(unsigned) term.t_nrow*sizeof(VIDEO *));
01372
01373 if (vscreen == NULL)
01374 exit(1);
01375
01376 pscreen = (VIDEO **) genalloc(theEnv,(unsigned) term.t_nrow*sizeof(VIDEO *));
01377
01378 if (pscreen == NULL)
01379 exit(1);
01380
01381 for (i = 0; i < term.t_nrow; ++i)
01382 {
01383 vp = (VIDEO *) genalloc(theEnv,(unsigned) sizeof(VIDEO)+term.t_ncol);
01384
01385 if (vp == NULL)
01386 exit(1);
01387
01388 vscreen[i] = vp;
01389 vp = (VIDEO *) genalloc(theEnv,(unsigned) sizeof(VIDEO)+term.t_ncol);
01390
01391 if (vp == NULL)
01392 exit(1);
01393
01394 pscreen[i] = vp;
01395 }
01396 }
01397
01398
01399
01400
01401
01402
01403
01404 globle void vttidy()
01405 {
01406 movecursor(term.t_nrow, 0);
01407 (*term.t_eeol)();
01408 (*term.t_close)();
01409 }
01410
01411
01412
01413
01414
01415
01416 globle void vtmove(
01417 int row,
01418 int col)
01419 {
01420 vtrow = row;
01421 vtcol = col;
01422 }
01423
01424
01425
01426
01427
01428
01429
01430 globle void vtputc(
01431 int c)
01432 {
01433 register VIDEO *vp;
01434
01435 vp = vscreen[vtrow];
01436
01437 if (vtcol >= term.t_ncol)
01438 vp->v_text[term.t_ncol - 1] = '$';
01439 else if (c == '\t')
01440 {
01441 do
01442 {
01443 vtputc(' ');
01444 }
01445 while ((vtcol&0x07) != 0);
01446 }
01447 else if (c < 0x20 || c == 0x7F)
01448 {
01449 vtputc('^');
01450 vtputc(c ^ 0x40);
01451 }
01452 else
01453 vp->v_text[vtcol++] = (char) c;
01454 }
01455
01456
01457
01458
01459
01460 globle void vteeol()
01461 {
01462 register VIDEO *vp;
01463
01464 vp = vscreen[vtrow];
01465 while (vtcol < term.t_ncol)
01466 vp->v_text[vtcol++] = ' ';
01467 }
01468
01469
01470
01471
01472
01473
01474
01475
01476 globle void update()
01477 {
01478 register LINE *lp;
01479 register WINDOW *wp;
01480 register VIDEO *vp1;
01481 register VIDEO *vp2;
01482 register int i;
01483 register int j;
01484 register int c;
01485
01486 wp = wheadp;
01487
01488 while (wp != NULL)
01489 {
01490
01491
01492 if (wp->w_flag != 0)
01493 {
01494
01495
01496 if ((wp->w_flag & WFFORCE) == 0)
01497 {
01498 lp = wp->w_linep;
01499
01500 for (i = 0; i < wp->w_ntrows; ++i)
01501 {
01502 if (lp == wp->w_dotp)
01503 goto out;
01504
01505 if (lp == wp->w_bufp->b_linep)
01506 break;
01507
01508 lp = lforw(lp);
01509 }
01510 }
01511
01512
01513
01514
01515
01516 i = wp->w_force;
01517
01518 if (i > 0)
01519 {
01520 --i;
01521
01522 if (i >= wp->w_ntrows)
01523 i = wp->w_ntrows-1;
01524 }
01525 else if (i < 0)
01526 {
01527 i += wp->w_ntrows;
01528
01529 if (i < 0)
01530 i = 0;
01531 }
01532 else
01533 i = wp->w_ntrows/2;
01534
01535 lp = wp->w_dotp;
01536
01537 while (i != 0 && lback(lp) != wp->w_bufp->b_linep)
01538 {
01539 --i;
01540 lp = lback(lp);
01541 }
01542
01543 wp->w_linep = lp;
01544 wp->w_flag |= WFHARD;
01545
01546 out:
01547
01548
01549
01550
01551 lp = wp->w_linep;
01552 i = wp->w_toprow;
01553
01554 if ((wp->w_flag & ~WFMODE) == WFEDIT)
01555 {
01556 while (lp != wp->w_dotp)
01557 {
01558 ++i;
01559 lp = lforw(lp);
01560 }
01561
01562 vscreen[i]->v_flag |= VFCHG;
01563 vtmove(i, 0);
01564
01565 for (j = 0; j < llength(lp); ++j)
01566 vtputc(lgetc(lp, j));
01567
01568 vteeol();
01569 }
01570 else if ((wp->w_flag & (WFEDIT | WFHARD)) != 0)
01571 {
01572 while (i < wp->w_toprow+wp->w_ntrows)
01573 {
01574 vscreen[i]->v_flag |= VFCHG;
01575 vtmove(i, 0);
01576
01577 if (lp != wp->w_bufp->b_linep)
01578 {
01579 for (j = 0; j < llength(lp); ++j)
01580 vtputc(lgetc(lp, j));
01581
01582 lp = lforw(lp);
01583 }
01584
01585 vteeol();
01586 ++i;
01587 }
01588 }
01589 #if ~WFDEBUG
01590 if ((wp->w_flag&WFMODE) != 0)
01591 modeline(wp);
01592
01593 wp->w_flag = 0;
01594 wp->w_force = 0;
01595 #endif
01596 }
01597 #if WFDEBUG
01598 modeline(wp);
01599 wp->w_flag = 0;
01600 wp->w_force = 0;
01601 #endif
01602 wp = wp->w_wndp;
01603 }
01604
01605
01606
01607
01608 lp = curwp->w_linep;
01609 currow = curwp->w_toprow;
01610
01611 while (lp != curwp->w_dotp)
01612 {
01613 ++currow;
01614 lp = lforw(lp);
01615 }
01616
01617 curcol = 0;
01618 i = 0;
01619
01620 while (i < curwp->w_doto)
01621 {
01622 c = lgetc(lp, i++);
01623
01624 if (c == '\t')
01625 curcol |= 0x07;
01626 else if (c < 0x20 || c == 0x7F)
01627 ++curcol;
01628
01629 ++curcol;
01630 }
01631
01632
01633
01634 if (curcol >= term.t_ncol)
01635 curcol = term.t_ncol-1;
01636
01637
01638
01639
01640
01641 if (sgarbf != FALSE)
01642 {
01643 for (i = 0; i < term.t_nrow; ++i)
01644 {
01645 vscreen[i]->v_flag |= VFCHG;
01646 vp1 = pscreen[i];
01647 for (j = 0; j < term.t_ncol; ++j)
01648 vp1->v_text[j] = ' ';
01649 }
01650
01651 movecursor(0, 0);
01652 (*term.t_eeop)();
01653 sgarbf = FALSE;
01654 mpresf = FALSE;
01655 }
01656
01657
01658
01659
01660
01661 for (i = 0; i < term.t_nrow; ++i)
01662 {
01663 vp1 = vscreen[i];
01664
01665 if ((vp1->v_flag&VFCHG) != 0)
01666 {
01667 vp1->v_flag &= ~VFCHG;
01668 vp2 = pscreen[i];
01669 updateline(i, &vp1->v_text[0], &vp2->v_text[0]);
01670 }
01671 }
01672
01673
01674
01675 movecursor(currow, curcol);
01676 (*term.t_flush)();
01677 }
01678
01679
01680
01681
01682
01683
01684
01685 globle void updateline(
01686 int row,
01687 char vline[],
01688 char pline[])
01689 {
01690 register char *cp1;
01691 register char *cp2;
01692 register char *cp3;
01693 register char *cp4;
01694 register char *cp5;
01695 register int nbflag;
01696
01697 cp1 = &vline[0];
01698 cp2 = &pline[0];
01699
01700 while (cp1!=&vline[term.t_ncol] && cp1[0]==cp2[0])
01701 {
01702 ++cp1;
01703 ++cp2;
01704 }
01705
01706
01707
01708
01709
01710
01711
01712 if (cp1 == &vline[term.t_ncol])
01713 return;
01714
01715 nbflag = FALSE;
01716 cp3 = &vline[term.t_ncol];
01717 cp4 = &pline[term.t_ncol];
01718
01719 while (cp3[-1] == cp4[-1])
01720 {
01721 --cp3;
01722 --cp4;
01723 if (cp3[0] != ' ')
01724 nbflag = TRUE;
01725 }
01726
01727 cp5 = cp3;
01728
01729 if (nbflag == FALSE)
01730 {
01731 while (cp5!=cp1 && cp5[-1]==' ')
01732 --cp5;
01733
01734 if (cp3-cp5 <= 3)
01735 cp5 = cp3;
01736 }
01737
01738 movecursor(row, (int) (cp1-&vline[0]));
01739
01740 while (cp1 != cp5)
01741 {
01742 (*term.t_putchar)(*cp1);
01743 ++ttcol;
01744 *cp2++ = *cp1++;
01745 }
01746
01747 if (cp5 != cp3)
01748 {
01749 (*term.t_eeol)();
01750 while (cp1 != cp3)
01751 *cp2++ = *cp1++;
01752 }
01753 }
01754
01755
01756
01757
01758
01759
01760
01761 globle void modeline(
01762 WINDOW *wp)
01763 {
01764 register char *cp;
01765 register int c;
01766 register int n;
01767 register BUFFER *bp;
01768
01769 n = wp->w_toprow+wp->w_ntrows;
01770 vscreen[n]->v_flag |= VFCHG;
01771 vtmove(n, 0);
01772 vtputc('-');
01773 bp = wp->w_bufp;
01774
01775 if ((bp->b_flag&BFCHG) != 0)
01776 vtputc('*');
01777 else
01778 vtputc('-');
01779
01780 n = 2;
01781 cp = " MicroEMACS -- ";
01782
01783 while ((c = *cp++) != 0)
01784 {
01785 vtputc(c);
01786 ++n;
01787 }
01788
01789 cp = &bp->b_bname[0];
01790
01791 while ((c = *cp++) != 0)
01792 {
01793 vtputc(c);
01794 ++n;
01795 }
01796
01797 vtputc(' ');
01798 ++n;
01799
01800 if (bp->b_fname[0] != 0)
01801 {
01802 cp = "-- File: ";
01803
01804 while ((c = *cp++) != 0)
01805 {
01806 vtputc(c);
01807 ++n;
01808 }
01809
01810 cp = &bp->b_fname[0];
01811
01812 while ((c = *cp++) != 0)
01813 {
01814 vtputc(c);
01815 ++n;
01816 }
01817
01818 vtputc(' ');
01819 ++n;
01820 }
01821
01822 #if WFDEBUG
01823 vtputc('-');
01824 vtputc((wp->w_flag&WFMODE)!=0 ? 'M' : '-');
01825 vtputc((wp->w_flag&WFHARD)!=0 ? 'H' : '-');
01826 vtputc((wp->w_flag&WFEDIT)!=0 ? 'E' : '-');
01827 vtputc((wp->w_flag&WFMOVE)!=0 ? 'V' : '-');
01828 vtputc((wp->w_flag&WFFORCE)!=0 ? 'F' : '-');
01829 n += 6;
01830 #endif
01831
01832 while (n < term.t_ncol)
01833 {
01834 vtputc('-');
01835 ++n;
01836 }
01837 }
01838
01839
01840
01841
01842
01843
01844 globle void movecursor(
01845 int row,
01846 int col)
01847 {
01848 if (row!=ttrow || col!=ttcol)
01849 {
01850 ttrow = row;
01851 ttcol = col;
01852 (*term.t_move)(row, col);
01853 }
01854 }
01855
01856
01857
01858
01859
01860
01861 globle void mlerase()
01862 {
01863 movecursor(term.t_nrow, 0);
01864 (*term.t_eeol)();
01865 (*term.t_flush)();
01866 mpresf = FALSE;
01867 }
01868
01869
01870
01871
01872
01873
01874 globle int mlyesno(
01875 void *theEnv,
01876 char *prompt)
01877 {
01878 register int s;
01879 char buf[64];
01880
01881 for (;;)
01882 {
01883 genstrcpy(buf, prompt);
01884 genstrcat(buf, " [y/n]? ");
01885 s = mlreply(theEnv,buf, buf, sizeof(buf));
01886
01887 if (s == ABORT)
01888 return (ABORT);
01889
01890 if (s != FALSE)
01891 {
01892 if (buf[0]=='y' || buf[0]=='Y')
01893 return (TRUE);
01894
01895 if (buf[0]=='n' || buf[0]=='N')
01896 return (FALSE);
01897 }
01898 }
01899 }
01900
01901
01902
01903
01904
01905
01906
01907
01908 globle int mlreply(
01909 void *theEnv,
01910 char *prompt,
01911 char *buf,
01912 int nbuf)
01913 {
01914 register int cpos;
01915 register int i;
01916 register int c;
01917
01918 cpos = 0;
01919
01920 if (kbdmop != NULL)
01921 {
01922 while ((c = *kbdmop++) != '\0')
01923 buf[cpos++] = (char) c;
01924
01925 buf[cpos] = 0;
01926
01927 if (buf[0] == 0)
01928 return (FALSE);
01929
01930 return (TRUE);
01931 }
01932
01933 mlwrite(prompt);
01934
01935 for (;;)
01936 {
01937 c = (*term.t_getchar)();
01938
01939 switch (c)
01940 {
01941 case 0x0D:
01942 buf[cpos++] = 0;
01943
01944 if (kbdmip != NULL)
01945 {
01946 if (kbdmip+cpos > &kbdm[NKBDM-3])
01947 {
01948 ctrlg(theEnv,FALSE, 0);
01949 (*term.t_flush)();
01950 return (ABORT);
01951 }
01952
01953 for (i=0; i<cpos; ++i)
01954 *kbdmip++ = buf[i];
01955 }
01956
01957 (*term.t_putchar)('\r');
01958 ttcol = 0;
01959 (*term.t_flush)();
01960
01961 if (buf[0] == 0)
01962 return (FALSE);
01963
01964 return (TRUE);
01965
01966 case 0x07:
01967 (*term.t_putchar)('^');
01968 (*term.t_putchar)('G');
01969 ttcol += 2;
01970 ctrlg(theEnv,FALSE, 0);
01971 (*term.t_flush)();
01972 return (ABORT);
01973
01974 case 0x7F:
01975 case 0x08:
01976 if (cpos != 0)
01977 {
01978 (*term.t_putchar)('\b');
01979 (*term.t_putchar)(' ');
01980 (*term.t_putchar)('\b');
01981 --ttcol;
01982
01983 if (buf[--cpos] < 0x20)
01984 {
01985 (*term.t_putchar)('\b');
01986 (*term.t_putchar)(' ');
01987 (*term.t_putchar)('\b');
01988 --ttcol;
01989 }
01990
01991 (*term.t_flush)();
01992 }
01993
01994 break;
01995
01996 case 0x15:
01997 while (cpos != 0)
01998 {
01999 (*term.t_putchar)('\b');
02000 (*term.t_putchar)(' ');
02001 (*term.t_putchar)('\b');
02002 --ttcol;
02003
02004 if (buf[--cpos] < 0x20)
02005 {
02006 (*term.t_putchar)('\b');
02007 (*term.t_putchar)(' ');
02008 (*term.t_putchar)('\b');
02009 --ttcol;
02010 }
02011 }
02012
02013 (*term.t_flush)();
02014 break;
02015
02016 default:
02017 if (cpos < nbuf-1)
02018 {
02019 buf[cpos++] = (char) c;
02020
02021 if (c < ' ')
02022 {
02023 (*term.t_putchar)('^');
02024 ++ttcol;
02025 c ^= 0x40;
02026 }
02027
02028 (*term.t_putchar)(c);
02029 ++ttcol;
02030 (*term.t_flush)();
02031 }
02032 }
02033 }
02034 }
02035
02036
02037
02038
02039
02040
02041
02042
02043 globle void mlwrite(char *fmt,...)
02044 {
02045 register int c;
02046 va_list ap;
02047
02048 movecursor(term.t_nrow, 0);
02049 va_start(ap,fmt);
02050 while ((c = *fmt++) != 0) {
02051 if (c != '%') {
02052 (*term.t_putchar)(c);
02053 ++ttcol;
02054 }
02055 else
02056 {
02057 c = *fmt++;
02058 switch (c) {
02059 case 'd':
02060 mlputi(va_arg(ap,int), 10);
02061 break;
02062
02063 case 'o':
02064 mlputi(va_arg(ap,int), 8);
02065 break;
02066
02067 case 'x':
02068 mlputi(va_arg(ap,int), 16);
02069 break;
02070
02071 case 'D':
02072 mlputli(va_arg(ap,long), 10);
02073 break;
02074
02075 case 's':
02076 mlputs(va_arg(ap,char *));
02077 break;
02078
02079 default:
02080 (*term.t_putchar)(c);
02081 ++ttcol;
02082 }
02083 }
02084 }
02085 va_end(ap);
02086 (*term.t_eeol)();
02087 (*term.t_flush)();
02088 mpresf = TRUE;
02089 }
02090
02091
02092
02093
02094
02095
02096 globle void mlputs(
02097 char *s)
02098 {
02099 register int c;
02100
02101 while ((c = *s++) != 0)
02102 {
02103 (*term.t_putchar)(c);
02104 ++ttcol;
02105 }
02106 }
02107
02108
02109
02110
02111
02112 globle void mlputi(
02113 int i,
02114 int r)
02115 {
02116 register int q;
02117 static char hexdigits[] = "0123456789ABCDEF";
02118
02119 if (i < 0)
02120 {
02121 i = -i;
02122 (*term.t_putchar)('-');
02123 }
02124
02125 q = i/r;
02126
02127 if (q != 0)
02128 mlputi(q, r);
02129
02130 (*term.t_putchar)(hexdigits[i%r]);
02131 ++ttcol;
02132 }
02133
02134
02135
02136
02137 globle void mlputli(
02138 long l,
02139 int r)
02140 {
02141 register long q;
02142
02143 if (l < 0)
02144 {
02145 l = -l;
02146 (*term.t_putchar)('-');
02147 }
02148
02149 q = l/r;
02150
02151 if (q != 0)
02152 mlputli(q, r);
02153
02154 (*term.t_putchar)((int)(l%r)+'0');
02155 ++ttcol;
02156 }
02157
02158
02159 globle void kill_video_buffers(
02160 void *theEnv)
02161 {
02162 int i;
02163
02164 for (i = 0; i < term.t_nrow; ++i) {
02165 genfree(theEnv,(void *) vscreen[i],(unsigned) (sizeof(VIDEO)+term.t_ncol));
02166 genfree(theEnv,(void *) pscreen[i],(unsigned) (sizeof(VIDEO)+term.t_ncol));
02167 }
02168
02169 genfree(theEnv,(void *) vscreen, (unsigned) (term.t_nrow*sizeof(VIDEO *)));
02170 genfree(theEnv,(void *) pscreen, (unsigned) (term.t_nrow*sizeof(VIDEO *)));
02171 }
02172
02173 static void int_to_ascii(
02174 char buf[],
02175 int width,
02176 int num)
02177 {
02178 buf[width] = 0;
02179 while (num >= 10) {
02180 buf[--width] = (char) (num%10) + '0';
02181 num /= 10;
02182 }
02183 buf[--width] = (char) num + '0';
02184 while (width != 0)
02185 buf[--width] = ' ';
02186 }
02187
02188 #endif