1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
/* $Id: utils.c,v 1.4 2009/06/03 01:10:51 ellson Exp $ $Revision: 1.4 $ */
/* 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;
Ag_dictop_G = NIL(Agraph_t*);
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;
Ag_dictop_G = NIL(Agraph_t*);
}
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 */
}
|