V10/cmd/uucp/getprm.c
/* /sccs/src/cmd/uucp/s.getprm.c
getprm.c 1.4 8/30/84 17:37:22
*/
#include "uucp.h"
VERSION(@(#)getprm.c 1.4)
#define LQUOTE '('
#define RQUOTE ')'
#define ZERO 0
#define WHITE 1
#define DELIMIT 2
#define QUOTE 3
#define OTHER 9
extern char *bal();
/*
* get next parameter from s
* s -> string to scan
* prm -> pointer to use to return token
* return:
* s -> pointer to next character
* NULL at end
*/
char *
getprm(s, prm)
register char *s, *prm;
{
register char *c;
char rightq; /* the right quote character */
/* skip white space */
while (charType(*s) == WHITE)
s++;
*prm = '\0';
if (*s == '\0')
return(NULL);
if (charType(*s) == DELIMIT) {
*prm++ = *s++;
*prm = '\0';
return(s);
}
/* look for quoted argument */
if (charType(*s) == QUOTE) {
/* setup the right quote character */
if (*s == LQUOTE)
rightq = RQUOTE;
else
rightq = *s;
c = bal(s, rightq);
(void) strcpy(prm, s, c-s+1);
prm[c-s+1] = '\0';
if ( *(s=c) == rightq) /* if end of string don't increment */
s++;
return(s);
}
while (charType(*s) == OTHER)
*prm++ = *s++;
*prm = '\0';
return(s);
}
/*
* split name into system and file part
* name -> string to scan
* sys -> return area for system name
* rest -> return area for remainder
* return:
* 0 -> no system prefix
* TRUE -> system prefix return in sys
*/
split(name, sys, rest)
register char *name;
char *sys, *rest;
{
register char *c, *n;
*sys = '\0';
if (*name == LQUOTE) {
c = bal(name, RQUOTE);
name++;
(void) strncpy(rest, name, c-name);
rest[c-name] = '\0';
return(0);
}
for (n = name ;; n = c+1) { /* loop to get rid if initial Mynames */
if ((c = strchr(n, '!')) == NULL) {
(void) strcpy(rest, n);
return(0);
}
/* ignore escaped '!' */
if ((c != n) && (*(c-1) == '\\')) {
*(c-1) = '\0';
(void) strcpy(rest, n);
(void) strcat(rest, c);
return(0);
}
*c = '\0';
if (EQUALS(n, Myname)) /* initial system is Myname */
continue;
(void) strcpy(sys, n);
(void) strcpy(rest, ++c);
return(TRUE);
}
/*NOTREACHED*/
}
/*
* bal - get balanced quoted string
*
* s - input string
* r - right quote
* Note: *s is the left quote
* return:
* pointer to the end of the quoted string
* Note:
* If the string is not balanced, it returns a pointer to the
* end of the string.
*/
char *
bal(s, r)
register char *s;
char r;
{
short count = 1;
char l; /* left quote character */
for (l = *s++; *s; s++) {
if (*s == r) {
if (--count == 0)
break; /* this is the balanced end */
}
else if (*s == l)
count++;
}
return(s);
}
/*
* charType - classify type of character , white space, delimiter, other
*
* s - character
* return:
* WHITE - whitespace
* DELIMIT - delimiter
* QUOTE - some type of quote "'(`
* OTHER - other
*/
charType(s)
char s;
{
switch(s) {
case '>':
case '<':
case '|':
case ';':
case '&':
case '^':
case '\\':
return(DELIMIT);
case ' ':
case '\t':
case '\n':
return(WHITE);
case '\0':
return(ZERO);
case '"':
case '\'':
case '`':
case LQUOTE:
return(QUOTE);
default:
return(OTHER);
}
}