Lines Matching +full:abs +full:- +full:range
1 /*-
32 * ex_global -- [line [,line]] g[lobal][!] /pattern/ [commands]
41 cmdp, FL_ISSET(cmdp->iflags, E_C_FORCE) ? V : GLOBAL)); in ex_global()
45 * ex_v -- [line [,line]] v /pattern/ [commands]
57 * ex_g_setup --
65 MARK abs; in ex_g_setup() local
66 RANGE *rp; in ex_g_setup()
78 msgq_wstr(sp, M_ERR, cmdp->cmd->name, in ex_g_setup()
84 * Skip leading white space. Historic vi allowed any non-alphanumeric in ex_g_setup()
87 if (cmdp->argc == 0) in ex_g_setup()
89 for (p = cmdp->argv[0]->bp; cmdskip(*p); ++p); in ex_g_setup()
92 usage: ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE); in ex_g_setup()
109 * Nul terminate the pattern string -- it's passed in ex_g_setup()
126 if (sp->re == NULL) { in ex_g_setup()
131 /* Re-compile the RE if necessary. */ in ex_g_setup()
133 re_compile(sp, sp->re, sp->re_len, in ex_g_setup()
134 NULL, NULL, &sp->re_c, RE_C_SEARCH)) in ex_g_setup()
138 if (re_compile(sp, ptrn, t - ptrn, &sp->re, in ex_g_setup()
139 &sp->re_len, &sp->re_c, RE_C_SEARCH)) in ex_g_setup()
146 sp->searchdir = FORWARD; in ex_g_setup()
148 re = &sp->re_c; in ex_g_setup()
151 abs.lno = sp->lno; in ex_g_setup()
152 abs.cno = sp->cno; in ex_g_setup()
153 if (mark_set(sp, ABSMARK1, &abs, 1)) in ex_g_setup()
158 TAILQ_INIT(ecp->rq); in ex_g_setup()
167 if ((len = cmdp->argv[0]->len - (p - cmdp->argv[0]->bp)) == 0) { in ex_g_setup()
172 MALLOC_RET(sp, ecp->cp, (len * 2) * sizeof(CHAR_T)); in ex_g_setup()
173 ecp->o_cp = ecp->cp; in ex_g_setup()
174 ecp->o_clen = len; in ex_g_setup()
175 MEMCPY(ecp->cp + len, p, len); in ex_g_setup()
176 ecp->range_lno = OOBLNO; in ex_g_setup()
177 FL_SET(ecp->agv_flags, cmd == GLOBAL ? AGV_GLOBAL : AGV_V); in ex_g_setup()
178 SLIST_INSERT_HEAD(sp->gp->ecq, ecp, q); in ex_g_setup()
186 * example, a good vi clone test is ":g/X/mo.-3", or "g/X/.,.+1d". in ex_g_setup()
194 for (start = cmdp->addr1.lno, in ex_g_setup()
195 end = cmdp->addr2.lno; start <= end; ++start) { in ex_g_setup()
196 if (cnt-- == 0) { in ex_g_setup()
198 SLIST_REMOVE_HEAD(sp->gp->ecq, q); in ex_g_setup()
199 free(ecp->cp); in ex_g_setup()
212 regexec(&sp->re_c, dbp, 0, match, REG_STARTEND)) { in ex_g_setup()
222 re_error(sp, eval, &sp->re_c); in ex_g_setup()
226 /* If follows the last entry, extend the last entry's range. */ in ex_g_setup()
227 if ((rp = TAILQ_LAST(ecp->rq, _rh)) != NULL && in ex_g_setup()
228 rp->stop == start - 1) { in ex_g_setup()
229 ++rp->stop; in ex_g_setup()
233 /* Allocate a new range, and append it to the list. */ in ex_g_setup()
234 CALLOC(sp, rp, 1, sizeof(RANGE)); in ex_g_setup()
237 rp->start = rp->stop = start; in ex_g_setup()
238 TAILQ_INSERT_TAIL(ecp->rq, rp, q); in ex_g_setup()
245 * ex_g_insdel --
254 RANGE *nrp, *rp; in ex_g_insdel()
263 SLIST_FOREACH(ecp, sp->gp->ecq, q) { in ex_g_insdel()
264 if (!FL_ISSET(ecp->agv_flags, AGV_AT | AGV_GLOBAL | AGV_V)) in ex_g_insdel()
266 TAILQ_FOREACH_SAFE(rp, ecp->rq, q, nrp) { in ex_g_insdel()
267 /* If range less than the line, ignore it. */ in ex_g_insdel()
268 if (rp->stop < lno) in ex_g_insdel()
272 * If range greater than the line, decrement or in ex_g_insdel()
273 * increment the range. in ex_g_insdel()
275 if (rp->start > lno) { in ex_g_insdel()
277 --rp->start; in ex_g_insdel()
278 --rp->stop; in ex_g_insdel()
280 ++rp->start; in ex_g_insdel()
281 ++rp->stop; in ex_g_insdel()
287 * Lno is inside the range, decrement the end point in ex_g_insdel()
288 * for deletion, and split the range for insertion. in ex_g_insdel()
290 * element, neither range can be exhausted. in ex_g_insdel()
293 if (rp->start > --rp->stop) { in ex_g_insdel()
294 TAILQ_REMOVE(ecp->rq, rp, q); in ex_g_insdel()
298 CALLOC_RET(sp, nrp, 1, sizeof(RANGE)); in ex_g_insdel()
299 nrp->start = lno + 1; in ex_g_insdel()
300 nrp->stop = rp->stop + 1; in ex_g_insdel()
301 rp->stop = lno - 1; in ex_g_insdel()
302 TAILQ_INSERT_AFTER(ecp->rq, rp, nrp, q); in ex_g_insdel()
310 ecp->range_lno = lno; in ex_g_insdel()