V10/cmd/spitbol/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;
}