Graphviz 12.0.1~dev.20240716.0800
Loading...
Searching...
No Matches
tcldot-id.c
Go to the documentation of this file.
1/*************************************************************************
2 * Copyright (c) 2011 AT&T Intellectual Property
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * https://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors: Details at https://graphviz.org
9 *************************************************************************/
10
11#include <cgraph/unreachable.h>
12#include <stdint.h>
13#include "tcldot.h"
14
15// Agiddisc functions
16static void *myiddisc_open(Agraph_t *g, Agdisc_t *disc) {
17 ictx_t *ictx = (ictx_t *)disc;
18 gctx_t *gctx;
19
20 gctx = malloc(sizeof(gctx_t));
21 gctx->g = g;
22 gctx->ictx = ictx;
23 return gctx;
24}
25static long myiddisc_map(void *state, int objtype, char *str, uint64_t *id, int createflag) {
26 (void)objtype;
27
28 gctx_t *gctx = state;
29 ictx_t *ictx = gctx->ictx;
30 char *s;
31
32 if (str) {
33 if (createflag)
34 s = agstrdup(gctx->g, str);
35 else
36 s = agstrbind(gctx->g, str);
37 *id = (uint64_t)(uintptr_t)s;
38 } else {
39 *id = ictx->ctr; /* counter maintained in per-interp space, so that
40 ids are unique across all graphs in the interp */
41 ictx->ctr += 2;
42 }
43 return 1;
44}
45/* we don't allow users to explicitly set IDs, either */
46static long myiddisc_alloc(void *state, int objtype, uint64_t request_id) {
47 (void)state;
48 (void)objtype;
49 (void)request_id;
50 return 0;
51}
52static void myiddisc_free(void *state, int objtype, uint64_t id) {
53 (void)objtype;
54
55 gctx_t *gctx = state;
56
57/* FIXME no obj* available
58 ictx_t *ictx = gctx->ictx;
59 char buf[32] = "";
60
61 switch (objtype) {
62 case AGRAPH: sprintf(buf,"graph%lu",id); break;
63 case AGNODE: sprintf(buf,"node%lu",id); break;
64 case AGINEDGE:
65 case AGOUTEDGE: sprintf(buf,"edge%lu",id); break;
66 }
67 Tcl_DeleteCommand(ictx->interp, buf);
68*/
69 if (id % 2 == 0)
70 agstrfree(gctx->g, (char *)(uintptr_t)id);
71}
72static char *myiddisc_print(void *state, int objtype, uint64_t id) {
73 (void)state;
74 (void)objtype;
75 if (id % 2 == 0)
76 return (char *)(uintptr_t)id;
77 else
78 return "";
79}
80
81static void myiddisc_idregister(void *state, int objtype, void *obj) {
82 gctx_t *gctx = state;
83 ictx_t *ictx = gctx->ictx;
84 Tcl_Interp *interp = ictx->interp;
85 Tcl_CmdProc *proc = NULL;
86
87 switch (objtype) {
88 case AGRAPH: proc=graphcmd; break;
89 case AGNODE: proc=nodecmd; break;
90 case AGINEDGE:
91 case AGOUTEDGE: proc=edgecmd; break;
92 default: UNREACHABLE();
93 }
94#ifndef TCLOBJ
95 Tcl_CreateCommand(interp, obj2cmd(obj), proc, (ClientData) gctx, (Tcl_CmdDeleteProc *) NULL);
96#else
97 Tcl_CreateObjCommand(interp, obj2cmd(obj), proc, (ClientData) gctx, (Tcl_CmdDeleteProc *) NULL);
98#endif
99}
void * malloc(YYSIZE_T)
void free(void *)
node NULL
Definition grammar.y:149
@ AGOUTEDGE
Definition cgraph.h:207
@ AGNODE
Definition cgraph.h:207
@ AGINEDGE
Definition cgraph.h:207
@ AGRAPH
Definition cgraph.h:207
int agstrfree(Agraph_t *, const char *)
Definition refstr.c:138
char * agstrdup(Agraph_t *, const char *)
returns a pointer to a reference-counted copy of the argument string, creating one if necessary
Definition refstr.c:130
char * agstrbind(Agraph_t *g, const char *)
Definition refstr.c:95
static lexstate_t state
Definition htmllex.c:61
agxbuf * str
Definition htmlparse.c:97
user's discipline
Definition cgraph.h:337
object ID allocator discipline
Definition cgraph.h:316
graph or subgraph
Definition cgraph.h:425
Agraph_t * g
Definition tcldot.h:41
ictx_t * ictx
Definition tcldot.h:42
Tcl_Interp * interp
Definition tcldot.h:33
uint64_t ctr
Definition tcldot.h:32
int edgecmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[])
int graphcmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[])
static void myiddisc_free(void *state, int objtype, uint64_t id)
Definition tcldot-id.c:52
static char * myiddisc_print(void *state, int objtype, uint64_t id)
Definition tcldot-id.c:72
static long myiddisc_map(void *state, int objtype, char *str, uint64_t *id, int createflag)
Definition tcldot-id.c:25
static long myiddisc_alloc(void *state, int objtype, uint64_t request_id)
Definition tcldot-id.c:46
Agiddisc_t myiddisc
Definition tcldot-id.c:100
static void * myiddisc_open(Agraph_t *g, Agdisc_t *disc)
Definition tcldot-id.c:16
static void myiddisc_idregister(void *state, int objtype, void *obj)
Definition tcldot-id.c:81
int nodecmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[])
char * obj2cmd(void *obj)
Definition tcldot-util.c:65
Definition grammar.c:93
#define UNREACHABLE()
Definition unreachable.h:30