V10/cmd/spitbol/ocint/sioarg.c
/*
sioarg( ioflg,ioptr,scptr ) scans any arguments after the
filename and sets appropriate values in the passed ioblk.
ioflg 0 - input / 3 - output association
ioptr -> ioblk
*/
#include "spitblks.h"
#include "spitio.h"
int sioarg( ioflg,ioptr,scptr )
int ioflg;
struct ioblk *ioptr;
struct scblk *scptr;
{
int cnt, lastdash = 0, strlen, v;
int lenfnm(), scnint();
char chr, *cp, tab = 011;
cp = scptr -> str;
ioptr -> typ = 0;
ioptr -> len = RECSIZ;
ioptr -> pid = BUFSIZ;
ioptr -> fdn = 0;
ioptr -> flg = ioflg ? IO_OUP : IO_INP;
if ( (cnt = lenfnm( scptr )) < 0 )
return -1;
strlen = scptr -> len;
while ( cnt < strlen ) {
chr = *(cp + cnt++);
if ( (chr == ' ') || (chr == tab) ) {
lastdash = 0;
continue;
}
if ( chr == '-' ) {
if ( lastdash != 0 ) {
return ( -1 );
} else {
lastdash = 1;
continue;
}
}
switch ( chr ) {
case 'a':
case 'A':
ioptr -> flg |= IO_APP;
break;
case 'b':
case 'B':
v = scnint( cp + cnt,strlen - cnt,&cnt );
if ( v > 0 ) {
ioptr -> pid = v;
} else {
return -1;
}
break;
case 'c':
case 'C':
ioptr -> len = -1;
break;
case 'f':
case 'F':
v = scnint( cp + cnt,strlen - cnt,&cnt );
ioptr -> fdn = v;
ioptr -> flg |= ( IO_OPN | IO_SYS );
if ( testty( v ) == 0 )
ioptr -> flg |= IO_WRC;
break;
case 'l':
case 'L':
v = scnint( cp + cnt,strlen - cnt,&cnt );
if ( v > 0 ) {
ioptr -> len = v;
} else {
return -1;
}
break;
case 'r':
case 'R':
v = scnint( cp + cnt,strlen - cnt,&cnt );
if ( v > 0 ) {
ioptr -> len = -v;
} else {
return -1;
}
break;
case 'w':
case 'W':
ioptr -> flg |= IO_WRC;
break;
default:
return -1;
}
ioptr -> typ = 1;
lastdash = 0;
}
return 0;
}
/*
scnint( str,len ) scans an integer starting at the front of
str. in no case can the scan go more than len digits.
*/
int scnint( str,len,intptr )
char *str;
int len;
int *intptr;
{
int i = 0, n = 0;
char chr;
while ( i < len ) {
chr = *(str + i++);
if ( (chr >= '0') && (chr <= '9')) {
n = 10 * n + chr - '0';
} else {
--i;
break;
}
}
*intptr += i;
return n;
}