Graphviz 2.29.20120208.0545
lib/circogen/edgelist.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        "edgelist.h"
00016 #include        <assert.h>
00017 
00018 static edgelistitem *mkItem(Dt_t * d, edgelistitem * obj, Dtdisc_t * disc)
00019 {
00020     edgelistitem *ap = GNEW(edgelistitem);
00021 
00022     ap->edge = obj->edge;
00023     return ap;
00024 }
00025 
00026 static void freeItem(Dt_t * d, edgelistitem * obj, Dtdisc_t * disc)
00027 {
00028     free(obj);
00029 }
00030 
00031 static int
00032 cmpItem(Dt_t * d, Agedge_t ** key1, Agedge_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 ELDisc = {
00043     offsetof(edgelistitem, edge),       /* key */
00044     sizeof(Agedge_t *),         /* size */
00045     offsetof(edgelistitem, 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 edgelist *init_edgelist()
00055 {
00056     edgelist *list = dtopen(&ELDisc, Dtoset);
00057     return list;
00058 }
00059 
00060 void free_edgelist(edgelist * list)
00061 {
00062     dtclose(list);
00063 }
00064 
00065 void add_edge(edgelist * list, Agedge_t * e)
00066 {
00067     edgelistitem temp;
00068 
00069     temp.edge = e;
00070     dtinsert(list, &temp);
00071 }
00072 
00073 void remove_edge(edgelist * list, Agedge_t * e)
00074 {
00075     edgelistitem temp;
00076 
00077     temp.edge = e;
00078     dtdelete(list, &temp);
00079 }
00080 
00081 #ifdef DEBUG
00082 void print_edge(edgelist * list)
00083 {
00084     edgelistitem *temp;
00085     Agedge_t *ep;
00086 
00087     for (temp = (edgelistitem *) dtflatten(list); temp;
00088          temp = (edgelistitem *) dtlink(list, (Dtlink_t *) temp)) {
00089         ep = temp->edge;
00090         fprintf(stderr, "%s--%s \n", ep->tail->name, ep->head->name);
00091     }
00092     fputs("\n", stderr);
00093 }
00094 #endif
00095 
00096 int size_edgelist(edgelist * list)
00097 {
00098     return dtsize(list);
00099 }