Lines Matching +full:cmd +full:- +full:cnt +full:- +full:name
1 /*-
40 * ex --
56 gp = sp->gp; in ex()
64 while ((mp = SLIST_FIRST(gp->msgq)) != NULL) { in ex()
65 gp->scr_msg(sp, mp->mtype, mp->buf, mp->len); in ex()
66 SLIST_REMOVE_HEAD(gp->msgq, q); in ex()
67 free(mp->buf); in ex()
71 /* If reading from a file, errors should have name and line info. */ in ex()
73 gp->excmd.if_lno = 1; in ex()
74 gp->excmd.if_name = "script"; in ex()
85 for (;; ++gp->excmd.if_lno) { in ex()
89 msgq_status(sp, sp->lno, 0); in ex()
102 if (ex_txt(sp, sp->tiq, ':', flags)) in ex()
111 CLEAR_EX_PARSER(&gp->excmd); in ex()
115 * ex_cmd() a separator -- it discards single newlines. in ex()
117 tp = TAILQ_FIRST(sp->tiq); in ex()
118 if (tp->len == 0) { in ex()
119 gp->excmd.cp = L(" "); /* __TK__ why not |? */ in ex()
120 gp->excmd.clen = 1; in ex()
122 gp->excmd.cp = tp->lb; in ex()
123 gp->excmd.clen = tp->len; in ex()
125 F_INIT(&gp->excmd, E_NRSEP); in ex()
168 * ex_cmd --
205 int cnt, delim, isaddr, namelen; in ex_cmd() local
212 gp = sp->gp; in ex_cmd()
220 loop: ecp = SLIST_FIRST(gp->ecq); in ex_cmd()
223 if (ecp->if_name != NULL) { in ex_cmd()
224 gp->if_lno = ecp->if_lno; in ex_cmd()
225 gp->if_name = ecp->if_name; in ex_cmd()
233 if (db_last(sp, &sp->lno)) in ex_cmd()
235 sp->cno = 0; in ex_cmd()
241 ++gp->if_lno; in ex_cmd()
242 ++ecp->if_lno; in ex_cmd()
253 /* Initialize +cmd, saved command information. */ in ex_cmd()
255 ecp->save_cmdlen = 0; in ex_cmd()
258 for (notempty = 0; ecp->clen > 0; ++ecp->cp, --ecp->clen) in ex_cmd()
259 if ((ch = *ecp->cp) == '\n') { in ex_cmd()
260 ++gp->if_lno; in ex_cmd()
261 ++ecp->if_lno; in ex_cmd()
274 if (ecp->clen != 0 && ch == ':') { in ex_cmd()
276 while (--ecp->clen > 0 && (ch = *++ecp->cp) == ':'); in ex_cmd()
280 * Command lines that start with a double-quote are comments. in ex_cmd()
288 if (ecp->clen != 0 && ch == '"') { in ex_cmd()
289 while (--ecp->clen > 0 && *++ecp->cp != '\n'); in ex_cmd()
290 if (*ecp->cp == '\n') { in ex_cmd()
292 ++ecp->cp; in ex_cmd()
293 --ecp->clen; in ex_cmd()
299 for (; ecp->clen > 0; ++ecp->cp, --ecp->clen) { in ex_cmd()
300 ch = *ecp->cp; in ex_cmd()
310 * were the same as a single <carriage-return>, i.e. a default command. in ex_cmd()
320 if (ecp->clen == 0 && in ex_cmd()
324 ecp = SLIST_FIRST(gp->ecq); in ex_cmd()
325 if (ecp->clen == 0) in ex_cmd()
335 * <carriage-return> or <eof>, we'll probably want to move up. I in ex_cmd()
341 ecp->clen != 0 && (ecp->clen != 1 || ecp->cp[0] != '\004')) in ex_cmd()
354 for (; ecp->clen > 0; ++ecp->cp, --ecp->clen) { in ex_cmd()
355 ch = *ecp->cp; in ex_cmd()
363 * name by looking for the first non-alphabetic character. (There in ex_cmd()
364 * are a few non-alphabetic characters in command names, but they're in ex_cmd()
373 * |||<carriage-return>, when the cursor was on line 1, displayed in ex_cmd()
382 if (ecp->clen != 0 && ecp->cp[0] != '|' && ecp->cp[0] != '\n') { in ex_cmd()
383 if (STRCHR(SINGLE_CHAR_COMMANDS, *ecp->cp)) { in ex_cmd()
384 p = ecp->cp; in ex_cmd()
385 ++ecp->cp; in ex_cmd()
386 --ecp->clen; in ex_cmd()
389 for (p = ecp->cp; in ex_cmd()
390 ecp->clen > 0; --ecp->clen, ++ecp->cp) in ex_cmd()
391 if (!isazAZ(*ecp->cp)) in ex_cmd()
393 if ((namelen = ecp->cp - p) == 0) { in ex_cmd()
394 msgq(sp, M_ERR, "080|Unknown command name"); in ex_cmd()
408 * up to a l, p, +, - or # character can break this code. in ex_cmd()
418 n = cmds[C_DELETE].name; *s == *n; ++s, ++n); in ex_cmd()
420 s[0] == '-' || s[0] == '^' || s[0] == '#') { in ex_cmd()
421 len = (ecp->cp - p) - (s - p); in ex_cmd()
422 ecp->cp -= len; in ex_cmd()
423 ecp->clen += len; in ex_cmd()
424 ecp->rcmd = cmds[C_DELETE]; in ex_cmd()
425 ecp->rcmd.syntax = "1bca1"; in ex_cmd()
426 ecp->cmd = &ecp->rcmd; in ex_cmd()
454 if ((ecp->cmd = ex_comm_search(p, namelen)) == NULL) in ex_cmd()
458 ecp->cp -= namelen - 1; in ex_cmd()
459 ecp->clen += namelen - 1; in ex_cmd()
460 ecp->cmd = &cmds[C_K]; in ex_cmd()
465 for (s = p + 1, cnt = namelen; --cnt; ++s) in ex_cmd()
469 if (cnt == 0) { in ex_cmd()
470 ecp->cp -= namelen - 1; in ex_cmd()
471 ecp->clen += namelen - 1; in ex_cmd()
472 ecp->rcmd = cmds[C_SUBSTITUTE]; in ex_cmd()
473 ecp->rcmd.fn = ex_subagain; in ex_cmd()
474 ecp->cmd = &ecp->rcmd; in ex_cmd()
491 skip_srch: if (ecp->cmd == &cmds[C_VISUAL_EX] && F_ISSET(sp, SC_VI)) in ex_cmd()
492 ecp->cmd = &cmds[C_VISUAL_VI]; in ex_cmd()
500 * Previous to mean previous-in-a-new-screen, so be careful. in ex_cmd()
502 if (newscreen && !F_ISSET(ecp->cmd, E_NEWSCREEN) && in ex_cmd()
503 (ecp->cmd == &cmds[C_PRINT] || in ex_cmd()
504 ecp->cmd == &cmds[C_PRESERVE])) in ex_cmd()
508 if (newscreen && !F_ISSET(ecp->cmd, E_NEWSCREEN)) in ex_cmd()
512 if (F_ISSET(ecp->cmd, E_SECURE) && O_ISSET(sp, O_SECURE)) { in ex_cmd()
513 ex_wemsg(sp, ecp->cmd->name, EXM_SECURE); in ex_cmd()
522 if ((ecp->cmd == &cmds[C_SHIFTL] && *p == '<') || in ex_cmd()
523 (ecp->cmd == &cmds[C_SHIFTR] && *p == '>')) { in ex_cmd()
525 ecp->clen > 0; --ecp->clen, ++ecp->cp) in ex_cmd()
526 if (*ecp->cp != ch) in ex_cmd()
528 if (argv_exp0(sp, ecp, p, ecp->cp - p)) in ex_cmd()
533 if (ecp->cmd == &cmds[C_HASH]) in ex_cmd()
534 exp->fdef = E_C_HASH; in ex_cmd()
535 else if (ecp->cmd == &cmds[C_LIST]) in ex_cmd()
536 exp->fdef = E_C_LIST; in ex_cmd()
537 else if (ecp->cmd == &cmds[C_PRINT]) in ex_cmd()
538 exp->fdef = E_C_PRINT; in ex_cmd()
542 ecp->cmd = &cmds[C_PRINT]; in ex_cmd()
545 F_SET(ecp, exp->fdef); in ex_cmd()
553 if (ecp->addrcnt == 0 && !F_ISSET(sp, SC_EX_GLOBAL)) { in ex_cmd()
554 ecp->addrcnt = 1; in ex_cmd()
555 ecp->addr1.lno = sp->lno + 1; in ex_cmd()
556 ecp->addr1.cno = sp->cno; in ex_cmd()
571 FL_SET(ecp->iflags, E_C_HASH); in ex_cmd()
576 if (F_ISSET(sp, SC_EX) && (F_ISSET(ecp->cmd, E_VIONLY) || newscreen)) { in ex_cmd()
577 msgq_wstr(sp, M_ERR, ecp->cmd->name, in ex_cmd()
583 F_SET(ecp, ecp->cmd->flags); in ex_cmd()
589 * are the end of the string (ecp->clen), or unescaped (by <literal in ex_cmd()
626 * do normal command processing on whatever is left. Barf-O-Rama. in ex_cmd()
630 ecp->save_cmd = ecp->cp; in ex_cmd()
631 if (ecp->cmd == &cmds[C_EDIT] || ecp->cmd == &cmds[C_EX] || in ex_cmd()
632 ecp->cmd == &cmds[C_NEXT] || ecp->cmd == &cmds[C_VISUAL_VI] || in ex_cmd()
633 ecp->cmd == &cmds[C_VSPLIT]) { in ex_cmd()
635 * Move to the next non-whitespace character. A '!' in ex_cmd()
639 if (ecp->clen > 0 && *ecp->cp == '!') { in ex_cmd()
640 ++ecp->cp; in ex_cmd()
641 --ecp->clen; in ex_cmd()
642 FL_SET(ecp->iflags, E_C_FORCE); in ex_cmd()
645 ecp->save_cmd = ecp->cp; in ex_cmd()
647 for (; ecp->clen > 0; --ecp->clen, ++ecp->cp) in ex_cmd()
648 if (!cmdskip(*ecp->cp)) in ex_cmd()
654 * so there was no way to put a space or newline into the +cmd in ex_cmd()
659 if (ecp->clen > 0 && *ecp->cp == '+') { in ex_cmd()
660 ++ecp->cp; in ex_cmd()
661 --ecp->clen; in ex_cmd()
662 for (arg1 = p = ecp->cp; in ex_cmd()
663 ecp->clen > 0; --ecp->clen, ++ecp->cp) { in ex_cmd()
664 ch = *ecp->cp; in ex_cmd()
666 ecp->clen > 1) { in ex_cmd()
668 --ecp->clen; in ex_cmd()
669 ch = *++ecp->cp; in ex_cmd()
674 arg1_len = ecp->cp - arg1; in ex_cmd()
677 ecp->save_cmd = ecp->cp; in ex_cmd()
679 } else if (ecp->cmd == &cmds[C_BANG] || in ex_cmd()
680 ecp->cmd == &cmds[C_GLOBAL] || ecp->cmd == &cmds[C_V]) { in ex_cmd()
690 for (p = ecp->cp; ecp->clen > 0; --ecp->clen, ++ecp->cp) { in ex_cmd()
691 ch = *ecp->cp; in ex_cmd()
692 if (ch == '\\' && ecp->clen > 1 && ecp->cp[1] == '\n') { in ex_cmd()
694 --ecp->clen; in ex_cmd()
695 ch = *++ecp->cp; in ex_cmd()
697 ++gp->if_lno; in ex_cmd()
698 ++ecp->if_lno; in ex_cmd()
703 } else if (ecp->cmd == &cmds[C_READ] || ecp->cmd == &cmds[C_WRITE]) { in ex_cmd()
706 * the next non-blank character is a '!', it's a filter command in ex_cmd()
708 * commands, if the next non-blank character is a '!', it's a in ex_cmd()
712 for (tmp = 0; ecp->clen > 0; --ecp->clen, ++ecp->cp) { in ex_cmd()
713 ch = *ecp->cp; in ex_cmd()
719 if (ecp->clen > 0 && ch == '!' && in ex_cmd()
720 (ecp->cmd == &cmds[C_READ] || tmp)) in ex_cmd()
721 for (; ecp->clen > 0; --ecp->clen, ++ecp->cp) in ex_cmd()
722 if (ecp->cp[0] == '\n') in ex_cmd()
724 } else if (ecp->cmd == &cmds[C_SUBSTITUTE]) { in ex_cmd()
726 * Move to the next non-whitespace character, we'll use it as in ex_cmd()
731 for (; ecp->clen > 0; --ecp->clen, ++ecp->cp) in ex_cmd()
732 if (!cmdskip(ecp->cp[0])) in ex_cmd()
735 if (is09azAZ(ecp->cp[0]) || ecp->cp[0] == '|') { in ex_cmd()
736 ecp->rcmd = cmds[C_SUBSTITUTE]; in ex_cmd()
737 ecp->rcmd.fn = ex_subagain; in ex_cmd()
738 ecp->cmd = &ecp->rcmd; in ex_cmd()
739 } else if (ecp->clen > 0) { in ex_cmd()
748 delim = *ecp->cp; in ex_cmd()
749 ++ecp->cp; in ex_cmd()
750 --ecp->clen; in ex_cmd()
751 for (cnt = 2; ecp->clen > 0 && in ex_cmd()
752 cnt != 0; --ecp->clen, ++ecp->cp) in ex_cmd()
753 if (ecp->cp[0] == '\\' && in ex_cmd()
754 ecp->clen > 1) { in ex_cmd()
755 ++ecp->cp; in ex_cmd()
756 --ecp->clen; in ex_cmd()
757 } else if (ecp->cp[0] == delim) in ex_cmd()
758 --cnt; in ex_cmd()
769 * file. It was almost certainly a bug, but that's what bug-for-bug in ex_cmd()
775 vi_address = ecp->clen != 0 && ecp->cp[0] != '\n'; in ex_cmd()
776 for (p = ecp->cp; ecp->clen > 0; --ecp->clen, ++ecp->cp) { in ex_cmd()
777 ch = ecp->cp[0]; in ex_cmd()
778 if (IS_ESCAPE(sp, ecp, ch) && ecp->clen > 1) { in ex_cmd()
779 CHAR_T tmp = ecp->cp[1]; in ex_cmd()
782 ++gp->if_lno; in ex_cmd()
783 ++ecp->if_lno; in ex_cmd()
786 --ecp->clen; in ex_cmd()
787 ++ecp->cp; in ex_cmd()
793 --ecp->clen; in ex_cmd()
803 p = ecp->cp + 1; in ex_cmd()
804 ecp->cp = ecp->save_cmd; in ex_cmd()
805 ecp->save_cmd = p; in ex_cmd()
806 ecp->save_cmdlen = ecp->clen; in ex_cmd()
807 ecp->clen = ((ecp->save_cmd - ecp->cp) - 1) - discard; in ex_cmd()
818 if (ecp->cmd == &cmds[C_SET]) { in ex_cmd()
819 for (p = ecp->cp, len = ecp->clen; len > 0; --len, ++p) in ex_cmd()
821 --len; in ex_cmd()
847 switch (ecp->addrcnt) { in ex_cmd()
849 ecp->addrcnt = 1; in ex_cmd()
855 ecp->addr1.lno = 0; in ex_cmd()
858 ecp->addr1.lno = sp->lno; in ex_cmd()
860 ecp->addr1.lno = sp->lno; in ex_cmd()
861 ecp->addr1.cno = sp->cno; in ex_cmd()
866 ecp->addrcnt = 1; in ex_cmd()
867 ecp->addr1 = ecp->addr2; in ex_cmd()
871 if (ecp->addrcnt == 0) /* Default to nothing. */ in ex_cmd()
875 if (ecp->addrcnt == 0) { /* Default entire/empty file. */ in ex_cmd()
877 ecp->addrcnt = 2; in ex_cmd()
878 if (sp->ep == NULL) in ex_cmd()
879 ecp->addr2.lno = 0; in ex_cmd()
880 else if (db_last(sp, &ecp->addr2.lno)) in ex_cmd()
883 ecp->addr2.lno == 0) { in ex_cmd()
884 ecp->addr1.lno = 0; in ex_cmd()
887 ecp->addr1.lno = 1; in ex_cmd()
888 ecp->addr1.cno = ecp->addr2.cno = 0; in ex_cmd()
894 two_addr: switch (ecp->addrcnt) { in ex_cmd()
896 ecp->addrcnt = 2; in ex_cmd()
898 if (sp->lno == 1 && in ex_cmd()
903 ecp->addr1.lno = ecp->addr2.lno = 0; in ex_cmd()
906 ecp->addr1.lno = in ex_cmd()
907 ecp->addr2.lno = sp->lno; in ex_cmd()
909 ecp->addr1.lno = ecp->addr2.lno = sp->lno; in ex_cmd()
910 ecp->addr1.cno = ecp->addr2.cno = sp->cno; in ex_cmd()
913 ecp->addrcnt = 2; in ex_cmd()
914 ecp->addr2 = ecp->addr1; in ex_cmd()
921 if (ecp->addrcnt) /* Error. */ in ex_cmd()
931 if (ecp->cmd == &cmds[C_SCROLL]) { in ex_cmd()
932 ecp->addrcnt = 2; in ex_cmd()
933 ecp->addr1.lno = sp->lno + 1; in ex_cmd()
934 ecp->addr2.lno = sp->lno + O_VAL(sp, O_SCROLL); in ex_cmd()
935 ecp->addr1.cno = ecp->addr2.cno = sp->cno; in ex_cmd()
938 if (lno != 0 && lno > sp->lno && ecp->addr2.lno > lno) in ex_cmd()
939 ecp->addr2.lno = lno; in ex_cmd()
942 ecp->flagoff = 0; in ex_cmd()
943 for (np = ecp->cmd->syntax; *np != '\0'; ++np) { in ex_cmd()
950 if (ecp->clen > 0 && *ecp->cp == '!') { in ex_cmd()
951 ++ecp->cp; in ex_cmd()
952 --ecp->clen; in ex_cmd()
953 FL_SET(ecp->iflags, E_C_FORCE); in ex_cmd()
959 for (; ecp->clen > 0; --ecp->clen, ++ecp->cp) in ex_cmd()
960 if (!cmdskip(*ecp->cp)) in ex_cmd()
962 if (ecp->clen == 0) in ex_cmd()
966 case '1': /* +, -, #, l, p */ in ex_cmd()
971 * example, in the command, ":3+++p--#", historic vi in ex_cmd()
972 * acted on the '#' flag, but ignored the '-' flags. in ex_cmd()
977 for (; ecp->clen; --ecp->clen, ++ecp->cp) in ex_cmd()
978 switch (*ecp->cp) { in ex_cmd()
980 ++ecp->flagoff; in ex_cmd()
982 case '-': in ex_cmd()
984 --ecp->flagoff; in ex_cmd()
988 FL_SET(ecp->iflags, E_C_HASH); in ex_cmd()
989 exp->fdef |= E_C_HASH; in ex_cmd()
992 FL_SET(ecp->iflags, E_C_LIST); in ex_cmd()
993 exp->fdef |= E_C_LIST; in ex_cmd()
996 FL_SET(ecp->iflags, E_C_PRINT); in ex_cmd()
997 exp->fdef |= E_C_PRINT; in ex_cmd()
1003 case '2': /* -, ., +, ^ */ in ex_cmd()
1004 case '3': /* -, ., +, ^, = */ in ex_cmd()
1005 for (; ecp->clen; --ecp->clen, ++ecp->cp) in ex_cmd()
1006 switch (*ecp->cp) { in ex_cmd()
1007 case '-': in ex_cmd()
1008 FL_SET(ecp->iflags, E_C_DASH); in ex_cmd()
1011 FL_SET(ecp->iflags, E_C_DOT); in ex_cmd()
1014 FL_SET(ecp->iflags, E_C_PLUS); in ex_cmd()
1017 FL_SET(ecp->iflags, E_C_CARAT); in ex_cmd()
1021 FL_SET(ecp->iflags, E_C_EQUAL); in ex_cmd()
1038 if ((ecp->cp[0] == '+' || ecp->cp[0] == '-' || in ex_cmd()
1039 ecp->cp[0] == '^' || ecp->cp[0] == '#') && in ex_cmd()
1046 * not a two-line deletion. in ex_cmd()
1048 if (!ISDIGIT(ecp->cp[0])) { in ex_cmd()
1049 ecp->buffer = *ecp->cp; in ex_cmd()
1050 ++ecp->cp; in ex_cmd()
1051 --ecp->clen; in ex_cmd()
1052 FL_SET(ecp->iflags, E_C_BUFFER); in ex_cmd()
1058 if (!ISDIGIT(*ecp->cp) && (*np != '+' || in ex_cmd()
1059 (*ecp->cp != '+' && *ecp->cp != '-'))) in ex_cmd()
1062 if (*ecp->cp == '-') in ex_cmd()
1063 FL_SET(ecp->iflags, E_C_COUNT_NEG); in ex_cmd()
1064 else if (*ecp->cp == '+') in ex_cmd()
1065 FL_SET(ecp->iflags, E_C_COUNT_POS); in ex_cmd()
1067 nget_slong(<mp, ecp->cp, &t, 10)) != NUM_OK) { in ex_cmd()
1075 ecp->clen -= (t - ecp->cp); in ex_cmd()
1076 ecp->cp = t; in ex_cmd()
1088 ecp->addr1 = ecp->addr2; in ex_cmd()
1089 ecp->addr2.lno = ecp->addr1.lno + ltmp - 1; in ex_cmd()
1091 ecp->count = ltmp; in ex_cmd()
1092 FL_SET(ecp->iflags, E_C_COUNT); in ex_cmd()
1095 if (argv_exp2(sp, ecp, ecp->cp, ecp->clen)) in ex_cmd()
1114 msgq_wstr(sp, M_ERR, ecp->cp, in ex_cmd()
1126 ecp->lineno = cur.lno; in ex_cmd()
1129 if (ecp->clen != 0) { in ex_cmd()
1130 if (argv_exp1(sp, ecp, ecp->cp, in ex_cmd()
1131 ecp->clen, ecp->cmd == &cmds[C_BANG])) in ex_cmd()
1137 if (argv_exp0(sp, ecp, ecp->cp, ecp->clen)) in ex_cmd()
1150 for (p = t = ecp->cp; in ex_cmd()
1151 ecp->clen > 0; --ecp->clen, ++ecp->cp) { in ex_cmd()
1152 ch = *ecp->cp; in ex_cmd()
1154 ecp, ch) && ecp->clen > 1) { in ex_cmd()
1155 --ecp->clen; in ex_cmd()
1156 *p++ = *++ecp->cp; in ex_cmd()
1158 ++ecp->cp; in ex_cmd()
1159 --ecp->clen; in ex_cmd()
1164 if (argv_exp0(sp, ecp, t, p - t)) in ex_cmd()
1168 for (; ecp->clen > 0; in ex_cmd()
1169 --ecp->clen, ++ecp->cp) { in ex_cmd()
1170 ch = *ecp->cp; in ex_cmd()
1174 if (ecp->clen == 0) in ex_cmd()
1178 for (p = t = ecp->cp; ecp->clen > 0; in ex_cmd()
1179 --ecp->clen, ++ecp->cp, ++p) { in ex_cmd()
1180 ch = *ecp->cp; in ex_cmd()
1182 ecp, ch) && ecp->clen > 1) { in ex_cmd()
1183 --ecp->clen; in ex_cmd()
1184 *p = *++ecp->cp; in ex_cmd()
1188 if (argv_exp0(sp, ecp, t, p - t)) in ex_cmd()
1192 if (argv_exp3(sp, ecp, ecp->cp, ecp->clen)) in ex_cmd()
1200 tmp = *np - '0'; in ex_cmd()
1201 if ((*++np != 'o' || exp->argsoff != 0) && in ex_cmd()
1202 exp->argsoff != tmp) in ex_cmd()
1210 INT2CHAR(sp, ecp->cmd->name, STRLEN(ecp->cmd->name) + 1, in ex_cmd()
1220 for (; ecp->clen > 0; --ecp->clen) { in ex_cmd()
1221 ch = *ecp->cp++; in ex_cmd()
1230 if (ecp->clen != 0 || strpbrk(np, "lr")) { in ex_cmd()
1231 usage: msgq(sp, M_ERR, "086|Usage: %s", ecp->cmd->usage); in ex_cmd()
1239 * assuming that any non-existent line doesn't exist because it's in ex_cmd()
1240 * past the end-of-file. That's a pretty good guess. in ex_cmd()
1245 switch (ecp->addrcnt) { in ex_cmd()
1255 if (ecp->addr2.lno == 0) { in ex_cmd()
1259 ex_badaddr(sp, ecp->cmd, A_ZERO, NUM_OK); in ex_cmd()
1262 } else if (!db_exist(sp, ecp->addr2.lno)) { in ex_cmd()
1263 if (FL_ISSET(ecp->iflags, E_C_COUNT)) { in ex_cmd()
1266 ecp->addr2.lno = lno; in ex_cmd()
1274 if (ecp->addr1.lno == 0) { in ex_cmd()
1278 ex_badaddr(sp, ecp->cmd, A_ZERO, NUM_OK); in ex_cmd()
1281 } else if (!db_exist(sp, ecp->addr1.lno)) { in ex_cmd()
1303 switch (ecp->addrcnt) { in ex_cmd()
1305 if (sp->lno != in ex_cmd()
1306 (ecp->addr2.lno ? ecp->addr2.lno : 1)) { in ex_cmd()
1307 sp->lno = in ex_cmd()
1308 ecp->addr2.lno ? ecp->addr2.lno : 1; in ex_cmd()
1309 sp->cno = 0; in ex_cmd()
1310 (void)nonblank(sp, sp->lno, &sp->cno); in ex_cmd()
1314 if (sp->lno != in ex_cmd()
1315 (ecp->addr1.lno ? ecp->addr1.lno : 1)) { in ex_cmd()
1316 sp->lno = in ex_cmd()
1317 ecp->addr1.lno ? ecp->addr1.lno : 1; in ex_cmd()
1318 sp->cno = 0; in ex_cmd()
1319 (void)nonblank(sp, sp->lno, &sp->cno); in ex_cmd()
1323 ecp->cp = ecp->save_cmd; in ex_cmd()
1324 ecp->clen = ecp->save_cmdlen; in ex_cmd()
1329 * Set the absolute mark -- we have to set it for vi here, in case in ex_cmd()
1334 cur.lno = sp->lno; in ex_cmd()
1335 cur.cno = sp->cno; in ex_cmd()
1346 ++sp->ccnt; in ex_cmd()
1352 if (sp->ep != NULL && !F_ISSET(sp, SC_EX_GLOBAL)) in ex_cmd()
1358 * default command (<carriage-return>) or the scrolling commands (^D in ex_cmd()
1359 * and <EOF>) as the first non-<blank> characters in the line. in ex_cmd()
1367 * been echoed by the tty driver. It's OK if vi calls us -- we won't in ex_cmd()
1371 if (sp->ep != NULL && in ex_cmd()
1373 (F_ISSET(ecp, E_USELASTCMD) || ecp->cmd == &cmds[C_SCROLL])) in ex_cmd()
1374 gp->scr_ex_adjust(sp, EX_TERM_SCROLL); in ex_cmd()
1384 if (ecp->cmd->fn(sp, ecp) || INTERRUPTED(sp)) { in ex_cmd()
1394 msgq_wstr(sp, M_ERR, ecp->cmd->name, in ex_cmd()
1407 * lines message -- that's wrong enough that we don't match it. in ex_cmd()
1423 if (sp->ep != NULL && ecp->flagoff) { in ex_cmd()
1424 if (ecp->flagoff < 0) { in ex_cmd()
1425 if (sp->lno <= -ecp->flagoff) { in ex_cmd()
1431 if (!NPFITS(MAX_REC_NUMBER, sp->lno, ecp->flagoff)) { in ex_cmd()
1435 if (!db_exist(sp, sp->lno + ecp->flagoff)) { in ex_cmd()
1437 "089|Flag offset past end-of-file"); in ex_cmd()
1441 sp->lno += ecp->flagoff; in ex_cmd()
1450 if (F_ISSET(sp, SC_EX) && sp->ep != NULL && sp->lno != 0) { in ex_cmd()
1455 if (FL_ISSET(ecp->iflags, E_CLRFLAG)) in ex_cmd()
1456 FL_CLR(ecp->iflags, E_C_HASH | E_C_LIST | E_C_PRINT); in ex_cmd()
1460 FL_CLR(ecp->iflags, E_C_HASH); in ex_cmd()
1467 LF_INIT(FL_ISSET(ecp->iflags, E_C_HASH | E_C_LIST | E_C_PRINT)); in ex_cmd()
1479 cur.lno = sp->lno; in ex_cmd()
1486 * If the command had an associated "+cmd", it has to be executed in ex_cmd()
1494 * This can happen more than once -- the historic vi simply hung or in ex_cmd()
1506 if (IS_ESCAPE(sp, ecp, arg1[arg1_len - 1])) { in ex_cmd()
1507 *--ecp->save_cmd = CH_LITERAL; in ex_cmd()
1508 ++ecp->save_cmdlen; in ex_cmd()
1511 ecp->save_cmd -= arg1_len; in ex_cmd()
1512 ecp->save_cmdlen += arg1_len; in ex_cmd()
1513 MEMMOVE(ecp->save_cmd, arg1, arg1_len); in ex_cmd()
1516 * Any commands executed from a +cmd are executed starting at in ex_cmd()
1517 * the first column of the last line of the file -- NOT the in ex_cmd()
1519 * that a +cmd was set, however, so it may have put us at the in ex_cmd()
1527 ecp->cp = ecp->save_cmd; in ex_cmd()
1528 ecp->clen = ecp->save_cmdlen; in ex_cmd()
1547 SLIST_FOREACH(ecp, sp->gp->ecq, q) in ex_cmd()
1548 switch (ecp->agv_flags) { in ex_cmd()
1587 if (ecp->save_cmdlen == 0) in ex_cmd()
1588 for (; ecp->clen; --ecp->clen) { in ex_cmd()
1589 ch = *ecp->cp++; in ex_cmd()
1590 if (IS_ESCAPE(sp, ecp, ch) && ecp->clen > 1) { in ex_cmd()
1591 --ecp->clen; in ex_cmd()
1592 ++ecp->cp; in ex_cmd()
1594 if (ecp->clen > 1) in ex_cmd()
1595 ecp->save_cmdlen = 1; in ex_cmd()
1599 if (ecp->save_cmdlen != 0 || SLIST_FIRST(gp->ecq) != &gp->excmd) { in ex_cmd()
1612 /* Turn off any file name error information. */ in ex_cmd()
1613 gp->if_name = NULL; in ex_cmd()
1622 * ex_range --
1639 * Parse comma or semi-colon delimited line specs. in ex_range()
1641 * Semi-colon delimiters update the current address to be the last in ex_range()
1644 * :3;/pattern/ecp->cp in ex_range()
1646 * will search for pattern from line 3. In addition, if ecp->cp in ex_range()
1659 gp = sp->gp; in ex_range()
1661 for (addr = ADDR_NONE, ecp->addrcnt = 0; ecp->clen > 0;) in ex_range()
1662 switch (*ecp->cp) { in ex_range()
1669 if (sp->ep == NULL) { in ex_range()
1689 if (db_last(sp, &ecp->addr2.lno)) in ex_range()
1691 ecp->addr1.lno = ecp->addr2.lno == 0 ? 0 : 1; in ex_range()
1692 ecp->addr1.cno = ecp->addr2.cno = 0; in ex_range()
1693 ecp->addrcnt = 2; in ex_range()
1695 ++ecp->cp; in ex_range()
1696 --ecp->clen; in ex_range()
1703 case ';': /* Semi-colon delimiter. */ in ex_range()
1704 if (sp->ep == NULL) { in ex_range()
1710 switch (ecp->addrcnt) { in ex_range()
1712 ecp->addr1.lno = sp->lno; in ex_range()
1713 ecp->addr1.cno = sp->cno; in ex_range()
1714 ecp->addrcnt = 1; in ex_range()
1717 ecp->addr1 = ecp->addr2; in ex_range()
1720 ecp->addr2.lno = sp->lno; in ex_range()
1721 ecp->addr2.cno = sp->cno; in ex_range()
1722 ecp->addrcnt = 2; in ex_range()
1725 if (*ecp->cp == ';') in ex_range()
1726 switch (ecp->addrcnt) { in ex_range()
1731 sp->lno = ecp->addr1.lno; in ex_range()
1732 sp->cno = ecp->addr1.cno; in ex_range()
1735 sp->lno = ecp->addr2.lno; in ex_range()
1736 sp->cno = ecp->addr2.cno; in ex_range()
1743 ++ecp->cp; in ex_range()
1744 --ecp->clen; in ex_range()
1759 switch (ecp->addrcnt) { in ex_range()
1761 ecp->addr1 = m; in ex_range()
1762 ecp->addrcnt = 1; in ex_range()
1765 ecp->addr2 = m; in ex_range()
1766 ecp->addrcnt = 2; in ex_range()
1769 ecp->addr1 = ecp->addr2; in ex_range()
1770 ecp->addr2 = m; in ex_range()
1780 * semi-colons. in ex_range()
1786 switch (ecp->addrcnt) { in ex_range()
1788 ecp->addr1.lno = sp->lno; in ex_range()
1789 ecp->addr1.cno = sp->cno; in ex_range()
1790 ecp->addrcnt = 1; in ex_range()
1793 ecp->addr1 = ecp->addr2; in ex_range()
1796 ecp->addr2.lno = sp->lno; in ex_range()
1797 ecp->addr2.cno = sp->cno; in ex_range()
1798 ecp->addrcnt = 2; in ex_range()
1802 if (ecp->addrcnt == 2 && ecp->addr2.lno < ecp->addr1.lno) { in ex_range()
1811 * ex_line --
1814 * The way the "previous context" mark worked was that any "non-relative"
1817 * was considered non-relative, and set the value. Which should explain
1837 gp = sp->gp; in ex_line()
1844 if (sp->ep == NULL && STRCHR(L("$0123456789'\\/?.+-^"), *ecp->cp)) { in ex_line()
1850 switch (*ecp->cp) { in ex_line()
1855 mp->cno = 0; in ex_line()
1856 if (db_last(sp, &mp->lno)) in ex_line()
1858 ++ecp->cp; in ex_line()
1859 --ecp->clen; in ex_line()
1866 if ((nret = nget_slong(&val, ecp->cp, &endp, 10)) != NUM_OK) { in ex_line()
1876 mp->lno = val; in ex_line()
1877 mp->cno = 0; in ex_line()
1878 ecp->clen -= (endp - ecp->cp); in ex_line()
1879 ecp->cp = endp; in ex_line()
1885 if (ecp->clen == 1) { in ex_line()
1886 msgq(sp, M_ERR, "095|No mark name supplied"); in ex_line()
1890 if (mark_get(sp, ecp->cp[1], mp, M_ERR)) { in ex_line()
1894 ecp->cp += 2; in ex_line()
1895 ecp->clen -= 2; in ex_line()
1904 if (ecp->clen < 2 || in ex_line()
1905 (ecp->cp[1] != '/' && ecp->cp[1] != '?')) { in ex_line()
1910 ++ecp->cp; in ex_line()
1911 --ecp->clen; in ex_line()
1912 sf = ecp->cp[0] == '/' ? f_search : b_search; in ex_line()
1920 search: mp->lno = sp->lno; in ex_line()
1921 mp->cno = sp->cno; in ex_line()
1922 if (sf(sp, mp, mp, ecp->cp, ecp->clen, &endp, in ex_line()
1930 ecp->clen -= (endp - ecp->cp); in ex_line()
1931 ecp->cp = endp; in ex_line()
1938 mp->cno = sp->cno; in ex_line()
1941 if (sp->lno == 1) { in ex_line()
1942 if (db_last(sp, &mp->lno)) in ex_line()
1944 if (mp->lno != 0) in ex_line()
1945 mp->lno = 1; in ex_line()
1947 mp->lno = sp->lno; in ex_line()
1955 if (ecp->clen > 1 && ISDIGIT(ecp->cp[1])) in ex_line()
1956 *ecp->cp = '+'; in ex_line()
1958 ++ecp->cp; in ex_line()
1959 --ecp->clen; in ex_line()
1965 for (; ecp->clen > 0 && in ex_line()
1966 cmdskip(ecp->cp[0]); ++ecp->cp, --ecp->clen); in ex_line()
1973 if (ecp->clen != 0 && (ISDIGIT(ecp->cp[0]) || in ex_line()
1974 ecp->cp[0] == '+' || ecp->cp[0] == '-' || in ex_line()
1975 ecp->cp[0] == '^')) { in ex_line()
1978 mp->lno = sp->lno; in ex_line()
1979 mp->cno = sp->cno; in ex_line()
1984 * [+-^<blank>]*[<blank>]*[0-9]* in ex_line()
1994 * to insert signs without numbers, so "3 - 2" was legal, and in ex_line()
2009 for (; ecp->clen > 0 && cmdskip(ecp->cp[0]); in ex_line()
2010 ++ecp->cp, --ecp->clen); in ex_line()
2011 if (ecp->clen == 0 || (!ISDIGIT(ecp->cp[0]) && in ex_line()
2012 ecp->cp[0] != '+' && ecp->cp[0] != '-' && in ex_line()
2013 ecp->cp[0] != '^')) in ex_line()
2015 if (!ISDIGIT(ecp->cp[0]) && in ex_line()
2016 !ISDIGIT(ecp->cp[1])) { in ex_line()
2017 total += ecp->cp[0] == '+' ? 1 : -1; in ex_line()
2018 --ecp->clen; in ex_line()
2019 ++ecp->cp; in ex_line()
2021 if (ecp->cp[0] == '-' || in ex_line()
2022 ecp->cp[0] == '^') { in ex_line()
2023 ++ecp->cp; in ex_line()
2024 --ecp->clen; in ex_line()
2031 ecp->cp, &endp, 10)) != NUM_OK || in ex_line()
2038 total += isneg ? -val : val; in ex_line()
2039 ecp->clen -= (endp - ecp->cp); in ex_line()
2040 ecp->cp = endp; in ex_line()
2051 if (-total > mp->lno) { in ex_line()
2058 if (!NPFITS(MAX_REC_NUMBER, mp->lno, total)) { in ex_line()
2063 mp->lno += total; in ex_line()
2070 * ex_load --
2086 for (gp = sp->gp;;) { in ex_load()
2087 ecp = SLIST_FIRST(gp->ecq); in ex_load()
2089 /* Discard the allocated source name as requested. */ in ex_load()
2091 free(ecp->if_name); in ex_load()
2097 if (ecp == &gp->excmd) { in ex_load()
2098 ecp->if_name = NULL; in ex_load()
2103 * ecp->clen will be 0 for the first discarded command, but in ex_load()
2109 if (ecp->clen != 0) in ex_load()
2116 if (FL_ISSET(ecp->agv_flags, AGV_ALL)) { in ex_load()
2118 while ((rp = TAILQ_FIRST(ecp->rq)) != NULL) in ex_load()
2119 if (rp->start > rp->stop) { in ex_load()
2120 TAILQ_REMOVE(ecp->rq, rp, q); in ex_load()
2130 if (FL_ISSET(ecp->agv_flags, in ex_load()
2131 AGV_GLOBAL | AGV_V) && ecp->range_lno != OOBLNO) { in ex_load()
2132 if (db_exist(sp, ecp->range_lno)) in ex_load()
2133 sp->lno = ecp->range_lno; in ex_load()
2135 if (db_last(sp, &sp->lno)) in ex_load()
2137 if (sp->lno == 0) in ex_load()
2138 sp->lno = 1; in ex_load()
2141 free(ecp->o_cp); in ex_load()
2145 SLIST_REMOVE_HEAD(gp->ecq, q); in ex_load()
2155 ecp->cp = ecp->o_cp; in ex_load()
2156 MEMCPY(ecp->cp, ecp->cp + ecp->o_clen, ecp->o_clen); in ex_load()
2157 ecp->clen = ecp->o_clen; in ex_load()
2158 ecp->range_lno = sp->lno = rp->start++; in ex_load()
2160 if (FL_ISSET(ecp->agv_flags, AGV_GLOBAL | AGV_V)) in ex_load()
2166 * ex_discard --
2180 for (gp = sp->gp;;) { in ex_discard()
2181 ecp = SLIST_FIRST(gp->ecq); in ex_discard()
2183 free(ecp->if_name); in ex_discard()
2185 if (ecp == &gp->excmd) in ex_discard()
2187 if (FL_ISSET(ecp->agv_flags, AGV_ALL)) { in ex_discard()
2188 while ((rp = TAILQ_FIRST(ecp->rq)) != NULL) { in ex_discard()
2189 TAILQ_REMOVE(ecp->rq, rp, q); in ex_discard()
2192 free(ecp->o_cp); in ex_discard()
2194 SLIST_REMOVE_HEAD(gp->ecq, q); in ex_discard()
2198 ecp->if_name = NULL; in ex_discard()
2199 ecp->clen = 0; in ex_discard()
2204 * ex_unknown --
2205 * Display an unknown command name.
2208 ex_unknown(SCR *sp, CHAR_T *cmd, size_t len) in ex_unknown() argument
2215 MEMCPY(bp, cmd, len); in ex_unknown()
2224 * ex_is_abbrev -
2232 ex_is_abbrev(CHAR_T *name, size_t len) in ex_is_abbrev() argument
2236 return ((cp = ex_comm_search(name, len)) != NULL && in ex_is_abbrev()
2241 * ex_is_unmap -
2249 ex_is_unmap(CHAR_T *name, size_t len) in ex_is_unmap() argument
2257 if (name[len - 1] != '!') in ex_is_unmap()
2259 --len; in ex_is_unmap()
2260 return ((cp = ex_comm_search(name, len)) != NULL && in ex_is_unmap()
2265 * ex_comm_search --
2266 * Search for a command name.
2269 ex_comm_search(CHAR_T *name, size_t len) in ex_comm_search() argument
2273 for (cp = cmds; cp->name != NULL; ++cp) { in ex_comm_search()
2274 if (cp->name[0] > name[0]) in ex_comm_search()
2276 if (cp->name[0] != name[0]) in ex_comm_search()
2278 if (STRLEN(cp->name) >= len && in ex_comm_search()
2279 !MEMCMP(name, cp->name, len)) in ex_comm_search()
2286 * ex_badaddr --
2315 if (sp->ep == NULL) { in ex_badaddr()
2316 ex_wemsg(sp, cp ? cp->name : NULL, EXM_NOFILEYET); in ex_badaddr()
2341 msgq_wstr(sp, M_ERR, cp->name, in ex_badaddr()
2350 * ex_comlog --
2358 TRACE(sp, "ecmd: "WS, ecp->cmd->name);
2359 if (ecp->addrcnt > 0) {
2360 TRACE(sp, " a1 %d", ecp->addr1.lno);
2361 if (ecp->addrcnt > 1)
2362 TRACE(sp, " a2: %d", ecp->addr2.lno);
2364 if (ecp->lineno)
2365 TRACE(sp, " line %d", ecp->lineno);
2366 if (ecp->flags)
2367 TRACE(sp, " flags 0x%x", ecp->flags);
2368 if (FL_ISSET(ecp->iflags, E_C_BUFFER))
2369 TRACE(sp, " buffer "WC, ecp->buffer);
2370 if (ecp->argc) {
2371 int cnt; local
2372 for (cnt = 0; cnt < ecp->argc; ++cnt)
2373 TRACE(sp, " arg %d: {"WS"}", cnt, ecp->argv[cnt]->bp);