src/commac.c

Go to the documentation of this file.
00001 /*
00002  * commac.c 
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             * * ABORT_PURGE_COMSYS  
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                          * if ((Typeof(d->who) != TYPE_PLAYER) && (God(Owner(d->who))) &&
00161                          * * (Going(d->who))) 
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 }

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