1
/* $Id: imap.c,v 1.2 2006/07/08 17:33:49 ellson Exp $ $Revision: 1.2 $ */
2
/* vim:set shiftwidth=4 ts=8: */
4
/**********************************************************
5
* This software is part of the graphviz package *
6
* http://www.graphviz.org/ *
8
* Copyright (c) 1994-2004 AT&T Corp. *
9
* and is licensed under the *
10
* Common Public License, Version 1.0 *
13
* Information and Software Systems Research *
14
* AT&T Research, Florham Park NJ *
15
**********************************************************/
20
typedef struct IMapEntry_s {
21
Dtlink_t namedict_link;
27
static int idcmpf(Dict_t * d, void *arg_p0, void *arg_p1, Dtdisc_t * disc)
35
return (p0->id - p1->id);
38
/* note, OK to compare pointers into shared string pool
39
* but can't probe with an arbitrary string pointer
41
static int namecmpf(Dict_t * d, void *arg_p0, void *arg_p1,
50
return (p0->str - p1->str);
53
static Dtdisc_t LookupByName = {
54
0, /* object ptr is passed as key */
55
0, /* size (ignored) */
56
offsetof(IMapEntry_t, namedict_link),
65
static Dtdisc_t LookupById = {
66
0, /* object ptr is passed as key */
67
0, /* size (ignored) */
68
offsetof(IMapEntry_t, iddict_link),
77
int aginternalmaplookup(Agraph_t * g, int objtype, char *str,
78
unsigned long *result)
81
IMapEntry_t *sym, template;
84
if (objtype == AGINEDGE)
86
if ((d = g->clos->lookup_by_name[objtype])) {
87
if ((search_str = agstrbind(g, str))) {
88
template.str = search_str;
89
sym = (IMapEntry_t *) dtsearch(d, &template);
99
/* caller GUARANTEES that this is a new entry */
100
void aginternalmapinsert(Agraph_t * g, int objtype, char *str,
104
Dict_t *d_name_to_id, *d_id_to_name;
106
ent = AGNEW(g, IMapEntry_t);
108
ent->str = agstrdup(g, str);
110
if (objtype == AGINEDGE)
112
if ((d_name_to_id = g->clos->lookup_by_name[objtype]) == NIL(Dict_t *))
113
d_name_to_id = g->clos->lookup_by_name[objtype] =
114
agdtopen(g, &LookupByName, Dttree);
115
if ((d_id_to_name = g->clos->lookup_by_id[objtype]) == NIL(Dict_t *))
116
d_id_to_name = g->clos->lookup_by_id[objtype] =
117
agdtopen(g, &LookupById, Dttree);
118
dtinsert(d_name_to_id, ent);
119
dtinsert(d_id_to_name, ent);
122
static IMapEntry_t *find_isym(Agraph_t * g, int objtype, unsigned long id)
125
IMapEntry_t *isym, itemplate;
127
if (objtype == AGINEDGE)
129
if ((d = g->clos->lookup_by_id[objtype])) {
131
isym = (IMapEntry_t *) dtsearch(d, &itemplate);
133
isym = NIL(IMapEntry_t *);
137
char *aginternalmapprint(Agraph_t * g, int objtype, unsigned long id)
141
if ((isym = find_isym(g, objtype, id)))
147
int aginternalmapdelete(Agraph_t * g, int objtype, unsigned long id)
151
if (objtype == AGINEDGE)
153
if ((isym = find_isym(g, objtype, id))) {
154
dtdelete(g->clos->lookup_by_name[objtype], isym);
155
dtdelete(g->clos->lookup_by_id[objtype], isym);
156
agstrfree(g, isym->str);
163
void aginternalmapclearlocalnames(Agraph_t * g)
166
IMapEntry_t *sym, *nxt;
171
d_name = g->clos->lookup_by_name;
172
/* d_id = g->clos->lookup_by_id; */
173
for (i = 0; i < 3; i++) {
175
for (sym = dtfirst(d_name[i]); sym; sym = nxt) {
176
nxt = dtnext(d_name[i], sym);
177
if (sym->str[0] == LOCALNAMEPREFIX)
178
aginternalmapdelete(g, i, sym->id);
184
static void closeit(Dict_t ** d)
188
for (i = 0; i < 3; i++) {
191
d[i] = NIL(Dict_t *);
196
void aginternalmapclose(Agraph_t * g)
199
closeit(g->clos->lookup_by_name);
200
closeit(g->clos->lookup_by_id);