diff options
Diffstat (limited to 'vendor/voclient/libvotable/votElement.c')
-rw-r--r-- | vendor/voclient/libvotable/votElement.c | 295 |
1 files changed, 295 insertions, 0 deletions
diff --git a/vendor/voclient/libvotable/votElement.c b/vendor/voclient/libvotable/votElement.c new file mode 100644 index 00000000..713303b1 --- /dev/null +++ b/vendor/voclient/libvotable/votElement.c @@ -0,0 +1,295 @@ +/** + * VOTELEMENT.C -- (Private) Method to manage XML elements. + * + * @file votElement.c + * @author Mike Fitzpatrick and Eric Timmermann + * @date 8/03/09 + * + * @brief (Private) Methods to manage XML elements. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> + +#include "votParseP.h" +#include "votParse.h" + +static void vot_setDefaultAttrs (AttrBlock *ablock); + +struct { + int type; /** element type */ + char *name; /** element name */ +} elemTypes[] = { + { TY_ROOT, "ROOT" }, + { TY_VOTABLE, "VOTABLE" }, + { TY_RESOURCE, "RESOURCE" }, + { TY_FIELD, "FIELD" }, + { TY_PARAM, "PARAM" }, + { TY_INFO, "INFO" }, + { TY_TR, "TR" }, + { TY_TD, "TD" }, + { TY_TABLE, "TABLE" }, + { TY_TABLEDATA, "TABLEDATA" }, + { TY_DATA, "DATA" }, + { TY_STREAM, "STREAM" }, + { TY_FITS, "FITS" }, + { TY_GROUP, "GROUP" }, + { TY_FIELDREF, "FIELDREF" }, + { TY_PARAMREF, "PARAMREF" }, + { TY_MIN, "MIN" }, + { TY_MAX, "MAX" }, + { TY_OPTION, "OPTION" }, + { TY_VALUES, "VALUES" }, + { TY_LINK, "LINK" }, + { TY_COOSYS, "COOSYS" }, + { TY_DESCRIPTION, "DESCRIPTION" }, + { TY_DEFINITIONS, "DEFINITIONS" }, + { -1, NULL } +}; + + +/** + * Definition of Required and Optional attributes of VOTable elements. + */ +struct { + int type; /** element type */ + char *req; /** required attrs */ + char *opt; /** optional attrs */ +} elemAttrs[] = { + { TY_ROOT, "", + "" }, + { TY_VOTABLE, "", + "ID|version|" }, + { TY_RESOURCE, "", + "ID|name|type|utype|" }, + { TY_TABLE, "", + "ID|name|ucd|utype|ref|nrows|ncols|" }, + { TY_INFO, "name|value|", + "ID|unit|ucd|utype|ref|" }, + { TY_STREAM, "", + "type|href|actuate|encoding|expires|rights|serialization" }, + { TY_FITS, "", + "extnum|" }, + { TY_TD, "", + "encoding|serialization" }, + { TY_TR, "", + "" }, + { TY_COOSYS, "", + "ID|equinox|epoch|system|" }, + { TY_DESCRIPTION, "", + "" }, + { TY_DEFINITIONS, "", + "" }, + { TY_DATA, "", + "" }, + { TY_TABLEDATA,"", + "nrows|ncols" }, + { TY_GROUP, "", + "ID|name|ucd|utype|ref|" }, + { TY_PARAM, "datatype|name|value|", + "ID|unit|ucd|utype|ref|precision|width|arraysize|" }, + { TY_FIELD, "datatype|name|type|xtype|", + "ID|unit|ucd|utype|ref|precision|width|arraysize|" }, + { TY_FIELDREF, "ref|", + "ucd|utype" }, + { TY_PARAMREF, "ref|", + "ucd|utype" }, + { TY_MIN, "value|", + "inclusive|" }, + { TY_MAX, "value|", + "inclusive|" }, + { TY_OPTION, "value|", + "name|" }, + { TY_VALUES, "", + "ID|type|null|ref|" }, + { TY_LINK, "action|", + "ID|content-role|content-type|title|value|href|" }, + { -1, NULL, NULL } +}; + + + +/** + * vot_elemType -- Get the integer value (ID) of the Element (private method) + * + * @brief Get the integer value (ID) of the Element (private method) + * @fn int vot_elemType (Element *e) + * + * @param e A pointer to the Element that you want the type of + * @return An integer corresponding to the type of the element + */ +int +vot_elemType (Element *e) +{ + return ( (e == NULL ? -1 : e->type) ); +} + + +/** + * vot_elemName -- Get the name of the Element (private method). + * + * @brief Get the name of the Element (private method) + * @fn char *vot_elemName (Element *e) + * + * @param *e A pointer to the Element that you want the name of + * @return A string pointer to the name of the element + */ +char * +vot_elemName (Element *e) +{ + register int i; + + for (i=0; elemTypes[i].type >= 0; i++) { + if (e->type == elemTypes[i].type) + return (elemTypes[i].name); + } + return (NULL); +} + + +/** + * vot_eType -- Get the integer value (ID) of the name (private method). + * + * @brief Get the integer value (ID) of the name (private method) + * @fn int vot_eType (char *name) + * + * @param name Name of the desired type + * @return An integer corresponding to the type of the element + */ +int +vot_eType (char *name) +{ + register int i; + + for (i=0; elemTypes[i].type >= 0; i++) { + if (strcasecmp (name, elemTypes[i].name) == 0) + return (elemTypes[i].type); + } + return (-1); +} + + +/** + * vot_elemXMLEnd -- Build a string of the ending XML Tag (private method) + * + * @brief Build a string of the ending XML Tag (private method) + * @fn char *vot_elemXMLEnd (Element *e) + * + * @param *e A pointer to an Element + * @return A string that contains the ending XML tag for e + */ +char * +vot_elemXMLEnd (Element *e) +{ + char *XML_out = (char *) calloc (SZ_XMLTAG, sizeof (char)); + + sprintf (XML_out, "</%s>", vot_elemName (e)); + return (XML_out); +} + + +/** + * vot_elemXML -- Builds a string of the opening XML Tag (private method) + * + * @brief Builds a string of the opening XML Tag (private method) + * @fn char *vot_elemXML (Element *e) + * + * @param *e A pointer to an Element + * @return A string that contains the opening XML tag for e + */ + +#define outstr(s) strcat(XML_out,s); +#define outattr(a,s) {outstr(a);outstr(s);outstr("\"");} + +char * +vot_elemXML (Element *e) +{ + char *XML_out = (char *) calloc (SZ_XMLTAG, sizeof (char)); + char *name = vot_elemName (e); + + + outstr ("<"); + outstr (name); + if (strcasecmp (name, "VOTABLE") == 0) { + outattr (" version=\"", VOT_DOC_VERSION); + outattr (" xmlns:xsi=\"", VOT_XSI); + outattr (" xsi:schemaLocation=\"", VOT_SCHEMA_LOC); + outattr (" xmlns=\"", VOT_XMLNS); + } else + outstr (vot_attrXML (e->attr)); + outstr (">"); + + return (XML_out); +} + + +/** + * vot_newElem -- Allocate a new structure of the given type (private method) + * + * @brief Allocate a new structure of the given type (private method) + * @fn Element *vot_newElem (unsigned int type) + * + * @param type An integer that defines the type of Element + * @return An new Element structure + */ + +Element * +vot_newElem (unsigned int type) +{ + register int i; + Element *new; + + + new = (Element *) calloc (1, sizeof (Element)); + new->attr = (AttrBlock *) calloc (1, sizeof (AttrBlock)); + new->type = type; + + for (i=0; elemTypes[i].type >= 0; i++) { + if (type == elemAttrs[i].type) { + new->attr->req = elemAttrs[i].req; + new->attr->opt = elemAttrs[i].opt; + vot_setDefaultAttrs (new->attr); + new->handle = -1; + return (new); + } + } + + free ((void *) new->attr); + free ((void *) new); + + return ((Element *) NULL); +} + + +/** + * vot_setDefaultAttrs -- Create all required attributes + * + * @brief Create all required attributes (static private method) + * @fn vot_setDefaultAttrs (AttrBlock *ablock) + * + * @param attr An AttrBlock to insert these attributes. + * @returns Nothing + */ +static void +vot_setDefaultAttrs (AttrBlock *ablock) +{ + char req_attr[MAX_ATTR], *tok = req_attr, *name; + + if (ablock->req) { + memset (req_attr, 0, MAX_ATTR); + strcpy (req_attr, ablock->req); + + while ((name = strtok (tok, "|")) != NULL) { + tok = NULL; + if (strcasecmp ("datatype", name) == 0) { + /* + vot_attrSet (ablock, "arraysize", "*"); + */ + vot_attrSet (ablock, name, "char"); + } else + vot_attrSet (ablock, name, ""); + } + } +} |