1 | /* ELLE - Copyright 1982, 1985, 1987 by Ken Harrenstien, SRI International
|
---|
2 | * This software is quasi-public; it may be used freely with
|
---|
3 | * like software, but may NOT be sold or made part of licensed
|
---|
4 | * products without permission of the author.
|
---|
5 | */
|
---|
6 | /*
|
---|
7 | * EEFILL Fill Mode functions
|
---|
8 | */
|
---|
9 |
|
---|
10 | #include "elle.h"
|
---|
11 |
|
---|
12 | extern int ev_fcolumn; /* Fill Column variable (defined in EEVINI) */
|
---|
13 | #if FX_SFPREF
|
---|
14 | char *fill_prefix; /* Fill Prefix variable */
|
---|
15 | int fill_plen; /* Length of Fill Prefix (0 = no prefix) */
|
---|
16 | #endif /*FX_SFPREF*/
|
---|
17 |
|
---|
18 | #if FX_FILLMODE
|
---|
19 | int fill_mode = 0; /* TRUE when Auto Fill Mode is on */
|
---|
20 | int *fill_trig; /* Pointer to fill-trigger chbit array */
|
---|
21 | static char *fill_initrig = " \t.,;:)!";
|
---|
22 | #endif /*FX_FILLMODE*/
|
---|
23 |
|
---|
24 | /* Following stuff for testing routines on */
|
---|
25 | /*
|
---|
26 |
|
---|
27 | 1 2 3 4 5 6 7
|
---|
28 | 0123456789012345678901234567890123456789012345678901234567890123456789012345
|
---|
29 |
|
---|
30 | Okay... more stuff to hack. Okay. a b c d e f g h i j k l m
|
---|
31 | n o p q r s t u v w x y z dfsd stuff to hack 01234 Okay testing
|
---|
32 | more stuff to hack. Okay... more stuff to hack more stuff to
|
---|
33 | hack. Okay... more stuff to line long stuff to hack. Okay...
|
---|
34 | even more gap and. period. okay, end of stuff.
|
---|
35 | This is another fence.
|
---|
36 | */
|
---|
37 | |
---|
38 |
|
---|
39 |
|
---|
40 | #if FX_SFCOL
|
---|
41 | /* EFUN: "Set Fill Column" */
|
---|
42 | f_sfcol()
|
---|
43 | { register int linel;
|
---|
44 | char temp[20];
|
---|
45 |
|
---|
46 | linel = exp_p ? exp : d_curind();
|
---|
47 | if(linel < 0) linel = 0;
|
---|
48 | say("Fill column = ");
|
---|
49 | dottoa(temp,(chroff)linel);
|
---|
50 | saytoo(temp);
|
---|
51 | ev_fcolumn = linel;
|
---|
52 | }
|
---|
53 | #endif /*FX_SFCOL*/
|
---|
54 |
|
---|
55 |
|
---|
56 | #if FX_SFPREF
|
---|
57 | /* EFUN: "Set Fill Prefix" */
|
---|
58 | f_sfpref()
|
---|
59 | { register int i;
|
---|
60 | register char *cp;
|
---|
61 |
|
---|
62 | if((i = cur_dot - e_boldot()) > MAXLINE)
|
---|
63 | { ding("Absurd Fill Prefix");
|
---|
64 | return;
|
---|
65 | }
|
---|
66 | if(fill_prefix)
|
---|
67 | { chkfree(fill_prefix);
|
---|
68 | fill_plen = 0;
|
---|
69 | }
|
---|
70 | if(i <= 0)
|
---|
71 | { fill_prefix = 0;
|
---|
72 | cp = "";
|
---|
73 | }
|
---|
74 | else
|
---|
75 | { fill_prefix = cp = memalloc((SBMO)(i+1));
|
---|
76 | fill_plen = i;
|
---|
77 | e_gobol();
|
---|
78 | do { *cp++ = e_getc(); }
|
---|
79 | while(--i);
|
---|
80 | *cp = 0;
|
---|
81 | cp = fill_prefix;
|
---|
82 | }
|
---|
83 | say("Fill Prefix = \"");
|
---|
84 | saytoo(cp);
|
---|
85 | saytoo("\"");
|
---|
86 | }
|
---|
87 |
|
---|
88 |
|
---|
89 | /* TSTFILLP(lim) - Check for existence of Fill Prefix at current dot. If
|
---|
90 | * not there, returns 0 without changing dot. If there, returns
|
---|
91 | * 1 and leaves dot immediately after the Fill Prefix.
|
---|
92 | * Lim = # of chars allowed to scan from buffer.
|
---|
93 | */
|
---|
94 | tstfillp(lim)
|
---|
95 | int lim;
|
---|
96 | { register int i, c;
|
---|
97 | register char *cp;
|
---|
98 | chroff savdot;
|
---|
99 |
|
---|
100 | if(!(i = fill_plen) || (i > lim))
|
---|
101 | return(0);
|
---|
102 | savdot = e_dot();
|
---|
103 | cp = fill_prefix;
|
---|
104 | do { if(*cp++ != e_getc())
|
---|
105 | { e_go(savdot);
|
---|
106 | return(0);
|
---|
107 | }
|
---|
108 | } while(--i);
|
---|
109 | return(1);
|
---|
110 | }
|
---|
111 | #endif /*FX_SFPREF*/
|
---|
112 | |
---|
113 |
|
---|
114 | #if FX_FILLREG || FX_FILLPARA
|
---|
115 |
|
---|
116 | /* ED_FILL(start, end, flag) - Fill a region.
|
---|
117 | * Flag 0 for full filling; extra whitespace is flushed. First
|
---|
118 | * word is always retained.
|
---|
119 | * 1 for skimpy filling such as Auto-Fill likes.
|
---|
120 | * Extra whitespace is NOT flushed, except at
|
---|
121 | * beginning of a newly created line.
|
---|
122 | * This is not yet implemented however.
|
---|
123 | * Note: updates cur_dot to compensate for changes in buffer, and returns
|
---|
124 | * there when done!
|
---|
125 | * Note: Checks for Fill Prefix when it exists.
|
---|
126 | */
|
---|
127 | ed_fill(begloc, endloc, flag)
|
---|
128 | chroff begloc, endloc;
|
---|
129 | int flag;
|
---|
130 | { register int c;
|
---|
131 | register int len, lastc;
|
---|
132 | chroff savloc;
|
---|
133 | int lastbrk;
|
---|
134 | int parlen;
|
---|
135 |
|
---|
136 | parlen = endloc - begloc;
|
---|
137 | if(parlen < 0)
|
---|
138 | { begloc = endloc;
|
---|
139 | parlen = -parlen;
|
---|
140 | }
|
---|
141 | e_go(begloc);
|
---|
142 | len = d_curind(); /* Set up current col */
|
---|
143 |
|
---|
144 | #if FX_SFPREF
|
---|
145 | /* If at beg of line, check for fill prefix and skip over it */
|
---|
146 | if((len == 0) && tstfillp(parlen))
|
---|
147 | { parlen -= fill_plen;
|
---|
148 | len = d_curind();
|
---|
149 | }
|
---|
150 | #endif /*FX_SFPREF*/
|
---|
151 | lastbrk = 0; /* Put next word on no matter what. */
|
---|
152 | c = 0;
|
---|
153 | for(;;)
|
---|
154 | {
|
---|
155 | #if ICONOGRAPHICS
|
---|
156 | if (c != ')' && c != '"') /* allow for two sp after .) or ." */
|
---|
157 | #endif /*ICONOGRAPHICS*/
|
---|
158 | lastc = c;
|
---|
159 | if(--parlen < 0) break;
|
---|
160 | c = e_getc();
|
---|
161 | if(c == EOF)
|
---|
162 | break;
|
---|
163 | #if FX_SFPREF
|
---|
164 | /* If at beg of line, check for fill prefix and flush it */
|
---|
165 | if((c == LF) && tstfillp(parlen))
|
---|
166 | { e_igoff(-(fill_plen+1));
|
---|
167 | e_ovwc(c = SP);
|
---|
168 | e_deln((chroff)fill_plen);
|
---|
169 | parlen -= fill_plen;
|
---|
170 | if(cur_dot >= e_dot())
|
---|
171 | cur_dot -= fill_plen;
|
---|
172 | }
|
---|
173 | #endif /*FX_SFPREF*/
|
---|
174 | if(c == TAB || c == LF) /* Replace tabs+eols by sps */
|
---|
175 | { e_backc(); /* Back up 1 */
|
---|
176 | e_ovwc(c = SP);
|
---|
177 | }
|
---|
178 | if(c == SP)
|
---|
179 | { if(lastc == SP)
|
---|
180 | { e_rdelc();
|
---|
181 | if(cur_dot > e_dot()) --cur_dot;
|
---|
182 | continue;
|
---|
183 | }
|
---|
184 | lastbrk = len;
|
---|
185 | if(lastc == '.' || lastc == '!' || lastc == '?'
|
---|
186 | #if ICONOGRAPHICS
|
---|
187 | || lastc == ':'
|
---|
188 | #endif /*ICONOGRAPHICS*/
|
---|
189 | )
|
---|
190 | { if(--parlen < 0) goto done;
|
---|
191 | if((c = e_getc()) == EOF)
|
---|
192 | goto done;
|
---|
193 | len++;
|
---|
194 | if(c != SP)
|
---|
195 | { e_backc();
|
---|
196 | e_putc(c = SP);
|
---|
197 | if(cur_dot >= e_dot()) ++cur_dot;
|
---|
198 | }
|
---|
199 | }
|
---|
200 | }
|
---|
201 | #if ICONOGRAPHICS
|
---|
202 | if (c == BS) /* adjust for backspaces */
|
---|
203 | if ((len -= 2) < 0) len = 0;
|
---|
204 | #endif /*ICONOGRAPHICS*/
|
---|
205 | /* Normal char */
|
---|
206 | if(++len > ev_fcolumn && lastbrk) /* If went too far */
|
---|
207 | { c = lastbrk - len; /* Must put EOL at last SP */
|
---|
208 | e_igoff(c);
|
---|
209 | parlen -= c; /* C is negative, actually adding */
|
---|
210 | parlen--;
|
---|
211 | e_ovwc(LF);
|
---|
212 | lastbrk = 0;
|
---|
213 | len = 0;
|
---|
214 | c = SP; /* Pretend this char was space */
|
---|
215 | #if FX_SFPREF
|
---|
216 | if(fill_plen)
|
---|
217 | { if(cur_dot >= e_dot())
|
---|
218 | cur_dot += fill_plen;
|
---|
219 | /* Better hope no nulls in prefix! */
|
---|
220 | e_sputz(fill_prefix);
|
---|
221 | len = d_curind();
|
---|
222 | }
|
---|
223 | #endif /*FX_SFPREF*/
|
---|
224 | }
|
---|
225 | }
|
---|
226 | done: savloc = cur_dot;
|
---|
227 | e_setcur(); /* Reached paragraph end, set cur_dot temporarily */
|
---|
228 | buf_tmod(begloc-cur_dot); /* So that proper range is marked */
|
---|
229 | e_gosetcur(savloc); /* Then restore original cur_dot */
|
---|
230 | }
|
---|
231 | #endif /*FX_FILLREG || FX_FILLPARA*/
|
---|
232 | |
---|
233 |
|
---|
234 | #if FX_FILLMODE
|
---|
235 |
|
---|
236 | /* EFUN: "Auto Fill Mode" */
|
---|
237 | /* Toggles Auto Fill Mode (a minor mode). */
|
---|
238 | f_fillmode()
|
---|
239 | { register char *cp;
|
---|
240 | int *chballoc();
|
---|
241 |
|
---|
242 | fill_mode = fill_mode ? 0 : 1;
|
---|
243 | if(!fill_trig)
|
---|
244 | { fill_trig = chballoc(128);
|
---|
245 | for(cp = fill_initrig; *cp; ++cp)
|
---|
246 | chbis(fill_trig, *cp);
|
---|
247 | }
|
---|
248 | redp(RD_MODE);
|
---|
249 | }
|
---|
250 |
|
---|
251 | /* Called by F_INSSELF to handle char insertion in Auto Fill mode */
|
---|
252 | fx_insfill(c)
|
---|
253 | int c;
|
---|
254 | {
|
---|
255 | ed_insn(c,exp);
|
---|
256 | if(chbit(fill_trig, c))
|
---|
257 | { fill_cur_line();
|
---|
258 |
|
---|
259 | }
|
---|
260 | }
|
---|
261 |
|
---|
262 |
|
---|
263 | fill_cur_line()
|
---|
264 | {
|
---|
265 | register int foundit, i;
|
---|
266 | chroff lastbrkdot, boldot, eoldot;
|
---|
267 |
|
---|
268 | boldot = e_boldot();
|
---|
269 |
|
---|
270 | /* First back up to find place to make first break. */
|
---|
271 | e_bwsp();
|
---|
272 | lastbrkdot = e_dot();
|
---|
273 | foundit = 0;
|
---|
274 | for(foundit = 0; foundit >= 0;)
|
---|
275 | { if((i = d_curind()) <= ev_fcolumn)
|
---|
276 | { if(foundit)
|
---|
277 | foundit = -1;
|
---|
278 | else break;
|
---|
279 | }
|
---|
280 | else ++foundit;
|
---|
281 | while (!c_wsp (e_rgetc ())) ;
|
---|
282 | e_bwsp();
|
---|
283 | lastbrkdot = e_dot();
|
---|
284 | if(lastbrkdot <= boldot)
|
---|
285 | { lastbrkdot = boldot;
|
---|
286 | break;
|
---|
287 | }
|
---|
288 | }
|
---|
289 |
|
---|
290 | if(foundit)
|
---|
291 | ed_fill(lastbrkdot, e_eoldot(), 1);
|
---|
292 | }
|
---|
293 | #endif /*FX_FILLMODE*/
|
---|
294 | |
---|
295 |
|
---|
296 | #if IMAGEN
|
---|
297 |
|
---|
298 | #if FX_TEXTMODE
|
---|
299 | /* EFUN: "Text Mode Toggle" (not EMACS) */
|
---|
300 | f_textmode()
|
---|
301 | {
|
---|
302 | cur_buf->b_flags ^= B_TEXTMODE;
|
---|
303 | redp(RD_MODE);
|
---|
304 | }
|
---|
305 | #endif /*FX_TEXTMODE*/
|
---|
306 |
|
---|
307 | int curr_indent = -1; /* Current indent (for text mode autowrap) */
|
---|
308 | /* (misnomered: actually current column) */
|
---|
309 | chroff best_break; /* Best break point so far */
|
---|
310 |
|
---|
311 |
|
---|
312 | /* Fill-mode version of "Insert Self" */
|
---|
313 |
|
---|
314 | fim_insself(c)
|
---|
315 | int c;
|
---|
316 | {
|
---|
317 | register int ind, flags = cur_buf->b_flags;
|
---|
318 |
|
---|
319 | /* In Text mode, auto-wrap happens at spaces after fill column */
|
---|
320 | if (c == SP && flags & B_TEXTMODE && exp == 1 && magic_wrap(c))
|
---|
321 | return;
|
---|
322 |
|
---|
323 | /* In C-mode, tab stops are every 4 columns */
|
---|
324 | else if (c == TAB && flags & B_CMODE &&
|
---|
325 | (ind = magic_backto_bol()) >= 0)
|
---|
326 | ed_indto((ind + 4) & ~3);
|
---|
327 | else
|
---|
328 | { ed_insn(c, exp);
|
---|
329 |
|
---|
330 | /* Keep track of indent, once we have a grip on it */
|
---|
331 | if (last_cmd == INSCMD && curr_indent != -1)
|
---|
332 | { this_cmd = INSCMD; /* Keep the ball rolling */
|
---|
333 | if (c == TAB)
|
---|
334 | curr_indent = ((curr_indent + 8) & ~7)
|
---|
335 | + 8 * (exp - 1);
|
---|
336 | else if (c == '\n')
|
---|
337 | curr_indent = 0;
|
---|
338 | else if (c < SP || c > 0176)
|
---|
339 | curr_indent += (2 * exp);
|
---|
340 | else
|
---|
341 | curr_indent += exp;
|
---|
342 | }
|
---|
343 | }
|
---|
344 | }
|
---|
345 |
|
---|
346 | /* Fill-mode version of "Delete Character" */
|
---|
347 |
|
---|
348 | fim_dchar()
|
---|
349 | { /* In C mode, deleting at BOL should do fake TAB preservation */
|
---|
350 | if (cur_buf->b_flags & B_CMODE)
|
---|
351 | { chroff savdot;
|
---|
352 | register int c, indent;
|
---|
353 |
|
---|
354 | if (e_rgetc() != LF)
|
---|
355 | { /* Only hack this at BOL */
|
---|
356 | e_getc();
|
---|
357 | goto normal;
|
---|
358 | }
|
---|
359 | e_getc();
|
---|
360 | savdot = e_dot();
|
---|
361 | indent = 0;
|
---|
362 | while ((c = e_getc()) == SP || c == TAB)
|
---|
363 | if (c == SP)
|
---|
364 | ++indent;
|
---|
365 | else
|
---|
366 | indent = (indent + 8) & ~7;
|
---|
367 | e_rgetc();
|
---|
368 | if (indent >= 4)
|
---|
369 | { ed_delete(savdot, e_dot());
|
---|
370 | ed_indto((indent - 4) & ~3);
|
---|
371 | f_begline(); /* HACK!!!! */
|
---|
372 | }
|
---|
373 | else
|
---|
374 | { e_go(savdot);
|
---|
375 | ef_deln(exp);
|
---|
376 | }
|
---|
377 | }
|
---|
378 | else
|
---|
379 | normal: return (ef_deln(exp));
|
---|
380 | }
|
---|
381 |
|
---|
382 | /* Fill-mode version of "Backward Delete Character" */
|
---|
383 |
|
---|
384 | fim_bdchar()
|
---|
385 | { register int ind;
|
---|
386 |
|
---|
387 | /* If in C mode, and deleting into white space at BOL, hack tabs */
|
---|
388 | if (exp == 1 && cur_buf->b_flags & B_CMODE &&
|
---|
389 | (ind = magic_backto_bol()) > 0)
|
---|
390 | ed_indto(ind < 4 ? ind - 1 : ((ind - 4) & ~3));
|
---|
391 | else
|
---|
392 | return (ef_deln (-exp));
|
---|
393 | }
|
---|
394 |
|
---|
395 | /* Fill-mode version of "CRLF" */
|
---|
396 | fim_crlf()
|
---|
397 | { register int i;
|
---|
398 |
|
---|
399 | if(e_getc() == LF
|
---|
400 | && exp == 1
|
---|
401 | && e_lblankp() && e_lblankp())
|
---|
402 | { e_gocur();
|
---|
403 | e_gonl();
|
---|
404 | e_setcur();
|
---|
405 | ed_delete(e_dot(), e_eoldot());
|
---|
406 | }
|
---|
407 | else
|
---|
408 | { e_gocur();
|
---|
409 | #if IMAGEN
|
---|
410 | if (cur_buf->b_flags & B_TEXTMODE && exp == 1 &&
|
---|
411 | magic_wrap('\n'))
|
---|
412 | return;
|
---|
413 | else
|
---|
414 | #endif /*IMAGEN*/
|
---|
415 | if((i = exp) > 0)
|
---|
416 | do ed_crins();
|
---|
417 | while(--i);
|
---|
418 | }
|
---|
419 | }
|
---|
420 | |
---|
421 |
|
---|
422 | /* Do all magic for auto-wrap in Text mode:
|
---|
423 | * return as did wrap (i.e., everything is taken care of)
|
---|
424 | */
|
---|
425 | magic_wrap(tc)
|
---|
426 | int tc; /* "trigger char" */
|
---|
427 | {
|
---|
428 | register int c, indent, i, nc;
|
---|
429 | chroff savdot, modstart, breakdot;
|
---|
430 |
|
---|
431 | savdot = e_dot();
|
---|
432 | nc = 0;
|
---|
433 | if (last_cmd == INSCMD && curr_indent != -1)
|
---|
434 | { indent = curr_indent; /* Already know our indent */
|
---|
435 | breakdot = best_break;
|
---|
436 | }
|
---|
437 | else
|
---|
438 | {
|
---|
439 | #ifdef INDENTDEBUG
|
---|
440 | barf2("Full indent calculation");
|
---|
441 | #endif
|
---|
442 | for (nc = 0; (c = e_rgetc()) != EOF && c != '\n'; ++nc)
|
---|
443 | ; /* nc: # chars to look at */
|
---|
444 | if (c == '\n') /* Go back over NL */
|
---|
445 | e_getc();
|
---|
446 | indent = 0;
|
---|
447 |
|
---|
448 | /* Search for last line break point, leaving it in breakdot */
|
---|
449 | breakdot = (chroff)0;
|
---|
450 | while (--nc >= 0)
|
---|
451 | { c = e_getc();
|
---|
452 | if (c == TAB)
|
---|
453 | indent = (indent + 8) & ~7;
|
---|
454 | else if (c < SP || c > 0176)
|
---|
455 | indent += 2;
|
---|
456 | else
|
---|
457 | ++indent;
|
---|
458 | if ((c == SP || c == TAB) &&
|
---|
459 | (breakdot == (chroff)0 || (indent <= ev_fcolumn)))
|
---|
460 | breakdot = e_dot();
|
---|
461 | }
|
---|
462 | }
|
---|
463 |
|
---|
464 | /* If there is nothing to do, get out */
|
---|
465 | if (indent <= ev_fcolumn)
|
---|
466 | { e_go(savdot);
|
---|
467 | if (tc == SP)
|
---|
468 | { curr_indent = indent;
|
---|
469 | best_break = (chroff)(savdot + 1); /* Remember here, also */
|
---|
470 | this_cmd = INSCMD; /* We do know current indent */
|
---|
471 | }
|
---|
472 | else if (tc == '\n')
|
---|
473 | { curr_indent = 0;
|
---|
474 | best_break = (chroff)0;
|
---|
475 | this_cmd = INSCMD;
|
---|
476 | }
|
---|
477 | else
|
---|
478 | errbarf("bad trigger");
|
---|
479 | return(0);
|
---|
480 | }
|
---|
481 |
|
---|
482 | if (breakdot == (chroff)0)
|
---|
483 | {
|
---|
484 | /* No breakpoint found or none needed, just break line at end
|
---|
485 | */
|
---|
486 | e_go(savdot);
|
---|
487 | modstart = savdot;
|
---|
488 | e_putc('\n');
|
---|
489 | }
|
---|
490 | else
|
---|
491 | {
|
---|
492 | /* Get to breakpoint and replace with newline
|
---|
493 | */
|
---|
494 | e_go(breakdot);
|
---|
495 | e_rdelc();
|
---|
496 | modstart = e_dot(); /* Remember where changes start */
|
---|
497 | e_putc('\n'); /* Insert line break */
|
---|
498 | e_go(savdot); /* Get back to trigger point */
|
---|
499 | }
|
---|
500 | if (e_rgetc() != '\n')
|
---|
501 | { /* If not at line start, */
|
---|
502 | e_getc();
|
---|
503 | e_putc(tc); /* insert trigger character */
|
---|
504 |
|
---|
505 | /* Once again, compute new indent by backing up to BOL */
|
---|
506 | for (nc = 0; (c = e_rgetc()) != EOF && c != '\n'; ++nc)
|
---|
507 | ;
|
---|
508 | if (c == '\n') /* Go back over NL */
|
---|
509 | e_getc();
|
---|
510 | indent = 0;
|
---|
511 | breakdot = (chroff)0;
|
---|
512 | while (--nc >= 0)
|
---|
513 | { /* Get back to current dot */
|
---|
514 | c = e_getc();
|
---|
515 | if (c == TAB)
|
---|
516 | indent = (indent + 8) & ~7;
|
---|
517 | else if (c < SP || c > 0176)
|
---|
518 | indent += 2;
|
---|
519 | else
|
---|
520 | ++indent;
|
---|
521 | if ((c == SP || c == TAB) &&
|
---|
522 | (breakdot == (chroff)0 || (indent <= ev_fcolumn)))
|
---|
523 | breakdot = e_dot();
|
---|
524 | }
|
---|
525 | if (breakdot == (chroff)0) /* If no good break found, use dot */
|
---|
526 | breakdot = e_dot();
|
---|
527 | curr_indent = indent; /* Now we know where we are */
|
---|
528 | if (tc == '\n') /* If trigger was NL */
|
---|
529 | best_break = (chroff)0; /* indent is 0, and no best break */
|
---|
530 | else
|
---|
531 | best_break = breakdot; /* This is best break so far */
|
---|
532 | }
|
---|
533 | else
|
---|
534 | { e_getc();
|
---|
535 | curr_indent = 0; /* At line start, no indent */
|
---|
536 | best_break = (chroff)0; /* Do not have a best break so far */
|
---|
537 | }
|
---|
538 | ed_setcur();
|
---|
539 | buf_tmat(modstart); /* Alert to potential changes */
|
---|
540 | this_cmd = INSCMD; /* Say we know where we are */
|
---|
541 | return(1);
|
---|
542 | }
|
---|
543 |
|
---|
544 | /* Do lots of magic things for C-mode indent:
|
---|
545 | * erase back to BOL iff we are looking back at white space only,
|
---|
546 | * returning the indent level of the original dot
|
---|
547 | * (< 0 means no erasure done)
|
---|
548 | */
|
---|
549 | /*#define MYDEBUG /* */
|
---|
550 | #ifdef MYDEBUG
|
---|
551 | reveal(msg, v1, v2, v3)
|
---|
552 | char *msg;
|
---|
553 | {
|
---|
554 | char ahint[128];
|
---|
555 | sprintf(ahint, msg, v1, v2, v3);
|
---|
556 | barf2(ahint);
|
---|
557 | }
|
---|
558 | #endif
|
---|
559 |
|
---|
560 | magic_backto_bol()
|
---|
561 | {
|
---|
562 | chroff savdot;
|
---|
563 | register int c, indent, nc, i;
|
---|
564 |
|
---|
565 | savdot = e_dot();
|
---|
566 | nc = 0;
|
---|
567 | while ((c = e_rgetc()) != EOF && c != LF)
|
---|
568 | { ++nc; /* Count # chars */
|
---|
569 | if (c != SP && c != TAB)
|
---|
570 | { e_go(savdot);
|
---|
571 | #ifdef MYDEBUG
|
---|
572 | reveal("fail: nc: %d", nc);
|
---|
573 | #endif
|
---|
574 | return -1;
|
---|
575 | }
|
---|
576 | }
|
---|
577 | if (c == LF) /* Go back over the LF */
|
---|
578 | e_getc();
|
---|
579 | indent = 0; /* (zero-based indent) */
|
---|
580 | savdot = e_dot(); /* BOL is now origin for delete */
|
---|
581 | for (i = 1; i <= nc; ++i)
|
---|
582 | if ((c = e_getc()) == SP)
|
---|
583 | ++indent;
|
---|
584 | else /* (tab) */
|
---|
585 | indent = (indent + 8) & ~7;
|
---|
586 | if (nc > 0) /* Don't bother deleting nothing */
|
---|
587 | ed_delete(savdot, e_dot());
|
---|
588 | #ifdef MYDEBUG
|
---|
589 | reveal("indent: %d, nc: %d, foo: %d", indent, nc, 234);
|
---|
590 | #endif
|
---|
591 | return(indent);
|
---|
592 | }
|
---|
593 | #endif /*IMAGEN*/
|
---|
594 | |
---|
595 |
|
---|
596 | #if ICONOGRAPHICS
|
---|
597 | /* Iconographics hack for Auto-Fill mode. Too big and clumsy, but
|
---|
598 | * retained for posterity in case it has some obscure feature.
|
---|
599 | */
|
---|
600 |
|
---|
601 | fill_current_line ()
|
---|
602 | {
|
---|
603 | chroff startpos, endpos, savepos, limitpos;
|
---|
604 | int i, foundit;
|
---|
605 | SBSTR *savep;
|
---|
606 |
|
---|
607 | foundit = 0;
|
---|
608 | while (d_curind() > ev_fcolumn)
|
---|
609 | {
|
---|
610 | foundit = 1;
|
---|
611 | startpos = e_dot ();
|
---|
612 | e_bwsp ();
|
---|
613 | while (d_curind() > ev_fcolumn) /* back up to ends of wds*/
|
---|
614 | { /* until <= fill column */
|
---|
615 | while (!c_wsp (e_rgetc ())) ;
|
---|
616 | e_bwsp ();
|
---|
617 | }
|
---|
618 | if (e_dot () == e_boldot ())
|
---|
619 | { /* ding ("Word does not fit in fill column"); */
|
---|
620 | return(0);
|
---|
621 | }
|
---|
622 | savep = e_copyn (startpos - e_dot ());
|
---|
623 | e_setcur (); /* ed_delete does gocur */
|
---|
624 | ed_delete (savepos = e_dot (), startpos);
|
---|
625 |
|
---|
626 | f_crlf(); /* Now insert newline */
|
---|
627 | e_sputz(fill_prefix); /* With fill prefix */
|
---|
628 | startpos += e_dot () - savepos;
|
---|
629 | if (d_curind() > ev_fcolumn)
|
---|
630 | { ed_delete (savepos, e_dot ());
|
---|
631 | sb_sins (cur_buf, savep);
|
---|
632 | e_setcur ();
|
---|
633 | ding ("Fill prefix > fill column???");
|
---|
634 | return(0);
|
---|
635 | }
|
---|
636 | savepos = e_dot (); /* gun inherited initial whitespace */
|
---|
637 | sb_sins (cur_buf, savep);
|
---|
638 | e_go (savepos);
|
---|
639 | e_fwsp ();
|
---|
640 | if ((limitpos = e_dot ()) > startpos) limitpos = startpos;
|
---|
641 | /* in case rest of line was white */
|
---|
642 | ed_delete (savepos, limitpos);
|
---|
643 | e_gosetcur (startpos + savepos - limitpos);
|
---|
644 | }
|
---|
645 |
|
---|
646 | return foundit;
|
---|
647 | }
|
---|
648 | #endif /*ICONOGRAPHICS*/
|
---|