long
getpage(void)
{
char *src = buf;
int lcount = 0;
for (;;) {
if (nchsrc <= 0) {
src = Read(src);
if (nchsrc <= 0)
return src - buf;
}
do switch (--nchsrc, *src++) {
case '\n':
if (++lcount >= nlpage) {
if (nchsrc <= 0)
src = Read(src);
if (nchsrc > 0 && *src == '\014')
--nchsrc, ++src;
return src - buf;
}
break;
case '\014':
return src - buf;
} while (nchsrc > 0);
}
}
long
gettrpage(void)
{
char *src = buf;
long lcount = 0;
for (;;) {
if (nchsrc <= 0) {
src = Read(src);
if (nchsrc <= 0)
return src - buf;
}
do switch (--nchsrc, *src++) {
case '\n':
if (lcount++ == 0 && buf[0] == 'p') {
pageno = atoi(buf+1);
/*if (debug)
fprint(2, "\"%8.8s\" %d\n", buf, pageno);*/
}
if (nchsrc <= 0)
src = Read(src);
if (nchsrc > 0 && *src == 'p')
return src - buf;
} while (nchsrc > 0);
}
}
int
minuso(char *str, Olist **op)
{
int n = 0, c;
int dash = 0, min = -999999, digits = 0;
Olist *o;
o = 0;
if (str) do switch (c = *str++) {
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
case '8': case '9':
++digits;
n = 10*n + c - '0';
break;
case '-':
if (digits)
min = n;
++dash; digits = 0; n = 0;
break;
case ',':
case '\0':
if (dash || digits) {
o = malloc(sizeof(Olist));
o->next = *op;
*op = o;
}
if (dash) {
o->min = min;
o->max = digits ? n : 999999;
} else if (digits) {
o->min = n;
o->max = n;
}
min = -999999;
dash = n = digits = 0;
break;
default:
return -1;
} while (c);
return 0;
}
int
inrange(int n, Olist **op)
{
Olist *o;
Olist *prev;
for (prev=0, o=*op; o; prev=o, o=o->next) {
if (o->min <= n && n <= o->max) {
if (prev) {
prev->next = o->next;
o->next = *op;
*op = o;
}
return (modflag < 0) || (n%2 == modflag);
}
}
return 0;
}
int
Open(void)
{
int infd = -1;
while (--Argc > 0) {
if (strcmp("-",*++Argv) == 0)
infd = 0;
else
infd = open(*Argv, OREAD);
if (infd >= 0)
break;
fprint(2, "cannot open %s\n", *Argv);
}
return infd;
}
char *
Read(char *cur)
{
char *p = cur + nchsrc;
int nbuf = p - buf;
if (bufsiz - nbuf < BSIZE) {
buf = realloc(buf, (unsigned int)(bufsiz += BSIZE));
if (!buf)
fatal("cannot realloc input buffer", "");
p = buf + nbuf;
cur = p - nchsrc;
}
while ((nbuf = read(infd, p, BSIZE)) <= 0) {
if (infd)
close(infd);
if ((infd = Open()) < 0)
break;
}
if (nbuf > 0)
nchsrc += nbuf;
return cur;
}
void
checkopts(int argc, char **argv)
{
int i, pass, stop;
char *p;
while (--argc > 0 && (*++argv)[0] == '-' && (i = (*argv)[1]) != '-') {
if (strchr(stopopt.flags, i))
continue;
if (strchr(passopt.flags, i) || strchr(classopt->flags, i))
continue;
stop = strchr(stopopt.parms, i) != 0;
pass = strchr(passopt.parms, i) || strchr(classopt->parms, i);
if (!stop && !pass)
fatal("unknown option ", *argv);
p = (*argv)[2] ? *argv+2 : argc>1 ? (--argc,*++argv) : 0;
if (!p)
fatal("flag requires value: ", *argv);
if (stop)
continue;
if (strchr(p, '\n'))
fatal("string may not contain newline: ", p);
}
}
void
putopts(int argc, char **argv)
{
int i; long t;
char *p;
Bprint(&outb, "-?%c\n", class);
if (!oddball)
Bprint(&outb, "-0%13.13d\n", 0);
if (p = filestr("/etc/whoami"))
Bprint(&outb, "-U%s\n", p);
if (!Hflag) {
t = time((long *)0);
Bprint(&outb, "-W%s", ctime(t));
Bprint(&outb, "-u%s\n", username);
}
while (--argc > 0 && (*++argv)[0] == '-' && (i = (*argv)[1]) != '-') {
if (strchr(stopopt.flags, i))
continue;
if (strchr(passopt.flags, i) || strchr(classopt->flags, i)) {
Bprint(&outb, "-%c\n", i);
continue;
}
p = (*argv)[2] ? *argv+2 : argc>1 ? (--argc,*++argv) : 0;
if (strchr(stopopt.parms, i) == 0)
Bprint(&outb, "-%c%s\n", i, p);
}
Bprint(&outb, "--\n");
nchout = Bseek(&outb, 0, 1);
if (debug)
fprint(2, "putopts: nchout=%d\n", nchout);
}
Option *
classoptf(int arg)
{
char buf[2];
int i = arg;
if ((i -= 'a') < 0 || i >= sizeof optindex || !(i = optindex[i])) {
buf[0] = arg;
buf[1] = 0;
fatal("unknown service class ", buf);
}
return &classopts[i-1];
}