312 lines
5.9 KiB
C
312 lines
5.9 KiB
C
|
/* ELLE - Copyright 1982, 1984, 1987 by Ken Harrenstien, SRI International
|
|||
|
* This software is quasi-public; it may be used freely with
|
|||
|
* like software, but may NOT be sold or made part of licensed
|
|||
|
* products without permission of the author.
|
|||
|
*/
|
|||
|
/*
|
|||
|
* EEF2 Various functions
|
|||
|
*/
|
|||
|
|
|||
|
#include "elle.h"
|
|||
|
|
|||
|
/* Line Handling functions */
|
|||
|
|
|||
|
/* EFUN: "Beginning of Line" */
|
|||
|
f_begline()
|
|||
|
{ e_gobol();
|
|||
|
ed_setcur();
|
|||
|
}
|
|||
|
|
|||
|
/* EFUN: "End of Line" */
|
|||
|
f_endline()
|
|||
|
{ e_goeol();
|
|||
|
ed_setcur();
|
|||
|
}
|
|||
|
|
|||
|
/* EFUN: "Next Line" */
|
|||
|
/* Goes to beginning of next line */
|
|||
|
f_nxtline()
|
|||
|
{ return(down_bline(exp));
|
|||
|
}
|
|||
|
|
|||
|
/* EFUN: "Previous Line" */
|
|||
|
/* Goes to beginning of previous line */
|
|||
|
f_prvline()
|
|||
|
{ return(down_bline(-exp));
|
|||
|
}
|
|||
|
|
|||
|
/* EFUN: "Down Real Line" */
|
|||
|
f_dnrline ()
|
|||
|
{ down_line(exp);
|
|||
|
}
|
|||
|
|
|||
|
/* EFUN: "Up Real Line" */
|
|||
|
f_uprline ()
|
|||
|
{ down_line(-exp);
|
|||
|
}
|
|||
|
|
|||
|
#if FX_OLINE
|
|||
|
/* EFUN: "Open Line" */
|
|||
|
f_oline()
|
|||
|
{ register int i;
|
|||
|
chroff savdot;
|
|||
|
|
|||
|
savdot = cur_dot;
|
|||
|
if((i = exp) > 0)
|
|||
|
do { ed_crins(); }
|
|||
|
while(--i);
|
|||
|
e_gosetcur(savdot);
|
|||
|
}
|
|||
|
#endif /*FX_OLINE*/
|
|||
|
|
|||
|
#if FX_DELBLINES
|
|||
|
/* EFUN: "Delete Blank Lines" */
|
|||
|
/* Delete blank lines around point.
|
|||
|
*/
|
|||
|
f_delblines()
|
|||
|
{ register int c;
|
|||
|
chroff dot1, dot2, oldcur;
|
|||
|
|
|||
|
oldcur = cur_dot;
|
|||
|
do { e_gobwsp(); }
|
|||
|
while ((c = e_rgetc()) == LF);
|
|||
|
if (c != EOF)
|
|||
|
e_gonl();
|
|||
|
dot1 = e_dot();
|
|||
|
if(dot1 > oldcur) return;
|
|||
|
do { e_gofwsp(); }
|
|||
|
while ((c = e_getc()) == LF);
|
|||
|
if(c != EOF)
|
|||
|
e_gobol();
|
|||
|
dot2 = e_dot();
|
|||
|
if(dot2 < oldcur) return;
|
|||
|
ed_delete(dot1,dot2);
|
|||
|
}
|
|||
|
#endif /*FX_DELBLINES*/
|
|||
|
|
|||
|
#if FX_KLINE
|
|||
|
/* EFUN: "Kill Line" */
|
|||
|
f_kline()
|
|||
|
{
|
|||
|
if(exp_p)
|
|||
|
e_goline(exp); /* Move that many lines */
|
|||
|
/* (if 0, goes to BOL) */
|
|||
|
else /* No arg, handle specially */
|
|||
|
{ if(e_lblankp()) /* Is rest of line blank? */
|
|||
|
; /* Yes, now at next line! */
|
|||
|
else e_goeol(); /* No, go to EOL rather than NL */
|
|||
|
}
|
|||
|
ed_kill(cur_dot,e_dot());
|
|||
|
e_setcur();
|
|||
|
this_cmd = KILLCMD;
|
|||
|
}
|
|||
|
#endif /*FX_KLINE*/
|
|||
|
|
|||
|
#if FX_BKLINE
|
|||
|
/* EFUN: "Backward Kill Line" (not EMACS) */
|
|||
|
/* Originally an Iconographics function.
|
|||
|
*/
|
|||
|
f_bkline()
|
|||
|
{
|
|||
|
if(exp_p) exp = -exp; /* If arg, invert it */
|
|||
|
else
|
|||
|
{ exp = 0; /* No arg, furnish 0 */
|
|||
|
exp_p = 1;
|
|||
|
}
|
|||
|
f_kline(); /* Invoke "Kill Line" */
|
|||
|
}
|
|||
|
#endif /*FX_BKLINE*/
|
|||
|
|
|||
|
#if FX_GOLINE
|
|||
|
/* EFUN: "Goto Line" (not EMACS) (GNU goto-line) */
|
|||
|
f_goline()
|
|||
|
{
|
|||
|
e_gobob();
|
|||
|
down_bline(exp-1); /* already at line 1 */
|
|||
|
}
|
|||
|
#endif /*FX_GOLINE*/
|
|||
|
|
|||
|
down_bline(arg)
|
|||
|
int arg;
|
|||
|
{
|
|||
|
if(arg)
|
|||
|
e_goline(arg);
|
|||
|
ed_setcur();
|
|||
|
}
|
|||
|
|
|||
|
#if FX_DNRLINE || FX_UPRLINE
|
|||
|
down_line (x)
|
|||
|
int x;
|
|||
|
{ register int i, res;
|
|||
|
|
|||
|
res = x ? e_goline(x) : 1; /* Move that many lines */
|
|||
|
goal = 0;
|
|||
|
if(res == 0) /* Hit buffer limits (EOF)? */
|
|||
|
{ if(x > 0) /* Moving downwards? */
|
|||
|
{
|
|||
|
#if !(IMAGEN) /* If IMAGEN, do not extend!! */
|
|||
|
if(x == 1) ed_crins(); /* Yeah, maybe extend */
|
|||
|
else
|
|||
|
#endif
|
|||
|
goal = indtion(cur_dot);
|
|||
|
goto done;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if(last_cmd == LINECMD /* If previous cmd also a line move */
|
|||
|
&& pgoal != -1) /* and we have a previous goal col */
|
|||
|
goal = pgoal; /* then make it the current goal */
|
|||
|
else goal = indtion(cur_dot); /* Else invent goal from current pos */
|
|||
|
|
|||
|
i = inindex(e_dot(), goal); /* See # chars needed to reach goal */
|
|||
|
if(i == -1) /* If off edge of line, */
|
|||
|
e_goeol(); /* just move to end of this line */
|
|||
|
else e_igoff(i); /* else move to goal. */
|
|||
|
|
|||
|
done: pgoal = goal;
|
|||
|
this_cmd = LINECMD;
|
|||
|
ed_setcur();
|
|||
|
}
|
|||
|
#endif /*FX_DNRLINE || FX_UPRLINE*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/* Region Handling functions */
|
|||
|
|
|||
|
/* EFUN: "Set/Pop Mark" */
|
|||
|
f_setmark()
|
|||
|
{
|
|||
|
mark_dot = e_dot();
|
|||
|
mark_p = 1;
|
|||
|
if(ev_markshow) /* If have one, show indicator */
|
|||
|
saytoo(ev_markshow); /* that mark was set. */
|
|||
|
}
|
|||
|
|
|||
|
/* EFUN: "Exchange Point and Mark" */
|
|||
|
f_exchmark()
|
|||
|
{ chroff tmpdot;
|
|||
|
|
|||
|
if(chkmark())
|
|||
|
{ tmpdot = mark_dot;
|
|||
|
mark_dot = cur_dot;
|
|||
|
ed_go(tmpdot); /* Set cur_dot and go there */
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* EFUN: "Kill Region" */
|
|||
|
f_kregion()
|
|||
|
{
|
|||
|
if(chkmark())
|
|||
|
{ ed_kill(cur_dot,mark_dot); /* Will adj cur_dot, mark_dot */
|
|||
|
e_gocur();
|
|||
|
this_cmd = KILLCMD;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* EFUN: "Copy Region" */
|
|||
|
f_copreg()
|
|||
|
{
|
|||
|
if(chkmark())
|
|||
|
{ e_gocur();
|
|||
|
kill_push(e_copyn(mark_dot - cur_dot));
|
|||
|
e_gocur();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/* EFUN: "Uppercase Region" */
|
|||
|
f_ucreg()
|
|||
|
{ ef_creg(0);
|
|||
|
}
|
|||
|
|
|||
|
/* EFUN: "Lowercase Region" */
|
|||
|
f_lcreg()
|
|||
|
{ ef_creg(1);
|
|||
|
}
|
|||
|
|
|||
|
ef_creg(downp)
|
|||
|
int downp;
|
|||
|
{
|
|||
|
if(chkmark())
|
|||
|
ed_case(cur_dot,mark_dot,downp);
|
|||
|
}
|
|||
|
|
|||
|
#if FX_FILLREG
|
|||
|
/* EFUN: "Fill Region" */
|
|||
|
f_fillreg()
|
|||
|
{ if(chkmark())
|
|||
|
ed_fill(mark_dot,cur_dot,0);
|
|||
|
}
|
|||
|
#endif /*FX_FILLREG*/
|
|||
|
|
|||
|
/* CHKMARK() - minor utility for region-hacking functions.
|
|||
|
* Returns TRUE if mark exists.
|
|||
|
* Otherwise complains to user and returns 0.
|
|||
|
*/
|
|||
|
chkmark()
|
|||
|
{ if(mark_p == 0)
|
|||
|
ding("No mark!");
|
|||
|
return(mark_p);
|
|||
|
}
|
|||
|
|
|||
|
/* Paragraph functions */
|
|||
|
|
|||
|
#if FX_FPARA
|
|||
|
/* EFUN: "Forward Paragraph" */
|
|||
|
f_fpara()
|
|||
|
{ int e_gobpa(), e_goepa();
|
|||
|
|
|||
|
exp_do(e_goepa, e_gobpa);
|
|||
|
ed_setcur();
|
|||
|
}
|
|||
|
#endif /*FX_FPARA*/
|
|||
|
|
|||
|
#if FX_BPARA
|
|||
|
/* EFUN: "Backward Paragraph" */
|
|||
|
/* Go to beginning of paragraph.
|
|||
|
* Skip all whitespace until text seen, then stop at beginning of
|
|||
|
* 1st line starting with whitespace.
|
|||
|
*/
|
|||
|
f_bpara()
|
|||
|
{ int e_gobpa(), e_goepa();
|
|||
|
|
|||
|
exp_do(e_gobpa, e_goepa);
|
|||
|
ed_setcur();
|
|||
|
}
|
|||
|
#endif /*FX_BPARA*/
|
|||
|
|
|||
|
#if FX_MRKPARA
|
|||
|
/* EFUN: "Mark Paragraph" */
|
|||
|
f_mrkpara()
|
|||
|
{
|
|||
|
f_fpara(); /* Go to end of paragraph */
|
|||
|
f_setmark(); /* Put mark there */
|
|||
|
f_bpara(); /* Then back to start of paragraph */
|
|||
|
}
|
|||
|
#endif /*FX_MRKPARA*/
|
|||
|
|
|||
|
#if FX_FILLPARA
|
|||
|
/* EFUN: "Fill Paragraph" */
|
|||
|
f_fillpara()
|
|||
|
{
|
|||
|
chroff savloc, endloc;
|
|||
|
|
|||
|
savloc = cur_dot;
|
|||
|
#if ICONOGRAPHICS
|
|||
|
e_getc(); /* DON'T go to next para if at end */
|
|||
|
e_gobpa(); /* of this one!! */
|
|||
|
#endif /*ICONOGRAPHICS*/
|
|||
|
e_goepa(); /* Go to end of parag */
|
|||
|
if(e_rgetc() != LF) /* If last char EOL, back over it. */
|
|||
|
e_getc();
|
|||
|
endloc = e_dot(); /* Remember where end is */
|
|||
|
e_gobpa(); /* Go to beg of parag */
|
|||
|
#if ICONOGRAPHICS
|
|||
|
kill_push(e_copyn(endloc - e_dot ()));
|
|||
|
/* put old version on kill ring */
|
|||
|
#endif /*ICONOGRAPHICS*/
|
|||
|
e_fwsp(); /* Move over initial whitespace */
|
|||
|
ed_fill(e_dot(), endloc, 0); /* Fill this region, return to dot */
|
|||
|
}
|
|||
|
#endif /*FX_FILLPARA*/
|