Hello, In vi, cs_next() always returns zero so don't check its return value. cs.cs_flags is always checked afterwards; cs.cs_flags seems to be the effective return value.
I didn't change two invocations in v_word.c where cs_next() is 2nd operand in && expression and might be skipped. - Michael Index: vi/getc.c =================================================================== RCS file: /cvs/src/usr.bin/vi/vi/getc.c,v retrieving revision 1.10 diff -u -p -u -r1.10 getc.c --- vi/getc.c 6 Jan 2016 22:28:52 -0000 1.10 +++ vi/getc.c 27 Apr 2017 03:20:35 -0000 @@ -123,8 +123,7 @@ cs_fspace(SCR *sp, VCS *csp) if (csp->cs_flags != 0 || !isblank(csp->cs_ch)) return (0); for (;;) { - if (cs_next(sp, csp)) - return (1); + cs_next(sp, csp); if (csp->cs_flags != 0 || !isblank(csp->cs_ch)) break; } @@ -141,8 +140,7 @@ int cs_fblank(SCR *sp, VCS *csp) { for (;;) { - if (cs_next(sp, csp)) - return (1); + cs_next(sp, csp); if (csp->cs_flags == CS_EOL || csp->cs_flags == CS_EMP || (csp->cs_flags == 0 && isblank(csp->cs_ch))) continue; Index: vi/v_sentence.c =================================================================== RCS file: /cvs/src/usr.bin/vi/vi/v_sentence.c,v retrieving revision 1.7 diff -u -p -u -r1.7 v_sentence.c --- vi/v_sentence.c 12 Nov 2014 04:28:41 -0000 1.7 +++ vi/v_sentence.c 27 Apr 2017 03:20:35 -0000 @@ -82,14 +82,12 @@ v_sentencef(SCR *sp, VICMD *vp) } for (state = NONE;;) { - if (cs_next(sp, &cs)) - return (1); + cs_next(sp, &cs); if (cs.cs_flags == CS_EOF) break; if (cs.cs_flags == CS_EOL) { if ((state == PERIOD || state == BLANK) && --cnt == 0) { - if (cs_next(sp, &cs)) - return (1); + cs_next(sp, &cs); if (cs.cs_flags == 0 && isblank(cs.cs_ch) && cs_fblank(sp, &cs)) return (1); @@ -273,8 +271,7 @@ ret: slno = cs.cs_lno; * and special characters. */ do { - if (cs_next(sp, &cs)) - return (1); + cs_next(sp, &cs); } while (!cs.cs_flags && (cs.cs_ch == ')' || cs.cs_ch == ']' || cs.cs_ch == '"' || cs.cs_ch == '\'')); Index: vi/v_word.c =================================================================== RCS file: /cvs/src/usr.bin/vi/vi/v_word.c,v retrieving revision 1.7 diff -u -p -u -r1.7 v_word.c --- vi/v_word.c 12 Nov 2014 04:28:41 -0000 1.7 +++ vi/v_word.c 27 Apr 2017 03:20:35 -0000 @@ -140,8 +140,7 @@ fword(SCR *sp, VICMD *vp, enum which typ if (type == BIGWORD) while (cnt--) { for (;;) { - if (cs_next(sp, &cs)) - return (1); + cs_next(sp, &cs); if (cs.cs_flags == CS_EOF) goto ret; if (cs.cs_flags != 0 || isblank(cs.cs_ch)) @@ -172,8 +171,7 @@ fword(SCR *sp, VICMD *vp, enum which typ state = cs.cs_flags == 0 && inword(cs.cs_ch) ? INWORD : NOTWORD; for (;;) { - if (cs_next(sp, &cs)) - return (1); + cs_next(sp, &cs); if (cs.cs_flags == CS_EOF) goto ret; if (cs.cs_flags != 0 || isblank(cs.cs_ch)) @@ -276,8 +274,7 @@ eword(SCR *sp, VICMD *vp, enum which typ * past the current one, it sets word "state" for the 'e' command. */ if (cs.cs_flags == 0 && !isblank(cs.cs_ch)) { - if (cs_next(sp, &cs)) - return (1); + cs_next(sp, &cs); if (cs.cs_flags == 0 && !isblank(cs.cs_ch)) goto start; } @@ -293,8 +290,7 @@ eword(SCR *sp, VICMD *vp, enum which typ start: if (type == BIGWORD) while (cnt--) { for (;;) { - if (cs_next(sp, &cs)) - return (1); + cs_next(sp, &cs); if (cs.cs_flags == CS_EOF) goto ret; if (cs.cs_flags != 0 || isblank(cs.cs_ch)) @@ -322,8 +318,7 @@ start: if (type == BIGWORD) state = cs.cs_flags == 0 && inword(cs.cs_ch) ? INWORD : NOTWORD; for (;;) { - if (cs_next(sp, &cs)) - return (1); + cs_next(sp, &cs); if (cs.cs_flags == CS_EOF) goto ret; if (cs.cs_flags != 0 || isblank(cs.cs_ch))