1 #ifndef GIFTI_XML_H
2 #define GIFTI_XML_H
3 
4 #define GXML_MAX_DEPTH 10    /* maximum stack depth */
5 #define GXML_MAX_ELEN  128   /* maximum element length */
6 
7 #define GIFTI_XML_VERSION       "1.0"
8 #define GIFTI_XML_ENCODING      "UTF-8"
9                                 /* use non-changing address  2 Mar 2010 */
10 #define GIFTI_XML_DTD_SOURCE    "http://gifti.projects.nitrc.org/gifti.dtd"
11 
12 /* ----------------------------------------------------------------------
13    element      depths  parent(s)       children
14    -------      ------  --------------  -----------------------
15    GIFTI        0                       MetaData, LabelTable, DataArray
16    MetaData     1       GIFTI           MD
17                 2       DataArray
18    MD           2,+1    MetaData        Name, Value
19    Name         3,+1    MD              CDATA/char
20    Value        3,+1    MD              CDATA/char
21    LabelTable   1       GIFTI           Label
22    Label        2       LabelTable      CDATA/char
23 
24    DataArray    1       GIFTI           MetaData, CSTM, Data
25    CSTM         2       DataArray       DataSpace, TransformedSpace, MatrixData
26    Data         2       DataArray
27    DataSpace    3       CSTM            CDATA/char
28    TransformedSpace  3  CSTM            CDATA/char
29    MatrixData   3       CSTM            char
30 
31 
32    CDATA        4,+1    Name, Value     char
33                 4       DataSpace       char
34                 4       TransformedSpace char
35    char         any     any             whitespace
36                 5       CDATA
37 
38    -- other objects to handle --
39    XML declaration:     version, encoding, standalone
40    DOCTYPE:             type=GIFTI, sid=.../gifti.dtd, pid, sub
41    default:
42    ----------------------------------------------------------------------
43 */
44 
45 /* this list must match enames, and is ordered via the above comment */
46 #define GXML_ETYPE_INVALID      0
47 #define GXML_ETYPE_GIFTI        1      /* GIFTI element            */
48 #define GXML_ETYPE_META         2      /* MetaData element         */
49 #define GXML_ETYPE_MD           3      /* MD element               */
50 #define GXML_ETYPE_NAME         4      /* Name element             */
51 #define GXML_ETYPE_VALUE        5      /* Value element            */
52 #define GXML_ETYPE_LABELTABLE   6      /* LabelTable element       */
53 #define GXML_ETYPE_LABEL        7      /* Label element            */
54 #define GXML_ETYPE_DATAARRAY    8      /* DataArray element        */
55 #define GXML_ETYPE_CSTM         9      /* CSTM element             */
56 #define GXML_ETYPE_DATA        10      /* Data element             */
57 #define GXML_ETYPE_DATASPACE   11      /* DataSpace element        */
58 #define GXML_ETYPE_XFORMSPACE  12      /* TransformedSpace element */
59 #define GXML_ETYPE_MATRIXDATA  13      /* MatrixData element       */
60 #define GXML_ETYPE_CDATA       14      /* CDATA element            */
61 #define GXML_ETYPE_LAST        14      /* should match last entry  */
62 
63 typedef struct {
64     long long   nalloc;                 /* allocation length    */
65     long long   nused;                  /* number of bytes used */
66     char      * buf;                    /* buffer               */
67 } gxml_buffer;
68 
69 typedef struct {
70     int            verb;            /* verbose level                */
71     int            dstore;          /* flag: store data             */
72     int            indent;          /* spaces per depth level       */
73     int            buf_size;        /* for XML buffer               */
74     int            b64_check;       /* 0=no, 1=check, 2=count, 3=skip */
75     int            update_ok;       /* library can update metadata  */
76     int            zlevel;          /* compression level -1..9      */
77     int            perm_by_iord;    /* do we permute by index order */
78 
79     int          * da_list;         /* DA index list to store       */
80     int            da_len;          /* DA index list length         */
81     int            da_ind;          /* current DA index list index  */
82 
83     int            eleDA;           /* number of elements found     */
84     int            expDA;           /* number of elements expected  */
85     int            b64_errors;      /* bad chars, per DATA element  */
86     int            errors;          /* number of errors encountered */
87     int            skip;            /* stack depth to skip          */
88     int            depth;           /* current stack depth          */
89     int            stack[GXML_MAX_DEPTH+1]; /* stack of etypes      */
90 
91     long long      dind;            /* index into data->data/xform  */
92     int            clen;            /* length of current CDATA      */
93     int            xlen;            /* length of xform buffer       */
94     int            dlen;            /* length of Data buffer        */
95     int            doff;            /* offset into data buffer      */
96     int            zlen;            /* length of compression buffer */
97     char        ** cdata;           /* pointer to current CDATA     */
98     char         * xdata;           /* xform buffer                 */
99     char         * ddata;           /* I/O buffer xml->ddata->data  */
100     char         * zdata;           /* zlib compression buffer      */
101     gifti_image  * gim;             /* pointer to returning image   */
102 } gxml_data;
103 
104 /* protos */
105 
106 /* main interface */
107 gifti_image * gxml_read_image (const char * fname, int read_data,
108                                const int * dalist, int len);
109 gifti_image * gxml_read_image_buf(const char * buf_in, long long bin_len,
110                                   const int * dalist, int dalen);
111 int           gxml_write_image(gifti_image * gim, const char * fname,
112                                int write_data);
113 
114 int   gxml_set_verb        ( int val );
115 int   gxml_get_verb        ( void    );
116 int   gxml_set_dstore      ( int val );
117 int   gxml_get_dstore      ( void    );
118 int   gxml_set_indent      ( int val );
119 int   gxml_get_indent      ( void    );
120 int   gxml_set_buf_size    ( int val );
121 int   gxml_get_buf_size    ( void    );
122 int   gxml_set_b64_check   ( int val );
123 int   gxml_get_b64_check   ( void    );
124 int   gxml_set_update_ok   ( int val );
125 int   gxml_get_update_ok   ( void    );
126 int   gxml_set_zlevel      ( int val );
127 int   gxml_get_zlevel      ( void    );
128 int   gxml_set_perm_by_iord( int val );
129 int   gxml_get_perm_by_iord( void    );
130 
131 
132 #endif /* GIFTI_XML_H */
133