set zdata $conn-z open zf [whatever] xml read $zdata $zf close $zf ... xml free $zdataThis isn't what I'd call particularly easy to use -- but it does work. Although I see a significant risk of memory leaks here. At any rate, here's how I ended up implementing things. First, we include our includes.
#include "ns.h" #include "xmlapi.h" #include "repmgr.h" #include "xmlobj.h" |
/* This module is a wrapper for the wftk (open-source workflow toolkit). As such, it defines several commands in Tcl which can be used for workflow- and XML-oriented functionality. xml - wraps the XMLAPI, used for general XML manipulation. repmgr - wraps the repository manager, used for list- and record-oriented data manipulation. */ #define XML_COMMAND "xml" #define XMLOBJ_COMMAND "xmlobj" #define REPMGR_COMMAND "repmgr" DllExport int Ns_ModuleVersion = 1; static Tcl_CmdProc XMLCmd; static Tcl_CmdProc RepmgrCmd; |
static int XMLAPI_free (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_load (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_save (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_write (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_writecontent (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_writehtml (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_writecontenthtml (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_string (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_stringcontent (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_stringhtml (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_stringcontenthtml (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_prepend (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_append (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_append_pretty (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_replace (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_replacecontent (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_loc (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_getloc (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_set (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_attrval (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_attrs (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_create (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_createtext (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_delete (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_is (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_name (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_is_element (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_parent (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_first (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_firstelem (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_last (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_lastelem (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_next (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_nextelem (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_prev (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_prevelem (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_copy (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_copyinto (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_read (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_parse (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_search (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_search_all (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_toutf8_attr (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_toutf8_text (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLAPI_toraw_str (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); /* And the xmlobj library: */ static int XMLOBJ_get (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLOBJ_set (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLOBJ_format (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLOBJ_diff (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLOBJ_undiff (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int XMLOBJ_patch (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); /* Prototypes for our repmgr wrappers: */ static int RM_open (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_close (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_publish_all (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_publish_list (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_publish_obj (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_publish_pages (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_publish_page (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_create (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_drop (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_defn (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_define (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_add (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_del (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_mod (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_merge (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_list (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_changes (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_snapshot (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_getkey (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_get (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_format (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_edit (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_display (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_getobjvalue (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_format_string (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_getvalue (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_setvalue (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_get_layout (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_push (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_push_all (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_pull (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_pull_all (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_synch (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_notify (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_attach (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_retrieve (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_submit (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); static int RM_store (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv); |
/* The hash of hashes where interps stash hashes. */ static Tcl_HashTable HashStash; |
static int XMLCmd(ClientData dummy, Tcl_Interp *interp, int argc, char **argv) { Tcl_HashEntry * entry; Tcl_HashTable * handles; int (*handler)(); if (argc < 3) { interp->result = "Usage: xml handle command"; return TCL_ERROR; } /*entry = Tcl_FindHashEntry (&HashStash, (char *) interp); if (!entry) { sprintf (interp->result, "Nope: %ld", interp); return TCL_ERROR; } handles = Tcl_GetHashValue (entry);*/ handles = &HashStash; if (*argv[1] == 'a') { if (!strcmp (argv[1], "attrval")) return XMLAPI_attrval (interp, handles, argc, argv); if (!strcmp (argv[1], "append")) return XMLAPI_append (interp, handles, argc, argv); if (!strcmp (argv[1], "append_pretty")) return XMLAPI_append_pretty (interp, handles, argc, argv); if (!strcmp (argv[1], "attrs")) return XMLAPI_attrs (interp, handles, argc, argv); } else if (*argv[1] == 'c') { if (!strcmp (argv[1], "create")) return XMLAPI_create (interp, handles, argc, argv); if (!strcmp (argv[1], "createtext")) return XMLAPI_createtext (interp, handles, argc, argv); if (!strcmp (argv[1], "copy")) return XMLAPI_copy (interp, handles, argc, argv); if (!strcmp (argv[1], "copyinto")) return XMLAPI_copyinto (interp, handles, argc, argv); } else if (*argv[1] == 'd') { if (!strcmp (argv[1], "delete")) return XMLAPI_delete (interp, handles, argc, argv); } else if (*argv[1] == 'f') { if (!strcmp (argv[1], "free")) return XMLAPI_free (interp, handles, argc, argv); if (!strcmp (argv[1], "firstelem")) return XMLAPI_firstelem (interp, handles, argc, argv); if (!strcmp (argv[1], "first")) return XMLAPI_first (interp, handles, argc, argv); } else if (*argv[1] == 'g') { if (!strcmp (argv[1], "getloc")) return XMLAPI_getloc (interp, handles, argc, argv); } else if (*argv[1] == 'i') { if (!strcmp (argv[1], "is")) return XMLAPI_is (interp, handles, argc, argv); if (!strcmp (argv[1], "is_element")) return XMLAPI_is_element (interp, handles, argc, argv); } else if (*argv[1] == 'l') { if (!strcmp (argv[1], "loc")) return XMLAPI_loc (interp, handles, argc, argv); if (!strcmp (argv[1], "load")) return XMLAPI_load (interp, handles, argc, argv); if (!strcmp (argv[1], "last")) return XMLAPI_last (interp, handles, argc, argv); } else if (*argv[1] == 'n') { if (!strcmp (argv[1], "nextelem")) return XMLAPI_nextelem (interp, handles, argc, argv); if (!strcmp (argv[1], "next")) return XMLAPI_next (interp, handles, argc, argv); if (!strcmp (argv[1], "name")) return XMLAPI_name (interp, handles, argc, argv); } else if (*argv[1] == 'p') { if (!strcmp (argv[1], "parse")) return XMLAPI_parse (interp, handles, argc, argv); if (!strcmp (argv[1], "parent")) return XMLAPI_parent (interp, handles, argc, argv); if (!strcmp (argv[1], "prepend")) return XMLAPI_prepend (interp, handles, argc, argv); if (!strcmp (argv[1], "prev")) return XMLAPI_prev (interp, handles, argc, argv); if (!strcmp (argv[1], "prevelem")) return XMLAPI_prevelem (interp, handles, argc, argv); } else if (*argv[1] == 'r') { if (!strcmp (argv[1], "replace")) return XMLAPI_replace (interp, handles, argc, argv); if (!strcmp (argv[1], "replacecontent")) return XMLAPI_replacecontent (interp, handles, argc, argv); if (!strcmp (argv[1], "read")) return XMLAPI_read (interp, handles, argc, argv); } else if (*argv[1] == 's') { if (!strcmp (argv[1], "set")) return XMLAPI_set (interp, handles, argc, argv); if (!strcmp (argv[1], "string")) return XMLAPI_string (interp, handles, argc, argv); if (!strcmp (argv[1], "stringcontent")) return XMLAPI_stringcontent (interp, handles, argc, argv); if (!strcmp (argv[1], "stringhtml")) return XMLAPI_stringhtml (interp, handles, argc, argv); if (!strcmp (argv[1], "stringcontenthtml")) return XMLAPI_stringcontenthtml (interp, handles, argc, argv); if (!strcmp (argv[1], "search")) return XMLAPI_search (interp, handles, argc, argv); if (!strcmp (argv[1], "search_all")) return XMLAPI_search_all (interp, handles, argc, argv); } else if (*argv[1] == 't') { if (!strcmp (argv[1], "toutf8_attr")) return XMLAPI_toutf8_attr (interp, handles, argc, argv); if (!strcmp (argv[1], "toutr8_text")) return XMLAPI_toutf8_text (interp, handles, argc, argv); if (!strcmp (argv[1], "toraw_str")) return XMLAPI_toraw_str (interp, handles, argc, argv); } else if (*argv[1] == 'w') { if (!strcmp (argv[1], "write")) return XMLAPI_write (interp, handles, argc, argv); if (!strcmp (argv[1], "writecontent")) return XMLAPI_writecontent (interp, handles, argc, argv); if (!strcmp (argv[1], "writehtml")) return XMLAPI_writehtml (interp, handles, argc, argv); if (!strcmp (argv[1], "writecontenthtml")) return XMLAPI_writecontenthtml (interp, handles, argc, argv); } sprintf (interp->result, "Unknown command %s", argv[1]); return TCL_ERROR; } static int XMLOBJCmd(ClientData dummy, Tcl_Interp *interp, int argc, char **argv) { Tcl_HashEntry * entry; Tcl_HashTable * handles; int (*handler)(); if (argc < 3) { interp->result = "Usage: xmlobj cmd <extra>"; return TCL_ERROR; } handles = &HashStash; if (*argv[1] == 'd') { if (!strcmp (argv[1], "diff")) return XMLOBJ_diff (interp, handles, argc, argv); } else if (*argv[1] == 'f') { if (!strcmp (argv[1], "format")) return XMLOBJ_format (interp, handles, argc, argv); } else if (*argv[1] == 'g') { if (!strcmp (argv[1], "get")) return XMLOBJ_get (interp, handles, argc, argv); } else if (*argv[1] == 'p') { if (!strcmp (argv[1], "patch")) return XMLOBJ_patch (interp, handles, argc, argv); } else if (*argv[1] == 's') { if (!strcmp (argv[1], "set")) return XMLOBJ_set (interp, handles, argc, argv); } else if (*argv[1] == 'u') { if (!strcmp (argv[1], "undiff")) return XMLOBJ_undiff (interp, handles, argc, argv); } sprintf (interp->result, "Unknown command %s", argv[1]); return TCL_ERROR; } static int RepmgrCmd(ClientData dummy, Tcl_Interp *interp, int argc, char **argv) { Tcl_HashEntry * entry; Tcl_HashTable * handles; int (*handler)(); if (argc < 3) { interp->result = "Usage: repmgr cmd repository <extra>"; return TCL_ERROR; } handles = &HashStash; if (*argv[1] == 'a') { if (!strcmp (argv[1], "add")) return RM_add (interp, handles, argc, argv); if (!strcmp (argv[1], "attach")) return RM_attach (interp, handles, argc, argv); } else if (*argv[1] == 'c') { if (!strcmp (argv[1], "close")) return RM_close (interp, handles, argc, argv); if (!strcmp (argv[1], "changes")) return RM_changes (interp, handles, argc, argv); if (!strcmp (argv[1], "create")) return RM_create (interp, handles, argc, argv); } else if (*argv[1] == 'd') { if (!strcmp (argv[1], "display")) return RM_display (interp, handles, argc, argv); if (!strcmp (argv[1], "define")) return RM_define (interp, handles, argc, argv); if (!strcmp (argv[1], "del")) return RM_del (interp, handles, argc, argv); if (!strcmp (argv[1], "drop")) return RM_drop (interp, handles, argc, argv); if (!strcmp (argv[1], "defn")) return RM_defn (interp, handles, argc, argv); } else if (*argv[1] == 'e') { if (!strcmp (argv[1], "edit")) return RM_edit (interp, handles, argc, argv); } else if (*argv[1] == 'f') { if (!strcmp (argv[1], "format")) return RM_format (interp, handles, argc, argv); } else if (*argv[1] == 'g') { if (!strcmp (argv[1], "getkey")) return RM_getkey (interp, handles, argc, argv); if (!strcmp (argv[1], "get")) return RM_get (interp, handles, argc, argv); if (!strcmp (argv[1], "getvalue")) return RM_getvalue (interp, handles, argc, argv); if (!strcmp (argv[1], "get_layout")) return RM_get_layout (interp, handles, argc, argv); } else if (*argv[1] == 'l') { if (!strcmp (argv[1], "list")) return RM_list (interp, handles, argc, argv); } else if (*argv[1] == 'm') { if (!strcmp (argv[1], "mod")) return RM_mod (interp, handles, argc, argv); if (!strcmp (argv[1], "merge")) return RM_merge (interp, handles, argc, argv); } else if (*argv[1] == 'n') { if (!strcmp (argv[1], "notify")) return RM_notify (interp, handles, argc, argv); } else if (*argv[1] == 'o') { if (!strcmp (argv[1], "open")) return RM_open (interp, handles, argc, argv); } else if (*argv[1] == 'p') { if (!strcmp (argv[1], "publish_all")) return RM_publish_all (interp, handles, argc, argv); if (!strcmp (argv[1], "publish_list")) return RM_publish_list (interp, handles, argc, argv); if (!strcmp (argv[1], "publish_obj")) return RM_publish_obj (interp, handles, argc, argv); if (!strcmp (argv[1], "publish_pages")) return RM_publish_pages (interp, handles, argc, argv); if (!strcmp (argv[1], "publish_page")) return RM_publish_page (interp, handles, argc, argv); if (!strcmp (argv[1], "push")) return RM_push (interp, handles, argc, argv); if (!strcmp (argv[1], "push_all")) return RM_push_all (interp, handles, argc, argv); if (!strcmp (argv[1], "pull")) return RM_pull (interp, handles, argc, argv); if (!strcmp (argv[1], "pull_all")) return RM_pull_all (interp, handles, argc, argv); } else if (*argv[1] == 'r') { if (!strcmp (argv[1], "retrieve")) return RM_retrieve (interp, handles, argc, argv); } else if (*argv[1] == 's') { if (!strcmp (argv[1], "synch")) return RM_synch (interp, handles, argc, argv); if (!strcmp (argv[1], "snapshot")) return RM_snapshot (interp, handles, argc, argv); if (!strcmp (argv[1], "setvalue")) return RM_setvalue (interp, handles, argc, argv); if (!strcmp (argv[1], "submit")) return RM_submit (interp, handles, argc, argv); if (!strcmp (argv[1], "store")) return RM_store (interp, handles, argc, argv); } sprintf (interp->result, "Unknown command %s", argv[1]); return TCL_ERROR; } |
static int XMLAPIInterpInit(Tcl_Interp *interp, void *context) { int newentry; Tcl_HashEntry * entry; /*Tcl_HashTable * handles = ns_malloc (sizeof (Tcl_HashTable)); Tcl_InitHashTable (handles, TCL_STRING_KEYS); entry = Tcl_CreateHashEntry (&HashStash, (char *) interp, &newentry); Tcl_SetHashValue (entry, handles);*/ Tcl_CreateCommand(interp, XML_COMMAND, XMLCmd, NULL, NULL); Tcl_CreateCommand(interp, REPMGR_COMMAND, RepmgrCmd, NULL, NULL); Tcl_CreateCommand(interp, XMLOBJ_COMMAND, XMLOBJCmd, NULL, NULL); return NS_OK; } static int XMLAPIHashTableCleanup (Tcl_HashTable * handles) { return NS_OK; } DllExport int Ns_ModuleInit(char *hServer, char *hModule) { struct _cmdinfo * cmd; int newentry; Tcl_HashEntry * entry; Tcl_InitHashTable (&HashStash, TCL_STRING_KEYS); /*Tcl_InitHashTable (&CmdHash, TCL_STRING_KEYS); for (cmd = commands; cmd->name != NULL; cmd++) { entry = Tcl_CreateHashEntry (&CmdHash, cmd->name, &newentry); Tcl_SetHashValue (entry, cmd->proc); }*/ return (Ns_TclInitInterps(hServer, XMLAPIInterpInit, NULL)); } static Tcl_HashEntry * prepare_entry (Tcl_HashTable * handles, char * name) { int newentry; Tcl_HashEntry * entry; XML * xml; entry = Tcl_CreateHashEntry (handles, name, &newentry); if (!newentry) { xml = Tcl_GetHashValue (entry); if (!xml_parent (xml)) xml_free (xml); } return entry; } |
/* ---------------------------------------------------------------------------------- Implementation of XMLAPI wrapper functions ---------------------------------------------------------------------------------- */ static int XMLAPI_free (Tcl_Interp * interp, Tcl_HashTable * handles, int argc, char **argv) { int newentry; Tcl_HashEntry * entry; XML * xml; /* Find and dispose of any pre-existing XML attached to the handle. */ entry = Tcl_FindHashEntry (handles, argv[2]); if (entry) { xml = Tcl_GetHashValue (entry); if (!xml_parent (xml)) xml_free (xml); Tcl_SetHashValue (entry, NULL); } return TCL_OK; } static int XMLAPI_load (Tcl_Interp * interp, Tcl_HashTable * handles, int argc, char **argv) { int newentry; Tcl_HashEntry * entry; XML * xml; /* Find and dispose of any pre-existing XML attached to the handle. */ entry = prepare_entry (handles, argv[2]); xml = xml_load (argv[3]); Tcl_SetHashValue (entry, xml); return TCL_OK; } static int XMLAPI_save (Tcl_Interp * interp, Tcl_HashTable * handles, int argc, char **argv) { int newentry; Tcl_HashEntry * entry; XML * xml; entry = Tcl_FindHashEntry (handles, argv[2]); if (entry) { xml = Tcl_GetHashValue (entry); xml_save (xml, argv[3]); } return TCL_OK; } static int XMLAPI_write (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; FILE * file = NULL; Tcl_GetOpenFile (interp, argv[3], 1, 0, (ClientData *) &file); if (!file) { strcpy (interp->result, "Can't access file"); return TCL_ERROR; } entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { strcpy (interp->result, "Unknown handle"); return TCL_ERROR; } xml = Tcl_GetHashValue (entry); xml_write (file, xml); return TCL_OK; } static int XMLAPI_writecontent (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; FILE * file = NULL; Tcl_GetOpenFile (interp, argv[3], 1, 0, (ClientData *) &file); if (!file) { strcpy (interp->result, "Can't access file"); return TCL_ERROR; } entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { strcpy (interp->result, "Unknown handle"); return TCL_ERROR; } xml = Tcl_GetHashValue (entry); xml_writecontent (file, xml); return TCL_OK; } static int XMLAPI_writehtml (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; FILE * file = NULL; Tcl_GetOpenFile (interp, argv[3], 1, 0, (ClientData *) &file); if (!file) { strcpy (interp->result, "Can't access file"); return TCL_ERROR; } entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { strcpy (interp->result, "Unknown handle"); return TCL_ERROR; } xml = Tcl_GetHashValue (entry); xml_writehtml (file, xml); return TCL_OK; } static int XMLAPI_writecontenthtml (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; FILE * file = NULL; if (!file) { strcpy (interp->result, "Can't access file"); return TCL_ERROR; } entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { strcpy (interp->result, "Unknown handle"); return TCL_ERROR; } xml = Tcl_GetHashValue (entry); xml_writecontenthtml (file, xml); return TCL_OK; } static int XMLAPI_string (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; char * result; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } xml = Tcl_GetHashValue (entry); result = xml_string (xml); Tcl_SetResult (interp, result, TCL_DYNAMIC); return TCL_OK; } static int XMLAPI_stringcontent (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; char * result; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } xml = Tcl_GetHashValue (entry); result = xml_stringcontent (xml); Tcl_SetResult (interp, result, TCL_DYNAMIC); return TCL_OK; } static int XMLAPI_stringhtml (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; char * result; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } xml = Tcl_GetHashValue (entry); result = xml_stringhtml (xml); Tcl_SetResult (interp, result, TCL_DYNAMIC); return TCL_OK; } static int XMLAPI_stringcontenthtml (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; char * result; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } xml = Tcl_GetHashValue (entry); result = xml_stringcontenthtml (xml); Tcl_SetResult (interp, result, TCL_DYNAMIC); return TCL_OK; } static int XMLAPI_prepend (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * dest; XML * src; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } dest = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[3]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); xml_prepend (dest, src); return TCL_OK; } static int XMLAPI_append (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * dest; XML * src; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } dest = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[3]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); xml_append (dest, src); return TCL_OK; } static int XMLAPI_append_pretty (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * dest; XML * src; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } dest = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[3]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); xml_append_pretty (dest, src); return TCL_OK; } static int XMLAPI_replace (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * dest; XML * src; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } dest = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[3]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); xml_replace (dest, src); Tcl_SetHashValue (entry, NULL); /* Don't need this one any more! */ return TCL_OK; } static int XMLAPI_replacecontent (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * dest; XML * src; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } dest = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[3]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); xml_replacecontent (dest, src); return TCL_OK; } static int XMLAPI_loc (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; XML * src; entry = Tcl_FindHashEntry (handles, argv[4]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[4]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); entry = prepare_entry (handles, argv[2]); xml = xml_loc (src, argv[3]); Tcl_SetHashValue (entry, xml); return TCL_OK; } static int XMLAPI_getloc (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; char * loc; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } xml = Tcl_GetHashValue (entry); loc = xml_getlocbuf (xml); Tcl_SetResult (interp, loc, TCL_DYNAMIC); return TCL_OK; } static int XMLAPI_set (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; char * loc; if (argc < 5) { sprintf (interp->result, "Usage: xml [handle] set [attr] [value]"); return TCL_ERROR; } entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } xml = Tcl_GetHashValue (entry); xml_set (xml, argv[3], argv[4]); return TCL_OK; } static int XMLAPI_attrval (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; char * res; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } xml = Tcl_GetHashValue (entry); res = (char *) xml_attrval (xml, argv[3]); Tcl_SetResult (interp, res, TCL_VOLATILE); return TCL_OK; } static int XMLAPI_attrs (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int XMLAPI_create (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; entry = prepare_entry (handles, argv[2]); xml = xml_create (argv[3]); Tcl_SetHashValue (entry, xml); return TCL_OK; } static int XMLAPI_createtext (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; entry = prepare_entry (handles, argv[2]); xml = xml_createtext (argv[3]); Tcl_SetHashValue (entry, xml); return TCL_OK; } static int XMLAPI_delete (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; char * res; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } xml = Tcl_GetHashValue (entry); xml_delete (xml); Tcl_SetHashValue (entry, NULL); return TCL_OK; } static int XMLAPI_is (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; char * res; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } xml = Tcl_GetHashValue (entry); if (argc < 4) { if (xml) strcpy (interp->result, "1"); else strcpy (interp->result, "0"); } else { if (xml_is (xml, argv[3])) strcpy (interp->result, "1"); else strcpy (interp->result, "0"); } return TCL_OK; } static int XMLAPI_name (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; char * res; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } xml = Tcl_GetHashValue (entry); res = (char *) xml_name (xml); Tcl_SetResult (interp, res, TCL_VOLATILE); return TCL_OK; } static int XMLAPI_is_element (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; char * res; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } xml = Tcl_GetHashValue (entry); if (xml_is_element (xml)) strcpy (interp->result, "1"); else strcpy (interp->result, "0"); return TCL_OK; } static int XMLAPI_parent (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; XML * src; if (argc > 3) { entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[3]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); entry = prepare_entry (handles, argv[2]); } else { entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); } xml = xml_parent (src); Tcl_SetHashValue (entry, xml); return TCL_OK; } static int XMLAPI_first (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; XML * src; if (argc > 3) { entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[3]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); entry = prepare_entry (handles, argv[2]); } else { entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); } xml = xml_first (src); Tcl_SetHashValue (entry, xml); return TCL_OK; } static int XMLAPI_firstelem (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; XML * src; if (argc > 3) { entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[3]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); entry = prepare_entry (handles, argv[2]); } else { entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); } xml = xml_firstelem (src); Tcl_SetHashValue (entry, xml); return TCL_OK; } static int XMLAPI_last (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; XML * src; if (argc > 3) { entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[3]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); entry = prepare_entry (handles, argv[2]); } else { entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); } xml = xml_last (src); Tcl_SetHashValue (entry, xml); return TCL_OK; } static int XMLAPI_lastelem (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; XML * src; if (argc > 3) { entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[3]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); entry = prepare_entry (handles, argv[2]); } else { entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); } xml = xml_lastelem (src); Tcl_SetHashValue (entry, xml); return TCL_OK; } static int XMLAPI_next (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; XML * src; if (argc > 3) { entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[3]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); entry = prepare_entry (handles, argv[2]); } else { entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); } xml = xml_next (src); Tcl_SetHashValue (entry, xml); return TCL_OK; } static int XMLAPI_nextelem (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; XML * src; if (argc > 3) { entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[3]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); entry = prepare_entry (handles, argv[2]); } else { entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); } xml = xml_nextelem (src); Tcl_SetHashValue (entry, xml); return TCL_OK; } static int XMLAPI_prev (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; XML * src; if (argc > 3) { entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[3]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); entry = prepare_entry (handles, argv[2]); } else { entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); } xml = xml_prev (src); Tcl_SetHashValue (entry, xml); return TCL_OK; } static int XMLAPI_prevelem (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; XML * src; if (argc > 3) { entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[3]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); entry = prepare_entry (handles, argv[2]); } else { entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); } xml = xml_prevelem (src); Tcl_SetHashValue (entry, xml); return TCL_OK; } static int XMLAPI_copy (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; XML * src; entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[4]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); entry = prepare_entry (handles, argv[2]); xml = xml_copy (src); Tcl_SetHashValue (entry, xml); return TCL_OK; } static int XMLAPI_copyinto (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * dest; XML * src; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } dest = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[3]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); xml_copyinto (dest, src); return TCL_OK; } static int XMLAPI_read (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; FILE * file = NULL; Tcl_GetOpenFile (interp, argv[3], 0, 0, (ClientData *) &file); if (!file) { strcpy (interp->result, "Can't access file"); return TCL_ERROR; } entry = prepare_entry (handles, argv[2]); xml = xml_read_error (file); Tcl_SetHashValue (entry, xml); return TCL_OK; } static int XMLAPI_parse (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; entry = prepare_entry (handles, argv[2]); xml = xml_parse (argv[3]); Tcl_SetHashValue (entry, xml); return TCL_OK; } static int XMLAPI_search (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * xml; XML * src; entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[3]); return TCL_ERROR; } src = Tcl_GetHashValue (entry); entry = prepare_entry (handles, argv[2]); xml = xml_search (src, argc > 4 ? argv[4] : NULL, argc > 5 ? argv[5] : NULL, argc > 6 ? argv[6] : NULL); Tcl_SetHashValue (entry, xml); return TCL_OK; } static int XMLAPI_search_all (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int XMLAPI_toutf8_attr (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int XMLAPI_toutf8_text (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int XMLAPI_toraw_str (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } /* --------------------------------------------------------------------------------- Implementation of xmlobj wrapper functions --------------------------------------------------------------------------------- */ static int XMLOBJ_get (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * obj; XML * class; char * result; if (argc < 5) { strcpy (interp->result, "usage: xmlobj get obj class field"); return TCL_ERROR; } entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[4]); return TCL_ERROR; } obj = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) class = NULL; else class = Tcl_GetHashValue (entry); result = xmlobj_get (obj, class, argv[4]); Tcl_SetResult (interp, result, TCL_DYNAMIC); return TCL_OK; } static int XMLOBJ_format (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * obj; XML * class; char * result; if (argc < 5) { strcpy (interp->result, "usage: xmlobj format obj class \"string[field]string\""); return TCL_ERROR; } entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } obj = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) class = NULL; else class = Tcl_GetHashValue (entry); result = xmlobj_format (obj, class, argv[4]); Tcl_SetResult (interp, result, TCL_DYNAMIC); return TCL_OK; } static int XMLOBJ_set (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * obj; XML * class; if (argc < 6) { strcpy (interp->result, "usage: xmlobj set obj class field value"); return TCL_ERROR; } entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } obj = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) class = NULL; else class = Tcl_GetHashValue (entry); xmlobj_set (obj, class, argv[4], argv[5]); return TCL_OK; } static int XMLOBJ_diff (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * obj; XML * class; XML * comp; XML * diff; if (argc < 5) { strcpy (interp->result, "usage: xmlobj diff obj class target [diff-result]"); return TCL_ERROR; } entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } obj = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) class = NULL; else class = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[4]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[4]); return TCL_ERROR; } comp = Tcl_GetHashValue (entry); diff = xmlobj_diff (obj, class, comp); if (xml_firstelem (diff)) strcpy (interp->result, "1"); else strcpy (interp->result, "0"); if (argc > 5) { entry = prepare_entry (handles, argv[5]); Tcl_SetHashValue (entry, diff); } else xml_free (diff); return TCL_OK; } static int XMLOBJ_patch (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * obj; XML * class; XML * comp; XML * diff; if (argc < 5) { strcpy (interp->result, "usage: xmlobj patch obj class patch [undiff]"); return TCL_ERROR; } entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } obj = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) class = NULL; else class = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[4]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[4]); return TCL_ERROR; } comp = Tcl_GetHashValue (entry); diff = xmlobj_patch (obj, class, comp); if (xml_firstelem (diff)) strcpy (interp->result, "1"); else strcpy (interp->result, "0"); if (argc > 5) { entry = prepare_entry (handles, argv[5]); Tcl_SetHashValue (entry, diff); } else xml_free (diff); return TCL_OK; } static int XMLOBJ_undiff (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * obj; XML * class; XML * comp; XML * diff; if (argc < 6) { strcpy (interp->result, "usage: xmlobj undiff obj class patch undiff"); return TCL_ERROR; } entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } obj = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[3]); if (!entry) class = NULL; else class = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[4]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[4]); return TCL_ERROR; } comp = Tcl_GetHashValue (entry); diff = xmlobj_patch (obj, class, comp); if (xml_firstelem (diff)) strcpy (interp->result, "1"); else strcpy (interp->result, "0"); entry = prepare_entry (handles, argv[5]); Tcl_SetHashValue (entry, diff); return TCL_OK; } /* ---------------------------------------------------------------------------------- Implementation of repmgr wrapper functions ---------------------------------------------------------------------------------- */ static int RM_open (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * repos; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } repos = Tcl_GetHashValue (entry); repos_open (repos, NULL, "Tcl"); return TCL_OK; } static int RM_close (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * repos; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } repos = Tcl_GetHashValue (entry); repos_close (repos); return TCL_OK; } static int RM_publish_all (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_publish_list (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_publish_obj (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_publish_pages (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_publish_page (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_create (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_drop (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_defn (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * repos; XML * obj; if (argc < 5) { strcpy (interp->result, "usage: repmgr defn <repos> <defn> <list_id>"); return TCL_ERROR; } entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } repos = Tcl_GetHashValue (entry); entry = prepare_entry (handles, argv[3]); obj = repos_defn (repos, argv[4]); Tcl_SetHashValue (entry, obj); return TCL_OK; } static int RM_define (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_add (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * repos; XML * obj; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } repos = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[4]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[4]); return TCL_ERROR; } obj = Tcl_GetHashValue (entry); repos_add (repos, argv[3], obj); strcpy (interp->result, repos_getkey (repos, argv[3], obj)); return TCL_OK; } static int RM_del (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * repos; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } repos = Tcl_GetHashValue (entry); repos_del (repos, argv[3], argv[4]); return TCL_OK; } static int RM_mod (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * repos; XML * obj = NULL; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } repos = Tcl_GetHashValue (entry); if (strcmp (argv[4], "-")) { entry = Tcl_FindHashEntry (handles, argv[4]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[4]); return TCL_ERROR; } obj = Tcl_GetHashValue (entry); } repos_mod (repos, argv[3], obj, argc > 5 ? argv[5] : NULL); return TCL_OK; } |
static int RM_merge (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * repos; XML * obj = NULL; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } repos = Tcl_GetHashValue (entry); if (strcmp (argv[4], "-")) { entry = Tcl_FindHashEntry (handles, argv[4]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[4]); return TCL_ERROR; } obj = Tcl_GetHashValue (entry); } repos_merge (repos, argv[3], obj, argc > 5 ? argv[5] : NULL); return TCL_OK; } |
static int RM_list (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * repos; XML * list; int list_local; XML * mark; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } repos = Tcl_GetHashValue (entry); if (argc > 4) { entry = Tcl_FindHashEntry (handles, argv[4]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[4]); return TCL_ERROR; } list = Tcl_GetHashValue (entry); list_local = 0; } else { list = xml_create ("list"); list_local = 1; } xml_set (list, "id", argc > 3 ? argv[3] : "_lists"); repos_list (repos, list); if (*xml_attrval (list, "error-state")) { Tcl_SetResult (interp, (char *) xml_attrval (list, "error-state"), TCL_VOLATILE); if (list_local) xml_free (list); return TCL_ERROR; } mark = xml_firstelem (list); while (mark) { Tcl_AppendElement (interp, (char *)xml_attrval (mark, "id")); mark = xml_nextelem (mark); } if (list_local) xml_free (list); return TCL_OK; } static int RM_changes (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * repos; XML * list; XML * mark; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } repos = Tcl_GetHashValue (entry); list = xml_create ("list"); repos_changes (repos, list, argv[4], argv[5]); if (*xml_attrval (list, "error-state")) { Tcl_SetResult (interp, (char *) xml_attrval (list, "error-state"), TCL_VOLATILE); xml_free (list); return TCL_ERROR; } mark = xml_firstelem (list); while (mark) { Tcl_AppendElement (interp, (char *)xml_attrval (mark, "id")); mark = xml_nextelem (mark); } xml_free (list); return TCL_OK; } static int RM_snapshot (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_getkey (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_get (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * repos; XML * obj; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } repos = Tcl_GetHashValue (entry); entry = prepare_entry (handles, argv[3]); obj = repos_get (repos, argv[4], argv[5]); Tcl_SetHashValue (entry, obj); return TCL_OK; } static int RM_format (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * repos; XML * obj; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } repos = Tcl_GetHashValue (entry); entry = prepare_entry (handles, argv[3]); obj = repos_form (repos, argv[4], argv[5], argv[6]); Tcl_SetHashValue (entry, obj); return TCL_OK; } static int RM_edit (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * repos; XML * obj; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } repos = Tcl_GetHashValue (entry); entry = prepare_entry (handles, argv[3]); obj = repos_form (repos, argv[4], argv[5], "edit"); Tcl_SetHashValue (entry, obj); return TCL_OK; } static int RM_display (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * repos; XML * obj; entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } repos = Tcl_GetHashValue (entry); entry = prepare_entry (handles, argv[3]); obj = repos_form (repos, argv[4], argv[5], "display"); Tcl_SetHashValue (entry, obj); return TCL_OK; } static int RM_notify (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * repos; XML * obj; XML * notification; int release_notification = 0; /* repository, list, key, obj, notification ID or XML, subject, recipient */ entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } repos = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[5]); if (!entry) obj = NULL; else obj = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[6]); if (!entry) { notification = repos_get (repos, "_notifications", argv[6]); release_notification = 1; } else { notification = Tcl_GetHashValue (entry); } repos_notify_direct (repos, argv[3], argv[4], obj, notification, argc > 7 ? (*argv[7] ? argv[7] : NULL) : NULL, argc > 8 ? (*argv[8] ? argv[8] : NULL) : NULL); if (*xml_attrval (notification, "error")) { strcpy (interp->result, xml_attrval (notification, "error")); } if (release_notification) xml_free (notification); return TCL_OK; } |
static int RM_submit (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * repos; XML * obj; if (argc < 6) { strcpy (interp->result, "usage: repmgr submit <repos> <list_id> <values_xml> <doc data>"); return TCL_ERROR; } entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } repos = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[4]); if (!entry) { sprintf (interp->result, "No handle '%s' (must have valid object to add)", argv[3]); return TCL_ERROR; } obj = Tcl_GetHashValue (entry); repos_submit (repos, argv[3], obj, argv[5]); /* TODO: handle return value */ strcpy (interp->result, repos_getkey (repos, argv[3], obj)); return TCL_OK; } static int RM_store (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { Tcl_HashEntry * entry; XML * repos; XML * obj; if (argc < 6) { strcpy (interp->result, "usage: repmgr submit <repos> <list_id> <values_xml> <doc filename>"); return TCL_ERROR; } entry = Tcl_FindHashEntry (handles, argv[2]); if (!entry) { sprintf (interp->result, "No handle '%s'", argv[2]); return TCL_ERROR; } repos = Tcl_GetHashValue (entry); entry = Tcl_FindHashEntry (handles, argv[4]); if (!entry) { sprintf (interp->result, "No handle '%s' (must have valid object to add)", argv[3]); return TCL_ERROR; } obj = Tcl_GetHashValue (entry); repos_store (repos, argv[3], obj, argv[5]); strcpy (interp->result, repos_getkey (repos, argv[3], obj)); return TCL_OK; } |
static int RM_attach (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_retrieve (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_getvalue (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_setvalue (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_get_layout (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_push (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_push_all (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_pull (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_pull_all (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } static int RM_synch (Tcl_Interp *interp, Tcl_HashTable * handles, int argc, char **argv) { return TCL_OK; } |
This code and documentation are released under the terms of the GNU license. They are copyright (c) 2002-2004, Vivtek. All rights reserved except those explicitly granted under the terms of the GNU license. This presentation was prepared with LPML. Try literate programming. You'll like it. |