00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <gimp-print/mxml.h>
00036 #include "config.h"
00037
00038
00039
00040
00041
00042
00043 static stp_mxml_node_t *mxml_new(stp_mxml_node_t *parent, stp_mxml_type_t type);
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 void
00058 stp_mxmlAdd(stp_mxml_node_t *parent,
00059 int where,
00060 stp_mxml_node_t *child,
00061 stp_mxml_node_t *node)
00062 {
00063
00064
00065
00066
00067
00068
00069
00070 if (!parent || !node)
00071 return;
00072
00073
00074
00075
00076
00077 if (node->parent)
00078 stp_mxmlRemove(node);
00079
00080
00081
00082
00083
00084 node->parent = parent;
00085
00086 switch (where)
00087 {
00088 case STP_MXML_ADD_BEFORE :
00089 if (!child || child == parent->child || child->parent != parent)
00090 {
00091
00092
00093
00094
00095 node->next = parent->child;
00096
00097 if (parent->child)
00098 parent->child->prev = node;
00099 else
00100 parent->last_child = node;
00101
00102 parent->child = node;
00103 }
00104 else
00105 {
00106
00107
00108
00109
00110 node->next = child;
00111 node->prev = child->prev;
00112
00113 if (child->prev)
00114 child->prev->next = node;
00115 else
00116 parent->child = node;
00117
00118 child->prev = node;
00119 }
00120 break;
00121
00122 case STP_MXML_ADD_AFTER :
00123 if (!child || child == parent->last_child || child->parent != parent)
00124 {
00125
00126
00127
00128
00129 node->parent = parent;
00130 node->prev = parent->last_child;
00131
00132 if (parent->last_child)
00133 parent->last_child->next = node;
00134 else
00135 parent->child = node;
00136
00137 parent->last_child = node;
00138 }
00139 else
00140 {
00141
00142
00143
00144
00145 node->prev = child;
00146 node->next = child->next;
00147
00148 if (child->next)
00149 child->next->prev = node;
00150 else
00151 parent->last_child = node;
00152
00153 child->next = node;
00154 }
00155 break;
00156 }
00157 }
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167 void
00168 stp_mxmlDelete(stp_mxml_node_t *node)
00169 {
00170 int i;
00171
00172
00173
00174
00175
00176
00177
00178
00179 if (!node)
00180 return;
00181
00182
00183
00184
00185
00186 stp_mxmlRemove(node);
00187
00188
00189
00190
00191
00192 while (node->child)
00193 stp_mxmlDelete(node->child);
00194
00195
00196
00197
00198
00199 switch (node->type)
00200 {
00201 case STP_MXML_ELEMENT :
00202 if (node->value.element.name)
00203 free(node->value.element.name);
00204
00205 if (node->value.element.num_attrs)
00206 {
00207 for (i = 0; i < node->value.element.num_attrs; i ++)
00208 {
00209 if (node->value.element.attrs[i].name)
00210 free(node->value.element.attrs[i].name);
00211 if (node->value.element.attrs[i].value)
00212 free(node->value.element.attrs[i].value);
00213 }
00214
00215 free(node->value.element.attrs);
00216 }
00217 break;
00218 case STP_MXML_INTEGER :
00219
00220 break;
00221 case STP_MXML_OPAQUE :
00222 if (node->value.opaque)
00223 free(node->value.opaque);
00224 break;
00225 case STP_MXML_REAL :
00226
00227 break;
00228 case STP_MXML_TEXT :
00229 if (node->value.text.string)
00230 free(node->value.text.string);
00231 break;
00232 }
00233
00234
00235
00236
00237
00238 free(node);
00239 }
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250 stp_mxml_node_t *
00251 stp_mxmlNewElement(stp_mxml_node_t *parent,
00252 const char *name)
00253 {
00254 stp_mxml_node_t *node;
00255
00256
00257
00258
00259
00260
00261 if (!name)
00262 return (NULL);
00263
00264
00265
00266
00267
00268 if ((node = mxml_new(parent, STP_MXML_ELEMENT)) != NULL)
00269 node->value.element.name = strdup(name);
00270
00271 return (node);
00272 }
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283 stp_mxml_node_t *
00284 stp_mxmlNewInteger(stp_mxml_node_t *parent,
00285 int integer)
00286 {
00287 stp_mxml_node_t *node;
00288
00289
00290
00291
00292
00293
00294 if (!parent)
00295 return (NULL);
00296
00297
00298
00299
00300
00301 if ((node = mxml_new(parent, STP_MXML_INTEGER)) != NULL)
00302 node->value.integer = integer;
00303
00304 return (node);
00305 }
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317 stp_mxml_node_t *
00318 stp_mxmlNewOpaque(stp_mxml_node_t *parent,
00319 const char *opaque)
00320 {
00321 stp_mxml_node_t *node;
00322
00323
00324
00325
00326
00327
00328 if (!parent || !opaque)
00329 return (NULL);
00330
00331
00332
00333
00334
00335 if ((node = mxml_new(parent, STP_MXML_OPAQUE)) != NULL)
00336 node->value.opaque = strdup(opaque);
00337
00338 return (node);
00339 }
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350 stp_mxml_node_t *
00351 stp_mxmlNewReal(stp_mxml_node_t *parent,
00352 double real)
00353 {
00354 stp_mxml_node_t *node;
00355
00356
00357
00358
00359
00360
00361 if (!parent)
00362 return (NULL);
00363
00364
00365
00366
00367
00368 if ((node = mxml_new(parent, STP_MXML_REAL)) != NULL)
00369 node->value.real = real;
00370
00371 return (node);
00372 }
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385 stp_mxml_node_t *
00386 stp_mxmlNewText(stp_mxml_node_t *parent,
00387 int whitespace,
00388 const char *string)
00389 {
00390 stp_mxml_node_t *node;
00391
00392
00393
00394
00395
00396
00397 if (!parent || !string)
00398 return (NULL);
00399
00400
00401
00402
00403
00404 if ((node = mxml_new(parent, STP_MXML_TEXT)) != NULL)
00405 {
00406 node->value.text.whitespace = whitespace;
00407 node->value.text.string = strdup(string);
00408 }
00409
00410 return (node);
00411 }
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421 void
00422 stp_mxmlRemove(stp_mxml_node_t *node)
00423 {
00424
00425
00426
00427
00428
00429
00430 if (!node || !node->parent)
00431 return;
00432
00433
00434
00435
00436
00437 if (node->prev)
00438 node->prev->next = node->next;
00439 else
00440 node->parent->child = node->next;
00441
00442 if (node->next)
00443 node->next->prev = node->prev;
00444 else
00445 node->parent->last_child = node->prev;
00446
00447 node->parent = NULL;
00448 node->prev = NULL;
00449 node->next = NULL;
00450 }
00451
00452
00453
00454
00455
00456
00457 static stp_mxml_node_t *
00458 mxml_new(stp_mxml_node_t *parent,
00459 stp_mxml_type_t type)
00460 {
00461 stp_mxml_node_t *node;
00462
00463
00464
00465
00466
00467
00468 if ((node = calloc(1, sizeof(stp_mxml_node_t))) == NULL)
00469 return (NULL);
00470
00471
00472
00473
00474
00475 node->type = type;
00476
00477
00478
00479
00480
00481 if (parent)
00482 stp_mxmlAdd(parent, STP_MXML_ADD_AFTER, STP_MXML_ADD_TO_PARENT, node);
00483
00484
00485
00486
00487
00488 return (node);
00489 }
00490
00491
00492
00493
00494