|
|
1.1 ! root 1: /* move5.c */ ! 2: ! 3: /* Author: ! 4: * Steve Kirkendall ! 5: * 16820 SW Tallac Way ! 6: * Beaverton, OR 97006 ! 7: * [email protected], or ...uunet!tektronix!psueea!jove!kirkenda ! 8: */ ! 9: ! 10: ! 11: /* This file contains the word-oriented movement functions */ ! 12: ! 13: #include <ctype.h> ! 14: #include "config.h" ! 15: #include "vi.h" ! 16: ! 17: #ifndef isascii ! 18: # define isascii(c) !((c) & ~0x7f) ! 19: #endif ! 20: ! 21: ! 22: MARK m_fword(m, cnt, cmd) ! 23: MARK m; /* movement is relative to this mark */ ! 24: long cnt; /* a numeric argument */ ! 25: int cmd; /* either 'w' or 'W' */ ! 26: { ! 27: REG long l; ! 28: REG char *text; ! 29: REG int i; ! 30: ! 31: DEFAULT(1); ! 32: ! 33: l = markline(m); ! 34: pfetch(l); ! 35: text = ptext + markidx(m); ! 36: while (cnt-- > 0) /* yes, ASSIGNMENT! */ ! 37: { ! 38: i = *text++; ! 39: ! 40: if (cmd == 'W') ! 41: { ! 42: /* include any non-whitespace */ ! 43: while (i && (!isascii(i) || !isspace(i))) ! 44: { ! 45: i = *text++; ! 46: } ! 47: } ! 48: else if (!isascii(i) || isalnum(i) || i == '_') ! 49: { ! 50: /* include an alphanumeric word */ ! 51: while (i && (!isascii(i) || isalnum(i) || i == '_')) ! 52: { ! 53: i = *text++; ! 54: } ! 55: } ! 56: else ! 57: { ! 58: /* include contiguous punctuation */ ! 59: while (i && isascii(i) && !isalnum(i) && !isspace(i)) ! 60: { ! 61: i = *text++; ! 62: } ! 63: } ! 64: ! 65: /* include trailing whitespace */ ! 66: while (!i || isascii(i) && isspace(i)) ! 67: { ! 68: /* did we hit the end of this line? */ ! 69: if (!i) ! 70: { ! 71: /* move to next line, if there is one */ ! 72: l++; ! 73: if (l > nlines) ! 74: { ! 75: return MARK_UNSET; ! 76: } ! 77: pfetch(l); ! 78: text = ptext; ! 79: } ! 80: ! 81: i = *text++; ! 82: } ! 83: text--; ! 84: } ! 85: ! 86: /* construct a MARK for this place */ ! 87: m = buildmark(text); ! 88: return m; ! 89: } ! 90: ! 91: ! 92: MARK m_bword(m, cnt, cmd) ! 93: MARK m; /* movement is relative to this mark */ ! 94: long cnt; /* a numeric argument */ ! 95: int cmd; /* either 'b' or 'B' */ ! 96: { ! 97: REG long l; ! 98: REG char *text; ! 99: ! 100: DEFAULT(1); ! 101: ! 102: l = markline(m); ! 103: pfetch(l); ! 104: text = ptext + markidx(m); ! 105: while (cnt-- > 0) /* yes, ASSIGNMENT! */ ! 106: { ! 107: text--; ! 108: ! 109: /* include preceding whitespace */ ! 110: while (text < ptext || isascii(*text) && isspace(*text)) ! 111: { ! 112: /* did we hit the end of this line? */ ! 113: if (text < ptext) ! 114: { ! 115: /* move to preceding line, if there is one */ ! 116: l--; ! 117: if (l <= 0) ! 118: { ! 119: return MARK_UNSET; ! 120: } ! 121: pfetch(l); ! 122: text = ptext + plen - 1; ! 123: } ! 124: else ! 125: { ! 126: text--; ! 127: } ! 128: } ! 129: ! 130: if (cmd == 'B') ! 131: { ! 132: /* include any non-whitespace */ ! 133: while (text >= ptext && (!isascii(*text) || !isspace(*text))) ! 134: { ! 135: text--; ! 136: } ! 137: } ! 138: else if (!isascii(*text) || isalnum(*text) || *text == '_') ! 139: { ! 140: /* include an alphanumeric word */ ! 141: while (text >= ptext && (!isascii(*text) || isalnum(*text) || *text == '_')) ! 142: { ! 143: text--; ! 144: } ! 145: } ! 146: else ! 147: { ! 148: /* include contiguous punctuation */ ! 149: while (text >= ptext && isascii(*text) && !isalnum(*text) && !isspace(*text)) ! 150: { ! 151: text--; ! 152: } ! 153: } ! 154: text++; ! 155: } ! 156: ! 157: /* construct a MARK for this place */ ! 158: m = buildmark(text); ! 159: return m; ! 160: } ! 161: ! 162: MARK m_eword(m, cnt, cmd) ! 163: MARK m; /* movement is relative to this mark */ ! 164: long cnt; /* a numeric argument */ ! 165: int cmd; /* either 'e' or 'E' */ ! 166: { ! 167: REG long l; ! 168: REG char *text; ! 169: REG int i; ! 170: ! 171: DEFAULT(1); ! 172: ! 173: l = markline(m); ! 174: pfetch(l); ! 175: text = ptext + markidx(m); ! 176: while (cnt-- > 0) /* yes, ASSIGNMENT! */ ! 177: { ! 178: text++; ! 179: i = *text++; ! 180: ! 181: /* include preceding whitespace */ ! 182: while (!i || isascii(i) && isspace(i)) ! 183: { ! 184: /* did we hit the end of this line? */ ! 185: if (!i) ! 186: { ! 187: /* move to next line, if there is one */ ! 188: l++; ! 189: if (l > nlines) ! 190: { ! 191: return MARK_UNSET; ! 192: } ! 193: pfetch(l); ! 194: text = ptext; ! 195: } ! 196: ! 197: i = *text++; ! 198: } ! 199: ! 200: if (cmd == 'E') ! 201: { ! 202: /* include any non-whitespace */ ! 203: while (i && (!isascii(i) || !isspace(i))) ! 204: { ! 205: i = *text++; ! 206: } ! 207: } ! 208: else if (!isascii(i) || isalnum(i) || i == '_') ! 209: { ! 210: /* include an alphanumeric word */ ! 211: while (i && (!isascii(i) || isalnum(i) || i == '_')) ! 212: { ! 213: i = *text++; ! 214: } ! 215: } ! 216: else ! 217: { ! 218: /* include contiguous punctuation */ ! 219: while (i && isascii(i) && !isalnum(i) && !isspace(i)) ! 220: { ! 221: i = *text++; ! 222: } ! 223: } ! 224: text -= 2; ! 225: } ! 226: ! 227: /* construct a MARK for this place */ ! 228: m = buildmark(text); ! 229: return m; ! 230: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.