]> granicus.if.org Git - graphviz/commitdiff
Initial version of Cgraph created.
authornorth <devnull@localhost>
Thu, 25 Oct 2007 20:27:57 +0000 (20:27 +0000)
committernorth <devnull@localhost>
Thu, 25 Oct 2007 20:27:57 +0000 (20:27 +0000)
lib/cgraph/utils.c [new file with mode: 0644]

diff --git a/lib/cgraph/utils.c b/lib/cgraph/utils.c
new file mode 100644 (file)
index 0000000..da2a50b
--- /dev/null
@@ -0,0 +1,101 @@
+/* $Id$ $Revision$ */
+/* vim:set shiftwidth=4 ts=8: */
+
+/**********************************************************
+*      This software is part of the graphviz package      *
+*                http://www.graphviz.org/                 *
+*                                                         *
+*            Copyright (c) 1994-2004 AT&T Corp.           *
+*                and is licensed under the                *
+*            Common Public License, Version 1.0           *
+*                      by AT&T Corp.                      *
+*                                                         *
+*        Information and Software Systems Research        *
+*              AT&T Research, Florham Park NJ             *
+**********************************************************/
+
+#include <cghdr.h>
+
+static Agraph_t *Ag_dictop_G;
+
+/* only indirect call through dtopen() is expected */
+void *agdictobjmem(Dict_t * dict, Void_t * p, size_t size, Dtdisc_t * disc)
+{
+    Agraph_t *g;
+
+    NOTUSED(dict);
+    NOTUSED(disc);
+    g = Ag_dictop_G;
+    if (g) {
+       if (p)
+           agfree(g, p);
+       else
+           return agalloc(g, size);
+    } else {
+       if (p)
+           free(p);
+       else
+           return malloc(size);
+    }
+    return NIL(void *);
+}
+
+void agdictobjfree(Dict_t * dict, Void_t * p, Dtdisc_t * disc)
+{
+    Agraph_t *g;
+
+    NOTUSED(dict);
+    NOTUSED(disc);
+    g = Ag_dictop_G;
+    if (g)
+       agfree(g, p);
+    else
+       free(p);
+}
+
+Dict_t *agdtopen(Agraph_t * g, Dtdisc_t * disc, Dtmethod_t * method)
+{
+    Dtmemory_f memf;
+    Dict_t *d;
+
+    memf = disc->memoryf;
+    disc->memoryf = agdictobjmem;
+    Ag_dictop_G = g;
+    d = dtopen(disc, method);
+    disc->memoryf = memf;
+    return d;
+}
+
+long agdtdelete(Agraph_t * g, Dict_t * dict, void *obj)
+{
+    Ag_dictop_G = g;
+    return (long) dtdelete(dict, obj);
+}
+
+int agobjfinalize(Void_t * obj)
+{
+    agfree(Ag_dictop_G, obj);
+    return 0;
+}
+
+void agdtclose(Agraph_t * g, Dict_t * dict)
+{
+    Dtmemory_f memf;
+    Dtdisc_t *disc;
+
+    disc = dtdisc(dict, NIL(Dtdisc_t *), 0);
+    memf = disc->memoryf;
+    disc->memoryf = agdictobjmem;
+    Ag_dictop_G = g;
+    if (dtclose(dict))
+       abort();
+    disc->memoryf = memf;
+}
+
+void agdtdisc(Agraph_t * g, Dict_t * dict, Dtdisc_t * disc)
+{
+    if (disc && (dtdisc(dict, NIL(Dtdisc_t *), 0) != disc)) {
+       dtdisc(dict, disc, 0);
+    }
+    /* else unchanged, disc is same as old disc */
+}