lib/eggdrop/xmlwrite.c File Reference

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <eggdrop/eggdrop.h>

Go to the source code of this file.

Defines

#define XML_INDENT_CHAR   '\t'

Functions

static int xml_write_node (FILE *fp, xml_node_t *node)
static int xml_write_children (FILE *fp, xml_node_t *node)
static int xml_write_attributes (FILE *fp, xml_node_t *node)
static int xml_write_element (FILE *fp, xml_node_t *node)
static int xml_write_document (FILE *fp, xml_node_t *node)
static int xml_write_comment (FILE *fp, xml_node_t *node)
static int xml_write_cdata_section (FILE *fp, xml_node_t *node)
static int xml_write_processing_instruction (FILE *fp, xml_node_t *node)
int xml_save_file (const char *file, xml_node_t *node, int options)

Variables

static const char rcsid [] = "$Id: xmlwrite.c,v 1.11 2004-09-26 09:42:09 stdarg Exp $"
static int write_options = XML_NONE
static int level = 0
static char indent [32] = {0}


Define Documentation

#define XML_INDENT_CHAR   '\t'

Definition at line 31 of file xmlwrite.c.


Function Documentation

int xml_save_file ( const char *  file,
xml_node_t node,
int  options 
)

Definition at line 165 of file xmlwrite.c.

References NULL, write_options, XML_NONE, xml_set_error(), and xml_write_node().

Referenced by channel_save(), config_save(), and user_save().

00166 {
00167   FILE *fp;
00168   int ret;
00169 
00170   /* clear any last error */
00171   xml_set_error(NULL);
00172 
00173   fp = fopen(file, "w");
00174 
00175   if (!fp) {
00176     xml_set_error("failed to open file");
00177     return -1;
00178   }
00179 
00180   write_options = options;
00181   ret = xml_write_node(fp, node);
00182   write_options = XML_NONE;
00183 
00184   fclose(fp);
00185 
00186   return ret;
00187 }

static int xml_write_attributes ( FILE *  fp,
xml_node_t node 
) [static]

Definition at line 64 of file xmlwrite.c.

References xml_node::attributes, xml_attr_t::name, xml_node::nattributes, and xml_attr_t::value.

Referenced by xml_write_element(), and xml_write_processing_instruction().

00065 {
00066   int i;
00067   xml_attr_t *attr;
00068 
00069   for (i = 0; i < node->nattributes; i++) {
00070     attr = node->attributes[i];
00071     if (attr->value) fprintf(fp, " %s=\"%s\"", attr->name, attr->value);
00072   }
00073 
00074   return (0);
00075 }

static int xml_write_cdata_section ( FILE *  fp,
xml_node_t node 
) [static]

Definition at line 119 of file xmlwrite.c.

References xml_node::text.

Referenced by xml_write_node().

00120 {
00121   fprintf(fp, "<![CDATA[%s]]>\n", node->text);
00122   return(0);
00123 }

static int xml_write_children ( FILE *  fp,
xml_node_t node 
) [static]

Definition at line 40 of file xmlwrite.c.

References xml_node::children, indent, level, xml_node::next, xml_node::text, and xml_write_node().

Referenced by xml_write_element().

00041 {
00042   int ret = 0;
00043   const char *text;
00044 
00045   /* init indent */
00046   memset(indent, '\t', sizeof(indent));
00047 
00048   indent[++level] = 0;
00049 
00050   /* XXX: encode text */
00051   text = node->text;
00052   if (text && *text) fprintf(fp, "%s%s\n", indent, text);
00053 
00054         for (node = node->children; node; node = node->next) {
00055     fprintf(fp, "%s", indent);
00056                 if ((ret = xml_write_node(fp, node)) == -1) break;
00057   }
00058 
00059   indent[--level] = 0;
00060 
00061         return ret;
00062 }

static int xml_write_comment ( FILE *  fp,
xml_node_t node 
) [static]

Definition at line 112 of file xmlwrite.c.

References xml_node::text.

Referenced by xml_write_node().

00113 {
00114   /* XXX: that's wrong, text needs to encoded */
00115   fprintf(fp, "<!--%s-->\n", node->text);
00116   return(0);
00117 }

static int xml_write_document ( FILE *  fp,
xml_node_t node 
) [static]

Definition at line 100 of file xmlwrite.c.

References xml_node::children, xml_node::next, and xml_write_node().

Referenced by xml_write_node().

00101 {
00102   int ret;
00103 
00104   ret = 0;
00105         for (node = node->children; node; node = node->next) {
00106                 if ((ret = xml_write_node(fp, node)) != 0)
00107                         break;
00108         }
00109   return ret;
00110 }

static int xml_write_element ( FILE *  fp,
xml_node_t node 
) [static]

Definition at line 77 of file xmlwrite.c.

References indent, xml_node::name, xml_node::nchildren, xml_node::text, xml_write_attributes(), and xml_write_children().

Referenced by xml_write_node().

00078 {
00079   fprintf(fp, "<%s", node->name);
00080   
00081   if (xml_write_attributes(fp, node) == -1) return(-1);
00082 
00083   if (node->nchildren == 0) {
00084     if (node->text) {
00085       fprintf(fp, ">%s</%s>\n", node->text, node->name);
00086     } else {
00087       fprintf(fp, "/>\n");
00088     }
00089 
00090     return (0);
00091   }
00092 
00093   fprintf(fp, ">\n");
00094   if (xml_write_children(fp, node) != 0) return(-1);
00095 
00096   fprintf(fp, "%s</%s>\n", indent, node->name);
00097   return(0);
00098 }

static int xml_write_node ( FILE *  fp,
xml_node_t node 
) [static]

Definition at line 136 of file xmlwrite.c.

References xml_node::type, XML_ATTRIBUTE, XML_CDATA_SECTION, XML_COMMENT, XML_DOCUMENT, XML_ELEMENT, XML_PROCESSING_INSTRUCTION, xml_set_error(), xml_write_cdata_section(), xml_write_comment(), xml_write_document(), xml_write_element(), and xml_write_processing_instruction().

Referenced by xml_save_file(), xml_write_children(), and xml_write_document().

00137 {
00138   switch (node->type) {
00139   
00140     case (XML_DOCUMENT):
00141       return xml_write_document(fp, node);
00142 
00143     case (XML_ELEMENT):
00144       return xml_write_element(fp, node);
00145 
00146     case (XML_COMMENT):
00147       return xml_write_comment(fp, node);
00148   
00149     case (XML_CDATA_SECTION):
00150       return xml_write_cdata_section(fp, node);
00151 
00152     case (XML_PROCESSING_INSTRUCTION):
00153       return xml_write_processing_instruction(fp, node);
00154       
00155     case (XML_ATTRIBUTE):
00156       /* just ignore this */
00157       return (0);
00158   }
00159 
00160   xml_set_error("unknown node type");
00161 
00162   return (-1);
00163 }

static int xml_write_processing_instruction ( FILE *  fp,
xml_node_t node 
) [static]

Definition at line 125 of file xmlwrite.c.

References xml_node::name, and xml_write_attributes().

Referenced by xml_write_node().

00126 {
00127   fprintf(fp, "<?%s", node->name);
00128 
00129   if (xml_write_attributes(fp, node) != 0) return(-1);
00130 
00131   fprintf(fp, "?>\n");
00132 
00133   return (0);
00134 }


Variable Documentation

char indent[32] = {0} [static]

Definition at line 38 of file xmlwrite.c.

Referenced by xml_write_children(), and xml_write_element().

int level = 0 [static]

Definition at line 37 of file xmlwrite.c.

Referenced by xml_write_children().

const char rcsid[] = "$Id: xmlwrite.c,v 1.11 2004-09-26 09:42:09 stdarg Exp $" [static]

Definition at line 21 of file xmlwrite.c.

int write_options = XML_NONE [static]

Definition at line 33 of file xmlwrite.c.

Referenced by xml_save_file().


Generated on Sun Nov 30 18:43:35 2008 for eggdrop1.9 by  doxygen 1.5.6