From: John Ellson Date: Tue, 14 Aug 2012 03:56:30 +0000 (-0400) Subject: work in progress - looking good so far X-Git-Tag: LAST_LIBGRAPH~32^2~355^2~4 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=75fb2e826f1276f1b754f6493ca8394e9e4326f6;p=graphviz work in progress - looking good so far --- diff --git a/tclpkg/tcldot/tcldot-graphcmd.c b/tclpkg/tcldot/tcldot-graphcmd.c index bd9f1fae2..e3b5e8023 100644 --- a/tclpkg/tcldot/tcldot-graphcmd.c +++ b/tclpkg/tcldot/tcldot-graphcmd.c @@ -14,47 +14,27 @@ #include "tcldot.h" Agraph_t *cmd2g(gctx_t *gctx, char *cmd) { - unsigned long int id; - Agraph_t *g; + Agraph_t *g = NULL; - if (sscanf(cmd, "graph%lu", &id) != 1) { - Tcl_AppendResult(gctx->ictx->interp, " \"", cmd, "\" doesn't sscanf for graph object", NULL); - return NULL; - } - g = agidsubg(gctx->g, id, FALSE); - if (!g) { + if (sscanf(cmd, "graph%p", &g) != 1 || !g) { Tcl_AppendResult(gctx->ictx->interp, " \"", cmd, "\" not found", NULL); return NULL; } return g; } Agnode_t *cmd2n(gctx_t *gctx, char *cmd) { - unsigned long int id; - Agnode_t *n; + Agnode_t *n = NULL; - if (sscanf(cmd, "node%lu", &id) != 1) { - Tcl_AppendResult(gctx->ictx->interp, " \"", cmd, "\" doesn't sscanf for node object", NULL); - return NULL; - } - n = agidnode(gctx->g, id, FALSE); - if (!n) { + if (sscanf(cmd, "node%p", &n) != 1 || !n) { Tcl_AppendResult(gctx->ictx->interp, " \"", cmd, "\" not found", NULL); return NULL; } return n; } Agedge_t *cmd2e(gctx_t *gctx, char *cmd) { - unsigned long int id; - Agedge_t *e; -// FIXME - Agnode_t *t=NULL, *h=NULL; + Agedge_t *e = NULL; - if (sscanf(cmd, "edge%lu", &id) != 1) { - Tcl_AppendResult(gctx->ictx->interp, " \"", cmd, "\" doesn't sscanf for edge object", NULL); - return NULL; - } - e = agidedge(gctx->g, t, h, id, FALSE); - if (!e) { + if (sscanf(cmd, "edge%p", &e) != 1 || !e) { Tcl_AppendResult(gctx->ictx->interp, " \"", cmd, "\" not found", NULL); return NULL; } diff --git a/tclpkg/tcldot/tcldot.c b/tclpkg/tcldot/tcldot.c index 4f963b9ae..28850750f 100644 --- a/tclpkg/tcldot/tcldot.c +++ b/tclpkg/tcldot/tcldot.c @@ -29,35 +29,19 @@ static void *myiddisc_open(Agraph_t *g, Agdisc_t *disc) { static long myiddisc_map(void *state, int objtype, char *str, unsigned long *id, int createflag) { gctx_t *gctx = (gctx_t *)state; ictx_t *ictx = gctx->ictx; - Tcl_Interp *interp = ictx->interp; - Tcl_CmdProc *proc = NULL; - Agraph_t *g = NULL; - char *s, buf[30] = ""; + char *s; if (str) { if (createflag) - s = agstrdup(g, str); + s = agstrdup(gctx->g, str); else - s = agstrbind(g, str); + s = agstrbind(gctx->g, str); *id = (unsigned long) s; } else { - *id = ictx->ctr; + *id = ictx->ctr; /* counter maintained in per-interp space, so that + ids are unique across all graphs in the interp */ ictx->ctr += 2; } - switch (objtype) { - case AGRAPH: sprintf(buf,"graph%lu",*id); proc=graphcmd; break; - case AGNODE: sprintf(buf,"node%lu",*id); proc=nodecmd; break; - case AGINEDGE: - case AGOUTEDGE: sprintf(buf,"edge%lu",*id); proc=edgecmd; break; - } - Tcl_AppendResult(interp, buf, NULL); - if (createflag) { -#ifndef TCLOBJ - Tcl_CreateCommand(interp, Tcl_GetStringResult(interp), proc, (ClientData) gctx, (Tcl_CmdDeleteProc *) NULL); -#else - Tcl_CreateObjCommand(interp, Tcl_GetStringResult(interp), proc, (ClientData) gctx, (Tcl_CmdDeleteProc *) NULL); -#endif - } return TRUE; } /* we don't allow users to explicitly set IDs, either */ @@ -69,6 +53,8 @@ static long myiddisc_alloc(void *state, int objtype, unsigned long request_id) { } static void myiddisc_free(void *state, int objtype, unsigned long id) { gctx_t *gctx = (gctx_t *)state; + +/* FIXME no obj* available ictx_t *ictx = gctx->ictx; char buf[30] = ""; @@ -79,8 +65,9 @@ static void myiddisc_free(void *state, int objtype, unsigned long id) { case AGOUTEDGE: sprintf(buf,"edge%lu",id); break; } Tcl_DeleteCommand(ictx->interp, buf); +*/ if (id % 2 == 0) - agstrfree((Agraph_t *) state, (char *) id); + agstrfree(gctx->g, (char *) id); } static char *myiddisc_print(void *state, int objtype, unsigned long id) { NOTUSED(state); @@ -93,13 +80,34 @@ static char *myiddisc_print(void *state, int objtype, unsigned long id) { static void myiddisc_close(void *state) { free(state); } +static void myiddisc_register(void *state, int objtype, void *obj) { + gctx_t *gctx = (gctx_t *)state; + ictx_t *ictx = gctx->ictx; + Tcl_Interp *interp = ictx->interp; + Tcl_CmdProc *proc = NULL; + char buf[30] = ""; + + switch (objtype) { + case AGRAPH: sprintf(buf,"graph%p",obj); proc=graphcmd; break; + case AGNODE: sprintf(buf,"node%p",obj); proc=nodecmd; break; + case AGINEDGE: + case AGOUTEDGE: sprintf(buf,"edge%p",obj); proc=edgecmd; break; + } + Tcl_AppendResult(interp, buf, NULL); +#ifndef TCLOBJ + Tcl_CreateCommand(interp, Tcl_GetStringResult(interp), proc, (ClientData) gctx, (Tcl_CmdDeleteProc *) NULL); +#else + Tcl_CreateObjCommand(interp, Tcl_GetStringResult(interp), proc, (ClientData) gctx, (Tcl_CmdDeleteProc *) NULL); +#endif +} static Agiddisc_t myiddisc = { myiddisc_open, myiddisc_map, myiddisc_alloc, myiddisc_free, myiddisc_print, - myiddisc_close + myiddisc_close, + myiddisc_register }; #endif // WITH_CGRAPH