Commit | Line | Data |
---|---|---|
15637ed4 RG |
1 | /* move3.c */ |
2 | ||
3 | /* Author: | |
4 | * Steve Kirkendall | |
5 | * 14407 SW Teal Blvd. #C | |
6 | * Beaverton, OR 97005 | |
7 | * kirkenda@cs.pdx.edu | |
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 | char 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 | char 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 | char 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 | char 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 | char 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 |