Graphviz 12.0.1~dev.20240715.2254
Loading...
Searching...
No Matches
subg.c
Go to the documentation of this file.
1
7/*************************************************************************
8 * Copyright (c) 2011 AT&T Intellectual Property
9 * All rights reserved. This program and the accompanying materials
10 * are made available under the terms of the Eclipse Public License v1.0
11 * which accompanies this distribution, and is available at
12 * https://www.eclipse.org/legal/epl-v10.html
13 *
14 * Contributors: Details at https://graphviz.org
15 *************************************************************************/
16
17#include <cgraph/cghdr.h>
18#include <stdbool.h>
19#include <stddef.h>
20
22{
23 Agraph_t template;
24
26 AGID(&template) = id;
27 return dtsearch(g->g_id, &template);
28}
29
31{
32 Agraph_t *subg;
33
34 subg = agfindsubg_by_id(g, id);
35 if (subg)
36 return subg;
37
38 subg = agalloc(g, sizeof(Agraph_t));
39 subg->clos = g->clos;
40 subg->desc = g->desc;
41 subg->desc.maingraph = false;
42 subg->parent = g;
43 subg->root = g->root;
44 AGID(subg) = id;
45 return agopen1(subg);
46}
47
48Agraph_t *agidsubg(Agraph_t * g, IDTYPE id, int cflag)
49{
50 Agraph_t *subg;
51 subg = agfindsubg_by_id(g, id);
52 if (subg == NULL && cflag && agallocid(g, AGRAPH, id))
53 subg = localsubg(g, id);
54 return subg;
55}
56
57Agraph_t *agsubg(Agraph_t * g, char *name, int cflag)
58{
59 IDTYPE id;
60 Agraph_t *subg;
61
62 if (name && agmapnametoid(g, AGRAPH, name, &id, false)) {
63 /* might already exist */
64 if ((subg = agfindsubg_by_id(g, id)))
65 return subg;
66 }
67
68 if (cflag && agmapnametoid(g, AGRAPH, name, &id, true)) { /* reserve id */
69 subg = localsubg(g, id);
70 agregister(g, AGRAPH, subg);
71 return subg;
72 }
73
74 return NULL;
75}
76
78{
79 return dtfirst(g->g_seq);
80}
81
83{
84 Agraph_t *g;
85
86 g = agparent(subg);
87 return g? dtnext(g->g_seq, subg) : 0;
88}
89
91{
92 return g->parent;
93}
94
95/* this function is only responsible for deleting the entry
96 * in the parent's subg dict. the rest is done in agclose().
97 */
98int agdelsubg(Agraph_t * g, Agraph_t * subg)
99{
100 return ( (dtdelete(g->g_seq, subg) != NULL) &&
101 (dtdelete(g->g_id, subg) != NULL) );
102}
#define dtsearch(d, o)
Definition cdt.h:191
#define dtdelete(d, o)
Definition cdt.h:194
#define dtnext(d, o)
Definition cdt.h:188
#define dtfirst(d)
Definition cdt.h:187
cgraph.h additions
void agdtdisc(Agraph_t *g, Dict_t *dict, Dtdisc_t *disc)
Definition utils.c:55
int agmapnametoid(Agraph_t *g, int objtype, char *str, IDTYPE *result, bool createflag)
Definition id.c:112
Agraph_t * agopen1(Agraph_t *g)
Definition graph.c:68
int agallocid(Agraph_t *g, int objtype, IDTYPE request)
Definition id.c:141
void agregister(Agraph_t *g, int objtype, void *obj)
Definition id.c:185
Dtdisc_t Ag_subgraph_id_disc
Definition graph.c:268
node NULL
Definition grammar.y:149
void * agalloc(Agraph_t *g, size_t size)
Definition mem.c:19
#define AGID(obj)
returns the unique integer ID associated with the object
Definition cgraph.h:221
uint64_t IDTYPE
unique per main graph ID
Definition cgraph.h:73
@ AGRAPH
Definition cgraph.h:207
Agraph_t * agparent(Agraph_t *g)
Definition subg.c:90
Agraph_t * agidsubg(Agraph_t *g, IDTYPE id, int cflag)
Definition subg.c:48
Agraph_t * agfstsubg(Agraph_t *g)
Definition subg.c:77
Agraph_t * agnxtsubg(Agraph_t *subg)
Definition subg.c:82
Agraph_t * agsubg(Agraph_t *g, char *name, int cflag)
Definition subg.c:57
int agdelsubg(Agraph_t *g, Agraph_t *subg)
Definition subg.c:98
static uint64_t id
Definition gv2gml.c:42
unsigned maingraph
Definition cgraph.h:288
graph or subgraph
Definition cgraph.h:425
Dict_t * g_seq
Definition cgraph.h:433
Agraph_t * root
subgraphs - ancestors
Definition cgraph.h:434
Dict_t * g_id
subgraphs - descendants
Definition cgraph.h:433
Agclos_t * clos
shared resources
Definition cgraph.h:435
Agraph_t * parent
Definition cgraph.h:434
Agdesc_t desc
Definition cgraph.h:427
static Agraph_t * agfindsubg_by_id(Agraph_t *g, IDTYPE id)
Definition subg.c:21
static Agraph_t * localsubg(Agraph_t *g, IDTYPE id)
Definition subg.c:30