|
Graphviz 2.29.20120208.0545
|
00001 /* $Id$ $Revision$ */ 00002 /* vim:set shiftwidth=4 ts=8: */ 00003 00004 /************************************************************************* 00005 * Copyright (c) 2011 AT&T Intellectual Property 00006 * All rights reserved. This program and the accompanying materials 00007 * are made available under the terms of the Eclipse Public License v1.0 00008 * which accompanies this distribution, and is available at 00009 * http://www.eclipse.org/legal/epl-v10.html 00010 * 00011 * Contributors: See CVS logs. Details at http://www.graphviz.org/ 00012 *************************************************************************/ 00013 00014 00015 #include <nodeset.h> 00016 00017 00018 static nsitem_t *mkItem(Dt_t * d, nsitem_t * obj, Dtdisc_t * disc) 00019 { 00020 nsitem_t *ap = GNEW(nsitem_t); 00021 00022 ap->np = obj->np; 00023 return ap; 00024 } 00025 00026 static void freeItem(Dt_t * d, nsitem_t * obj, Dtdisc_t * disc) 00027 { 00028 free(obj); 00029 } 00030 00031 static int 00032 cmpItem(Dt_t * d, Agnode_t ** key1, Agnode_t ** key2, Dtdisc_t * disc) 00033 { 00034 if (*key1 > *key2) 00035 return 1; 00036 else if (*key1 < *key2) 00037 return -1; 00038 else 00039 return 0; 00040 } 00041 00042 static Dtdisc_t nodeDisc = { 00043 offsetof(nsitem_t, np), /* key */ 00044 sizeof(Agnode_t *), /* size */ 00045 offsetof(nsitem_t, link), /* link */ 00046 (Dtmake_f) mkItem, 00047 (Dtfree_f) freeItem, 00048 (Dtcompar_f) cmpItem, 00049 (Dthash_f) 0, 00050 (Dtmemory_f) 0, 00051 (Dtevent_f) 0 00052 }; 00053 00054 /* mkNodeset: 00055 * Creates an empty node set. 00056 */ 00057 nodeset_t *mkNodeset() 00058 { 00059 nodeset_t *s = dtopen(&nodeDisc, Dtoset); 00060 return s; 00061 } 00062 00063 /* freeNodeset: 00064 * Deletes a node set, deleting all items as well. 00065 * It does not delete the nodes. 00066 */ 00067 void freeNodeset(nodeset_t * s) 00068 { 00069 if (s != NULL) 00070 dtclose(s); 00071 } 00072 00073 /* clearNodeset: 00074 * Remove all items from a node set. 00075 */ 00076 void clearNodeset(nodeset_t * s) 00077 { 00078 dtclear(s); 00079 } 00080 00081 /* insertNodeset: 00082 * Add a node into the nodeset. 00083 */ 00084 void insertNodeset(nodeset_t * ns, Agnode_t * n) 00085 { 00086 nsitem_t key; 00087 00088 key.np = n; 00089 dtinsert(ns, &key); 00090 } 00091 00092 void removeNodeset(nodeset_t * ns, Agnode_t * n) 00093 { 00094 nsitem_t key; 00095 00096 key.np = n; 00097 dtdelete(ns, &key); 00098 } 00099 00100 /* sizeNodeset: 00101 * Report on the nodeset size. 00102 */ 00103 int sizeNodeset(nodeset_t * ns) 00104 { 00105 return dtsize(ns); 00106 } 00107 00108 /* As the node set is a Dt_t, traversal is done using standard 00109 * functions from libcdt. 00110 */ 00111 00112 void printNodeset(nodeset_t * ns) 00113 { 00114 nsitem_t *ip; 00115 for (ip = (nsitem_t *) dtfirst(ns); ip; 00116 ip = (nsitem_t *) dtnext(ns, ip)) { 00117 fprintf(stderr, "%s", agnameof(ip->np)); 00118 } 00119 fputs("\n", stderr); 00120 }
1.7.4