src/db_xml.c

Go to the documentation of this file.
00001 /*
00002  * db_rw.c 
00003  */
00004 
00005 #include "copyright.h"
00006 #include "config.h"
00007 
00008 #include <sys/file.h>
00009 
00010 #include "mudconf.h"
00011 #include "config.h"
00012 #include "externs.h"
00013 #include "db.h"
00014 #include "vattr.h"
00015 #include "attrs.h"
00016 #include "alloc.h"
00017 #include "powers.h"
00018 
00019 #define MUX_REPRESENTATION
00020 // #define REASONABLE_REPRESENTATION
00021 
00022 extern const char *getstring_noalloc(FILE *, int);
00023 extern void putstring(FILE *, const char *);
00024 extern void db_grow(dbref);
00025 
00026 extern struct object *db;
00027 
00028 static int g_version;
00029 static int g_format;
00030 static int g_flags;
00031 
00032 static int xml_putescaped(FILE * f, const char *string)
00033 {
00034         char emit_buffer[LBUF_SIZE * 7];
00035         char *r, *s;
00036         s = emit_buffer;
00037         memset(emit_buffer, 0, sizeof(emit_buffer));
00038         for(r = (char *)string; *r; r++) {
00039                 switch (*r) {
00040                 case '"':
00041                         s = stpcpy(s, "&quot;");
00042                         break;
00043                 case '\'':
00044                         s = stpcpy(s, "&apos;");
00045                         break;
00046                 case '&':
00047                         s = stpcpy(s, "&amp;");
00048                 case '<':
00049                         s = stpcpy(s, "&lt;");
00050                         break;
00051                 case '>':
00052                         s = stpcpy(s, "&gt;");
00053                         break;
00054                 case '\\':
00055                         s = stpcpy(s, "\\\\");
00056                         break;
00057                 default:
00058                         *s++ = *r;
00059                 }
00060         }
00061         *s = '\0';
00062         return fprintf(f, "%s", emit_buffer);
00063 }
00064 
00065 static int xml_putobjstring(FILE * f, const char *name, const char *value)
00066 {
00067         fprintf(f, "\t\t<%s>", name);
00068         xml_putescaped(f, value);
00069         fprintf(f, "</%s>\n", name);
00070         return 1;
00071 }
00072 
00073 static int xml_putobjref(FILE * f, const char *name, long value)
00074 {
00075         return fprintf(f, "\t\t<%s>%ld</%s>\n", name, value, name);
00076 }
00077 
00078 static int xml_putattr(FILE * f, const char *name, const char *value, long owner,
00079                                            long flags)
00080 {
00081         fprintf(f, "\t\t<Attribute name=\"");
00082         xml_putescaped(f, name);
00083         fprintf(f, "\" owner=\"%ld\" flags=\"%ld\">", owner, flags);
00084         xml_putescaped(f, value);
00085         fprintf(f, "</Attribute>\n");
00086         return 1;
00087 }
00088 
00089 static int xml_db_write_object(FILE * f, dbref i, int db_format, int flags)
00090 {
00091         ATTR *a;
00092         char *got, *as;
00093         dbref aowner;
00094         long sub;
00095         int ca, aflags, save, j;
00096         BOOLEXP *tempbool;
00097 
00098         fprintf(f, "\t<Object dbref=\"%ld\">\n", (long) i);
00099         xml_putobjstring(f, "Name", Name(i));
00100         xml_putobjref(f, "Location", Location(i));
00101         xml_putobjref(f, "Zone", Zone(i));
00102         if(Contents(i) == -1) {
00103                 fprintf(f, "\t\t<Contents/>\n");
00104         } else {
00105                 fprintf(f, "\t\t<Contents>\n");
00106                 sub = Contents(i);
00107                 while (sub != -1) {
00108                         fprintf(f, "\t\t\t<DBREF dbref=\"%ld\"/>\n", sub);
00109                         sub = Next(sub);
00110                 }
00111                 fprintf(f, "\t\t</Contents>\n");
00112         }
00113         if(Exits(i) == -1) {
00114                 fprintf(f, "\t\t<Exits/>\n");
00115         } else {
00116                 fprintf(f, "\t\t<Exits>\n");
00117                 sub = Exits(i);
00118                 while (sub != -1) {
00119                         fprintf(f, "\t\t\t<DBREF dbref=\"%ld\"/>\n", sub);
00120                         sub = Next(sub);
00121                 }
00122                 fprintf(f, "\t\t</Exits>\n");
00123         }
00124         got = atr_get(i, A_LOCK, &aowner, &aflags);
00125         xml_putobjstring(f, "Lock", got);
00126         free_lbuf(got);
00127 
00128         xml_putobjref(f, "Link", Link(i));
00129         xml_putobjref(f, "Owner", Owner(i));
00130         xml_putobjref(f, "Parent", Parent(i));
00131         xml_putobjref(f, "Pennies", Pennies(i));
00132         xml_putobjref(f, "Flags", Flags(i));
00133         xml_putobjref(f, "Flags2", Flags2(i));
00134         xml_putobjref(f, "Flags3", Flags3(i));
00135         xml_putobjref(f, "Powers", Powers(i));
00136         xml_putobjref(f, "Powers2", Powers2(i));
00137 
00138         for(ca = atr_head(i, &as); ca; ca = atr_next(&as)) {
00139                 save = 0;
00140                 a = atr_num(ca);
00141                 if(a)
00142                         j = a->number;
00143                 else
00144                         j = -1;
00145 
00146                 if(j > 0) {
00147                         switch (j) {
00148                         case A_NAME:
00149                                 if(flags & V_ATRNAME)
00150                                         save = 1;
00151                                 break;
00152                         case A_LOCK:
00153                                 if(flags & V_ATRKEY)
00154                                         save = 1;
00155                                 break;
00156                         case A_LIST:
00157                         case A_MONEY:
00158                                 break;
00159                         default:
00160                                 save = 1;
00161                         }
00162                 }
00163                 if(save) {
00164                         got = atr_get(i, j, &aowner, &aflags);
00165                         xml_putattr(f, a->name, got, aowner, aflags);
00166                 }
00167         }
00168         fprintf(f, "\t</Object>\n");
00169         return 0;
00170 }
00171 
00172 static int xml_db_write_mux(FILE * f, dbref i, int db_format, int flags)
00173 {
00174         ATTR *a;
00175         char *got, *as;
00176         dbref aowner;
00177         long sub;
00178         int ca, aflags, save, j;
00179         BOOLEXP *tempbool;
00180 
00181         fprintf(f, "\t<Object dbref=\"%ld\">\n", (long) i);
00182         xml_putobjstring(f, "Name", Name(i));
00183         xml_putobjref(f, "Location", Location(i));
00184         xml_putobjref(f, "Zone", Zone(i));
00185         xml_putobjref(f, "Contents", Contents(i));
00186         xml_putobjref(f, "Exits", Exits(i));
00187         got = atr_get(i, A_LOCK, &aowner, &aflags);
00188         xml_putobjstring(f, "Lock", got);
00189         free_lbuf(got);
00190 
00191         xml_putobjref(f, "Link", Link(i));
00192         xml_putobjref(f, "Owner", Owner(i));
00193         xml_putobjref(f, "Parent", Parent(i));
00194         xml_putobjref(f, "Pennies", Pennies(i));
00195         xml_putobjref(f, "Flags", Flags(i));
00196         xml_putobjref(f, "Flags2", Flags2(i));
00197         xml_putobjref(f, "Flags3", Flags3(i));
00198         xml_putobjref(f, "Powers", Powers(i));
00199         xml_putobjref(f, "Powers2", Powers2(i));
00200         for(ca = atr_head(i, &as); ca; ca = atr_next(&as)) {
00201                 save = 0;
00202                 a = atr_num(ca);
00203                 if(a)
00204                         j = a->number;
00205                 else
00206                         j = -1;
00207 
00208                 if(j > 0) {
00209                         switch (j) {
00210                         case A_NAME:
00211                                 if(flags & V_ATRNAME)
00212                                         save = 1;
00213                                 break;
00214                         case A_LOCK:
00215                                 if(flags & V_ATRKEY)
00216                                         save = 1;
00217                                 break;
00218                         case A_LIST:
00219                         case A_MONEY:
00220                                 break;
00221                         default:
00222                                 save = 1;
00223                         }
00224                 }
00225                 if(save) {
00226                         got = atr_get(i, j, &aowner, &aflags);
00227                         xml_putattr(f, a->name, got, aowner, aflags);
00228                 }
00229         }
00230         fprintf(f, "\t</Object>\n");
00231         return 0;
00232 }
00233 
00234 dbref xml_db_write(FILE * f, int format, int version)
00235 {
00236         dbref i;
00237         int flags;
00238         VATTR *vp;
00239 
00240         fprintf(f, "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
00241         fprintf(f, "<TinyMUXDataBase dumptime=\"%lu\">\n", mudstate.now);
00242         DO_WHOLE_DB(i) {
00243                 if(!(Going(i))) {
00244 #ifdef MUX_REPRESENTATION
00245                         xml_db_write_mux(f, i, format, flags);
00246 #else
00247                         xml_db_write_object(f, i, format, flags);
00248 #endif
00249                 }
00250         }
00251         fprintf(f, "</TinyMUXDataBase>\n");
00252         fflush(f);
00253         return (mudstate.db_top);
00254 }

Generated on Mon May 28 04:25:19 2007 for BattletechMUX by  doxygen 1.4.7