diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /vendor/voclient/libvotable/votExpatCB.c | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'vendor/voclient/libvotable/votExpatCB.c')
-rw-r--r-- | vendor/voclient/libvotable/votExpatCB.c | 303 |
1 files changed, 303 insertions, 0 deletions
diff --git a/vendor/voclient/libvotable/votExpatCB.c b/vendor/voclient/libvotable/votExpatCB.c new file mode 100644 index 00000000..fcc080e5 --- /dev/null +++ b/vendor/voclient/libvotable/votExpatCB.c @@ -0,0 +1,303 @@ +/** + * VOTEXPATCB.C -- (Private) Expat XML Parser callback methods. + * + * @file votExpatCB.c + * @author Mike Fitzpatrick and Eric Timmermann + * @date 8/03/09 + * + * @brief (Private) Expat parser XML callback methods + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <expat.h> +#include <unistd.h> +#include <ctype.h> + +#include "votParseP.h" +#include "votParse.h" + + +extern Stack *element_stack; + +static void vot_compileTable (Element *tdata); + + +/** + * vot_startElement -- CB whenever a start tag is seen (private method) + * + * @brief CB whenever a start tag is seen (private method) + * @fn vot_startElement (void *user, const char *name, const char **atts) + * + * @param user User data (not used) + * @param name The name in the XML tag. + * @param atts An array of attributes. + * @return nothing + */ + +void +vot_startElement (void *user, const char *name, const char **atts) +{ + Element *me, *cur; + int att, type, cols, rows; + char name_str[SZ_ATTRNAME], value[SZ_ATTRNAME], tempstr[SZ_ATTRNAME]; + + + memset (name_str, 0, SZ_ATTRNAME); + strncpy (name_str, name, (SZ_ATTRNAME - 1)); + + type = vot_eType (name_str); + + /* Check or deprecated elements. + */ + if (type == TY_DEFINITIONS) + votEmsg ("<DEFINITIONS> element was deprecated in v1.1\n"); + if (type == TY_COOSYS) + votEmsg ("<COOSYS> element was deprecated in v1.2\n"); + + if (type != -1) { + if ((me = vot_newElem (type)) == (Element *) NULL) + fprintf (stderr, "Cannot create new element for <%s>\n", name_str); + + if (!vot_isEmpty (element_stack)) { + cur = votPeek (element_stack); + + if (cur->child) + cur->last_child->next = me; + else + cur->child = me; + + cur->last_child = me; + + vot_setHandle (me); + + /* Gets the attributes. + */ + for (att=0; atts[att]; att+=2) + vot_attrSet (me->attr, (char *)atts[att], (char *)atts[att+1]); + + if (me->type == TY_TABLE) { + cols = rows = 0; + strcpy (tempstr, "NCOLS"); + sprintf (value, "%i", cols); + vot_attrSet (me->attr, tempstr, value); + + strcpy (tempstr, "NROWS"); + sprintf (value, "%i", rows); + vot_attrSet (me->attr, tempstr, value); + } + me->parent = cur; + + votPush (element_stack, me); + + } else + fprintf (stderr, "ERROR: No Root node!\n"); + } +} + + +/** + * vot_endElement -- CB whenever an end tag is seen (private method) + * + * @brief CB whenever an end tag is seen (private method) + * @fn vot_endElement (void *user, const char *name) + * + * @param user User data (not used) + * @param name The name in the XML tag + * @return nothing + */ +void +vot_endElement (void *user, const char *name) +{ + static int cols = 0, rows = 0; + Element *cur, *parent; + int type; + char name_str[SZ_ATTRNAME]; + char value[SZ_ATTRNAME]; + char tempstr[SZ_ATTRNAME]; + + + memset (value, 0, SZ_ATTRNAME); + memset (tempstr, 0, SZ_ATTRNAME); + memset (name_str, 0, SZ_ATTRNAME); + strncpy (name_str, name, (SZ_ATTRNAME - 1)); + + if ( (type = vot_eType (name_str)) != -1) { + /* BUILD TYPE */ + if (element_stack->head) { + cur = votPop (element_stack); + + if (!vot_isEmpty (element_stack)) { + parent = element_stack->head->element; + + if (parent->type == TY_TABLE) { + if (cur->type == TY_FIELD) { + strcpy (tempstr, "NCOLS"); + cols = (atoi (vot_attrGet (parent->attr, tempstr)) + 1); + sprintf (value, "%i", cols); + vot_attrSet (parent->attr, tempstr, value); + } + } + + if (parent->type == TY_TABLEDATA) { + if (cur->type == TY_TR) { + strcpy (tempstr, "NROWS"); + rows = atoi (vot_attrGet (parent->parent->parent->attr, + tempstr)) + 1; + sprintf (value, "%i", rows); + vot_attrSet (parent->parent->parent->attr, + tempstr, value); + } + } + + if (cur->type == TY_TABLEDATA) + vot_compileTable (cur); + } + + if (cur->type != type) + fprintf (stderr, "ERROR: Malformed XML!!!!!\n%s not matched.", + vot_elemName (cur)); + + } else + fprintf (stderr, "ERROR: No Root node!\n"); + } +} + + +/** + * vot_charData -- Handle non-element character strings (private method) + * + * @brief Handle non-element character strings (private method) + * @fn vot_charData (void *user, const XML_Char *s, int len) + * + * @param user User data (not used) + * @param s content string + * @param len length of string + * @return nothing + */ +void +vot_charData (void *user, const XML_Char *s, int len) +{ + Element *cur; + char *ip = (char *) s; + char *rstr; + int clen = 0; + + + cur = votPeek (element_stack); + clen = (cur->content ? strlen (cur->content) : 0); + +#ifdef STRIP_NL + while (len && isspace (*ip)) /* Strip newlines from content. */ + ip++, len--; +#endif + + if (len > 0 && ip && *ip) { + if (cur->content == NULL) { + cur->content = (char *) calloc ((len + 2), sizeof (char)); + } else { + if ((rstr = (char *) realloc (cur->content, (clen + len + 2)) )) + cur->content = rstr; + else + fprintf (stderr, "ERROR: Could not realloc charData space.\n"); + } + strncat (cur->content, ip, len); + } +} + + +/** + * vot_startCData -- Handle the start of CDATA strings (private method) + * + * @brief Handle the start of CDATA strings (private method) + * @fn vot_startCData (void *user) + * + * @param user User data (not used) + * @return nothing + */ +void +vot_startCData (void *user) +{ + Element *cur = votPeek (element_stack); + cur->isCData = 1; +} + + +/** + * vot_endCData -- Handle the end of CDATA strings (private method) + * + * @brief Handle the end of CDATA strings (private method) + * @fn vot_endCData (void *user) + * + * @param user User data (not used) + * @return nothing + */ +void +vot_endCData (void *user) +{ + ; +} + + + + +/**************************************************************************** + * Private procedures. + ****************************************************************************/ + +/** + * vot_compileTable -- Compile a table of strings for easy access + * + * @brief Compile a table of strings for easy access (private method) + * @fn vot_compileTable (Element *tdata) + * + * @param tdata TABLEDATA Element containing values to compile + * @return nothing + */ +static void +vot_compileTable (Element *tdata) +{ + Element *r = NULL, *c = NULL; + handle_t r_h, c_h, tdata_h; + int cols, rows, ncells, i, j; + char **ip; + + + if (tdata->type != TY_TABLEDATA) { + votEmsg ("Arg must be a TABLEDATA element to compile.\n"); + return; + } + + tdata_h = vot_lookupHandle (tdata); + + cols = vot_getNCols (tdata_h); + rows = vot_getNRows (tdata_h); + ncells = rows * cols; + + if (ncells == 0) /* e.g. a metadata votable return */ + return; + + if (tdata->data) + free (tdata->data); + tdata->data = (char **) calloc (ncells, sizeof (char *)); + + ip = tdata->data; + + r_h = vot_getTR (vot_lookupHandle (tdata)); + r = vot_getElement (r_h); + + c_h = vot_getTD (vot_lookupHandle (r)); + c = vot_getElement (c_h); + + for (i = 1 ; r; i++) { + for (j = 1; c; j++) { + *ip++ = c->content; + c = c->next; + } + r = r->next; + + if (r) + c = r->child; + } +} |