1 /* $Id$ $Revision$ */
2 /* vim:set shiftwidth=4 ts=8: */
3 
4 /*************************************************************************
5  * Copyright (c) 2011 AT&T Intellectual Property
6  * All rights reserved. This program and the accompanying materials
7  * are made available under the terms of the Eclipse Public License v1.0
8  * which accompanies this distribution, and is available at
9  * http://www.eclipse.org/legal/epl-v10.html
10  *
11  * Contributors: See CVS logs. Details at http://www.graphviz.org/
12  *************************************************************************/
13 
14 #include <cghdr.h>
15 
16 static Agraph_t *Ag_dictop_G;
17 
18 /* only indirect call through dtopen() is expected */
agdictobjmem(Dict_t * dict,void * p,size_t size,Dtdisc_t * disc)19 void *agdictobjmem(Dict_t * dict, void * p, size_t size, Dtdisc_t * disc)
20 {
21     Agraph_t *g;
22 
23     NOTUSED(dict);
24     NOTUSED(disc);
25     g = Ag_dictop_G;
26     if (g) {
27 	if (p)
28 	    agfree(g, p);
29 	else
30 	    return agalloc(g, size);
31     } else {
32 	if (p)
33 	    free(p);
34 	else
35 	    return malloc(size);
36     }
37     return NIL(void *);
38 }
39 
agdictobjfree(Dict_t * dict,void * p,Dtdisc_t * disc)40 void agdictobjfree(Dict_t * dict, void * p, Dtdisc_t * disc)
41 {
42     Agraph_t *g;
43 
44     NOTUSED(dict);
45     NOTUSED(disc);
46     g = Ag_dictop_G;
47     if (g)
48 	agfree(g, p);
49     else
50 	free(p);
51 }
52 
agdtopen(Agraph_t * g,Dtdisc_t * disc,Dtmethod_t * method)53 Dict_t *agdtopen(Agraph_t * g, Dtdisc_t * disc, Dtmethod_t * method)
54 {
55     Dtmemory_f memf;
56     Dict_t *d;
57 
58     memf = disc->memoryf;
59     disc->memoryf = agdictobjmem;
60     Ag_dictop_G = g;
61     d = dtopen(disc, method);
62     disc->memoryf = memf;
63     Ag_dictop_G = NIL(Agraph_t*);
64     return d;
65 }
66 
agdtdelete(Agraph_t * g,Dict_t * dict,void * obj)67 long agdtdelete(Agraph_t * g, Dict_t * dict, void *obj)
68 {
69     Ag_dictop_G = g;
70     return (long) dtdelete(dict, obj);
71 }
72 
agobjfinalize(void * obj)73 int agobjfinalize(void * obj)
74 {
75     agfree(Ag_dictop_G, obj);
76     return 0;
77 }
78 
agdtclose(Agraph_t * g,Dict_t * dict)79 int agdtclose(Agraph_t * g, Dict_t * dict)
80 {
81     Dtmemory_f memf;
82     Dtdisc_t *disc;
83 
84     disc = dtdisc(dict, NIL(Dtdisc_t *), 0);
85     memf = disc->memoryf;
86     disc->memoryf = agdictobjmem;
87     Ag_dictop_G = g;
88     if (dtclose(dict))
89 	return 1;
90     disc->memoryf = memf;
91     Ag_dictop_G = NIL(Agraph_t*);
92     return 0;
93 }
94 
agdtdisc(Agraph_t * g,Dict_t * dict,Dtdisc_t * disc)95 void agdtdisc(Agraph_t * g, Dict_t * dict, Dtdisc_t * disc)
96 {
97     if (disc && (dtdisc(dict, NIL(Dtdisc_t *), 0) != disc)) {
98 	dtdisc(dict, disc, 0);
99     }
100     /* else unchanged, disc is same as old disc */
101 }
102