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