|
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: 4223 (0x107f) Types: TextFile Names: »or_search.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_search.c«
/* or_search.c: misc functions to do with locating or bits */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/or/RCS/or_search.c,v 5.0 90/09/20 16:08:42 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Lib/or/RCS/or_search.c,v 5.0 90/09/20 16:08:42 pp Exp Locker: pp $ * * $Log: or_search.c,v $ * Revision 5.0 90/09/20 16:08:42 pp * rcsforce : 5.0 public release * */ #include "or.h" #include "util.h" /* --------------------- Begin Routines -------------------------------- */ OR_ptr or_lastpart (or) OR_ptr or; { PP_DBG (("or_util.c/or_lastpart()")); if (or == NULLOR) return NULLOR; while (or -> or_next != NULLOR) or = or -> or_next; return or; } OR_ptr or_find (tree, type, ddname) OR_ptr tree; int type; char *ddname; { OR_ptr ptr; PP_DBG (("or_util.c/or_find()")); for (ptr = tree; ptr != NULLOR; ptr = ptr -> or_next) if (ptr -> or_type == type) if (ptr -> or_type != OR_DD || ddname == NULLCP) return ptr; else if (lexequ (ptr -> or_ddname, ddname) == 0) return ptr; return NULLOR; } int or_cmp (or1, or2) OR_ptr or1; OR_ptr or2; { PP_DBG (("or_util.c/or_cmp: ('%d', '%s', '%s') ('%d', '%s', '%s')", or1 -> or_type, or1 -> or_ddname, or1 -> or_value, or2 -> or_type, or2 -> or_ddname, or2 -> or_value)); if (or1 -> or_type != or2 -> or_type || lexequ (or1 -> or_value, or2 -> or_value) != 0) return FALSE; if (or1 -> or_type == OR_DD && lexequ (or1 -> or_ddname, or2 -> or_ddname) != 0) return FALSE; return TRUE; } /* --- *** --- or_locate: given a or tree, find the first component of the specified type. --- *** --- */ OR_ptr or_locate (or, type) OR_ptr or; int type; { register OR_ptr orp; PP_DBG (("Lib/or/or_locate (%d)", type)); for (orp = or; orp != NULLOR && or -> or_type <= type; orp = orp -> or_next) if (orp -> or_type == type) return orp; return NULLOR; } /* --- *** --- or_value: given an or tree, return the value of the first element of a given type. --- *** --- */ char* or_value (or, type) OR_ptr or; int type; { register OR_ptr orp; PP_DBG (("Lib/or/or_value (%d)", type)); for (orp = or; orp != NULLOR && or -> or_type <= type; orp = orp -> or_next) if (type == orp -> or_type) return (orp -> or_value); return NULLCP; } /* --- *** --- or_add_atsigns: For any missing OR Components insert that component as a NULL ("@") attribute --- *** --- */ int or_add_atsigns (orp) OR_ptr *orp; { OR_ptr or, old, new; int type; PP_DBG (("Lib/or_add_atsigns()")); old = *orp; or = new = NULLOR; if (old == NULLOR) { PP_LOG (LLOG_EXCEPTIONS, ("Lib/or_add_atsigns - No OR specified")); return NOTOK; } for (type = OR_C; type < OR_OU; type++) { /* -- add the attribute as NULL ("@") -- */ if ((or = or_find (old, type, NULLCP)) == NULLOR) or = or_new (type, NULLCP, "@"); else old = old -> or_next; if ((new = or_add (new, or, TRUE)) == NULLOR) return NOTOK; if (old == NULLOR) break; } for (;;) { if (old == NULLOR) break; if (old -> or_type < OR_OU) continue; or = old; old = old -> or_next; if (or_add (new, or, FALSE) == NULLOR) return NOTOK; } *orp = new; return OK; } /* --- *** --- or_delete_atsigns: For any NULL OR Components delete that component --- *** --- */ int or_delete_atsigns (ptr) OR_ptr *ptr; { OR_ptr old, top, or, bk, fw, rm; PP_DBG (("Lib/or_delete_atsigns()")); old = top = *ptr; if (old == NULLOR) { PP_LOG (LLOG_EXCEPTIONS, ("Lib/or_delete_atsigns - No OR specified")); return NOTOK; } for (or = old; or; or = fw) { bk = or -> or_prev; fw = or -> or_next; rm = or; if (or -> or_type >= OR_OU) break; if (lexequ (or -> or_value, "@") == 0) { if (bk) { bk -> or_next = fw; if (or == *ptr || (lexequ (top -> or_value, "@") == 0)) top = fw; } else top = fw; fw -> or_prev = bk; rm -> or_next = rm -> or_prev = NULLOR; or_free (rm); } } *ptr = top; return OK; }