]> granicus.if.org Git - graphviz/commitdiff
work in progress - looking good so far
authorJohn Ellson <ellson@research.att.com>
Tue, 14 Aug 2012 03:56:30 +0000 (23:56 -0400)
committerJohn Ellson <ellson@research.att.com>
Tue, 14 Aug 2012 03:56:30 +0000 (23:56 -0400)
tclpkg/tcldot/tcldot-graphcmd.c
tclpkg/tcldot/tcldot.c

index bd9f1fae225d4df91038db27cbe967c16ad31e8c..e3b5e80230f1553f0af8de753ab594212bd34735 100644 (file)
 #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;
     }
index 4f963b9ae87bb2878f6e1cd161459dcf02e15c66..28850750fa9b892fc7794c73baa3987f6395d76f 100644 (file)
@@ -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