00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00024
00025
00026
00027
00028 #ifndef GUTENPRINT_MXML_H
00029 # define GUTENPRINT_MXML_H
00030
00031
00032
00033
00034
00035 # include <stdio.h>
00036 # include <stdlib.h>
00037 # include <string.h>
00038 # include <ctype.h>
00039 # include <errno.h>
00040
00041
00042
00043
00044
00045
00046 # define STP_MXML_WRAP 70
00047 # define STP_MXML_TAB 8
00048
00049 # define STP_MXML_NO_CALLBACK 0
00050 # define STP_MXML_NO_PARENT 0
00051
00052 # define STP_MXML_DESCEND 1
00053 # define STP_MXML_NO_DESCEND 0
00054 # define STP_MXML_DESCEND_FIRST -1
00055
00056 # define STP_MXML_WS_BEFORE_OPEN 0
00057 # define STP_MXML_WS_AFTER_OPEN 1
00058 # define STP_MXML_WS_BEFORE_CLOSE 2
00059 # define STP_MXML_WS_AFTER_CLOSE 3
00060
00061 # define STP_MXML_ADD_BEFORE 0
00062 # define STP_MXML_ADD_AFTER 1
00063 # define STP_MXML_ADD_TO_PARENT NULL
00064
00065
00066
00067
00068
00069
00070 typedef enum stp_mxml_type_e
00071 {
00072 STP_MXML_ELEMENT,
00073 STP_MXML_INTEGER,
00074 STP_MXML_OPAQUE,
00075 STP_MXML_REAL,
00076 STP_MXML_TEXT
00077 } stp_mxml_type_t;
00078
00079 typedef struct stp_mxml_attr_s
00080 {
00081 char *name;
00082 char *value;
00083 } stp_mxml_attr_t;
00084
00085 typedef struct stp_mxml_value_s
00086 {
00087 char *name;
00088 int num_attrs;
00089 stp_mxml_attr_t *attrs;
00090 } stp_mxml_element_t;
00091
00092 typedef struct stp_mxml_text_s
00093 {
00094 int whitespace;
00095 char *string;
00096 } stp_mxml_text_t;
00097
00098 typedef union stp_mxml_value_u
00099 {
00100 stp_mxml_element_t element;
00101 int integer;
00102 char *opaque;
00103 double real;
00104 stp_mxml_text_t text;
00105 } stp_mxml_value_t;
00106
00107 typedef struct stp_mxml_node_s stp_mxml_node_t;
00108
00109 struct stp_mxml_node_s
00110 {
00111 stp_mxml_type_t type;
00112 stp_mxml_node_t *next;
00113 stp_mxml_node_t *prev;
00114 stp_mxml_node_t *parent;
00115 stp_mxml_node_t *child;
00116 stp_mxml_node_t *last_child;
00117 stp_mxml_value_t value;
00118 };
00119
00120
00121
00122
00123
00124
00125 # ifdef __cplusplus
00126 extern "C" {
00127 # endif
00128
00129
00130
00131
00132
00133 extern void stp_mxmlAdd(stp_mxml_node_t *parent, int where,
00134 stp_mxml_node_t *child, stp_mxml_node_t *node);
00135 extern void stp_mxmlDelete(stp_mxml_node_t *node);
00136 extern const char *stp_mxmlElementGetAttr(stp_mxml_node_t *node, const char *name);
00137 extern void stp_mxmlElementSetAttr(stp_mxml_node_t *node, const char *name,
00138 const char *value);
00139 extern stp_mxml_node_t *stp_mxmlFindElement(stp_mxml_node_t *node, stp_mxml_node_t *top,
00140 const char *name, const char *attr,
00141 const char *value, int descend);
00142 extern stp_mxml_node_t *stp_mxmlLoadFile(stp_mxml_node_t *top, FILE *fp,
00143 stp_mxml_type_t (*cb)(stp_mxml_node_t *));
00144 extern stp_mxml_node_t *stp_mxmlLoadString(stp_mxml_node_t *top, const char *s,
00145 stp_mxml_type_t (*cb)(stp_mxml_node_t *));
00146 extern stp_mxml_node_t *stp_mxmlNewElement(stp_mxml_node_t *parent, const char *name);
00147 extern stp_mxml_node_t *stp_mxmlNewInteger(stp_mxml_node_t *parent, int integer);
00148 extern stp_mxml_node_t *stp_mxmlNewOpaque(stp_mxml_node_t *parent, const char *opaque);
00149 extern stp_mxml_node_t *stp_mxmlNewReal(stp_mxml_node_t *parent, double real);
00150 extern stp_mxml_node_t *stp_mxmlNewText(stp_mxml_node_t *parent, int whitespace,
00151 const char *string);
00152 extern void stp_mxmlRemove(stp_mxml_node_t *node);
00153 extern char *stp_mxmlSaveAllocString(stp_mxml_node_t *node,
00154 int (*cb)(stp_mxml_node_t *, int));
00155 extern int stp_mxmlSaveFile(stp_mxml_node_t *node, FILE *fp,
00156 int (*cb)(stp_mxml_node_t *, int));
00157 extern int stp_mxmlSaveString(stp_mxml_node_t *node, char *buffer,
00158 int bufsize,
00159 int (*cb)(stp_mxml_node_t *, int));
00160 extern stp_mxml_node_t *stp_mxmlWalkNext(stp_mxml_node_t *node, stp_mxml_node_t *top,
00161 int descend);
00162 extern stp_mxml_node_t *stp_mxmlWalkPrev(stp_mxml_node_t *node, stp_mxml_node_t *top,
00163 int descend);
00164
00165
00166
00167
00168
00169
00170 # ifdef __cplusplus
00171 }
00172 # endif
00173 #endif
00174
00175
00176
00177
00178