00001
00002
00003
00004
00005 #include "copyright.h"
00006 #include "config.h"
00007 #include <ctype.h>
00008 #include <sys/types.h>
00009
00010 #include "db.h"
00011 #include "interface.h"
00012 #include "match.h"
00013 #include "config.h"
00014 #include "externs.h"
00015
00016 #include "commac.h"
00017
00018 extern void load_comsystem(FILE *);
00019 extern void load_macros(FILE *);
00020 extern void save_comsystem(FILE *);
00021 extern void save_macros(FILE *);
00022
00023 void load_comsys_and_macros(char *filename)
00024 {
00025 FILE *fp;
00026 int i;
00027 char buffer[200];
00028
00029 for(i = 0; i < NUM_COMMAC; i++)
00030 commac_table[i] = NULL;
00031
00032 if(!(fp = fopen(filename, "r"))) {
00033 fprintf(stderr, "Error: Couldn't find %s.\n", filename);
00034 } else {
00035 fprintf(stderr, "LOADING: %s\n", filename);
00036 if(fscanf(fp, "*** Begin %s ***\n", buffer) == 1 &&
00037 !strcmp(buffer, "COMMAC")) {
00038 load_commac(fp);
00039 } else {
00040 fprintf(stderr, "Error: Couldn't find Begin COMMAC in %s.",
00041 filename);
00042 return;
00043 }
00044
00045 if(fscanf(fp, "*** Begin %s ***\n", buffer) == 1 &&
00046 !strcmp(buffer, "COMSYS")) {
00047 load_comsystem(fp);
00048 } else {
00049 fprintf(stderr, "Error: Couldn't find Begin COMSYS in %s.",
00050 filename);
00051 return;
00052 }
00053
00054 if(fscanf(fp, "*** Begin %s ***\n", buffer) == 1 &&
00055 !strcmp(buffer, "MACRO")) {
00056 load_macros(fp);
00057 } else {
00058 fprintf(stderr, "Error: Couldn't find Begin MACRO in %s.",
00059 filename);
00060 return;
00061 }
00062
00063 fclose(fp);
00064 fprintf(stderr, "LOADING: %s (done)\n", filename);
00065 }
00066 }
00067
00068 void save_comsys_and_macros(char *filename)
00069 {
00070 FILE *fp;
00071 char buffer[500];
00072
00073 sprintf(buffer, "%s.#", filename);
00074 if(!(fp = fopen(buffer, "w"))) {
00075 fprintf(stderr, "Unable to open %s for writing.\n", buffer);
00076 return;
00077 }
00078 fprintf(fp, "*** Begin COMMAC ***\n");
00079 save_commac(fp);
00080
00081 fprintf(fp, "*** Begin COMSYS ***\n");
00082 save_comsystem(fp);
00083
00084 fprintf(fp, "*** Begin MACRO ***\n");
00085 save_macros(fp);
00086
00087 fclose(fp);
00088 rename(buffer, filename);
00089 }
00090
00091 void load_commac(FILE * fp)
00092 {
00093 int i, j;
00094 char buffer[100];
00095 int np;
00096 struct commac *c;
00097 char *t;
00098 char in;
00099
00100 fscanf(fp, "%d\n", &np);
00101 for(i = 0; i < np; i++) {
00102 c = create_new_commac();
00103 fscanf(fp, "%d %d %d %d %d %d %d %d\n", &(c->who),
00104 &(c->numchannels), &(c->macros[0]), &(c->macros[1]),
00105 &c->macros[2], &(c->macros[3]), &(c->macros[4]), &(c->curmac));
00106 c->maxchannels = c->numchannels;
00107 if(c->maxchannels > 0) {
00108 c->alias = (char *) malloc(c->maxchannels * 6);
00109 c->channels = (char **) malloc(sizeof(char *) * c->maxchannels);
00110
00111 for(j = 0; j < c->numchannels; j++) {
00112 t = c->alias + j * 6;
00113 while ((in = fgetc(fp)) != ' ')
00114 *t++ = in;
00115 *t = 0;
00116
00117 fscanf(fp, "%[^\n]\n", buffer);
00118
00119 c->channels[j] = (char *) malloc(strlen(buffer) + 1);
00120 StringCopy(c->channels[j], buffer);
00121 }
00122 sort_com_aliases(c);
00123 } else {
00124 c->alias = NULL;
00125 c->channels = NULL;
00126 }
00127 if((Typeof(c->who) == TYPE_PLAYER) || (!God(Owner(c->who))) ||
00128 ((!Going(c->who))))
00129 add_commac(c);
00130 purge_commac();
00131 }
00132 }
00133
00134 void purge_commac(void)
00135 {
00136 struct commac *c;
00137 struct commac *d;
00138 int i;
00139
00140 #ifdef ABORT_PURGE_COMSYS
00141 return;
00142 #endif
00143
00144
00145
00146 for(i = 0; i < NUM_COMMAC; i++) {
00147 c = commac_table[i];
00148 while (c) {
00149 d = c;
00150 c = c->next;
00151 if(d->numchannels == 0 && d->curmac == -1 &&
00152 d->macros[1] == -1 && d->macros[2] == -1 &&
00153 d->macros[3] == -1 && d->macros[4] == -1 &&
00154 d->macros[0] == -1) {
00155 del_commac(d->who);
00156 continue;
00157 }
00158
00159
00160
00161
00162
00163 if(Typeof(d->who) == TYPE_PLAYER)
00164 continue;
00165 if(God(Owner(d->who)) && Going(d->who)) {
00166 del_commac(d->who);
00167 continue;
00168 }
00169 }
00170 }
00171 }
00172
00173 void save_commac(FILE * fp)
00174 {
00175 int np;
00176 struct commac *c;
00177 int i, j;
00178
00179 purge_commac();
00180 np = 0;
00181 for(i = 0; i < NUM_COMMAC; i++) {
00182 c = commac_table[i];
00183 while (c) {
00184 np++;
00185 c = c->next;
00186 }
00187 }
00188
00189 fprintf(fp, "%d\n", np);
00190 for(i = 0; i < NUM_COMMAC; i++) {
00191 c = commac_table[i];
00192 while (c) {
00193 fprintf(fp, "%d %d %d %d %d %d %d %d\n", c->who,
00194 c->numchannels, c->macros[0], c->macros[1], c->macros[2],
00195 c->macros[3], c->macros[4], c->curmac);
00196 for(j = 0; j < c->numchannels; j++) {
00197 fprintf(fp, "%s %s\n", c->alias + j * 6, c->channels[j]);
00198 }
00199 c = c->next;
00200 }
00201 }
00202 }
00203
00204 struct commac *create_new_commac(void)
00205 {
00206 struct commac *c;
00207 int i;
00208
00209 c = (struct commac *) malloc(sizeof(struct commac));
00210
00211 c->who = -1;
00212 c->numchannels = 0;
00213 c->maxchannels = 0;
00214 c->alias = NULL;
00215 c->channels = NULL;
00216
00217 c->curmac = -1;
00218 for(i = 0; i < 5; i++)
00219 c->macros[i] = -1;
00220
00221 c->next = NULL;
00222 return c;
00223 }
00224
00225 struct commac *get_commac(dbref which)
00226 {
00227 struct commac *c;
00228
00229 if(which < 0)
00230 return NULL;
00231
00232 c = commac_table[which % NUM_COMMAC];
00233
00234 while (c && (c->who != which))
00235 c = c->next;
00236
00237 if(!c) {
00238 c = create_new_commac();
00239 c->who = which;
00240 add_commac(c);
00241 }
00242 return c;
00243 }
00244
00245 void add_commac(struct commac *c)
00246 {
00247 if(c->who < 0)
00248 return;
00249
00250 c->next = commac_table[c->who % NUM_COMMAC];
00251 commac_table[c->who % NUM_COMMAC] = c;
00252 }
00253
00254 void del_commac(dbref who)
00255 {
00256 struct commac *c;
00257 struct commac *last;
00258
00259 if(who < 0)
00260 return;
00261
00262 c = commac_table[who % NUM_COMMAC];
00263
00264 if(c == NULL)
00265 return;
00266
00267 if(c->who == who) {
00268 commac_table[who % NUM_COMMAC] = c->next;
00269 destroy_commac(c);
00270 return;
00271 }
00272 last = c;
00273 c = c->next;
00274 while (c) {
00275 if(c->who == who) {
00276 last->next = c->next;
00277 destroy_commac(c);
00278 return;
00279 }
00280 last = c;
00281 c = c->next;
00282 }
00283 }
00284
00285 void destroy_commac(struct commac *c)
00286 {
00287 int i;
00288
00289 free(c->alias);
00290 for(i = 0; i < c->numchannels; i++)
00291 free(c->channels[i]);
00292 free(c->channels);
00293 free(c);
00294 }
00295
00296 void sort_com_aliases(struct commac *c)
00297 {
00298 int i;
00299 int cont;
00300 char buffer[10];
00301 char *s;
00302
00303 cont = 1;
00304 while (cont) {
00305 cont = 0;
00306 for(i = 0; i < c->numchannels - 1; i++)
00307 if(strcasecmp(c->alias + i * 6, c->alias + (i + 1) * 6) > 0) {
00308 StringCopy(buffer, c->alias + i * 6);
00309 StringCopy(c->alias + i * 6, c->alias + (i + 1) * 6);
00310 StringCopy(c->alias + (i + 1) * 6, buffer);
00311 s = c->channels[i];
00312 c->channels[i] = c->channels[i + 1];
00313 c->channels[i + 1] = s;
00314 cont = 1;
00315 }
00316 }
00317 }