int main (int argc, char const *const *argv, char const *const *envp) { unsigned int strict = el_getstrict() ; unsigned int b = 0 ; unsigned int n = 0 ; unsigned int sharp ; unsigned int i = 0 ; PROG = "shift" ; { subgetopt_t l = SUBGETOPT_ZERO ; for (;;) { register int opt = subgetopt_r(argc, argv, "n:b:", &l) ; if (opt == -1) break ; switch (opt) { case 'n' : if (!uint0_scan(l.arg, &n)) dieusage() ; i = 1 ; break ; case 'b' : if (!uint0_scan(l.arg, &b)) dieusage() ; i = 1 ; break ; default : dieusage() ; } } argc -= l.ind ; argv += l.ind ; } if (!argc) dieusage() ; if (i) i = 0 ; else n = 1 ; { char const *x = env_get2(envp, "#") ; if (!x) strerr_dienotset(100, "#") ; if (!uint0_scan(x, &sharp)) strerr_dieinvalid(100, "#") ; } /* Shift n args */ if (n > sharp) { if (strict) { char fmtn[UINT_FMT] ; char fmtsharp[UINT_FMT] ; fmtn[uint_fmt(fmtn, n)] = 0 ; fmtsharp[uint_fmt(fmtsharp, sharp)] = 0 ; if (strict == 1) strerr_warnwu5x("shift", " ", fmtn, " arguments: got ", fmtsharp) ; else strerr_diefu5x(100, "shift", " ", fmtn, " arguments: got ", fmtsharp) ; } n = sharp ; } /* Shift b blocks */ for (; i < b ; i++) { for (;;) { char const *x ; unsigned int base = n ; char fmt[UINT_FMT] ; fmt[uint_fmt(fmt, ++n)] = 0 ; if (n > sharp) { char fmti[UINT_FMT] ; fmti[uint_fmt(fmt, i)] = 0 ; strerr_diefu6x(100, "shift", " block ", fmti, ": too few arguments (", fmt, ")") ; } x = env_get2(envp, fmt) ; if (!x) strerr_dienotset(100, fmt) ; if ((x[0] == EXECLINE_BLOCK_END_CHAR) && (!EXECLINE_BLOCK_END_CHAR || !x[1])) break ; if ((x[0] != EXECLINE_BLOCK_QUOTE_CHAR) && strict) { char fmti[UINT_FMT] ; char fmtp[UINT_FMT] ; fmti[uint_fmt(fmti, i)] = 0 ; fmtp[uint_fmt(fmtp, n - base)] = 0 ; if (strict == 1) strerr_warnw6x("unquoted positional ", x, " at block ", fmti, " position ", fmtp) ; else strerr_dief6x(100, "unquoted positional ", x, " at block ", fmti, " position ", fmtp) ; } } } /* n = shift value; modify the env */ { register unsigned int i = 1 ; char fmt[UINT_FMT] ; fmt[uint_fmt(fmt, sharp - n)] = 0 ; if (!pathexec_env("#", fmt)) strerr_diefu1sys(111, "pathexec_env") ; for (; i <= sharp ; i++) { char fmu[UINT_FMT] ; fmt[uint_fmt(fmt, i)] = 0 ; fmu[uint_fmt(fmu, i + n)] = 0 ; if (!pathexec_env(fmt, i <= (sharp - n) ? env_get2(envp, fmu) : 0)) strerr_diefu1sys(111, "pathexec_env") ; } } pathexec(argv) ; strerr_dieexec(111, argv[0]) ; }
static int doit (char const *s, unsigned int len) { if (delimlen) { if (!len--) { switch (strictness) { case 1 : case 2 : strerr_warnw1x("empty line") ; break ; case 3 : buffer_flush(buffer_1) ; strerr_dief1x(100, "empty line") ; default : break ; } return 1 ; } if (byte_chr(delim, delimlen, *s) >= delimlen) { switch (strictness) { case 0 : return 0 ; case 1 : { strerr_warnw1x("invalid starting quote character") ; return 0 ; } case 2 : { char fmt[40] ; unsigned int n = len < 39 ? len+1 : 36 ; byte_copy(fmt, n, s) ; if (len >= 39) { byte_copy(fmt+n, 3, "...") ; n += 3 ; } fmt[n] = 0 ; strerr_warnw3x("invalid starting quote character", " in line: ", fmt) ; return 0 ; } case 3 : { buffer_flush(buffer_1) ; strerr_dief1x(100, "invalid starting quote character") ; } default : strerr_dief1x(101, "can't happen: unknown strictness") ; } } } { unsigned int r, w ; char d[len] ; if (!string_unquote_withdelim(d, &w, s + !!delimlen, len, &r, delim, delimlen)) { switch (strictness) { case 0 : return 0 ; case 1 : { strerr_warnwu1sys("unquote") ; return 0 ; } case 2 : { char fmt[40] ; unsigned int n = (len + !!delimlen) < 40 ? (len + !!delimlen) : 36 ; byte_copy(fmt, n, s) ; if ((len + !!delimlen) >= 40) { byte_copy(fmt+n, 3, "...") ; n += 3 ; } fmt[n] = 0 ; strerr_warnwu3sys("unquote", " line: ", fmt) ; return 0 ; } case 3 : { int e = errno ; buffer_flush(buffer_1) ; errno = e ; strerr_diefu1sys(100, "unquote") ; } default : strerr_dief1x(101, "can't happen: unknown strictness") ; } } if (delimlen) { if (r == len) { switch (strictness) { case 0 : return 0 ; case 1 : { strerr_warnwu2x("unquote", ": no ending quote character") ; return 0 ; } case 2 : { char fmt[40] ; unsigned int n = len < 40 ? len : 36 ; byte_copy(fmt, n, s) ; if (len >= 40) { byte_copy(fmt+n, 3, "...") ; n += 3 ; } fmt[n] = 0 ; strerr_warnwu5x("unquote", ": no ending quote character", " in ", "line: ", fmt) ; return 0 ; } case 3 : { int e = errno ; buffer_flush(buffer_1) ; errno = e ; strerr_diefu2x(100, "unquote", ": no ending quote character") ; } default : strerr_dief1x(101, "can't happen: unknown strictness") ; } } else if ((r < len-1) && (strictness >= 2)) { char fmtnum[UINT_FMT] ; char fmtden[UINT_FMT] ; char fmt[40] ; unsigned int n = len < 39 ? len+1 : 36 ; byte_copy(fmt, n, s) ; if (len >= 39) { byte_copy(fmt+n, 3, "...") ; n += 3 ; } fmt[n] = 0 ; fmtnum[uint_fmt(fmtnum, r+1)] = 0 ; fmtden[uint_fmt(fmtden, len)] = 0 ; strerr_warnw7x("found ending quote character at position ", fmtnum, "/", fmtden, ", ignoring remainder of ", "line: ", fmt) ; } } if (buffer_putalign(buffer_1, d, w) < (int)w) strerr_diefu1sys(111, "write to stdout") ; } return 1 ; }