12#include "../tcl-compat.h"
29 interp,
"wrong # args: should be \"", argv[0],
30 " graphtype ?graphname? ?attributename attributevalue? ?...?\"",
NULL);
33 if (
streq(
"digraph", argv[1])) {
35 }
else if (
streq(
"digraphstrict", argv[1])) {
37 }
else if (
streq(
"graph", argv[1])) {
39 }
else if (
streq(
"graphstrict", argv[1])) {
42 Tcl_AppendResult(interp,
"bad graphtype \"", argv[1],
"\": must be one of:",
43 "\n\tdigraph, digraphstrict, graph, graphstrict.",
NULL);
52#if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION >= 4
62 Tcl_AppendResult(interp,
"\nFailure to open graph.",
NULL);
71static int dotnew(ClientData clientData, Tcl_Interp *interp,
int argc,
79static int dotread(ClientData clientData, Tcl_Interp *interp,
int argc,
90 Tcl_AppendResult(interp,
"wrong # args: should be \"", argv[0],
91 " fileHandle\"",
NULL);
96 Tcl_AppendResult(interp,
"\nChannel \"", argv[1],
"\"",
"is unreadable.",
108 Tcl_AppendResult(interp,
"\nFailure to read graph \"", argv[1],
"\"",
NULL);
110 Tcl_AppendResult(interp,
" because of syntax errors.",
NULL);
115 Tcl_AppendResult(interp,
"\nSyntax errors in file \"", argv[1],
" \"",
123static int dotstring(ClientData clientData, Tcl_Interp *interp,
int argc,
124 const char *argv[]) {
130 Tcl_AppendResult(interp,
"wrong # args: should be \"", argv[0],
" string\"",
144 Tcl_AppendResult(interp,
"\nFailure to read string \"", argv[1],
"\"",
147 Tcl_AppendResult(interp,
" because of syntax errors.",
NULL);
152 Tcl_AppendResult(interp,
"\nSyntax errors in string \"", argv[1],
" \"",
180 if (Tcl_InitStubs(interp, TCL_VERSION, 0) ==
NULL) {
185 if (Tcl_PkgRequire(interp,
"Tcl", TCL_VERSION, 0) ==
NULL) {
192 char adjusted_version[
sizeof(PACKAGE_VERSION)] = PACKAGE_VERSION;
193 char *tilde_dev = strstr(adjusted_version,
"~dev.");
194 if (tilde_dev !=
NULL) {
196 memmove(tilde_dev + 1, tilde_dev + strlen(
"~dev."),
197 strlen(tilde_dev + strlen(
"~dev.")) + 1);
199 if (Tcl_PkgProvide(interp,
"Tcldot", adjusted_version) != TCL_OK) {
211 Tcl_CreateCommand(interp,
"dotnew",
dotnew, ictx,
free);
212 Tcl_CreateCommand(interp,
"dotread",
dotread, ictx,
NULL);
213 Tcl_CreateCommand(interp,
"dotstring",
dotstring, ictx,
NULL);
Memory allocation wrappers that exit on failure.
static char * gv_strdup(const char *original)
lt_symlist_t lt_preloaded_symbols[]
Tcl_AppInitProc Gdtclft_Init
Agdesc_t Agundirected
undirected
Agdesc_t Agstrictundirected
strict undirected
Agdesc_t Agstrictdirected
strict directed. A strict graph cannot have multi-edges or self-arcs.
Agraph_t * agopen(char *name, Agdesc_t desc, Agdisc_t *disc)
creates a new graph with the given name and kind
Agraph_t * agread(void *chan, Agdisc_t *disc)
constructs a new graph
Agdesc_t Agdirected
directed
GVC_t * gvContextPlugins(const lt_symlist_t *builtins, int demand_loading)
static bool streq(const char *a, const char *b)
are a and b equal?
int(* afread)(void *chan, char *buf, int bufsize)
int(* putstr)(void *chan, const char *str)
int myiodisc_memiofread(void *chan, char *buf, int bufsize)
int myiodisc_afread(void *channel, char *ubuf, int n)
void tcldot_argv_free(Tcl_Size argc, char *argv[])
free the strings pointed to by argv
void setgraphattributes(Agraph_t *g, char *argv[], Tcl_Size argc)
char * obj2cmd(void *obj)
char ** tcldot_argv_dup(Tcl_Size argc, const char *argv[])
duplicate the strings pointed to by argv as non-const strings
int Tcldot_SafeInit(Tcl_Interp *interp)
int Tcldot_Init(Tcl_Interp *interp)
int Tcldot_builtin_Init(Tcl_Interp *interp)
static int dotstring(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[])
static int dotnew_internal(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[])
static int dotread(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[])
static int dotnew(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[])
#define Tcl_GetStringResult(interp)