00001
00002
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
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, """);
00042 break;
00043 case '\'':
00044 s = stpcpy(s, "'");
00045 break;
00046 case '&':
00047 s = stpcpy(s, "&");
00048 case '<':
00049 s = stpcpy(s, "<");
00050 break;
00051 case '>':
00052 s = stpcpy(s, ">");
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 }