Graphviz 2.29.20120208.0545
lib/circogen/nodeset.c
Go to the documentation of this file.
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 }