|
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 "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 }
1.7.4