[9] | 1 | /* ELLE - Copyright 1982, 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 | /* EEEDIT - E-type routines */
|
---|
| 7 |
|
---|
| 8 | #include "elle.h"
|
---|
| 9 |
|
---|
| 10 | /* E_ - Operate on cur_buf. Do not change value of cur_dot unless
|
---|
| 11 | * unavoidable side effect (also e_setcur).
|
---|
| 12 | * EX_ - Like E_ but take SB ptr value. Never touch cur_dot.
|
---|
| 13 | * ED_ - Like E_, operate on cur_buf, update cur_dot and display stuff.
|
---|
| 14 | * D_ - Perform necessary display update for given operations.
|
---|
| 15 | *
|
---|
| 16 | * Note that "dot" refers to the current read/write pointer for a sbbuffer.
|
---|
| 17 | * The name comes from EMACS/TECO where "." represents this value.
|
---|
| 18 | */
|
---|
| 19 |
|
---|
| 20 | #define CURSBB (SBBUF *)cur_buf /* Shorthand for current SB buffer */
|
---|
| 21 |
|
---|
| 22 | e_reset() /* Reset current buffer */
|
---|
| 23 | { ex_reset(CURSBB);
|
---|
| 24 | cur_dot = 0;
|
---|
| 25 | }
|
---|
| 26 |
|
---|
| 27 | /* Basic functions - apply SB routines to current buffer.
|
---|
| 28 | * There is some optimization here which knows that certain SB functions
|
---|
| 29 | * are macros.
|
---|
| 30 | */
|
---|
| 31 | e_rgetc() /* Read/move 1 char backward */
|
---|
| 32 | { return(sb_rgetc((CURSBB)));
|
---|
| 33 | }
|
---|
| 34 | e_rdelc() /* Delete 1 char backward */
|
---|
| 35 | { return(sb_rdelc((CURSBB)));
|
---|
| 36 | }
|
---|
| 37 | e_delc() /* Delete 1 char forward */
|
---|
| 38 | { return(sb_deln(CURSBB,(chroff)1));
|
---|
| 39 | }
|
---|
| 40 | e_getc() /* Read/move 1 char forward */
|
---|
| 41 | { register SBBUF *sb;
|
---|
| 42 | sb = CURSBB; /* Macro: use reg */
|
---|
| 43 | return(sb_getc(sb));
|
---|
| 44 | }
|
---|
| 45 | e_backc() /* Move 1 char backward */
|
---|
| 46 | { register SBBUF *sb;
|
---|
| 47 | sb = CURSBB; /* Macro: use reg */
|
---|
| 48 | sb_backc(sb); /* No value returned */
|
---|
| 49 | }
|
---|
| 50 | e_putc(c) /* Insert/write 1 char forward */
|
---|
| 51 | char c;
|
---|
| 52 | { register SBBUF *sb;
|
---|
| 53 | sb = CURSBB; /* Macro: use reg */
|
---|
| 54 | return(sb_putc(sb, c));
|
---|
| 55 | }
|
---|
| 56 | e_peekc() /* Read 1 char forward (no move) */
|
---|
| 57 | { register SBBUF *sb;
|
---|
| 58 | sb = CURSBB; /* Macro: use reg */
|
---|
| 59 | return(sb_peekc(sb));
|
---|
| 60 | }
|
---|
| 61 | e_ovwc(ch) /* Overwrite 1 char forward */
|
---|
| 62 | char ch;
|
---|
| 63 | {
|
---|
| 64 | sb_setovw(CURSBB); /* Turn on overwrite mode */
|
---|
| 65 | e_putc(ch);
|
---|
| 66 | sb_clrovw(CURSBB); /* Turn off overwrite mode */
|
---|
| 67 | }
|
---|
| 68 |
|
---|
| 69 | SBSTR *
|
---|
| 70 | e_copyn(off) /* Copy N chars forward/backward, return SD to sbstring */
|
---|
| 71 | chroff off;
|
---|
| 72 | { return(sb_cpyn(CURSBB,off));
|
---|
| 73 | }
|
---|
| 74 | e_deln(off) /* Delete N chars forward/backward */
|
---|
| 75 | chroff off;
|
---|
| 76 | { return(sb_deln(CURSBB, off));
|
---|
| 77 | }
|
---|
| 78 |
|
---|
| 79 | /* E_SETCUR() - set cur_dot to current position (dot). This is the only
|
---|
| 80 | * E_ routine that mungs cur_dot except for e_reset.
|
---|
| 81 | */
|
---|
| 82 | e_setcur()
|
---|
| 83 | { cur_dot = e_dot();
|
---|
| 84 | }
|
---|
| 85 | e_gosetcur(dot) /* Go to specified dot and set cur_dot as well */
|
---|
| 86 | chroff dot;
|
---|
| 87 | { sb_seek(CURSBB,dot,0);
|
---|
| 88 | e_setcur(); /* Not cur_dot = dot since want canonicalization */
|
---|
| 89 | }
|
---|
| 90 |
|
---|
| 91 | /* E_GO(dot) - Move to specified location. */
|
---|
| 92 | /* These "GO" routines all move to the location specified, returning
|
---|
| 93 | * 0 if successful and -1 on error. "cur_dot" is never changed,
|
---|
| 94 | * with the exception of e_gosetcur.
|
---|
| 95 | * Note that other "GO" routines (eg E_GONL) will return 1 if successful
|
---|
| 96 | * and 0 if stopped by EOF.
|
---|
| 97 | */
|
---|
| 98 |
|
---|
| 99 | e_gocur() { return(e_go(cur_dot)); } /* Move to cur_dot */
|
---|
| 100 | e_gobob() { return(e_go((chroff) 0)); } /* Move to Beg Of Buffer */
|
---|
| 101 | e_goeob() { return(sb_seek(CURSBB,(chroff)0,2)); } /* Move to End Of Buffer */
|
---|
| 102 | e_go(dot) /* Move to specified location. */
|
---|
| 103 | chroff dot;
|
---|
| 104 | { return(sb_seek(CURSBB,dot,0));
|
---|
| 105 | }
|
---|
| 106 | e_igoff(ioff) /* Move (int) N chars forward/backward */
|
---|
| 107 | int ioff;
|
---|
| 108 | { return(sb_seek(CURSBB,(chroff)ioff,1));
|
---|
| 109 | }
|
---|
| 110 |
|
---|
| 111 | e_goff(off) /* Move (full) N chars forward/backward */
|
---|
| 112 | chroff off;
|
---|
| 113 | { return(sb_seek(CURSBB,off,1));
|
---|
| 114 | }
|
---|
| 115 |
|
---|
| 116 | int ex_gonl(), ex_gopl(), ex_gobol(), ex_goeol();
|
---|
| 117 |
|
---|
| 118 | e_gobol() { return(ex_gobol(CURSBB)); } /* Move to beg of this line */
|
---|
| 119 | e_goeol() { return(ex_goeol(CURSBB)); } /* Move to end of this line */
|
---|
| 120 | e_gonl() { return(ex_gonl(CURSBB)); } /* Move to beg of next line */
|
---|
| 121 | e_gopl() { return(ex_gopl(CURSBB)); } /* Move to beg of prev line */
|
---|
| 122 |
|
---|
| 123 |
|
---|
| 124 | /* E_DOT() - Return current value of dot. */
|
---|
| 125 | chroff e_dot() { return(sb_tell(CURSBB)); } /* Current pos */
|
---|
| 126 | chroff e_nldot() { return(e_alldot(CURSBB,ex_gonl)); } /* Beg of next line */
|
---|
| 127 | chroff e_pldot() { return(e_alldot(CURSBB,ex_gopl)); } /* Beg of prev line */
|
---|
| 128 | chroff e_boldot(){ return(e_alldot(CURSBB,ex_gobol));} /* Beg of this line */
|
---|
| 129 | chroff e_eoldot(){ return(e_alldot(CURSBB,ex_goeol));} /* End of this line */
|
---|
| 130 |
|
---|
| 131 | chroff
|
---|
| 132 | e_alldot(sbp,rtn) /* Auxiliary for above stuff */
|
---|
| 133 | SBBUF *sbp;
|
---|
| 134 | int (*rtn)();
|
---|
| 135 | { return(ex_alldot(sbp,rtn,e_dot()));
|
---|
| 136 | }
|
---|
| 137 |
|
---|
| 138 | /* E_BLEN - Return length of current buffer */
|
---|
| 139 | chroff
|
---|
| 140 | e_blen() { return(ex_blen(CURSBB)); }
|
---|
| 141 | |
---|
| 142 |
|
---|
| 143 | /* EX_ routines - similar to E_ but take a buffer/sbbuf argument
|
---|
| 144 | * instead of assuming current buffer.
|
---|
| 145 | */
|
---|
| 146 |
|
---|
| 147 | /* EX_RESET - Reset a given buffer */
|
---|
| 148 | ex_reset(b)
|
---|
| 149 | struct buffer *b;
|
---|
| 150 | { sbs_del(sb_close((SBBUF *)b));
|
---|
| 151 | sb_open((SBBUF *)b,(SBSTR *)0);
|
---|
| 152 | }
|
---|
| 153 |
|
---|
| 154 | ex_go(sbp,loc) /* Move to given dot in specified sbbuf */
|
---|
| 155 | chroff loc;
|
---|
| 156 | SBBUF *sbp;
|
---|
| 157 | { return(sb_seek(sbp,loc,0));
|
---|
| 158 | }
|
---|
| 159 |
|
---|
| 160 | chroff
|
---|
| 161 | ex_dot(sbp) /* Return current position in specified sbbuf */
|
---|
| 162 | SBBUF *sbp;
|
---|
| 163 | {
|
---|
| 164 | return(sb_tell(sbp));
|
---|
| 165 | }
|
---|
| 166 |
|
---|
| 167 |
|
---|
| 168 | chroff
|
---|
| 169 | ex_boldot(sbp,dot) /* Return dot for BOL of specified sbbuf */
|
---|
| 170 | SBBUF *sbp;
|
---|
| 171 | chroff dot;
|
---|
| 172 | { return(ex_alldot(sbp,ex_gobol,dot));
|
---|
| 173 | }
|
---|
| 174 |
|
---|
| 175 | chroff
|
---|
| 176 | ex_alldot(sbp,rtn,dot) /* Auxiliary for some e_ stuff */
|
---|
| 177 | SBBUF *sbp;
|
---|
| 178 | int (*rtn)();
|
---|
| 179 | chroff dot;
|
---|
| 180 | { register SBBUF *sb;
|
---|
| 181 | chroff savloc, retloc;
|
---|
| 182 |
|
---|
| 183 | savloc = sb_tell(sb = sbp);
|
---|
| 184 | sb_seek(sb,dot,0);
|
---|
| 185 | (*rtn)(sb);
|
---|
| 186 | retloc = sb_tell(sb);
|
---|
| 187 | sb_seek(sb,savloc,0);
|
---|
| 188 | return(retloc);
|
---|
| 189 | }
|
---|
| 190 |
|
---|
| 191 | /* GO (forward) to Next Line of specified sbbuf - returns 0 if stopped at EOF
|
---|
| 192 | * before an EOL is seen. */
|
---|
| 193 | ex_gonl(sbp)
|
---|
| 194 | SBBUF *sbp;
|
---|
| 195 | { register SBBUF *sb;
|
---|
| 196 | register int c;
|
---|
| 197 | sb = sbp;
|
---|
| 198 | #if FX_EOLMODE
|
---|
| 199 | if(eolcrlf(sb))
|
---|
| 200 | while((c = sb_getc(sb)) != EOF)
|
---|
| 201 | { if(c == LF) /* Possible EOL? */
|
---|
| 202 | { sb_backc(sb); /* See if prev char was CR */
|
---|
| 203 | if((c = sb_rgetc(sb)) != EOF)
|
---|
| 204 | sb_getc(sb);
|
---|
| 205 | sb_getc(sb); /* Must restore position */
|
---|
| 206 | if(c == CR) /* Now test for CR */
|
---|
| 207 | return(1); /* Won, CR-LF! */
|
---|
| 208 | }
|
---|
| 209 | }
|
---|
| 210 | else
|
---|
| 211 | #endif
|
---|
| 212 | while((c = sb_getc(sb)) != EOF)
|
---|
| 213 | if(c == LF)
|
---|
| 214 | return(1);
|
---|
| 215 | return(0);
|
---|
| 216 | }
|
---|
| 217 |
|
---|
| 218 | /* GO (forward) to End Of Line of specified sbbuf - returns 0 if stopped at
|
---|
| 219 | * EOF before an EOL is seen. */
|
---|
| 220 | ex_goeol(sbp)
|
---|
| 221 | SBBUF *sbp;
|
---|
| 222 | { register SBBUF *sb;
|
---|
| 223 | register int c;
|
---|
| 224 | sb = sbp;
|
---|
| 225 | #if FX_EOLMODE
|
---|
| 226 | if(eolcrlf(sb))
|
---|
| 227 | while((c = sb_getc(sb)) != EOF)
|
---|
| 228 | { if(c == LF) /* Possible EOL? */
|
---|
| 229 | { sb_backc(sb); /* See if prev char was CR */
|
---|
| 230 | if((c = sb_rgetc(sb)) == CR)
|
---|
| 231 | return(1); /* Won, CR-LF! */
|
---|
| 232 | if(c != EOF) /* No, must restore position */
|
---|
| 233 | sb_getc(sb); /* Skip over */
|
---|
| 234 | sb_getc(sb); /* Skip over LF */
|
---|
| 235 | }
|
---|
| 236 | }
|
---|
| 237 | else
|
---|
| 238 | #endif
|
---|
| 239 | while((c = sb_getc(sb)) != EOF)
|
---|
| 240 | if(c == LF)
|
---|
| 241 | { sb_backc(sb);
|
---|
| 242 | return(1);
|
---|
| 243 | }
|
---|
| 244 | return(0);
|
---|
| 245 | }
|
---|
| 246 |
|
---|
| 247 | /* GO (backward) to Beg Of Line of specified sbbuf - returns 0 if stopped
|
---|
| 248 | * at EOF
|
---|
| 249 | */
|
---|
| 250 | ex_gobol(sbp)
|
---|
| 251 | SBBUF *sbp;
|
---|
| 252 | { register SBBUF *sb;
|
---|
| 253 | register int c;
|
---|
| 254 | sb = sbp;
|
---|
| 255 | #if FX_EOLMODE
|
---|
| 256 | if(eolcrlf(sb))
|
---|
| 257 | while((c = sb_rgetc(sb)) != EOF)
|
---|
| 258 | { if(c == LF) /* Possible EOL? */
|
---|
| 259 | { if((c = sb_rgetc(sb)) == CR)
|
---|
| 260 | { sb_getc(sb); /* Won, CR-LF! */
|
---|
| 261 | sb_getc(sb); /* Move back */
|
---|
| 262 | return(1);
|
---|
| 263 | }
|
---|
| 264 | if(c != EOF) /* No, must restore position */
|
---|
| 265 | sb_getc(sb); /* Undo the rgetc */
|
---|
| 266 | }
|
---|
| 267 | }
|
---|
| 268 | else
|
---|
| 269 | #endif
|
---|
| 270 | while((c = sb_rgetc(sb)) != EOF)
|
---|
| 271 | if(c == LF)
|
---|
| 272 | { sb_getc(sb);
|
---|
| 273 | return(1);
|
---|
| 274 | }
|
---|
| 275 | return(0);
|
---|
| 276 | }
|
---|
| 277 |
|
---|
| 278 | /* GO (backward) to Previous Line of specified sbbuf - returns 0 if stopped
|
---|
| 279 | * at EOF before an EOL is seen (i.e. if already on 1st line of buffer)
|
---|
| 280 | */
|
---|
| 281 | ex_gopl(sbp)
|
---|
| 282 | SBBUF *sbp;
|
---|
| 283 | { register SBBUF *sb;
|
---|
| 284 | register int c;
|
---|
| 285 | sb = sbp;
|
---|
| 286 | #if FX_EOLMODE
|
---|
| 287 | if(eolcrlf(sb))
|
---|
| 288 | while((c = sb_rgetc(sb)) != EOF)
|
---|
| 289 | { if(c == LF) /* Possible EOL? */
|
---|
| 290 | { if((c = sb_rgetc(sb)) == CR)
|
---|
| 291 | { ex_gobol(sb);
|
---|
| 292 | return(1); /* Won! */
|
---|
| 293 | }
|
---|
| 294 | if(c != EOF) /* No, must restore position */
|
---|
| 295 | sb_getc(sb); /* Undo the rgetc */
|
---|
| 296 | }
|
---|
| 297 | }
|
---|
| 298 | else
|
---|
| 299 | #endif
|
---|
| 300 | while((c = sb_rgetc(sb)) != EOF)
|
---|
| 301 | if(c == LF)
|
---|
| 302 | { ex_gobol(sb);
|
---|
| 303 | return(1); /* Won! */
|
---|
| 304 | }
|
---|
| 305 | return(0);
|
---|
| 306 | }
|
---|
| 307 |
|
---|
| 308 |
|
---|
| 309 | chroff
|
---|
| 310 | ex_blen(sbp) /* Return length of specified sbbuf */
|
---|
| 311 | SBBUF *sbp;
|
---|
| 312 | {
|
---|
| 313 | return(sb_tell(sbp)+sb_ztell(sbp));
|
---|
| 314 | }
|
---|
| 315 | |
---|
| 316 |
|
---|
| 317 | /* Miscellaneous stuff */
|
---|
| 318 |
|
---|
| 319 | /* E_GOFWSP() - Forward over whitespace */
|
---|
| 320 | e_gofwsp()
|
---|
| 321 | { register int c;
|
---|
| 322 | while((c = e_getc()) == SP || c == TAB);
|
---|
| 323 | if(c != EOF) e_backc();
|
---|
| 324 | }
|
---|
| 325 |
|
---|
| 326 | /* E_GOBWSP() - Backward over whitespace */
|
---|
| 327 | e_gobwsp()
|
---|
| 328 | { register int c;
|
---|
| 329 | while((c = e_rgetc()) == SP || c == TAB);
|
---|
| 330 | if(c != EOF) e_getc();
|
---|
| 331 | }
|
---|
| 332 |
|
---|
| 333 |
|
---|
| 334 | /* E_GOLINE(n) - Goes N lines forward (or backward).
|
---|
| 335 | ** If N == 0, goes to beginning of current line.
|
---|
| 336 | ** Returns 0 if hit EOF.
|
---|
| 337 | */
|
---|
| 338 | e_goline(i)
|
---|
| 339 | register int i;
|
---|
| 340 | {
|
---|
| 341 | if(i > 0)
|
---|
| 342 | { do { if(!e_gonl()) return(0); }
|
---|
| 343 | while(--i);
|
---|
| 344 | }
|
---|
| 345 | else if(i < 0)
|
---|
| 346 | { i = -i;
|
---|
| 347 | do { if(!e_gopl()) return(0); }
|
---|
| 348 | while(--i);
|
---|
| 349 | }
|
---|
| 350 | else e_gobol(); /* arg of 0 */
|
---|
| 351 | return 1;
|
---|
| 352 | }
|
---|
| 353 |
|
---|
| 354 | /* E_LBLANKP() - Returns true if all characters in rest of line are blank.
|
---|
| 355 | * Moves to beginning of next line as side effect, unless fails.
|
---|
| 356 | */
|
---|
| 357 | e_lblankp()
|
---|
| 358 | { register int c;
|
---|
| 359 | for(;;) switch(e_getc())
|
---|
| 360 | {
|
---|
| 361 | case SP:
|
---|
| 362 | case TAB:
|
---|
| 363 | continue;
|
---|
| 364 | case LF: /* Normally drop thru to return 1 as for EOF */
|
---|
| 365 | #if FX_EOLMODE
|
---|
| 366 | if(eolcrlf(cur_buf))
|
---|
| 367 | { e_rgetc();
|
---|
| 368 | if((c = e_rgetc()) != EOF) /* Get prev char */
|
---|
| 369 | e_getc();
|
---|
| 370 | e_getc();
|
---|
| 371 | if(c != CR) /* Now examine */
|
---|
| 372 | continue; /* Not CR-LF, go on */
|
---|
| 373 | } /* Else drop thru to return win */
|
---|
| 374 | #endif
|
---|
| 375 | case EOF:
|
---|
| 376 | return(1);
|
---|
| 377 | default:
|
---|
| 378 | return(0);
|
---|
| 379 | }
|
---|
| 380 | /* Never drops out */
|
---|
| 381 | }
|
---|
| 382 | |
---|
| 383 |
|
---|
| 384 |
|
---|
| 385 | e_insn(ch, cnt)
|
---|
| 386 | int ch;
|
---|
| 387 | int cnt;
|
---|
| 388 | { register int i;
|
---|
| 389 | if((i = cnt) > 0)
|
---|
| 390 | do { e_putc(ch);
|
---|
| 391 | } while(--i);
|
---|
| 392 | }
|
---|
| 393 |
|
---|
| 394 | e_sputz(acp)
|
---|
| 395 | char *acp;
|
---|
| 396 | { register SBBUF *sb;
|
---|
| 397 | register char *cp;
|
---|
| 398 | register int c;
|
---|
| 399 | if(cp = acp)
|
---|
| 400 | { sb = CURSBB;
|
---|
| 401 | while(c = *cp++)
|
---|
| 402 | sb_putc(sb,c);
|
---|
| 403 | }
|
---|
| 404 | }
|
---|
| 405 |
|
---|
| 406 | /* BOLEQ - Returns TRUE if 2 dots are on the same line
|
---|
| 407 | * (i.e. have the same Beg-Of-Line)
|
---|
| 408 | */
|
---|
| 409 | boleq(dot1,dot2)
|
---|
| 410 | chroff dot1,dot2;
|
---|
| 411 | { return( (ex_boldot(CURSBB,dot1) == ex_boldot(CURSBB,dot2)));
|
---|
| 412 | }
|
---|
| 413 |
|
---|
| 414 |
|
---|
| 415 | char *
|
---|
| 416 | dottoa(str,val)
|
---|
| 417 | char *str;
|
---|
| 418 | chroff val;
|
---|
| 419 | { register char *s;
|
---|
| 420 |
|
---|
| 421 | s = str;
|
---|
| 422 | if(val < 0)
|
---|
| 423 | { *s++ = '-';
|
---|
| 424 | val = -val;
|
---|
| 425 | }
|
---|
| 426 | if(val >= 10)
|
---|
| 427 | s = dottoa(s, val/10);
|
---|
| 428 | *s++ = '0' + (int)(val%10);
|
---|
| 429 | *s = 0;
|
---|
| 430 | return(s);
|
---|
| 431 | }
|
---|
| 432 |
|
---|
| 433 | |
---|
| 434 |
|
---|
| 435 | /* Paragraph utilities */
|
---|
| 436 |
|
---|
| 437 | #if FX_FPARA || FX_BPARA || FX_MRKPARA || FX_FILLPARA
|
---|
| 438 |
|
---|
| 439 | #if FX_SFPREF
|
---|
| 440 | extern char *fill_prefix; /* Defined in eefill.c for now */
|
---|
| 441 | extern int fill_plen; /* Ditto */
|
---|
| 442 | #endif /*FX_SFPREF*/
|
---|
| 443 |
|
---|
| 444 | #if ICONOGRAPHICS
|
---|
| 445 | int para_mode = PARABLOCK; /* eexcmd.c only other file that refs this */
|
---|
| 446 | #endif /*ICONOGRAPHICS*/
|
---|
| 447 |
|
---|
| 448 |
|
---|
| 449 | /* Go to beginning of paragraph */
|
---|
| 450 | e_gobpa()
|
---|
| 451 | { register int c;
|
---|
| 452 | chroff savdot;
|
---|
| 453 |
|
---|
| 454 | savdot = e_dot();
|
---|
| 455 | e_bwsp();
|
---|
| 456 | while((c = e_rgetc()) != EOF)
|
---|
| 457 | if(c == LF) /* Went past line? */
|
---|
| 458 | { e_getc(); /* Back up and check */
|
---|
| 459 | #if FX_SFPREF
|
---|
| 460 | if(fill_plen)
|
---|
| 461 | if(tstfillp(fill_plen))
|
---|
| 462 | { e_igoff(-(fill_plen+1));
|
---|
| 463 | continue;
|
---|
| 464 | }
|
---|
| 465 | else break;
|
---|
| 466 | #endif /*FX_SFPREF*/
|
---|
| 467 | #if ICONOGRAPHICS
|
---|
| 468 | c = e_peekc ();
|
---|
| 469 |
|
---|
| 470 | if (para_mode == PARABLOCK)
|
---|
| 471 | if (c == LF)
|
---|
| 472 | break;
|
---|
| 473 |
|
---|
| 474 | if (para_mode == PARALINE)
|
---|
| 475 | if (c_wsp (c))
|
---|
| 476 | break;
|
---|
| 477 | #else
|
---|
| 478 | if(c_pwsp(e_peekc())) /* Check 1st chr for wsp */
|
---|
| 479 | break; /* If wsp, done */
|
---|
| 480 | #endif /*ICONOGRAPHICS*/
|
---|
| 481 | e_rgetc(); /* Nope, continue */
|
---|
| 482 | }
|
---|
| 483 | if((c = e_peekc()) == '.' || c == '-')
|
---|
| 484 | { e_gonl();
|
---|
| 485 | if(e_dot() >= savdot)
|
---|
| 486 | e_gopl();
|
---|
| 487 | }
|
---|
| 488 | }
|
---|
| 489 |
|
---|
| 490 | /* Go to end of paragraph */
|
---|
| 491 | e_goepa()
|
---|
| 492 | { register int c;
|
---|
| 493 |
|
---|
| 494 | e_gobol(); /* First go to beg of cur line */
|
---|
| 495 | e_fwsp();
|
---|
| 496 | while((c = e_getc()) != EOF)
|
---|
| 497 | if (c == LF)
|
---|
| 498 | {
|
---|
| 499 | #if FX_SFPREF
|
---|
| 500 | if(fill_plen) /* If Fill Prefix is defined */
|
---|
| 501 | if(tstfillp(fill_plen)) /* then must start with it */
|
---|
| 502 | continue;
|
---|
| 503 | else break; /* or else we're done */
|
---|
| 504 | #endif /*FX_SFPREF*/
|
---|
| 505 | #if ICONOGRAPHICS
|
---|
| 506 | if (para_mode == PARABLOCK)
|
---|
| 507 | if (e_peekc () == LF)
|
---|
| 508 | break;
|
---|
| 509 |
|
---|
| 510 | if (para_mode == PARALINE)
|
---|
| 511 | if (c_wsp (e_peekc ()))
|
---|
| 512 | break;
|
---|
| 513 | #else
|
---|
| 514 | if(c_pwsp(e_peekc()))
|
---|
| 515 | break;
|
---|
| 516 | #endif /*-ICONOGRAPHICS*/
|
---|
| 517 | }
|
---|
| 518 | }
|
---|
| 519 |
|
---|
| 520 | exp_do(rpos, rneg)
|
---|
| 521 | int (*rpos)(), (*rneg)();
|
---|
| 522 | { register int e;
|
---|
| 523 | register int (*rtn)();
|
---|
| 524 |
|
---|
| 525 | if((e = exp) == 0)
|
---|
| 526 | return;
|
---|
| 527 | rtn = rpos;
|
---|
| 528 | if(e < 0)
|
---|
| 529 | { rtn = rneg;
|
---|
| 530 | e = -e;
|
---|
| 531 | }
|
---|
| 532 | do { (*rtn)();
|
---|
| 533 | } while(--e);
|
---|
| 534 | }
|
---|
| 535 |
|
---|
| 536 |
|
---|
| 537 | e_fwsp()
|
---|
| 538 | { register int c;
|
---|
| 539 | while(c_wsp(c = e_getc()));
|
---|
| 540 | if(c != EOF) e_backc();
|
---|
| 541 | }
|
---|
| 542 | e_bwsp()
|
---|
| 543 | { register int c;
|
---|
| 544 | while(c_wsp(c = e_rgetc()));
|
---|
| 545 | if(c != EOF) e_getc();
|
---|
| 546 | }
|
---|
| 547 |
|
---|
| 548 |
|
---|
| 549 | c_wsp(ch)
|
---|
| 550 | int ch;
|
---|
| 551 | { register int c;
|
---|
| 552 | c = ch;
|
---|
| 553 | if(c == SP || c == TAB || c == LF || c == FF)
|
---|
| 554 | return(1);
|
---|
| 555 | return(0);
|
---|
| 556 | }
|
---|
| 557 | c_pwsp(ch)
|
---|
| 558 | int ch;
|
---|
| 559 | { register int c;
|
---|
| 560 | c = ch;
|
---|
| 561 | if(c == '.' || c == '-')
|
---|
| 562 | return(1);
|
---|
| 563 | return(c_wsp(c));
|
---|
| 564 | }
|
---|
| 565 |
|
---|
| 566 | #endif /* FX_FPARA || FX_BPARA || FX_MRKPARA || FX_FILLPARA */
|
---|
| 567 | |
---|
| 568 |
|
---|
| 569 | /* Word function auxiliaries */
|
---|
| 570 |
|
---|
| 571 | /* Returns true if this character is a delimiter. */
|
---|
| 572 | delimp(c)
|
---|
| 573 | int c;
|
---|
| 574 | { static int delim_tab[] =
|
---|
| 575 | {
|
---|
| 576 | 0177777, 0177777, /* All controls */
|
---|
| 577 | 0177777, 0176000, /* All punct but 0-9 */
|
---|
| 578 | 0000001, 0074000, /* All punct but A-Z and _ */
|
---|
| 579 | 0000001, 0174000 /* All punct but a-z */
|
---|
| 580 | };
|
---|
| 581 | return (delim_tab[c >> 4] & (1 << (c & 017)));
|
---|
| 582 | }
|
---|
| 583 |
|
---|
| 584 | e_wding(adot,n)
|
---|
| 585 | register chroff *adot;
|
---|
| 586 | int n;
|
---|
| 587 | { chroff savdot;
|
---|
| 588 | savdot = e_dot();
|
---|
| 589 | e_gowd(n);
|
---|
| 590 | *adot = e_dot();
|
---|
| 591 | e_go(savdot);
|
---|
| 592 | if(*adot == savdot)
|
---|
| 593 | { ring_bell();
|
---|
| 594 | return(0);
|
---|
| 595 | }
|
---|
| 596 | return(1);
|
---|
| 597 | }
|
---|
| 598 | chroff
|
---|
| 599 | e_wdot(dot,n)
|
---|
| 600 | chroff dot;
|
---|
| 601 | int n;
|
---|
| 602 | { chroff savdot, retdot;
|
---|
| 603 | savdot = e_dot();
|
---|
| 604 | e_go(dot);
|
---|
| 605 | e_gowd(n);
|
---|
| 606 | retdot = e_dot();
|
---|
| 607 | e_go(savdot);
|
---|
| 608 | return(retdot);
|
---|
| 609 | }
|
---|
| 610 | e_gowd(n)
|
---|
| 611 | int n;
|
---|
| 612 | { register int (*gch)(), c, cnt;
|
---|
| 613 | int e_getc(), e_rgetc();
|
---|
| 614 | chroff ret_dot;
|
---|
| 615 |
|
---|
| 616 | if((cnt = n) == 0)
|
---|
| 617 | return;
|
---|
| 618 | if(cnt > 0)
|
---|
| 619 | gch = e_getc; /* Forward routine */
|
---|
| 620 | else
|
---|
| 621 | { gch = e_rgetc; /* Backward routine */
|
---|
| 622 | cnt = -cnt;
|
---|
| 623 | }
|
---|
| 624 | do
|
---|
| 625 | { ret_dot = e_dot(); /* Remember dot for last word found */
|
---|
| 626 | while((c = (*gch)()) != EOF && delimp(c));
|
---|
| 627 | if(c == EOF)
|
---|
| 628 | { e_go(ret_dot); /* Use last word found */
|
---|
| 629 | break;
|
---|
| 630 | }
|
---|
| 631 | while((c = (*gch)()) != EOF && !delimp(c));
|
---|
| 632 | if(c == EOF)
|
---|
| 633 | break;
|
---|
| 634 | if(n < 0) e_getc(); else e_backc();
|
---|
| 635 | } while(--cnt);
|
---|
| 636 | }
|
---|
| 637 | |
---|
| 638 |
|
---|
| 639 | /* Searching */
|
---|
| 640 |
|
---|
| 641 | e_search(mstr,mlen,backwards)
|
---|
| 642 | char *mstr;
|
---|
| 643 | int mlen;
|
---|
| 644 | int backwards;
|
---|
| 645 | { register SBBUF *sb;
|
---|
| 646 | register char *cp;
|
---|
| 647 | register int c;
|
---|
| 648 | char *savcp;
|
---|
| 649 | int cnt, scnt;
|
---|
| 650 | #if IMAGEN
|
---|
| 651 | register int c1;
|
---|
| 652 | register int caseless = (cur_buf->b_flags & B_TEXTMODE);
|
---|
| 653 | #endif /*IMAGEN*/
|
---|
| 654 |
|
---|
| 655 | sb = (SBBUF *) cur_buf;
|
---|
| 656 | if (!backwards)
|
---|
| 657 | { /* Search forwards */
|
---|
| 658 | sfwd: cp = mstr;
|
---|
| 659 | while((c = sb_getc(sb)) != EOF)
|
---|
| 660 | {
|
---|
| 661 | #if IMAGEN
|
---|
| 662 | if((!caseless && c != *cp) ||
|
---|
| 663 | (caseless && upcase(c) != upcase(*cp))) continue;
|
---|
| 664 | #else
|
---|
| 665 | if(c != *cp) continue;
|
---|
| 666 | #endif /*-IMAGEN*/
|
---|
| 667 | cp++;
|
---|
| 668 | cnt = mlen;
|
---|
| 669 | while(--cnt > 0)
|
---|
| 670 | {
|
---|
| 671 | #if IMAGEN
|
---|
| 672 | c1 = *cp++;
|
---|
| 673 | c = e_getc();
|
---|
| 674 | if ((!caseless && c1 != c) ||
|
---|
| 675 | (caseless && upcase(c1) != upcase(c)))
|
---|
| 676 | #else
|
---|
| 677 | if(*cp++ != (c = e_getc()))
|
---|
| 678 | #endif /*-IMAGEN*/
|
---|
| 679 | { if(c == EOF) return(0);
|
---|
| 680 | sb_seek(sb,(chroff)(cnt-mlen),1);
|
---|
| 681 | goto sfwd;
|
---|
| 682 | }
|
---|
| 683 | }
|
---|
| 684 | return(1);
|
---|
| 685 | }
|
---|
| 686 | }
|
---|
| 687 | else
|
---|
| 688 | { /* Search backwards */
|
---|
| 689 | scnt = mlen - 1;
|
---|
| 690 | savcp = mstr + scnt; /* Point to end of string */
|
---|
| 691 |
|
---|
| 692 | sbck: cp = savcp;
|
---|
| 693 | while((c = sb_rgetc(sb)) != EOF)
|
---|
| 694 | {
|
---|
| 695 | #if IMAGEN
|
---|
| 696 | if((!caseless && c != *cp) ||
|
---|
| 697 | (caseless && upcase(c) != upcase(*cp))) continue;
|
---|
| 698 | #else
|
---|
| 699 | if(c != *cp) continue;
|
---|
| 700 | #endif /*-IMAGEN*/
|
---|
| 701 | cp--;
|
---|
| 702 | if((cnt = scnt) == 0) return(1);
|
---|
| 703 | do
|
---|
| 704 | {
|
---|
| 705 | #if IMAGEN
|
---|
| 706 | c1 = *cp--;
|
---|
| 707 | c = e_rgetc();
|
---|
| 708 | if ((!caseless && c1 != c) ||
|
---|
| 709 | (caseless && upcase(c1) != upcase(c)))
|
---|
| 710 | #else
|
---|
| 711 | if(*cp-- != (c = e_rgetc()))
|
---|
| 712 | #endif /*-IMAGEN*/
|
---|
| 713 | { if(c == EOF) return(0);
|
---|
| 714 | sb_seek(sb,(chroff)(mlen-cnt),1);
|
---|
| 715 | goto sbck;
|
---|
| 716 | }
|
---|
| 717 | }
|
---|
| 718 | while(--cnt);
|
---|
| 719 | return(1);
|
---|
| 720 | }
|
---|
| 721 | }
|
---|
| 722 | return(0); /* Failed */
|
---|
| 723 | }
|
---|