home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume7 / rvi / part2 / rv_forback.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-11-30  |  1.4 KB  |  102 lines

  1. #include "rv.h"
  2.  
  3. static INT direction = 1;
  4. static char search_char = ' ';
  5. static boolean incl_char = TRUE;
  6.  
  7. boolean
  8. forward_back(c, cmd_count)
  9. /*
  10.  * Scan forward and backward in line for character
  11.  */
  12. INT c;
  13. INT cmd_count;
  14. {
  15.     register struct sc_screen *sc;
  16.     register char *s;
  17.     register INT i;
  18.  
  19.     sc = &screen;
  20.     s = sc->sc_curline->li_text;
  21.  
  22.     switch (c) {
  23. case 'f':
  24.     /*
  25.      * Search forward to char
  26.      */
  27.     search_char = getch();
  28.     direction = 1;
  29.     incl_char = TRUE;
  30.     break;
  31.  
  32. case 'F':
  33.     /*
  34.      * Search backward to char
  35.      */
  36.     search_char = getch();
  37.     direction = -1;
  38.     incl_char = TRUE;
  39.     break;
  40.  
  41. case 't':
  42.     /*
  43.      * Search forward upto char
  44.      */
  45.     search_char = getch();
  46.     direction = 1;
  47.     incl_char = FALSE;
  48.     break;
  49.  
  50. case 'T':
  51.     /*
  52.      * Search backward upto char
  53.      */
  54.     search_char = getch();
  55.     direction = -1;
  56.     incl_char = FALSE;
  57.     break;
  58.  
  59. case ';':
  60.     /*
  61.      * Repeat last
  62.      */
  63.     break;
  64.  
  65. case ',':
  66.     /*
  67.      * Repeat last, opposite direction
  68.      */
  69.     direction = (direction >= 0 ? -1 : 1);
  70.     break;
  71.  
  72. default:
  73.     return FALSE;
  74.  
  75.     } /* End switch */
  76.  
  77.  
  78.     i = sc->sc_column;
  79.     sc->sc_validcol = TRUE;
  80.     for (; cmd_count > 0; --cmd_count) {
  81.         i += direction;
  82.         while (s[i] != search_char) {
  83.             if (i < 0 || s[i] == '\0')
  84.                 return FALSE;
  85.             i += direction;
  86.         }
  87.     }
  88.  
  89.     if (direction >= 0) {
  90.         sc->sc_lastcol = i;
  91.         if (!incl_char)
  92.             sc->sc_lastcol--;
  93.     } else {
  94.         sc->sc_lastcol--;
  95.         sc->sc_firstcol = i;
  96.         if (!incl_char)
  97.             sc->sc_firstcol++;
  98.     }
  99.  
  100.     return (sc->sc_firstcol <= sc->sc_lastcol);
  101. }
  102.