#include "uucp.h"
#define LQUOTE '('
#define RQUOTE ')'
static char *bal();
char *
getprm(s, whsp, prm)
char *s, *whsp, *prm;
{
char *c;
char rightq;
char *beginning;
wchar_t ch;
int width;
beginning = prm;
while ((width = mbtowc(&ch, s, MB_CUR_MAX)) &&
iswspace(ch) || (ch == '\n')) {
if (whsp != (char *) NULL)
while (width--)
*whsp++ = *s++;
else
s += width;
}
if ( whsp != (char *) NULL )
*whsp = '\0';
while ((width = mbtowc(&ch, s, MB_CUR_MAX)) && ch) {
if (iswspace(ch) || ch == '\n' || ch == '\0') {
*prm = '\0';
return(prm == beginning ? NULL : s);
}
switch (ch) {
case '>':
if ((prm == beginning + 1) && (*beginning == '2'))
*prm++ = *s++;
if ((prm == beginning + 1) && (*beginning == '1'))
*beginning = *s++;
if (prm == beginning) {
width = mbtowc(&ch, s+1, MB_CUR_MAX);
if ((ch == '>') || (ch == '&'))
*prm++ = *s++;
*prm++ = *s++;
}
*prm = '\0';
return(s);
break;
case '<':
if ((prm == beginning + 1) && (*beginning == '0'))
*beginning = *s++;
if (prm == beginning) {
width = mbtowc(&ch, s+1, MB_CUR_MAX);
if (ch == '<') {
*prm++ = *s++;
*prm++ = *s++;
*prm = '\0';
return (s);
}
*prm++ = *s++;
}
case '|':
case ';':
case '&':
case '^':
case '\\':
if (prm == beginning)
*prm++ = *s++;
*prm = '\0';
return(s);
break;
case '\'':
case '(':
case '`':
case '"':
if (prm == beginning) {
rightq = ( *s == '(' ? ')' : *s );
c = bal(s, rightq);
(void) strncpy(prm, s, c-s+1);
prm += c - s + 1;
if ( *(s=c) == rightq)
s++;
}
*prm = '\0';
return(s);
break;
default:
while (width--)
*prm++ = *s++;
}
}
*prm = '\0';
return(prm == beginning ? NULL : s);
}
static char *
bal(s, r)
char *s;
char r;
{
int width;
wchar_t ch;
short count = 1;
char l;
for (l = *s++; *s; s+=width) {
width = mbtowc(&ch, s, MB_CUR_MAX);
if (*s == r) {
if (--count == 0)
break;
}
else if (*s == l)
count++;
}
return(s);
}
int
split(arg, sys, fwd, file)
char *arg, *sys, *fwd, *file;
{
wchar_t *cl, *cr, *n;
int retval = 0;
wchar_t wcbuf[MAXFULLNAME];
wchar_t tmpbuf[MAXFULLNAME];
wchar_t myname[MAXFULLNAME];
*sys = *file = NULLCHAR;
if ( fwd != (char *) NULL )
*fwd = NULLCHAR;
if (EQUALS(Progname,"uux") && (*arg == LQUOTE)) {
char *c;
c = bal(arg++, RQUOTE);
(void) strncpy(file, arg, c-arg);
file[c-arg] = NULLCHAR;
return(retval);
}
mbstowcs(myname, Myname, MAXFULLNAME);
mbstowcs(wcbuf, arg, MAXFULLNAME);
for (n=wcbuf ;; n=cl+1) {
cl = wcschr(n, (wchar_t)'!');
if (cl == NULL) {
(void) wcstombs(file, n, MAXFULLNAME);
return(retval);
}
retval = 1;
if (cl == n)
continue;
if (WEQUALSN(myname, n, cl - n) && myname[cl - n] == NULLCHAR)
continue;
(void) wcsncpy(tmpbuf, n, cl-n);
tmpbuf[cl-n] = NULLCHAR;
(void) wcstombs(sys, tmpbuf, MAXFULLNAME);
if (fwd != (char *) NULL) {
if (cl != (cr = wcsrchr(n, (wchar_t)'!'))) {
wcsncpy(tmpbuf, cl+1, cr-cl-1);
tmpbuf[cr-cl-1] = '\0';
(void) wcstombs(fwd, tmpbuf, MAXFULLNAME);
}
} else {
cr = cl;
}
(void) wcstombs(file, cr+1, MAXFULLNAME);
return(retval);
}
}