Graphviz 13.0.0~dev.20250121.0651
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#include <util/alloc.h>
21
23{
24 Agraph_t template;
25
27 AGID(&template) = id;
28 return dtsearch(g->g_id, &template);
29}
30
32{
33 Agraph_t *subg;
34
35 subg = agfindsubg_by_id(g, id);
36 if (subg)
37 return subg;
38
39 subg = gv_alloc(sizeof(Agraph_t));
40 subg->clos = g->clos;
41 subg->desc = g->desc;
42 subg->desc.maingraph = false;
43 subg->parent = g;
44 subg->root = g->root;
45 AGID(subg) = id;
46 return agopen1(subg);
47}
48
50 Agraph_t *subg;
51 subg = agfindsubg_by_id(g, id);
52 return subg;
53}
54
55Agraph_t *agsubg(Agraph_t * g, char *name, int cflag)
56{
57 IDTYPE id;
58 Agraph_t *subg;
59
60 if (name && agmapnametoid(g, AGRAPH, name, &id, false)) {
61 /* might already exist */
62 if ((subg = agfindsubg_by_id(g, id)))
63 return subg;
64 }
65
66 if (cflag && agmapnametoid(g, AGRAPH, name, &id, true)) { /* reserve id */
67 subg = localsubg(g, id);
68 agregister(g, AGRAPH, subg);
69 return subg;
70 }
71
72 return NULL;
73}
74
76{
77 return dtfirst(g->g_seq);
78}
79
81{
82 Agraph_t *g;
83
84 g = agparent(subg);
85 return g? dtnext(g->g_seq, subg) : 0;
86}
87
89{
90 return g->parent;
91}
92
93/* this function is only responsible for deleting the entry
94 * in the parent's subg dict. the rest is done in agclose().
95 */
96int agdelsubg(Agraph_t * g, Agraph_t * subg)
97{
98 Agraphs_remove(g->g_seq2, subg);
99 return dtdelete(g->g_seq, subg) != NULL && dtdelete(g->g_id, subg) != NULL;
100}
Memory allocation wrappers that exit on failure.
static void * gv_alloc(size_t size)
Definition alloc.h:47
#define dtsearch(d, o)
Definition cdt.h:183
#define dtdelete(d, o)
Definition cdt.h:186
#define dtnext(d, o)
Definition cdt.h:180
#define dtfirst(d)
Definition cdt.h:179
cgraph.h additions
void agdtdisc(Agraph_t *g, Dict_t *dict, Dtdisc_t *disc)
Definition utils.c:41
int agmapnametoid(Agraph_t *g, int objtype, char *str, IDTYPE *result, bool createflag)
Definition id.c:102
Agraph_t * agopen1(Agraph_t *g)
Definition graph.c:68
void agregister(Agraph_t *g, int objtype, void *obj)
Definition id.c:170
Dtdisc_t Ag_subgraph_id_disc
Definition graph.c:275
node NULL
Definition grammar.y:163
#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:88
Agraph_t * agidsubg(Agraph_t *g, IDTYPE id)
constructor
Definition subg.c:49
Agraph_t * agfstsubg(Agraph_t *g)
Definition subg.c:75
Agraph_t * agnxtsubg(Agraph_t *subg)
Definition subg.c:80
Agraph_t * agsubg(Agraph_t *g, char *name, int cflag)
Definition subg.c:55
int agdelsubg(Agraph_t *g, Agraph_t *subg)
Definition subg.c:96
static uint64_t id
Definition gv2gml.c:42
unsigned maingraph
Definition cgraph.h:288
graph or subgraph
Definition cgraph.h:424
Dict_t * g_seq
Definition cgraph.h:432
Agraph_t * root
subgraphs - ancestors
Definition cgraph.h:438
Dict_t * g_id
Definition cgraph.h:432
Agclos_t * clos
shared resources
Definition cgraph.h:439
Agraph_t * parent
Definition cgraph.h:438
Agdesc_t desc
Definition cgraph.h:426
void * g_seq2
Definition cgraph.h:437
static Agraph_t * agfindsubg_by_id(Agraph_t *g, IDTYPE id)
Definition subg.c:22
static Agraph_t * localsubg(Agraph_t *g, IDTYPE id)
Definition subg.c:31