(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP")
(FILECREATED " 5-Aug-88 17:07:44" {QV}<NOTECARDS>1.3LNEXT>PMIPATCH102.;2 4235
changes to%: (VARS PMIPATCH102COMS)
(FNS RECURSIVE.COLLECTDESCENDENTS COLLECTDESCENDENTS NC.MakeBrowserCard)
previous date%: " 5-Aug-88 13:36:56" {QV}<NOTECARDS>1.3LNEXT>PMIPATCH102.;1)
(* "
Copyright (c) 1988 by Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT PMIPATCH102COMS)
(RPAQQ PMIPATCH102COMS (
(* ;;; "New file")
(DECLARE%: DONTCOPY (PROPS (PMIPATCH102 MAKEFILE-ENVIRONMENT)
(PMIPATCH102 FILETYPE)))
[DECLARE%: FIRST (P (NC.LoadFileFromDirectories 'GRAPHERPATCH]
(* ;; "pmi 8/5/88: Fixes bug in PMIPATCH099. ")
(* ;; "Changed in GRAPHERPATCH")
(FNS RECURSIVE.COLLECTDESCENDENTS COLLECTDESCENDENTS)))
(* ;;; "New file")
(DECLARE%: DONTCOPY
(PUTPROPS PMIPATCH102 MAKEFILE-ENVIRONMENT (:PACKAGE "INTERLISP" :READTABLE "INTERLISP"))
(PUTPROPS PMIPATCH102 FILETYPE :BCOMPL)
)
(DECLARE%: FIRST
(NC.LoadFileFromDirectories 'GRAPHERPATCH)
)
(* ;; "pmi 8/5/88: Fixes bug in PMIPATCH099. ")
(* ;; "Changed in GRAPHERPATCH")
(DEFINEQ
(RECURSIVE.COLLECTDESCENDENTS
[LAMBDA (Node Graph) (* ; "Edited 5-Aug-88 16:06 by pmi")
(* ;; "Collect all descendents of Node in Graph.")
(* ;;
"pmi 8/2/88: Changed to break infinite recursion on circular graphs. Now marks nodes as visited.")
(* ;; "pmi 8/5/88: FIxes bug introduced by previous fix.")
(LET (NodeId)
(* ;; "Node's NODEID may be a list if it is a virtual node. ")
(if (LISTP (SETQ NodeId (fetch (GRAPHNODE NODEID) of Node)))
then (SETQ NodeId (CAR NodeId)))
(NC.GraphNodeIDPutProp NodeId 'Visited T)
(for ChildNode in (COLLECT.CHILD.NODES Node Graph) bind ChildNodeID
when [PROGN (SETQ ChildNodeID (fetch (GRAPHNODE NODEID) of ChildNode))
(* ;; "This node has not been visited, and it is not a virtual node.")
(NOT (NC.GraphNodeIDGetProp (if (LISTP ChildNodeID)
then (CAR ChildNodeID)
else ChildNodeID)
'Visited] join (CONS ChildNode (RECURSIVE.COLLECTDESCENDENTS
ChildNode Graph])
(COLLECTDESCENDENTS
[LAMBDA (Node Graph) (* ; "Edited 5-Aug-88 15:40 by pmi")
(* ;; "pmi 8/3/88: Created to wrap RESETLST around call to RECURSIVE.COLLECTDESCENDENTS. Prevents infinite looping on circular graph structures by marking where we have been.")
(* ;; "Clean up the Visited markers placed on the nodes traversed.")
(* ;; "pmi 8/5/88: Now also cleans up Visited marker on Node.")
(LET (NodeID Descendents)
(RESETLST [RESETSAVE
NIL
'(PROGN (for VisitedNode in (CONS Node Descendents) bind VisitedNodeID
do (NC.GraphNodeIDPutProp (if (LISTP (SETQ VisitedNodeID
(fetch (GRAPHNODE NODEID)
of VisitedNode)))
then (CAR VisitedNodeID)
else VisitedNodeID)
'Visited NIL]
(SETQ Descendents (RECURSIVE.COLLECTDESCENDENTS Node Graph])
)
(PUTPROPS PMIPATCH102 COPYRIGHT ("Xerox Corporation" 1988))
(DECLARE%: DONTCOPY
(FILEMAP (NIL (1395 4152 (RECURSIVE.COLLECTDESCENDENTS 1405 . 2846) (COLLECTDESCENDENTS 2848 . 4150)))
))
STOP