13#include "../tcl-compat.h"
31 interp,
"wrong # args: should be \"", argv[0],
32 " graphtype ?graphname? ?attributename attributevalue? ?...?\"",
NULL);
35 if (
streq(
"digraph", argv[1])) {
37 }
else if (
streq(
"digraphstrict", argv[1])) {
39 }
else if (
streq(
"graph", argv[1])) {
41 }
else if (
streq(
"graphstrict", argv[1])) {
44 Tcl_AppendResult(interp,
"bad graphtype \"", argv[1],
"\": must be one of:",
45 "\n\tdigraph, digraphstrict, graph, graphstrict.",
NULL);
54#if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION >= 4
64 Tcl_AppendResult(interp,
"\nFailure to open graph.",
NULL);
73static int dotnew(ClientData clientData, Tcl_Interp *interp,
int argc,
81static int dotread(ClientData clientData, Tcl_Interp *interp,
int argc,
92 Tcl_AppendResult(interp,
"wrong # args: should be \"", argv[0],
93 " fileHandle\"",
NULL);
98 Tcl_AppendResult(interp,
"\nChannel \"", argv[1],
"\"",
"is unreadable.",
110 Tcl_AppendResult(interp,
"\nFailure to read graph \"", argv[1],
"\"",
NULL);
112 Tcl_AppendResult(interp,
" because of syntax errors.",
NULL);
117 Tcl_AppendResult(interp,
"\nSyntax errors in file \"", argv[1],
" \"",
125static int dotstring(ClientData clientData, Tcl_Interp *interp,
int argc,
126 const char *argv[]) {
132 Tcl_AppendResult(interp,
"wrong # args: should be \"", argv[0],
" string\"",
146 Tcl_AppendResult(interp,
"\nFailure to read string \"", argv[1],
"\"",
149 Tcl_AppendResult(interp,
" because of syntax errors.",
NULL);
154 Tcl_AppendResult(interp,
"\nSyntax errors in string \"", argv[1],
" \"",
182 if (Tcl_InitStubs(interp, TCL_VERSION, 0) ==
NULL) {
187 if (Tcl_PkgRequire(interp,
"Tcl", TCL_VERSION, 0) ==
NULL) {
194 char adjusted_version[
sizeof(PACKAGE_VERSION)] = PACKAGE_VERSION;
195 char *tilde_dev = strstr(adjusted_version,
"~dev.");
196 if (tilde_dev !=
NULL) {
198 memmove(tilde_dev + 1, tilde_dev + strlen(
"~dev."),
199 strlen(tilde_dev + strlen(
"~dev.")) + 1);
201 if (Tcl_PkgProvide(interp,
"Tcldot", adjusted_version) != TCL_OK) {
213 Tcl_CreateCommand(interp,
"dotnew",
dotnew, ictx,
free);
214 Tcl_CreateCommand(interp,
"dotread",
dotread, ictx,
NULL);
215 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)