Graphviz 14.1.2~dev.20260118.1035
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 "config.h"
18
19#include <cgraph/cghdr.h>
20#include <stdbool.h>
21#include <stddef.h>
22#include <util/alloc.h>
23
25{
26 Agraph_t template;
27
29 AGID(&template) = id;
30 return dtsearch(g->g_id, &template);
31}
32
34{
35 Agraph_t *subg;
36
37 subg = agfindsubg_by_id(g, id);
38 if (subg)
39 return subg;
40
41 subg = gv_alloc(sizeof(Agraph_t));
42 subg->clos = g->clos;
43 subg->desc = g->desc;
44 subg->desc.maingraph = false;
45 subg->parent = g;
46 subg->root = g->root;
47 AGID(subg) = id;
48 return agopen1(subg);
49}
50
52 return agfindsubg_by_id(g, id);
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 return dtdelete(g->g_seq, subg) != NULL && dtdelete(g->g_id, subg) != NULL;
99}
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:184
#define dtdelete(d, o)
Definition cdt.h:187
#define dtnext(d, o)
Definition cdt.h:181
#define dtfirst(d)
Definition cdt.h:180
cgraph.h additions
void agdtdisc(Agraph_t *g, Dict_t *dict, Dtdisc_t *disc)
Definition utils.c:43
int agmapnametoid(Agraph_t *g, int objtype, char *str, IDTYPE *result, bool createflag)
Definition id.c:104
Agraph_t * agopen1(Agraph_t *g)
Definition graph.c:68
void agregister(Agraph_t *g, int objtype, void *obj)
Definition id.c:172
Dtdisc_t Ag_subgraph_id_disc
Definition graph.c:267
node NULL
Definition grammar.y:181
#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:51
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:433
Dict_t * g_id
subgraphs - descendants
Definition cgraph.h:432
Agclos_t * clos
shared resources
Definition cgraph.h:434
Agraph_t * parent
Definition cgraph.h:433
Agdesc_t desc
Definition cgraph.h:426
static Agraph_t * agfindsubg_by_id(Agraph_t *g, IDTYPE id)
Definition subg.c:24
static Agraph_t * localsubg(Agraph_t *g, IDTYPE id)
Definition subg.c:33