|
|
1.1 root 1: /* move3.c */
2:
3: /* Author:
4: * Steve Kirkendall
5: * 14407 SW Teal Blvd. #C
6: * Beaverton, OR 97005
7: * [email protected]
8: */
9:
10:
11: /* This file contains movement functions that perform character searches */
12:
13: #include "config.h"
14: #include "vi.h"
15:
16: #ifndef NO_CHARSEARCH
17: static MARK (*prevfwdfn)(); /* function to search in same direction */
18: static MARK (*prevrevfn)(); /* function to search in opposite direction */
19: static char prev_key; /* sought cvhar from previous [fFtT] */
20:
21: MARK m__ch(m, cnt, cmd)
22: MARK m; /* current position */
23: long cnt;
24: int cmd; /* command: either ',' or ';' */
25: {
26: MARK (*tmp)();
27:
28: if (!prevfwdfn)
29: {
30: msg("No previous f, F, t, or T command");
31: return MARK_UNSET;
32: }
33:
34: if (cmd == ',')
35: {
36: m = (*prevrevfn)(m, cnt, prev_key);
37:
38: /* Oops! we didn't want to change the prev*fn vars! */
39: tmp = prevfwdfn;
40: prevfwdfn = prevrevfn;
41: prevrevfn = tmp;
42:
43: return m;
44: }
45: else
46: {
47: return (*prevfwdfn)(m, cnt, prev_key);
48: }
49: }
50:
51: /* move forward within this line to next occurrence of key */
52: MARK m_fch(m, cnt, key)
53: MARK m; /* where to search from */
54: long cnt;
55: int key; /* what to search for */
56: {
57: REG char *text;
58:
59: DEFAULT(1);
60:
61: prevfwdfn = m_fch;
62: prevrevfn = m_Fch;
63: prev_key = key;
64:
65: pfetch(markline(m));
66: text = ptext + markidx(m);
67: while (cnt-- > 0)
68: {
69: do
70: {
71: m++;
72: text++;
73: } while (*text && *text != key);
74: }
75: if (!*text)
76: {
77: return MARK_UNSET;
78: }
79: return m;
80: }
81:
82: /* move backward within this line to previous occurrence of key */
83: MARK m_Fch(m, cnt, key)
84: MARK m; /* where to search from */
85: long cnt;
86: int key; /* what to search for */
87: {
88: REG char *text;
89:
90: DEFAULT(1);
91:
92: prevfwdfn = m_Fch;
93: prevrevfn = m_fch;
94: prev_key = key;
95:
96: pfetch(markline(m));
97: text = ptext + markidx(m);
98: while (cnt-- > 0)
99: {
100: do
101: {
102: m--;
103: text--;
104: } while (text >= ptext && *text != key);
105: }
106: if (text < ptext)
107: {
108: return MARK_UNSET;
109: }
110: return m;
111: }
112:
113: /* move forward within this line almost to next occurrence of key */
114: MARK m_tch(m, cnt, key)
115: MARK m; /* where to search from */
116: long cnt;
117: int key; /* what to search for */
118: {
119: /* skip the adjacent char */
120: pfetch(markline(m));
121: if (plen <= markidx(m))
122: {
123: return MARK_UNSET;
124: }
125: m++;
126:
127: m = m_fch(m, cnt, key);
128: if (m == MARK_UNSET)
129: {
130: return MARK_UNSET;
131: }
132:
133: prevfwdfn = m_tch;
134: prevrevfn = m_Tch;
135:
136: return m - 1;
137: }
138:
139: /* move backward within this line almost to previous occurrence of key */
140: MARK m_Tch(m, cnt, key)
141: MARK m; /* where to search from */
142: long cnt;
143: int key; /* what to search for */
144: {
145: /* skip the adjacent char */
146: if (markidx(m) == 0)
147: {
148: return MARK_UNSET;
149: }
150: m--;
151:
152: m = m_Fch(m, cnt, key);
153: if (m == MARK_UNSET)
154: {
155: return MARK_UNSET;
156: }
157:
158: prevfwdfn = m_Tch;
159: prevrevfn = m_tch;
160:
161: return m + 1;
162: }
163: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.