|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T o
Length: 3623 (0xe27)
Types: TextFile
Names: »or_std2or.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Lib/or/or_std2or.c«
/* or_std2or.c: convert standard or representation to tree */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/or/RCS/or_std2or.c,v 5.0 90/09/20 16:08:46 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Lib/or/RCS/or_std2or.c,v 5.0 90/09/20 16:08:46 pp Exp Locker: pp $
*
* $Log: or_std2or.c,v $
* Revision 5.0 90/09/20 16:08:46 pp
* rcsforce : 5.0 public release
*
*/
#include "or.h"
#include "util.h"
extern char or_error[];
/*
Input standard to form orname
*/
OR_ptr or_std2or (str)
char *str;
{
OR_ptr tree,
or;
char keybuf[LINESIZE],
valbuf[LINESIZE],
tbuf[LINESIZE],
*p,
*r;
int ortype,
firstpn;
PP_DBG (("or_util.c/or_std2or (%s)", str));
if (str == NULLCP)
return NULLOR;
tree = NULLOR;
if (str[0] == '/') {
/*
No implicit PN
*/
firstpn = FALSE;
p = &str[1];
}
else {
firstpn = TRUE;
p = str;
}
for (; *p != '\0';) {
r = keybuf;
for (; *p != '\0';) {
switch (*p) {
case '=':
if (firstpn) {
sprintf(or_error, "Bad PN syntax '%s'", str);
PP_LOG (LLOG_EXCEPTIONS,
("or_util.c/or_std2or: Bad PN syntax '%s'",
str));
return NULLOR;
}
p++;
break;
case '/':
if (!firstpn) {
PP_LOG (LLOG_EXCEPTIONS,
("or_util.c/or_std2or: Bad AV Syntax '%s'",
str));
sprintf(or_error, "Bad AV Syntax '%s'", str);
or_free (tree);
return NULLOR;
}
p++;
break;
case '$':
p++;
default:
*r++ = *p++;
continue;
}
break;
}
*r = '\0';
if (firstpn) {
tree = or_buildpn (keybuf);
if (*p == '\0')
return (tree);
firstpn = FALSE;
continue;
}
if (*p == '\0') {
if (keybuf[0] == '\0')
return (tree);
sprintf(or_error, "Prematurely terminated OR '%s'", str);
PP_LOG (LLOG_EXCEPTIONS,
("or_util.c/or_std2or: Prematurely termianted OR '%s'",
str));
or_free (tree);
return NULLOR;
}
r = valbuf;
for (; *p != '\0';) {
switch (*p) {
case '=':
PP_LOG (LLOG_EXCEPTIONS,
("or_util.c/or_std2or: Bad AV syntax '%s'",
str));
sprintf(or_error, "Bad AV syntax '%s'",str);
or_free (tree);
return NULLOR;
case '/':
break;
case '$':
p++;
default:
*r++ = *p++;
continue;
}
break;
}
*r = '\0';
if (*p++ != '/') {
PP_LOG (LLOG_EXCEPTIONS,
("or_util.c/or_std2or: Prematurely ended OR - no slash '%s'",
str));
sprintf(or_error, "Prematurely ended OR - no slash '%s'", str);
or_free (tree);
return NULLOR;
}
PP_DBG ((
"or_util.c/or_std2or: Component '%s' = '%s'", keybuf, valbuf));
/*
Process string from BACK to optimise or-add
*/
ortype = or_name2type (keybuf);
if (ortype != NOTOK) {
or = or_new (ortype, NULLCP, valbuf);
if ((tree = or_add (tree, or, TRUE)) == NULLOR)
return NULLOR;
continue;
}
if (lexequ (keybuf, "pn") == 0) {
tree = or_buildpn (valbuf);
continue;
}
(void) strncpy (tbuf, keybuf, 3);
tbuf[3] = '\0';
if ((strlen (keybuf) > 2) && lexequ (tbuf, "dd.") == 0) {
or = or_new (OR_DD, &keybuf[3], valbuf);
if ((tree = or_add (tree, or, TRUE)) == NULLOR)
return NULLOR;
continue;
}
/*
Might need new table if this becomes assymetrical
*/
if (or_ddvalid_chk (keybuf, &tbuf[0]) == OK) {
or = or_new (OR_DD, tbuf, valbuf);
if ((tree = or_add (tree, or, TRUE)) == NULLOR)
return NULLOR;
continue;
}
PP_LOG (LLOG_EXCEPTIONS,
("or_util/or_std2or: Unknown Key '%s'", keybuf));
sprintf(or_error, "Unknown Key '%s'", keybuf);
or_free (tree);
return NULLOR;
}
return tree;
}