home *** CD-ROM | disk | FTP | other *** search
- /* move3.c */
-
- /* Author:
- * Steve Kirkendall
- * 14407 SW Teal Blvd. #C
- * Beaverton, OR 97005
- * kirkenda@cs.pdx.edu
- */
-
-
- /* This file contains movement functions that perform character searches */
-
- #include "config.h"
- #include "vi.h"
-
- #ifndef NO_CHARSEARCH
- static MARK (*prevfwdfn)(); /* function to search in same direction */
- static MARK (*prevrevfn)(); /* function to search in opposite direction */
- static char prev_key; /* sought cvhar from previous [fFtT] */
-
- MARK m__ch(m, cnt, cmd)
- MARK m; /* current position */
- long cnt;
- char cmd; /* command: either ',' or ';' */
- {
- MARK (*tmp)();
-
- if (!prevfwdfn)
- {
- msg("No previous f, F, t, or T command");
- return MARK_UNSET;
- }
-
- if (cmd == ',')
- {
- m = (*prevrevfn)(m, cnt, prev_key);
-
- /* Oops! we didn't want to change the prev*fn vars! */
- tmp = prevfwdfn;
- prevfwdfn = prevrevfn;
- prevrevfn = tmp;
-
- return m;
- }
- else
- {
- return (*prevfwdfn)(m, cnt, prev_key);
- }
- }
-
- /* move forward within this line to next occurrence of key */
- MARK m_fch(m, cnt, key)
- MARK m; /* where to search from */
- long cnt;
- char key; /* what to search for */
- {
- REG char *text;
-
- DEFAULT(1);
-
- prevfwdfn = m_fch;
- prevrevfn = m_Fch;
- prev_key = key;
-
- pfetch(markline(m));
- text = ptext + markidx(m);
- while (cnt-- > 0)
- {
- do
- {
- m++;
- text++;
- } while (*text && *text != key);
- }
- if (!*text)
- {
- return MARK_UNSET;
- }
- return m;
- }
-
- /* move backward within this line to previous occurrence of key */
- MARK m_Fch(m, cnt, key)
- MARK m; /* where to search from */
- long cnt;
- char key; /* what to search for */
- {
- REG char *text;
-
- DEFAULT(1);
-
- prevfwdfn = m_Fch;
- prevrevfn = m_fch;
- prev_key = key;
-
- pfetch(markline(m));
- text = ptext + markidx(m);
- while (cnt-- > 0)
- {
- do
- {
- m--;
- text--;
- } while (text >= ptext && *text != key);
- }
- if (text < ptext)
- {
- return MARK_UNSET;
- }
- return m;
- }
-
- /* move forward within this line almost to next occurrence of key */
- MARK m_tch(m, cnt, key)
- MARK m; /* where to search from */
- long cnt;
- char key; /* what to search for */
- {
- /* skip the adjacent char */
- pfetch(markline(m));
- if (plen <= markidx(m))
- {
- return MARK_UNSET;
- }
- m++;
-
- m = m_fch(m, cnt, key);
- if (m == MARK_UNSET)
- {
- return MARK_UNSET;
- }
-
- prevfwdfn = m_tch;
- prevrevfn = m_Tch;
-
- return m - 1;
- }
-
- /* move backward within this line almost to previous occurrence of key */
- MARK m_Tch(m, cnt, key)
- MARK m; /* where to search from */
- long cnt;
- char key; /* what to search for */
- {
- /* skip the adjacent char */
- if (markidx(m) == 0)
- {
- return MARK_UNSET;
- }
- m--;
-
- m = m_Fch(m, cnt, key);
- if (m == MARK_UNSET)
- {
- return MARK_UNSET;
- }
-
- prevfwdfn = m_Tch;
- prevrevfn = m_tch;
-
- return m + 1;
- }
- #endif
-